Add file deletion, move information and solve bugs

This commit is contained in:
J-Jamet
2018-01-17 15:28:11 +01:00
parent 06b126469a
commit 43b4d00902
9 changed files with 146 additions and 84 deletions

View File

@@ -19,10 +19,9 @@
*/ */
package com.keepassdroid.fileselect; package com.keepassdroid.fileselect;
import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
class DeleteFileHistoryAsyncTask extends AsyncTask<String, Void, Void> { class DeleteFileHistoryAsyncTask extends AsyncTask<FileSelectBean, Void, Void> {
private AfterDeleteFileHistoryListener afterDeleteFileHistoryListener; private AfterDeleteFileHistoryListener afterDeleteFileHistoryListener;
private RecentFileHistory fileHistory; private RecentFileHistory fileHistory;
@@ -34,8 +33,8 @@ class DeleteFileHistoryAsyncTask extends AsyncTask<String, Void, Void> {
this.adapter = adapter; this.adapter = adapter;
} }
protected Void doInBackground(String... args) { protected Void doInBackground(FileSelectBean... args) {
fileHistory.deleteFile(Uri.parse(args[0])); fileHistory.deleteFile(args[0].getFileUri());
return null; return null;
} }

View File

@@ -30,15 +30,17 @@ import android.widget.TextView;
import com.kunzisoft.keepass.R; import com.kunzisoft.keepass.R;
import java.text.DateFormat;
public class FileInformationDialogFragment extends DialogFragment { public class FileInformationDialogFragment extends DialogFragment {
private static final String FILE_SELECT_BEEN_ARG = "FILE_SELECT_BEEN_ARG"; 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 = FileInformationDialogFragment fileInformationDialogFragment =
new FileInformationDialogFragment(); new FileInformationDialogFragment();
Bundle args = new Bundle(); Bundle args = new Bundle();
args.putSerializable(FILE_SELECT_BEEN_ARG, fileSelectBeen); args.putSerializable(FILE_SELECT_BEEN_ARG, fileSelectBean);
fileInformationDialogFragment.setArguments(args); fileInformationDialogFragment.setArguments(args);
return fileInformationDialogFragment; return fileInformationDialogFragment;
} }
@@ -50,17 +52,23 @@ public class FileInformationDialogFragment extends DialogFragment {
View root = inflater.inflate(R.layout.file_selection_information, null); View root = inflater.inflate(R.layout.file_selection_information, null);
if (getArguments() != null && getArguments().containsKey(FILE_SELECT_BEEN_ARG)) { if (getArguments() != null && getArguments().containsKey(FILE_SELECT_BEEN_ARG)) {
FileSelectBeen fileSelectBeen = (FileSelectBeen) getArguments().getSerializable(FILE_SELECT_BEEN_ARG); FileSelectBean fileSelectBean = (FileSelectBean) getArguments().getSerializable(FILE_SELECT_BEEN_ARG);
if(fileSelectBeen != null) { TextView fileWarningView = (TextView) root.findViewById(R.id.file_warning);
if(fileSelectBean != null) {
TextView fileNameView = (TextView) root.findViewById(R.id.file_filename); TextView fileNameView = (TextView) root.findViewById(R.id.file_filename);
TextView filePathView = (TextView) root.findViewById(R.id.file_path); TextView filePathView = (TextView) root.findViewById(R.id.file_path);
TextView fileSizeView = (TextView) root.findViewById(R.id.file_size); TextView fileSizeView = (TextView) root.findViewById(R.id.file_size);
TextView fileModificationView = (TextView) root.findViewById(R.id.file_modification); TextView fileModificationView = (TextView) root.findViewById(R.id.file_modification);
fileNameView.setText(fileSelectBeen.getFileName()); fileWarningView.setVisibility(View.GONE);
filePathView.setText(fileSelectBeen.getFileUri().toString()); fileNameView.setText(fileSelectBean.getFileName());
fileSizeView.setText(String.valueOf(fileSelectBeen.getSize())); filePathView.setText(fileSelectBean.getFileUri().toString());
fileModificationView.setText(fileSelectBeen.getLastModification().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); builder.setView(root);
@@ -71,4 +79,9 @@ public class FileInformationDialogFragment extends DialogFragment {
}); });
return builder.create(); return builder.create();
} }
private void showFileNotFound(TextView fileWarningView) {
fileWarningView.setVisibility(View.VISIBLE);
fileWarningView.setText(R.string.file_not_found);
}
} }

View File

