[2/3] OmniGears: weather in header view
Change-Id: Ib07a5455dd4b23298d6d40e6522dccfbfeb34872
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index a126e29..7b69681 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -246,4 +246,11 @@
<string name="recents_search_bar_summary"></string>
<string name="recents_fullscreen_title">Fullscreen</string>
<string name="recents_fullscreen_summary"></string>
+
+ <string name="weather_title">Weather</string>
+ <string name="weather_config_title">Service settings</string>
+ <string name="weather_config_summary"></string>
+ <string name="header_weather_title">Header view weather</string>
+ <string name="header_weather_summary">Enable notification panel header weather display</string>
+ <string name="weather_icon_pack_title">Condition icon pack</string>
</resources>
diff --git a/res/xml/more_interface_settings.xml b/res/xml/more_interface_settings.xml
index a2ebb64..186c7cb 100644
--- a/res/xml/more_interface_settings.xml
+++ b/res/xml/more_interface_settings.xml
@@ -36,5 +36,30 @@
android:summary="@string/recents_fullscreen_summary"
android:defaultValue="false"/>
</PreferenceCategory>
+
+ <PreferenceCategory
+ android:key="weather_category"
+ android:title="@string/weather_title" >
+
+ <PreferenceScreen
+ android:title="@string/weather_config_title"
+ android:summary="@string/weather_config_summary" >
+ <intent android:action="android.intent.action.MAIN"
+ android:targetPackage="org.omnirom.omnijaws"
+ android:targetClass="org.omnirom.omnijaws.SettingsActivity" />
+ </PreferenceScreen>
+
+ <com.android.settings.preference.SystemCheckBoxPreference
+ android:key="status_bar_header_weather"
+ android:title="@string/header_weather_title"
+ android:summary="@string/header_weather_summary"
+ android:defaultValue="false" />
+
+ <ListPreference
+ android:key="weather_icon_pack"
+ android:title="@string/weather_icon_pack_title"
+ android:persistent="false" />
+
+ </PreferenceCategory>
</PreferenceScreen>
diff --git a/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java b/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
index 958d8a6..f670529 100644
--- a/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
@@ -22,6 +22,10 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.database.Cursor;
+import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
@@ -34,6 +38,15 @@
import android.util.Log;
import com.android.internal.logging.MetricsLogger;
+import com.android.internal.util.omni.PackageUtils;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.List;
+import java.util.ArrayList;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
@@ -47,6 +60,17 @@
Preference.OnPreferenceChangeListener, Indexable {
private static final String TAG = "MoreInterfaceSettings";
+ private static final String CATEGORY_WEATHER = "weather_category";
+ private static final String WEATHER_ICON_PACK = "weather_icon_pack";
+ private static final String STATUS_BAR_HEADER_WEATHER = "status_bar_header_weather";
+ private static final String DEFAULT_WEATHER_ICON_PACKAGE = "org.omnirom.omnijaws";
+ private static final String WEATHER_SERVICE_PACKAGE = "org.omnirom.omnijaws";
+ private static final String LOCK_CLOCK_PACKAGE="com.cyanogenmod.lockclock";
+
+ private PreferenceCategory mWeatherCategory;
+ private ListPreference mWeatherIconPack;
+ private CheckBoxPreference mHeaderWeather;
+
@Override
protected int getMetricsCategory() {
return MetricsLogger.OMNI_SETTINGS;
@@ -56,6 +80,42 @@
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.more_interface_settings);
+
+ final PreferenceScreen prefScreen = getPreferenceScreen();
+
+ mWeatherCategory = (PreferenceCategory) prefScreen.findPreference(CATEGORY_WEATHER);
+ if (mWeatherCategory != null && !isOmniJawsServiceInstalled()) {
+ prefScreen.removePreference(mWeatherCategory);
+ } else {
+ String settingHeaderPackage = Settings.System.getString(getContentResolver(),
+ Settings.System.STATUS_BAR_WEATHER_ICON_PACK);
+ if (settingHeaderPackage == null) {
+ settingHeaderPackage = DEFAULT_WEATHER_ICON_PACKAGE;
+ }
+ mWeatherIconPack = (ListPreference) findPreference(WEATHER_ICON_PACK);
+ mWeatherIconPack.setEntries(getAvailableWeatherIconPacksEntries());
+ mWeatherIconPack.setEntryValues(getAvailableWeatherIconPacksValues());
+
+ int valueIndex = mWeatherIconPack.findIndexOfValue(settingHeaderPackage);
+ if (valueIndex == -1) {
+ // no longer found
+ settingHeaderPackage = DEFAULT_WEATHER_ICON_PACKAGE;
+ Settings.System.putString(getContentResolver(),
+ Settings.System.STATUS_BAR_WEATHER_ICON_PACK, settingHeaderPackage);
+ valueIndex = mWeatherIconPack.findIndexOfValue(settingHeaderPackage);
+ }
+ mWeatherIconPack.setValueIndex(valueIndex >= 0 ? valueIndex : 0);
+ mWeatherIconPack.setSummary(mWeatherIconPack.getEntry());
+ mWeatherIconPack.setOnPreferenceChangeListener(this);
+
+ mHeaderWeather = (CheckBoxPreference) findPreference(STATUS_BAR_HEADER_WEATHER);
+ }
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ updateWeatherSettings();
}
@Override
@@ -65,6 +125,100 @@
@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
+ if (preference == mWeatherIconPack) {
+ String value = (String) objValue;
+ Settings.System.putString(getContentResolver(),
+ Settings.System.STATUS_BAR_WEATHER_ICON_PACK, value);
+ int valueIndex = mWeatherIconPack.findIndexOfValue(value);
+ mWeatherIconPack.setSummary(mWeatherIconPack.getEntries()[valueIndex]);
+ }
+
+ return true;
+ }
+
+ private boolean isOmniJawsServiceInstalled() {
+ return PackageUtils.isAvailableApp(WEATHER_SERVICE_PACKAGE, getActivity());
+ }
+
+ private boolean isLockClockInstalled() {
+ return PackageUtils.isAvailableApp(LOCK_CLOCK_PACKAGE, getActivity());
+ }
+
+ private String[] getAvailableWeatherIconPacksValues() {
+ List<String> headerPacks = new ArrayList<String>();
+ Intent i = new Intent();
+ PackageManager packageManager = getPackageManager();
+ i.setAction("org.omnirom.WeatherIconPack");
+ for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) {
+ String packageName = r.activityInfo.packageName;
+ if (packageName.equals(DEFAULT_WEATHER_ICON_PACKAGE)) {
+ headerPacks.add(0, r.activityInfo.name);
+ } else {
+ headerPacks.add(r.activityInfo.name);
+ }
+ }
+ if (isLockClockInstalled()) {
+ headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather");
+ headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather_color");
+ headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather_vclouds");
+ }
+ return headerPacks.toArray(new String[headerPacks.size()]);
+ }
+
+ private String[] getAvailableWeatherIconPacksEntries() {
+ List<String> headerPacks = new ArrayList<String>();
+ Intent i = new Intent();
+ PackageManager packageManager = getPackageManager();
+ i.setAction("org.omnirom.WeatherIconPack");
+ for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) {
+ String packageName = r.activityInfo.packageName;
+ String label = r.activityInfo.loadLabel(getPackageManager()).toString();
+ if (label == null) {
+ label = r.activityInfo.packageName;
+ }
+ if (packageName.equals(DEFAULT_WEATHER_ICON_PACKAGE)) {
+ headerPacks.add(0, label);
+ } else {
+ headerPacks.add(label);
+ }
+ }
+ if (isLockClockInstalled()) {
+ headerPacks.add("LockClock (white)");
+ headerPacks.add("LockClock (color)");
+ headerPacks.add("LockClock (vclouds)");
+ }
+ return headerPacks.toArray(new String[headerPacks.size()]);
+ }
+
+ private void updateWeatherSettings() {
+ final boolean weatherEnabled = isOmniJawsEnabled();
+ if (mHeaderWeather.isChecked() && !weatherEnabled) {
+ // disable if service got disabled
+ Settings.System.putInt(getContentResolver(), Settings.System.STATUS_BAR_HEADER_WEATHER, 0);
+ mHeaderWeather.setChecked(false);
+ }
+ mHeaderWeather.setEnabled(weatherEnabled);
+ mWeatherIconPack.setEnabled(weatherEnabled);
+ }
+
+ private boolean isOmniJawsEnabled() {
+ final Uri SETTINGS_URI
+ = Uri.parse("content://org.omnirom.omnijaws.provider/settings");
+
+ final String[] SETTINGS_PROJECTION = new String[] {
+ "enabled"
+ };
+
+ final Cursor c = getContentResolver().query(SETTINGS_URI, SETTINGS_PROJECTION,
+ null, null, null);
+ if (c != null) {
+ int count = c.getCount();
+ if (count == 1) {
+ c.moveToPosition(0);
+ boolean enabled = c.getInt(0) == 1;
+ return enabled;
+ }
+ }
return true;
}