/*
* Copyright (C) 2016 Simon Vig Therkildsen
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.simonvt.cathode.ui.suggestions.shows;
import android.app.Activity;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.view.MenuItem;
import android.view.View;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import net.simonvt.cathode.CathodeApp;
import net.simonvt.cathode.R;
import net.simonvt.cathode.database.SimpleCursor;
import net.simonvt.cathode.database.SimpleCursorLoader;
import net.simonvt.cathode.jobqueue.Job;
import net.simonvt.cathode.jobqueue.JobManager;
import net.simonvt.cathode.provider.ProviderSchematic.Shows;
import net.simonvt.cathode.remote.sync.shows.SyncShowRecommendations;
import net.simonvt.cathode.settings.Settings;
import net.simonvt.cathode.ui.LibraryType;
import net.simonvt.cathode.ui.ShowsNavigationListener;
import net.simonvt.cathode.ui.shows.ShowClickListener;
import net.simonvt.cathode.ui.shows.ShowDescriptionAdapter;
import net.simonvt.cathode.ui.lists.ListDialog;
import net.simonvt.cathode.ui.fragment.SwipeRefreshRecyclerFragment;
public class ShowRecommendationsFragment
extends SwipeRefreshRecyclerFragment<ShowDescriptionAdapter.ViewHolder>
implements LoaderManager.LoaderCallbacks<SimpleCursor>,
ShowRecommendationsAdapter.DismissListener, ListDialog.Callback, ShowClickListener {
private enum SortBy {
RELEVANCE("relevance", Shows.SORT_RECOMMENDED),
RATING("rating", Shows.SORT_RATING);
private String key;
private String sortOrder;
SortBy(String key, String sortOrder) {
this.key = key;
this.sortOrder = sortOrder;
}
public String getKey() {
return key;
}
public String getSortOrder() {
return sortOrder;
}
@Override public String toString() {
return key;
}
private static final Map<String, SortBy> STRING_MAPPING = new HashMap<>();
static {
for (SortBy via : SortBy.values()) {
STRING_MAPPING.put(via.toString().toUpperCase(Locale.US), via);
}
}
public static SortBy fromValue(String value) {
SortBy sortBy = STRING_MAPPING.get(value.toUpperCase(Locale.US));
if (sortBy == null) {
sortBy = RELEVANCE;
}
return sortBy;
}
}
private static final String DIALOG_SORT =
"net.simonvt.cathode.ui.suggestions.shows.ShowRecommendationsFragment.sortDialog";
private static final int LOADER_SHOWS_RECOMMENDATIONS = 1;
private ShowRecommendationsAdapter showsAdapter;
private ShowsNavigationListener navigationListener;
@Inject JobManager jobManager;
private boolean isTablet;
private SimpleCursor cursor;
private SharedPreferences settings;
private SortBy sortBy;
private int columnCount;
private boolean scrollToTop;
@Override public void onAttach(Activity activity) {
super.onAttach(activity);
navigationListener = (ShowsNavigationListener) activity;
}
@Override public void onCreate(Bundle inState) {
super.onCreate(inState);
CathodeApp.inject(getActivity(), this);
settings = PreferenceManager.getDefaultSharedPreferences(getActivity());
sortBy = SortBy.fromValue(
settings.getString(Settings.Sort.SHOW_RECOMMENDED, SortBy.RELEVANCE.getKey()));
getLoaderManager().initLoader(LOADER_SHOWS_RECOMMENDATIONS, null, this);
isTablet = getResources().getBoolean(R.bool.isTablet);
columnCount = getResources().getInteger(R.integer.showsColumns);
setTitle(R.string.title_shows_recommended);
setEmptyText(R.string.recommendations_empty);
}
@Override protected int getColumnCount() {
return columnCount;
}
private Job.OnDoneListener onDoneListener = new Job.OnDoneListener() {
@Override public void onDone(Job job) {
setRefreshing(false);
}
};
@Override public void onRefresh() {
Job job = new SyncShowRecommendations();
job.registerOnDoneListener(onDoneListener);
jobManager.addJob(job);
}
@Override public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.sort_by:
ArrayList<ListDialog.Item> items = new ArrayList<>();
items.add(new ListDialog.Item(R.id.sort_relevance, R.string.sort_relevance));
items.add(new ListDialog.Item(R.id.sort_rating, R.string.sort_rating));
ListDialog.newInstance(R.string.action_sort_by, items, this)
.show(getFragmentManager(), DIALOG_SORT);
return true;
default:
return super.onMenuItemClick(item);
}
}
@Override public void onItemSelected(int id) {
switch (id) {
case R.id.sort_relevance:
if (sortBy != SortBy.RELEVANCE) {
sortBy = SortBy.RELEVANCE;
settings.edit()
.putString(Settings.Sort.SHOW_RECOMMENDED, SortBy.RELEVANCE.getKey())
.apply();
getLoaderManager().restartLoader(LOADER_SHOWS_RECOMMENDATIONS, null, this);
scrollToTop = true;
}
break;
case R.id.sort_rating:
if (sortBy != SortBy.RATING) {
sortBy = SortBy.RATING;
settings.edit().putString(Settings.Sort.SHOW_RECOMMENDED, SortBy.RATING.getKey()).apply();
getLoaderManager().restartLoader(LOADER_SHOWS_RECOMMENDATIONS, null, this);
scrollToTop = true;
}
break;
}
}
@Override public void onShowClick(long showId, String title, String overview) {
navigationListener.onDisplayShow(showId, title, overview, LibraryType.WATCHED);
}
@Override public void onDismissItem(final View view, final long id) {
Loader loader = getLoaderManager().getLoader(LOADER_SHOWS_RECOMMENDATIONS);
if (loader != null) {
SimpleCursorLoader cursorLoader = (SimpleCursorLoader) loader;
cursorLoader.throttle(SimpleCursorLoader.DEFAULT_THROTTLE);
cursor.remove(id);
showsAdapter.notifyChanged();
}
}
private void setCursor(Cursor c) {
cursor = (SimpleCursor) c;
if (showsAdapter == null) {
showsAdapter = new ShowRecommendationsAdapter(getActivity(), this, cursor, this);
setAdapter(showsAdapter);
return;
}
showsAdapter.changeCursor(cursor);
if (scrollToTop) {
getRecyclerView().scrollToPosition(0);
scrollToTop = false;
}
}
@Override public Loader<SimpleCursor> onCreateLoader(int i, Bundle bundle) {
final Uri contentUri = Shows.SHOWS_RECOMMENDED;
return new SimpleCursorLoader(getActivity(), contentUri, ShowDescriptionAdapter.PROJECTION,
null, null, sortBy.getSortOrder());
}
@Override public void onLoadFinished(Loader<SimpleCursor> loader, SimpleCursor data) {
setCursor(data);
}
@Override public void onLoaderReset(Loader<SimpleCursor> loader) {
}
}