[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;
     }