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;
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;
}

View File

@@ -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);
}
}

View File

@@ -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() {

View File

@@ -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;
}
};
}
}

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>