From d9f5dd4f5aa4238b01f3ef39673048dcdc8b3fd7 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Sun, 29 Mar 2015 20:55:00 +0200 Subject: [PATCH] Add NrzSettingsActivity which is an abstract class for our settings --- .../activities/NrzSettingsActivity.java | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 src/fr/nrz/androidlib/activities/NrzSettingsActivity.java diff --git a/src/fr/nrz/androidlib/activities/NrzSettingsActivity.java b/src/fr/nrz/androidlib/activities/NrzSettingsActivity.java new file mode 100644 index 0000000..731685f --- /dev/null +++ b/src/fr/nrz/androidlib/activities/NrzSettingsActivity.java @@ -0,0 +1,142 @@ +package fr.nrz.androidlib.activities; + +/** + * Copyright (c) 2013-2015, Loic Blot + * All rights reserved. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those + * of the authors and should not be interpreted as representing official policies, + * either expressed or implied, of the FreeBSD Project. + */ + +import android.content.Context; +import android.content.res.Configuration; +import android.os.Build; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceActivity; +import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; + +public abstract class NrzSettingsActivity extends PreferenceActivity { + private static final boolean ALWAYS_SIMPLE_PREFS = false; + protected static Context _context; + protected static int _prefsRessourceFile; + protected static Preference.OnPreferenceChangeListener sBindPreferenceListener; + + @Override + protected void onPostCreate(final Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + _context = getBaseContext(); + + setupSimplePreferencesScreen(); + } + + /** + * Shows the simplified settings UI if the device configuration if the + * device configuration dictates that a simplified, single-pane UI should be + * shown. + */ + @SuppressWarnings("deprecation") + private void setupSimplePreferencesScreen() { + if (!isSimplePreferences(this)) { + return; + } + + // In the simplified UI, fragments are not used at all and we instead + // use the older PreferenceActivity APIs. + addPreferencesFromResource(_prefsRessourceFile); + bindPreferences(); + } + + protected abstract void bindPreferences(); + + /** {@inheritDoc} */ + @Override + public boolean onIsMultiPane() { + return isXLargeTablet(this) && !isSimplePreferences(this); + } + + /** + * Helper method to determine if the device has an extra-large screen. For + * example, 10" tablets are extra-large. + */ + private static boolean isXLargeTablet(final Context context) { + return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; + } + + /** + * Determines whether the simplified settings UI should be shown. This is + * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device + * doesn't have newer APIs like {@link PreferenceFragment}, or the device + * doesn't have an extra-large screen. In these cases, a single-pane + * "simplified" settings UI should be shown. + */ + protected static boolean isSimplePreferences(final Context context) { + return ALWAYS_SIMPLE_PREFS + || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB + || !isXLargeTablet(context); + } + + /** + * 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 + */ + public static void bindPreferenceBooleanToValue(final Preference preference, final Boolean defValue) { + // Set the listener to watch for value changes. + preference + .setOnPreferenceChangeListener(sBindPreferenceListener); + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceListener.onPreferenceChange( + preference, + PreferenceManager.getDefaultSharedPreferences( + preference.getContext()).getBoolean( + preference.getKey(), + defValue + ) + ); + } + + public static void bindPreferenceStringToValue(final Preference preference) { + // Set the listener to watch for value changes. + preference + .setOnPreferenceChangeListener(sBindPreferenceListener); + + // Trigger the listener immediately with the preference's + // current value. + sBindPreferenceListener.onPreferenceChange( + preference, + PreferenceManager.getDefaultSharedPreferences( + preference.getContext()).getString( + preference.getKey(), + "" + ) + ); + } +}