diff --git a/app_main/src/main/AndroidManifest.xml b/app_main/src/main/AndroidManifest.xml index 77361d1e..8ac19efb 100644 --- a/app_main/src/main/AndroidManifest.xml +++ b/app_main/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app_main/src/main/assets/bootrom.elf b/app_main/src/main/assets/bootrom.elf new file mode 100644 index 00000000..b39c35a8 Binary files /dev/null and b/app_main/src/main/assets/bootrom.elf differ diff --git a/app_main/src/main/assets/fullimage.elf b/app_main/src/main/assets/fullimage.elf new file mode 100644 index 00000000..7189512e Binary files /dev/null and b/app_main/src/main/assets/fullimage.elf differ diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java index d8d86cf7..9e4ba2b0 100644 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java +++ b/app_main/src/main/java/cn/rrg/rdv/activities/main/AppMain.java @@ -43,7 +43,7 @@ public class AppMain extends BaseActivity { gotoFragment(appMainDevicesFragment); - startActivity(new Intent(context, FlasherMainActivity.class)); + startActivity(new Intent(context, PM3FlasherMainActivity.class)); finish(); } diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/FlasherMainActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/FlasherMainActivity.java deleted file mode 100644 index 5961ad9f..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/FlasherMainActivity.java +++ /dev/null @@ -1,150 +0,0 @@ -package cn.rrg.rdv.activities.main; - -import android.content.Context; -import android.os.Bundle; -import android.view.View; - -import androidx.annotation.Nullable; - -import com.proxgrind.pm3flasher.Proxmark3Flasher; - -import cn.dxl.com.Com; -import cn.dxl.common.util.LogUtils; -import cn.dxl.common.widget.ToastUtil; -import cn.rrg.com.ContextCallback; -import cn.rrg.com.DevCallback; -import cn.rrg.com.UsbSerialControl; -import cn.rrg.devices.EmptyDeivce; -import cn.rrg.rdv.R; - -public class FlasherMainActivity extends BaseActivity { - - private UsbSerialControl control = UsbSerialControl.get(); - private Proxmark3Flasher flasher = Proxmark3Flasher.getFlasher(); - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.act_pm3_flasher); - - Com.initCom(control, new EmptyDeivce()); - - control.setContextCallback(new ContextCallback() { - @Override - public Context getContext() { - return context; - } - }); - - control.register(this, new DevCallback() { - @Override - public void onAttach(String dev) { - - } - - @Override - public void onDetach(String dev) { - flasher.closeProxmark3(); - } - }); - - findViewById(R.id.btnStatusCheck).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new Thread(new Runnable() { - @Override - public void run() { - flasher.isBootloaderMode(); - } - }).start(); - } - }); - - findViewById(R.id.btnClientClose).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new Thread(new Runnable() { - @Override - public void run() { - flasher.closeProxmark3(); - } - }).start(); - } - }); - - findViewById(R.id.btnClientOpen).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new Thread(new Runnable() { - @Override - public void run() { - flasher.openProxmark3(); - } - }).start(); - } - }); - - findViewById(R.id.btnDeviceConnect).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new Thread(new Runnable() { - @Override - public void run() { - if (control.connect(null)) { - ToastUtil.show(context, "连接成功", false); - } else { - ToastUtil.show(context, "连接失败", false); - } - } - }).start(); - } - }); - - findViewById(R.id.btnFlashStart).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - new Thread(new Runnable() { - @Override - public void run() { - String bootrom = "/storage/emulated/0/Download/bootrom.elf"; - String fullimg = "/storage/emulated/0/Download/fullimage.elf"; - if (!flasher.isPM3Opened()) { - if (!flasher.openProxmark3()) { - LogUtils.d("PM3打开失败!"); - return; - } else { - LogUtils.d("PM3打开成功!"); - } - } - // 如果没有在Bootloader模式下,我们需要先重启设备使其进入Bootloader模式下! - if (flasher.isBootloaderMode()) { - LogUtils.d("当前处于Bootloader模式下,将会开始刷机!"); - if (flasher.flashBootRom(bootrom)) { - LogUtils.d("PM3刷写BootRom成功!"); - } else { - LogUtils.d("PM3刷写BootRom失败!"); - } - if (flasher.flashFullImg(fullimg)) { - LogUtils.d("PM3刷写BootRom成功!"); - } else { - LogUtils.d("PM3刷写BootRom失败!"); - } - flasher.flashModeClose(); - flasher.closeProxmark3(); - } else { - if (!flasher.enterBootloader()) { - LogUtils.d("PM3进入刷写模式失败!"); - } - } - } - }).start(); - } - }); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - control.unregister(this); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java new file mode 100644 index 00000000..c9168808 --- /dev/null +++ b/app_main/src/main/java/cn/rrg/rdv/activities/main/PM3FlasherMainActivity.java @@ -0,0 +1,193 @@ +package cn.rrg.rdv.activities.main; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; + +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.proxgrind.pm3flasher.Proxmark3Flasher; + +import cn.dxl.com.Com; +import cn.dxl.common.util.LogUtils; +import cn.dxl.common.widget.ToastUtil; +import cn.rrg.com.DevCallback; +import cn.rrg.com.UsbSerialControl; +import cn.rrg.devices.EmptyDeivce; +import cn.rrg.rdv.R; +import cn.rrg.rdv.util.Paths; + +public class PM3FlasherMainActivity extends BaseActivity implements DevCallback { + + private enum MODE { + BOOT, OS + } + + private UsbSerialControl control = UsbSerialControl.get(); + private Proxmark3Flasher flasher = Proxmark3Flasher.getFlasher(); + + private AlertDialog usbConnectWaitDialog; + //在程序执行读卡,写卡操作时的程序后台交互性提醒对话框 + private AlertDialog mDialogWorkingState = null; + + private Button btnFlash; + + private volatile boolean startLabel = false; + private MODE mode = MODE.BOOT; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.act_pm3_flasher); + + // init and try to connect. + control.register(this, this); + Com.initCom(control, new EmptyDeivce()); + + initViews(); + initActions(); + + if (!control.connect(null)) { + usbConnectWaitDialog.show(); + } + } + + private void initViews() { + usbConnectWaitDialog = new AlertDialog.Builder(context, R.style.CustomerDialogStyle) + .setView(View.inflate(context, R.layout.item_usb_device_connecting, null)) + .create(); + usbConnectWaitDialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialog) { + ImageView imgUsbConnect = usbConnectWaitDialog.findViewById(R.id.imgUsbConnect); + Glide.with(context).load(R.drawable.usb_connect).into(imgUsbConnect); + } + }); + usbConnectWaitDialog.setCancelable(false); + + mDialogWorkingState = new AlertDialog.Builder(context).create(); + View _workingStateMsgView = View.inflate(context, R.layout.dialog_working_msg, null); + mDialogWorkingState.setView(_workingStateMsgView); + mDialogWorkingState.setTitle(R.string.tips); + mDialogWorkingState.setCancelable(false); + + btnFlash = findViewById(R.id.btnFlash); + } + + private void initActions() { + btnFlash.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + btnFlash.setEnabled(false); + startLabel = true; + mode = MODE.BOOT; + if (control.connect(null)) { + flashDefaultFW(); + } else { + ToastUtil.show(context, getString(R.string.tips_device_no_found), false); + usbConnectWaitDialog.show(); + } + } + }); + } + + private void showWorkingDialog() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mDialogWorkingState.show(); + } + }); + } + + private void dissmissWorkingDialog() { + runOnUiThread(new Runnable() { + @Override + public void run() { + mDialogWorkingState.dismiss(); + } + }); + } + + private void flashDefaultFW() { + new Thread(new Runnable() { + @Override + public void run() { + if (!flasher.isPM3Opened()) { + if (!flasher.openProxmark3()) { + LogUtils.d("PM3打开失败!"); + return; + } else { + LogUtils.d("PM3打开成功!"); + } + } + LogUtils.d("开始刷机!"); + showWorkingDialog(); + // 如果没有在Bootloader模式下,我们需要先重启设备使其进入Bootloader模式下! + if (flasher.isBootloaderMode()) { + LogUtils.d("当前处于Bootloader模式下,将会开始刷机!"); + switch (mode) { + case BOOT: + if (flasher.flashBootRom(Paths.PM3_IMAGE_BOOT_FILE)) { + LogUtils.d("PM3刷写BootRom成功!"); + } else { + LogUtils.d("PM3刷写BootRom失败!"); + } + finishFlash(); + // 开启下一轮! + mode = MODE.OS; + break; + case OS: + if (flasher.flashFullImg(Paths.PM3_IMAGE_OS_FILE)) { + LogUtils.d("PM3刷写BootRom成功!"); + } else { + LogUtils.d("PM3刷写BootRom失败!"); + } + finishFlash(); + startLabel = false; + ToastUtil.show(context, getString(R.string.finish), false); + break; + } + dissmissWorkingDialog(); + } else { + if (!flasher.enterBootloader()) { + LogUtils.d("PM3进入刷写模式失败!"); + } + } + dissmissWorkingDialog(); + } + }).start(); + } + + private void finishFlash() { + flasher.flashModeClose(); + flasher.closeProxmark3(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + control.unregister(this); + usbConnectWaitDialog.dismiss(); + } + + @Override + public void onAttach(String dev) { + // 自动连接设备! + control.connect(dev); + usbConnectWaitDialog.dismiss(); + if (startLabel) { + flashDefaultFW(); + } + } + + @Override + public void onDetach(String dev) { + flasher.closeProxmark3(); + usbConnectWaitDialog.show(); + } +} diff --git a/app_main/src/main/java/cn/rrg/rdv/util/InitUtil.java b/app_main/src/main/java/cn/rrg/rdv/util/InitUtil.java index 9014cd9e..9c785917 100644 --- a/app_main/src/main/java/cn/rrg/rdv/util/InitUtil.java +++ b/app_main/src/main/java/cn/rrg/rdv/util/InitUtil.java @@ -18,10 +18,8 @@ import cn.dxl.common.util.DiskKVUtil; public class InitUtil { - //短称路径 public static final String LOG_TAG = InitUtil.class.getSimpleName(); - //初始化dump文件目录 public static void initApplicationResource(Context context) { AssetsUtil au = new AssetsUtil(context); File dump_dir = new File(Paths.DUMP_DIRECTORY); @@ -74,11 +72,13 @@ public class InitUtil { if (!pm3_dir.mkdirs()) { Log.d(LOG_TAG, "init pm3 dir fail!"); } else { + initProxmark3RDV4ImageFile(au); initEasyButtonFile(au); initPM3ForwardFile(); initHardnestedFile(au); } } else { + initProxmark3RDV4ImageFile(au); initEasyButtonFile(au); initPM3ForwardFile(); initHardnestedFile(au); @@ -99,17 +99,23 @@ public class InitUtil { } } + private static void initProxmark3RDV4ImageFile(AssetsUtil au) { + //初始化标准输入的文件! + File boot = new File(Paths.PM3_IMAGE_BOOT_FILE); + File os = new File(Paths.PM3_IMAGE_OS_FILE); + au.moveFile(Paths.PM3_BOOT_FILE_NAME, boot.getAbsolutePath()); + au.moveFile(Paths.PM3_OS_FILE_NAME, os.getAbsolutePath()); + } + private static void initMfInfoMapsFile(AssetsUtil au) { File f1 = new File(Paths.COMMON_DIRECTORY + "/" + "template_mifare_info_en.html"); File f2 = new File(Paths.COMMON_DIRECTORY + "/" + "template_tag_info_en.html"); //移动两个标签信息HTML文件到指定目录! - if (/*!f1.exists()*/true) - au.moveFile("template_mifare_info_en.html", - new File(Paths.COMMON_DIRECTORY + "/" + "template_mifare_info_en.html").getAbsolutePath()); - if (/*!f2.exists()*/true) - au.moveFile("template_tag_info_en.html", - new File(Paths.COMMON_DIRECTORY + "/" + "template_tag_info_en.html").getAbsolutePath()); + au.moveFile("template_mifare_info_en.html", + new File(Paths.COMMON_DIRECTORY + "/" + "template_mifare_info_en.html").getAbsolutePath()); + au.moveFile("template_tag_info_en.html", + new File(Paths.COMMON_DIRECTORY + "/" + "template_tag_info_en.html").getAbsolutePath()); } private static void initDumpFile(AssetsUtil au) { @@ -230,7 +236,6 @@ public class InitUtil { } } - //进行日志记录开始! public static void startLogcat(boolean open) { //拼接名字 String name = "log.txt"; @@ -257,7 +262,6 @@ public class InitUtil { } } - //初始化必须要的设置! public static void initSettings() throws IOException { File dir = new File(Paths.SETTINGS_DIRECTORY); if (dir.exists()) { @@ -269,7 +273,6 @@ public class InitUtil { } } - //私有初始化函数! private static void initSets() throws IOException { File file = new File(Paths.SETTINGS_FILE); if (!file.exists()) diff --git a/app_main/src/main/java/cn/rrg/rdv/util/Paths.java b/app_main/src/main/java/cn/rrg/rdv/util/Paths.java index 7f70b946..3646a5fa 100644 --- a/app_main/src/main/java/cn/rrg/rdv/util/Paths.java +++ b/app_main/src/main/java/cn/rrg/rdv/util/Paths.java @@ -4,7 +4,6 @@ import android.os.Environment; public interface Paths { - //常用的相对路径文件夹 | 文件名定义! String EXTERNAL_STORAGE_DIRECTORY = Environment.getExternalStorageDirectory().getPath(); String TOOLS_PATH = "NfcTools"; String SETTINGS_PATH = "Settings"; @@ -26,7 +25,6 @@ public interface Paths { String DEFAULT_DUMP_NAME = "BLANK(空白).dump"; String DEFAULT_CMD_NAME = "cmd.json"; - //绝对路径 String TOOLS_DIRECTORY = EXTERNAL_STORAGE_DIRECTORY + "/" + TOOLS_PATH; String KEY_DIRECTORY = TOOLS_DIRECTORY + "/" + KEY_PATH; String LOG_DIRECTORY = TOOLS_DIRECTORY + "/" + LOG_PATH; @@ -53,11 +51,15 @@ public interface Paths { String SETTINGS_DIRECTORY = TOOLS_DIRECTORY + "/" + SETTINGS_PATH; String SETTINGS_FILE = SETTINGS_DIRECTORY + "/" + "set.dat"; - //一些重定向文件 + String PM3_BOOT_FILE_NAME = "bootrom.elf"; + String PM3_OS_FILE_NAME = "fullimage.elf"; String PM3_FORWARD_O = PM3_DIRECTORY + "/" + "pm3_forward_o.txt"; String PM3_FORWARD_E = PM3_DIRECTORY + "/" + "pm3_forward_e.txt"; - //PM3的RDV4动态按钮 + //PM3 Easy Button String PM3_CMD_FILE = PM3_DIRECTORY + "/" + DEFAULT_CMD_NAME; + // PM3 Image + String PM3_IMAGE_BOOT_FILE = Paths.PM3_DIRECTORY + "/" + PM3_BOOT_FILE_NAME; + String PM3_IMAGE_OS_FILE = Paths.PM3_DIRECTORY + "/" + PM3_OS_FILE_NAME; String PN53X_FORWARD_O = PN53X_DIRRECTORY + "/" + "pn53x_forward_o.txt"; String PN53X_FORWARD_E = PN53X_DIRRECTORY + "/" + "pn53x_forward_e.txt"; diff --git a/app_main/src/main/res/drawable-hdpi/usb_connect.gif b/app_main/src/main/res/drawable-hdpi/usb_connect.gif new file mode 100644 index 00000000..52392336 Binary files /dev/null and b/app_main/src/main/res/drawable-hdpi/usb_connect.gif differ diff --git a/app_main/src/main/res/layout/act_pm3_flasher.xml b/app_main/src/main/res/layout/act_pm3_flasher.xml index efb3f1cb..907af45a 100644 --- a/app_main/src/main/res/layout/act_pm3_flasher.xml +++ b/app_main/src/main/res/layout/act_pm3_flasher.xml @@ -1,46 +1,36 @@ - - + android:layout_height="wrap_content" + android:orientation="vertical"> + + + + + +