From 621c917bf4b9dcefcd55fe61d34d58404a94582a Mon Sep 17 00:00:00 2001 From: Adrian Ulrich Date: Sun, 3 May 2020 21:00:43 +0200 Subject: [PATCH] Add dropdown menu to menu folder picker --- .../android/vanilla/FolderPickerActivity.java | 70 ++++++++++++++++--- .../android/vanilla/FolderPickerAdapter.java | 11 ++- .../MediaFoldersSelectionActivity.java | 6 +- .../main/res/layout/folderpicker_content.xml | 23 ++++++ app/src/main/res/values/translatable.xml | 1 + app/src/main/res/values/untranslatable.xml | 9 +++ 6 files changed, 100 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerActivity.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerActivity.java index eb22f972..b8e37737 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerActivity.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerActivity.java @@ -33,13 +33,15 @@ import android.widget.Button; import android.widget.ListView; import android.widget.EditText; import android.widget.Toast; +import android.widget.Spinner; import com.mobeta.android.dslv.DragSortListView; public abstract class FolderPickerActivity extends Activity implements AdapterView.OnItemClickListener, - AdapterView.OnItemLongClickListener + AdapterView.OnItemLongClickListener, + AdapterView.OnItemSelectedListener { /** @@ -54,15 +56,14 @@ public abstract class FolderPickerActivity extends Activity * Save button */ private Button mSaveButton; + /** + * Tristate spinner + */ + private Spinner mSpinner; /** * The array adapter of our listview */ private FolderPickerAdapter mListAdapter; - /** - * True if folder-tri-state selection mode - * is enabled - */ - private boolean mTritastic; @Override public void onCreate(Bundle savedInstanceState) { @@ -75,6 +76,7 @@ public abstract class FolderPickerActivity extends Activity mListView = (DragSortListView)findViewById(R.id.list); mPathDisplay = (EditText) findViewById(R.id.path_display); mSaveButton = (Button) findViewById(R.id.save_button); + mSpinner = (Spinner) findViewById(R.id.folder_picker_spinner); mListView.setAdapter(mListAdapter); mListView.setOnItemClickListener(this); @@ -82,8 +84,12 @@ public abstract class FolderPickerActivity extends Activity mPathDisplay.addTextChangedListener(mTextWatcher); mSaveButton.setOnClickListener(mSaveButtonClickListener); + mSpinner.setSelection(0); + mSpinner.setOnItemSelectedListener(this); + // init defaults enableTritasticSelect(false, null, null); + enableTritasticSpinner(false); } /** @@ -134,14 +140,21 @@ public abstract class FolderPickerActivity extends Activity * @param excluded initial list of excluded dirs */ public void enableTritasticSelect(boolean enabled, ArrayList included, ArrayList excluded) { - mTritastic = enabled; - mListAdapter.setIncludedDirs(enabled ? included : null); - mListAdapter.setExcludedDirs(enabled ? excluded : null); + if (enabled) { + Toast.makeText(this, R.string.hint_long_press_to_modify_folder, Toast.LENGTH_SHORT).show(); + mListAdapter.setIncludedDirs(included); + mListAdapter.setExcludedDirs(excluded); + } mListView.setOnItemLongClickListener(enabled ? this : null); mSaveButton.setText(enabled ? R.string.save : R.string.select); + } - if (enabled) - Toast.makeText(this, R.string.hint_long_press_to_modify_folder, Toast.LENGTH_SHORT).show(); + /** + * Whether or not to enable the tristate spinner. + */ + public void enableTritasticSpinner(boolean enabled) { + View view = findViewById(R.id.folder_picker_spinner_container); + view.setVisibility(enabled ? View.VISIBLE : View.GONE); } /** @@ -151,6 +164,7 @@ public abstract class FolderPickerActivity extends Activity */ void setCurrentDir(File dir) { mSaveButton.setEnabled(dir.isDirectory()); + mSpinner.setEnabled(dir.isDirectory()); mListAdapter.setCurrentDir(dir); mListView.setSelectionFromTop(0, 0); @@ -163,6 +177,15 @@ public abstract class FolderPickerActivity extends Activity final String label = dir.getAbsolutePath(); mPathDisplay.setText(label); mPathDisplay.setSelection(label.length()); + + // Since the folder changed, also update the spinner state. + if (mListAdapter.getIncludedDirs().contains(label)) { + mSpinner.setSelection(0); + } else if (mListAdapter.getExcludedDirs().contains(label)) { + mSpinner.setSelection(1); + } else { + mSpinner.setSelection(2); + } } } @@ -185,6 +208,31 @@ public abstract class FolderPickerActivity extends Activity } } + /** + * Called if user interacts with the spinner. + */ + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + FolderState state = FolderState.NEUTRAL; + switch(position) { + case 0: + state = FolderState.INCLUDE; + break; + case 1: + state = FolderState.EXCLUDE; + break; + } + setFolderState(mListAdapter.getCurrentDir().getAbsolutePath(), state); + } + + /** + * Called if user dismisses the spinner. + */ + @Override + public void onNothingSelected(AdapterView parent) { + // noop. + } + /** * Called if user taps a row */ diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerAdapter.java b/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerAdapter.java index 3f4a2046..2992e8ce 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerAdapter.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/FolderPickerAdapter.java @@ -67,11 +67,11 @@ public class FolderPickerAdapter /** * A list of paths marked as 'included' */ - private ArrayList mIncludedDirs; + private ArrayList mIncludedDirs = new ArrayList(); /** * A list of paths marked as 'excluded' */ - private ArrayList mExcludedDirs; + private ArrayList mExcludedDirs = new ArrayList(); public FolderPickerAdapter(Context context, int resource) { @@ -162,9 +162,6 @@ public class FolderPickerAdapter * @return list the checked list */ private ArrayList verifyDirs(ArrayList list) { - if (list == null) - return null; - ArrayList result = new ArrayList(); for (String path : list) { File file = new File(path); @@ -200,9 +197,9 @@ public class FolderPickerAdapter for(File fentry: dirs) { if(fentry.isDirectory()) { int color = 0; - if (mIncludedDirs != null && mIncludedDirs.contains(fentry.getAbsolutePath())) + if (mIncludedDirs.contains(fentry.getAbsolutePath())) color = 0xff00c853; - if (mExcludedDirs != null && mExcludedDirs.contains(fentry.getAbsolutePath())) + if (mExcludedDirs.contains(fentry.getAbsolutePath())) color = 0xffd50000; Item item = new Item(fentry.getName(), fentry, color); add(item); diff --git a/app/src/main/java/ch/blinkenlights/android/vanilla/MediaFoldersSelectionActivity.java b/app/src/main/java/ch/blinkenlights/android/vanilla/MediaFoldersSelectionActivity.java index ddb43b5f..5d04280e 100644 --- a/app/src/main/java/ch/blinkenlights/android/vanilla/MediaFoldersSelectionActivity.java +++ b/app/src/main/java/ch/blinkenlights/android/vanilla/MediaFoldersSelectionActivity.java @@ -38,9 +38,11 @@ public class MediaFoldersSelectionActivity extends FolderPickerActivity { MediaLibrary.Preferences prefs = MediaLibrary.getPreferences(this); File startPath = FileUtils.getFilesystemBrowseStart(this); - // Make sure that we display the current selection - setCurrentDir(startPath); + // Setup UI and enable tritastic options. enableTritasticSelect(true, prefs.mediaFolders, prefs.blacklistedFolders); + enableTritasticSpinner(true); + // ...and jump to the folder. + setCurrentDir(startPath); } diff --git a/app/src/main/res/layout/folderpicker_content.xml b/app/src/main/res/layout/folderpicker_content.xml index 800be47a..a60e27f3 100644 --- a/app/src/main/res/layout/folderpicker_content.xml +++ b/app/src/main/res/layout/folderpicker_content.xml @@ -66,4 +66,27 @@ THE SOFTWARE. android:choiceMode="none" dslv:drag_enabled="false" /> + + + + + diff --git a/app/src/main/res/values/translatable.xml b/app/src/main/res/values/translatable.xml index 871918c0..9e6be0ec 100644 --- a/app/src/main/res/values/translatable.xml +++ b/app/src/main/res/values/translatable.xml @@ -390,6 +390,7 @@ THE SOFTWARE. Scanner options Scanner options changed Changing this option will start a full rescan of your library. Would you like to continue? + Status of Directory: Long press to modify folder options diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml index 03ecafcb..a5803776 100644 --- a/app/src/main/res/values/untranslatable.xml +++ b/app/src/main/res/values/untranslatable.xml @@ -158,6 +158,15 @@ THE SOFTWARE. @string/fixed_info + + + + @string/folder_include + @string/folder_exclude + @string/folder_neutral + + +