From 84024486a0d8e9a2acf77e1e8c4554513fc2ce97 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Mon, 29 Jun 2020 18:07:14 +0800 Subject: [PATCH] Some unused resource removed. --- app_main/build.gradle | 1 - app_main/src/main/AndroidManifest.xml | 12 - .../Proxmark3Rdv4RRGConnectActivity.java | 7 +- .../activities/main/Proxmark3Rdv4RRGMain.java | 47 -- .../rdv4_rrg/Proxmark3ConsoleActivity.java | 157 ----- .../Proxmark3Rdv4RRGConsoleActivity.java | 14 - ...roxmark3Rdv4RRGRedTeamConsoleActivity.java | 207 ------ .../cn/rrg/rdv/application/Properties.java | 16 +- .../fragment/base/AppMainDevicesFragment.java | 22 +- .../fragment/tools/AbsMfOperatesFragment.java | 55 +- .../rrg/rdv/models/Proxmark3Rdv4SppModel.java | 16 +- .../rrg/rdv/models/Proxmark3Rdv4UsbModel.java | 14 +- .../CommonRWKeyFilesSelectedSettings.java | 46 -- .../settings/MainPageColumnCountSetting.java | 35 - .../settings/Proxmark3ConsleDelaySetting.java | 35 - .../java/cn/rrg/rdv/util/AccessBitUtil.java | 623 ------------------ .../main/java/cn/rrg/rdv/util/Commons.java | 24 + .../main/java/cn/rrg/rdv/util/InitUtil.java | 6 - pm3rdv4rrg/.gitignore | 62 -- pm3rdv4rrg/build.gradle | 67 -- pm3rdv4rrg/consumer-rules.pro | 0 pm3rdv4rrg/proguard-rules.pro | 21 - pm3rdv4rrg/src/main/AndroidManifest.xml | 2 - pm3rdv4rrg/src/main/cpp/proxmark3 | 1 - .../java/cn/rrg/devices/Proxmark3RRGRdv4.java | 34 - .../cn/rrg/natives/Proxmark3RRGRdv4Tools.java | 20 - pm3rdv4rrg/src/main/res/values/strings.xml | 3 - settings.gradle | 2 +- 28 files changed, 84 insertions(+), 1465 deletions(-) delete mode 100644 app_main/src/main/java/cn/rrg/rdv/activities/main/Proxmark3Rdv4RRGMain.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3ConsoleActivity.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGConsoleActivity.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGRedTeamConsoleActivity.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/settings/CommonRWKeyFilesSelectedSettings.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/settings/MainPageColumnCountSetting.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/settings/Proxmark3ConsleDelaySetting.java delete mode 100644 app_main/src/main/java/cn/rrg/rdv/util/AccessBitUtil.java delete mode 100644 pm3rdv4rrg/.gitignore delete mode 100644 pm3rdv4rrg/build.gradle delete mode 100644 pm3rdv4rrg/consumer-rules.pro delete mode 100644 pm3rdv4rrg/proguard-rules.pro delete mode 100644 pm3rdv4rrg/src/main/AndroidManifest.xml delete mode 160000 pm3rdv4rrg/src/main/cpp/proxmark3 delete mode 100644 pm3rdv4rrg/src/main/java/cn/rrg/devices/Proxmark3RRGRdv4.java delete mode 100644 pm3rdv4rrg/src/main/java/cn/rrg/natives/Proxmark3RRGRdv4Tools.java delete mode 100644 pm3rdv4rrg/src/main/res/values/strings.xml diff --git a/app_main/build.gradle b/app_main/build.gradle index 4f8b633d..ebd41c29 100644 --- a/app_main/build.gradle +++ b/app_main/build.gradle @@ -65,7 +65,6 @@ dependencies { implementation project(':libnfc_pn53x') implementation project(':chameleon') implementation project(':communication') - implementation project(':pm3rdv4rrg') testImplementation 'junit:junit:4.12' implementation project(path: ':pm3flasher') diff --git a/app_main/src/main/AndroidManifest.xml b/app_main/src/main/AndroidManifest.xml index 0f19e468..52d02af7 100644 --- a/app_main/src/main/AndroidManifest.xml +++ b/app_main/src/main/AndroidManifest.xml @@ -46,22 +46,10 @@ - - - - - - diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/connect/Proxmark3Rdv4RRGConnectActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/connect/Proxmark3Rdv4RRGConnectActivity.java index dc5c01f4..ed9b9494 100644 --- a/app_main/src/main/java/cn/rrg/rdv/activities/connect/Proxmark3Rdv4RRGConnectActivity.java +++ b/app_main/src/main/java/cn/rrg/rdv/activities/connect/Proxmark3Rdv4RRGConnectActivity.java @@ -9,13 +9,10 @@ import android.os.Bundle; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; -import android.text.Html; -import android.widget.TextView; +import com.termux.app.TermuxActivity; -import cn.dxl.common.util.DisplayUtil; import cn.rrg.rdv.R; import cn.rrg.rdv.activities.main.PM3FlasherMainActivity; -import cn.rrg.rdv.activities.main.Proxmark3Rdv4RRGMain; import cn.rrg.rdv.activities.tools.DeviceConnectActivity; import cn.rrg.rdv.callback.ConnectFailedCtxCallback; import cn.rrg.rdv.models.AbstractDeviceModel; @@ -54,7 +51,7 @@ public class Proxmark3Rdv4RRGConnectActivity @Override public Class getTarget() { //连接成功后将跳转到该界面! - return Proxmark3Rdv4RRGMain.class; + return TermuxActivity.class; } @Override diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/Proxmark3Rdv4RRGMain.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/Proxmark3Rdv4RRGMain.java deleted file mode 100644 index 49253138..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/Proxmark3Rdv4RRGMain.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.rrg.rdv.activities.main; - -import android.content.Intent; -import android.os.Bundle; - -import androidx.annotation.Nullable; - -import android.view.View; -import android.widget.Button; - -import cn.rrg.rdv.R; -import cn.rrg.rdv.activities.proxmark3.rdv4_rrg.Proxmark3Rdv4RRGRedTeamConsoleActivity; - -/* - * PM3 RDV4 功能界面! - * */ -public class Proxmark3Rdv4RRGMain - extends BaseActivity { - - private Button btnGo2Proxmark3Rdv4RRGRedTeam; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.act_main_proxmark3_rdv4_rrg); - - initViews(); - initActions(); - - // direct goto red team console! - startActivity(new Intent(context, Proxmark3Rdv4RRGRedTeamConsoleActivity.class)); - finish(); - } - - private void initViews() { - btnGo2Proxmark3Rdv4RRGRedTeam = findViewById(R.id.btnGo2Proxmark3Rdv4RRGRedTeam); - } - - private void initActions() { - btnGo2Proxmark3Rdv4RRGRedTeam.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // startActivity(new Intent(context, Proxmark3Rdv4RRGRedTeamConsoleActivity.class)); - } - }); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3ConsoleActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3ConsoleActivity.java deleted file mode 100644 index 3be93396..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3ConsoleActivity.java +++ /dev/null @@ -1,157 +0,0 @@ -package cn.rrg.rdv.activities.proxmark3.rdv4_rrg; - -import android.os.Bundle; -import android.util.Log; -import android.view.View; -import android.widget.CompoundButton; - -import androidx.annotation.Nullable; - -import java.io.File; - -import cn.dxl.common.util.FileUtils; -import cn.rrg.console.define.ICommandTools; -import cn.rrg.console.define.ICommandType; -import cn.rrg.freo.IORedirector; -import cn.rrg.rdv.R; -import cn.rrg.rdv.activities.tools.BaseConsoleActivity; -import cn.rrg.rdv.implement.EntryICommandType; -import cn.rrg.rdv.util.Paths; - -public abstract class Proxmark3ConsoleActivity - extends BaseConsoleActivity - implements View.OnClickListener, - CompoundButton.OnCheckedChangeListener { - - //滞留一个视图实例,可用如GUI,子控件实现! - protected View guiView = null; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - new Thread(new Runnable() { - @Override - public void run() { - //重定向! - IORedirector.setStdEO(Paths.PM3_FORWARD_O, IORedirector.STD_OUT); - IORedirector.setStdEO(Paths.PM3_FORWARD_E, IORedirector.STD_ERR); - IORedirector.setStdIN(Paths.COMMON_FORWARD_I); - } - }).start(); - - //父类先初初始化! - super.onCreate(savedInstanceState); - - //默认关闭错误消息输出区域(用不上...) - ckBoxOpenOutputError.setChecked(false); - //覆盖父类的停止按钮点击实例 - btnStop.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - if (v.getId() == R.id.btnStop) {//判断当前是否有客户端可终止的任务在执行,是的话则终止! - new Thread(new Runnable() { - @Override - public void run() { - //TODO 此处进行IO,模拟键盘输入! - stopPM3Client4KeyBorad(); - } - }).start(); - } - } - - //通过键盘输入结束任务! - protected void stopPM3Client4KeyBorad() { - FileUtils.writeString(new File(Paths.COMMON_FORWARD_I), "\n", true); - } - - @Override - protected void onDestroy() { - //非常有必要进行相关的结束操作! - stopPM3Client4KeyBorad(); - mCMD.stopExecute(); - super.onDestroy(); - } - - /* - * 重写视图实例寻找,方便进行控制! - * */ - @Override - public T findViewById(int id) { - T view = super.findViewById(id); - return view != null ? view : guiView != null ? guiView.findViewById(id) : null; - } - - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - //don't need process!!! - } - - @Override - protected View getCommandGUI() { - return guiView; - } - - @Override - protected File initOutTarget() { - return new File(Paths.PM3_FORWARD_O); - } - - @Override - protected File initErrTarget() { - return new File(Paths.PM3_FORWARD_E); - } - - @Override - protected int startTest(ICommandTools cmd) { - mDefaultCMD = "help"; - if (edtInputCmd.getText().toString().length() > 0) { - mDefaultCMD = edtInputCmd.getText().toString(); - } - //此处做出多行执行优化! - int ret = -2; - //优化,如果是多行命令的操作! - if (mDefaultCMD.contains("\n")) { - //包含换行,则当作多行处理! - String[] cmds = mDefaultCMD.split("\n"); - Log.d(LOG_TAG, "警告,当前执行的是多行处理操作!"); - for (String c : cmds) { - Log.d(LOG_TAG, "当前执行的命令: " + c); - mCMD.startExecute(c); - } - return ret; - } else { - //直接执行命令并且在执行命令完成后进行回调! - ret = cmd.startExecute(mDefaultCMD); - } - return ret; - } - - @Override - protected void onNewOutLine(String line) { - } - - @Override - protected void onNewErrLine(String line) { - } - - @Override - protected ICommandType initType() { - return new EntryICommandType(); - } - - @Override - protected void onTestEnd() { - } - - @Override - protected boolean isTesting() { - return super.isTesting(); - } - - @Override - protected void stopTest() { - //super.stopTest(); - //TODO 无必要停止PM3的底层线程! - } -} \ No newline at end of file diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGConsoleActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGConsoleActivity.java deleted file mode 100644 index ae737546..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGConsoleActivity.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.rrg.rdv.activities.proxmark3.rdv4_rrg; - -import cn.rrg.console.define.ICommandTools; -import cn.rrg.natives.Proxmark3RRGRdv4Tools; - -public class Proxmark3Rdv4RRGConsoleActivity - extends Proxmark3ConsoleActivity { - - @Override - protected ICommandTools initCMD() { - //替换为rdv4的工具类! - return new Proxmark3RRGRdv4Tools(); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGRedTeamConsoleActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGRedTeamConsoleActivity.java deleted file mode 100644 index 1d073ade..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3Rdv4RRGRedTeamConsoleActivity.java +++ /dev/null @@ -1,207 +0,0 @@ -package cn.rrg.rdv.activities.proxmark3.rdv4_rrg; - -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.os.Bundle; - -import androidx.annotation.Nullable; - -import android.view.View; -import android.widget.AdapterView; -import android.widget.GridView; -import android.widget.TextView; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import cn.rrg.freo.IORedirector; -import cn.rrg.rdv.R; -import cn.rrg.rdv.adapter.EasyBtnAdapter; -import cn.rrg.rdv.javabean.EasyCMDEntry; -import cn.rrg.rdv.util.EasyBtnUtil; -import cn.dxl.common.widget.DoubleInputDialog; -import cn.dxl.common.util.ArrayUtils; -import cn.dxl.common.widget.ToastUtil; -import cn.dxl.common.util.ViewUtil; -import cn.rrg.rdv.util.Paths; - -public class Proxmark3Rdv4RRGRedTeamConsoleActivity - extends Proxmark3Rdv4RRGConsoleActivity { - - private GridView gridViewShowEasyButton; - private EasyBtnAdapter adapter; - private List easyCMDEntries = new ArrayList<>(); - - //构造一个简单的对话框,用于提示需要的操作! - private AlertDialog operaDialog; - //显示添加按钮! - private TextView txtAddEasyBtn; - //缓存当前要操作的项目! - private int operaPosition; - //配置文件操作工具 - private EasyBtnUtil easyBtnUtil = new EasyBtnUtil(); - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - btnGui.setText(getString(R.string.console_dynamic_btn)); - //隐藏不需要的区域! - skBarConsoleViewScale.setProgress(10); - //设置pm3的输入提示 - edtInputCmd.setHint(getString(R.string.pm3_hint)); - - //不能让用户关闭通讯! - btnStop.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - stopPM3Client4KeyBorad(); - } - }); - - initViews(); - initActions(); - - new Thread(new Runnable() { - @Override - public void run() { - // 更改工作目录! - IORedirector.chdir(Paths.PM3_DIRECTORY); - } - }).start(); - } - - private void initViews() { - //先初始化视图! - guiView = ViewUtil.inflate(this, R.layout.easy_button_container); - - gridViewShowEasyButton = findViewById(R.id.gridViewShowEasyButton); - adapter = new EasyBtnAdapter(this, R.layout.item_easy__btn, easyCMDEntries); - gridViewShowEasyButton.setAdapter(adapter); - - //添加数据! - EasyCMDEntry[] buttons = getCMDs(); - if (buttons != null) { - easyCMDEntries.addAll(Arrays.asList(getCMDs())); - adapter.notifyDataSetChanged(); - } - txtAddEasyBtn = findViewById(R.id.txtAddEasyBtn); - } - - private void initActions() { - //列表项单击时执行相应的命令! - gridViewShowEasyButton.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - //点击了对应项时,取出对应的实体,进行命令发送! - EasyCMDEntry entry = easyCMDEntries.get(position); - if (entry != null) { - String cmd = entry.getCommand(); - if (cmd != null) { - //先提交命令到输入框 - putCMDAndClosePop(cmd); - } - } - } - }); - //列表项长按时显示相关的操作项! - gridViewShowEasyButton.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { - @Override - public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { - operaDialog.show(); - operaPosition = position; - return true; - } - }); - //构建一个用于显示操作的对话框! - operaDialog = new AlertDialog.Builder(this).setItems(new String[]{getString(R.string.delete), getString(R.string.modify)}, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - final EasyCMDEntry entry = easyCMDEntries.get(operaPosition); - if (which == 0) { - new AlertDialog.Builder(context).setTitle(R.string.warning).setMessage(getString(R.string.enter_delete) - + "\n\nItem name: " + entry.getCmdName()) - .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - //做出删除操作! - easyCMDEntries.remove(operaPosition); - adapter.notifyDataSetChanged(); - //TODO 本地配置删除! - if (easyBtnUtil.deleteButton(0, operaPosition)) { - ToastUtil.show(context, getString(R.string.success), false); - } else { - ToastUtil.show(context, getString(R.string.failed), false); - } - } - }).setNegativeButton(getString(R.string.no), null).show(); - } else { - //做出修改操作,先取出原来的数据! - DoubleInputDialog inputDialog = new DoubleInputDialog(context); - inputDialog.setTitle(R.string.button_edit); - inputDialog.getHint1().setText(R.string.title_input); - inputDialog.getHint2().setText(R.string.command_input); - //设置到视图上! - inputDialog.getEdtInput1().setText(entry.getCmdName()); - inputDialog.getEdtInput2().setText(entry.getCommand()); - //然后设置操作回调并且显示! - inputDialog.setSaveListener(new DoubleInputDialog.OnSaveListener() { - @Override - public void onSave(String[] content) { - //操作成功,进行内存更新! - entry.setCmdName(content[0]); - entry.setCommand(content[1]); - adapter.notifyDataSetChanged(); - //TODO 然后进行本地更新! - if (easyBtnUtil.updateButton(0, operaPosition, entry.getCmdName(), entry.getCommand())) { - //现在的话已经更新成功 - ToastUtil.show(context, getString(R.string.success), false); - } else { - ToastUtil.show(context, getString(R.string.failed), false); - } - } - }).show(); - } - } - }).create(); - //设置添加按钮的动作! - txtAddEasyBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - //做出增加操作,构建一个实体用于保存! - EasyCMDEntry entry = new EasyCMDEntry(); - DoubleInputDialog inputDialog = new DoubleInputDialog(context); - inputDialog.setTitle(R.string.btn_add); - inputDialog.getHint1().setText(R.string.title_input); - inputDialog.getHint2().setText(R.string.command_input); - //然后设置操作回调并且显示! - inputDialog.setSaveListener(new DoubleInputDialog.OnSaveListener() { - @Override - public void onSave(String[] content) { - //操作成功,进行内存更新! - entry.setCmdName(content[0]); - entry.setCommand(content[1]); - easyCMDEntries.add(entry); - adapter.notifyDataSetChanged(); - //TODO 然后进行本地更新! - if (easyBtnUtil.inertButton(0, entry.getCmdName(), entry.getCommand())) { - //现在的话已经更新成功 - ToastUtil.show(context, getString(R.string.success), false); - } else { - ToastUtil.show(context, getString(R.string.failed), false); - } - } - }).show(); - } - }); - } - - private EasyCMDEntry[] getCMDs() { - //默认先拿0组的按钮,以后做多组分页的时候再做其他组的处理! - List btns = easyBtnUtil.getButtons(0); - if (btns == null) return null; - return ArrayUtils.list2Arr(btns); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/application/Properties.java b/app_main/src/main/java/cn/rrg/rdv/application/Properties.java index 504609ca..046b91c3 100644 --- a/app_main/src/main/java/cn/rrg/rdv/application/Properties.java +++ b/app_main/src/main/java/cn/rrg/rdv/application/Properties.java @@ -4,16 +4,6 @@ package cn.rrg.rdv.application; * @author DXL */ public class Properties { - /* - * 程序参数缓存... - * 类型_模块_作用 - * */ - public static String k_pm3_delayTime = "pm3DelayTime"; - public static int v_pm3_delayTime = 50; - - public static String k_view_main_page_column_count = "mainPageColumnCount"; - public static int v_view_main_page_column_count = 4; - //变色龙的卡槽是否使用别名! public static String k_chameleon_aliases_status = "chameleonSlotAliasesStatus"; public static boolean v_chameleon_aliases_status = false; @@ -23,8 +13,6 @@ public class Properties { //语言切换设置! public static String k_app_language = "language"; - - //读写卡历史选择的秘钥! - public static String k_common_rw_keyfile_selected = "commomRWKeyFilesSelected"; - public static String[] v_common_rw_keyfile_selected = null; + //Key files select history! + public static String k_common_rw_keyfile_selected = "commonRWKeyFilesSelected"; } diff --git a/app_main/src/main/java/cn/rrg/rdv/fragment/base/AppMainDevicesFragment.java b/app_main/src/main/java/cn/rrg/rdv/fragment/base/AppMainDevicesFragment.java index 81c3f1e0..d4e0ef46 100644 --- a/app_main/src/main/java/cn/rrg/rdv/fragment/base/AppMainDevicesFragment.java +++ b/app_main/src/main/java/cn/rrg/rdv/fragment/base/AppMainDevicesFragment.java @@ -15,26 +15,24 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.provider.Settings; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.termux.app.TermuxActivity; + import java.util.ArrayList; import cn.dxl.common.util.AppUtil; import cn.dxl.mifare.StdMifareImpl; import cn.rrg.devices.PN53X; import cn.rrg.rdv.R; -import cn.rrg.rdv.activities.chameleon.ChameleonGUIActivity; import cn.rrg.rdv.activities.connect.Acr122uHkUsbConnectActivity; -import cn.rrg.rdv.activities.connect.ChameleonUsb2UartConnectActivity; import cn.rrg.rdv.activities.connect.PN532UartConnectActivity; import cn.rrg.rdv.activities.connect.PN53XUsbBulkTransferActivity; import cn.rrg.rdv.activities.connect.Proxmark3Rdv4RRGConnectActivity; import cn.rrg.rdv.activities.main.GeneralNfcDeviceMain; import cn.rrg.rdv.activities.main.PN53XNfcMain; -import cn.rrg.rdv.activities.main.Proxmark3Rdv4RRGMain; import cn.rrg.rdv.binder.BannerImageViewBinder; import cn.rrg.rdv.binder.DeviceInfoViewBinder; import cn.rrg.rdv.binder.TitleTextViewBinder; @@ -45,9 +43,7 @@ import me.drakeet.multitype.Items; import me.drakeet.multitype.MultiTypeAdapter; /** - * 界面重构在2019/7/29启动! - * 此次重构主要是将设备的可用列表迁移到主页面进行全览 - * 此页面应当只需要跳转到对应的设备的设备连接界面,不应当做过多的逻辑! + * UI redesign starts on July 29, 2019! * * @author DXL */ @@ -175,17 +171,19 @@ public class AppMainDevicesFragment extends BaseFragment { } } }); - deviceItems.add(new DeviceInfoBean("Proxmark3 Rdv4.0", R.drawable.rdv4) { + deviceItems.add(new DeviceInfoBean("Proxmark3 Rdv4.0 for Termux", R.drawable.rdv4) { @Override public void onClick() { deviceInfoBean = this; connectOrGotoFunctionMain( Proxmark3Rdv4RRGConnectActivity.class, - Proxmark3Rdv4RRGMain.class + TermuxActivity.class ); } }); - deviceItems.add(new DeviceInfoBean("ChameleonMini RevE", R.drawable.chameleon_rdv2) { + // TODO + // The Chameleon have some problem, So we temporarily close the entrance. + /*deviceItems.add(new DeviceInfoBean("ChameleonMini RevE", R.drawable.chameleon_rdv2) { @Override public void onClick() { deviceInfoBean = this; @@ -194,7 +192,7 @@ public class AppMainDevicesFragment extends BaseFragment { ChameleonGUIActivity.class ); } - }); + });*/ deviceItems.add(new DeviceInfoBean(PN53X.NAME.PN532, R.drawable.pn532core) { @Override public void onClick() { @@ -226,7 +224,6 @@ public class AppMainDevicesFragment extends BaseFragment { } private void updateDeviceStatus(boolean status) { - Log.d("TAG", "新状态:" + status); // update device status to bean! if (status) { if (deviceInfoBean != null) { @@ -265,7 +262,6 @@ public class AppMainDevicesFragment extends BaseFragment { @Override public void onDestroy() { super.onDestroy(); - //如果是横屏动作,那我们就没必要全部销毁。 if (isBackPressed) { AppUtil.getInstance().finishAll(); } diff --git a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java index 9f49c86d..1d059457 100644 --- a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java +++ b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java @@ -48,6 +48,7 @@ import cn.rrg.rdv.presenter.AbsTagKeysCheckPresenter; import cn.rrg.rdv.presenter.AbsTagReadPresenter; import cn.rrg.rdv.presenter.AbsTagStatePresenter; import cn.rrg.rdv.presenter.AbsTagWritePresenter; +import cn.rrg.rdv.util.Commons; import cn.rrg.rdv.util.DumpUtils; import cn.rrg.rdv.util.Paths; import cn.rrg.rdv.view.MfKeysCheckView; @@ -306,7 +307,7 @@ public abstract class AbsMfOperatesFragment for (File tmpFile : file) { keyFilesSelectedList.remove(tmpFile); // 从本地持久域中删除 - delSelected(tmpFile.getAbsolutePath()); + Commons.delKeyFileSelected(tmpFile.getAbsolutePath()); } } }); @@ -319,7 +320,7 @@ public abstract class AbsMfOperatesFragment if (!keyFilesSelectedList.contains(tmp)) { keyFilesSelectedList.add(tmp); // 添加到本地持久域! - addSelected(tmp.getAbsolutePath()); + Commons.addKeyFileSelect(tmp.getAbsolutePath()); Log.d(LOG_TAG, "添加了秘钥文件: " + tmp.getName()); } } @@ -362,44 +363,30 @@ public abstract class AbsMfOperatesFragment } private void initSelected() { - if (Properties.v_common_rw_keyfile_selected != null) { - for (String v : Properties.v_common_rw_keyfile_selected) { - File f = new File(v); - if (f.exists() && f.isFile()) { - keyFilesSelectedList.add(new File(v)); - } - } - if (Properties.v_common_rw_keyfile_selected.length > 0) { - updateKeyFileSelectedName(); + String[] ss = Commons.getKeyFilesSelected().toArray(new String[0]); + for (String v : ss) { + File f = new File(v); + if (f.exists() && f.isFile()) { + keyFilesSelectedList.add(new File(v)); } } + updateKeyFileSelectedName(); } private void updateKeyFileSelectedName() { - txtShowKeyFileSelectedList.setText(""); - // 拼接显示! - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < keyFilesSelectedList.size(); i++) { - if (i != keyFilesSelectedList.size() - 1) { - Log.d(LOG_TAG, "添加了文件名: " + keyFilesSelectedList.get(i).getName()); - sb.append(keyFilesSelectedList.get(i).getName()).append("\n-\n"); - } else { - sb.append(keyFilesSelectedList.get(i).getName()); - Log.d(LOG_TAG, "添加了文件名: " + keyFilesSelectedList.get(i).getName()); + if (keyFilesSelectedList.size() > 0) { + // Show! + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < keyFilesSelectedList.size(); i++) { + if (i != keyFilesSelectedList.size() - 1) { + sb.append(keyFilesSelectedList.get(i).getName()).append("\n-\n"); + } else { + sb.append(keyFilesSelectedList.get(i).getName()); + } } - } - //Log.d(LOG_TAG, "本次设置的文件名: " + sb); - txtShowKeyFileSelectedList.setText(sb); - } - - private void addSelected(String file) { - File settingsFile = new File(Paths.SETTINGS_FILE); - try { - if (!DiskKVUtil.isKVExists(Properties.k_common_rw_keyfile_selected, file, settingsFile)) { - DiskKVUtil.insertKV(Properties.k_common_rw_keyfile_selected, file, settingsFile); - } - } catch (IOException e) { - e.printStackTrace(); + txtShowKeyFileSelectedList.setText(sb); + } else { + txtShowKeyFileSelectedList.setText(""); } } diff --git a/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4SppModel.java b/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4SppModel.java index 0c43cfef..b61d40bc 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4SppModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4SppModel.java @@ -5,9 +5,10 @@ import android.bluetooth.BluetoothDevice; import com.iobridges.com.DeviceChecker; +import java.io.IOException; + import cn.proxgrind.com.DriverInterface; import cn.proxgrind.com.SppNonBlock; -import cn.rrg.devices.Proxmark3RRGRdv4; /* * PM3 RDV4 SPP连接实现! @@ -21,7 +22,16 @@ public class Proxmark3Rdv4SppModel extends AbstractSppDeviceModel { @Override public DeviceChecker getDeviceInitImpl() { - //此驱动对应的RDV4的客户端,因此需要返回的是RDV4的初始化测试实现! - return new Proxmark3RRGRdv4(mDI); + return new DeviceChecker(mDI) { + @Override + protected boolean checkDevice() throws IOException { + return true; + } + + @Override + public void close() throws IOException { + + } + }; } } diff --git a/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4UsbModel.java b/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4UsbModel.java index 1ab9bef7..beb87d04 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4UsbModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/Proxmark3Rdv4UsbModel.java @@ -2,11 +2,21 @@ package cn.rrg.rdv.models; import com.iobridges.com.DeviceChecker; -import cn.rrg.devices.Proxmark3RRGRdv4; +import java.io.IOException; public class Proxmark3Rdv4UsbModel extends AbsUsb2UartModel { @Override public DeviceChecker getDeviceInitImpl() { - return new Proxmark3RRGRdv4(mDI); + return new DeviceChecker(mDI) { + @Override + protected boolean checkDevice() throws IOException { + return true; + } + + @Override + public void close() throws IOException { + + } + }; } } diff --git a/app_main/src/main/java/cn/rrg/rdv/settings/CommonRWKeyFilesSelectedSettings.java b/app_main/src/main/java/cn/rrg/rdv/settings/CommonRWKeyFilesSelectedSettings.java deleted file mode 100644 index 61237da1..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/settings/CommonRWKeyFilesSelectedSettings.java +++ /dev/null @@ -1,46 +0,0 @@ -package cn.rrg.rdv.settings; - -import java.io.File; -import java.io.IOException; - -import cn.dxl.common.util.DiskKVUtil; -import cn.rrg.rdv.application.Properties; -import cn.rrg.rdv.util.Paths; - -public class CommonRWKeyFilesSelectedSettings implements BaseSetting { - @Override - public File getSettingsFile() { - return new File(Paths.SETTINGS_FILE); - } - - @Override - public String onQuerySetting() { - return Properties.k_common_rw_keyfile_selected; - } - - @Override - public void onNotFound(String key) { - try { - DiskKVUtil.insertKV(Properties.k_common_rw_keyfile_selected, "", getSettingsFile()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void onNormal(String[] value) { - // 判断一下值是否有效! - for (String v : value) { - File file = new File(v); - if (!file.exists()) { - // 参数所指文件不存在,删除这个键值对! - try { - DiskKVUtil.deleteKV(Properties.k_common_rw_keyfile_selected, v, getSettingsFile()); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - Properties.v_common_rw_keyfile_selected = value; - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/settings/MainPageColumnCountSetting.java b/app_main/src/main/java/cn/rrg/rdv/settings/MainPageColumnCountSetting.java deleted file mode 100644 index c215d78a..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/settings/MainPageColumnCountSetting.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.rrg.rdv.settings; - -import java.io.File; -import java.io.IOException; - -import cn.rrg.rdv.util.Paths; -import cn.rrg.rdv.application.Properties; -import cn.dxl.common.util.DiskKVUtil; - -public class MainPageColumnCountSetting implements BaseSetting { - @Override - public File getSettingsFile() { - return new File(Paths.SETTINGS_FILE); - } - - @Override - public String onQuerySetting() { - return Properties.k_view_main_page_column_count; - } - - @Override - public void onNotFound(String key) { - //否则创建! - try { - DiskKVUtil.insertKV(Properties.k_view_main_page_column_count, "4", getSettingsFile()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void onNormal(String[] value) { - Properties.v_view_main_page_column_count = DiskKVUtil.toInt(value[0], 4); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/settings/Proxmark3ConsleDelaySetting.java b/app_main/src/main/java/cn/rrg/rdv/settings/Proxmark3ConsleDelaySetting.java deleted file mode 100644 index be34d55c..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/settings/Proxmark3ConsleDelaySetting.java +++ /dev/null @@ -1,35 +0,0 @@ -package cn.rrg.rdv.settings; - -import java.io.File; -import java.io.IOException; - -import cn.rrg.rdv.util.Paths; -import cn.rrg.rdv.application.Properties; -import cn.dxl.common.util.DiskKVUtil; - -public class Proxmark3ConsleDelaySetting implements BaseSetting { - @Override - public File getSettingsFile() { - return new File(Paths.SETTINGS_FILE); - } - - @Override - public String onQuerySetting() { - return Properties.k_pm3_delayTime; - } - - @Override - public void onNotFound(String key) { - //否则创建! - try { - DiskKVUtil.insertKV(key, "50", getSettingsFile()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void onNormal(String[] value) { - Properties.v_pm3_delayTime = DiskKVUtil.toInt(value[0], 50); - } -} diff --git a/app_main/src/main/java/cn/rrg/rdv/util/AccessBitUtil.java b/app_main/src/main/java/cn/rrg/rdv/util/AccessBitUtil.java deleted file mode 100644 index 4556529c..00000000 --- a/app_main/src/main/java/cn/rrg/rdv/util/AccessBitUtil.java +++ /dev/null @@ -1,623 +0,0 @@ -package cn.rrg.rdv.util; - -/** - * Created by DXL on 2018/4/4. - */ - -import java.util.HashMap; - -public class AccessBitUtil { - - /* - * 控制位长度,4位字节八个十六进制字符 - */ - public static final int CONTROLBIT_HEX_SIZE = 8; - public static final int CONTROLBIT_BYTE_SIZE = 4; - - //可以实例化对象时使用的全局控制位缓存 - private byte[] mAcBytes = null; - - //静态工具库,default构造方法设为私有较好 - private AccessBitUtil() { /*This is don't need*/ } - - //有参构造方法,简化对相同控制位解析时方法调用的实现 - private AccessBitUtil(byte[] acBytes) { - this.mAcBytes = acBytes; - } - - /** - * 参考文档 - * https://blog.csdn.net/liujianhua1989/article/details/72639307 - * https://www.cnblogs.com/h2zZhou/p/5250703.html - * https://github.com/ikarus23/MifareClassicTool - */ - - /** - * 认证后可执行下列操作: - * 1、读数据块,读操作支持普通的数据块(0-2)与电子钱包块与尾块(trail) - * 2、写数据块,写操作支持普通的数据块(0-2)与电子钱包块与尾块(trail) - * 3、减值:减少数据块内的数值,并将结果保存在临时内部数据寄存器中。(仅支持电子钱包块) - * 4、加值:增加数据块内的数值,并将结果保存在数据寄存器中。(仅支持电子钱包块) - * 5、恢复:将数据块内容移入数据寄存器。(仅支持电子钱包块) - * 6、转存:将临时内部数据寄存器的内容写入数值块。 (仅支持电子钱包块) - * 枚举操作类型,依次为 -> 读卡 , 写卡 , 增值 , 减值 , 恢复 , 转存 - */ - public static enum Operation { - READ, WRITE, INCREMENT, DECREMENT, RESTORE, TRANSFER - } - - //密钥的验证是有KeyA,KeyB的两种不同的选择的, - //当控制位的条件成立时,Key也可当作鉴权值之一 - //三个枚举元素分别是 A密钥, B密钥,AB密钥,两者都没 - public static enum KeyType { - A, B, AB, NEVER - } - - //对于一个扇区,能操作的只有两部分,一部分是数据块,一部分是尾部块 - public static enum SectorStructure { - DATA, TRAIL - } - - /* - * 对数据块,能操作的总共有“三部分”, - * Block0和Block1和Block2,不同容量的卡块数量不同, - * 但是对于MIFARE CLASSIC CARD的兼容性来说,能操作的,就是“三部分” - */ - public static enum DataBlockStructure { - BLOCK0, BLOCK1, BLOCK2, BLOCK3 - } - - //对于特殊的块3,是有三部分的分割读写区域 - //其中分别是KeyA的读写,还有KeyB的读写, 还有控制位的读写 - //因此我们要根据要操作的区域对控制位进行解析鉴权 - public static enum TrailStructure { - KEYA, KEYB, CONTROLBIT - } - - //对于控制位,是有C1 , C2, C3的编号 - public static enum ControlBitNum { - C1, C2, C3 - } - - /** - * 块具有相对于区的独立性,16扇区各自拥有独立的鉴权方式, - * 块鉴权在控制位的约束下,对于密码的权限是依赖控制位的实现 - * 依据控制位的约束,密钥对于块进行上述操作是必须要条件成立 - * 每个数据块和尾块的读写条件均由3个bit定义, - * 并以非取反和取反形式保存在各个区的尾块中。 - * *尾部块由C13 C23 C33三个控制位来控制,由于不是数据块,因此仅支持读写操作 - * 数据块2由C12 C22 C32三个控制位控制,由于是数据块,因此支持读写增值减值操作 - * 数据块1由C11 C21 C31三个控制位控制,由于是数据块,因此支持读写增值减值操作 - * 数据块0由C10 C20 C30三个控制位控制,由于是数据块,因此支持读写增值减值操作 - */ - - /* 警告,若控制位错误,将导致扇区锁死 */ - - /** - * 尾部块操作权限解析方法 - * 根据传入的控制字节对操作进行解析,返回对应的ENUM对象 - * - * @param c1 控制字节1 - * @param c2 控制字节2 - * @param c3 控制字节3 - * @param opera 将要进行的操作 - * @param whereToOpera 将要操作尾部块那一部分 - */ - public static KeyType trailOperation(byte c1, byte c2, byte c3, - Operation opera, TrailStructure whereToOpera) { - //判断传入的操作类型是否正确,如果不正确则直接返回NEVER - //特别警告!!!在尾部块,操作仅限于支持读操作与写操作 - if (opera != Operation.READ && opera != Operation.WRITE) return KeyType.NEVER; - //为了简化鉴权过程,先执行把操作为读的鉴权 - if (opera == Operation.READ) { - //在尾部块的操作为在KeyA部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.KEYA) { - //当控制位为000时KeyA部分禁止读 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //当控制位为001时KeyA部分禁止读 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //当控制位为010时KeyA部分禁止读 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为011时KeyA部分禁止读 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.NEVER; - //当控制位为100时KeyA部分禁止读 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //当控制位为101时KeyA部分禁止读 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //当控制位为110时KeyA部分禁止读 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为111时KeyA部分禁止读 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //在尾部块的操作为在控制位部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.CONTROLBIT) { - //当控制位为000时控制位部分允许验证密钥A后读 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.A; - //当控制位为001时控制位部分允许验证密钥A后读 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.A; - //当控制位为010时控制位部分允许验证密钥A后读 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.A; - //当控制位为011时控制位部分允许验证密钥A|B后读 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.AB; - //当控制位为100时控制位部分允许验证密钥A|B后读 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.AB; - //当控制位为101时控制位部分允许验证密钥A|B后读 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.AB; - //当控制位为110时控制位部分允许验证密钥A|B后读 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.AB; - //当控制位为111时控制位部分允许验证密钥A|B后读 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.AB; - } - //在尾部块的操作为在KeyB部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.KEYB) { - //当控制位为000时KeyB部分允许验证密钥A后读 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.A; - //当控制位为001时KeyB部分允许验证密钥A后读 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.A; - //当控制位为010时KeyB部分允许验证密钥A后读 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.A; - //当控制位为011时KeyB部分禁止读 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.NEVER; - //当控制位为100时KeyB部分禁止读 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //当控制位为101时KeyB部分禁止读 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //当控制位为110时KeyB部分禁止读 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为111时KeyB部分禁止读 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - - } - //然后再执行操作为写的鉴权 - if (opera == Operation.WRITE) { - //在尾部块的操作为在KeyA部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.KEYA) { - //当控制位为000时KeyA部分允许验证密钥A后写 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.A; - //当控制位为001时KeyA部分允许验证密钥A后写 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.A; - //当控制位为010时KeyA部分禁止写 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为011时KeyA部分允许验证密钥B后写 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.B; - //当控制位为100时KeyA部分允许验证密钥B后写 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.B; - //当控制位为101时KeyA部分禁止写 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //当控制位为110时KeyA部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为111时KeyA部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //在尾部块的操作为在控制位部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.CONTROLBIT) { - //当控制位为000时控制位部分允许验证密钥B后写 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.B; - //当控制位为001时控制位部分允许验证密钥A后写 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.A; - //当控制位为010时控制位部分禁止写 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为011时控制位部分允许验证密钥B后写 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.B; - //当控制位为100时控制位部分禁止写 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //当控制位为101时控制位部分允许验证密钥B后写 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.B; - //当控制位为110时控制位部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为111时控制位部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //在尾部块的操作为在KeyB部分上进行的时候的鉴权 - if (whereToOpera == TrailStructure.KEYB) { - //当控制位为000时KeyB部分允许验证密钥A后写 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.A; - //当控制位为001时KeyB部分允许验证密钥A后写 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.A; - //当控制位为010时KeyB部分禁止写 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为011时KeyB部分允许验证密钥B后写 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.B; - //当控制位为100时KeyB部分允许验证密钥B后写 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.B; - //当控制位为101时KeyB部分禁止写 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //当控制位为110时KeyB部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //当控制位为111时KeyB部分禁止写 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - } - //在条件都不成立时返回NEVER - return KeyType.NEVER; - } - - /** - * 数据块操作权限解析方法 - * 根据传入的控制字节对操作进行解析,返回对应的ENUM对象 - * - * @param c1 控制字节1 - * @param c2 控制字节2 - * @param c3 控制字节3 - * @param opera 将要对数据块进行的操作 - */ - public static KeyType generalOperation(byte c1, byte c2, byte c3, Operation opera) { - //1、进行数据块读操作的鉴权 - if (opera == Operation.READ) { - //在控制位为000时允许密钥AB后读 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.AB; - //在控制位为010时允许密钥AB后读 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.AB; - //在控制位为100时允许密钥AB后读 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.AB; - //在控制位为110时允许密钥AB后读 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.AB; - //在控制位为001时允许密钥AB后读 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.AB; - //在控制位为011时允许密钥B后读 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.B; - //在控制位为101时允许密钥B后读 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.B; - //在控制位为111时禁止读 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //1、进行数据块写操作的鉴权 - if (opera == Operation.WRITE) { - //在控制位为000时允许密钥AB后写 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.AB; - //在控制位为010时允许密钥B后写 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.B; - //在控制位为100时允许密钥B后写 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.B; - //在控制位为110时允许密钥B后写 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.B; - //在控制位为001时禁止读 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //在控制位为011时允许密钥B后写 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.B; - //在控制位为101时禁止写 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //在控制位为111时禁止写 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //3、进行数据块增值操作的鉴权 - if (opera == Operation.INCREMENT) { - //在控制位为000时允许密钥AB后增值 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.AB; - //在控制位为010时允许密钥B后增值 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //在控制位为100时允许密钥B后增值 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //在控制位为110时允许密钥B后增值 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.B; - //在控制位为001时禁止增值 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //在控制位为011时允许密钥B后增值 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.NEVER; - //在控制位为101时禁止增值 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //在控制位为111时禁止增值 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //4、进行数据块减值操作的鉴权 - //5、进行数据块恢复操作的鉴权 - //6、进行数据块转存操作的鉴权 - if (opera == Operation.DECREMENT || - opera == Operation.RESTORE || - opera == Operation.TRANSFER) { - //在控制位为000时允许密钥AB后减值转存恢复 - if (c1 == 0 && c2 == 0 && c3 == 0) return KeyType.AB; - //在控制位为010时允许密钥B后减值转存恢复 - if (c1 == 0 && c2 == 1 && c3 == 0) return KeyType.NEVER; - //在控制位为100时允许密钥B后减值转存恢复 - if (c1 == 1 && c2 == 0 && c3 == 0) return KeyType.NEVER; - //在控制位为110时允许密钥AB后减值转存恢复 - if (c1 == 1 && c2 == 1 && c3 == 0) return KeyType.AB; - //在控制位为001时允许密钥AB后减值转存恢复 - if (c1 == 0 && c2 == 0 && c3 == 1) return KeyType.AB; - //在控制位为011时禁止减值转存恢复 - if (c1 == 0 && c2 == 1 && c3 == 1) return KeyType.NEVER; - //在控制位为101时禁止减值转存恢复 - if (c1 == 1 && c2 == 0 && c3 == 1) return KeyType.NEVER; - //在控制位为111时禁止减值转存恢复 - if (c1 == 1 && c2 == 1 && c3 == 1) return KeyType.NEVER; - } - //在条件都不成立时返回NEVER - return KeyType.NEVER; - } - - /** - * 密钥B可读性判断方法 - * 返回TRUE则keyB可读并可用于存储数据的访问控制条件 - * 尾块和key A被预定义为传输配置状态。 - * 因为在传输配置状态下key B可读, - * (KeyB可读的情况下)新卡必须用keyA认证。 - * - * @param c1 控制字节1 - * @param c2 控制字节2 - * @param c3 控制字节3 - */ - public static boolean isKeyBReadable(byte c1, byte c2, byte c3) { - return c1 == 0 - //在控制位为000时密钥B可读 - && (c2 == 0 && c3 == 0) - //在控制位为010时密钥B可读 - || (c2 == 1 && c3 == 0) - //在控制位为001时密钥B可读 - || (c2 == 0 && c3 == 1); - } - - public static boolean isKeyBReadable(byte[] ac) { - byte c1 = (byte) ((ac[1] & 0x80) >>> 7); - byte c2 = (byte) ((ac[2] & 0x08) >>> 3); - byte c3 = (byte) ((ac[2] & 0x80) >>> 7); - return isKeyBReadable(c1, c2, c3); - } - - /** - * 传输配置状态检测方法 - * - * @param c1 控制字节1 - * @param c2 控制字节2 - * @param c3 控制字节3 - * @param block 要操作的区域 - */ - public static boolean isTranspotConfiguration(byte c1, byte c2, byte c3, - SectorStructure block) { - if (c1 == 0 && c2 == 0) { - //操作数据块的情况下如果控制位为000则为传输配置状态 - if (block == SectorStructure.DATA && c3 == 0) return true; - //操作尾部块的情况下如果控制位为001则为传输配置状态 - if (block == SectorStructure.TRAIL && c3 == 1) return true; - } - return false; - } - - /** - * 解析控制字节的方法 - * - * @param controlBit 长度为4byte的控制位 - * @param block 枚举对象,用于判断要解析的块的控制位的鉴权 - * 返回对应的区块的控制权限_对应的byte - */ - public static HashMap unpackAccessInfo(byte[] controlBit, DataBlockStructure block) { - //控制位长度查错 - if (controlBit.length != CONTROLBIT_BYTE_SIZE) { - throw new RuntimeException("The ControlBit length is error!!!"); - } - //存结果的图表 - HashMap result = new HashMap<>(); - //建立一个矩阵数组,存控制位换算结果 - //三个控制位,四个块 - byte[][] acMatrix = new byte[3][4]; - //验证控制位的可行性 - if ((byte) ((controlBit[1] >>> 4) & 0x0F) == - (byte) ((controlBit[0] ^ 0xFF) & 0x0F) && - (byte) (controlBit[2] & 0x0F) == - (byte) (((controlBit[0] ^ 0xFF) >>> 4) & 0x0F) && - (byte) ((controlBit[2] >>> 4) & 0x0F) == - (byte) ((controlBit[1] ^ 0xFF) & 0x0F)) { - // C1, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[0][i] = (byte) ((controlBit[1] >>> 4 + i) & 0x01); - } - // C2, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[1][i] = (byte) ((controlBit[2] >>> i) & 0x01); - } - // C3, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[2][i] = (byte) ((controlBit[2] >>> 4 + i) & 0x01); - } - } - if (block == DataBlockStructure.BLOCK0) { - result.put(ControlBitNum.C1, acMatrix[0][0]); - result.put(ControlBitNum.C2, acMatrix[1][0]); - result.put(ControlBitNum.C3, acMatrix[2][0]); - return result; - } - if (block == DataBlockStructure.BLOCK1) { - result.put(ControlBitNum.C1, acMatrix[0][1]); - result.put(ControlBitNum.C2, acMatrix[1][1]); - result.put(ControlBitNum.C3, acMatrix[2][1]); - return result; - } - if (block == DataBlockStructure.BLOCK2) { - result.put(ControlBitNum.C1, acMatrix[0][2]); - result.put(ControlBitNum.C2, acMatrix[1][2]); - result.put(ControlBitNum.C3, acMatrix[2][2]); - return result; - } - if (block == DataBlockStructure.BLOCK3) { - result.put(ControlBitNum.C1, acMatrix[0][3]); - result.put(ControlBitNum.C2, acMatrix[1][3]); - result.put(ControlBitNum.C3, acMatrix[2][3]); - return result; - } - return null; - } - - /** - * 打包控制字节的方法 - * - * @param controlBit 全部控制位的实现,当有四个对象,每个对象里有用C1 , C2 , C3 - * 三个键值对,对应四个块的三个控制位 - * 返回全部区块的控制权限_对应的byte(三个,不包括预留字节) - */ - public static byte[] packAccessInfo(HashMap> controlBit) { - //建立一个矩阵数组,存控制位换算结果 - //三个控制位,四个块,从图表中取出来填充到矩阵数组中 - byte[][] acMatrix = new byte[3][4]; - //外层迭代 - for (int i = 0; i < 3; ++i) { - //内层迭代 - for (int j = 0; j < 4; ++j) { - acMatrix[i][j] = - //取出对应扇区的控制比特位封包 - controlBit.get(DataBlockStructure.values()[j]) - //取出封包中的比特位打包进矩阵中 - .get(ControlBitNum.values()[i]); - } - } - //开始将比特矩阵数组转化为字节数组 - for (int i = 0; i < 3; i++) { - if (acMatrix[i].length != 4) - // Error. - return null; - } - byte[] acBytes = new byte[3]; - // Byte 6, Bit 0-3. - - acBytes[0] = (byte) ((acMatrix[0][0] ^ 0xFF) & 0x01); - acBytes[0] |= (byte) (((acMatrix[0][1] ^ 0xFF) << 1) & 0x02); - acBytes[0] |= (byte) (((acMatrix[0][2] ^ 0xFF) << 2) & 0x04); - acBytes[0] |= (byte) (((acMatrix[0][3] ^ 0xFF) << 3) & 0x08); - // Byte 6, Bit 4-7. - acBytes[0] |= (byte) (((acMatrix[1][0] ^ 0xFF) << 4) & 0x10); - acBytes[0] |= (byte) (((acMatrix[1][1] ^ 0xFF) << 5) & 0x20); - acBytes[0] |= (byte) (((acMatrix[1][2] ^ 0xFF) << 6) & 0x40); - acBytes[0] |= (byte) (((acMatrix[1][3] ^ 0xFF) << 7) & 0x80); - // Byte 7, Bit 0-3. - acBytes[1] = (byte) ((acMatrix[2][0] ^ 0xFF) & 0x01); - acBytes[1] |= (byte) (((acMatrix[2][1] ^ 0xFF) << 1) & 0x02); - acBytes[1] |= (byte) (((acMatrix[2][2] ^ 0xFF) << 2) & 0x04); - acBytes[1] |= (byte) (((acMatrix[2][3] ^ 0xFF) << 3) & 0x08); - // Byte 7, Bit 4-7. - acBytes[1] |= (byte) ((acMatrix[0][0] << 4) & 0x10); - acBytes[1] |= (byte) ((acMatrix[0][1] << 5) & 0x20); - acBytes[1] |= (byte) ((acMatrix[0][2] << 6) & 0x40); - acBytes[1] |= (byte) ((acMatrix[0][3] << 7) & 0x80); - // Byte 8, Bit 0-3. - acBytes[2] = (byte) (acMatrix[1][0] & 0x01); - acBytes[2] |= (byte) ((acMatrix[1][1] << 1) & 0x02); - acBytes[2] |= (byte) ((acMatrix[1][2] << 2) & 0x04); - acBytes[2] |= (byte) ((acMatrix[1][3] << 3) & 0x08); - // Byte 8, Bit 4-7. - acBytes[2] |= (byte) ((acMatrix[2][0] << 4) & 0x10); - acBytes[2] |= (byte) ((acMatrix[2][1] << 5) & 0x20); - acBytes[2] |= (byte) ((acMatrix[2][2] << 6) & 0x40); - acBytes[2] |= (byte) ((acMatrix[2][3] << 7) & 0x80); - - return acBytes; - } - - /** - * Convert the Access Condition bytes to a matrix containing the - * resolved C1, C2 and C3 for each block. - * - * @param acBytes 控制位字节数组 - * @return 返回由3字节的控制位解析出来的控制位(bit)矩阵 - * null will be returned. - */ - public static byte[][] acBytesToACMatrix(byte acBytes[]) { - // ACs correct? - // C1 (Byte 7, 4-7) == ~C1 (Byte 6, 0-3) and - // C2 (Byte 8, 0-3) == ~C2 (Byte 6, 4-7) and - // C3 (Byte 8, 4-7) == ~C3 (Byte 7, 0-3) - byte[][] acMatrix = new byte[3][4]; - if (acBytes.length > 2 && - (byte) ((acBytes[1] >>> 4) & 0x0F) == (byte) ((acBytes[0] ^ 0xFF) & 0x0F) && - (byte) (acBytes[2] & 0x0F) == (byte) (((acBytes[0] ^ 0xFF) >>> 4) & 0x0F) && - (byte) ((acBytes[2] >>> 4) & 0x0F) == (byte) ((acBytes[1] ^ 0xFF) & 0x0F)) { - // C1, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[0][i] = (byte) ((acBytes[1] >>> 4 + i) & 0x01); - } - // C2, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[1][i] = (byte) ((acBytes[2] >>> i) & 0x01); - } - // C3, Block 0-3 - for (int i = 0; i < 4; i++) { - acMatrix[2][i] = (byte) ((acBytes[2] >>> 4 + i) & 0x01); - } - return acMatrix; - } - return null; - } - - /** - * 把矩阵控制位(比特类型的矩阵数组)转换为3字节的控制位 - * - * @param acMatrix bit类型的控制位矩阵数组 - * @return 返回3字节的字节数组 - */ - public static byte[] acMatrixToACBytes(byte acMatrix[][]) { - if (acMatrix != null && acMatrix.length == 3) { - for (int i = 0; i < 3; i++) { - if (acMatrix[i].length != 4) - // Error. - return null; - } - } else { - // Error. - return null; - } - byte[] acBytes = new byte[3]; - // Byte 6, Bit 0-3. - acBytes[0] = (byte) ((acMatrix[0][0] ^ 0xFF) & 0x01); - acBytes[0] |= (byte) (((acMatrix[0][1] ^ 0xFF) << 1) & 0x02); - acBytes[0] |= (byte) (((acMatrix[0][2] ^ 0xFF) << 2) & 0x04); - acBytes[0] |= (byte) (((acMatrix[0][3] ^ 0xFF) << 3) & 0x08); - // Byte 6, Bit 4-7. - acBytes[0] |= (byte) (((acMatrix[1][0] ^ 0xFF) << 4) & 0x10); - acBytes[0] |= (byte) (((acMatrix[1][1] ^ 0xFF) << 5) & 0x20); - acBytes[0] |= (byte) (((acMatrix[1][2] ^ 0xFF) << 6) & 0x40); - acBytes[0] |= (byte) (((acMatrix[1][3] ^ 0xFF) << 7) & 0x80); - // Byte 7, Bit 0-3. - acBytes[1] = (byte) ((acMatrix[2][0] ^ 0xFF) & 0x01); - acBytes[1] |= (byte) (((acMatrix[2][1] ^ 0xFF) << 1) & 0x02); - acBytes[1] |= (byte) (((acMatrix[2][2] ^ 0xFF) << 2) & 0x04); - acBytes[1] |= (byte) (((acMatrix[2][3] ^ 0xFF) << 3) & 0x08); - // Byte 7, Bit 4-7. - acBytes[1] |= (byte) ((acMatrix[0][0] << 4) & 0x10); - acBytes[1] |= (byte) ((acMatrix[0][1] << 5) & 0x20); - acBytes[1] |= (byte) ((acMatrix[0][2] << 6) & 0x40); - acBytes[1] |= (byte) ((acMatrix[0][3] << 7) & 0x80); - // Byte 8, Bit 0-3. - acBytes[2] = (byte) (acMatrix[1][0] & 0x01); - acBytes[2] |= (byte) ((acMatrix[1][1] << 1) & 0x02); - acBytes[2] |= (byte) ((acMatrix[1][2] << 2) & 0x04); - acBytes[2] |= (byte) ((acMatrix[1][3] << 3) & 0x08); - // Byte 8, Bit 4-7. - acBytes[2] |= (byte) ((acMatrix[2][0] << 4) & 0x10); - acBytes[2] |= (byte) ((acMatrix[2][1] << 5) & 0x20); - acBytes[2] |= (byte) ((acMatrix[2][2] << 6) & 0x40); - acBytes[2] |= (byte) ((acMatrix[2][3] << 7) & 0x80); - - return acBytes; - } - - /** - * 根据一个控制位来进行所有的操作时使用的对象 - * - * @param acBytes 控制位字节,四字节的控制位字节数组 - * @return 返回this - */ - public static AccessBitUtil operaOneAc(byte[] acBytes) { - return new AccessBitUtil(acBytes); - } - - /** - * 重载unpackAccessInfo,简化调用 - */ - public HashMap unpackAccessInfo(DataBlockStructure block) { - return unpackAccessInfo(mAcBytes, block); - } - - /** - * 重载unpackAccessInfo,简化调用 - */ - public HashMap> unpackAccessInfo() { - DataBlockStructure[] blocks = {DataBlockStructure.BLOCK0, - DataBlockStructure.BLOCK1, - DataBlockStructure.BLOCK2, - DataBlockStructure.BLOCK3}; - HashMap> result = new HashMap>(); - for (int i = 0; i < 4; ++i) { - result.put(blocks[i], unpackAccessInfo(blocks[i])); - } - return result; - } -} \ No newline at end of file diff --git a/app_main/src/main/java/cn/rrg/rdv/util/Commons.java b/app_main/src/main/java/cn/rrg/rdv/util/Commons.java index 46163e9f..8136975e 100644 --- a/app_main/src/main/java/cn/rrg/rdv/util/Commons.java +++ b/app_main/src/main/java/cn/rrg/rdv/util/Commons.java @@ -12,6 +12,7 @@ import android.widget.RadioGroup; import java.io.File; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -198,4 +199,27 @@ public class Commons { FileUtils.createFile(file); return file; } + + public static Set getKeyFilesSelected() { + return getPrivatePreferences() + .getStringSet(Properties.k_common_rw_keyfile_selected, new HashSet<>()); + } + + public static void addKeyFileSelect(String path) { + Set old = getKeyFilesSelected(); + old.add(path); + getPrivatePreferences() + .edit() + .putStringSet(Properties.k_common_rw_keyfile_selected, old) + .apply(); + } + + public static void delKeyFileSelected(String path) { + Set old = getKeyFilesSelected(); + old.remove(path); + getPrivatePreferences() + .edit() + .putStringSet(Properties.k_common_rw_keyfile_selected, old) + .apply(); + } } 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 58518ca0..da78b89b 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 @@ -9,9 +9,6 @@ import java.io.IOException; import cn.rrg.rdv.settings.BaseSetting; import cn.rrg.rdv.settings.ChameleonSlotAliasesSetting; import cn.rrg.rdv.settings.ChameleonSlotAliasesStatusSetting; -import cn.rrg.rdv.settings.CommonRWKeyFilesSelectedSettings; -import cn.rrg.rdv.settings.MainPageColumnCountSetting; -import cn.rrg.rdv.settings.Proxmark3ConsleDelaySetting; import cn.dxl.common.util.AssetsUtil; import cn.dxl.common.util.DiskKVUtil; @@ -224,9 +221,6 @@ public class InitUtil { BaseSetting[] baseSettings = new BaseSetting[]{ new ChameleonSlotAliasesSetting(), new ChameleonSlotAliasesStatusSetting(), - new MainPageColumnCountSetting(), - new Proxmark3ConsleDelaySetting(), - new CommonRWKeyFilesSelectedSettings() }; //迭代设置配置实现类,进行设置参数的初始化! for (BaseSetting setting : baseSettings) { diff --git a/pm3rdv4rrg/.gitignore b/pm3rdv4rrg/.gitignore deleted file mode 100644 index 3889eda0..00000000 --- a/pm3rdv4rrg/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Cmake gen -.cxx/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/ - -# Keystore files -# Uncomment the following line if you do not want to check your keystore files in. -#*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md diff --git a/pm3rdv4rrg/build.gradle b/pm3rdv4rrg/build.gradle deleted file mode 100644 index 0cf5a379..00000000 --- a/pm3rdv4rrg/build.gradle +++ /dev/null @@ -1,67 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - - defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - - externalNativeBuild { - cmake { - arguments '-DANDROID_STL=c++_static' - abiFilters "x86", "x86_64", "armeabi-v7a", "arm64-v8a" - } - } - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles 'consumer-rules.pro' - } - - /*externalNativeBuild { - cmake { - version '3.10.2' - path 'src/main/cpp/proxmark3/client/android/CMakeLists.txt' - } - }*/ - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - - /*android.libraryVariants.all { variant -> - def rootPath = getRootDir(); - File targetPath = new File(rootPath.path + "/app_main/src/main/assets/pm3/resources"); - def sourcePath = "src/main/cpp/proxmark3/client/resources" - // first we need delete history - // delete targetPath - if (!targetPath.exists()) targetPath.mkdirs() - variant.mergeAssets.doLast { - println "${targetPath}" - copy { - from "${sourcePath}" - into "${targetPath}" - } - } - }*/ -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.github.xianglin1998:nfctag:1.0' - implementation 'com.github.xianglin1998:nfc_console:1.0' - - implementation 'com.github.xianglin1998:ComBridge:1.0.7' - // implementation project(path: ':iobridges') - - implementation project(':communication') - implementation project(path: ':utils') - - implementation 'androidx.appcompat:appcompat:1.1.0' -} \ No newline at end of file diff --git a/pm3rdv4rrg/consumer-rules.pro b/pm3rdv4rrg/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/pm3rdv4rrg/proguard-rules.pro b/pm3rdv4rrg/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/pm3rdv4rrg/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/pm3rdv4rrg/src/main/AndroidManifest.xml b/pm3rdv4rrg/src/main/AndroidManifest.xml deleted file mode 100644 index babbbc7e..00000000 --- a/pm3rdv4rrg/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/pm3rdv4rrg/src/main/cpp/proxmark3 b/pm3rdv4rrg/src/main/cpp/proxmark3 deleted file mode 160000 index e9d06e0e..00000000 --- a/pm3rdv4rrg/src/main/cpp/proxmark3 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e9d06e0ec5d128327334be27f76e82dad6489dd2 diff --git a/pm3rdv4rrg/src/main/java/cn/rrg/devices/Proxmark3RRGRdv4.java b/pm3rdv4rrg/src/main/java/cn/rrg/devices/Proxmark3RRGRdv4.java deleted file mode 100644 index 89f65b70..00000000 --- a/pm3rdv4rrg/src/main/java/cn/rrg/devices/Proxmark3RRGRdv4.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.rrg.devices; - -import com.iobridges.com.Communication; -import com.iobridges.com.DeviceChecker; - -import java.io.IOException; - -import cn.dxl.common.util.LogUtils; - -public class Proxmark3RRGRdv4 extends DeviceChecker { - - static { - System.loadLibrary("pm3rrg_rdv4"); - } - - public Proxmark3RRGRdv4(Communication communication) { - super(communication); - } - - @Override - public boolean checkDevice() throws IOException { - LogUtils.d("测试顺序"); - return testPm3(); - } - - @Override - public void close() throws IOException { - closePm3(); - } - - private native boolean testPm3() throws IOException; - - private native void closePm3(); -} diff --git a/pm3rdv4rrg/src/main/java/cn/rrg/natives/Proxmark3RRGRdv4Tools.java b/pm3rdv4rrg/src/main/java/cn/rrg/natives/Proxmark3RRGRdv4Tools.java deleted file mode 100644 index 0f866e4f..00000000 --- a/pm3rdv4rrg/src/main/java/cn/rrg/natives/Proxmark3RRGRdv4Tools.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.rrg.natives; - -import cn.rrg.console.define.ICommandTools; - -public class Proxmark3RRGRdv4Tools implements ICommandTools { - - //加载so文件! - static { - System.loadLibrary("pm3rrg_rdv4"); - } - - @Override - public native int startExecute(String cmd); - - @Override - public native boolean isExecuting(); - - @Override - public native void stopExecute(); -} diff --git a/pm3rdv4rrg/src/main/res/values/strings.xml b/pm3rdv4rrg/src/main/res/values/strings.xml deleted file mode 100644 index 0b86ae82..00000000 --- a/pm3rdv4rrg/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - pm3rdv4rrg - diff --git a/settings.gradle b/settings.gradle index 0ec19362..21d0d736 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -include ':app_main', ':utils', ':chameleon', ':communication', ':libnfc_pn53x', ':pm3rdv4rrg' +include ':app_main', ':utils', ':chameleon', ':communication', ':libnfc_pn53x' include ':pm3flasher' include ':xmodem' include ':termux-app', ':terminal-emulator', ':terminal-view' \ No newline at end of file