New options to sort movies and tv shows: name or date added

Ignore prefixes on movies and tv shows is now an option in the list menu
Set lint to not complain about missing translations
Started moving things out of Settings.java and into SharedPreferences
This commit is contained in:
Synced Synapse 2015-02-01 15:00:12 +00:00
parent 30b1c117d3
commit 3fe5594f91
10 changed files with 236 additions and 74 deletions

View File

@ -39,6 +39,11 @@ android {
}
}
lintOptions {
// Too much trouble keeping all translations in sync
disable 'MissingTranslation'
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'

View File

@ -41,16 +41,14 @@ public class Settings {
// Tags to save the values
private static final String CURRENT_HOST_ID = "CURRENT_HOST_ID";
private static final String MAX_CAST_PICTURES = "MAX_CAST_PICTURES";
private static final String MOVIES_FILTER_HIDE_WATCHED = "MOVIES_FILTER_HIDE_WATCHED";
private static final String TVSHOWS_FILTER_HIDE_WATCHED = "TVSHOWS_FILTER_HIDE_WATCHED";
private static final String TVSHOW_EPISODES_FILTER_HIDE_WATCHED = "TVSHOW_EPISODES_FILTER_HIDE_WATCHED";
private static final String SHOW_THANKS_FOR_COFFEE_MESSAGE = "SHOW_THANKS_FOR_COFFEE_MESSAGE";
private static final String HAS_BOUGHT_COFFEE = "HAS_BOUGHT_COFFEE";
// Default values
private static final int DEFAULT_MAX_CAST_PICTURES = 12;
// Maximum pictures to show on cast list (-1 to show all)
public static final int DEFAULT_MAX_CAST_PICTURES = 12;
/**
* Default Shared Preferences keys.
@ -63,8 +61,36 @@ public class Settings {
public static final String KEY_PREF_ABOUT = "pref_about";
public static final String KEY_PREF_COFFEE = "pref_coffee";
// Filter watched movies on movie list
public static final String KEY_PREF_MOVIES_FILTER_HIDE_WATCHED = "movies_filter_hide_watched";
// Sort order on movies
public static final String KEY_PREF_MOVIES_SORT_ORDER = "movies_sort_order";
// Ignore articles on movie sorting
public static final String KEY_PREF_MOVIES_IGNORE_PREFIXES = "movies_ignore_prefixes";
// Filter watched tv shows on tvshow list
public static final String KEY_PREF_TVSHOWS_FILTER_HIDE_WATCHED = "tvshows_filter_hide_watched";
public static final String KEY_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED = "tvshow_episodes_filter_hide_watched";
// Sort order on tv shows
public static final String KEY_PREF_TVSHOWS_SORT_ORDER = "tvshows_sort_order";
// Ignore articles on tv show sorting
public static final String KEY_PREF_TVSHOWS_IGNORE_PREFIXES = "tvshows_ignore_prefixes";
// Defaults for the preferences
public static final String DEFAULT_PREF_THEME = "0";
public static final boolean DEFAULT_PREF_SWITCH_TO_REMOTE_AFTER_MEDIA_START = true;
public static final boolean DEFAULT_PREF_MOVIES_FILTER_HIDE_WATCHED = false;
public static final boolean DEFAULT_PREF_TVSHOWS_FILTER_HIDE_WATCHED = false;
public static final boolean DEFAULT_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED = false;
// Sort orders
public static final int SORT_BY_NAME = 0,
SORT_BY_DATE_ADDED = 1;
public static final int DEFAULT_PREF_MOVIES_SORT_ORDER = SORT_BY_NAME;
public static final int DEFAULT_PREF_TVSHOWS_SORT_ORDER = SORT_BY_NAME;
public static final boolean DEFAULT_PREF_MOVIES_IGNORE_PREFIXES = false;
public static final boolean DEFAULT_PREF_TVSHOWS_IGNORE_PREFIXES = false;
// Singleton instance
@ -75,22 +101,6 @@ public class Settings {
* Current saved host id
*/
public int currentHostId;
/**
* Maximum pictures to show on cast list (-1 to show all)
*/
public int maxCastPictures;
/**
* Filter watched movies on movie list
*/
public boolean moviesFilterHideWatched;
/**
* Filter watched tv shows on list (all episodes)
*/
public boolean tvshowsFilterHideWatched;
/**
* Filter watched episodes of a tv shows on list
*/
public boolean tvshowEpisodesFilterHideWatched;
/**
* Show the thanks for coffee message
@ -112,11 +122,6 @@ public class Settings {
SharedPreferences preferences = context.getSharedPreferences(SETTINGS_KEY, Context.MODE_PRIVATE);
currentHostId = preferences.getInt(CURRENT_HOST_ID, -1);
maxCastPictures = preferences.getInt(MAX_CAST_PICTURES, DEFAULT_MAX_CAST_PICTURES);
// maxCastPictures = 12;
moviesFilterHideWatched = preferences.getBoolean(MOVIES_FILTER_HIDE_WATCHED, false);
tvshowsFilterHideWatched = preferences.getBoolean(TVSHOWS_FILTER_HIDE_WATCHED, false);
tvshowEpisodesFilterHideWatched = preferences.getBoolean(TVSHOW_EPISODES_FILTER_HIDE_WATCHED, false);
showThanksForCofeeMessage = preferences.getBoolean(SHOW_THANKS_FOR_COFFEE_MESSAGE, true);
hasBoughtCoffee = preferences.getBoolean(HAS_BOUGHT_COFFEE, false);
}
@ -140,10 +145,6 @@ public class Settings {
SharedPreferences.Editor editor = preferences.edit();
editor.putInt(CURRENT_HOST_ID, currentHostId);
editor.putInt(MAX_CAST_PICTURES, maxCastPictures);
editor.putBoolean(MOVIES_FILTER_HIDE_WATCHED, moviesFilterHideWatched);
editor.putBoolean(TVSHOWS_FILTER_HIDE_WATCHED, tvshowsFilterHideWatched);
editor.putBoolean(TVSHOW_EPISODES_FILTER_HIDE_WATCHED, tvshowEpisodesFilterHideWatched);
editor.putBoolean(SHOW_THANKS_FOR_COFFEE_MESSAGE, showThanksForCofeeMessage);
editor.putBoolean(HAS_BOUGHT_COFFEE, hasBoughtCoffee);
editor.apply();

View File

@ -18,10 +18,12 @@ package com.syncedsynapse.kore2.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
@ -180,24 +182,58 @@ public class MovieListFragment extends Fragment
searchView.setQueryHint(getString(R.string.action_search_movies));
// Setup filters
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched);
Settings settings = Settings.getInstance(getActivity());
hideWatched.setChecked(settings.moviesFilterHideWatched);
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
ignoreArticles = menu.findItem(R.id.action_ignore_prefixes),
sortByName = menu.findItem(R.id.action_sort_by_name),
sortByDateAdded = menu.findItem(R.id.action_sort_by_date_added);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
hideWatched.setChecked(preferences.getBoolean(Settings.KEY_PREF_MOVIES_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_MOVIES_FILTER_HIDE_WATCHED));
ignoreArticles.setChecked(preferences.getBoolean(Settings.KEY_PREF_MOVIES_IGNORE_PREFIXES, Settings.DEFAULT_PREF_MOVIES_IGNORE_PREFIXES));
int sortOrder = preferences.getInt(Settings.KEY_PREF_MOVIES_SORT_ORDER, Settings.DEFAULT_PREF_MOVIES_SORT_ORDER);
switch (sortOrder) {
case Settings.SORT_BY_DATE_ADDED:
sortByDateAdded.setChecked(true);
break;
default:
sortByName.setChecked(true);
break;
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
switch (item.getItemId()) {
case R.id.action_hide_watched:
if (item.isChecked())
item.setChecked(false);
else
item.setChecked(true);
Settings settings = Settings.getInstance(getActivity());
settings.moviesFilterHideWatched = item.isChecked();
settings.save();
item.setChecked(!item.isChecked());
preferences.edit()
.putBoolean(Settings.KEY_PREF_MOVIES_FILTER_HIDE_WATCHED, item.isChecked())
.apply();
getLoaderManager().restartLoader(LOADER_MOVIES, null, this);
break;
case R.id.action_ignore_prefixes:
item.setChecked(!item.isChecked());
preferences.edit()
.putBoolean(Settings.KEY_PREF_MOVIES_IGNORE_PREFIXES, item.isChecked())
.apply();
getLoaderManager().restartLoader(LOADER_MOVIES, null, this);
break;
case R.id.action_sort_by_name:
item.setChecked(true);
preferences.edit()
.putInt(Settings.KEY_PREF_MOVIES_SORT_ORDER, Settings.SORT_BY_NAME)
.apply();
getLoaderManager().restartLoader(LOADER_MOVIES, null, this);
break;
case R.id.action_sort_by_date_added:
item.setChecked(true);
preferences.edit()
.putInt(Settings.KEY_PREF_MOVIES_SORT_ORDER, Settings.SORT_BY_DATE_ADDED)
.apply();
getLoaderManager().restartLoader(LOADER_MOVIES, null, this);
break;
default:
@ -294,16 +330,29 @@ public class MovieListFragment extends Fragment
selectionArgs = new String[] {"%" + searchFilter + "%"};
}
Settings settings = Settings.getInstance(getActivity());
if (settings.moviesFilterHideWatched) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (preferences.getBoolean(Settings.KEY_PREF_MOVIES_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_MOVIES_FILTER_HIDE_WATCHED)) {
if (selection.length() != 0)
selection.append(" AND ");
selection.append(MediaContract.MoviesColumns.PLAYCOUNT)
.append("=0");
}
String sortOrderStr;
int sortOrder = preferences.getInt(Settings.KEY_PREF_MOVIES_SORT_ORDER, Settings.DEFAULT_PREF_MOVIES_SORT_ORDER);
if (sortOrder == Settings.SORT_BY_DATE_ADDED) {
sortOrderStr = MovieListQuery.SORT_BY_DATE_ADDED;
} else {
// Sort by name
if (preferences.getBoolean(Settings.KEY_PREF_MOVIES_IGNORE_PREFIXES, Settings.DEFAULT_PREF_MOVIES_IGNORE_PREFIXES)) {
sortOrderStr = MovieListQuery.SORT_BY_NAME_IGNORE_ARTICLES;
} else {
sortOrderStr = MovieListQuery.SORT_BY_NAME;
}
}
return new CursorLoader(getActivity(), uri,
MovieListQuery.PROJECTION, selection.toString(), selectionArgs, MovieListQuery.SORT);
MovieListQuery.PROJECTION, selection.toString(), selectionArgs, sortOrderStr);
}
/** {@inheritDoc} */
@ -336,7 +385,9 @@ public class MovieListFragment extends Fragment
MediaContract.Movies.TAGLINE,
};
String SORT = MediaDatabase.sortCommonTokens(MediaContract.Movies.TITLE) + " ASC";
String SORT_BY_NAME = MediaContract.Movies.TITLE + " ASC";
String SORT_BY_DATE_ADDED = MediaContract.Movies.DATEADDED + " DESC";
String SORT_BY_NAME_IGNORE_ARTICLES = MediaDatabase.sortCommonTokens(MediaContract.Movies.TITLE) + " ASC";
final int ID = 0;
final int MOVIEID = 1;

View File

@ -296,7 +296,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment
// case LOADER_CAST:
// uri = MediaContract.MovieCast.buildMovieCastListUri(hostInfo.getId(), episodeId);
// return new CursorLoader(getActivity(), uri,
// MovieCastListQuery.PROJECTION, null, null, MovieCastListQuery.SORT);
// MovieCastListQuery.PROJECTION, null, null, MovieCastListQuery.SORT_BY_NAME_IGNORE_ARTICLES);
default:
return null;
}
@ -645,7 +645,7 @@ public class TVShowEpisodeDetailsFragment extends Fragment
// MediaContract.MovieCast.THUMBNAIL,
// };
//
// String SORT = MediaContract.MovieCast.ORDER + " ASC";
// String SORT_BY_NAME_IGNORE_ARTICLES = MediaContract.MovieCast.ORDER + " ASC";
//
// final int ID = 0;
// final int NAME = 1;

