/* * This file is part of Popcorn Time. * * Popcorn Time is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Popcorn Time is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Popcorn Time. If not, see <http://www.gnu.org/licenses/>. */ package pct.droid.activities; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import net.rdrei.android.dirchooser.DirectoryChooserConfig; import net.rdrei.android.dirchooser.DirectoryChooserFragment; import java.io.File; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import pct.droid.R; import pct.droid.activities.base.PopcornBaseActivity; import pct.droid.adapters.PreferencesListAdapter; import pct.droid.base.fragments.dialog.NumberPickerDialogFragment; import pct.droid.base.fragments.dialog.StringArraySelectorDialogFragment; import pct.droid.base.content.preferences.PrefItem; import pct.droid.base.content.preferences.PreferencesHandler; import pct.droid.base.utils.PrefUtils; import pct.droid.base.utils.ResourceUtils; import pct.droid.fragments.dialog.ColorPickerDialogFragment; import pct.droid.fragments.dialog.SeekBarDialogFragment; import pct.droid.utils.ToolbarUtils; public class PreferencesActivity extends PopcornBaseActivity implements SharedPreferences.OnSharedPreferenceChangeListener, PreferencesHandler { private List<PrefItem> mPrefItems = new ArrayList<>(); private LinearLayoutManager mLayoutManager; @Bind(R.id.toolbar) Toolbar toolbar; @Bind(R.id.recyclerView) RecyclerView recyclerView; @Bind(R.id.rootLayout) ViewGroup rootLayout; public static Intent startActivity(Activity activity) { Intent intent = new Intent(activity, PreferencesActivity.class); activity.startActivity(intent); return intent; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState, R.layout.activity_preferences); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(R.string.preferences); ToolbarUtils.updateToolbarHeight(this, toolbar); mLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(mLayoutManager); PrefUtils.getPrefs(this).registerOnSharedPreferenceChangeListener(this); refreshItems(); } @Override protected void onDestroy() { super.onDestroy(); PrefUtils.getPrefs(this).unregisterOnSharedPreferenceChangeListener(this); } private void refreshItems() { mPrefItems = ItemsGenerator.generate(this, false); if (recyclerView.getAdapter() != null && mLayoutManager != null) { int position = mLayoutManager.findFirstVisibleItemPosition(); View v = mLayoutManager.findViewByPosition(position); recyclerView.setAdapter(new PreferencesListAdapter(mPrefItems)); if (v != null) { int offset = v.getTop(); mLayoutManager.scrollToPositionWithOffset(position, offset); } else { mLayoutManager.scrollToPosition(position); } } else { recyclerView.setAdapter(new PreferencesListAdapter(mPrefItems)); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); refreshItems(); toolbar.setMinimumHeight((int) ResourceUtils.getAttributeDimension(this, this.getTheme(), R.attr.actionBarSize)); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (isUseChangeablePref(key)) { refreshItems(); } } private boolean isUseChangeablePref(String key) { boolean b = false; for (Object item : mPrefItems) { if (item instanceof PrefItem) { PrefItem pref = (PrefItem) item; if (pref.getPrefKey() != null && pref.getPrefKey().equals(key)) b = true; } } return b; } @Override public void openListSelection(String title, String[] items, SelectionMode mode, Object value, int low, int high, final OnSelectionListener onSelectionListener) { DialogInterface.OnClickListener onDialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { onSelectionListener.onSelection(which, null); dialog.dismiss(); } }; if (mode == SelectionMode.NORMAL) { StringArraySelectorDialogFragment.show(getSupportFragmentManager(), title, items, (Integer) value, onDialogClickListener); } else if(mode == SelectionMode.ADVANCED_CHOICE || mode == SelectionMode.SIMPLE_CHOICE) { StringArraySelectorDialogFragment.showSingleChoice(getSupportFragmentManager(), title, items, (Integer) value, onDialogClickListener); } else if(mode == SelectionMode.COLOR) { Bundle args = new Bundle(); args.putString(ColorPickerDialogFragment.TITLE, title); args.putInt(ColorPickerDialogFragment.DEFAULT_VALUE, (Integer) value); ColorPickerDialogFragment dialogFragment = new ColorPickerDialogFragment(); dialogFragment.setArguments(args); dialogFragment.setOnResultListener(new ColorPickerDialogFragment.ResultListener() { @Override public void onNewValue(int value) { onSelectionListener.onSelection(0, value); } }); dialogFragment.show(getFragmentManager(), "pref_fragment"); } else if(mode == SelectionMode.DIRECTORY) { String[] directoryOptions = {getString(R.string.storage_automatic), getString(R.string.storage_choose)}; StringArraySelectorDialogFragment.show(getSupportFragmentManager(), title, directoryOptions, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int position) { if (position == 0) { onSelectionListener.onSelection(0, null); } else { DirectoryChooserConfig config = DirectoryChooserConfig.builder() .newDirectoryName("Popcorn-Time") .build(); final DirectoryChooserFragment directoryChooserFragment = DirectoryChooserFragment.newInstance(config); directoryChooserFragment.setDirectoryChooserListener(new DirectoryChooserFragment.OnFragmentInteractionListener() { @Override public void onSelectDirectory(String s) { File f = new File(s); if (f.canWrite()) { onSelectionListener.onSelection(0, s); directoryChooserFragment.dismiss(); } else { Toast.makeText(PreferencesActivity.this, R.string.not_writable, Toast.LENGTH_SHORT).show(); } } @Override public void onCancelChooser() { directoryChooserFragment.dismiss(); } }); dialog.dismiss(); directoryChooserFragment.show(getFragmentManager(), "pref_fragment"); } } }); } else if(mode == SelectionMode.NUMBER && high - low > 200) { Bundle args = new Bundle(); args.putString(SeekBarDialogFragment.TITLE, title); args.putInt(SeekBarDialogFragment.MAX_VALUE, high); args.putInt(SeekBarDialogFragment.MIN_VALUE, low); args.putInt(SeekBarDialogFragment.DEFAULT_VALUE, ((Integer) value) / 1000); SeekBarDialogFragment dialogFragment = new SeekBarDialogFragment(); dialogFragment.setArguments(args); dialogFragment.setOnResultListener(new SeekBarDialogFragment.ResultListener() { @Override public void onNewValue(int value) { onSelectionListener.onSelection(0, value); } }); dialogFragment.show(getFragmentManager(), "pref_fragment"); } else if(mode == SelectionMode.NUMBER) { Bundle args = new Bundle(); args.putString(NumberPickerDialogFragment.TITLE, title); args.putInt(NumberPickerDialogFragment.MAX_VALUE, high); args.putInt(NumberPickerDialogFragment.MIN_VALUE, low); args.putInt(NumberPickerDialogFragment.DEFAULT_VALUE, (int) value); NumberPickerDialogFragment dialogFragment = new NumberPickerDialogFragment(); dialogFragment.setArguments(args); dialogFragment.setOnResultListener(new NumberPickerDialogFragment.ResultListener() { @Override public void onNewValue(int value) { onSelectionListener.onSelection(0, value); } }); dialogFragment.show(getSupportFragmentManager(), "pref_fragment"); } } @Override public void showMessage(String message) { if(message.equals(PreferencesHandler.ABOUT)) { AboutActivity.startActivity(this); return; } Snackbar.make(rootLayout, message, Snackbar.LENGTH_SHORT).show(); } }