/*
* Copyright (C) 2014 Michell Bak
*
* 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.miz.mizuu;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.graphics.drawable.RoundedBitmapDrawable;
import android.support.v4.graphics.drawable.RoundedBitmapDrawableFactory;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.miz.base.MizActivity;
import com.miz.db.DbAdapterMovies;
import com.miz.db.DbAdapterTvShows;
import com.miz.functions.MenuItem;
import com.miz.functions.MizLib;
import com.miz.mizuu.fragments.AccountsFragment;
import com.miz.mizuu.fragments.MovieLibraryOverviewFragment;
import com.miz.mizuu.fragments.TvShowLibraryOverviewFragment;
import com.miz.utils.LocalBroadcastUtils;
import com.miz.utils.TypefaceUtils;
import com.miz.utils.ViewUtils;
import com.squareup.picasso.Picasso;
import java.io.File;
import java.util.ArrayList;
import static com.miz.functions.PreferenceKeys.STARTUP_SELECTION;
import static com.miz.functions.PreferenceKeys.TRAKT_FULL_NAME;
import static com.miz.functions.PreferenceKeys.TRAKT_USERNAME;
@SuppressLint("NewApi")
public class Main extends MizActivity {
public static final int MOVIES = 1, SHOWS = 2;
private int mNumMovies, mNumShows, selectedIndex, mStartup;
private Typeface mTfMedium, mTfRegular;
private DrawerLayout mDrawerLayout;
protected ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private DbAdapterMovies mDbHelper;
private DbAdapterTvShows mDbHelperTv;
private ArrayList<MenuItem> mMenuItems = new ArrayList<MenuItem>();
private Picasso mPicasso;
@Override
protected int getLayoutResource() {
return R.layout.menu_drawer;
}
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.Mizuu_Theme_Overview);
super.onCreate(savedInstanceState);
mPicasso = MizuuApplication.getPicasso(getApplicationContext());
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
mStartup = Integer.valueOf(settings.getString(STARTUP_SELECTION, "1"));
mDbHelper = MizuuApplication.getMovieAdapter();
mDbHelperTv = MizuuApplication.getTvDbAdapter();
mTfMedium = TypefaceUtils.getRobotoMedium(getApplicationContext());
mTfRegular = TypefaceUtils.getRoboto(getApplicationContext());
setupMenuItems();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.color_primary_dark));
mDrawerLayout.setDrawerShadow(R.drawable.drawer_list_shadow, GravityCompat.START);
mDrawerList = (ListView) findViewById(R.id.listView1);
mDrawerList.setLayoutParams(new FrameLayout.LayoutParams(ViewUtils.getNavigationDrawerWidth(this), FrameLayout.LayoutParams.MATCH_PARENT));
mDrawerList.setAdapter(new MenuAdapter());
mDrawerList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
switch (mMenuItems.get(arg2).getType()) {
case MenuItem.HEADER:
Intent intent = new Intent(getApplicationContext(), Preferences.class);
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT, AccountsFragment.class.getName());
intent.putExtra(PreferenceActivity.EXTRA_NO_HEADERS, true);
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE, getString(R.string.social));
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_SHORT_TITLE, getString(R.string.social));
startActivity(intent);
break;
case MenuItem.SECTION:
loadFragment(mMenuItems.get(arg2).getFragment());
break;
case MenuItem.SETTINGS_AREA:
Intent smallIntent = new Intent(getApplicationContext(), Preferences.class);
startActivity(smallIntent);
mDrawerLayout.closeDrawers();
break;
}
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, R.string.drawer_close);
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState != null && savedInstanceState.containsKey("selectedIndex")) {
selectedIndex = savedInstanceState.getInt("selectedIndex");
loadFragment(selectedIndex);
} else if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("startup")) {
loadFragment(Integer.parseInt(getIntent().getExtras().getString("startup")));
} else {
loadFragment(mStartup);
}
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(LocalBroadcastUtils.UPDATE_MOVIE_LIBRARY));
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter(LocalBroadcastUtils.UPDATE_TV_SHOW_LIBRARY));
}
private void loadFragment(int type) {
if (type == 0)
type = 1;
Fragment frag = getSupportFragmentManager().findFragmentByTag("frag" + type);
if (frag == null) {
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
switch (type) {
case MOVIES:
ft.replace(R.id.content_frame, MovieLibraryOverviewFragment.newInstance(), "frag" + type);
break;
case SHOWS:
ft.replace(R.id.content_frame, TvShowLibraryOverviewFragment.newInstance(), "frag" + type);
break;
}
ft.commit();
}
switch (type) {
case MOVIES:
setTitle(R.string.chooserMovies);
break;
case SHOWS:
setTitle(R.string.chooserTVShows);
break;
}
selectListIndex(type);
if (mDrawerLayout != null)
mDrawerLayout.closeDrawers();
}
@Override
public void onNewIntent(Intent newIntent) {
super.onNewIntent(newIntent);
if (!newIntent.hasExtra("fromUpdate")) {
Intent i;
if (selectedIndex == MOVIES)
i = new Intent("mizuu-movie-actor-search");
else // TV shows
i = new Intent("mizuu-shows-actor-search");
i.putExtras(newIntent.getExtras());
LocalBroadcastManager.getInstance(this).sendBroadcast(i);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("selectedIndex", selectedIndex);
}
private void setupMenuItems() {
mMenuItems.clear();
// Menu header
mMenuItems.add(new MenuItem(null, MenuItem.HEADER, -1));
// Regular menu items
mMenuItems.add(new MenuItem(getString(R.string.drawerMyMovies), mNumMovies, MenuItem.SECTION, MOVIES, R.drawable.ic_movie_grey600_24dp));
mMenuItems.add(new MenuItem(getString(R.string.drawerMyTvShows), mNumShows, MenuItem.SECTION, SHOWS, R.drawable.ic_tv_grey600_24dp));
mMenuItems.add(new MenuItem(MenuItem.SEPARATOR_EXTRA_PADDING));
mMenuItems.add(new MenuItem(getString(R.string.settings_name), MenuItem.SETTINGS_AREA, R.drawable.ic_settings_grey600_24dp));
}
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateLibraryCounts();
}
};
protected void selectListIndex(int index) {
if (mMenuItems.get(index).getType() == MenuItem.SECTION) {
selectedIndex = mMenuItems.get(index).getFragment();
mDrawerList.setItemChecked(index, true);
}
}
@Override
public void onResume() {
super.onResume();
updateLibraryCounts();
}
private void updateLibraryCounts() {
new Thread() {
@Override
public void run() {
try {
mNumMovies = mDbHelper.count();
mNumShows = mDbHelperTv.count();
runOnUiThread(new Runnable() {
@Override
public void run() {
setupMenuItems();
((BaseAdapter) mDrawerList.getAdapter()).notifyDataSetChanged();
}
});
} catch (Exception e) {}
}
}.start();
}
@Override
public void onDestroy() {
// Unregister since the activity is about to be closed.
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
@Override
public boolean onOptionsItemSelected(android.view.MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch(item.getItemId()) {
case android.R.id.home:
if (!mDrawerLayout.isDrawerOpen(mDrawerList)) {
mDrawerLayout.openDrawer(mDrawerList);
} else {
mDrawerLayout.closeDrawer(mDrawerList);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
public class MenuAdapter extends BaseAdapter {
private File mBackdropFile;
private LayoutInflater mInflater;
public MenuAdapter() {
mInflater = LayoutInflater.from(getApplicationContext());
mBackdropFile = MizLib.getRandomBackdropFile(getApplicationContext());
}
@Override
public int getCount() {
return mMenuItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 6;
}
@Override
public int getItemViewType(int position) {
switch (mMenuItems.get(position).getType()) {
case MenuItem.HEADER:
return 0;
case MenuItem.SEPARATOR:
return 1;
case MenuItem.SEPARATOR_EXTRA_PADDING:
return 2;
case MenuItem.SUB_HEADER:
return 3;
case MenuItem.SECTION:
return 4;
default:
return 5;
}
}
@Override
public boolean isEnabled(int position) {
int type = mMenuItems.get(position).getType();
return !(type == MenuItem.SEPARATOR ||
type == MenuItem.SEPARATOR_EXTRA_PADDING ||
type == MenuItem.SUB_HEADER);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (mMenuItems.get(position).getType() == MenuItem.HEADER) {
convertView = mInflater.inflate(R.layout.menu_drawer_header, parent, false);
final String fullName = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(TRAKT_FULL_NAME, "");
final String userName = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString(TRAKT_USERNAME, "");
final ImageView backgroundImage = ((ImageView) convertView.findViewById(R.id.userCover));
final ImageView userImage = ((ImageView) convertView.findViewById(R.id.userPhoto));
final ImageView plusIcon = ((ImageView) convertView.findViewById(R.id.plus_icon));
final TextView realName = ((TextView) convertView.findViewById(R.id.real_name));
final TextView userNameTextField = ((TextView) convertView.findViewById(R.id.username));
realName.setTypeface(mTfMedium);
userNameTextField.setTypeface(mTfRegular);
// Full name
realName.setText(!TextUtils.isEmpty(fullName) ? fullName : "");
// User name
if (!TextUtils.isEmpty(userName)) {
userNameTextField.setText(String.format(getString(R.string.logged_in_as), userName));
plusIcon.setVisibility(View.GONE);
} else {
userNameTextField.setText(R.string.sign_in_with_trakt);
plusIcon.setVisibility(View.VISIBLE);
}
// This should be loaded in the background, but doesn't matter much at the moment
Bitmap src = BitmapFactory.decodeFile(new File(MizuuApplication.getCacheFolder(getApplicationContext()), "avatar.jpg").getAbsolutePath());
if (src != null) {
RoundedBitmapDrawable dr = RoundedBitmapDrawableFactory.create(getResources(), src);
dr.setCornerRadius(Math.min(dr.getMinimumWidth(), dr.getMinimumHeight()));
dr.setAntiAlias(true);
userImage.setImageDrawable(dr);
} else {
userImage.setVisibility(View.GONE);
}
// Background image
mPicasso.load(mBackdropFile)
.error(R.drawable.default_menu_backdrop)
.resize(MizLib.convertDpToPixels(getApplicationContext(), 320),
MizLib.convertDpToPixels(getApplicationContext(), 180))
.into(backgroundImage);
// Dark color filter on the background image
backgroundImage.setColorFilter(Color.parseColor("#50181818"), android.graphics.PorterDuff.Mode.SRC_OVER);
} else if (mMenuItems.get(position).getType() == MenuItem.SEPARATOR) {
convertView = mInflater.inflate(R.layout.menu_drawer_separator, parent, false);
} else if (mMenuItems.get(position).getType() == MenuItem.SEPARATOR_EXTRA_PADDING) {
convertView = mInflater.inflate(R.layout.menu_drawer_separator_extra_padding, parent, false);
} else if (mMenuItems.get(position).getType() == MenuItem.SUB_HEADER) {
convertView = mInflater.inflate(R.layout.menu_drawer_header_item, parent, false);
TextView title = (TextView) convertView.findViewById(R.id.title);
title.setText(mMenuItems.get(position).getTitle());
title.setTypeface(mTfMedium);
} else if (mMenuItems.get(position).getType() == MenuItem.SECTION) {
convertView = mInflater.inflate(R.layout.menu_drawer_item, parent, false);
// Icon
ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
icon.setImageResource(mMenuItems.get(position).getIcon());
// Title
TextView title = (TextView) convertView.findViewById(R.id.title);
title.setText(mMenuItems.get(position).getTitle());
title.setTypeface(mTfMedium);
// Description
TextView description = (TextView) convertView.findViewById(R.id.count);
description.setTypeface(mTfRegular);
if (mMenuItems.get(position).getType() == MenuItem.SECTION &&
mMenuItems.get(position).getFragment() == selectedIndex) {
convertView.setBackgroundColor(Color.parseColor("#e8e8e8"));
int color = Color.parseColor("#3f51b5");
title.setTextColor(color);
description.setTextColor(color);
icon.setColorFilter(color);
} else {
int color = Color.parseColor("#DD000000");
title.setTextColor(color);
description.setTextColor(color);
icon.setColorFilter(Color.parseColor("#999999"));
}
if (mMenuItems.get(position).getCount() >= 0)
description.setText(String.valueOf(mMenuItems.get(position).getCount()));
else
description.setVisibility(View.GONE);
} else {
convertView = mInflater.inflate(R.layout.menu_drawer_small_item, parent, false);
// Icon
ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
icon.setImageResource(mMenuItems.get(position).getIcon());
icon.setColorFilter(Color.parseColor("#737373"));
// Title
TextView title = (TextView) convertView.findViewById(R.id.title);
title.setText(mMenuItems.get(position).getTitle());
title.setTypeface(mTfMedium);
}
return convertView;
}
}
@Override
public void onBackPressed() {
if (!mDrawerLayout.isDrawerOpen(findViewById(R.id.left_drawer))) {
super.onBackPressed();
} else {
mDrawerLayout.closeDrawers();
}
}
}