/*
* Copyright 2015. Emin Yahyayev
*
* 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 com.ewintory.udacity.popularmovies.ui.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import com.ewintory.udacity.popularmovies.R;
import com.ewintory.udacity.popularmovies.data.api.Sort;
import com.ewintory.udacity.popularmovies.data.model.Movie;
import com.ewintory.udacity.popularmovies.ui.fragment.FavoredMoviesFragment;
import com.ewintory.udacity.popularmovies.ui.fragment.MovieFragment;
import com.ewintory.udacity.popularmovies.ui.fragment.MoviesFragment;
import com.ewintory.udacity.popularmovies.ui.fragment.SortedMoviesFragment;
import com.ewintory.udacity.popularmovies.utils.PrefUtils;
import java.util.ArrayList;
import timber.log.Timber;
public final class BrowseMoviesActivity extends BaseActivity implements MoviesFragment.Listener {
private static final String STATE_MODE = "state_mode";
private static final String MOVIES_FRAGMENT_TAG = "fragment_movies";
private static final String MOVIE_DETAILS_FRAGMENT_TAG = "fragment_movie_details";
public static final String MODE_FAVORITES = "favorites";
private ModeSpinnerAdapter mSpinnerAdapter = new ModeSpinnerAdapter();
private MoviesFragment mMoviesFragment;
private String mMode;
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_browse_movies);
mTwoPane = findViewById(R.id.movie_details_container) != null;
mMode = (savedInstanceState != null) ?
savedInstanceState.getString(STATE_MODE, Sort.POPULARITY.toString())
: PrefUtils.getBrowseMoviesMode(this);
initModeSpinner();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mMoviesFragment = (MoviesFragment) getSupportFragmentManager().findFragmentByTag(MOVIES_FRAGMENT_TAG);
if (mMoviesFragment == null)
replaceMoviesFragment(mMode.equals(MODE_FAVORITES)
? new FavoredMoviesFragment()
: SortedMoviesFragment.newInstance(Sort.fromString(mMode)));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.activity_browse_movies, menu);
return true;
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_refresh:
mMoviesFragment.onRefresh();
break;
case R.id.menu_scroll_to_top:
mMoviesFragment.scrollToTop(true);
break;
case R.id.menu_settings:
startActivity(new Intent(this, PreferenceActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(STATE_MODE, mMode);
}
@Override
protected void onPause() {
PrefUtils.setBrowseMoviesMode(this, mMode);
super.onPause();
}
@Override
public void onMovieSelected(@NonNull Movie movie, View view) {
Timber.d(String.format("Movie '%s' selected", movie.getTitle()));
if (mTwoPane) {
MovieFragment fragment = MovieFragment.newInstance(movie);
replaceMovieDetailsFragment(fragment);
} else {
Intent intent = new Intent(this, MovieDetailsActivity.class);
intent.putExtra(MovieDetailsActivity.EXTRA_MOVIE, movie);
startActivity(intent);
}
}
private void replaceMovieDetailsFragment(MovieFragment fragment) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.movie_details_container, fragment, MOVIE_DETAILS_FRAGMENT_TAG)
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
.commit();
}
private void replaceMoviesFragment(MoviesFragment fragment) {
mMoviesFragment = fragment;
getSupportFragmentManager().beginTransaction()
.replace(R.id.movies_container, fragment, MOVIES_FRAGMENT_TAG)
.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_left, R.anim.slide_out_right)
.commit();
}
private void initModeSpinner() {
Toolbar toolbar = getToolbar();
if (toolbar == null)
return;
mSpinnerAdapter.clear();
mSpinnerAdapter.addItem(MODE_FAVORITES, getString(R.string.mode_favored), false);
mSpinnerAdapter.addHeader(getString(R.string.mode_sort));
mSpinnerAdapter.addItem(Sort.POPULARITY.toString(), getString(R.string.mode_sort_popularity), false);
mSpinnerAdapter.addItem(Sort.VOTE_COUNT.toString(), getString(R.string.mode_sort_vote_count), false);
mSpinnerAdapter.addItem(Sort.VOTE_AVERAGE.toString(), getString(R.string.mode_sort_vote_average), false);
int itemToSelect = -1;
if (mMode.equals(MODE_FAVORITES))
itemToSelect = 0;
else if (mMode.equals(Sort.POPULARITY.toString()))
itemToSelect = 2;
else if (mMode.equals(Sort.VOTE_COUNT.toString()))
itemToSelect = 3;
else if (mMode.equals(Sort.VOTE_AVERAGE.toString()))
itemToSelect = 4;
View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.widget_toolbar_spinner, toolbar, false);
ActionBar.LayoutParams lp = new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
toolbar.addView(spinnerContainer, lp);
Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.mode_spinner);
spinner.setAdapter(mSpinnerAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override public void onItemSelected(AdapterView<?> spinner, View view, int position, long itemId) {
onModeSelected(mSpinnerAdapter.getMode(position));
}
@Override public void onNothingSelected(AdapterView<?> adapterView) { }
});
if (itemToSelect >= 0) {
Timber.d("Restoring item selection to mode spinner: " + itemToSelect);
spinner.setSelection(itemToSelect);
}
}
private void onModeSelected(String mode) {
if (mode.equals(mMode)) return;
mMode = mode;
if (mMode.equals(MODE_FAVORITES))
replaceMoviesFragment(new FavoredMoviesFragment());
else
replaceMoviesFragment(SortedMoviesFragment.newInstance(Sort.fromString(mMode)));
}
private class ModeSpinnerItem {
boolean isHeader;
String mode, title;
boolean indented;
ModeSpinnerItem(boolean isHeader, String mode, String title, boolean indented) {
this.isHeader = isHeader;
this.mode = mode;
this.title = title;
this.indented = indented;
}
}
private class ModeSpinnerAdapter extends BaseAdapter {
private ModeSpinnerAdapter() { }
private ArrayList<ModeSpinnerItem> mItems = new ArrayList<ModeSpinnerItem>();
public void clear() {
mItems.clear();
}
public void addItem(String tag, String title, boolean indented) {
mItems.add(new ModeSpinnerItem(false, tag, title, indented));
}
public void addHeader(String title) {
mItems.add(new ModeSpinnerItem(true, "", title, false));
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Object getItem(int position) {
return mItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private boolean isHeader(int position) {
return position >= 0 && position < mItems.size()
&& mItems.get(position).isHeader;
}
@Override
public View getDropDownView(int position, View view, ViewGroup parent) {
if (view == null || !view.getTag().toString().equals("DROPDOWN")) {
view = getLayoutInflater().inflate(R.layout.item_toolbar_spinner_dropdown,
parent, false);
view.setTag("DROPDOWN");
}
TextView headerTextView = (TextView) view.findViewById(R.id.header_text);
View dividerView = view.findViewById(R.id.divider_view);
TextView normalTextView = (TextView) view.findViewById(android.R.id.text1);
if (isHeader(position)) {
headerTextView.setText(getTitle(position));
headerTextView.setVisibility(View.VISIBLE);
normalTextView.setVisibility(View.GONE);
dividerView.setVisibility(View.VISIBLE);
} else {
headerTextView.setVisibility(View.GONE);
normalTextView.setVisibility(View.VISIBLE);
dividerView.setVisibility(View.GONE);
setUpNormalDropdownView(position, normalTextView);
}
return view;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
if (view == null || !view.getTag().toString().equals("NON_DROPDOWN")) {
view = getLayoutInflater().inflate(R.layout.item_toolbar_spinner, parent, false);
view.setTag("NON_DROPDOWN");
}
TextView textView = (TextView) view.findViewById(android.R.id.text1);
textView.setText(getTitle(position));
return view;
}
private String getTitle(int position) {
return position >= 0 && position < mItems.size() ? mItems.get(position).title : "";
}
private String getMode(int position) {
return position >= 0 && position < mItems.size() ? mItems.get(position).mode : "";
}
private void setUpNormalDropdownView(int position, TextView textView) {
textView.setText(getTitle(position));
}
@Override
public boolean isEnabled(int position) {
return !isHeader(position);
}
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
}
}