package yuku.alkitab.base.ac; import android.app.Activity; import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.preference.CheckBoxPreference; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.afollestad.materialdialogs.MaterialDialog; import yuku.afw.V; import yuku.afw.storage.Preferences; import yuku.alkitab.base.App; import yuku.alkitab.base.IsiActivity; import yuku.alkitab.base.ac.base.BaseActivity; import yuku.alkitab.base.config.AppConfig; import yuku.alkitab.base.sync.SyncSettingsActivity; import yuku.alkitab.base.util.OtherAppIntegration; import yuku.alkitab.base.widget.ConfigurationWrapper; import yuku.alkitab.base.widget.VerseItem; import yuku.alkitab.debug.R; public class SettingsActivity extends BaseActivity { private static final String EXTRA_subClassName = "subClassName"; static class Header { int titleResId; Class<? extends PreferenceFragmentCompat> clazz; Intent clickIntent; public Header(final int titleResId, final Class<? extends PreferenceFragmentCompat> clazz, final Intent clickIntent) { this.titleResId = titleResId; this.clazz = clazz; this.clickIntent = clickIntent; } } static Header[] headers = { new Header(R.string.pref_sync_title, null, new Intent(App.context, SyncSettingsActivity.class)), new Header(R.string.pref_penampilan_layar, DisplayFragment.class, null), new Header(R.string.pref_penggunaan, UsageFragment.class, null), new Header(R.string.pref_copy_share, CopyShareFragment.class, null), }; RecyclerView lsHeaders; HeadersAdapter headersAdapter; public static Intent createIntent() { return new Intent(App.context, SettingsActivity.class); } private static Intent createSubIntent(Class<? extends PreferenceFragmentCompat> subClass) { return new Intent(App.context, SettingsActivity.class) .putExtra(EXTRA_subClassName, subClass.getName()); } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); final Toolbar toolbar = V.get(this, R.id.toolbar); setSupportActionBar(toolbar); final ActionBar ab = getSupportActionBar(); assert ab != null; ab.setDisplayHomeAsUpEnabled(true); final String subClassName = getIntent().getStringExtra(EXTRA_subClassName); if (subClassName == null) { lsHeaders = V.get(this, R.id.lsHeaders); lsHeaders.setLayoutManager(new LinearLayoutManager(this)); lsHeaders.setAdapter(headersAdapter = new HeadersAdapter()); } else { final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.fragment_container, Fragment.instantiate(this, subClassName), subClassName); ft.commit(); } } static class VH extends RecyclerView.ViewHolder { final TextView title; public VH(final View itemView) { super(itemView); title = V.get(itemView, android.R.id.title); } } class HeadersAdapter extends RecyclerView.Adapter<VH> { final TypedValue tv = new TypedValue(); @Override public VH onCreateViewHolder(final ViewGroup parent, final int viewType) { final View v = getLayoutInflater().inflate(R.layout.preference_header_item_material, parent, false); getTheme().resolveAttribute(R.attr.selectableItemBackground, tv, true); v.setBackgroundResource(tv.resourceId); return new VH(v); } @Override public void onBindViewHolder(final VH holder, final int position) { final Header header = headers[position]; holder.title.setText(header.titleResId); holder.itemView.setOnClickListener(v -> { if (header.clickIntent != null) { startActivity(header.clickIntent); } else if (header.clazz != null) { startActivity(createSubIntent(header.clazz)); } }); } @Override public int getItemCount() { return headers.length; } } public static class DisplayFragment extends PreferenceFragmentCompat { final Preference.OnPreferenceChangeListener configurationPreferenceChangeListener = (preference, newValue) -> { final Handler handler = new Handler(); // do this after this method returns true handler.post(() -> { ConfigurationWrapper.notifyConfigurationNeedsUpdate(); // restart this activity final Activity ac = getActivity(); ac.recreate(); }); return true; }; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.settings_display); final ListPreference pref_language = (ListPreference) findPreference(getString(R.string.pref_language_key)); pref_language.setOnPreferenceChangeListener(configurationPreferenceChangeListener); autoDisplayListPreference(pref_language); final CheckBoxPreference pref_bottomToolbarOnText = (CheckBoxPreference) findPreference(getString(R.string.pref_bottomToolbarOnText_key)); pref_bottomToolbarOnText.setOnPreferenceChangeListener((preference, newValue) -> { final Handler handler = new Handler(); // do this after this method returns true handler.post(() -> App.getLbm().sendBroadcast(new Intent(IsiActivity.ACTION_NEEDS_RESTART))); return true; }); final Preference pref_selectedVerseBgColor = findPreference(getString(R.string.pref_selectedVerseBgColor_key)); pref_selectedVerseBgColor.setOnPreferenceChangeListener((preference, newValue) -> { VerseItem.invalidateSelectedVersePaints(); return true; }); // show textPadding preference only when there is nonzero side padding on this configuration if (getResources().getDimensionPixelOffset(R.dimen.text_side_padding) == 0) { final Preference preference = findPreference(getString(R.string.pref_textPadding_key)); getPreferenceScreen().removePreference(preference); } } } public static class UsageFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.settings_usage); final ListPreference pref_volumeButtonNavigation = (ListPreference) findPreference(getString(R.string.pref_volumeButtonNavigation_key)); autoDisplayListPreference(pref_volumeButtonNavigation); final CheckBoxPreference pref_showHiddenVersion = (CheckBoxPreference) findPreference(getString(R.string.pref_showHiddenVersion_key)); pref_showHiddenVersion.setOnPreferenceChangeListener((preference, newValue) -> { final boolean value = (boolean) newValue; if (value) { new MaterialDialog.Builder(getActivity()) .content(R.string.show_hidden_version_warning) .negativeText(R.string.cancel) .positiveText(R.string.ok) .onPositive((dialog, which) -> pref_showHiddenVersion.setChecked(true)) .show(); return false; } return true; }); final CheckBoxPreference pref_autoDictionaryAnalyze = (CheckBoxPreference) findPreference(getString(R.string.pref_autoDictionaryAnalyze_key)); pref_autoDictionaryAnalyze.setOnPreferenceChangeListener((preference, newValue) -> { if (((boolean) newValue)) { if (!OtherAppIntegration.hasIntegratedDictionaryApp()) { OtherAppIntegration.askToInstallDictionary(getActivity()); return false; } } return true; }); // only show dictionary auto-lookup when enabled in app_config if (!AppConfig.get().menuDictionary) { getPreferenceScreen().removePreference(findPreference(getString(R.string.pref_autoDictionaryAnalyze_key))); } } } public static class CopyShareFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.settings_copy_share); } } public static void autoDisplayListPreference(final ListPreference pref) { final CharSequence label = pref.getEntry(); if (label != null) { pref.setSummary(label); } final Preference.OnPreferenceChangeListener originalChangeListener = pref.getOnPreferenceChangeListener(); pref.setOnPreferenceChangeListener((preference, newValue) -> { final boolean changed; if (originalChangeListener != null) { changed = originalChangeListener.onPreferenceChange(preference, newValue); } else { changed = true; } if (changed) { final int index = pref.findIndexOfValue((String) newValue); if (index >= 0) { pref.setSummary(pref.getEntries()[index]); } } return changed; }); } public static void setPaddingBasedOnPreferences(final View view) { final Resources r = App.context.getResources(); if (Preferences.getBoolean(r.getString(R.string.pref_textPadding_key), r.getBoolean(R.bool.pref_textPadding_default))) { final int top = r.getDimensionPixelOffset(R.dimen.text_top_padding); final int bottom = r.getDimensionPixelOffset(R.dimen.text_bottom_padding); final int side = r.getDimensionPixelOffset(R.dimen.text_side_padding); view.setPadding(side, top, side, bottom); } else { final int no = r.getDimensionPixelOffset(R.dimen.text_nopadding); view.setPadding(no, no, no, no); } } }