mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Add file deletion, move information and solve bugs
This commit is contained in:
@@ -19,10 +19,9 @@
|
||||
*/
|
||||
package com.keepassdroid.fileselect;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
|
||||
class DeleteFileHistoryAsyncTask extends AsyncTask<String, Void, Void> {
|
||||
class DeleteFileHistoryAsyncTask extends AsyncTask<FileSelectBean, Void, Void> {
|
||||
|
||||
private AfterDeleteFileHistoryListener afterDeleteFileHistoryListener;
|
||||
private RecentFileHistory fileHistory;
|
||||
@@ -34,8 +33,8 @@ class DeleteFileHistoryAsyncTask extends AsyncTask<String, Void, Void> {
|
||||
this.adapter = adapter;
|
||||
}
|
||||
|
||||
protected Void doInBackground(String... args) {
|
||||
fileHistory.deleteFile(Uri.parse(args[0]));
|
||||
protected Void doInBackground(FileSelectBean... args) {
|
||||
fileHistory.deleteFile(args[0].getFileUri());
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,15 +30,17 @@ import android.widget.TextView;
|
||||
|
||||
import com.kunzisoft.keepass.R;
|
||||
|
||||
import java.text.DateFormat;
|
||||
|
||||
public class FileInformationDialogFragment extends DialogFragment {
|
||||
|
||||
private static final String FILE_SELECT_BEEN_ARG = "FILE_SELECT_BEEN_ARG";
|
||||
|
||||
public static FileInformationDialogFragment newInstance(FileSelectBeen fileSelectBeen) {
|
||||
public static FileInformationDialogFragment newInstance(FileSelectBean fileSelectBean) {
|
||||
FileInformationDialogFragment fileInformationDialogFragment =
|
||||
new FileInformationDialogFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putSerializable(FILE_SELECT_BEEN_ARG, fileSelectBeen);
|
||||
args.putSerializable(FILE_SELECT_BEEN_ARG, fileSelectBean);
|
||||
fileInformationDialogFragment.setArguments(args);
|
||||
return fileInformationDialogFragment;
|
||||
}
|
||||
@@ -50,17 +52,23 @@ public class FileInformationDialogFragment extends DialogFragment {
|
||||
View root = inflater.inflate(R.layout.file_selection_information, null);
|
||||
|
||||
if (getArguments() != null && getArguments().containsKey(FILE_SELECT_BEEN_ARG)) {
|
||||
FileSelectBeen fileSelectBeen = (FileSelectBeen) getArguments().getSerializable(FILE_SELECT_BEEN_ARG);
|
||||
if(fileSelectBeen != null) {
|
||||
FileSelectBean fileSelectBean = (FileSelectBean) getArguments().getSerializable(FILE_SELECT_BEEN_ARG);
|
||||
TextView fileWarningView = (TextView) root.findViewById(R.id.file_warning);
|
||||
if(fileSelectBean != null) {
|
||||
TextView fileNameView = (TextView) root.findViewById(R.id.file_filename);
|
||||
TextView filePathView = (TextView) root.findViewById(R.id.file_path);
|
||||
TextView fileSizeView = (TextView) root.findViewById(R.id.file_size);
|
||||
TextView fileModificationView = (TextView) root.findViewById(R.id.file_modification);
|
||||
fileNameView.setText(fileSelectBeen.getFileName());
|
||||
filePathView.setText(fileSelectBeen.getFileUri().toString());
|
||||
fileSizeView.setText(String.valueOf(fileSelectBeen.getSize()));
|
||||
fileModificationView.setText(fileSelectBeen.getLastModification().toString());
|
||||
}
|
||||
fileWarningView.setVisibility(View.GONE);
|
||||
fileNameView.setText(fileSelectBean.getFileName());
|
||||
filePathView.setText(fileSelectBean.getFileUri().toString());
|
||||
fileSizeView.setText(String.valueOf(fileSelectBean.getSize()));
|
||||
fileModificationView.setText(DateFormat.getDateTimeInstance()
|
||||
.format(fileSelectBean.getLastModification()));
|
||||
if(fileSelectBean.notFound())
|
||||
showFileNotFound(fileWarningView);
|
||||
} else
|
||||
showFileNotFound(fileWarningView);
|
||||
}
|
||||
|
||||
builder.setView(root);
|
||||
@@ -71,4 +79,9 @@ public class FileInformationDialogFragment extends DialogFragment {
|
||||
});
|
||||
return builder.create();
|
||||
}
|
||||
|
||||
private void showFileNotFound(TextView fileWarningView) {
|
||||
fileWarningView.setVisibility(View.VISIBLE);
|
||||
fileWarningView.setText(R.string.file_not_found);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ import java.net.URLDecoder;
|
||||
public class FileSelectActivity extends StylishActivity implements
|
||||
CreateFileDialog.DefinePathDialogListener ,
|
||||
AssignMasterKeyDialog.AssignPasswordDialogListener,
|
||||
FileSelectViewHolder.FileSelectClearListener,
|
||||
FileSelectAdapter.FileSelectClearListener,
|
||||
FileSelectAdapter.FileInformationShowListener {
|
||||
|
||||
private static final String TAG = "FileSelectActivity";
|
||||
@@ -351,13 +351,6 @@ public class FileSelectActivity extends StylishActivity implements
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClickFileInformation(FileSelectBeen fileSelectBeen) {
|
||||
FileInformationDialogFragment fileInformationDialogFragment =
|
||||
FileInformationDialogFragment.newInstance(fileSelectBeen);
|
||||
fileInformationDialogFragment.show(getSupportFragmentManager(), "fileInformation");
|
||||
}
|
||||
|
||||
private class AssignPasswordOnFinish extends FileOnFinish {
|
||||
|
||||
AssignPasswordOnFinish(FileOnFinish fileOnFinish) {
|
||||
@@ -425,13 +418,24 @@ public class FileSelectActivity extends StylishActivity implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onFileSelectClearListener(String fileName) {
|
||||
public void onClickFileInformation(FileSelectBean fileSelectBean) {
|
||||
if (fileSelectBean != null) {
|
||||
FileInformationDialogFragment fileInformationDialogFragment =
|
||||
FileInformationDialogFragment.newInstance(fileSelectBean);
|
||||
fileInformationDialogFragment.show(getSupportFragmentManager(), "fileInformation");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onFileSelectClearListener(final FileSelectBean fileSelectBean) {
|
||||
new DeleteFileHistoryAsyncTask(new DeleteFileHistoryAsyncTask.AfterDeleteFileHistoryListener() {
|
||||
@Override
|
||||
public void afterDeleteFile() {
|
||||
fileHistory.deleteFile(fileSelectBean.getFileUri());
|
||||
mAdapter.notifyDataSetChanged();
|
||||
updateTitleFileListView();
|
||||
}
|
||||
}, fileHistory, mAdapter).execute(fileName);
|
||||
}, fileHistory, mAdapter).execute(fileSelectBean);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -497,6 +501,8 @@ public class FileSelectActivity extends StylishActivity implements
|
||||
|
||||
FileNameView fnv = (FileNameView) findViewById(R.id.file_select);
|
||||
fnv.updateExternalStorageWarning();
|
||||
|
||||
updateTitleFileListView();
|
||||
}
|
||||
|
||||
private void checkStoragePermission() {
|
||||
|
||||
@@ -20,8 +20,14 @@
|
||||
package com.keepassdroid.fileselect;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.support.annotation.ColorInt;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.util.TypedValue;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
@@ -31,15 +37,25 @@ import java.util.List;
|
||||
|
||||
public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder> {
|
||||
|
||||
private static final int MENU_CLEAR = 1;
|
||||
|
||||
private LayoutInflater inflater;
|
||||
private List<String> listFiles;
|
||||
private View.OnClickListener mOnClickListener;
|
||||
private FileSelectViewHolder.FileSelectClearListener fileSelectClearListener;
|
||||
private FileSelectClearListener fileSelectClearListener;
|
||||
private FileInformationShowListener fileInformationShowListener;
|
||||
|
||||
private @ColorInt
|
||||
int warningColor;
|
||||
|
||||
FileSelectAdapter(Context context, List<String> listFiles) {
|
||||
inflater = LayoutInflater.from(context);
|
||||
this.listFiles=listFiles;
|
||||
|
||||
TypedValue typedValue = new TypedValue();
|
||||
Resources.Theme theme = context.getTheme();
|
||||
theme.resolveAttribute(R.attr.colorAccentCompat, typedValue, true);
|
||||
warningColor = typedValue.data;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -51,12 +67,16 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(FileSelectViewHolder holder, int position) {
|
||||
FileSelectBeen fileSelectBeen = new FileSelectBeen(listFiles.get(position));
|
||||
holder.fileName.setText(fileSelectBeen.getFileName());
|
||||
if(fileSelectClearListener != null)
|
||||
holder.setFileSelectClearListener(fileSelectClearListener);
|
||||
FileSelectBean fileSelectBean = new FileSelectBean(listFiles.get(position));
|
||||
holder.fileContainer.setOnCreateContextMenuListener(new ContextMenuBuilder(fileSelectBean));
|
||||
holder.fileName.setText(fileSelectBean.getFileName());
|
||||
if(fileSelectBean.notFound()) {
|
||||
holder.fileInformation.setColorFilter(
|
||||
warningColor,
|
||||
android.graphics.PorterDuff.Mode.MULTIPLY);
|
||||
}
|
||||
if(fileInformationShowListener != null)
|
||||
holder.fileInformation.setOnClickListener(new FileInformationClickListener(fileSelectBeen));
|
||||
holder.fileInformation.setOnClickListener(new FileInformationClickListener(fileSelectBean));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -68,7 +88,7 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
|
||||
this.mOnClickListener = onItemClickListener;
|
||||
}
|
||||
|
||||
void setFileSelectClearListener(FileSelectViewHolder.FileSelectClearListener fileSelectClearListener) {
|
||||
void setFileSelectClearListener(FileSelectClearListener fileSelectClearListener) {
|
||||
this.fileSelectClearListener = fileSelectClearListener;
|
||||
}
|
||||
|
||||
@@ -76,22 +96,54 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
|
||||
this.fileInformationShowListener = fileInformationShowListener;
|
||||
}
|
||||
|
||||
public interface FileInformationShowListener {
|
||||
void onClickFileInformation(FileSelectBean fileSelectBean);
|
||||
}
|
||||
|
||||
public interface FileSelectClearListener {
|
||||
boolean onFileSelectClearListener(FileSelectBean fileSelectBean);
|
||||
}
|
||||
|
||||
private class FileInformationClickListener implements View.OnClickListener {
|
||||
|
||||
private FileSelectBeen fileSelectBeen;
|
||||
private FileSelectBean fileSelectBean;
|
||||
|
||||
FileInformationClickListener(FileSelectBeen fileSelectBeen) {
|
||||
this.fileSelectBeen = fileSelectBeen;
|
||||
FileInformationClickListener(FileSelectBean fileSelectBean) {
|
||||
this.fileSelectBean = fileSelectBean;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
fileInformationShowListener.onClickFileInformation(fileSelectBeen);
|
||||
fileInformationShowListener.onClickFileInformation(fileSelectBean);
|
||||
}
|
||||
}
|
||||
|
||||
public interface FileInformationShowListener {
|
||||
void onClickFileInformation(FileSelectBeen fileSelectBeen);
|
||||
private class ContextMenuBuilder implements View.OnCreateContextMenuListener {
|
||||
|
||||
private FileSelectBean fileSelectBean;
|
||||
|
||||
public ContextMenuBuilder(FileSelectBean fileSelectBean) {
|
||||
this.fileSelectBean = fileSelectBean;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
|
||||
MenuItem clearMenu = contextMenu.add(Menu.NONE, MENU_CLEAR, Menu.NONE, R.string.remove_from_filelist);
|
||||
clearMenu.setOnMenuItemClickListener(mOnMyActionClickListener);
|
||||
}
|
||||
|
||||
private MenuItem.OnMenuItemClickListener mOnMyActionClickListener = new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
if (item.getItemId() == MENU_CLEAR) {
|
||||
return fileSelectClearListener.onFileSelectClearListener(fileSelectBean);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -25,14 +25,14 @@ import java.io.File;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
public class FileSelectBeen implements Serializable {
|
||||
public class FileSelectBean implements Serializable {
|
||||
|
||||
private String fileName;
|
||||
private Uri fileUri;
|
||||
private Date lastModification;
|
||||
private long size;
|
||||
|
||||
public FileSelectBeen(String pathFile) {
|
||||
public FileSelectBean(String pathFile) {
|
||||
fileUri = Uri.parse(pathFile);
|
||||
File file= new File(fileUri.getPath());
|
||||
fileName = file.getName();
|
||||
@@ -40,6 +40,10 @@ public class FileSelectBeen implements Serializable {
|
||||
size = file.getTotalSpace();
|
||||
}
|
||||
|
||||
public boolean notFound() {
|
||||
return getSize() == 0;
|
||||
}
|
||||
|
||||
public String getFileName() {
|
||||
return fileName;
|
||||
}
|
||||
@@ -20,51 +20,22 @@
|
||||
package com.keepassdroid.fileselect;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.ContextMenu;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.kunzisoft.keepass.R;
|
||||
|
||||
class FileSelectViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {
|
||||
private static final int MENU_CLEAR = 1;
|
||||
class FileSelectViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
View fileContainer;
|
||||
TextView fileName;
|
||||
ImageView fileInformation;
|
||||
private FileSelectClearListener fileSelectClearListener;
|
||||
|
||||
FileSelectViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
View fileContainer = itemView.findViewById(R.id.file_container);
|
||||
fileContainer.setOnCreateContextMenuListener(this);
|
||||
fileContainer = itemView.findViewById(R.id.file_container);
|
||||
fileName = (TextView) itemView.findViewById(R.id.file_filename);
|
||||
fileInformation = (ImageView) itemView.findViewById(R.id.file_information);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
|
||||
MenuItem clearMenu = contextMenu.add(Menu.NONE, MENU_CLEAR, Menu.NONE, R.string.remove_from_filelist);
|
||||
clearMenu.setOnMenuItemClickListener(mOnMyActionClickListener);
|
||||
}
|
||||
|
||||
private final MenuItem.OnMenuItemClickListener mOnMyActionClickListener = new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem item) {
|
||||
if (item.getItemId() == MENU_CLEAR) {
|
||||
String filename = fileName.getText().toString();
|
||||
return fileSelectClearListener.onFileSelectClearListener(filename);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
public void setFileSelectClearListener(FileSelectClearListener fileSelectClearListener) {
|
||||
this.fileSelectClearListener = fileSelectClearListener;
|
||||
}
|
||||
|
||||
public interface FileSelectClearListener {
|
||||
boolean onFileSelectClearListener(String fileName);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,26 +17,35 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/file_container"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?android:attr/selectableItemBackground">
|
||||
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_filename"
|
||||
style="@style/KeepassDXStyle.TextAppearance.Large"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_toLeftOf="@+id/file_information"
|
||||
android:layout_toStartOf="@+id/file_information"
|
||||
android:paddingBottom="18dp"
|
||||
android:paddingEnd="18dp"
|
||||
android:paddingLeft="18dp"
|
||||
android:paddingRight="18dp"
|
||||
android:paddingStart="18dp"
|
||||
android:paddingTop="18dp" />
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/file_information"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="18dp"
|
||||
android:src="@drawable/ic_info_white_24dp"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:tint="?attr/colorPrimary"/>
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_filename"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="18dp"
|
||||
android:paddingLeft="12dp"
|
||||
android:paddingRight="12dp"
|
||||
android:paddingBottom="18dp"
|
||||
style="@style/KeepassDXStyle.TextAppearance.Large"/>
|
||||
</LinearLayout>
|
||||
</RelativeLayout>
|
||||
@@ -29,8 +29,7 @@
|
||||
android:layout_margin="8dp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/entry_modified"
|
||||
style="@style/KeepassDXStyle.TextAppearance.Title"/>
|
||||
android:text="@string/entry_modified"/>
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_modification"
|
||||
android:layout_margin="8dp"
|
||||
@@ -62,4 +61,12 @@
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentEnd="true" />
|
||||
</RelativeLayout>
|
||||
|
||||
<android.support.v7.widget.AppCompatTextView
|
||||
android:id="@+id/file_warning"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:visibility="gone"
|
||||
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"/>
|
||||
</LinearLayout>
|
||||
@@ -230,6 +230,7 @@
|
||||
<string name="path">Chemin</string>
|
||||
<string name="assign_master_key">Assigner une clé maître</string>
|
||||
<string name="create_keepass_file">Créer un fichier keepass</string>
|
||||
<string name="bytes">Octets</string>
|
||||
|
||||
<string-array name="clipboard_timeout_options">
|
||||
<item>30 secondes</item>
|
||||
|
||||
Reference in New Issue
Block a user