diff options
Diffstat (limited to 'app/src/main/java/me/texx/Texx/SettingsActivity.kt')
-rw-r--r-- | app/src/main/java/me/texx/Texx/SettingsActivity.kt | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/app/src/main/java/me/texx/Texx/SettingsActivity.kt b/app/src/main/java/me/texx/Texx/SettingsActivity.kt new file mode 100644 index 0000000..663f05a --- /dev/null +++ b/app/src/main/java/me/texx/Texx/SettingsActivity.kt @@ -0,0 +1,208 @@ +package me.texx.Texx + +import android.annotation.TargetApi +import android.content.Context +import android.content.Intent +import android.content.res.Configuration +import android.os.Build +import android.os.Bundle +import android.preference.* +import android.support.v4.app.NavUtils +import android.view.MenuItem +import daio.io.dresscode.dressCodeName +import daio.io.dresscode.matchDressCode +import me.texx.Texx.util.ThemeUtil.getThemeName + +/** + * A [PreferenceActivity] that presents a set of application settings. On + * handset devices, settings are presented as a single list. On tablets, + * settings are split by category, with category headers shown to the left of + * the list of settings. + * + * See [Android Design: Settings](http://developer.android.com/design/patterns/settings.html) + * for design guidelines and the [Settings API Guide](http://developer.android.com/guide/topics/ui/settings.html) + * for more information on developing a Settings UI. + */ +class SettingsActivity : PreferenceActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + matchDressCode() + super.onCreate(savedInstanceState) + dressCodeName = getThemeName(this) + setupActionBar() + } + + /** + * Set up the [android.app.ActionBar], if the API is available. + */ + private fun setupActionBar() { + actionBar?.setDisplayHomeAsUpEnabled(true) + } + + fun updateTheme() { + dressCodeName = getThemeName(this) + } + + /** + * Listener for menu item selector + */ + override fun onMenuItemSelected(featureId: Int, item: MenuItem): Boolean { + val id = item.itemId + if (id == android.R.id.home) { + if (!super.onMenuItemSelected(featureId, item)) { + NavUtils.navigateUpFromSameTask(this) + } + return true + } + return super.onMenuItemSelected(featureId, item) + } + + /** + * {@inheritDoc} + */ + override fun onIsMultiPane(): Boolean { + return isXLargeTablet(this) + } + + /** + * {@inheritDoc} + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + override fun onBuildHeaders(target: List<PreferenceActivity.Header>) { + loadHeadersFromResource(R.xml.pref_headers, target) + } + + /** + * This method stops fragment injection in malicious applications. + * Make sure to deny any unknown fragments here. + */ + override fun isValidFragment(fragmentName: String): Boolean { + return PreferenceFragment::class.java.name == fragmentName + || GeneralPreferenceFragment::class.java.name == fragmentName + || AccountPreferenceFragment::class.java.name == fragmentName + } + + /** + * This fragment shows general preferences only. It is used when the + * activity is showing a two-pane settings UI. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + class GeneralPreferenceFragment : PreferenceFragment() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + addPreferencesFromResource(R.xml.pref_general) + setHasOptionsMenu(true) + } + + override fun onPreferenceTreeClick(preferenceScreen: PreferenceScreen?, preference: Preference?): Boolean { + if (preference?.key == "dark_theme_switch") { + (activity as SettingsActivity).updateTheme() + return true + } + return true + } + + /** + * Listener for action bar option selector + */ + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val id = item.itemId + if (id == android.R.id.home) { + startActivity(Intent(activity, SettingsActivity::class.java)) + return true + } + return super.onOptionsItemSelected(item) + } + } + + /** + * This fragment shows general preferences only. It is used when the + * activity is showing a two-pane settings UI. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + class AccountPreferenceFragment : PreferenceFragment() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + addPreferencesFromResource(R.xml.pref_account) + setHasOptionsMenu(true) + + // Bind the summaries of EditText/List/Dialog/Ringtone preferences + // to their values. When their values change, their summaries are + // updated to reflect the new value, per the Android Design + // guidelines. + //bindPreferenceSummaryToValue(findPreference("example_list")) + } + + /** + * Listener for action bar option selector + */ + override fun onOptionsItemSelected(item: MenuItem): Boolean { + val id = item.itemId + if (id == android.R.id.home) { + startActivity(Intent(activity, SettingsActivity::class.java)) + return true + } + return super.onOptionsItemSelected(item) + } + } + + companion object { + + /** + * A preference value change listener that updates the preference's summary + * to reflect its new value. + */ + private val sBindPreferenceSummaryToValueListener = Preference.OnPreferenceChangeListener { preference, value -> + val stringValue = value.toString() + + if (preference is ListPreference) { + // For list preferences, look up the correct display value in + // the preference's 'entries' list. + val listPreference = preference + val index = listPreference.findIndexOfValue(stringValue) + + // Set the summary to reflect the new value. + preference.setSummary( + if (index >= 0) + listPreference.entries[index] + else + null) + + } else { + // For all other preferences, set the summary to the value's + // simple string representation. + preference.summary = stringValue + } + true + } + + /** + * Helper method to determine if the device has an extra-large screen. For + * example, 10" tablets are extra-large. + */ + private fun isXLargeTablet(context: Context): Boolean { + return context.resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_XLARGE + } + + /** + * Binds a preference's summary to its value. More specifically, when the + * preference's value is changed, its summary (line of text below the + * preference title) is updated to reflect the value. The summary is also + * immediately updated upon calling this method. The exact display format is + * dependent on the type of preference. + + * @see .sBindPreferenceSummaryToValueListener + */ + private fun bindPreferenceSummaryToValue(preference: Preference) { + // Set the listener to watch for value changes. + preference.onPreferenceChangeListener = sBindPreferenceSummaryToValueListener + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, + PreferenceManager + .getDefaultSharedPreferences(preference.context) + .getString(preference.key, "")) + } + } +} |