diff --git a/app_main/build.gradle b/app_main/build.gradle
index e611ce50..f5c9d2b3 100644
--- a/app_main/build.gradle
+++ b/app_main/build.gradle
@@ -52,14 +52,11 @@ dependencies {
annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'
- // This my project maven from github release!
- implementation 'com.github.xianglin1998:IORedirector:1.0'
- implementation 'com.github.xianglin1998:Crapto1:1.3'
- 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(path: ':iobridges')
+ implementation project(path: ':crapto1')
+ implementation project(path: ':nfctag')
+ implementation project(path: ':console')
+ implementation project(path: ':redirector')
implementation project(':utils')
implementation project(':libnfc_pn53x')
diff --git a/app_main/src/main/AndroidManifest.xml b/app_main/src/main/AndroidManifest.xml
index 3d84091b..17c27157 100644
--- a/app_main/src/main/AndroidManifest.xml
+++ b/app_main/src/main/AndroidManifest.xml
@@ -35,9 +35,7 @@
-
-
diff --git a/app_main/src/main/assets/help.html b/app_main/src/main/assets/help.html
deleted file mode 100644
index 790b7618..00000000
--- a/app_main/src/main/assets/help.html
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
-
- 使用帮助
-
-
-前言
-本APP支持哪些设备?
-
- - 1、恩智浦_自带(免费)
- - 2、恩智浦_PN532(付费)
- - 3、龙杰_ACR122U(付费)
- - 4、Proxmark3CDC(付费)
- - 5、ChameleonCDC(付费)
- - 6、Proxmark3SPP(付费)
-
-本APP支持哪些连接方式?
-
-APP注意事项正文
-
- 1、Miui系统可能需要前往权限管理打开“后台弹出窗口”,否则一键重启不可用!
-
-
- 2、没有购买权限是无法发现相关设备的,请有需要的用户联系管理员购买!
-
-
- 3、为了您的数据安全,APP不允许您以Wifi代理或者VPN之类的方式联网!
-
-
- 4、很多权限都是谷歌附加强调的,但APP本身并未使用,比如定位,此链接可证实:cnblogs!
- 如果您没有使用蓝牙相关的设备,您完全可以禁止本APP的定位权限,身正不怕影子斜!
-
-
- 5、目前已知的问题是后台一段时间后会被回收内存,导致程序出错,所以在处理任务时请不要轻易切换后台!
-
-
- 6、出现问题请在“加入Q群”中进群反馈,必要时提供log文件,在“发送log”选项中,
- 选择log时请选择发送最顶端的带有数字的比如“log_1557477240504”,最好是多发几个。
-
-APP使用帮助正文
-
- 本APP在线帮助与免责声明已经整理好一部分,本APP涉及到的开源库将被共享到此链接,如果未发现,可能是操作未更新,可联系dev要求更新。跳转观看
-
-
\ No newline at end of file
diff --git a/app_main/src/main/assets/pm3_version.txt b/app_main/src/main/assets/pm3_version.txt
new file mode 100644
index 00000000..1a81daa1
--- /dev/null
+++ b/app_main/src/main/assets/pm3_version.txt
@@ -0,0 +1,10 @@
+20201026_5
+
+pattern: *_*
+
+frist *: date
+second: number
+
+example: 20201026_1
+example: 20201026_2
+example: 20201027_1
\ No newline at end of file
diff --git a/app_main/src/main/assets/proxmark3.zip b/app_main/src/main/assets/proxmark3.zip
index 31fc32cd..bd4fee51 100644
Binary files a/app_main/src/main/assets/proxmark3.zip and b/app_main/src/main/assets/proxmark3.zip differ
diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3NewTerminalInitActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3NewTerminalInitActivity.java
index adcf4048..cb03170f 100644
--- a/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3NewTerminalInitActivity.java
+++ b/app_main/src/main/java/cn/rrg/rdv/activities/proxmark3/rdv4_rrg/Proxmark3NewTerminalInitActivity.java
@@ -80,10 +80,12 @@ public class Proxmark3NewTerminalInitActivity extends BaseActivity {
box.setChecked(Commons.getAutoGoToTerminal());
// Must have init pm3 client and check auto go and have the terminal type selected!
- if (Commons.getAutoGoToTerminal()
- && Commons.isPM3ClientDecompressed()
- && Commons.getTerminalType() != -1) {
- go();
+ if (Commons.getAutoGoToTerminal() && Commons.getTerminalType() != -1) {
+ if (Proxmark3Installer.isCanInstall(activity)) {
+ Proxmark3Installer.installIfNeed(activity, this::go);
+ } else {
+ go();
+ }
}
}
diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/tools/DumpEqualActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/tools/DumpEqualActivity.java
deleted file mode 100644
index 661c5e64..00000000
--- a/app_main/src/main/java/cn/rrg/rdv/activities/tools/DumpEqualActivity.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package cn.rrg.rdv.activities.tools;
-
-import android.content.Intent;
-import android.os.Bundle;
-import androidx.annotation.Nullable;
-import android.view.View;
-import android.widget.ListView;
-import android.widget.RadioGroup;
-import android.widget.TextView;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import cn.dxl.common.widget.FilesSelectorDialog;
-import cn.rrg.rdv.R;
-import cn.rrg.rdv.activities.main.BaseActivity;
-import cn.rrg.rdv.adapter.DumpEqualAdapter;
-import cn.rrg.rdv.javabean.M1Bean;
-import cn.rrg.rdv.presenter.FileReadLinePresenter;
-import cn.rrg.rdv.view.FileReadLineView;
-import cn.rrg.rdv.util.Commons;
-import cn.rrg.rdv.util.LineEqualUtil;
-import cn.rrg.rdv.util.Paths;
-import cn.dxl.common.util.ArrayUtils;
-import cn.dxl.common.widget.ToastUtil;
-
-public class DumpEqualActivity extends BaseActivity implements FileReadLineView {
-
- private RadioGroup radioGroupPathSelect = null;
- private TextView txtSelectData1 = null;
- private TextView txtSelectData2 = null;
- private TextView txtShowEqualMsg = null;
- private DumpEqualAdapter adapter = null;
- private ArrayList mData1 = new ArrayList<>();
- private ArrayList mData2 = new ArrayList<>();
- private FilesSelectorDialog mSelector = null;
- private int fileId = 1;
- private FileReadLinePresenter presenter = null;
- //初始化给两个必须要的参数!
- private boolean[] states = {false, false};
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- setContentView(R.layout.act_dump_equal);
- super.onCreate(savedInstanceState);
-
- presenter = new FileReadLinePresenter();
- presenter.attachView(this);
-
- //初始化视图
- initViews();
- //初始化动作!
- initActions();
-
- //看看能否取得传递过来的数据!
- Intent intent = getIntent();
- //取出数据进行转换!
- ArrayList dataList = (ArrayList) intent.getSerializableExtra("dataList");
- //进行判断!
- if (dataList != null) {
- //取出数据名字!
- String name = intent.getStringExtra("dataName");
- if (name != null) {
- txtSelectData1.setText(name);
- } else {
- txtSelectData1.setText(R.string.data_name_dafault);
- }
- ArrayList data = new ArrayList<>(128);
- //进行拼接!
- for (M1Bean bean : dataList) {
- //进行拼接!
- data.addAll(Arrays.asList(bean.getDatas()));
- }
- //设置ID
- fileId = 1;
- onReadFinish(ArrayUtils.list2Arr(data));
- }
- }
-
- private void initViews() {
- radioGroupPathSelect = findViewById(R.id.rdoGroupDataPath);
- txtSelectData1 = findViewById(R.id.txtDumpEqualData1);
- txtSelectData2 = findViewById(R.id.txtDumpEqualData2);
- txtShowEqualMsg = findViewById(R.id.txtShowEqualMsg);
- ListView lvShowEqualResult = findViewById(R.id.lvShowEqualResult);
- adapter = new DumpEqualAdapter(this, R.layout.dump_equal_result_item);
- lvShowEqualResult.setAdapter(adapter);
- mSelector = new FilesSelectorDialog.Builder(this).setPathOnLoad(Paths.DUMP_DIRECTORY).create();
- }
-
- private void initActions() {
- txtSelectData1.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String path = Commons.getCustomerPath(radioGroupPathSelect);
- mSelector.setPathOnLoad(path);
- mSelector.setOnSelectListener(new FilesSelectorDialog.OnSelectListener() {
- @Override
- public void selected(File file) {
- fileId = 1;
- txtSelectData1.setText(file.getName());
- presenter.load(file);
- }
- });
- mSelector.show();
- }
- });
- txtSelectData2.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- String path = Commons.getCustomerPath(radioGroupPathSelect);
- mSelector.setPathOnLoad(path);
- mSelector.setOnSelectListener(new FilesSelectorDialog.OnSelectListener() {
- @Override
- public void selected(File file) {
- fileId = 2;
- txtSelectData2.setText(file.getName());
- presenter.load(file);
- }
- });
- mSelector.show();
- }
- });
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- }
-
- @Override
- protected void onDestroy() {
- presenter.detachView();
- //清除数据,帮助回收!
- mData1.clear();
- mData2.clear();
- adapter.clear();
- super.onDestroy();
- }
-
- @Override
- public void onReadFinish(String[] line) {
- //加载成功了,需要进行判断当前是哪个文件加载出来的!
- switch (fileId) {
- //进行处理!
- case 1:
- //第一个数据!
- mData1.clear();
- mData1.addAll(Arrays.asList(line));
- states[0] = true;
- break;
-
- case 2:
- //第二个数据!
- mData2.clear();
- mData2.addAll(Arrays.asList(line));
- states[1] = true;
- break;
- default:
- break;
- }
- //进行判断,如果两个数据皆正常,则直接开始计算判断!
- boolean canStart = true;
- for (boolean state : states) {
- if (!state) {
- canStart = false;
- break;
- }
- }
- if (canStart) {
- //已经可以进行对比!
- LineEqualUtil leu = new LineEqualUtil();
- leu.putData(ArrayUtils.list2Arr(mData1), ArrayUtils.list2Arr(mData2));
- String[] result = leu.finalResult();
- int blockDiffCount = leu.getBlockDiffCount();
- int allDiffCount = leu.getAllDiffCount();
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- String msg = getString(R.string.data_block_diff_count) + blockDiffCount + getString(R.string.data_char_diff_count) + allDiffCount;
- txtShowEqualMsg.setText(msg);
- //显示一些必要的弹窗
- if (blockDiffCount == 0 && allDiffCount == 0) {
- showToast(getString(R.string.data_identical));
- }
- //必须先清除之前的数据
- adapter.clear();
- adapter.addAll(result);
- adapter.notifyDataSetChanged();
- }
- });
- }
- }
-
- @Override
- public void onReadFail(String msg) {
- showToast(msg);
- }
-
- @Override
- public void showToast(String msg) {
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- ToastUtil.show(DumpEqualActivity.this, msg, false);
- }
- });
- }
-
- @Override
- public void showDialog(String title, String msg) {
-
- }
-
- @Override
- public void hideDialog() {
-
- }
-}
diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/tools/FormatCovertActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/tools/FormatCovertActivity.java
deleted file mode 100644
index 5436768e..00000000
--- a/app_main/src/main/java/cn/rrg/rdv/activities/tools/FormatCovertActivity.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package cn.rrg.rdv.activities.tools;
-
-import android.app.AlertDialog;
-import android.os.Bundle;
-import androidx.annotation.Nullable;
-import androidx.appcompat.widget.Toolbar;
-import android.view.View;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.RadioGroup;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import cn.dxl.common.widget.FilesSelectorDialog;
-import cn.rrg.rdv.R;
-
-import java.io.File;
-
-import cn.rrg.rdv.activities.main.BaseActivity;
-import cn.rrg.rdv.presenter.FormatConvertPresenter;
-import cn.rrg.rdv.view.FormatConvertView;
-import cn.rrg.rdv.util.Commons;
-import cn.rrg.rdv.util.Paths;
-import cn.dxl.common.util.StringUtil;
-
-public class FormatCovertActivity extends BaseActivity implements FormatConvertView {
-
- private int mType = 0;
- //中介者对象持有
- private FormatConvertPresenter presenter = null;
- //文件选择器对象
- private FilesSelectorDialog mSelector = null;
-
- private RadioGroup radioGroupPathSelect = null;
-
- private Button btnSelectFromQQ = null;
- private Button btnSelectFromWecat = null;
- private Button btnSelectFromSdcard = null;
- private Button btnSelectFromThiz = null;
- private Button btnSelectFromMCT = null;
- private Button btnSelectFromMTools = null;
- private Button btnCovert2Bin = null;
- private Button btnCovert2Txt = null;
-
- private TextView txtSelectFormAnywhere = null;
- private TextView txtShowFormatDiffrences = null;
-
- private EditText edtInputSaveName = null;
-
- private String mSourceFilePath = null;
- private String mSaveFileName = null;
- private String mSavePath = null;
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- setContentView(R.layout.act_format_convert);
- super.onCreate(savedInstanceState);
-
- //初始化中介者对象
- presenter = new FormatConvertPresenter();
- //绑定视图
- presenter.attachView(this);
-
- //初始化视图
- initViews();
- //初始化文件选择器
- initSelector();
- //初始化动作!
- initActions();
- }
-
- private void initViews() {
- radioGroupPathSelect = findViewById(R.id.rdoGroupDataPath);
-
- btnSelectFromQQ = findViewById(R.id.btnDumpSelectFromQQ);
- btnSelectFromSdcard = findViewById(R.id.btnDumpSelectFromSdcard);
- btnSelectFromWecat = findViewById(R.id.btnDumpSelectFromWecat);
- btnSelectFromThiz = findViewById(R.id.btnDumpSelectFromThis);
- btnSelectFromMCT = findViewById(R.id.btnDumpSelectFromMCT);
- btnSelectFromMTools = findViewById(R.id.btnDumpSelectFromMTools);
- btnCovert2Bin = findViewById(R.id.btnConvert2Bin);
- btnCovert2Txt = findViewById(R.id.btnConvert2Txt);
-
- TextView txtSaveToAnywhere = findViewById(R.id.txtSaveToAnywhere);
- txtSelectFormAnywhere = findViewById(R.id.txtSelectFormAnywhere);
- txtShowFormatDiffrences = findViewById(R.id.txtShowFormatDiffences);
-
- edtInputSaveName = findViewById(R.id.edtInputFileName);
-
- Toolbar mToolbar = findViewById(R.id.toolbar_act_format_convert);
- mToolbar.setTitle(R.string.title_format_convert);
- setSupportActionBar(mToolbar);
- }
-
- private void initActions() {
- btnSelectFromThiz.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.DUMP_DIRECTORY);
- initSourceFileSelector();
- }
- });
- btnSelectFromSdcard.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.EXTERNAL_STORAGE_DIRECTORY);
- initSourceFileSelector();
- }
- });
- btnSelectFromQQ.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.QQ_DIRECTORY);
- initSourceFileSelector();
- }
- });
- btnSelectFromWecat.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.WECAT_DIRECTORY);
- initSourceFileSelector();
- }
- });
- btnSelectFromMCT.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.MCT_DUMP_DIRECTORY);
- initSourceFileSelector();
- }
- });
- btnSelectFromMTools.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- mSelector.setPathOnLoad(Paths.MTools_PATH);
- initSourceFileSelector();
- }
- });
- btnCovert2Bin.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- checkSavePath();
- if (mSourceFilePath == null) {
- showToast(getString(R.string.tisp_select_convert_target));
- return;
- }
- if (mSaveFileName == null || mSavePath == null) {
- showToast(getString(R.string.tisp_select_convert_save_path));
- return;
- }
- mType = 0;
- presenter.convert2Bin(mSourceFilePath);
- }
- });
- btnCovert2Txt.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- checkSavePath();
- if (mSourceFilePath == null) {
- showToast(getString(R.string.tisp_select_convert_target));
- return;
- }
- if (mSaveFileName == null || mSavePath == null) {
- showToast(getString(R.string.tisp_select_convert_save_path));
- return;
- }
- mType = 1;
- presenter.convert2Txt(mSourceFilePath);
- }
- });
-
- txtShowFormatDiffrences.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- new AlertDialog.Builder(FormatCovertActivity.this).setTitle("Format distinction")
- .setMessage("1.Binary file is a general tag data format, which is the same as\". dump\", and compatible with most software.\n2.The tag data format in text format. is easy to view and can also be used in standard MCT programs.").show();
- }
- });
- }
-
- private void initSelector() {
- FilesSelectorDialog.Builder builder = new FilesSelectorDialog.Builder(this);
- builder.setTitle(R.string.title_file_select)
- .setCancelable(false)
- .setCanMultiple(false)
- .setPathOnLoad(Paths.DUMP_DIRECTORY);
- mSelector = builder.create();
- }
-
- private void checkSavePath() {
- String path = Commons.getCustomerPath(radioGroupPathSelect);
- String name = edtInputSaveName.getText().toString();
- if (!StringUtil.isEmpty(name)) {
- //非空文件名。检查是否有/字符,有则为非法!
- if (name.contains("/")) {
- return;
- }
- //进行最终的拼接!
- mSavePath = path;
- mSaveFileName = name;
- } else {
- // FIXME: 2019/5/31 修复空指针闪退!
- if (mSourceFilePath != null) {
- File file = new File(mSourceFilePath);
- mSavePath = file.getParent();
- mSaveFileName = file.getName();
- }
- }
- }
-
- private void initSourceFileSelector() {
- mSelector.setCanGetPath(false);
- mSelector.setOnSelectListener(new FilesSelectorDialog.OnSelectListener() {
- @Override
- public void selected(File file) {
- mSourceFilePath = file.getAbsolutePath();
- txtSelectFormAnywhere.setText((getString(R.string.res) + file.getName()));
- showToast(getString(R.string.success));
- }
- });
- mSelector.show();
- }
-
- @Override
- protected void onDestroy() {
- //销毁视图绑定!
- presenter.detachView();
- super.onDestroy();
- }
-
- @Override
- public void onConvertSucess(byte[] result) {
- //判断结果有效性!
- if (result == null) {
- showToast(getString(R.string.tips_convert_result_null));
- return;
- }
- if (mSavePath == null) {
- showToast(getString(R.string.tips_convert_save_path_null));
- return;
- }
- if (mSaveFileName == null) {
- showToast(getString(R.string.tips_convert_save_name_null));
- return;
- }
- switch (mType) {
- case 0:
- presenter.save2BIN(result, mSavePath, mSaveFileName);
- break;
- case 1:
- presenter.save2TXT(result, mSavePath, mSaveFileName);
- break;
- default:
- break;
- }
- }
-
- @Override
- public void onConvertFail(String errorMsg) {
- showToast(errorMsg);
- }
-
- @Override
- public void onSaveSuccess() {
- showToast(getString(R.string.success));
- }
-
- @Override
- public void onSaveFail(String msg) {
- if (msg != null)
- runOnUiThread(() -> {
- showToast(msg);
- });
- }
-
- @Override
- public void showToast(String msg) {
- runOnUiThread(() -> {
- Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
- });
- }
-
- @Override
- public void showDialog(String title, String msg) {
- }
-
- @Override
- public void hideDialog() {
- }
-}
\ No newline at end of file
diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/tools/Proxmark3FirmwareActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/tools/Proxmark3FirmwareActivity.java
index 1b854fa8..3c75b320 100644
--- a/app_main/src/main/java/cn/rrg/rdv/activities/tools/Proxmark3FirmwareActivity.java
+++ b/app_main/src/main/java/cn/rrg/rdv/activities/tools/Proxmark3FirmwareActivity.java
@@ -90,9 +90,7 @@ public class Proxmark3FirmwareActivity extends BaseActivity implements DevCallba
proDialog1 = new ProDialog1(context);
- if (!Commons.isElfDecompressed()) {
- Proxmark3Installer.installIfNeed(this, null);
- }
+ Proxmark3Installer.installIfNeed(this, null);
initViews();
initActions();
diff --git a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/ToolsAccessFragment.java b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/ToolsAccessFragment.java
index a9ad6234..cdbaa975 100644
--- a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/ToolsAccessFragment.java
+++ b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/ToolsAccessFragment.java
@@ -12,13 +12,9 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import com.proxgrind.pm3flasher.Proxmark3Flasher;
-
import cn.rrg.rdv.R;
-import cn.rrg.rdv.activities.tools.DumpEqualActivity;
import cn.rrg.rdv.activities.tools.DumpListActivity;
import cn.rrg.rdv.activities.tools.FileListActivity;
-import cn.rrg.rdv.activities.tools.FormatCovertActivity;
import cn.rrg.rdv.activities.tools.KeyFileListActivity;
import cn.rrg.rdv.activities.tools.Proxmark3FirmwareActivity;
import cn.rrg.rdv.fragment.base.BaseFragment;
@@ -28,8 +24,6 @@ public class ToolsAccessFragment
private Button btnDataEditor = null;
private Button btnKeyEditor = null;
- private Button btnFormatCovert = null;
- private Button btnDiffTools = null;
private Button btnPM3Flasher;
@Nullable
@@ -49,8 +43,6 @@ public class ToolsAccessFragment
private void initViews(View view) {
btnDataEditor = view.findViewById(R.id.btnDumpEditor);
btnKeyEditor = view.findViewById(R.id.btnKeyEditor);
- btnFormatCovert = view.findViewById(R.id.btnConvertFormat);
- btnDiffTools = view.findViewById(R.id.btnDiffTool);
btnPM3Flasher = view.findViewById(R.id.btnPM3Flasher);
}
@@ -59,10 +51,6 @@ public class ToolsAccessFragment
startActivity(new Intent(context, DumpListActivity.class).putExtra("mode", DumpListActivity.MODE.EDIT));
});
- btnDiffTools.setOnClickListener(v -> startActivity(new Intent(context, DumpEqualActivity.class)));
-
- btnFormatCovert.setOnClickListener(v -> startActivity(new Intent(context, FormatCovertActivity.class)));
-
btnKeyEditor.setOnClickListener(v -> startActivity(
new Intent(context, KeyFileListActivity.class).putExtra("mode", FileListActivity.MODE.EDIT))
);
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 42d76239..2c0fb5c3 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
@@ -20,16 +20,15 @@ public class InitUtil {
public static final String LOG_TAG = InitUtil.class.getSimpleName();
public static void initApplicationResource(Context context) {
- AssetsUtil au = new AssetsUtil(context);
File dump_dir = new File(Paths.DUMP_DIRECTORY);
if (!dump_dir.exists()) {
if (!dump_dir.mkdirs()) {
Log.d(LOG_TAG, "init dumps dir fail!");
} else {
- initDumpFile(au);
+ initDumpFile(context);
}
} else {
- initDumpFile(au);
+ initDumpFile(context);
}
File driver_dir = new File(Paths.DRIVER_DIRECTORY);
if (!driver_dir.exists()) {
@@ -42,20 +41,20 @@ public class InitUtil {
if (!keys_dir.mkdirs()) {
Log.d(LOG_TAG, "init keys dir fail!");
} else {
- initKeysFile(au);
+ initKeysFile(context);
}
} else {
- initKeysFile(au);
+ initKeysFile(context);
}
File common_dir = new File(Paths.COMMON_DIRECTORY);
if (!common_dir.exists()) {
if (common_dir.mkdirs()) {
initCommonInFile();
- initMfInfoMapsFile(au);
+ initMfInfoMapsFile(context);
}
} else {
initCommonInFile();
- initMfInfoMapsFile(au);
+ initMfInfoMapsFile(context);
}
File pn53x_dir = new File(Paths.PN53X_DIRRECTORY);
if (!pn53x_dir.exists()) {
@@ -71,11 +70,11 @@ public class InitUtil {
if (!pm3_dir.mkdirs()) {
Log.d(LOG_TAG, "init pm3 dir fail!");
} else {
- initEasyButtonFile(au);
+ initEasyButtonFile(context);
initPM3ForwardFile();
}
} else {
- initEasyButtonFile(au);
+ initEasyButtonFile(context);
initPM3ForwardFile();
}
Commons.updatePM3Cwd();
@@ -95,45 +94,45 @@ public class InitUtil {
}
}
- private static void initMfInfoMapsFile(AssetsUtil au) {
+ private static void initMfInfoMapsFile(Context context) {
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文件到指定目录!
- au.copyFile("template_mifare_info_en.html",
+ AssetsUtil.copyFile(context, "template_mifare_info_en.html",
new File(Paths.COMMON_DIRECTORY + "/" + "template_mifare_info_en.html").getAbsolutePath());
- au.copyFile("template_tag_info_en.html",
+ AssetsUtil.copyFile(context, "template_tag_info_en.html",
new File(Paths.COMMON_DIRECTORY + "/" + "template_tag_info_en.html").getAbsolutePath());
}
- private static void initDumpFile(AssetsUtil au) {
+ private static void initDumpFile(Context context) {
File target = new File(Paths.DEFAULT_DUMP_FILE);
//目标文件夹里是否有这个文件!
if (!(target.exists() && target.isFile())) {
//包里面是否有这个资源文件!
- if (au.copyFile(Paths.DEFAULT_DUMP_NAME, Paths.DEFAULT_DUMP_FILE)) {
+ if (AssetsUtil.copyFile(context, Paths.DEFAULT_DUMP_NAME, Paths.DEFAULT_DUMP_FILE)) {
Log.d(LOG_TAG, "创建默认的空白数据文件成功!");
}
}
}
- private static void initKeysFile(AssetsUtil au) {
+ private static void initKeysFile(Context context) {
File target = new File(Paths.DEFAULT_KEYS_FILE);
//目标文件夹里是否有这个文件!
if (!(target.exists() && target.isFile())) {
//包里面是否有这个资源文件!
- if (au.copyFile(Paths.DEFAULT_KEYS_NAME, Paths.DEFAULT_KEYS_FILE)) {
+ if (AssetsUtil.copyFile(context, Paths.DEFAULT_KEYS_NAME, Paths.DEFAULT_KEYS_FILE)) {
Log.d(LOG_TAG, "创建默认的空白数据文件成功!");
}
}
}
- private static void initEasyButtonFile(AssetsUtil au) {
+ private static void initEasyButtonFile(Context context) {
File target = new File(Paths.PM3_CMD_FILE);
//目标文件夹里是否有这个文件!
if (!(target.exists() && target.isFile())) {
//包里面是否有这个资源文件!
- if (au.copyFile(Paths.DEFAULT_CMD_NAME, Paths.PM3_CMD_FILE)) {
+ if (AssetsUtil.copyFile(context, Paths.DEFAULT_CMD_NAME, Paths.PM3_CMD_FILE)) {
Log.d(LOG_TAG, "创建默认的动态按钮文件成功!");
}
}
diff --git a/app_main/src/main/java/cn/rrg/rdv/util/Proxmark3Installer.java b/app_main/src/main/java/cn/rrg/rdv/util/Proxmark3Installer.java
index 0290921c..9b74b055 100644
--- a/app_main/src/main/java/cn/rrg/rdv/util/Proxmark3Installer.java
+++ b/app_main/src/main/java/cn/rrg/rdv/util/Proxmark3Installer.java
@@ -3,15 +3,45 @@ package cn.rrg.rdv.util;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
+import android.content.Context;
import com.termux.app.TermuxService;
import java.io.File;
import cn.dxl.common.util.AssetsUtil;
+import cn.dxl.common.util.FileUtils;
+import cn.dxl.common.util.LogUtils;
import cn.rrg.rdv.R;
public class Proxmark3Installer {
+ static String zipName = "proxmark3.zip";
+ static String verName = "pm3_version.txt";
+ static String zipFile = TermuxService.HOME_PATH + File.separator + zipName;
+ static String verFile = TermuxService.HOME_PATH + File.separator + verName;
+
+ public static boolean isCanInstall(Context context) {
+ try {
+ String version_assets = AssetsUtil.readLines(context, verName);
+
+ // read version for res installed
+ String version_installed = FileUtils.readLine(new File(verFile));
+ // check version
+ if (version_installed.length() == 0) {
+ // no file found or file have some problem, we need reinstall
+ return true;
+ }
+ if (version_installed.equals(version_assets)) {
+ // if version same, we can stop install
+ LogUtils.d("Proxmark3Installer->installIfNeed(): version same, we can stop install.");
+ return false;
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ return true;
+ }
/**
* Install the pm3 client and resource if need!
@@ -29,10 +59,23 @@ public class Proxmark3Installer {
new Thread(new Runnable() {
@Override
public void run() {
- String zipName = "proxmark3.zip";
- String zipFile = TermuxService.HOME_PATH + File.separator + zipName;
- new AssetsUtil(activity).copyFile(zipName, zipFile);
try {
+ if (!isCanInstall(activity)) {
+ if (whenDone != null) activity.runOnUiThread(whenDone);
+ progress.cancel();
+ return;
+ }
+
+ // before install, we need delete all old res
+ FileUtils.delete(new File(TermuxService.HOME_PATH));
+ // and recreate path
+ FileUtils.createPaths(new File(TermuxService.HOME_PATH));
+
+ // copy zip file from apk to local
+ AssetsUtil.copyFile(activity, zipName, zipFile);
+ AssetsUtil.copyFile(activity, verName, verFile);
+
+ // unzip to home path
ZipUtils.UnZipFolder(zipFile, TermuxService.HOME_PATH, new ZipUtils.Progress() {
@Override
public void onProgress(int max, int current, String file) {
@@ -45,37 +88,49 @@ public class Proxmark3Installer {
});
}
});
+
+ LogUtils.d("PM3 Resource install finish.");
+
} catch (Exception e) {
- activity.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- new AlertDialog.Builder(activity)
- .setTitle(R.string.error)
- .setMessage(e.getMessage())
- .show();
- activity.runOnUiThread(() -> {
- try {
- progress.dismiss();
- } catch (RuntimeException e) {
- // Activity already dismissed - ignore.
- }
- });
- if (whenDone != null)
- whenDone.run();
- }
- });
+ showDialogOnErr(activity, progress, e.getMessage(), whenDone);
e.printStackTrace();
}
+ showDialogOnOk(activity, progress);
+ if (whenDone != null) activity.runOnUiThread(whenDone);
+ }
+ }).start();
+ }
+
+ // show dialog if task execute success
+ public static void showDialogOnOk(Activity activity, ProgressDialog dialog) {
+ activity.runOnUiThread(() -> {
+ try {
+ dialog.dismiss();
+ } catch (RuntimeException e) {
+ // Activity already dismissed - ignore.
+ }
+ });
+ }
+
+ // show dialog if has err
+ public static void showDialogOnErr(Activity activity, ProgressDialog dialog, String errMsg, Runnable call) {
+ activity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ new AlertDialog.Builder(activity)
+ .setTitle(R.string.error)
+ .setMessage(errMsg)
+ .show();
activity.runOnUiThread(() -> {
try {
- progress.dismiss();
+ dialog.dismiss();
} catch (RuntimeException e) {
// Activity already dismissed - ignore.
}
});
- if (whenDone != null)
- activity.runOnUiThread(whenDone);
+ if (call != null)
+ call.run();
}
- }).start();
+ });
}
}
diff --git a/app_main/src/main/java/cn/rrg/rdv/util/ZipUtils.java b/app_main/src/main/java/cn/rrg/rdv/util/ZipUtils.java
index c6c67ede..3b48ffef 100644
--- a/app_main/src/main/java/cn/rrg/rdv/util/ZipUtils.java
+++ b/app_main/src/main/java/cn/rrg/rdv/util/ZipUtils.java
@@ -1,12 +1,13 @@
package cn.rrg.rdv.util;
-import android.util.Log;
-
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
@@ -14,6 +15,8 @@ import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
+import cn.dxl.common.util.LogUtils;
+
/**
* @author: lijuan
* @description: 解压ZIP文件
@@ -225,4 +228,32 @@ public class ZipUtils {
inZip.close();
return fileList;
}
+
+ /**
+ * @author dxl
+ * read a file from zip file(no unzip)
+ */
+ public static String readZipFile(File zipFile, String readFileName) throws Exception {
+ ZipFile zf = new ZipFile(zipFile);
+ InputStream in = new BufferedInputStream(new FileInputStream(zipFile));
+ ZipInputStream zin = new ZipInputStream(in);
+ ZipEntry ze;
+ StringBuilder sb = new StringBuilder();
+ String line;
+ while ((ze = zin.getNextEntry()) != null) {
+ LogUtils.d("项目名: " + ze.getName());
+ if (!ze.isDirectory()) {
+ if (ze.getName().contains(readFileName)) {
+ BufferedReader br = new BufferedReader(new InputStreamReader(zf.getInputStream(ze)));
+ while ((line = br.readLine()) != null) {
+ sb.append(line);
+ }
+ br.close();
+ }
+ }
+ }
+ zin.closeEntry();
+ in.close();
+ return sb.toString();
+ }
}
diff --git a/app_main/src/main/res/layout/act_common_tools.xml b/app_main/src/main/res/layout/act_common_tools.xml
index 811cebed..26ea819e 100644
--- a/app_main/src/main/res/layout/act_common_tools.xml
+++ b/app_main/src/main/res/layout/act_common_tools.xml
@@ -63,52 +63,6 @@
android:text="@string/title_pm3_firmware_flasher"
android:textAllCaps="false" />
-
-
-
-
-
-
diff --git a/app_main/src/main/res/layout/act_dump_equal.xml b/app_main/src/main/res/layout/act_dump_equal.xml
deleted file mode 100644
index 9d04bfac..00000000
--- a/app_main/src/main/res/layout/act_dump_equal.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app_main/src/main/res/layout/act_format_convert.xml b/app_main/src/main/res/layout/act_format_convert.xml
deleted file mode 100644
index 66d8e301..00000000
--- a/app_main/src/main/res/layout/act_format_convert.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app_main/src/main/res/values-en/strings.xml b/app_main/src/main/res/values-en/strings.xml
index 37816397..f9cea0e7 100644
--- a/app_main/src/main/res/values-en/strings.xml
+++ b/app_main/src/main/res/values-en/strings.xml
@@ -330,5 +330,6 @@
请稍等
select
Proxmark3 External Work Directory
+ The version for proxmark3 resource read failed.
\ No newline at end of file
diff --git a/app_main/src/main/res/values-zh/strings.xml b/app_main/src/main/res/values-zh/strings.xml
index c5fa6597..2258b991 100644
--- a/app_main/src/main/res/values-zh/strings.xml
+++ b/app_main/src/main/res/values-zh/strings.xml
@@ -336,5 +336,6 @@
请稍等。
选择
Proxmark3 外部工作目录
+ 读取PM3的资源版本失败
\ No newline at end of file
diff --git a/app_main/src/main/res/values/strings.xml b/app_main/src/main/res/values/strings.xml
index 9335ef84..57050480 100644
--- a/app_main/src/main/res/values/strings.xml
+++ b/app_main/src/main/res/values/strings.xml
@@ -329,5 +329,6 @@
Please wait.
select
Proxmark3 External Work Directory
+ The version for proxmark3 resource read failed.
\ No newline at end of file
diff --git a/chameleon/build.gradle b/chameleon/build.gradle
index 6b0d5224..b252785c 100644
--- a/chameleon/build.gradle
+++ b/chameleon/build.gradle
@@ -21,12 +21,13 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
- implementation 'com.github.xianglin1998:mfkey:1.1'
- implementation 'com.github.xianglin1998:nfctag:1.0'
+
implementation 'com.github.felHR85:UsbSerial:6.1.0'
- implementation 'com.github.xianglin1998:ComBridge:1.0.7'
- // implementation project(path: ':iobridges')
+ implementation project(path: ':iobridges')
+ implementation project(path: ':mfkey')
+ implementation project(path: ':nfctag')
+ implementation project(path: ':iobridges')
implementation project(path: ':utils')
implementation project(path: ':communication')
diff --git a/communication/build.gradle b/communication/build.gradle
index 2deecff1..f0115f0f 100644
--- a/communication/build.gradle
+++ b/communication/build.gradle
@@ -25,6 +25,5 @@ dependencies {
implementation 'com.github.felHR85:UsbSerial:6.1.0'
implementation 'androidx.annotation:annotation:1.1.0'
- implementation 'com.github.xianglin1998:ComBridge:1.0.7'
- // implementation project(path: ':iobridges')
+ implementation project(path: ':iobridges')
}
diff --git a/libnfc_pn53x/build.gradle b/libnfc_pn53x/build.gradle
index ad232a3b..9b33b6e5 100644
--- a/libnfc_pn53x/build.gradle
+++ b/libnfc_pn53x/build.gradle
@@ -36,11 +36,10 @@ android {
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(path: ':iobridges')
+ implementation project(path: ':nfctag')
+ implementation project(path: ':console')
implementation project(path: ':communication')
implementation 'androidx.appcompat:appcompat:1.1.0'
diff --git a/pm3flasher/build.gradle b/pm3flasher/build.gradle
index 70da35d8..0c2f35b8 100644
--- a/pm3flasher/build.gradle
+++ b/pm3flasher/build.gradle
@@ -41,7 +41,5 @@ android {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':communication')
-
- implementation 'com.github.xianglin1998:ComBridge:1.0.7'
- // implementation project(path: ':iobridges')
+ implementation project(path: ':iobridges')
}
diff --git a/pm3rdv4rrg/build.gradle b/pm3rdv4rrg/build.gradle
index 5f310132..0d448b75 100644
--- a/pm3rdv4rrg/build.gradle
+++ b/pm3rdv4rrg/build.gradle
@@ -28,6 +28,12 @@ android {
}
}
+// sourceSets {
+// main {
+// jniLibs.srcDirs = ['jniLibs']
+// }
+// }
+
buildTypes {
release {
minifyEnabled false
@@ -38,11 +44,10 @@ android {
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(path: ':iobridges')
+ implementation project(path: ':nfctag')
+ implementation project(path: ':console')
implementation project(':communication')
implementation project(path: ':utils')
diff --git a/settings.gradle b/settings.gradle
index 6984df2c..1e5b7277 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,3 +1,4 @@
include ':app_main', ':chameleon', ':communication', ':libnfc_pn53x'
-include ':pm3flasher', ':pm3rdv4rrg',':utils'
-include ':termux-app', ':terminal-emulator', ':terminal-view'
\ No newline at end of file
+include ':pm3flasher', ':pm3rdv4rrg', ':utils'
+include ':termux-app', ':terminal-emulator', ':terminal-view'
+include ':console', ':crapto1', ':iobridges', ':redirector', ':mfkey', ':nfctag'
\ No newline at end of file
diff --git a/termux-app/src/main/java/com/termux/app/TermuxActivity.java b/termux-app/src/main/java/com/termux/app/TermuxActivity.java
index ed525dd6..6b3776c2 100644
--- a/termux-app/src/main/java/com/termux/app/TermuxActivity.java
+++ b/termux-app/src/main/java/com/termux/app/TermuxActivity.java
@@ -165,8 +165,8 @@ public final class TermuxActivity extends Activity implements ServiceConnection
void checkForFontAndColors() {
try {
- @SuppressLint("SdCardPath") File fontFile = new File("/data/data/" + TermuxService.packageName + "/files/home/.termux/font.ttf");
- @SuppressLint("SdCardPath") File colorsFile = new File("/data/data/" + TermuxService.packageName + "/files/home/.termux/colors.properties");
+ @SuppressLint("SdCardPath") File fontFile = new File("/data/data/" + TermuxService.PACKAGE_NAME + "/files/home/.termux/font.ttf");
+ @SuppressLint("SdCardPath") File colorsFile = new File("/data/data/" + TermuxService.PACKAGE_NAME + "/files/home/.termux/colors.properties");
final Properties props = new Properties();
if (colorsFile.isFile()) {
@@ -630,19 +630,22 @@ public final class TermuxActivity extends Activity implements ServiceConnection
return null;
}
- public static String getPM3ClientPath() {
- String file = TermuxService.HOME_PATH +
+ /**
+ * Get pm3 client file path
+ * old path is on app internal file path
+ * now we are use jnilib path
+ */
+ public String getPM3ClientPath() {
+ return getNativePath() +
File.separator +
- "proxmark3" +
- File.separator +
- "proxmark3_" +
- getABISupported(true);
- try {
- Os.chmod(file, 0700);
- } catch (ErrnoException e) {
- e.printStackTrace();
- }
- return file;
+ "libpm3rrg_cmd.so";
+ }
+
+ public String getNativePath() {
+ String ss = getApplicationInfo().nativeLibraryDir;
+ if (ss == null)
+ ss = getFilesDir().getPath() + "/lib";
+ return ss;
}
void addNewSession(boolean failSafe, String sessionName) {
diff --git a/termux-app/src/main/java/com/termux/app/TermuxService.java b/termux-app/src/main/java/com/termux/app/TermuxService.java
index b8ec27a3..8fbed3e7 100644
--- a/termux-app/src/main/java/com/termux/app/TermuxService.java
+++ b/termux-app/src/main/java/com/termux/app/TermuxService.java
@@ -47,31 +47,31 @@ public final class TermuxService extends Service implements SessionChangedCallba
private static final String NOTIFICATION_CHANNEL_ID = "termux_notification_channel";
// My main app package name.(important)
- public static final String packageName = "com.rfidresearchgroup.rfidtools";
+ public static final String PACKAGE_NAME = "com.rfidresearchgroup.rfidtools";
/**
* Note that this is a symlink on the Android M preview.
*/
@SuppressLint("SdCardPath")
- public static final String FILES_PATH = "/data/data/" + packageName + "/files";
+ public static final String FILES_PATH = "/data/data/" + PACKAGE_NAME + "/files";
public static final String PREFIX_PATH = FILES_PATH + "/usr";
public static final String HOME_PATH = FILES_PATH + "/home";
public static String PM3_CWD = null;
private static final int NOTIFICATION_ID = 1337;
- public static final String ACTION_STOP_SERVICE = packageName + ".service_stop";
- public static final String ACTION_LOCK_WAKE = packageName + ".service_wake_lock";
- public static final String ACTION_UNLOCK_WAKE = packageName + ".service_wake_unlock";
+ public static final String ACTION_STOP_SERVICE = PACKAGE_NAME + ".service_stop";
+ public static final String ACTION_LOCK_WAKE = PACKAGE_NAME + ".service_wake_lock";
+ public static final String ACTION_UNLOCK_WAKE = PACKAGE_NAME + ".service_wake_unlock";
/**
* Intent action to launch a new terminal session. Executed from TermuxWidgetProvider.
*/
- public static final String ACTION_EXECUTE = packageName + ".service_execute";
+ public static final String ACTION_EXECUTE = PACKAGE_NAME + ".service_execute";
- public static final String EXTRA_ARGUMENTS = packageName + ".execute.arguments";
+ public static final String EXTRA_ARGUMENTS = PACKAGE_NAME + ".execute.arguments";
- public static final String EXTRA_CURRENT_WORKING_DIRECTORY = packageName + ".execute.cwd";
- private static final String EXTRA_EXECUTE_IN_BACKGROUND = packageName + ".execute.background";
+ public static final String EXTRA_CURRENT_WORKING_DIRECTORY = PACKAGE_NAME + ".execute.cwd";
+ private static final String EXTRA_EXECUTE_IN_BACKGROUND = PACKAGE_NAME + ".execute.background";
/**
* This service is only bound from inside the same process and never uses IPC.
diff --git a/utils/src/main/java/cn/dxl/common/util/AssetsUtil.java b/utils/src/main/java/cn/dxl/common/util/AssetsUtil.java
index 9bd9fb91..e1b8dc92 100644
--- a/utils/src/main/java/cn/dxl/common/util/AssetsUtil.java
+++ b/utils/src/main/java/cn/dxl/common/util/AssetsUtil.java
@@ -3,25 +3,22 @@ package cn.dxl.common.util;
import android.content.Context;
import android.content.res.AssetManager;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
/*
* 针对Assets进行操作的类!
* */
public class AssetsUtil {
- private AssetManager manager;
-
- public AssetsUtil(Context context) {
- manager = context.getAssets();
- }
-
- // 得到 assets指定目录下的所有文件!
- public String[] getFiles(String root) {
+ public static String[] getFiles(Context context, String root) {
String[] files = new String[0];
+ AssetManager manager = context.getAssets();
try {
files = manager.list(root);
} catch (IOException e) {
@@ -31,13 +28,11 @@ public class AssetsUtil {
return files;
}
- // 复制 assets中的文件到指定目录
- public boolean copyFile(String asFile, String targetPath) {
+ public static boolean copyFile(Context context, String asFile, String targetPath) {
File file = new File(targetPath);
if (!FileUtils.createFile(file)) return false;
boolean ret = false;
- //移动默认key文件
- AssetManager am = manager;
+ AssetManager am = context.getAssets();
InputStream is = null;
try (FileOutputStream fos = new FileOutputStream(file)) {
byte[] buffer = new byte[1024 * 1024];
@@ -60,9 +55,10 @@ public class AssetsUtil {
return ret;
}
- public boolean isFile(String path) {
+ public static boolean isFile(Context context, String path) {
+ AssetManager am = context.getAssets();
try {
- IOUtils.close(manager.open(path));
+ IOUtils.close(am.open(path));
return true;
} catch (IOException e) {
// e.printStackTrace();
@@ -70,13 +66,13 @@ public class AssetsUtil {
return false;
}
- public void copyDirs(File sourcePath, File targetPath) {
+ public static void copyDirs(Context context, File sourcePath, File targetPath) {
// create target path!
final String rawPath = targetPath.getPath();
targetPath = new File(targetPath + File.separator + sourcePath.getPath());
FileUtils.createPaths(targetPath);
// list files!
- String[] files = getFiles(sourcePath.getPath());
+ String[] files = getFiles(context, sourcePath.getPath());
if (files == null) {
return;
}
@@ -84,11 +80,24 @@ public class AssetsUtil {
for (String fileStr : files) {
File file = new File(sourcePath + File.separator + fileStr);
// if is file, we need copy to target path!
- if (isFile(file.getPath())) {
- copyFile(file.getPath(), targetPath.getPath() + File.separator + file.getName());
+ if (isFile(context, file.getPath())) {
+ copyFile(context, file.getPath(), targetPath.getPath() + File.separator + file.getName());
} else {
- copyDirs(file, new File(rawPath));
+ copyDirs(context, file, new File(rawPath));
}
}
}
+
+ public static String readLines(Context context, String file) {
+ StringBuilder builder = new StringBuilder();
+ AssetManager am = context.getAssets();
+ try {
+ BufferedReader br = new BufferedReader(new InputStreamReader(am.open(file)));
+ String line;
+ while ((line = br.readLine()) != null) builder.append(line);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return builder.toString();
+ }
}
diff --git a/utils/src/main/java/cn/dxl/common/util/FileUtils.java b/utils/src/main/java/cn/dxl/common/util/FileUtils.java
index 84b65468..c0b8a00e 100644
--- a/utils/src/main/java/cn/dxl/common/util/FileUtils.java
+++ b/utils/src/main/java/cn/dxl/common/util/FileUtils.java
@@ -32,6 +32,7 @@ import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.text.DecimalFormat;
import java.util.ArrayList;
+import java.util.List;
import cn.dxl.common.R;
@@ -132,6 +133,20 @@ public class FileUtils {
return ArrayUtils.list2Arr(resultList);
}
+ // read all lines to a line
+ public static String readLine(File file) {
+ StringBuilder builder = new StringBuilder();
+ try {
+ String[] lines = readLines(file);
+ for (String line : lines) {
+ builder.append(line);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return builder.toString();
+ }
+
//按匹配的行读取文件
public static String[] readLines(File file, String regex) throws IOException {
String[] resultArray = readLines(file);