package com.boardgamegeek.ui; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.res.ColorStateList; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v7.graphics.Palette; import android.view.MenuItem; import android.widget.Toast; import com.boardgamegeek.R; import com.boardgamegeek.events.CollectionItemChangedEvent; import com.boardgamegeek.events.CollectionItemDeletedEvent; import com.boardgamegeek.events.CollectionItemUpdatedEvent; import com.boardgamegeek.events.UpdateCompleteEvent; import com.boardgamegeek.events.UpdateEvent; import com.boardgamegeek.provider.BggContract; import com.boardgamegeek.service.SyncService; import com.boardgamegeek.service.UpdateService; import com.boardgamegeek.tasks.DeleteCollectionItemTask; import com.boardgamegeek.tasks.ResetCollectionItemTask; import com.boardgamegeek.util.ActivityUtils; import com.boardgamegeek.util.DialogUtils; import com.boardgamegeek.util.ImageUtils; import com.boardgamegeek.util.ImageUtils.Callback; import com.boardgamegeek.util.PaletteUtils; import com.boardgamegeek.util.PresentationUtils; import com.boardgamegeek.util.ScrimUtils; import com.boardgamegeek.util.TaskUtils; import com.crashlytics.android.answers.Answers; import com.crashlytics.android.answers.ContentViewEvent; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import butterknife.OnClick; import hugo.weaving.DebugLog; import icepick.Icepick; import icepick.State; public class GameCollectionActivity extends HeroActivity implements Callback { private long internalId; private int gameId; private String gameName; private String imageUrl; @State boolean isInEditMode; private boolean isItemUpdated; @DebugLog @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Intent intent = getIntent(); int collectionId = intent.getIntExtra(ActivityUtils.KEY_COLLECTION_ID, BggContract.INVALID_ID); gameId = intent.getIntExtra(ActivityUtils.KEY_GAME_ID, BggContract.INVALID_ID); internalId = intent.getLongExtra(ActivityUtils.KEY_INTERNAL_ID, BggContract.INVALID_ID); gameName = intent.getStringExtra(ActivityUtils.KEY_GAME_NAME); String collectionName = intent.getStringExtra(ActivityUtils.KEY_COLLECTION_NAME); imageUrl = intent.getStringExtra(ActivityUtils.KEY_IMAGE_URL); Icepick.restoreInstanceState(this, savedInstanceState); safelySetTitle(collectionName); if (savedInstanceState == null) { Answers.getInstance().logContentView(new ContentViewEvent() .putContentType("GameCollection") .putContentId(String.valueOf(collectionId)) .putContentName(collectionName)); } PresentationUtils.ensureFabIsShown(fab); } @Override protected void onResume() { super.onResume(); setEditMode(); } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); Icepick.saveInstanceState(this, outState); } @Override public void onBackPressed() { if (isInEditMode && isItemUpdated) { DialogUtils.createConfirmationDialog(this, R.string.are_you_sure_cancel_collection_edit, new OnClickListener() { public void onClick(DialogInterface dialog, int id) { ResetCollectionItemTask task = new ResetCollectionItemTask(GameCollectionActivity.this, internalId, gameId); TaskUtils.executeAsyncTask(task); GameCollectionActivity.super.onBackPressed(); } }).show(); } else { super.onBackPressed(); } } @DebugLog @Override protected Fragment onCreatePane() { return new GameCollectionFragment(); } @Override protected int getOptionsMenuId() { return R.menu.game_collection; } @DebugLog @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (gameId == BggContract.INVALID_ID) { onBackPressed(); } else { ActivityUtils.navigateUpToGame(this, gameId, gameName); } finish(); return true; case R.id.menu_view_image: ActivityUtils.startImageActivity(this, imageUrl); return true; case R.id.menu_delete: DialogUtils.createConfirmationDialog(this, R.string.are_you_sure_delete_collection_item, new OnClickListener() { public void onClick(DialogInterface dialog, int id) { TaskUtils.executeAsyncTask(new DeleteCollectionItemTask(GameCollectionActivity.this, internalId)); finish(); } }).show(); return true; } return super.onOptionsItemSelected(item); } @SuppressWarnings("unused") @DebugLog @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(CollectionItemChangedEvent event) { safelySetTitle(event.getCollectionName()); ScrimUtils.applyInvertedScrim(scrimView); ImageUtils.safelyLoadImage(toolbarImage, event.getImageUrl(), this); } @DebugLog @Override public void onSuccessfulImageLoad(Palette palette) { ((GameCollectionFragment) getFragment()).onPaletteGenerated(palette); fab.setBackgroundTintList(ColorStateList.valueOf(PaletteUtils.getIconSwatch(palette).getRgb())); fab.show(); } @Override public void onFailedImageLoad() { fab.show(); } @DebugLog @Override public void onRefresh() { ((GameCollectionFragment) getFragment()).triggerRefresh(); } @SuppressWarnings("unused") @DebugLog @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onEvent(UpdateEvent event) { updateRefreshStatus(event.getType() == UpdateService.SYNC_TYPE_GAME_COLLECTION); } @SuppressWarnings({ "unused", "UnusedParameters" }) @DebugLog @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onEvent(UpdateCompleteEvent event) { updateRefreshStatus(false); } @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(CollectionItemDeletedEvent event) { if (internalId == event.getInternalId()) { Toast.makeText(this, R.string.msg_collection_item_deleted, Toast.LENGTH_LONG).show(); SyncService.sync(this, SyncService.FLAG_SYNC_COLLECTION_UPLOAD); isItemUpdated = false; } } @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onEvent(CollectionItemUpdatedEvent event) { if (internalId == event.getInternalId()) { isItemUpdated = true; } } @DebugLog @OnClick(R.id.fab) public void onFabClicked() { isInEditMode = !isInEditMode; setEditMode(); } private void setEditMode() { ((GameCollectionFragment) getFragment()).enableEditMode(isInEditMode); fab.setImageResource(isInEditMode ? R.drawable.fab_done : R.drawable.fab_edit); } }