Merge pull request #222 from poisdeux/issue/restoresearchquery
Implemented restoring search query
This commit is contained in:
commit
0b73228266
|
@ -17,6 +17,7 @@
|
||||||
package org.xbmc.kore.ui;
|
package org.xbmc.kore.ui;
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.ServiceConnection;
|
import android.content.ServiceConnection;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
|
@ -25,15 +26,20 @@ import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.LoaderManager;
|
import android.support.v4.app.LoaderManager;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.content.Loader;
|
import android.support.v4.content.Loader;
|
||||||
|
import android.support.v4.view.MenuItemCompat;
|
||||||
import android.support.v4.widget.SwipeRefreshLayout;
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
|
import android.widget.EditText;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import org.xbmc.kore.R;
|
import org.xbmc.kore.R;
|
||||||
|
@ -54,6 +60,8 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
SwipeRefreshLayout.OnRefreshListener {
|
SwipeRefreshLayout.OnRefreshListener {
|
||||||
private static final String TAG = LogUtils.makeLogTag(AbstractCursorListFragment.class);
|
private static final String TAG = LogUtils.makeLogTag(AbstractCursorListFragment.class);
|
||||||
|
|
||||||
|
private final String BUNDLE_KEY_SEARCH_QUERY = "search_query";
|
||||||
|
|
||||||
private ServiceConnection serviceConnection;
|
private ServiceConnection serviceConnection;
|
||||||
|
|
||||||
private HostInfo hostInfo;
|
private HostInfo hostInfo;
|
||||||
|
@ -66,7 +74,13 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
|
|
||||||
// The search filter to use in the loader
|
// The search filter to use in the loader
|
||||||
private String searchFilter = null;
|
private String searchFilter = null;
|
||||||
|
private String savedSearchFilter;
|
||||||
|
private boolean supportsSearch;
|
||||||
|
private boolean loaderLoading;
|
||||||
|
|
||||||
|
private SearchView searchView;
|
||||||
|
|
||||||
|
abstract protected void onListItemClicked(View view);
|
||||||
abstract protected CursorLoader createCursorLoader();
|
abstract protected CursorLoader createCursorLoader();
|
||||||
|
|
||||||
@TargetApi(16)
|
@TargetApi(16)
|
||||||
|
@ -84,6 +98,11 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
|
|
||||||
adapter = (CursorAdapter) getAdapter();
|
adapter = (CursorAdapter) getAdapter();
|
||||||
|
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
savedSearchFilter = savedInstanceState.getString(BUNDLE_KEY_SEARCH_QUERY);
|
||||||
|
}
|
||||||
|
searchFilter = savedSearchFilter;
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,10 +137,34 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
SyncUtils.disconnectFromLibrarySyncService(getActivity(), serviceConnection);
|
SyncUtils.disconnectFromLibrarySyncService(getActivity(), serviceConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
if (!TextUtils.isEmpty(searchFilter)) {
|
||||||
|
savedSearchFilter = searchFilter;
|
||||||
|
}
|
||||||
|
outState.putString(BUNDLE_KEY_SEARCH_QUERY, savedSearchFilter);
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
||||||
|
return new AdapterView.OnItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
saveSearchState();
|
||||||
|
onListItemClicked(view);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
inflater.inflate(R.menu.abstractcursorlistfragment, menu);
|
inflater.inflate(R.menu.abstractcursorlistfragment, menu);
|
||||||
|
|
||||||
|
if (supportsSearch) {
|
||||||
|
setupSearchMenuItem(menu, inflater);
|
||||||
|
}
|
||||||
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
super.onCreateOptionsMenu(menu, inflater);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,6 +247,18 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this to indicate your fragment supports search queries.
|
||||||
|
* Get the entered search query using {@link #getSearchFilter()}
|
||||||
|
* <br/>
|
||||||
|
* Note: make sure this is set before {@link #onCreateOptionsMenu(Menu, MenuInflater)} is called.
|
||||||
|
* For instance in {@link #onAttach(Activity)}
|
||||||
|
* @param supportsSearch true if you support search queries, false otherwise
|
||||||
|
*/
|
||||||
|
public void setSupportsSearch(boolean supportsSearch) {
|
||||||
|
this.supportsSearch = supportsSearch;
|
||||||
|
}
|
||||||
|
|
||||||
protected void onSwipeRefresh() {
|
protected void onSwipeRefresh() {
|
||||||
LogUtils.LOGD(TAG, "Swipe, starting sync for: " + getListSyncType());
|
LogUtils.LOGD(TAG, "Swipe, starting sync for: " + getListSyncType());
|
||||||
// Start the syncing process
|
// Start the syncing process
|
||||||
|
@ -218,8 +273,15 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public boolean onQueryTextChange(String newText) {
|
public boolean onQueryTextChange(String newText) {
|
||||||
|
if ((!searchView.hasFocus()) && TextUtils.isEmpty(newText)) {
|
||||||
|
//onQueryTextChange called as a result of manually expanding the searchView in setupSearchMenuItem(...)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
searchFilter = newText;
|
searchFilter = newText;
|
||||||
getLoaderManager().restartLoader(LOADER, null, this);
|
|
||||||
|
restartLoader();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,12 +298,14 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
|
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
|
||||||
|
loaderLoading = true;
|
||||||
return createCursorLoader();
|
return createCursorLoader();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
|
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
|
||||||
|
loaderLoading = false;
|
||||||
adapter.swapCursor(cursor);
|
adapter.swapCursor(cursor);
|
||||||
// To prevent the empty text from appearing on the first load, set it now
|
// To prevent the empty text from appearing on the first load, set it now
|
||||||
emptyView.setText(getString(R.string.swipe_down_to_refresh));
|
emptyView.setText(getString(R.string.swipe_down_to_refresh));
|
||||||
|
@ -253,6 +317,12 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
adapter.swapCursor(null);
|
adapter.swapCursor(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the search state of the list fragment
|
||||||
|
*/
|
||||||
|
public void saveSearchState() {
|
||||||
|
savedSearchFilter = searchFilter;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return text entered in searchview
|
* @return text entered in searchview
|
||||||
|
@ -265,6 +335,58 @@ public abstract class AbstractCursorListFragment extends AbstractListFragment
|
||||||
* Use this to reload the items in the list
|
* Use this to reload the items in the list
|
||||||
*/
|
*/
|
||||||
public void refreshList() {
|
public void refreshList() {
|
||||||
getLoaderManager().restartLoader(LOADER, null, this);
|
restartLoader();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupSearchMenuItem(Menu menu, MenuInflater inflater) {
|
||||||
|
inflater.inflate(R.menu.media_search, menu);
|
||||||
|
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
|
||||||
|
if (searchMenuItem != null) {
|
||||||
|
searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
|
||||||
|
searchView.setOnQueryTextListener(this);
|
||||||
|
searchView.setQueryHint(getString(R.string.action_search));
|
||||||
|
if ((savedSearchFilter != null) && (!TextUtils.isEmpty(savedSearchFilter))){
|
||||||
|
searchMenuItem.expandActionView();
|
||||||
|
searchView.setQuery(savedSearchFilter, false);
|
||||||
|
searchView.clearFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemActionExpand(MenuItem item) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemActionCollapse(MenuItem item) {
|
||||||
|
searchFilter = savedSearchFilter = null;
|
||||||
|
restartLoader();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
//Handle clearing search query using the close button (X button).
|
||||||
|
View view = searchView.findViewById(R.id.search_close_btn);
|
||||||
|
if (view != null) {
|
||||||
|
view.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
EditText editText = (EditText) searchView.findViewById(R.id.search_src_text);
|
||||||
|
editText.setText("");
|
||||||
|
searchView.setQuery("", false);
|
||||||
|
searchFilter = savedSearchFilter = "";
|
||||||
|
restartLoader();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void restartLoader() {
|
||||||
|
//When loader is restarted while current loader hasn't finished yet,
|
||||||
|
//it may result in none of the loaders finishing.
|
||||||
|
if(!loaderLoading) {
|
||||||
|
getLoaderManager().restartLoader(LOADER, null, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,16 +24,11 @@ import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
|
@ -98,16 +93,11 @@ public class AlbumListFragment extends AbstractCursorListFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the movie id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder) view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the movie id from the tag
|
listenerActivity.onAlbumSelected(tag);
|
||||||
ViewHolder tag = (ViewHolder) view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onAlbumSelected(tag);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -160,6 +150,8 @@ public class AlbumListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnAlbumSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnAlbumSelectedListener");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -168,22 +160,6 @@ public class AlbumListFragment extends AbstractCursorListFragment {
|
||||||
listenerActivity = null;
|
listenerActivity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
if (!isAdded()) {
|
|
||||||
// HACK: Fix crash reported on Play Store. Why does this is necessary is beyond me
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inflater.inflate(R.menu.media_search, menu);
|
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_albums));
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Album list query parameters.
|
* Album list query parameters.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -23,16 +23,11 @@ import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
|
@ -67,16 +62,11 @@ public class ArtistListFragment extends AbstractCursorListFragment {
|
||||||
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC; }
|
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the artist id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder) view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the artist id from the tag
|
listenerActivity.onArtistSelected(tag);
|
||||||
ViewHolder tag = (ViewHolder) view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onArtistSelected(tag);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -109,6 +99,7 @@ public class ArtistListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnArtistSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnArtistSelectedListener");
|
||||||
}
|
}
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -117,21 +108,6 @@ public class ArtistListFragment extends AbstractCursorListFragment {
|
||||||
listenerActivity = null;
|
listenerActivity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
if (!isAdded()) {
|
|
||||||
// HACK: Fix crash reported on Play Store. Why does this is necessary is beyond me
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
inflater.inflate(R.menu.media_search, menu);
|
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_artists));
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Artist list query parameters.
|
* Artist list query parameters.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,16 +22,11 @@ import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.PopupMenu;
|
import android.widget.PopupMenu;
|
||||||
|
@ -64,16 +59,11 @@ public class AudioGenresListFragment extends AbstractCursorListFragment {
|
||||||
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC; }
|
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the movie id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder) view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the movie id from the tag
|
listenerActivity.onAudioGenreSelected(tag.genreId, tag.genreTitle);
|
||||||
ViewHolder tag = (ViewHolder) view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onAudioGenreSelected(tag.genreId, tag.genreTitle);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -106,6 +96,7 @@ public class AudioGenresListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnAudioGenreSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnAudioGenreSelectedListener");
|
||||||
}
|
}
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -114,23 +105,6 @@ public class AudioGenresListFragment extends AbstractCursorListFragment {
|
||||||
listenerActivity = null;
|
listenerActivity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
if (!isAdded()) {
|
|
||||||
// HACK: Fix crash reported on Play Store. Why does this is necessary is beyond me
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inflater.inflate(R.menu.media_search, menu);
|
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_genres));
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Audio genres list query parameters.
|
* Audio genres list query parameters.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -25,8 +25,6 @@ import android.net.Uri;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
@ -34,7 +32,6 @@ import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -67,16 +64,11 @@ public class MovieListFragment extends AbstractCursorListFragment {
|
||||||
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MOVIES; }
|
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MOVIES; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the movie id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder) view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the movie id from the tag
|
listenerActivity.onMovieSelected(tag);
|
||||||
ViewHolder tag = (ViewHolder) view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onMovieSelected(tag);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -136,6 +128,7 @@ public class MovieListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnMovieSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnMovieSelectedListener");
|
||||||
}
|
}
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -154,12 +147,6 @@ public class MovieListFragment extends AbstractCursorListFragment {
|
||||||
|
|
||||||
inflater.inflate(R.menu.movie_list, menu);
|
inflater.inflate(R.menu.movie_list, menu);
|
||||||
|
|
||||||
// Setup search view
|
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_movies));
|
|
||||||
|
|
||||||
// Setup filters
|
// Setup filters
|
||||||
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
|
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
|
||||||
ignoreArticles = menu.findItem(R.id.action_ignore_prefixes),
|
ignoreArticles = menu.findItem(R.id.action_ignore_prefixes),
|
||||||
|
|
|
@ -54,6 +54,8 @@ public class MoviesActivity extends BaseActivity
|
||||||
|
|
||||||
private boolean clearSharedElements;
|
private boolean clearSharedElements;
|
||||||
|
|
||||||
|
private MovieListFragment movieListFragment;
|
||||||
|
|
||||||
@TargetApi(21)
|
@TargetApi(21)
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -70,7 +72,7 @@ public class MoviesActivity extends BaseActivity
|
||||||
navigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));
|
navigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout));
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
MovieListFragment movieListFragment = new MovieListFragment();
|
movieListFragment = new MovieListFragment();
|
||||||
|
|
||||||
// Setup animations
|
// Setup animations
|
||||||
if (Utils.isLollipopOrLater()) {
|
if (Utils.isLollipopOrLater()) {
|
||||||
|
@ -169,6 +171,7 @@ public class MoviesActivity extends BaseActivity
|
||||||
selectedMovieTitle = null;
|
selectedMovieTitle = null;
|
||||||
setupActionBar(null);
|
setupActionBar(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,8 @@ public class MusicListFragment extends Fragment {
|
||||||
|
|
||||||
private TabsAdapter tabsAdapter;
|
private TabsAdapter tabsAdapter;
|
||||||
|
|
||||||
|
private int currentItem;
|
||||||
|
|
||||||
@InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
|
@InjectView(R.id.pager_tab_strip) PagerSlidingTabStrip pagerTabStrip;
|
||||||
@InjectView(R.id.pager) ViewPager viewPager;
|
@InjectView(R.id.pager) ViewPager viewPager;
|
||||||
|
|
||||||
|
@ -56,6 +58,28 @@ public class MusicListFragment extends Fragment {
|
||||||
viewPager.setAdapter(tabsAdapter);
|
viewPager.setAdapter(tabsAdapter);
|
||||||
pagerTabStrip.setViewPager(viewPager);
|
pagerTabStrip.setViewPager(viewPager);
|
||||||
|
|
||||||
|
currentItem = viewPager.getCurrentItem();
|
||||||
|
|
||||||
|
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageSelected(int position) {
|
||||||
|
AbstractCursorListFragment f =
|
||||||
|
((AbstractCursorListFragment) tabsAdapter.getStoredFragment(currentItem));
|
||||||
|
if (f != null) {
|
||||||
|
f.saveSearchState();
|
||||||
|
}
|
||||||
|
currentItem = viewPager.getCurrentItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPageScrollStateChanged(int state) {
|
||||||
|
}
|
||||||
|
});
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,16 +23,10 @@ import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -64,16 +58,11 @@ public class MusicVideoListFragment extends AbstractCursorListFragment {
|
||||||
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC_VIDEOS; }
|
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_MUSIC_VIDEOS; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the movie id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder)view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the movie id from the tag
|
listenerActivity.onMusicVideoSelected(tag);
|
||||||
ViewHolder tag = (ViewHolder)view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onMusicVideoSelected(tag);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -106,6 +95,7 @@ public class MusicVideoListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnMusicVideoSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnMusicVideoSelectedListener");
|
||||||
}
|
}
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -114,22 +104,6 @@ public class MusicVideoListFragment extends AbstractCursorListFragment {
|
||||||
listenerActivity = null;
|
listenerActivity = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
if (!isAdded()) {
|
|
||||||
// HACK: Fix crash reported on Play Store. Why does this is necessary is beyond me
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inflater.inflate(R.menu.media_search, menu);
|
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_music_videos));
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Videos list query parameters.
|
* Videos list query parameters.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -25,8 +25,6 @@ import android.net.Uri;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.support.v4.content.CursorLoader;
|
import android.support.v4.content.CursorLoader;
|
||||||
import android.support.v4.view.MenuItemCompat;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
@ -34,7 +32,6 @@ import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.CursorAdapter;
|
import android.widget.CursorAdapter;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
@ -67,16 +64,11 @@ public class TVShowListFragment extends AbstractCursorListFragment {
|
||||||
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_TVSHOWS; }
|
protected String getListSyncType() { return LibrarySyncService.SYNC_ALL_TVSHOWS; }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected AdapterView.OnItemClickListener createOnItemClickListener() {
|
protected void onListItemClicked(View view) {
|
||||||
return new AdapterView.OnItemClickListener() {
|
// Get the movie id from the tag
|
||||||
@Override
|
ViewHolder tag = (ViewHolder) view.getTag();
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
// Notify the activity
|
||||||
// Get the movie id from the tag
|
listenerActivity.onTVShowSelected(tag);
|
||||||
ViewHolder tag = (ViewHolder) view.getTag();
|
|
||||||
// Notify the activity
|
|
||||||
listenerActivity.onTVShowSelected(tag);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -138,6 +130,7 @@ public class TVShowListFragment extends AbstractCursorListFragment {
|
||||||
} catch (ClassCastException e) {
|
} catch (ClassCastException e) {
|
||||||
throw new ClassCastException(activity.toString() + " must implement OnTVShowSelectedListener");
|
throw new ClassCastException(activity.toString() + " must implement OnTVShowSelectedListener");
|
||||||
}
|
}
|
||||||
|
setSupportsSearch(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -155,10 +148,6 @@ public class TVShowListFragment extends AbstractCursorListFragment {
|
||||||
}
|
}
|
||||||
|
|
||||||
inflater.inflate(R.menu.tvshow_list, menu);
|
inflater.inflate(R.menu.tvshow_list, menu);
|
||||||
MenuItem searchItem = menu.findItem(R.id.action_search);
|
|
||||||
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
|
|
||||||
searchView.setOnQueryTextListener(this);
|
|
||||||
searchView.setQueryHint(getString(R.string.action_search_tvshows));
|
|
||||||
|
|
||||||
// Setup filters
|
// Setup filters
|
||||||
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
|
MenuItem hideWatched = menu.findItem(R.id.action_hide_watched),
|
||||||
|
|
|
@ -17,13 +17,6 @@
|
||||||
<menu
|
<menu
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<item
|
|
||||||
android:id="@+id/action_search"
|
|
||||||
android:title="@string/action_search"
|
|
||||||
android:icon="?attr/iconSearchToolbar"
|
|
||||||
android:queryHint="@string/action_search"
|
|
||||||
app:showAsAction="ifRoom|collapseActionView"
|
|
||||||
app:actionViewClass="android.support.v7.widget.SearchView"/>
|
|
||||||
<item
|
<item
|
||||||
android:title="@string/sort_order"
|
android:title="@string/sort_order"
|
||||||
app:showAsAction="never">
|
app:showAsAction="never">
|
||||||
|
|
|
@ -16,12 +16,6 @@
|
||||||
-->
|
-->
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<item android:id="@+id/action_search"
|
|
||||||
android:title="@string/action_search"
|
|
||||||
android:icon="?attr/iconSearchToolbar"
|
|
||||||
android:queryHint="@string/action_search"
|
|
||||||
app:showAsAction="ifRoom|collapseActionView"
|
|
||||||
app:actionViewClass="android.support.v7.widget.SearchView"/>
|
|
||||||
<item
|
<item
|
||||||
android:title="@string/sort_order"
|
android:title="@string/sort_order"
|
||||||
app:showAsAction="never">
|
app:showAsAction="never">
|
||||||
|
|
Loading…
Reference in New Issue