View File

@ -18,11 +18,13 @@ package com.syncedsynapse.kore2.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
@ -193,9 +195,9 @@ public class TVShowEpisodeListFragment extends Fragment
inflater.inflate(R.menu.tvshow_episode_list, menu);
// Setup filters
Settings settings = Settings.getInstance(getActivity());
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
menu.findItem(R.id.action_hide_watched)
.setChecked(settings.tvshowEpisodesFilterHideWatched);
.setChecked(preferences.getBoolean(Settings.KEY_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED));
super.onCreateOptionsMenu(menu, inflater);
}
@ -204,13 +206,11 @@ public class TVShowEpisodeListFragment extends Fragment
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_hide_watched:
if (item.isChecked())
item.setChecked(false);
else
item.setChecked(true);
Settings settings = Settings.getInstance(getActivity());
settings.tvshowEpisodesFilterHideWatched = item.isChecked();
settings.save();
item.setChecked(!item.isChecked());
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
preferences.edit()
.putBoolean(Settings.KEY_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED, item.isChecked())
.apply();
getLoaderManager().restartLoader(LOADER_SEASONS, null, this);
break;
default:
@ -288,14 +288,16 @@ public class TVShowEpisodeListFragment extends Fragment
Uri uri;
StringBuilder selection = new StringBuilder();
Settings settings = Settings.getInstance(getActivity());
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean tvshowEpisodesFilterHideWatched =
preferences.getBoolean(Settings.KEY_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_TVSHOW_EPISODES_FILTER_HIDE_WATCHED);
switch (id) {
case LOADER_SEASONS:
// Load seasons
uri = MediaContract.Seasons.buildTVShowSeasonsListUri(hostInfo.getId(), tvshowId);
// Filters
if (settings.tvshowEpisodesFilterHideWatched) {
if (tvshowEpisodesFilterHideWatched) {
selection.append(MediaContract.SeasonsColumns.WATCHEDEPISODES)
.append("!=")
.append(MediaContract.SeasonsColumns.EPISODE);
@ -309,7 +311,7 @@ public class TVShowEpisodeListFragment extends Fragment
uri = MediaContract.Episodes.buildTVShowSeasonEpisodesListUri(hostInfo.getId(), tvshowId, season);
// Filters
if (settings.tvshowEpisodesFilterHideWatched) {
if (tvshowEpisodesFilterHideWatched) {
selection.append(MediaContract.EpisodesColumns.PLAYCOUNT)
.append("=0");
}

View File

@ -18,10 +18,12 @@ package com.syncedsynapse.kore2.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.BaseColumns;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
@ -177,24 +179,58 @@ public class TVShowListFragment extends Fragment
searchView.setQueryHint(getString(R.string.action_search_tvshows));
// Setup filters
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched);
Settings settings = Settings.getInstance(getActivity());
hideWatched.setChecked(settings.tvshowsFilterHideWatched);
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
ignoreArticles = menu.findItem(R.id.action_ignore_prefixes),
sortByName = menu.findItem(R.id.action_sort_by_name),
sortByDateAdded = menu.findItem(R.id.action_sort_by_date_added);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
hideWatched.setChecked(preferences.getBoolean(Settings.KEY_PREF_TVSHOWS_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_TVSHOWS_FILTER_HIDE_WATCHED));
ignoreArticles.setChecked(preferences.getBoolean(Settings.KEY_PREF_TVSHOWS_IGNORE_PREFIXES, Settings.DEFAULT_PREF_TVSHOWS_IGNORE_PREFIXES));
int sortOrder = preferences.getInt(Settings.KEY_PREF_TVSHOWS_SORT_ORDER, Settings.DEFAULT_PREF_TVSHOWS_SORT_ORDER);
switch (sortOrder) {
case Settings.SORT_BY_DATE_ADDED:
sortByDateAdded.setChecked(true);
break;
default:
sortByName.setChecked(true);
break;
}
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
switch (item.getItemId()) {
case R.id.action_hide_watched:
if (item.isChecked())
item.setChecked(false);
else
item.setChecked(true);
Settings settings = Settings.getInstance(getActivity());
settings.tvshowsFilterHideWatched = item.isChecked();
settings.save();
item.setChecked(!item.isChecked());
preferences.edit()
.putBoolean(Settings.KEY_PREF_TVSHOWS_FILTER_HIDE_WATCHED, item.isChecked())
.apply();
getLoaderManager().restartLoader(LOADER_TVSHOWS, null, this);
break;
case R.id.action_ignore_prefixes:
item.setChecked(!item.isChecked());
preferences.edit()
.putBoolean(Settings.KEY_PREF_TVSHOWS_IGNORE_PREFIXES, item.isChecked())
.apply();
getLoaderManager().restartLoader(LOADER_TVSHOWS, null, this);
break;
case R.id.action_sort_by_name:
item.setChecked(true);
preferences.edit()
.putInt(Settings.KEY_PREF_TVSHOWS_SORT_ORDER, Settings.SORT_BY_NAME)
.apply();
getLoaderManager().restartLoader(LOADER_TVSHOWS, null, this);
break;
case R.id.action_sort_by_date_added:
item.setChecked(true);
preferences.edit()
.putInt(Settings.KEY_PREF_TVSHOWS_SORT_ORDER, Settings.SORT_BY_DATE_ADDED)
.apply();
getLoaderManager().restartLoader(LOADER_TVSHOWS, null, this);
break;
default:
@ -288,8 +324,8 @@ public class TVShowListFragment extends Fragment
}
// Filters
Settings settings = Settings.getInstance(getActivity());
if (settings.tvshowsFilterHideWatched) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (preferences.getBoolean(Settings.KEY_PREF_TVSHOWS_FILTER_HIDE_WATCHED, Settings.DEFAULT_PREF_TVSHOWS_FILTER_HIDE_WATCHED)) {
if (selection.length() != 0)
selection.append(" AND ");
selection.append(MediaContract.TVShowsColumns.WATCHEDEPISODES)
@ -297,9 +333,23 @@ public class TVShowListFragment extends Fragment
.append(MediaContract.TVShowsColumns.EPISODE);
}
String sortOrderStr;
int sortOrder = preferences.getInt(Settings.KEY_PREF_TVSHOWS_SORT_ORDER, Settings.DEFAULT_PREF_TVSHOWS_SORT_ORDER);
if (sortOrder == Settings.SORT_BY_DATE_ADDED) {
sortOrderStr = TVShowListQuery.SORT_BY_DATE_ADDED;
} else {
// Sort by name
if (preferences.getBoolean(Settings.KEY_PREF_TVSHOWS_IGNORE_PREFIXES, Settings.DEFAULT_PREF_TVSHOWS_IGNORE_PREFIXES)) {
sortOrderStr = TVShowListQuery.SORT_BY_NAME_IGNORE_ARTICLES;
} else {
sortOrderStr = TVShowListQuery.SORT_BY_NAME;
}
}
return new CursorLoader(getActivity(), uri,
TVShowListQuery.PROJECTION, selection.toString(),
selectionArgs, TVShowListQuery.SORT);
selectionArgs, sortOrderStr);
}
/** {@inheritDoc} */
@ -330,7 +380,9 @@ public class TVShowListFragment extends Fragment
MediaContract.TVShows.WATCHEDEPISODES,
};
String SORT = MediaDatabase.sortCommonTokens(MediaContract.TVShows.TITLE) + " ASC";
String SORT_BY_NAME = MediaContract.TVShows.TITLE + " ASC";
String SORT_BY_DATE_ADDED = MediaContract.TVShows.DATEADDED + " DESC";
String SORT_BY_NAME_IGNORE_ARTICLES = MediaDatabase.sortCommonTokens(MediaContract.TVShows.TITLE) + " ASC";
final int ID = 0;
final int TVSHOWID = 1;