@@ -71,7 +71,7 @@ import java.net.URLDecoder;
public class FileSelectActivity extends StylishActivity implements public class FileSelectActivity extends StylishActivity implements
CreateFileDialog.DefinePathDialogListener , CreateFileDialog.DefinePathDialogListener ,
AssignMasterKeyDialog.AssignPasswordDialogListener, AssignMasterKeyDialog.AssignPasswordDialogListener,
FileSelectViewHolder.FileSelectClearListener, FileSelectAdapter.FileSelectClearListener,
FileSelectAdapter.FileInformationShowListener { FileSelectAdapter.FileInformationShowListener {
private static final String TAG = "FileSelectActivity"; 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 { private class AssignPasswordOnFinish extends FileOnFinish {
AssignPasswordOnFinish(FileOnFinish fileOnFinish) { AssignPasswordOnFinish(FileOnFinish fileOnFinish) {
@@ -425,13 +418,24 @@ public class FileSelectActivity extends StylishActivity implements
} }
@Override @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() { new DeleteFileHistoryAsyncTask(new DeleteFileHistoryAsyncTask.AfterDeleteFileHistoryListener() {
@Override @Override
public void afterDeleteFile() { public void afterDeleteFile() {
fileHistory.deleteFile(fileSelectBean.getFileUri());
mAdapter.notifyDataSetChanged();
updateTitleFileListView(); updateTitleFileListView();
} }
}, fileHistory, mAdapter).execute(fileName); }, fileHistory, mAdapter).execute(fileSelectBean);
return true; return true;
} }
@@ -497,6 +501,8 @@ public class FileSelectActivity extends StylishActivity implements
FileNameView fnv = (FileNameView) findViewById(R.id.file_select); FileNameView fnv = (FileNameView) findViewById(R.id.file_select);
fnv.updateExternalStorageWarning(); fnv.updateExternalStorageWarning();
updateTitleFileListView();
} }
private void checkStoragePermission() { private void checkStoragePermission() {

View File

@@ -20,8 +20,14 @@
package com.keepassdroid.fileselect; package com.keepassdroid.fileselect;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.support.annotation.ColorInt;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -31,15 +37,25 @@ import java.util.List;
public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder> { public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder> {
private static final int MENU_CLEAR = 1;
private LayoutInflater inflater; private LayoutInflater inflater;
private List<String> listFiles; private List<String> listFiles;
private View.OnClickListener mOnClickListener; private View.OnClickListener mOnClickListener;
private FileSelectViewHolder.FileSelectClearListener fileSelectClearListener; private FileSelectClearListener fileSelectClearListener;
private FileInformationShowListener fileInformationShowListener; private FileInformationShowListener fileInformationShowListener;
private @ColorInt
int warningColor;
FileSelectAdapter(Context context, List<String> listFiles) { FileSelectAdapter(Context context, List<String> listFiles) {
inflater = LayoutInflater.from(context); inflater = LayoutInflater.from(context);
this.listFiles=listFiles; this.listFiles=listFiles;
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.colorAccentCompat, typedValue, true);
warningColor = typedValue.data;
} }
@Override @Override
@@ -51,12 +67,16 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
@Override @Override
public void onBindViewHolder(FileSelectViewHolder holder, int position) { public void onBindViewHolder(FileSelectViewHolder holder, int position) {
FileSelectBeen fileSelectBeen = new FileSelectBeen(listFiles.get(position)); FileSelectBean fileSelectBean = new FileSelectBean(listFiles.get(position));
holder.fileName.setText(fileSelectBeen.getFileName()); holder.fileContainer.setOnCreateContextMenuListener(new ContextMenuBuilder(fileSelectBean));
if(fileSelectClearListener != null) holder.fileName.setText(fileSelectBean.getFileName());
holder.setFileSelectClearListener(fileSelectClearListener); if(fileSelectBean.notFound()) {
holder.fileInformation.setColorFilter(
warningColor,
android.graphics.PorterDuff.Mode.MULTIPLY);
}
if(fileInformationShowListener != null) if(fileInformationShowListener != null)
holder.fileInformation.setOnClickListener(new FileInformationClickListener(fileSelectBeen)); holder.fileInformation.setOnClickListener(new FileInformationClickListener(fileSelectBean));
} }
@Override @Override
@@ -68,7 +88,7 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
this.mOnClickListener = onItemClickListener; this.mOnClickListener = onItemClickListener;
} }
void setFileSelectClearListener(FileSelectViewHolder.FileSelectClearListener fileSelectClearListener) { void setFileSelectClearListener(FileSelectClearListener fileSelectClearListener) {
this.fileSelectClearListener = fileSelectClearListener; this.fileSelectClearListener = fileSelectClearListener;
} }
@@ -76,22 +96,54 @@ public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder
this.fileInformationShowListener = fileInformationShowListener; this.fileInformationShowListener = fileInformationShowListener;
} }
public interface FileInformationShowListener {
void onClickFileInformation(FileSelectBean fileSelectBean);
}
public interface FileSelectClearListener {
boolean onFileSelectClearListener(FileSelectBean fileSelectBean);
}
private class FileInformationClickListener implements View.OnClickListener { private class FileInformationClickListener implements View.OnClickListener {
private FileSelectBeen fileSelectBeen; private FileSelectBean fileSelectBean;
FileInformationClickListener(FileSelectBeen fileSelectBeen) { FileInformationClickListener(FileSelectBean fileSelectBean) {
this.fileSelectBeen = fileSelectBeen; this.fileSelectBean = fileSelectBean;
} }
@Override @Override
public void onClick(View view) { public void onClick(View view) {
fileInformationShowListener.onClickFileInformation(fileSelectBeen); fileInformationShowListener.onClickFileInformation(fileSelectBean);
} }
} }
public interface FileInformationShowListener { private class ContextMenuBuilder implements View.OnCreateContextMenuListener {
void onClickFileInformation(FileSelectBeen fileSelectBeen);
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;
}
};
}
} }

