package com.boardgamegeek.ui; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.util.Pair; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.TableLayout; import android.widget.TextView; import com.boardgamegeek.R; import com.boardgamegeek.ui.dialog.PlayStatsSettingsDialogFragment; import com.boardgamegeek.ui.model.PlayStats; import com.boardgamegeek.ui.widget.PlayStatView.Builder; import com.boardgamegeek.util.DialogUtils; import com.boardgamegeek.util.PreferencesUtils; import com.boardgamegeek.util.StringUtils; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.Unbinder; public class PlayStatsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, SharedPreferences.OnSharedPreferenceChangeListener { private static final int TOKEN = 0x01; private Unbinder unbinder; @BindView(R.id.progress) View progressView; @BindView(R.id.empty) View emptyView; @BindView(R.id.data) ViewGroup dataView; @BindView(R.id.table) TableLayout table; @BindView(R.id.table_hindex) TableLayout hIndexTable; @BindView(R.id.accuracy_message) TextView accuracyMessage; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_play_stats, container, false); unbinder = ButterKnife.bind(this, rootView); bindAccuracyMessage(); return rootView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().restartLoader(TOKEN, null, this); } @Override public void onResume() { super.onResume(); PreferenceManager.getDefaultSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { super.onPause(); PreferenceManager.getDefaultSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(this); } @Override public void onDestroyView() { super.onDestroyView(); unbinder.unbind(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { CursorLoader loader = null; switch (id) { case TOKEN: loader = new CursorLoader(getActivity(), PlayStats.getUri(), PlayStats.PROJECTION, PlayStats.getSelection(getActivity()), PlayStats.getSelectionArgs(getActivity()), PlayStats.getSortOrder()); loader.setUpdateThrottle(2000); break; } return loader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { if (getActivity() == null) { return; } if (cursor == null || !cursor.moveToFirst()) { showEmpty(); return; } int token = loader.getId(); switch (token) { case TOKEN: PlayStats stats = PlayStats.fromCursor(cursor); bindUi(stats); showData(); break; default: cursor.close(); break; } } @Override public void onLoaderReset(Loader<Cursor> loader) { } private void bindAccuracyMessage() { List<String> things = new ArrayList<>(3); if (!PreferencesUtils.logPlayStatsIncomplete(getActivity())) { things.add(getString(R.string.incomplete_games).toLowerCase()); } if (!PreferencesUtils.logPlayStatsExpansions(getActivity())) { things.add(getString(R.string.expansions).toLowerCase()); } if (!PreferencesUtils.logPlayStatsAccessories(getActivity())) { things.add(getString(R.string.accessories).toLowerCase()); } accuracyMessage.setVisibility(things.size() == 0 ? View.GONE : View.VISIBLE); accuracyMessage.setText(getString(R.string.play_stat_status_accuracy, StringUtils.formatList(things, getString(R.string.or).toLowerCase(), ","))); } private void bindUi(PlayStats stats) { table.removeAllViews(); addStatRow(table, new Builder().labelId(R.string.play_stat_play_count).value(stats.getNumberOfPlays())); addStatRow(table, new Builder().labelId(R.string.play_stat_distinct_games).value(stats.getNumberOfGames())); addStatRow(table, new Builder().labelId(R.string.play_stat_quarters).value(stats.getNumberOfQuarters())); addStatRow(table, new Builder().labelId(R.string.play_stat_dimes).value(stats.getNumberOfDimes())); addStatRow(table, new Builder().labelId(R.string.play_stat_nickels).value(stats.getNumberOfNickels())); addStatRow(table, new Builder().labelId(R.string.play_stat_top_100).value(stats.getTop100Count() + "%")); hIndexTable.removeAllViews(); addStatRow(hIndexTable, new Builder().labelId(R.string.play_stat_h_index).value(stats.getHIndex()).infoId(R.string.play_stat_h_index_info)); addDivider(hIndexTable); boolean addDivider = true; for (Pair<String, Integer> game : stats.getHIndexGames()) { final Builder builder = new Builder().labelText(game.first).value(game.second); if (game.second == stats.getHIndex()) { builder.backgroundResource(R.color.light_blue_transparent); addDivider = false; } else if (game.second < stats.getHIndex() && addDivider) { addDivider(hIndexTable); addDivider = false; } addStatRow(hIndexTable, builder); } PreferencesUtils.updateHIndex(getActivity(), stats.getHIndex()); } private void showEmpty() { progressView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out)); emptyView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in)); progressView.setVisibility(View.GONE); emptyView.setVisibility(View.VISIBLE); dataView.setVisibility(View.GONE); } private void showData() { progressView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_out)); dataView.startAnimation(AnimationUtils.loadAnimation(getActivity(), android.R.anim.fade_in)); progressView.setVisibility(View.GONE); emptyView.setVisibility(View.GONE); dataView.setVisibility(View.VISIBLE); } private void addStatRow(ViewGroup container, Builder builder) { container.addView(builder.build(getActivity())); } private void addDivider(ViewGroup container) { View view = new View(getActivity()); view.setLayoutParams(new TableLayout.LayoutParams(0, 1)); view.setBackgroundResource(R.color.dark_blue); container.addView(view); } @OnClick(R.id.settings) void onSettingsClick() { PlayStatsSettingsDialogFragment df = PlayStatsSettingsDialogFragment.newInstance(dataView); DialogUtils.showFragment(getActivity(), df, "play_stats_settings"); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.startsWith(PreferencesUtils.LOG_PLAY_STATS_PREFIX)) { bindAccuracyMessage(); getLoaderManager().restartLoader(TOKEN, null, this); } } }