View File

@ -17,7 +17,6 @@ package com.syncedsynapse.kore2.utils;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@ -223,7 +222,7 @@ public class UIUtils {
int imageHeight = (int)(imageWidth * 1.2);
List<VideoType.Cast> noPicturesCastList = new ArrayList<VideoType.Cast>();
int maxCastPictures = Settings.getInstance(context).maxCastPictures;
int maxCastPictures = Settings.DEFAULT_MAX_CAST_PICTURES;
int currentPictureNumber = 0;
for (int i = 0; i < castList.size(); i++) {
VideoType.Cast actor = castList.get(i);

View File

@ -24,8 +24,32 @@
android:queryHint="@string/action_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"/>
<item
android:title="@string/sort_order"
app:showAsAction="never">
<menu>
<group
android:checkableBehavior="single">
<item
android:id="@+id/action_sort_by_name"
android:title="@string/sort_by_name"
app:showAsAction="never"/>
<item
android:id="@+id/action_sort_by_date_added"
android:title="@string/sort_by_date_added"
app:showAsAction="never"/>
</group>
<group
android:checkableBehavior="all">
<item
android:id="@+id/action_ignore_prefixes"
android:title="@string/ignore_prefixes"
app:showAsAction="never"/>
</group>
</menu>
</item>
<group
android:id="@+id/group_filter"
android:checkableBehavior="all">
<item
android:id="@+id/action_hide_watched"

View File

@ -22,6 +22,30 @@
android:queryHint="@string/action_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="android.support.v7.widget.SearchView"/>
<item
android:title="@string/sort_order"
app:showAsAction="never">
<menu>
<group
android:checkableBehavior="single">
<item
android:id="@+id/action_sort_by_name"
android:title="@string/sort_by_name"
app:showAsAction="never"/>
<item
android:id="@+id/action_sort_by_date_added"
android:title="@string/sort_by_date_added"
app:showAsAction="never"/>
</group>
<group
android:checkableBehavior="all">
<item
android:id="@+id/action_ignore_prefixes"
android:title="@string/ignore_prefixes"
app:showAsAction="never"/>
</group>
</menu>
</item>
<group android:id="@+id/group_filter"
android:checkableBehavior="all">
<item android:id="@+id/action_hide_watched"

View File

@ -256,6 +256,10 @@
<!-- Filters on list menus -->
<string name="hide_watched">Hide watched</string>
<string name="sort_order">Sort</string>
<string name="sort_by_name">By name</string>
<string name="sort_by_date_added">By date added</string>
<string name="ignore_prefixes">Ignore prefixes</string>
<!-- Preferences strings -->
<string name="theme">Theme</string>