diff --git a/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.java b/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.java index 204ebdfbba..35c37a13b5 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.java +++ b/app/src/main/java/com/amaze/filemanager/adapters/HiddenAdapter.java @@ -3,11 +3,13 @@ import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; -import androidx.recyclerview.widget.RecyclerView; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; - +import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.amaze.filemanager.R; import com.amaze.filemanager.activities.MainActivity; @@ -19,37 +21,43 @@ import com.amaze.filemanager.utils.DataUtils; import com.amaze.filemanager.utils.OpenMode; import com.amaze.filemanager.utils.files.FileUtils; - import java.io.File; import java.util.ArrayList; /** - * Created by Arpit on 16-11-2014 edited by Emmanuel Messulam + * This Adapter contains all logic related to showing the list of hidden files. + * + * Created by Arpit on 16-11-2014 edited by Emmanuel Messulam . + * + * @author Bowie Chen on 2019-10-26. + * @see com.amaze.filemanager.adapters.holders.HiddenViewHolder */ public class HiddenAdapter extends RecyclerView.Adapter { + private static final String TAG = "HiddenAdapter"; private SharedPreferences sharedPrefs; - private MainFragment context; - private Context c; - private ArrayList items; + private MainFragment mainFragment; + private Context context; + private ArrayList hiddenFiles; private MaterialDialog materialDialog; private boolean hide; private DataUtils dataUtils = DataUtils.getInstance(); public HiddenAdapter(Context context, MainFragment mainFrag, SharedPreferences sharedPreferences, - ArrayList items, MaterialDialog materialDialog, boolean hide) { - this.c = context; - this.context = mainFrag; + ArrayList hiddenFiles, MaterialDialog materialDialog, boolean hide) { + this.context = context; + this.mainFragment = mainFrag; sharedPrefs = sharedPreferences; - this.items = new ArrayList<>(items); + this.hiddenFiles = new ArrayList<>(hiddenFiles); this.hide = hide; this.materialDialog = materialDialog; } @Override - public HiddenViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater mInflater = (LayoutInflater) c + @NonNull + public HiddenViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater mInflater = (LayoutInflater) context .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View view = mInflater.inflate(R.layout.bookmarkrow, parent, false); @@ -57,43 +65,56 @@ public HiddenViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { } @Override + @SuppressWarnings("unchecked") // suppress varargs warnings public void onBindViewHolder(HiddenViewHolder holder, int position) { - HybridFile file = items.get(position); + HybridFile file = hiddenFiles.get(position); - holder.txtTitle.setText(file.getName()); - String a = file.getReadablePath(file.getPath()); - holder.txtDesc.setText(a); + holder.textTitle.setText(file.getName(context)); + holder.textDescription.setText(file.getReadablePath(file.getPath())); if (hide) { - holder.image.setVisibility(View.GONE); + holder.deleteButton.setVisibility(View.GONE); } - // TODO: move the listeners to the constructor - holder.image.setOnClickListener(view -> { - if (!file.isSmb() && file.isDirectory()) { - ArrayList a1 = new ArrayList<>(); - HybridFileParcelable baseFile = new HybridFileParcelable(items.get(position).getPath() + "/.nomedia"); - baseFile.setMode(OpenMode.FILE); - a1.add(baseFile); - new DeleteTask(c).execute((a1)); + holder.deleteButton.setOnClickListener(view -> { + // if the user taps on the delete button, un-hide the file. + // TODO: the "hide files" feature just hide files from view in Amaze and not create .nomedia + + if (!file.isSmb() && file.isDirectory(context)) { + HybridFileParcelable nomediaFile = new HybridFileParcelable( + hiddenFiles.get(position).getPath() + "/" + FileUtils.NOMEDIA_FILE); + nomediaFile.setMode(OpenMode.FILE); + + ArrayList filesToDelete = new ArrayList<>(); + filesToDelete.add(nomediaFile); + + DeleteTask task = new DeleteTask(context); + task.execute(filesToDelete); } - dataUtils.removeHiddenFile(items.get(position).getPath()); - items.remove(items.get(position)); + + dataUtils.removeHiddenFile(hiddenFiles.get(position).getPath()); + hiddenFiles.remove(hiddenFiles.get(position)); notifyDataSetChanged(); }); holder.row.setOnClickListener(view -> { + // if the user taps on the hidden file, take the user there. materialDialog.dismiss(); new Thread(() -> { - if (file.isDirectory()) { - context.getActivity().runOnUiThread(() -> { - context.loadlist(file.getPath(), false, OpenMode.UNKNOWN); - }); + FragmentActivity fragmentActivity = mainFragment.getActivity(); + if (fragmentActivity == null) { + // nullity check + return; + } + + if (file.isDirectory(context)) { + fragmentActivity.runOnUiThread( + () -> mainFragment.loadlist(file.getPath(), false, OpenMode.UNKNOWN)); + } else if (!file.isSmb()) { + fragmentActivity.runOnUiThread(() -> FileUtils + .openFile(new File(file.getPath()), (MainActivity) fragmentActivity, + sharedPrefs)); } else { - if (!file.isSmb()) { - context.getActivity().runOnUiThread(() -> { - FileUtils.openFile(new File(file.getPath()), (MainActivity) context.getActivity(), sharedPrefs); - }); - } + Log.w(TAG, "User tapped on a directory but conditions not met; nothing is done."); } }).start(); }); @@ -110,7 +131,7 @@ public long getItemId(int position) { @Override public int getItemCount() { - return items.size(); + return hiddenFiles.size(); } } diff --git a/app/src/main/java/com/amaze/filemanager/adapters/holders/HiddenViewHolder.java b/app/src/main/java/com/amaze/filemanager/adapters/holders/HiddenViewHolder.java index 2752414899..df8251f2ee 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/holders/HiddenViewHolder.java +++ b/app/src/main/java/com/amaze/filemanager/adapters/holders/HiddenViewHolder.java @@ -1,30 +1,33 @@ package com.amaze.filemanager.adapters.holders; -import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; - +import androidx.recyclerview.widget.RecyclerView; import com.amaze.filemanager.R; /** - * @author Emmanuel - * on 20/11/2017, at 18:38. + * This is the ViewHolder that formats the hidden files as defined in bookmarkrow.xml. + * + * @author Emmanuel on 20/11/2017, at 18:38. + * @author Bowie Chen on 2019-10-26. + * @see com.amaze.filemanager.adapters.HiddenAdapter */ public class HiddenViewHolder extends RecyclerView.ViewHolder { - public final ImageButton image; - public final TextView txtTitle; - public final TextView txtDesc; + + public final ImageButton deleteButton; + public final TextView textTitle; + public final TextView textDescription; public final LinearLayout row; public HiddenViewHolder(View view) { super(view); - txtTitle = view.findViewById(R.id.text1); - image = view.findViewById(R.id.delete_button); - txtDesc = view.findViewById(R.id.text2); + textTitle = view.findViewById(R.id.filename); + deleteButton = view.findViewById(R.id.delete_button); + textDescription = view.findViewById(R.id.file_path); row = view.findViewById(R.id.bookmarkrow); } diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java b/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java index 67d022d83d..30eb27fec0 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/GeneralDialogCreation.java @@ -1094,7 +1094,6 @@ public static void showHistoryDialog(final DataUtils dataUtils, SharedPreference a.onNegative((dialog, which) -> dataUtils.clearHistory()); a.theme(appTheme.getMaterialDialogTheme()); - a.autoDismiss(true); HiddenAdapter adapter = new HiddenAdapter(m.getActivity(), m, sharedPrefs, toHybridFileArrayList(dataUtils.getHistory()), null, true); a.adapter(adapter, null); @@ -1106,20 +1105,24 @@ public static void showHistoryDialog(final DataUtils dataUtils, SharedPreference public static void showHiddenDialog(DataUtils dataUtils, SharedPreferences sharedPrefs, final MainFragment m, AppTheme appTheme) { + if (m == null || m.getActivity() == null) { + return; + } + int accentColor = m.getMainActivity().getAccent(); - final MaterialDialog.Builder a = new MaterialDialog.Builder(m.getActivity()); - a.positiveText(R.string.cancel); - a.positiveColor(accentColor); - a.title(R.string.hiddenfiles); - a.theme(appTheme.getMaterialDialogTheme()); - a.autoDismiss(true); + final MaterialDialog.Builder builder = new MaterialDialog.Builder(m.getActivity()); + builder.positiveText(R.string.close); + builder.positiveColor(accentColor); + builder.title(R.string.hiddenfiles); + builder.theme(appTheme.getMaterialDialogTheme()); + builder.autoDismiss(true); HiddenAdapter adapter = new HiddenAdapter(m.getActivity(), m, sharedPrefs, FileUtils.toHybridFileConcurrentRadixTree(dataUtils.getHiddenFiles()), null, false); - a.adapter(adapter, null); - a.dividerColor(Color.GRAY); - MaterialDialog x = a.build(); - adapter.updateDialog(x); - x.show(); + builder.adapter(adapter, null); + builder.dividerColor(Color.GRAY); + MaterialDialog materialDialog = builder.build(); + adapter.updateDialog(materialDialog); + materialDialog.show(); } diff --git a/app/src/main/res/layout/bookmarkrow.xml b/app/src/main/res/layout/bookmarkrow.xml index c9a7055c9c..fd13aa2b5a 100644 --- a/app/src/main/res/layout/bookmarkrow.xml +++ b/app/src/main/res/layout/bookmarkrow.xml @@ -39,7 +39,7 @@ android:orientation="vertical" android:paddingLeft="10dip"> 請輸入壓縮檔的密碼。 不能開啟壓縮檔 \"%s\": %s 不能開啟壓縮檔 \"%s\"。可能是程式庫不支援此壓縮檔,或者壓縮檔真的壞掉了。 + 關閉 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 262db71fc0..7c467f0219 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -645,6 +645,7 @@ Cannot extract archive \"%s\": %s Cannot open archive \"%s\". Either we cannot open the archive, or the archive was damaged. + Close Bookmark exists Hide from media browsers