使用ProgressBar使用户更直观地知道现在程序任务的状态,例如点击zip文件获取md5码时或者文件解压时转圈,任务完成后停止转圈

master
ThankVinci 4 years ago
parent 8fd81fc4cf
commit 249d033912

@ -1,6 +1,7 @@
package com.thankvinci.CloudKey.Files; package com.thankvinci.CloudKey.Files;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -8,6 +9,7 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation; import androidx.navigation.Navigation;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -19,6 +21,8 @@ import com.thankvinci.CloudKey.R;
import com.thankvinci.CloudKey.Utils.FileHandler; import com.thankvinci.CloudKey.Utils.FileHandler;
import com.thankvinci.CloudKey.Utils.FileThread; import com.thankvinci.CloudKey.Utils.FileThread;
import net.lingala.zip4j.exception.ZipException;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import java.io.FileInputStream; import java.io.FileInputStream;
@ -85,8 +89,9 @@ public class FileAdapter extends RecyclerView.Adapter<FileAdapter.ViewHolder> {
data.putString("srcFile",srcFile); data.putString("srcFile",srcFile);
data.putString("desPath",desPath); data.putString("desPath",desPath);
unzipDialog.setArguments(data); unzipDialog.setArguments(data);
unzipDialog.show(((MainActivity)v.getContext()).getSupportFragmentManager(),"unzip"); unzipDialog.show(((MainActivity)v.getContext()).getSupportFragmentManager(),"unzip");
//Toast.makeText(v.getContext(),""+unzipDialog.getPosiBtn(),Toast.LENGTH_SHORT).show();
}else{ }else{
Toast.makeText(v.getContext(),"压缩包已损坏或者格式不合法",Toast.LENGTH_SHORT).show(); Toast.makeText(v.getContext(),"压缩包已损坏或者格式不合法",Toast.LENGTH_SHORT).show();
} }

@ -35,6 +35,7 @@ public class FileUtils {
return 0; return 0;
} }
return (f1.getName().toUpperCase()).compareTo((f2.getName().toUpperCase())); return (f1.getName().toUpperCase()).compareTo((f2.getName().toUpperCase()));
//return (f1.getName().toUpperCase()).compareTo((f2.getName().toUpperCase()));
} }
}); });
} }
@ -70,4 +71,8 @@ public class FileUtils {
ZipFile zipFile = new ZipFile(srcFile); ZipFile zipFile = new ZipFile(srcFile);
return zipFile.isValidZipFile(); return zipFile.isValidZipFile();
} }
public static boolean isEncrypted(String srcFile) throws ZipException {
ZipFile zipFile = new ZipFile(srcFile);
return zipFile.isEncrypted();
}
} }

@ -7,6 +7,7 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;

