/*
* Copyright 2016 Google Inc. All rights reserved.
*
* Licensed 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.
*/
package org.physical_web.physicalweb;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceGroup;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.widget.Toast;
import java.util.ArrayList;
/**
* This fragment is the ui that the user sees when
* they have entered the app's settings mode.
* This ui is where the user can view the current configuration
* of the application (including it's default PWS client)
* and also allows the user to change the app's behavior.
*/
public class SettingsFragment extends PreferenceFragment
implements OnSharedPreferenceChangeListener {
private static final String TAG = SettingsFragment.class.getSimpleName();
private static final int MAX_ENDPOINT_OPTIONS = 3;
private PreferenceGroup mCustomEndpointCategory;
public SettingsFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.settings);
updatePwsList();
mCustomEndpointCategory =
(PreferenceGroup) findPreference(getString(R.string.custom_pws_endpoint_key));
updatePwsPreference();
updateAllSettingSummaries();
}
@Override
public void onResume() {
super.onResume();
getActivity().getActionBar().setTitle(R.string.title_settings);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
Utils.hideAllMenuItems(menu);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onStop() {
super.onStop();
if (!Utils.isCurrentPwsSelectionValid(getActivity())) {
Utils.setPwsEndpointPreference(getActivity(),
Utils.getDefaultPwsEndpointPreferenceString(getActivity()));
Toast.makeText(getActivity(), R.string.error_pws_endpoint_not_configured_properly,
Toast.LENGTH_SHORT).show();
}
Utils.startScan(getActivity());
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
updateSettingSummary(key);
if (key.equals(getString(R.string.custom_pws_url_key)) ||
key.equals(getString(R.string.custom_pws_version_key)) ||
key.equals(getString(R.string.custom_pws_api_key_key))) {
updatePwsPreference();
updatePwsList();
} else if (key.equals(getString(R.string.pws_endpoint_setting_key))) {
updatePwsPreference();
Utils.deleteCache(getActivity());
}
}
private void updatePwsList() {
ListPreference listPreference = (ListPreference) findPreference(
getString(R.string.pws_endpoint_setting_key));
ArrayList<CharSequence> endpointNames = new ArrayList<>(MAX_ENDPOINT_OPTIONS);
ArrayList<CharSequence> endpoints = new ArrayList<>(MAX_ENDPOINT_OPTIONS);
if (Utils.isGoogleApiKeyAvailable(getActivity())) {
endpointNames.add(getString(R.string.google_pws));
endpoints.add(Utils.formatEndpointForSharedPrefernces(Utils.GOOGLE_ENDPOINT,
Utils.GOOGLE_ENDPOINT_VERSION,
Utils.getGoogleApiKey(getActivity())));
}
endpointNames.add(getString(R.string.custom_pws));
endpoints.add(Utils.getCustomPwsEndpoint(getActivity()));
endpointNames.add(getString(R.string.prod_pws));
endpointNames.add(getString(R.string.dev_pws));
endpoints.add(Utils.formatEndpointForSharedPrefernces(Utils.PROD_ENDPOINT,
Utils.PROD_ENDPOINT_VERSION, ""));
endpoints.add(Utils.formatEndpointForSharedPrefernces(Utils.DEV_ENDPOINT,
Utils.DEV_ENDPOINT_VERSION, ""));
listPreference.setEntries(endpointNames.toArray(new CharSequence[endpointNames.size()]));
listPreference.setEntryValues(endpoints.toArray(new CharSequence[endpoints.size()]));
}
private void updatePwsPreference() {
ListPreference listPreference = (ListPreference) findPreference(
getString(R.string.pws_endpoint_setting_key));
String entry = (String) listPreference.getEntry();
if (entry == null) {
return;
}
if (entry.equals(getString(R.string.custom_pws))) {
// User selected custom PWS therefore need to update it accordingly
EditTextPreference customPwsUrlPreference =
(EditTextPreference) mCustomEndpointCategory.findPreference(
getString(R.string.custom_pws_url_key));
ListPreference customPwsVersionPreference =
(ListPreference) mCustomEndpointCategory.findPreference(
getString(R.string.custom_pws_version_key));
EditTextPreference customPwsApiKeyPreference =
(EditTextPreference) mCustomEndpointCategory.findPreference(
getString(R.string.custom_pws_api_key_key));
String customPwsUrl = customPwsUrlPreference.getText();
int customPwsVersion = Integer.parseInt(customPwsVersionPreference.getValue());
String customPwsApiKey = customPwsApiKeyPreference.getText();
customPwsUrl = customPwsUrl == null ? "" : customPwsUrl;
customPwsApiKey = customPwsApiKey == null ? "" : customPwsApiKey;
listPreference.setValue(Utils.formatEndpointForSharedPrefernces(customPwsUrl,
customPwsVersion, customPwsApiKey));
getPreferenceScreen().addPreference(mCustomEndpointCategory);
} else {
getPreferenceScreen().removePreference(mCustomEndpointCategory);
}
}
private void updateSettingSummary(String key) {
Preference pref = findPreference(key);
if (pref instanceof ListPreference) {
ListPreference listPref = (ListPreference) pref;
listPref.setSummary(listPref.getEntry());
} else if (pref instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) pref;
editTextPref.setSummary(editTextPref.getText());
}
}
private void updateAllSettingSummaries() {
for (String key : PreferenceManager.getDefaultSharedPreferences(getActivity())
.getAll().keySet()) {
updateSettingSummary(key);
}
}
}