| package org.apache.taverna.mobile.activities; |
| /** |
| * Apache Taverna Mobile |
| * Copyright 2015 The Apache Software Foundation |
| * |
| * This product includes software developed at |
| * The Apache Software Foundation (http://www.apache.org/). |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import org.apache.taverna.mobile.R; |
| |
| import android.annotation.TargetApi; |
| import android.content.Context; |
| import android.content.res.Configuration; |
| import android.os.Build; |
| import android.os.Bundle; |
| import android.preference.ListPreference; |
| import android.preference.Preference; |
| import android.preference.PreferenceActivity; |
| import android.preference.PreferenceFragment; |
| import android.preference.PreferenceManager; |
| import android.support.v4.app.NavUtils; |
| import android.view.MenuItem; |
| |
| import java.util.List; |
| |
| /** |
| * A {@link 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. |
| * <p/> |
| * See <a href="http://developer.android.com/design/patterns/settings.html"> |
| * Android Design: Settings</a> for design guidelines and the <a |
| * href="http://developer.android.com/guide/topics/ui/settings.html">Settings |
| * API Guide</a> for more information on developing a Settings UI. |
| */ |
| public class SettingsActivity extends PreferenceActivity { |
| /** |
| * A preference value change listener that updates the preference's summary |
| * to reflect its new value. |
| */ |
| private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = |
| new Preference.OnPreferenceChangeListener() { |
| @Override |
| public boolean onPreferenceChange(Preference preference, Object value) { |
| String stringValue = value.toString(); |
| |
| if (preference instanceof ListPreference) { |
| // For list preferences, look up the correct display value in |
| // the preference's 'entries' list. |
| ListPreference listPreference = (ListPreference) preference; |
| int index = listPreference.findIndexOfValue(stringValue); |
| |
| // Set the summary to reflect the new value. |
| preference.setSummary( |
| index >= 0 |
| ? listPreference.getEntries()[index] |
| : null); |
| |
| } else { |
| // For all other preferences, set the summary to the value's |
| // simple string representation. |
| preference.setSummary(stringValue); |
| } |
| return true; |
| } |
| }; |
| |
| /** |
| * Helper method to determine if the device has an extra-large screen. For |
| * example, 10" tablets are extra-large. |
| */ |
| private static boolean isXLargeTablet(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 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. |
| */ |
| private static boolean isSimplePreferences(Context context) { |
| return 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 |
| */ |
| private static void bindPreferenceSummaryToValue(Preference preference) { |
| // Set the listener to watch for value changes. |
| preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); |
| |
| // Trigger the listener immediately with the preference's |
| // current value. |
| sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, |
| PreferenceManager |
| .getDefaultSharedPreferences(preference.getContext()) |
| .getString(preference.getKey(), "")); |
| } |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| // setupActionBar(); |
| } |
| |
| /** |
| * Set up the {@link android.app.ActionBar}, if the API is available. |
| */ |
| /* @NonNull |
| @TargetApi(Build.VERSION_CODES.HONEYCOMB) |
| private void setupActionBar() { |
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { |
| // Show the Up button in the action bar. |
| getActionBar().setDisplayHomeAsUpEnabled(true); |
| } |
| } |
| */ |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| int id = item.getItemId(); |
| if (id == android.R.id.home) { |
| // This ID represents the Home or Up button. In the case of this |
| // activity, the Up button is shown. Use NavUtils to allow users |
| // to navigate up one level in the application structure. For |
| // more details, see the Navigation pattern on Android Design: |
| // |
| // http://developer.android.com/design/patterns/navigation.html#up-vs-back |
| // |
| // TODO: If Settings has multiple levels, Up should navigate up |
| // that hierarchy. |
| NavUtils.navigateUpFromSameTask(this); |
| return true; |
| } |
| return super.onOptionsItemSelected(item); |
| } |
| |
| @Override |
| protected void onPostCreate(Bundle savedInstanceState) { |
| super.onPostCreate(savedInstanceState); |
| |
| setupSimplePreferencesScreen(); |
| } |
| |
| /** |
| * Shows the simplified settings UI if the device configuration if the |
| * device configuration dictates that a simplified, single-pane UI should be |
| * shown. |
| * Note that this is only valid for older Honeycomb and below API levels which |
| * the app does not target. |
| */ |
| private void setupSimplePreferencesScreen() { |
| //TODO remove this since the app does not need to support old API levels |
| if (!isSimplePreferences(this)) { |
| return; |
| } |
| |
| // In the simplified UI, fragments are not used at all and we instead |
| // use the older PreferenceActivity APIs. |
| |
| // Add 'general' preferences. |
| addPreferencesFromResource(R.xml.pref_general); |
| |
| // 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("pref_server_url")); |
| bindPreferenceSummaryToValue(findPreference("pref_player_url")); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| public boolean onIsMultiPane() { |
| return isXLargeTablet(this) && !isSimplePreferences(this); |
| } |
| |
| /** |
| * {@inheritDoc} |
| */ |
| @Override |
| @TargetApi(Build.VERSION_CODES.HONEYCOMB) |
| public void onBuildHeaders(List<Header> target) { |
| if (!isSimplePreferences(this)) { |
| loadHeadersFromResource(R.xml.pref_headers, target); |
| } |
| } |
| |
| /** |
| * This fragment shows general preferences only. It is used when the |
| * activity is showing a two-pane settings UI. |
| */ |
| @TargetApi(Build.VERSION_CODES.HONEYCOMB) |
| public static class GeneralPreferenceFragment extends PreferenceFragment { |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| addPreferencesFromResource(R.xml.pref_general); |
| |
| // 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("pref_server_url")); |
| bindPreferenceSummaryToValue(findPreference("pref_player_url")); |
| } |
| } |
| |
| } |