package com.pluscubed.plustimer.ui; import android.app.Fragment; import android.app.FragmentManager; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v14.preference.MultiSelectListPreference; import android.support.v14.preference.PreferenceFragment; import android.support.v4.content.ContextCompat; import android.support.v4.view.ViewCompat; import android.support.v7.preference.EditTextPreference; import android.support.v7.preference.ListPreference; import android.support.v7.preference.PreferenceViewHolder; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import com.pluscubed.plustimer.R; import com.pluscubed.plustimer.model.PuzzleType; import com.pluscubed.plustimer.ui.basedrawer.ThemableActivity; import com.pluscubed.plustimer.utils.PrefUtils; import com.pluscubed.plustimer.utils.Utils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import rx.android.schedulers.AndroidSchedulers; /** * Settings Activity and Fragment */ public class SettingsActivity extends ThemableActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_with_toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_actionbar); setSupportActionBar(toolbar); FragmentManager fm = getFragmentManager(); Fragment f = fm.findFragmentById(R.id .activity_with_toolbar_content_framelayout); if (f == null) { fm.beginTransaction() .replace(R.id.activity_with_toolbar_content_framelayout, new SettingsFragment()) .commit(); } getSupportActionBar().setDisplayHomeAsUpEnabled(true); setTitle(R.string.settings); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } public static class SettingsFragment extends PreferenceFragment { @Override public void onCreatePreferences(Bundle bundle, String s) { addPreferencesFromResource(R.xml.preferences); EditTextPreference size = (EditTextPreference) findPreference(PrefUtils.PREF_TIME_TEXT_SIZE_EDITTEXT); size.setOnPreferenceChangeListener((preference, newValue) -> { if (Integer.valueOf(newValue.toString()) > 500) { Toast.makeText(getActivity(), getString(R.string.text_size_warning), Toast.LENGTH_SHORT) .show(); return false; } EditTextPreference size1 = (EditTextPreference) preference; size1.setSummary(newValue.toString()); return true; }); size.setSummary(size.getText()); EditTextPreference scrambleSize = (EditTextPreference) findPreference(PrefUtils.PREF_SCRAMBLE_TEXT_SIZE_EDITTEXT); scrambleSize.setOnPreferenceChangeListener((preference, newValue) -> { if (Integer.valueOf(newValue.toString()) > 500) { Toast.makeText(getActivity(), getString(R.string.text_size_warning), Toast.LENGTH_SHORT) .show(); return false; } EditTextPreference scrambleSize1 = (EditTextPreference) preference; scrambleSize1.setSummary(newValue.toString()); return true; }); scrambleSize.setSummary(scrambleSize.getText()); ListPreference updateOccurrence = (ListPreference) findPreference(PrefUtils.PREF_UPDATE_TIME_LIST); updateOccurrence.setEntryValues(new String[]{"0", "1", "2"}); ListPreference theme = (ListPreference) findPreference(PrefUtils.PREF_THEME_LIST); theme.setEntryValues(new String[]{"0", "1", "2"}); theme.setOnPreferenceChangeListener((preference, newValue) -> { getActivity().recreate(); return true; }); MultiSelectListPreference puzzleTypeMultiList = (MultiSelectListPreference) findPreference(PrefUtils.PREF_PUZZLETYPES_MULTISELECTLIST); PuzzleType.getPuzzleTypes(getActivity()) .toList() .observeOn(AndroidSchedulers.mainThread()) .subscribe(puzzleTypes -> { List<String> entries = new ArrayList<>(); List<String> entryValues = new ArrayList<>(); for (PuzzleType p : puzzleTypes) { String uiName = p.getName(); if (!p.isScramblerOfficial()) { uiName += " - " + getString(R.string.unofficial); } entries.add(uiName); entryValues.add(p.getId()); } if (puzzleTypeMultiList.getValues().isEmpty()) { Set<String> all = new HashSet<>(); all.addAll(entryValues); //Initial selection - all puzzle types puzzleTypeMultiList.setValues(all); } puzzleTypeMultiList.setEntries(entries.toArray(new CharSequence[entries.size()])); puzzleTypeMultiList.setEntryValues(entryValues.toArray(new CharSequence[entryValues.size()])); puzzleTypeMultiList.setOnPreferenceChangeListener((preference, newValue) -> { Set selected = (Set) newValue; if (selected.size() == 0) { Toast.makeText(getActivity(), getString(R.string.no_disable_all_puzzletypes), Toast.LENGTH_SHORT).show(); return false; } PuzzleType.getPuzzleTypes(getActivity()) .flatMap(puzzleType -> puzzleType.setEnabled( getActivity(), selected.contains(puzzleType.getId()) ).toObservable() ).subscribe(); return true; }); }); } @Override public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { RecyclerView recyclerView = super.onCreateRecyclerView(inflater, parent, savedInstanceState); recyclerView.addItemDecoration(new DividerDecoration()); return recyclerView; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setDivider(null); } //From PreferenceFragment in v14 library - modified to not draw on first or last item private class DividerDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int mDividerHeight; private DividerDecoration() { mDivider = ContextCompat.getDrawable(getActivity(), R.drawable.preference_list_divider_material); mDividerHeight = Utils.convertDpToPx(getActivity(), 1); } public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (this.mDivider != null) { int childCount = parent.getChildCount(); int width = parent.getWidth(); for (int childViewIndex = 0; childViewIndex < childCount; ++childViewIndex) { View view = parent.getChildAt(childViewIndex); int top; if (this.shouldDrawDividerAbove(view, parent)) { top = (int) ViewCompat.getY(view); this.mDivider.setBounds(0, top, width, top + this.mDividerHeight); this.mDivider.draw(c); } if (this.shouldDrawDividerBelow(view, parent)) { top = (int) ViewCompat.getY(view) + view.getHeight(); this.mDivider.setBounds(0, top, width, top + this.mDividerHeight); this.mDivider.draw(c); } } } } public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (this.shouldDrawDividerAbove(view, parent)) { outRect.top = this.mDividerHeight; } if (this.shouldDrawDividerBelow(view, parent)) { outRect.bottom = this.mDividerHeight; } } private boolean shouldDrawDividerAbove(View view, RecyclerView parent) { /*RecyclerView.ViewHolder holder = parent.getChildViewHolder(view); return holder.getAdapterPosition() == 0 && ((PreferenceViewHolder)holder).isDividerAllowedAbove();*/ return false; } private boolean shouldDrawDividerBelow(View view, RecyclerView parent) { PreferenceViewHolder holder = (PreferenceViewHolder) parent.getChildViewHolder(view); boolean nextAllowed = true; int index = parent.indexOfChild(view); if (index < parent.getChildCount() - 1) { View nextView = parent.getChildAt(index + 1); PreferenceViewHolder nextHolder = (PreferenceViewHolder) parent.getChildViewHolder(nextView); nextAllowed = nextHolder.isDividerAllowedAbove(); } return holder.getAdapterPosition() != parent.getAdapter().getItemCount() - 1 && nextAllowed && holder.isDividerAllowedBelow(); } public void setDivider(Drawable divider) { if (divider != null) { this.mDividerHeight = divider.getIntrinsicHeight(); } else { this.mDividerHeight = 0; } this.mDivider = divider; getListView().invalidateItemDecorations(); } public void setDividerHeight(int dividerHeight) { this.mDividerHeight = dividerHeight; getListView().invalidateItemDecorations(); } } } }