package com.boardgamegeek.ui;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.support.v7.app.ActionBar;
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.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;
import android.widget.TextView;
import com.boardgamegeek.R;
import com.boardgamegeek.events.CollectionViewRequestedEvent;
import com.boardgamegeek.events.GameSelectedEvent;
import com.boardgamegeek.events.GameShortcutCreatedEvent;
import com.boardgamegeek.provider.BggContract.CollectionViews;
import com.boardgamegeek.util.ActivityUtils;
import com.boardgamegeek.util.PreferencesUtils;
import com.boardgamegeek.util.ShortcutUtils;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.ContentViewEvent;
import com.crashlytics.android.answers.CustomEvent;
import org.greenrobot.eventbus.Subscribe;
import hugo.weaving.DebugLog;
import icepick.Icepick;
import icepick.State;
public class CollectionActivity extends TopLevelSinglePaneActivity implements LoaderCallbacks<Cursor> {
private CollectionViewAdapter adapter;
private long viewId;
@State int viewIndex;
private Spinner spinner;
private boolean isCreatingShortcut;
@Override
@DebugLog
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Icepick.restoreInstanceState(this, savedInstanceState);
viewId = savedInstanceState != null ? -1 : PreferencesUtils.getViewDefaultId(this);
isCreatingShortcut = Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction());
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
if (isCreatingShortcut) {
actionBar.setHomeButtonEnabled(false);
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setTitle(R.string.app_name);
} else {
actionBar.setDisplayShowTitleEnabled(false);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(R.layout.actionbar_collection);
}
}
if (!isCreatingShortcut) {
getSupportLoaderManager().restartLoader(Query._TOKEN, null, this);
}
if (savedInstanceState == null) {
Answers.getInstance().logContentView(new ContentViewEvent().putContentType("Collection"));
}
}
@Override
@DebugLog
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Icepick.saveInstanceState(this, outState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
spinner = (Spinner) findViewById(R.id.menu_spinner);
bindSpinner();
return true;
}
@Override
protected int getOptionsMenuId() {
if (isCreatingShortcut) {
return super.getOptionsMenuId();
} else {
return R.menu.search;
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.menu_search) {
Intent intent = new Intent(this, SearchResultsActivity.class);
startActivity(intent);
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
@Override
@DebugLog
protected Fragment onCreatePane() {
return new CollectionFragment();
}
@Override
protected int getDrawerResId() {
return R.string.title_collection;
}
@SuppressWarnings("unused")
@DebugLog
@Subscribe
public void onEvent(GameSelectedEvent event) {
ActivityUtils.launchGame(this, event.getId(), event.getName());
}
@SuppressWarnings("unused")
@DebugLog
@Subscribe
public void onEvent(GameShortcutCreatedEvent event) {
Intent intent = ShortcutUtils.createIntent(this, event.getId(), event.getName(), event.getThumbnailUrl());
if (intent != null) {
setResult(RESULT_OK, intent);
}
finish();
}
@SuppressWarnings("unused")
@DebugLog
@Subscribe
public void onEvent(CollectionViewRequestedEvent event) {
viewId = event.getViewId();
viewIndex = findViewIndex(viewId);
}
@Override
@DebugLog
public Loader<Cursor> onCreateLoader(int id, Bundle data) {
CursorLoader loader = null;
if (id == Query._TOKEN) {
loader = new CursorLoader(this, CollectionViews.CONTENT_URI, Query.PROJECTION, null, null, null);
}
return loader;
}
@Override
@DebugLog
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (loader.getId() == Query._TOKEN) {
if (adapter == null) {
adapter = new CollectionViewAdapter(this, cursor);
} else {
adapter.changeCursor(cursor);
}
if (viewId != -1) {
viewIndex = findViewIndex(viewId);
}
bindSpinner();
} else {
cursor.close();
}
}
private void bindSpinner() {
if (spinner != null && adapter != null) {
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
CollectionFragment fragment = (CollectionFragment) getFragment();
long oldId = fragment.getViewId();
if (id != oldId) {
Answers.getInstance().logCustom(new CustomEvent("CollectionViewSelected"));
viewIndex = findViewIndex(id);
if (id < 0) {
fragment.clearView();
} else {
fragment.setView(id);
}
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing
}
});
spinner.setSelection(viewIndex);
}
}
@Override
@DebugLog
public void onLoaderReset(Loader<Cursor> loader) {
adapter.changeCursor(null);
}
@DebugLog
private int findViewIndex(long viewId) {
int index = 0;
if (viewId > 0) {
Cursor c = adapter.getCursor();
if (c != null && c.moveToFirst()) {
do {
if (viewId == c.getLong(Query._ID)) {
return c.getPosition() + 1;
}
} while (c.moveToNext());
}
}
return index;
}
private static class CollectionViewAdapter extends SimpleCursorAdapter {
private final LayoutInflater inflater;
public CollectionViewAdapter(Context context, Cursor cursor) {
super(context,
R.layout.actionbar_spinner_item,
cursor,
new String[] { CollectionViews._ID, CollectionViews.NAME },
new int[] { 0, android.R.id.text1 },
0);
setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return super.getCount() + 1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (position == 0) {
return createDefaultItem(convertView, parent, R.layout.actionbar_spinner_item);
} else {
try {
return super.getView(position - 1, convertView, parent);
} catch (IllegalStateException e) {
return createDefaultItem(convertView, parent, R.layout.actionbar_spinner_item);
}
}
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
if (position == 0) {
return createDefaultItem(convertView, parent, R.layout.support_simple_spinner_dropdown_item);
} else {
return super.getDropDownView(position - 1, convertView, parent);
}
}
private View createDefaultItem(View convertView, ViewGroup parent, int layout) {
View v;
if (convertView == null) {
v = inflater.inflate(layout, parent, false);
} else {
v = convertView;
}
((TextView) v).setText(R.string.title_collection);
return v;
}
@Override
public Object getItem(int position) {
if (position == 0) {
return null;
}
return super.getItem(position - 1);
}
@Override
public long getItemId(int position) {
if (position == 0) {
return PreferencesUtils.VIEW_ID_COLLECTION;
}
return super.getItemId(position - 1);
}
}
private interface Query {
int _TOKEN = 0x01;
String[] PROJECTION = { CollectionViews._ID, CollectionViews.NAME, CollectionViews.SORT_TYPE, };
int _ID = 0;
}
}