package com.jparkie.aizoban.views.activities;
import android.content.Context;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.Toolbar;
import android.text.Html;
import android.util.SparseBooleanArray;
import android.util.TypedValue;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.jparkie.aizoban.R;
import com.jparkie.aizoban.presenters.MangaPresenter;
import com.jparkie.aizoban.presenters.MangaPresenterOfflineImpl;
import com.jparkie.aizoban.presenters.MangaPresenterOnlineImpl;
import com.jparkie.aizoban.presenters.mapper.MangaMapper;
import com.jparkie.aizoban.utils.PaletteBitmapTarget;
import com.jparkie.aizoban.utils.PaletteBitmapTranscoder;
import com.jparkie.aizoban.utils.PaletteUtils;
import com.jparkie.aizoban.utils.wrappers.PaletteBitmapWrapper;
import com.jparkie.aizoban.utils.wrappers.RequestWrapper;
import com.jparkie.aizoban.views.MangaView;
import com.melnykov.fab.FloatingActionButton;
public class MangaActivity extends BaseActivity implements MangaView, MangaMapper {
public static final String TAG = MangaActivity.class.getSimpleName();
public static final String PRESENTER_ARGUMENT_KEY = TAG + ":" + "PresenterArgumentKey";
public static final String REQUEST_ARGUMENT_KEY = TAG + ":" + "RequestArgumentKey";
private MangaPresenter mMangaPresenter;
private Toolbar mToolbar;
private SwipeRefreshLayout mSwipeRefreshLayout;
private ListView mListView;
private RelativeLayout mEmptyRelativeLayout;
private View mHeaderInfoView;
private ImageView mHeaderImageView;
private View mMaskImageView;
private TextView mTitleAuthorTextView;
private TextView mTitleArtistTextView;
private TextView mTitleGenreTextView;
private TextView mTitleStatusTextView;
private TextView mNameTextView;
private TextView mDescriptionTextView;
private TextView mAuthorTextView;
private TextView mArtistTextView;
private TextView mGenreTextView;
private TextView mStatusTextView;
private FloatingActionButton mFavouriteButton;
private RelativeLayout mHeaderChapterView;
private TextView mChapterErrorTextView;
public static Intent constructOnlineMangaActivityIntent(Context context, RequestWrapper mangaRequest) {
Intent argumentIntent = new Intent(context, MangaActivity.class);
argumentIntent.putExtra(PRESENTER_ARGUMENT_KEY, MangaPresenterOnlineImpl.TAG);
argumentIntent.putExtra(REQUEST_ARGUMENT_KEY, mangaRequest);
return argumentIntent;
}
public static Intent constructOfflineMangaActivityIntent(Context context, RequestWrapper mangaRequest) {
Intent argumentIntent = new Intent(context, MangaActivity.class);
argumentIntent.putExtra(PRESENTER_ARGUMENT_KEY, MangaPresenterOfflineImpl.TAG);
argumentIntent.putExtra(REQUEST_ARGUMENT_KEY, mangaRequest);
return argumentIntent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
if (intent != null) {
if (intent.hasExtra(PRESENTER_ARGUMENT_KEY)) {
String presenterType = intent.getStringExtra(PRESENTER_ARGUMENT_KEY);
if (presenterType.equals(MangaPresenterOnlineImpl.TAG)) {
mMangaPresenter = new MangaPresenterOnlineImpl(this, this);
} else if (presenterType.equals(MangaPresenterOfflineImpl.TAG)) {
mMangaPresenter = new MangaPresenterOfflineImpl(this, this);
}
}
}
setContentView(R.layout.activity_manga);
mToolbar = (Toolbar)findViewById(R.id.mainToolbar);
mSwipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipeRefreshLayout);
mListView = (ListView)findViewById(R.id.listView);
mEmptyRelativeLayout = (RelativeLayout)findViewById(R.id.emptyRelativeLayout);
mHeaderInfoView = LayoutInflater.from(this).inflate(R.layout.header_manga_info, null);
mHeaderImageView = (ImageView)mHeaderInfoView.findViewById(R.id.headerImageView);
mMaskImageView = mHeaderInfoView.findViewById(R.id.maskImageView);
mTitleAuthorTextView = (TextView)mHeaderInfoView.findViewById(R.id.authorTitleTextView);
mTitleArtistTextView = (TextView)mHeaderInfoView.findViewById(R.id.artistTitleTextView);
mTitleGenreTextView = (TextView)mHeaderInfoView.findViewById(R.id.genreTitleTextView);
mTitleStatusTextView = (TextView)mHeaderInfoView.findViewById(R.id.statusTitleTextView);
mNameTextView = (TextView)mHeaderInfoView.findViewById(R.id.nameTextView);
mDescriptionTextView = (TextView)mHeaderInfoView.findViewById(R.id.descriptionTextView);
mAuthorTextView = (TextView)mHeaderInfoView.findViewById(R.id.authorTextView);
mArtistTextView = (TextView)mHeaderInfoView.findViewById(R.id.artistTextView);
mGenreTextView = (TextView)mHeaderInfoView.findViewById(R.id.genreTextView);
mStatusTextView = (TextView)mHeaderInfoView.findViewById(R.id.statusTextView);
mFavouriteButton = (FloatingActionButton)mHeaderInfoView.findViewById(R.id.favouriteButton);
mHeaderChapterView = (RelativeLayout)LayoutInflater.from(this).inflate(R.layout.header_manga_chapter, null);
mChapterErrorTextView = (TextView)mHeaderChapterView.findViewById(R.id.chapterErrorTextView);
if (savedInstanceState != null) {
mMangaPresenter.restoreState(savedInstanceState);
} else {
mMangaPresenter.handleInitialArguments(getIntent());
}
mMangaPresenter.initializeViews();
mMangaPresenter.initializeDataFromUrl();
}
@Override
protected void onStart() {
super.onStart();
mMangaPresenter.registerForEvents();
}
@Override
protected void onResume() {
super.onResume();
mMangaPresenter.onResume();
}
@Override
protected void onStop() {
mMangaPresenter.unregisterForEvents();
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMangaPresenter.destroyAllSubscriptions();
mMangaPresenter.releaseAllResources();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mMangaPresenter.saveState(outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.manga, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_refresh:
mMangaPresenter.onOptionRefresh();
return true;
case R.id.action_mark_read:
mMangaPresenter.onOptionMarkRead();
return true;
case R.id.action_download:
mMangaPresenter.onOptionDownload();
return true;
case R.id.action_to_top:
mMangaPresenter.onOptionToTop();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// MangaView:
@Override
public void initializeToolbar() {
if (mToolbar != null) {
mToolbar.setTitle(R.string.fragment_manga);
mToolbar.setBackgroundColor(getResources().getColor(R.color.primaryBlue500));
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
@Override
public void initializeSwipeRefreshLayout() {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 64, getResources().getDisplayMetrics()));
mSwipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.accentPinkA200));
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mMangaPresenter.onSwipeRefresh();
}
});
}
}
@Override
public void initializeAbsListView() {
if (mListView != null) {
mListView.setVisibility(View.INVISIBLE);
if (mHeaderInfoView != null) {
mListView.addHeaderView(mHeaderInfoView, null, false);
}
if (mHeaderChapterView != null) {
mListView.addHeaderView(mHeaderChapterView, null, false);
}
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int actualPosition = position - mListView.getHeaderViewsCount();
mMangaPresenter.onChapterClick(actualPosition);
}
});
}
}
@Override
public void initializeDeletionListView() {
if (mListView != null) {
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
mode.setTitle(getResources().getString(R.string.manga_offline_selection_title) + " " + mListView.getCheckedItemCount());
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle(getResources().getString(R.string.manga_offline_selection_title) + " " + mListView.getCheckedItemCount());
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.manga_offline_selection, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_delete:
mMangaPresenter.onOptionDelete();
mode.finish();
return true;
case R.id.action_select_all:
mMangaPresenter.onOptionSelectAll();
return false;
case R.id.action_clear:
mMangaPresenter.onOptionClear();
return false;
default:
return false;
}
}
@Override
public void onDestroyActionMode(ActionMode mode) {
// Do Nothing.
}
});
}
}
@Override
public void initializeEmptyRelativeLayout() {
if (mEmptyRelativeLayout != null) {
((ImageView) mEmptyRelativeLayout.findViewById(R.id.emptyImageView)).setImageResource(R.drawable.ic_image_white_48dp);
((ImageView) mEmptyRelativeLayout.findViewById(R.id.emptyImageView)).setColorFilter(getResources().getColor(R.color.accentPinkA200), PorterDuff.Mode.MULTIPLY);
((TextView) mEmptyRelativeLayout.findViewById(R.id.emptyTextView)).setText(R.string.no_manga);
((TextView) mEmptyRelativeLayout.findViewById(R.id.instructionsTextView)).setText(R.string.manga_instructions);
}
}
@Override
public void initializeFavouriteButton(boolean isFavourite) {
if (mFavouriteButton != null) {
if (isFavourite) {
mFavouriteButton.setImageResource(R.drawable.ic_favourite_white_24dp);
} else {
mFavouriteButton.setImageResource(R.drawable.ic_favourite_outline_white_24dp);
}
mFavouriteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMangaPresenter.onFavourite();
}
});
}
}
@Override
public void hideEmptyRelativeLayout() {
if (mEmptyRelativeLayout != null) {
mEmptyRelativeLayout.setVisibility(View.GONE);
}
}
@Override
public void showEmptyRelativeLayout() {
// Do Nothing.
}
@Override
public void showListViewIfHidden() {
if (mListView != null) {
if (mListView.getVisibility() != View.VISIBLE) {
mListView.setVisibility(View.VISIBLE);
}
}
}
@Override
public void showChapterStatusError() {
if (mChapterErrorTextView != null) {
mChapterErrorTextView.setVisibility(View.VISIBLE);
}
}
@Override
public void hideChapterStatusError() {
if (mChapterErrorTextView != null) {
mChapterErrorTextView.setVisibility(View.GONE);
}
}
@Override
public void showRefreshing() {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setRefreshing(true);
}
}
@Override
public void hideRefreshing() {
if (mSwipeRefreshLayout != null) {
mSwipeRefreshLayout.setRefreshing(false);
}
}
@Override
public void setTitle(String title) {
if (mToolbar != null) {
mToolbar.setTitle(title);
}
}
@Override
public void setName(String name) {
if (mNameTextView != null) {
mNameTextView.setText(name);
}
}
@Override
public void setDescription(String description) {
if (mDescriptionTextView != null) {
mDescriptionTextView.setText(Html.fromHtml(description));
}
}
@Override
public void setAuthor(String author) {
if (mAuthorTextView != null) {
mAuthorTextView.setText(author);
}
}
@Override
public void setArtist(String artist) {
if (mArtistTextView != null) {
mArtistTextView.setText(artist);
}
}
@Override
public void setGenre(String genre) {
if (mGenreTextView != null) {
mGenreTextView.setText(genre);
}
}
@Override
public void setIsCompleted(boolean isCompleted) {
if (mStatusTextView != null) {
if (isCompleted) {
mStatusTextView.setText(R.string.manga_header_status_completed);
} else {
mStatusTextView.setText(R.string.manga_header_status_ongoing);
}
}
}
@Override
public void setThumbnail(String url) {
if (mHeaderImageView != null) {
mHeaderImageView.setScaleType(ImageView.ScaleType.CENTER);
Drawable placeHolderDrawable = getResources().getDrawable(R.drawable.ic_image_white_48dp);
placeHolderDrawable.setColorFilter(getResources().getColor(R.color.accentPinkA200), PorterDuff.Mode.MULTIPLY);
Drawable errorHolderDrawable = getResources().getDrawable(R.drawable.ic_error_white_48dp);
errorHolderDrawable.setColorFilter(getResources().getColor(R.color.accentPinkA200), PorterDuff.Mode.MULTIPLY);
Glide.with(this)
.load(url)
.asBitmap()
.transcode(new PaletteBitmapTranscoder(), PaletteBitmapWrapper.class)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.animate(android.R.anim.fade_in)
.placeholder(placeHolderDrawable)
.error(errorHolderDrawable)
.into(new PaletteBitmapTarget(mHeaderImageView) {
@Override
public void onResourceReady(PaletteBitmapWrapper resource, GlideAnimation<? super PaletteBitmapWrapper> glideAnimation) {
super.onResourceReady(resource, glideAnimation);
mHeaderImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
int color = PaletteUtils.getColorWithDefault(resource.getPalette(), getResources().getColor(R.color.primaryBlue500));
applyColorOverlay(color);
}
});
}
}
@Override
public void setFavouriteButton(boolean isFavourite) {
if (mFavouriteButton != null) {
if (isFavourite) {
mFavouriteButton.setImageResource(R.drawable.ic_favourite_white_24dp);
} else {
mFavouriteButton.setImageResource(R.drawable.ic_favourite_outline_white_24dp);
}
}
}
@Override
public int getHeaderViewsCount() {
if (mListView != null) {
return mListView.getHeaderViewsCount();
} else {
return 0;
}
}
@Override
public void scrollToTop() {
if (mListView != null) {
mListView.smoothScrollToPosition(0);
}
}
@Override
public void selectAll() {
if (mListView != null) {
for (int index = mListView.getHeaderViewsCount(); index < mListView.getCount(); index++) {
mListView.setItemChecked(index, true);
}
}
}
@Override
public void clear() {
if (mListView != null) {
for (int index = mListView.getHeaderViewsCount(); index < mListView.getCount(); index++) {
mListView.setItemChecked(index, false);
}
}
}
@Override
public void toastMangaError() {
Toast.makeText(this, R.string.toast_manga_error, Toast.LENGTH_SHORT).show();
}
@Override
public Context getContext() {
return this;
}
// MangaMapper:
@Override
public void registerAdapter(BaseAdapter adapter) {
if (mListView != null) {
mListView.setAdapter(adapter);
}
}
@Override
public SparseBooleanArray getCheckedItemPositions() {
if (mListView != null) {
return mListView.getCheckedItemPositions();
} else {
return null;
}
}
@Override
public Parcelable getPositionState() {
if (mListView != null) {
return mListView.onSaveInstanceState();
} else {
return null;
}
}
@Override
public void setPositionState(Parcelable state) {
if (mListView != null) {
mListView.onRestoreInstanceState(state);
}
}
private void applyColorOverlay(int rgbColor) {
mMangaPresenter.onApplyColorChange(rgbColor);
if (mToolbar != null) {
mToolbar.setBackgroundColor(rgbColor);
}
if (mMaskImageView != null) {
mMaskImageView.setBackgroundColor(rgbColor);
}
if (mNameTextView != null) {
mNameTextView.setTextColor(rgbColor);
}
if (mTitleAuthorTextView != null) {
mTitleAuthorTextView.setTextColor(rgbColor);
}
if (mTitleArtistTextView != null) {
mTitleArtistTextView.setTextColor(rgbColor);
}
if (mTitleGenreTextView != null) {
mTitleGenreTextView.setTextColor(rgbColor);
}
if (mTitleStatusTextView != null) {
mTitleStatusTextView.setTextColor(rgbColor);
}
if (mFavouriteButton != null) {
mFavouriteButton.setColorNormal(rgbColor);
}
if (mHeaderChapterView != null) {
mHeaderChapterView.setBackgroundColor(rgbColor);
}
if (mListView != null) {
mListView.invalidateViews();
}
}
}