Add dropdown menu to menu folder picker

This commit is contained in:
Adrian Ulrich 2020-05-03 21:00:43 +02:00
parent d4159afcec
commit 621c917bf4
6 changed files with 100 additions and 20 deletions

View File

@ -33,13 +33,15 @@ import android.widget.Button;
import android.widget.ListView; import android.widget.ListView;
import android.widget.EditText; import android.widget.EditText;
import android.widget.Toast; import android.widget.Toast;
import android.widget.Spinner;
import com.mobeta.android.dslv.DragSortListView; import com.mobeta.android.dslv.DragSortListView;
public abstract class FolderPickerActivity extends Activity public abstract class FolderPickerActivity extends Activity
implements AdapterView.OnItemClickListener, implements AdapterView.OnItemClickListener,
AdapterView.OnItemLongClickListener AdapterView.OnItemLongClickListener,
AdapterView.OnItemSelectedListener
{ {
/** /**
@ -54,15 +56,14 @@ public abstract class FolderPickerActivity extends Activity
* Save button * Save button
*/ */
private Button mSaveButton; private Button mSaveButton;
/**
* Tristate spinner
*/
private Spinner mSpinner;
/** /**
* The array adapter of our listview * The array adapter of our listview
*/ */
private FolderPickerAdapter mListAdapter; private FolderPickerAdapter mListAdapter;
/**
* True if folder-tri-state selection mode
* is enabled
*/
private boolean mTritastic;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -75,6 +76,7 @@ public abstract class FolderPickerActivity extends Activity
mListView = (DragSortListView)findViewById(R.id.list); mListView = (DragSortListView)findViewById(R.id.list);
mPathDisplay = (EditText) findViewById(R.id.path_display); mPathDisplay = (EditText) findViewById(R.id.path_display);
mSaveButton = (Button) findViewById(R.id.save_button); mSaveButton = (Button) findViewById(R.id.save_button);
mSpinner = (Spinner) findViewById(R.id.folder_picker_spinner);
mListView.setAdapter(mListAdapter); mListView.setAdapter(mListAdapter);
mListView.setOnItemClickListener(this); mListView.setOnItemClickListener(this);
@ -82,8 +84,12 @@ public abstract class FolderPickerActivity extends Activity
mPathDisplay.addTextChangedListener(mTextWatcher); mPathDisplay.addTextChangedListener(mTextWatcher);
mSaveButton.setOnClickListener(mSaveButtonClickListener); mSaveButton.setOnClickListener(mSaveButtonClickListener);
mSpinner.setSelection(0);
mSpinner.setOnItemSelectedListener(this);
// init defaults // init defaults
enableTritasticSelect(false, null, null); enableTritasticSelect(false, null, null);
enableTritasticSpinner(false);
} }
/** /**
@ -134,14 +140,21 @@ public abstract class FolderPickerActivity extends Activity
* @param excluded initial list of excluded dirs * @param excluded initial list of excluded dirs
*/ */
public void enableTritasticSelect(boolean enabled, ArrayList<String> included, ArrayList<String> excluded) { public void enableTritasticSelect(boolean enabled, ArrayList<String> included, ArrayList<String> excluded) {
mTritastic = enabled; if (enabled) {
mListAdapter.setIncludedDirs(enabled ? included : null); Toast.makeText(this, R.string.hint_long_press_to_modify_folder, Toast.LENGTH_SHORT).show();
mListAdapter.setExcludedDirs(enabled ? excluded : null); mListAdapter.setIncludedDirs(included);
mListAdapter.setExcludedDirs(excluded);
}
mListView.setOnItemLongClickListener(enabled ? this : null); mListView.setOnItemLongClickListener(enabled ? this : null);
mSaveButton.setText(enabled ? R.string.save : R.string.select); 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) { void setCurrentDir(File dir) {
mSaveButton.setEnabled(dir.isDirectory()); mSaveButton.setEnabled(dir.isDirectory());
mSpinner.setEnabled(dir.isDirectory());
mListAdapter.setCurrentDir(dir); mListAdapter.setCurrentDir(dir);
mListView.setSelectionFromTop(0, 0); mListView.setSelectionFromTop(0, 0);
@ -163,6 +177,15 @@ public abstract class FolderPickerActivity extends Activity
final String label = dir.getAbsolutePath(); final String label = dir.getAbsolutePath();
mPathDisplay.setText(label); mPathDisplay.setText(label);
mPathDisplay.setSelection(label.length()); 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 * Called if user taps a row
*/ */

View File

@ -67,11 +67,11 @@ public class FolderPickerAdapter
/** /**
* A list of paths marked as 'included' * A list of paths marked as 'included'
*/ */
private ArrayList<String> mIncludedDirs; private ArrayList<String> mIncludedDirs = new ArrayList<String>();
/** /**
* A list of paths marked as 'excluded' * A list of paths marked as 'excluded'
*/ */
private ArrayList<String> mExcludedDirs; private ArrayList<String> mExcludedDirs = new ArrayList<String>();
public FolderPickerAdapter(Context context, int resource) { public FolderPickerAdapter(Context context, int resource) {
@ -162,9 +162,6 @@ public class FolderPickerAdapter
* @return list the checked list * @return list the checked list
*/ */
private ArrayList<String> verifyDirs(ArrayList<String> list) { private ArrayList<String> verifyDirs(ArrayList<String> list) {
if (list == null)
return null;
ArrayList<String> result = new ArrayList<String>(); ArrayList<String> result = new ArrayList<String>();
for (String path : list) { for (String path : list) {
File file = new File(path); File file = new File(path);
@ -200,9 +197,9 @@ public class FolderPickerAdapter
for(File fentry: dirs) { for(File fentry: dirs) {
if(fentry.isDirectory()) { if(fentry.isDirectory()) {
int color = 0; int color = 0;
if (mIncludedDirs != null && mIncludedDirs.contains(fentry.getAbsolutePath())) if (mIncludedDirs.contains(fentry.getAbsolutePath()))
color = 0xff00c853; color = 0xff00c853;
if (mExcludedDirs != null && mExcludedDirs.contains(fentry.getAbsolutePath())) if (mExcludedDirs.contains(fentry.getAbsolutePath()))
color = 0xffd50000; color = 0xffd50000;
Item item = new Item(fentry.getName(), fentry, color); Item item = new Item(fentry.getName(), fentry, color);
add(item); add(item);

View File

@ -38,9 +38,11 @@ public class MediaFoldersSelectionActivity extends FolderPickerActivity {
MediaLibrary.Preferences prefs = MediaLibrary.getPreferences(this); MediaLibrary.Preferences prefs = MediaLibrary.getPreferences(this);
File startPath = FileUtils.getFilesystemBrowseStart(this); File startPath = FileUtils.getFilesystemBrowseStart(this);
// Make sure that we display the current selection // Setup UI and enable tritastic options.
setCurrentDir(startPath);
enableTritasticSelect(true, prefs.mediaFolders, prefs.blacklistedFolders); enableTritasticSelect(true, prefs.mediaFolders, prefs.blacklistedFolders);
enableTritasticSpinner(true);
// ...and jump to the folder.
setCurrentDir(startPath);
} }

View File

@ -66,4 +66,27 @@ THE SOFTWARE.
android:choiceMode="none" android:choiceMode="none"
dslv:drag_enabled="false" /> dslv:drag_enabled="false" />
<LinearLayout
android:id="@+id/folder_picker_spinner_container"
android:visibility="gone"
android:layout_width="fill_parent"
android:layout_height="@dimen/cover_size"
android:gravity="center_vertical"
android:orientation="horizontal" >
<TextView
android:text="@string/folder_picker_spinner_desc"
android:textColor="?overlay_foreground_color"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginLeft="@dimen/text_padding"
/>
<Spinner
android:id="@+id/folder_picker_spinner"
android:entries="@array/folder_picker_spinner_entries"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -390,6 +390,7 @@ THE SOFTWARE.
<string name="media_scan_preferences">Scanner options</string> <string name="media_scan_preferences">Scanner options</string>
<string name="media_scan_preferences_change_title">Scanner options changed</string> <string name="media_scan_preferences_change_title">Scanner options changed</string>
<string name="media_scan_preferences_change_message">Changing this option will start a full rescan of your library. Would you like to continue?</string> <string name="media_scan_preferences_change_message">Changing this option will start a full rescan of your library. Would you like to continue?</string>
<string name="folder_picker_spinner_desc">Status of Directory:</string>
<!-- Folder selector --> <!-- Folder selector -->
<string name="hint_long_press_to_modify_folder">Long press to modify folder options</string> <string name="hint_long_press_to_modify_folder">Long press to modify folder options</string>

View File

@ -158,6 +158,15 @@ THE SOFTWARE.
<item>@string/fixed_info</item> <item>@string/fixed_info</item>
</string-array> </string-array>
<!-- START folder_picker_spinner -->
<string-array name="folder_picker_spinner_entries">
<item>@string/folder_include</item>
<item>@string/folder_exclude</item>
<item>@string/folder_neutral</item>
</string-array>
<!-- END folder_picker_spinner -->
<string name="empty"></string> <string name="empty"></string>