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

@ -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<String> included, ArrayList<String> 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
*/

@ -67,11 +67,11 @@ public class FolderPickerAdapter
/**
* 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'
*/
private ArrayList<String> mExcludedDirs;
private ArrayList<String> mExcludedDirs = new ArrayList<String>();
public FolderPickerAdapter(Context context, int resource) {
@ -162,9 +162,6 @@ public class FolderPickerAdapter
* @return list the checked list
*/
private ArrayList<String> verifyDirs(ArrayList<String> list) {
if (list == null)
return null;
ArrayList<String> result = new ArrayList<String>();
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);

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

@ -66,4 +66,27 @@ THE SOFTWARE.
android:choiceMode="none"
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>

@ -390,6 +390,7 @@ THE SOFTWARE.
<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_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 -->
<string name="hint_long_press_to_modify_folder">Long press to modify folder options</string>

@ -158,6 +158,15 @@ THE SOFTWARE.
<item>@string/fixed_info</item>
</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>