From 8fde82cffdc51416c99b0a835b8460270c39fd17 Mon Sep 17 00:00:00 2001 From: ThankVinci Date: Sat, 12 Jun 2021 20:25:11 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=AE=9E=E7=8E=B0=E4=BA=86=E6=A0=B9=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E4=B8=8B=E5=86=8D=E6=8C=89=E4=B8=80=E6=AC=A1=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E9=94=AE=E9=80=80=E5=87=BAAPP=202.=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E6=80=9D=E8=80=83=E5=AE=8C=E6=88=90=E8=A7=A3=E5=8E=8B=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=81=9A=E7=9A=84=E4=BA=8B=E6=83=85=20=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E6=96=87=E4=BB=B6,=E6=9C=89=E4=B8=AA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E7=9B=B4=E6=8E=A5=E6=A3=80=E6=B5=8Bmd5=E5=80=BC?= =?UTF-8?q?=E5=9C=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=AD=E6=9C=89=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=95=B0=E6=8D=AE,=E6=9C=89=E7=9A=84=E8=AF=9D?= =?UTF-8?q?=E5=A1=AB=E5=85=85=E5=AF=86=E7=A0=81=E6=A1=86,=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E6=A1=86=E5=8F=AF=E5=8B=BE=E9=80=89=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E6=98=8E=E6=96=87,=E8=BF=98=E6=9C=89=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=80=89=E9=A1=B9=E6=98=AF=E6=98=AF=E5=90=A6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=96=87=E4=BB=B6=E7=9A=84=E5=AF=86=E7=A0=81?= =?UTF-8?q?,=E6=9C=89=E5=AF=86=E7=A0=81=E6=8C=87=E5=AE=9A=E7=9B=AE?= =?UTF-8?q?=E7=9A=84=E8=B7=AF=E5=BE=84=E7=82=B9=E5=87=BB=E8=A7=A3=E5=8E=8B?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E5=B0=B1=E5=8F=AF=E4=BB=A5=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=A7=A3=E5=8E=8B=203.=E6=94=B9=E4=BA=86APP=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=204.=E6=B7=BB=E5=8A=A0=E4=BA=86=E4=B8=80=E4=B8=AA=E8=A7=A3?= =?UTF-8?q?=E5=8E=8B=E7=94=A8=E7=9A=84dialog,=E4=BD=86=E6=98=AF=E8=A6=81?= =?UTF-8?q?=E7=BB=99dialog=E4=BC=A0=E5=85=A5bundle=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=B8=8D=E7=9F=A5=E9=81=93=E4=BB=8E=E4=BD=95=E4=B8=8B=E6=89=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CloudKey/app/src/main/AndroidManifest.xml | 2 +- .../CloudKey/Files/FileAdapter.java | 25 +++-- .../thankvinci/CloudKey/Files/FileUtils.java | 33 ++++++ .../CloudKey/Fragment/FileManageFragment.java | 18 ++++ .../Fragment/UnzipDialogFragment.java | 48 +++++++++ .../com/thankvinci/CloudKey/MainActivity.java | 19 ++++ .../CloudKey/NetUtils/NetThread.java | 1 + .../CloudKey/Utils/FileHandler.java | 7 +- .../thankvinci/CloudKey/Utils/FileThread.java | 18 +++- .../thankvinci/CloudKey/Utils/MyUtils.java | 4 + .../src/main/res/drawable/text_be_clicked.xml | 5 + .../app/src/main/res/layout/unzip_dialog.xml | 102 ++++++++++++++++++ .../app/src/main/res/values-night/themes.xml | 15 +-- CloudKey/app/src/main/res/values/colors.xml | 1 + CloudKey/app/src/main/res/values/themes.xml | 15 +-- 开发历程.md | 14 ++- 16 files changed, 298 insertions(+), 29 deletions(-) create mode 100644 CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/UnzipDialogFragment.java create mode 100644 CloudKey/app/src/main/res/drawable/text_be_clicked.xml create mode 100644 CloudKey/app/src/main/res/layout/unzip_dialog.xml diff --git a/CloudKey/app/src/main/AndroidManifest.xml b/CloudKey/app/src/main/AndroidManifest.xml index 4ddee3b..20bf579 100644 --- a/CloudKey/app/src/main/AndroidManifest.xml +++ b/CloudKey/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:supportsRtl="true" android:usesCleartextTraffic="true" android:requestLegacyExternalStorage="true" - android:theme="@style/Theme.AppCompat.Light.DarkActionBar"> + android:theme="@style/Theme.CloudKey"> diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java index 777bc27..b2726c1 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java @@ -13,6 +13,7 @@ import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; import com.thankvinci.CloudKey.Fragment.FileManageFragment; +import com.thankvinci.CloudKey.Fragment.UnzipDialogFragment; import com.thankvinci.CloudKey.MainActivity; import com.thankvinci.CloudKey.R; import com.thankvinci.CloudKey.Utils.FileHandler; @@ -70,15 +71,27 @@ public class FileAdapter extends RecyclerView.Adapter { }else{ //Toast.makeText(v.getContext(),fitem.getName()+" "+fitem.isCompress(),Toast.LENGTH_SHORT).show(); if (fitem.isCompress()){ - FileHandler fileHandler = new FileHandler((MainActivity)v.getContext()); - Thread ft = new Thread(new FileThread(fileHandler,builder.toString(),null,0)); - ft.start(); - Toast.makeText(v.getContext(),"线程正在处理,请稍后",Toast.LENGTH_LONG).show(); + UnzipDialogFragment unzipDialog = new UnzipDialogFragment(); + unzipDialog.setListener(new UnzipDialogFragment.UnzipDialogListener() { + @Override + public void onDialogUnzipClicked() { + Toast.makeText(v.getContext(),"打开",Toast.LENGTH_SHORT).show(); + } + }); + Bundle data = new Bundle(); + data.putString("srcFile",builder.toString()); + data.putString("desPath",builder.toString().substring(0,builder.toString().lastIndexOf("."))); + unzipDialog.setArguments(data); + + unzipDialog.show(((MainActivity)v.getContext()).getSupportFragmentManager(),"unzip"); + //FileHandler fileHandler = new FileHandler((MainActivity)v.getContext()); + //Thread ft = new Thread(new FileThread(fileHandler,,,"12341234",FileThread.FUNCTION_DECOMPRESS)); + //ft.start(); + //Toast.makeText(v.getContext(),"线程正在处理,请稍后",Toast.LENGTH_LONG).show(); }else{ - Toast.makeText(v.getContext(),"没有打开除文件夹和压缩包以外的功能",Toast.LENGTH_SHORT).show(); + Toast.makeText(v.getContext(),"本软件暂时只支持zip解压",Toast.LENGTH_SHORT).show(); } } - } }); return holder; diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java index 043e73a..a9f6b52 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java @@ -1,5 +1,15 @@ package com.thankvinci.CloudKey.Files; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; + +import com.thankvinci.CloudKey.Utils.FileHandler; + +import net.lingala.zip4j.ZipFile; +import net.lingala.zip4j.exception.ZipException; + import org.apache.commons.codec.digest.DigestUtils; import java.io.File; @@ -33,4 +43,27 @@ public class FileUtils { String filemd5 = DigestUtils.md5Hex(new FileInputStream(path)); return filemd5; } + //文件解压 + public static void unzip(String srcFile, String desPath, String passwd, Handler handler) throws ZipException { + ZipFile zipFile = new ZipFile(srcFile); + //zipFile.setCharset(); + Bundle data = new Bundle(); + Message msg = new Message(); + if (!zipFile.isValidZipFile()){ + data.putString("error","压缩包已损坏"); + msg.what = FileHandler.ERROR; + msg.setData(data); + handler.sendMessage(msg); + } + File f = new File(desPath); + if (f.isDirectory() && !f.exists()){ + f.mkdirs(); + } + if (zipFile.isEncrypted()) { + zipFile.setPassword(passwd.toCharArray()); + } + + Log.d("TAG:",zipFile.getFile().getName()); + zipFile.extractAll(desPath); + } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java index 503a1b0..df156df 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java @@ -2,6 +2,7 @@ package com.thankvinci.CloudKey.Fragment; import android.os.Bundle; import android.os.Environment; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -28,6 +29,9 @@ import java.util.Stack; public class FileManageFragment extends Fragment { + private long lastTime = 0; + private long currentTime = 0; + private String dir; //当前fragment加载的目录 private boolean isRoot; //是否是根目录布局 @@ -71,6 +75,9 @@ public class FileManageFragment extends Fragment { public String getDir(){ return dir; } + public boolean isRoot(){ + return isRoot; + } public void loadDirectory(){ ActivityCompat.requestPermissions(getActivity(), new String[]{ //运行时权限 "android.permission.WRITE_EXTERNAL_STORAGE", @@ -122,4 +129,15 @@ public class FileManageFragment extends Fragment { FileAdapter adapter = new FileAdapter(fileItemList,this); directoryView.setAdapter(adapter); } + public void onKeyDownChild(int key,KeyEvent event){ + if (isRoot && key==event.KEYCODE_BACK){ + currentTime = System.currentTimeMillis(); + if(currentTime - lastTime > 2000){ + Toast.makeText(getActivity(),"再按一次返回键退出",Toast.LENGTH_SHORT).show(); + lastTime = currentTime; + }else{ + getActivity().finish(); + } + } + } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/UnzipDialogFragment.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/UnzipDialogFragment.java new file mode 100644 index 0000000..b949faa --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/UnzipDialogFragment.java @@ -0,0 +1,48 @@ +package com.thankvinci.CloudKey.Fragment; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; + +import com.thankvinci.CloudKey.R; + +public class UnzipDialogFragment extends DialogFragment { + //点击压缩文件弹出来的Dialog + private UnzipDialogListener listener; + //源文件绝对路径,目标文件夹绝对路径和密码 + private EditText srcFile_edit; + private EditText desPath_edit; + private EditText passwd_edit; + + public interface UnzipDialogListener{ + public void onDialogUnzipClicked(); + } + public void setListener(UnzipDialogListener listener){ + this.listener = listener; + } + public AlertDialog onCreateDialog(Bundle bundle){ + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + LayoutInflater inflater = requireActivity().getLayoutInflater(); + View view = inflater.inflate(R.layout.unzip_dialog,null); + srcFile_edit = view.findViewById(R.id.src_edit); + desPath_edit = view.findViewById(R.id.des_edit); + builder.setView(view).setTitle("解压到当前路径").setPositiveButton("解压", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + listener.onDialogUnzipClicked(); + } + }).setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Toast.makeText(getActivity(),"取消操作",Toast.LENGTH_SHORT).show(); + } + });; + return builder.create(); + } +} diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/MainActivity.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/MainActivity.java index d71d299..87bb650 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/MainActivity.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/MainActivity.java @@ -2,6 +2,7 @@ package com.thankvinci.CloudKey; import androidx.appcompat.app.AppCompatActivity; import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; import androidx.navigation.NavController; import androidx.navigation.fragment.NavHostFragment; import androidx.navigation.ui.AppBarConfiguration; @@ -9,10 +10,13 @@ import androidx.navigation.ui.NavigationUI; import android.os.Bundle; import android.os.Handler; +import android.view.KeyEvent; import android.view.View; import android.widget.TextView; +import android.widget.Toast; import com.google.android.material.navigation.NavigationView; +import com.thankvinci.CloudKey.Fragment.FileManageFragment; import com.thankvinci.CloudKey.NetUtils.NetHandler; import com.thankvinci.CloudKey.NetUtils.NetThread; @@ -40,4 +44,19 @@ public class MainActivity extends AppCompatActivity { public boolean onSupportNavigateUp() { return NavigationUI.navigateUp(navController,appBarConfiguration)||super.onSupportNavigateUp(); } + @Override + public boolean onKeyDown(int key, KeyEvent event){ + //当前nav导航的fragment如果是fm的话,调用返回键 + if(navController.getCurrentDestination().getId() == R.id.fileManageFragment){ + for(Fragment fragment:navHostFragment.getChildFragmentManager().getFragments()){ + if(fragment instanceof FileManageFragment){ + if (((FileManageFragment)fragment).isRoot()) { + ((FileManageFragment) fragment).onKeyDownChild(key, event); + return false; //结束activity是在fm中结束的 + } + } + } + } + return super.onKeyDown(key, event); //只有当当前页面不是fm的根目录时会执行原本的返回操作 + } } \ No newline at end of file diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetThread.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetThread.java index 8b5488c..91c1f7b 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetThread.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/NetUtils/NetThread.java @@ -18,6 +18,7 @@ import java.net.MalformedURLException; import java.net.URL; public class NetThread implements Runnable { + final static int ERROR = 2; Handler handler; String strUrl; public NetThread(Handler handler,String strUrl){ diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java index dbaa324..7ab2488 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java @@ -10,8 +10,9 @@ import com.thankvinci.CloudKey.NetUtils.NetThread; public class FileHandler extends Handler { //定义功能选择的常量 获取MD5和解压 - final static int FUNCTION_GET_MD5 = 0; - final static int FUNCTION_DECOMPRESS = 1; + public final static int FUNCTION_GET_MD5 = 0; + public final static int FUNCTION_DECOMPRESS = 1; + public final static int ERROR = -1; private Activity activity; @@ -33,6 +34,8 @@ public class FileHandler extends Handler { Thread nt = new Thread(new NetThread(handler,url)); nt.start(); break; + case ERROR: + Toast.makeText(activity,msg.getData().getString("error"),Toast.LENGTH_SHORT).show(); } } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java index fb392c1..754879b 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java @@ -6,22 +6,26 @@ import android.os.Message; import com.thankvinci.CloudKey.Files.FileUtils; +import net.lingala.zip4j.exception.ZipException; + import java.io.IOException; public class FileThread implements Runnable{ - final static int FUNCTION_GET_MD5 = 0; - final static int FUNCTION_DECOMPRESS = 1; + public final static int FUNCTION_GET_MD5 = 0; + public final static int FUNCTION_DECOMPRESS = 1; + public final static int ERROR = -1; - private String srcFile,desPath,md5; + private String srcFile,desPath,md5,passwd; private Handler handler; private int function; - public FileThread(Handler handler,String srcFile,String desPath,final int FUNCTION){ + public FileThread(Handler handler,String srcFile,String desPath,String passwd,final int FUNCTION){ this.handler = handler; this.srcFile = srcFile; this.desPath = desPath; + this.passwd = passwd; this.function = FUNCTION; } @Override @@ -39,9 +43,13 @@ public class FileThread implements Runnable{ } catch (IOException e) { e.printStackTrace(); } - break; case FUNCTION_DECOMPRESS: + try { + FileUtils.unzip(srcFile,desPath,passwd,handler); + } catch (ZipException e) { + e.printStackTrace(); + } break; default: break; } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java index 3a63760..510d48d 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java @@ -5,8 +5,12 @@ import android.content.ClipboardManager; import android.content.Context; public class MyUtils { + //private long public static void copyToClipboard(Activity activity,String str){ ClipboardManager cmb = (ClipboardManager)activity.getSystemService(Context.CLIPBOARD_SERVICE); cmb.setText(str); } + public static void onBackExit(){ + + } } diff --git a/CloudKey/app/src/main/res/drawable/text_be_clicked.xml b/CloudKey/app/src/main/res/drawable/text_be_clicked.xml new file mode 100644 index 0000000..0369d0c --- /dev/null +++ b/CloudKey/app/src/main/res/drawable/text_be_clicked.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/CloudKey/app/src/main/res/layout/unzip_dialog.xml b/CloudKey/app/src/main/res/layout/unzip_dialog.xml new file mode 100644 index 0000000..010551a --- /dev/null +++ b/CloudKey/app/src/main/res/layout/unzip_dialog.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/CloudKey/app/src/main/res/values-night/themes.xml b/CloudKey/app/src/main/res/values-night/themes.xml index cab77ca..d8c2480 100644 --- a/CloudKey/app/src/main/res/values-night/themes.xml +++ b/CloudKey/app/src/main/res/values-night/themes.xml @@ -1,16 +1,17 @@ - \ No newline at end of file diff --git a/CloudKey/app/src/main/res/values/colors.xml b/CloudKey/app/src/main/res/values/colors.xml index 2f9b575..942ebf9 100644 --- a/CloudKey/app/src/main/res/values/colors.xml +++ b/CloudKey/app/src/main/res/values/colors.xml @@ -10,6 +10,7 @@ #FFFFFFFF #FFff0000 #FF0000ff + #FF41A2EF #FFffff00 #FF00ff00 #00ffffff diff --git a/CloudKey/app/src/main/res/values/themes.xml b/CloudKey/app/src/main/res/values/themes.xml index 89c67c4..b319bd3 100644 --- a/CloudKey/app/src/main/res/values/themes.xml +++ b/CloudKey/app/src/main/res/values/themes.xml @@ -1,16 +1,17 @@ - \ No newline at end of file diff --git a/开发历程.md b/开发历程.md index 9742b5d..50ec5c0 100644 --- a/开发历程.md +++ b/开发历程.md @@ -255,4 +255,16 @@ FileHandler负责将获取到的md5码发到NetThread,然后将得到的密码 数据流向: -主线程(文件路径)-->FileThread(MD5)-->FileHandler(MD5)-->NetThread(pwd)-->NetHandler(pwd) \ No newline at end of file +主线程(文件路径)-->FileThread(MD5)-->FileHandler(MD5)-->NetThread(pwd)-->NetHandler(pwd) + +**2021/6/12** + +实现了根目录下再按一次返回键退出APP + +再次思考完成解压需要做的事情 + +点击文件,有个按钮直接检测md5值在数据库中有没有数据,有的话填充密码框,密码框可勾选是否明文,还有一个选项是是否上传当前文件的密码,有密码指定目的路径点击解压按钮就可以直接解压 + +改了主题 + +添加了一个解压用的dialog \ No newline at end of file