summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuis Vidal <lvidal@cyngn.com>2016-04-26 22:42:21 -0700
committerLuis Vidal <lvidal@cyngn.com>2016-05-06 16:05:14 -0700
commit215d44020f4a6449260ebbab55feb3462f2416a6 (patch)
treeb454243e6c52234393e55ffa250b2048f6dadc61
parent23b30aaefcf611e0c5e1915437b48589da724866 (diff)
downloadpackages_apps_Settings-215d44020f4a6449260ebbab55feb3462f2416a6.zip
packages_apps_Settings-215d44020f4a6449260ebbab55feb3462f2416a6.tar.gz
packages_apps_Settings-215d44020f4a6449260ebbab55feb3462f2416a6.tar.bz2
Add option to select temperature unit
Added a menu in the weather settings to select the temperature unit. This setting will be visible only if the user has at least one weather service provider installed. The weather settings layout was refactored to make room for this new preference Change-Id: I5e9f206573e0ff95fcee31a010b52530a907acc6 TICKET: CYNGNOS-2605
-rw-r--r--res/layout/empty_weather_state.xml16
-rw-r--r--res/layout/weather_service_provider_info_row.xml1
-rw-r--r--res/values/cm_arrays.xml11
-rw-r--r--res/values/cm_strings.xml9
-rw-r--r--res/xml/weather_settings.xml40
-rw-r--r--src/com/android/settings/cyanogenmod/WeatherServiceSettings.java362
6 files changed, 308 insertions, 131 deletions
diff --git a/res/layout/empty_weather_state.xml b/res/layout/empty_weather_state.xml
index 09c3794..7ae635a 100644
--- a/res/layout/empty_weather_state.xml
+++ b/res/layout/empty_weather_state.xml
@@ -32,16 +32,22 @@
android:layout_marginBottom="12dip"
android:src="@drawable/ic_settings_weather"
android:tint="@color/weather_settings_icon_tint"
- android:contentDescription="@null">
- </ImageView>
-
+ android:contentDescription="@null" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18dp"
- android:textColor="?android:attr/textColorSecondary">
- </TextView>
+ android:textColor="?android:attr/textColorSecondary" />
+ <Button android:id="@+id/add_weather_provider"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center"
+ android:gravity="center"
+ style="?android:attr/buttonBarButtonStyle"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:text="@string/weather_settings_add_weather_provider"
+ android:textAllCaps="true" />
</LinearLayout>
</FrameLayout>
diff --git a/res/layout/weather_service_provider_info_row.xml b/res/layout/weather_service_provider_info_row.xml
index 676863e..ddaa820 100644
--- a/res/layout/weather_service_provider_info_row.xml
+++ b/res/layout/weather_service_provider_info_row.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2016 The CyanogenMod Project
diff --git a/res/values/cm_arrays.xml b/res/values/cm_arrays.xml
index 09fd23e..c1aa849 100644
--- a/res/values/cm_arrays.xml
+++ b/res/values/cm_arrays.xml
@@ -592,4 +592,15 @@
<item>No access</item>
</string-array>
+ <!-- Weather temperature -->
+ <string-array name="weather_temp_unit_entries" translatable="false">
+ <item>@string/weather_settings_temp_celsius</item>
+ <item>@string/weather_settings_temp_fahrenheit</item>
+ </string-array>
+
+ <string-array name="weather_temp_unit_values" translatable="false">
+ <item>1</item>
+ <item>2</item>
+ </string-array>
+
</resources>
diff --git a/res/values/cm_strings.xml b/res/values/cm_strings.xml
index 128660e..1c61579 100644
--- a/res/values/cm_strings.xml
+++ b/res/values/cm_strings.xml
@@ -1167,6 +1167,15 @@
<string name="weather_settings_no_services_prompt">No weather provider services installed</string>
<string name="weather_settings_button">Provider settings</string>
<string name="weather_settings_activity_not_found">Unable to launch the settings menu of this provider</string>
+ <string name="weather_settings_add_weather_provider">Add weather provider</string>
+ <string name="weather_settings_play_store_market_url" translatable="false">market://search?q=cyanogenmodweatherprovider&amp;c=apps</string>
+ <string name="weather_settings_play_store_http_url" translatable="false">http://play.google.com/store/search?q=cyanogenmodweatherprovider&amp;c=apps</string>
+ <string name="weather_settings_general_settings_title">General</string>
+ <string name="weather_settings_providers_title">Providers</string>
+ <string name="weather_settings_temp_units_title">Temperature unit</string>
+ <string name="weather_settings_temp_celsius">Celsius</string>
+ <string name="weather_settings_temp_fahrenheit">Fahrenheit</string>
+ <string name="weather_settings_keyword">weather</string>
<string name="background_data_access">Background data access</string>
<string name="allow_background_both">Over cellular data &amp; Wi\u2011Fi</string>
diff --git a/res/xml/weather_settings.xml b/res/xml/weather_settings.xml
new file mode 100644
index 0000000..17df51a
--- /dev/null
+++ b/res/xml/weather_settings.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2016 The CyanogenMod Project
+
+ 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.
+-->
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
+ android:title="@string/weather_settings_general_settings_title"
+ settings:keywords="@string/weather_settings_keyword">
+ <PreferenceCategory
+ android:key="weather_general_settings"
+ android:title="@string/weather_settings_general_settings_title"
+ android:order="0">
+ <ListPreference
+ android:key="weather_temperature_unit"
+ android:entries="@array/weather_temp_unit_entries"
+ android:entryValues="@array/weather_temp_unit_values"
+ android:title="@string/weather_settings_temp_units_title"
+ android:summary="%s"
+ android:persistent="false" />
+ </PreferenceCategory>
+
+ <PreferenceCategory
+ android:key="weather_service_providers"
+ android:title="@string/weather_settings_providers_title"
+ android:order="1">
+
+ </PreferenceCategory>
+</PreferenceScreen>
diff --git a/src/com/android/settings/cyanogenmod/WeatherServiceSettings.java b/src/com/android/settings/cyanogenmod/WeatherServiceSettings.java
index 55c0991..903af8b 100644
--- a/src/com/android/settings/cyanogenmod/WeatherServiceSettings.java
+++ b/src/com/android/settings/cyanogenmod/WeatherServiceSettings.java
@@ -27,19 +27,21 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
-import android.view.Gravity;
-import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.ImageView;
+import android.widget.Button;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
@@ -50,23 +52,34 @@ import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import cyanogenmod.providers.CMSettings;
+import cyanogenmod.providers.WeatherContract;
+import cyanogenmod.weather.CMWeatherManager;
import cyanogenmod.weatherservice.WeatherProviderService;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import static org.cyanogenmod.internal.logging.CMMetricsLogger.WEATHER_SETTINGS;
-
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
-public class WeatherServiceSettings extends SettingsPreferenceFragment {
+import static org.cyanogenmod.internal.logging.CMMetricsLogger.WEATHER_SETTINGS;
+
+public class WeatherServiceSettings extends SettingsPreferenceFragment
+ implements Preference.OnPreferenceChangeListener {
private Context mContext;
- private WeatherProviderServiceInfoAdapter mAdapter;
private Handler mHandler;
private static final String TAG = WeatherServiceSettings.class.getSimpleName();
+ private static final String PREFERENCE_GENERAL = "weather_general_settings";
+ private static final String PREFERENCE_PROVIDERS = "weather_service_providers";
+ private static final String PREFERENCE_TEMP_UNIT = "weather_temperature_unit";
+
+ private PreferenceCategory mGeneralSettingsCategory;
+ private PreferenceCategory mProvidersCategory;
+ private ListPreference mTemperatureUnit;
+
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
@@ -75,6 +88,18 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
}
@Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.weather_settings);
+
+ final PreferenceScreen ps = getPreferenceScreen();
+ mGeneralSettingsCategory = (PreferenceCategory) ps.findPreference(PREFERENCE_GENERAL);
+ mProvidersCategory = (PreferenceCategory) ps.findPreference(PREFERENCE_PROVIDERS);
+ mTemperatureUnit = (ListPreference) ps.findPreference(PREFERENCE_TEMP_UNIT);
+ mTemperatureUnit.setOnPreferenceChangeListener(this);
+ }
+
+ @Override
protected int getMetricsCategory() {
return WEATHER_SETTINGS;
}
@@ -84,6 +109,8 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
super.onResume();
updateAdapter();
registerPackageMonitor();
+
+ mTemperatureUnit.setValue(String.valueOf(getSelectedTemperatureUnit(mContext)));
}
@Override
@@ -92,11 +119,33 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
unregisterPackageMonitor();
}
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ if (preference == mTemperatureUnit) {
+ CMSettings.Global.putInt(mContext.getContentResolver(),
+ CMSettings.Global.WEATHER_TEMPERATURE_UNIT,
+ Integer.valueOf((String) newValue));
+ }
+ return true;
+ }
+
private void registerPackageMonitor() {
mPackageMonitor.register(mContext, BackgroundThread.getHandler().getLooper(),
UserHandle.ALL, true);
}
+ private void launchGetWeatherProviders() {
+ try {
+ startActivity(new Intent(Intent.ACTION_VIEW,
+ Uri.parse(getString(R.string.weather_settings_play_store_market_url)))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ } catch (ActivityNotFoundException e) {
+ startActivity(new Intent(Intent.ACTION_VIEW,
+ Uri.parse(getString(R.string.weather_settings_play_store_http_url)))
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
+ }
+ }
+
private void unregisterPackageMonitor() {
mPackageMonitor.unregister();
}
@@ -154,11 +203,177 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
weatherProviderServiceInfos.add(serviceInfo);
}
- mAdapter.clear();
- mAdapter.addAll(weatherProviderServiceInfos);
+
+ final PreferenceScreen ps = getPreferenceScreen();
+ if (!weatherProviderServiceInfos.isEmpty()) {
+ if (ps.findPreference(PREFERENCE_GENERAL) == null) {
+ ps.addPreference(mGeneralSettingsCategory);
+ }
+ if (ps.findPreference(PREFERENCE_PROVIDERS) == null) {
+ ps.addPreference(mProvidersCategory);
+ }
+
+ mProvidersCategory.removeAll();
+ for (WeatherProviderServiceInfo info : weatherProviderServiceInfos) {
+ mProvidersCategory.addPreference(new WeatherProviderPreference(mContext, info));
+ }
+
+ Preference addServicePreference = new Preference(mContext);
+ addServicePreference.setTitle(R.string.weather_settings_add_weather_provider);
+ addServicePreference.setIcon(R.drawable.ic_add);
+ addServicePreference.setOnPreferenceClickListener(
+ new Preference.OnPreferenceClickListener() {
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ launchGetWeatherProviders();
+ return false;
+ }
+ });
+ mProvidersCategory.addPreference(addServicePreference);
+
+ } else {
+ ps.removePreference(mGeneralSettingsCategory);
+ ps.removePreference(mProvidersCategory);
+ }
}
+ /**
+ * Gets the currently selected temperature unit.
+ * If none is selected yet, returns a unit appropriate for the current locale
+ */
+ public static int getSelectedTemperatureUnit(Context context) {
+ int tempUnit = CMSettings.Global.getInt(context.getContentResolver(),
+ CMSettings.Global.WEATHER_TEMPERATURE_UNIT, -1);
+ if (tempUnit != -1) {
+ return tempUnit;
+ }
+
+ Locale locale = context.getResources().getConfiguration().locale;
+ boolean useFahrenheit = locale.equals(Locale.US)
+ || locale.toString().equals("ms_MY") // Malaysia
+ || locale.toString().equals("si_LK"); // Sri Lanka
+ return useFahrenheit
+ ? WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT
+ : WeatherContract.WeatherColumns.TempUnit.CELSIUS;
+ }
+
+ private static class WeatherProviderPreference extends Preference
+ implements View.OnClickListener {
+ private WeatherProviderServiceInfo mInfo;
+ private View mView;
+ private RadioButton mRadioButton;
+ private View mSettingsButton;
+ private Context mContext;
+
+ public WeatherProviderPreference(Context context, WeatherProviderServiceInfo info) {
+ super(context);
+ mInfo = info;
+ mContext = context;
+
+ setLayoutResource(R.layout.weather_service_provider_info_row);
+ setTitle(mInfo.caption);
+ setIcon(mInfo.icon);
+ }
+
+ @Override
+ protected void onBindView(final View view) {
+ super.onBindView(view);
+ mView = view;
+ mView.setOnClickListener(this);
+
+ mRadioButton = (RadioButton) view.findViewById(R.id.radio);
+ mRadioButton.setChecked(mInfo.isActive);
+ mRadioButton.setOnTouchListener(new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ view.onTouchEvent(event);
+ return false;
+ }
+ });
+
+ boolean showSettings = mInfo.settingsComponentName != null;
+ View settingsDivider = view.findViewById(R.id.divider);
+ settingsDivider.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE);
+
+ mSettingsButton = view.findViewById(R.id.settings);
+ mSettingsButton.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE);
+ mSettingsButton.setAlpha(mInfo.isActive ? 1f : Utils.DISABLED_ALPHA);
+ mSettingsButton.setEnabled(mInfo.isActive);
+ mSettingsButton.setFocusable(mInfo.isActive);
+ mSettingsButton.setOnClickListener(this);
+ }
+
+ @Override
+ public void onClick(View v) {
+ if (v == mView) {
+ v.setPressed(true);
+ setActiveWeatherProviderService();
+ }
+ launchSettingsActivity(mInfo);
+ }
+
+ private boolean isActiveProvider() {
+ return mInfo.isActive;
+ }
+
+ public void setActiveState(boolean active) {
+ mInfo.isActive = active;
+ mRadioButton.setChecked(active);
+
+ boolean hasSettings = mInfo.settingsComponentName != null;
+ if (hasSettings) {
+ mSettingsButton.setAlpha(mInfo.isActive ? 1f : Utils.DISABLED_ALPHA);
+ mSettingsButton.setEnabled(mInfo.isActive);
+ mSettingsButton.setFocusable(mInfo.isActive);
+ }
+ }
+
+ private void launchSettingsActivity(WeatherProviderServiceInfo info) {
+ if (info != null && info.settingsComponentName != null) {
+ try {
+ mContext.startActivity(new Intent().setComponent(info.settingsComponentName));
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(mContext,
+ R.string.weather_settings_activity_not_found,
+ Toast.LENGTH_LONG)
+ .show();
+ Log.w(TAG, info.settingsComponentName + " not found");
+ }
+ }
+ }
+
+ private void setActiveWeatherProviderService() {
+ if (!mInfo.isActive) {
+ markAsActiveProvider();
+ CMSettings.Secure.putString(mContext.getContentResolver(),
+ CMSettings.Secure.WEATHER_PROVIDER_SERVICE,
+ mInfo.componentName.flattenToString());
+ }
+ }
+
+ private void markAsActiveProvider() {
+ // Check for current active provider
+ PreferenceCategory providersCategory = (PreferenceCategory) findPreferenceInHierarchy(
+ WeatherServiceSettings.PREFERENCE_PROVIDERS);
+ if (providersCategory != null) {
+ final int count = providersCategory.getPreferenceCount();
+ for (int index = 0; index < count; index++) {
+ Preference p = providersCategory.getPreference(index);
+ if (p instanceof WeatherProviderPreference) {
+ WeatherProviderPreference preference = (WeatherProviderPreference) p;
+ if (preference.isActiveProvider()) {
+ preference.setActiveState(false);
+ break;
+ }
+ }
+ }
+ }
+ // Mark this provider as active
+ setActiveState(true);
+ }
+ }
+
private ComponentName getSettingsComponent(PackageManager pm, ResolveInfo resolveInfo) {
if (resolveInfo == null
|| resolveInfo.serviceInfo == null
@@ -222,20 +437,25 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- ListView listView = getListView();
- ViewGroup contentRoot = (ViewGroup) listView.getParent();
- listView.setItemsCanFocus(true);
+ ViewGroup contentRoot = (ViewGroup) getListView().getParent();
View emptyView = getActivity().getLayoutInflater().inflate(
R.layout.empty_weather_state, contentRoot, false);
TextView emptyTextView = (TextView) emptyView.findViewById(R.id.message);
emptyTextView.setText(R.string.weather_settings_no_services_prompt);
- listView.setEmptyView(emptyView);
+ Button addProviderButton = (Button) emptyView.findViewById(R.id.add_weather_provider);
+ addProviderButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ launchGetWeatherProviders();
+ }
+ });
contentRoot.addView(emptyView);
- mAdapter = new WeatherProviderServiceInfoAdapter(mContext);
- listView.setAdapter(mAdapter);
+
+ ListView listView = getListView();
+ listView.setEmptyView(emptyView);
}
private class WeatherProviderServiceInfo {
@@ -245,114 +465,4 @@ public class WeatherServiceSettings extends SettingsPreferenceFragment {
ComponentName componentName;
public ComponentName settingsComponentName;
}
-
- private class WeatherProviderServiceInfoAdapter
- extends ArrayAdapter<WeatherProviderServiceInfo> {
-
- private final LayoutInflater mInflater;
-
- public WeatherProviderServiceInfoAdapter(Context context) {
- super(context, 0);
- mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- WeatherProviderServiceInfo info = getItem(position);
- final View row = convertView != null ? convertView :
- buildRow(parent);
- row.setTag(info);
-
- ((ImageView) row.findViewById(android.R.id.icon))
- .setImageDrawable(info.icon);
-
- ((TextView) row.findViewById(android.R.id.title)).setText(info.caption);
-
- RadioButton radioButton = (RadioButton) row.findViewById(R.id.radio);
- radioButton.setChecked(info.isActive);
- radioButton.setOnTouchListener(new View.OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- row.onTouchEvent(event);
- return false;
- }
- });
-
- boolean showSettings = info.settingsComponentName != null;
- View settingsDivider = row.findViewById(R.id.divider);
- settingsDivider.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE);
- ImageView settingsButton = (ImageView) row.findViewById(R.id.settings);
- settingsButton.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE);
- settingsButton.setAlpha(info.isActive ? 1f : Utils.DISABLED_ALPHA);
- settingsButton.setEnabled(info.isActive);
- settingsButton.setFocusable(info.isActive);
- settingsButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- launchSettingsActivity((WeatherProviderServiceInfo)row.getTag());
- }
- });
-
- return row;
- }
-
- private void launchSettingsActivity(WeatherProviderServiceInfo info) {
- if (info != null && info.settingsComponentName != null) {
- try {
- mContext.startActivity(new Intent().setComponent(info.settingsComponentName));
- } catch (ActivityNotFoundException e) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- Toast t = Toast.makeText(mContext,
- R.string.weather_settings_activity_not_found,
- Toast.LENGTH_LONG);
- TextView v = (TextView) t.getView().findViewById(android.R.id.message);
- if (v != null) v.setGravity(Gravity.CENTER);
- t.show();
- }
- });
- Log.w(TAG, info.settingsComponentName + " not found");
- }
- }
- }
-
- private View buildRow(ViewGroup parent) {
- final View row = mInflater.inflate(R.layout.weather_service_provider_info_row,
- parent, false);
- row.setOnClickListener(new View.OnClickListener(){
- @Override
- public void onClick(View v) {
- v.setPressed(true);
- setActiveWeatherProviderService((WeatherProviderServiceInfo) row.getTag());
- }
- });
-
- return row;
- }
-
- private void setActiveWeatherProviderService(WeatherProviderServiceInfo info) {
- WeatherProviderServiceInfo currentSelection = getCurrentSelection();
- if (info.equals(currentSelection)) return;
- if (currentSelection != null) {
- currentSelection.isActive = false;
- }
- info.isActive = true;
- CMSettings.Secure.putString(mContext.getContentResolver(),
- CMSettings.Secure.WEATHER_PROVIDER_SERVICE,
- info.componentName.flattenToString());
- launchSettingsActivity(info);
- notifyDataSetChanged();
- }
-
- private WeatherProviderServiceInfo getCurrentSelection() {
- for (int indx = 0; indx < getCount(); indx++) {
- WeatherProviderServiceInfo info = getItem(indx);
- if (info.isActive) {
- return info;
- }
- }
- return null;
- }
- }
}