View File

@@ -25,14 +25,14 @@ import java.io.File;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
public class FileSelectBeen implements Serializable { public class FileSelectBean implements Serializable {
private String fileName; private String fileName;
private Uri fileUri; private Uri fileUri;
private Date lastModification; private Date lastModification;
private long size; private long size;
public FileSelectBeen(String pathFile) { public FileSelectBean(String pathFile) {
fileUri = Uri.parse(pathFile); fileUri = Uri.parse(pathFile);
File file= new File(fileUri.getPath()); File file= new File(fileUri.getPath());
fileName = file.getName(); fileName = file.getName();
@@ -40,6 +40,10 @@ public class FileSelectBeen implements Serializable {
size = file.getTotalSpace(); size = file.getTotalSpace();
} }
public boolean notFound() {
return getSize() == 0;
}
public String getFileName() { public String getFileName() {
return fileName; return fileName;
} }

View File

@@ -20,51 +20,22 @@
package com.keepassdroid.fileselect; package com.keepassdroid.fileselect;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.kunzisoft.keepass.R; import com.kunzisoft.keepass.R;
class FileSelectViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { class FileSelectViewHolder extends RecyclerView.ViewHolder {
private static final int MENU_CLEAR = 1;
View fileContainer;
TextView fileName; TextView fileName;
ImageView fileInformation; ImageView fileInformation;
private FileSelectClearListener fileSelectClearListener;
FileSelectViewHolder(View itemView) { FileSelectViewHolder(View itemView) {
super(itemView); super(itemView);
View fileContainer = itemView.findViewById(R.id.file_container); fileContainer = itemView.findViewById(R.id.file_container);
fileContainer.setOnCreateContextMenuListener(this);
fileName = (TextView) itemView.findViewById(R.id.file_filename); fileName = (TextView) itemView.findViewById(R.id.file_filename);
fileInformation = (ImageView) itemView.findViewById(R.id.file_information); 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);
}
} }

View File

@@ -17,26 +17,35 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>. 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:id="@+id/file_container"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"> 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.support.v7.widget.AppCompatImageView
android:id="@+id/file_information" android:id="@+id/file_information"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="18dp" android:padding="18dp"
android:src="@drawable/ic_info_white_24dp" android:src="@drawable/ic_info_white_24dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:tint="?attr/colorPrimary"/> android:tint="?attr/colorPrimary"/>
<android.support.v7.widget.AppCompatTextView </RelativeLayout>
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>

View File

@@ -29,8 +29,7 @@
android:layout_margin="8dp" android:layout_margin="8dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/entry_modified" android:text="@string/entry_modified"/>
style="@style/KeepassDXStyle.TextAppearance.Title"/>
<android.support.v7.widget.AppCompatTextView <android.support.v7.widget.AppCompatTextView
android:id="@+id/file_modification" android:id="@+id/file_modification"
android:layout_margin="8dp" android:layout_margin="8dp"
@@ -62,4 +61,12 @@
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" /> android:layout_alignParentEnd="true" />
</RelativeLayout> </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> </LinearLayout>

View File

@@ -230,6 +230,7 @@
<string name="path">Chemin</string> <string name="path">Chemin</string>
<string name="assign_master_key">Assigner une clé maître</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="create_keepass_file">Créer un fichier keepass</string>
<string name="bytes">Octets</string>
<string-array name="clipboard_timeout_options"> <string-array name="clipboard_timeout_options">
<item>30 secondes</item> <item>30 secondes</item>