@ -4,14 +4,18 @@ import android.content.DialogInterface;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
@ -19,6 +23,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment; import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.thankvinci.CloudKey.Files.FileUtils;
import com.thankvinci.CloudKey.NetUtils.NetHandler; import com.thankvinci.CloudKey.NetUtils.NetHandler;
import com.thankvinci.CloudKey.NetUtils.NetThread; import com.thankvinci.CloudKey.NetUtils.NetThread;
import com.thankvinci.CloudKey.R; import com.thankvinci.CloudKey.R;
@ -26,8 +31,16 @@ import com.thankvinci.CloudKey.Utils.FileHandler;
import com.thankvinci.CloudKey.Utils.FileThread; import com.thankvinci.CloudKey.Utils.FileThread;
import com.thankvinci.CloudKey.Utils.MyUtils; import com.thankvinci.CloudKey.Utils.MyUtils;
import net.lingala.zip4j.exception.ZipException;
import java.lang.reflect.Field;
public class UnzipDialogFragment extends DialogFragment { public class UnzipDialogFragment extends DialogFragment {
//
AlertDialog alertDialog;
AlertDialog.Builder builder;
Button posi_btn; //点击解压的按钮
//用一个fragment来存当前这个fragment对象 //用一个fragment来存当前这个fragment对象
Fragment fragment; Fragment fragment;
//点击压缩文件弹出来的Dialog //点击压缩文件弹出来的Dialog
@ -37,6 +50,8 @@ public class UnzipDialogFragment extends DialogFragment {
//用户勾选是否同意将密码上传到数据库 //用户勾选是否同意将密码上传到数据库
private CheckBox acceptPWD2SQL; private CheckBox acceptPWD2SQL;
//用于判断密码来源是否是数据库,是的话勾选checkbox也不会进行上传操作 //用于判断密码来源是否是数据库,是的话勾选checkbox也不会进行上传操作
//加载的圈圈
private ProgressBar progressBar;
private boolean fromSQL; private boolean fromSQL;
//点击该文字就连接数据库查找密码 //点击该文字就连接数据库查找密码
private TextView getPWD; private TextView getPWD;
@ -57,7 +72,7 @@ public class UnzipDialogFragment extends DialogFragment {
fragment = this; fragment = this;
//获取MD5码 //获取MD5码
Handler handler = new FileHandler(getActivity(),fragment); Handler handler = new FileHandler(getActivity(),fragment);
Toast.makeText(getActivity(),"正在获取文件MD5码,可能需要花点时间,这取决于您手机的性能",Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(),"正在获取文件MD5码,可能需要花点时间",Toast.LENGTH_SHORT).show();
Thread ft = new Thread(new FileThread(handler,srcFile,desPath,null,FileHandler.FUNCTION_GET_MD5)); Thread ft = new Thread(new FileThread(handler,srcFile,desPath,null,FileHandler.FUNCTION_GET_MD5));
ft.start(); ft.start();
} }
@ -71,7 +86,7 @@ public class UnzipDialogFragment extends DialogFragment {
} }
public AlertDialog onCreateDialog(Bundle savedInstanceState){ public AlertDialog onCreateDialog(Bundle savedInstanceState){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = requireActivity().getLayoutInflater(); LayoutInflater inflater = requireActivity().getLayoutInflater();
View view = inflater.inflate(R.layout.unzip_dialog,null); View view = inflater.inflate(R.layout.unzip_dialog,null);
@ -88,10 +103,20 @@ public class UnzipDialogFragment extends DialogFragment {
acceptPWD2SQL = view.findViewById(R.id.accept_pwd_2_sql); acceptPWD2SQL = view.findViewById(R.id.accept_pwd_2_sql);
getPWD = view.findViewById(R.id.getpwd); getPWD = view.findViewById(R.id.getpwd);
progressBar = view.findViewById(R.id.progress_bar);
fromSQL = false; fromSQL = false;
successful = false; successful = false;
try {
if(!FileUtils.isEncrypted(srcFile)){
//当文件不是加密文件时
TextView text = view.findViewById(R.id.pwd_text);
text.setTextColor(getResources().getColor(R.color.grey));
setNoPWD();
}
} catch (ZipException e) {
e.printStackTrace();
}
passwd_edit.setOnClickListener(new View.OnClickListener() { passwd_edit.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O) @RequiresApi(api = Build.VERSION_CODES.O)
@Override @Override
@ -115,10 +140,13 @@ public class UnzipDialogFragment extends DialogFragment {
acceptPWD2SQL.setOnClickListener(new View.OnClickListener() { acceptPWD2SQL.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (acceptPWD2SQL.isChecked()){ try {
//Toast.makeText(getActivity(),"勾选同意",Toast.LENGTH_SHORT).show(); if(!FileUtils.isEncrypted(srcFile)){
}else{ acceptPWD2SQL.setChecked(false);
//Toast.makeText(getActivity(),"取消勾选",Toast.LENGTH_SHORT).show(); Toast.makeText(getActivity(),"不可勾选",Toast.LENGTH_SHORT).show();
}
} catch (ZipException e) {
e.printStackTrace();
} }
} }
}); });
@ -135,7 +163,7 @@ public class UnzipDialogFragment extends DialogFragment {
nt.start(); nt.start();
} }
}); });
/**
builder.setView(view).setTitle("解压到当前路径").setPositiveButton("解压", new DialogInterface.OnClickListener() { builder.setView(view).setTitle("解压到当前路径").setPositiveButton("解压", new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
@ -143,18 +171,40 @@ public class UnzipDialogFragment extends DialogFragment {
Handler fHandler = new FileHandler(getActivity(),fragment); Handler fHandler = new FileHandler(getActivity(),fragment);
Thread ft = new Thread(new FileThread(fHandler,srcFile,desPath,passwd,FileHandler.FUNCTION_DECOMPRESS)); Thread ft = new Thread(new FileThread(fHandler,srcFile,desPath,passwd,FileHandler.FUNCTION_DECOMPRESS));
ft.start(); ft.start();
if (acceptPWD2SQL.isChecked() && !fromSQL){ progressBar.setVisibility(View.VISIBLE);
//listener.onDialogUnzipClicked();
} }
listener.onDialogUnzipClicked(); })
} **/
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { builder.setView(view).setTitle("解压到当前路径").setPositiveButton("解压",null)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getActivity(),"取消操作",Toast.LENGTH_SHORT).show(); //Toast.makeText(getActivity(),"取消操作",Toast.LENGTH_SHORT).show();
} }
});; });;
return builder.create(); alertDialog = builder.create();
return alertDialog;
}
@Override
public void onStart(){
super.onStart();
if (alertDialog != null){
Button pb = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
pb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),"正在解压,请稍后",Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.VISIBLE);
passwd = passwd_edit.getText().toString();
Handler fHandler = new FileHandler(getActivity(),fragment);
Thread ft = new Thread(new FileThread(fHandler,srcFile,desPath,passwd,FileHandler.FUNCTION_DECOMPRESS));
ft.start();
progressBar.setVisibility(View.VISIBLE);
}
});
}
} }
public void setFromSQL(boolean fromSQL){ public void setFromSQL(boolean fromSQL){
this.fromSQL = fromSQL; this.fromSQL = fromSQL;
@ -191,4 +241,17 @@ public class UnzipDialogFragment extends DialogFragment {
public boolean pwdIsEmpty(){ public boolean pwdIsEmpty(){
return "".equals(getPasswd()); return "".equals(getPasswd());
} }
public void setProgressBar(int vis){
progressBar.setVisibility(vis);
}
public void setNoPWD(){
getPWD.setClickable(false);
getPWD.setTextColor(getResources().getColor(R.color.grey));
passwd_edit.setFocusable(false);
passwd_edit.setHint("非加密文件");
acceptPWD2SQL.setChecked(false);
}
public Button getPosiBtn(){
return posi_btn;
}
} }

@ -3,6 +3,7 @@ package com.thankvinci.CloudKey.Utils;
import android.app.Activity; import android.app.Activity;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.view.View;
import android.widget.Toast; import android.widget.Toast;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@ -31,12 +32,17 @@ public class FileHandler extends Handler {
switch (msg.what){ switch (msg.what){
case FUNCTION_GET_MD5: case FUNCTION_GET_MD5:
((UnzipDialogFragment)fragment).setMD5(msg.getData().getString("md5")); ((UnzipDialogFragment)fragment).setMD5(msg.getData().getString("md5"));
((UnzipDialogFragment)fragment).setProgressBar(View.INVISIBLE);
Toast.makeText(activity,"MD5码加载完成",Toast.LENGTH_SHORT).show();
break; break;
case ERROR: case ERROR:
Toast.makeText(activity,msg.getData().getString("error"),Toast.LENGTH_SHORT).show(); Toast.makeText(activity,msg.getData().getString("error"),Toast.LENGTH_SHORT).show();
break; break;
case FUNCTION_DECOMPRESS: case FUNCTION_DECOMPRESS:
((UnzipDialogFragment)fragment).setSuccessful(msg.getData().getBoolean("successful")); ((UnzipDialogFragment)fragment).setSuccessful(msg.getData().getBoolean("successful"));
((UnzipDialogFragment)fragment).setProgressBar(View.INVISIBLE);
((UnzipDialogFragment)fragment).dismiss();
Toast.makeText(activity,"解压完成",Toast.LENGTH_SHORT).show();
//当dialog的checkbox为选中时并且密码来源不是数据库时再并且解压成功时再并且密码输入框不为空时,即用户同意输入解压密码解压成功后把密码上传到数据库 //当dialog的checkbox为选中时并且密码来源不是数据库时再并且解压成功时再并且密码输入框不为空时,即用户同意输入解压密码解压成功后把密码上传到数据库
if(((UnzipDialogFragment)fragment).getCheck() && !((UnzipDialogFragment)fragment).getFromSQL() && ((UnzipDialogFragment)fragment).getSuccessful() && !((UnzipDialogFragment)fragment).pwdIsEmpty()){ if(((UnzipDialogFragment)fragment).getCheck() && !((UnzipDialogFragment)fragment).getFromSQL() && ((UnzipDialogFragment)fragment).getSuccessful() && !((UnzipDialogFragment)fragment).pwdIsEmpty()){
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();

@ -5,7 +5,14 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".Fragment.FileManageFragment"> tools:context=".Fragment.FileManageFragment">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fm_progress_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:visibility="invisible"
tools:ignore="MissingConstraints" />
<EditText <EditText
android:id="@+id/path_name" android:id="@+id/path_name"
android:layout_width="match_parent" android:layout_width="match_parent"

@ -4,7 +4,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<ProgressBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/progress_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
tools:ignore="MissingConstraints" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"

@ -297,3 +297,17 @@ FileHandler负责将获取到的md5码发到NetThread,然后将得到的密码
实现了当用户勾选同意上传密码并且输入密码解压成功后,把密码和文件md5码一起传入数据库 实现了当用户勾选同意上传密码并且输入密码解压成功后,把密码和文件md5码一起传入数据库
**2021/6/13**
添加了点击一个zip文件打开dialog时判断是否是加密的,如果是加密的就不能输入密码和获取密码,也不能勾选同步密码(仅仅是一个解压缩的功能)
**2021/6/13**
想使用ProgressBar使用户更直观地知道现在程序任务的状态,但是发现Dialog点击BUTTON_POSITIVE后会关闭,ProgressBar出不来,于是就想着获取到Dialog对象让其不要关闭Dialog,但是没成想,DialogFragment创建完后,会直接销毁过程中产生的AlertDialog对象,也就是即便我在onCreate方法中获取到AlertDialog,并提供一个get方法在外部也只是得到一个空对象;在onCreate()方法中获取这个按钮也是个空对象
**2021/6/13**
找到了解决方法http://www.voidcn.com/article/p-mnprlspq-bsr.html
并不是在onCreate()后dialog就销毁,其实在onStart()中还能获取到dialog,进而获取到已经生成的BUTTON_POSITIVE,但是传出去还是已经销毁的状态,不过已经够了,只要重写按钮功能,不关闭dialog就行,然后通过线程调用去关闭dialog就OK

Loading…
Cancel
Save