[2/2] OmniGears: add back qs header images

Change-Id: Ib474f6ee53f5f2601b882af74771dc00f57b2f0e
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index bf09749..105b4e2 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -251,8 +251,7 @@
     <string name="lockscreen_category_title">Lock screen</string>
 
     <string name="notification_title">Notification panel</string>
-    <string name="status_bar_custom_header_title">Custom header image</string>
-    <string name="status_bar_custom_header_summary">Enable notification panel header image</string>
+    <string name="status_bar_custom_header_title">Enable</string>
     <string name="daylight_header_pack_title">Header image pack</string>
     <string name="status_bar_custom_header_shadow_title">Header image shadow</string>
     <string name="status_bar_custom_header_shadow_summary">For better visibility on bright images</string>
@@ -263,13 +262,15 @@
     <string name="daylight_header_provider_title">Dynamic</string>
     <string name="custom_header_provider_title">Header provider</string>
     <string name="custom_header_browse_title">Browse installed headers</string>
-    <string name="custom_header_browse_summary">Long press on any image to use for static mode</string>
+    <string name="custom_header_browse_summary">Click on any image to use for static mode</string>
     <string name="custom_header_browse_summary_new">Browse all available header packages</string>
     <string name="custom_header_pick_title">Select header image</string>
     <string name="custom_header_pick_summary">Select an image to use for static mode</string>
     <string name="style_enabled_summary">Custom header image is ON</string>
     <string name="style_disabled_summary">Custom header image is OFF</string>
-
+    <string name="header_provider_disabled">Disabled</string>
+    <string name="custom_header_title">Custom header image</string>
+    
     <!-- Network traffic -->
     <string name="network_traffic_title">Network traffic</string>
     <string name="network_traffic_summary">Status bar traffic monitor</string>
diff --git a/res/xml/style_settings.xml b/res/xml/style_settings.xml
index 09a8a1b..94c25df 100644
--- a/res/xml/style_settings.xml
+++ b/res/xml/style_settings.xml
@@ -31,6 +31,53 @@
                     android:targetClass="org.omnirom.omnistyle.BrowseWallsActivity" />
         </Preference>
     </PreferenceCategory>
+    
+    <PreferenceCategory
+        android:key="category_custom_header"
+        android:title="@string/custom_header_title">
+
+        <org.omnirom.omnigears.preference.SystemSettingSwitchPreference
+            android:key="status_bar_custom_header"
+            android:title="@string/status_bar_custom_header_title"
+            android:defaultValue="false" />
+
+        <ListPreference
+            android:key="custom_header_provider"
+            android:title="@string/custom_header_provider_title"
+            android:persistent="false"
+            android:entries="@array/custom_header_provider_entries"
+            android:entryValues="@array/custom_header_provider_values"
+            android:dependency="status_bar_custom_header" />
+
+        <ListPreference
+            android:key="daylight_header_pack"
+            android:title="@string/daylight_header_pack_title"
+            android:persistent="false"
+            android:dependency="status_bar_custom_header" />
+
+        <Preference
+            android:key="custom_header_browse"
+            android:title="@string/custom_header_browse_title"
+            android:summary="@string/custom_header_browse_summary"
+            android:persistent="false"
+            android:dependency="status_bar_custom_header" >
+            <intent android:action="android.intent.action.MAIN"
+                    android:targetPackage="org.omnirom.omnistyle"
+                    android:targetClass="org.omnirom.omnistyle.PickHeaderActivity" />
+        </Preference>
+
+        <org.omnirom.omnigears.preference.SeekBarPreference
+            android:key="status_bar_custom_header_shadow"
+            android:title="@string/status_bar_custom_header_shadow_title"
+            android:summary="@string/status_bar_custom_header_shadow_summary"
+            android:max="100"
+            settings:min="0"
+            settings:unitsLeft=""
+            settings:unitsRight="@string/unit_percent"
+            android:persistent="false"
+            android:dependency="status_bar_custom_header" />
+
+    </PreferenceCategory>
 
     <PreferenceCategory
         android:key="category_statusbar"
diff --git a/src/org/omnirom/omnigears/PackageUtils.java b/src/org/omnirom/omnigears/PackageUtils.java
deleted file mode 100644
index 5f7c25f..0000000
--- a/src/org/omnirom/omnigears/PackageUtils.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-* Copyright (C) 2014 The OmniROM 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.
-*/
-package org.omnirom.omnigears;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-
-public class PackageUtils {
-
-    public static boolean isAppInstalled(Context context, String appUri) {
-        try {
-            PackageManager pm = context.getPackageManager();
-            pm.getPackageInfo(appUri, PackageManager.GET_ACTIVITIES);
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    public static boolean isAvailableApp(String packageName, Context context) {
-        Context mContext = context;
-        final PackageManager pm = mContext.getPackageManager();
-        try {
-            pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
-            int enabled = pm.getApplicationEnabledSetting(packageName);
-            return enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED &&
-                enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
-        } catch (NameNotFoundException e) {
-            return false;
-        }
-    }
-}
diff --git a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
index 46d038b..9876b0a 100644
--- a/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/StyleSettings.java
@@ -20,9 +20,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.Preference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
@@ -30,6 +32,7 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.omni.PackageUtils;
 
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.R;
@@ -38,17 +41,34 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
-import java.util.List;
-import java.util.ArrayList;
+import org.omnirom.omnigears.preference.SystemSettingSwitchPreference;
+import org.omnirom.omnigears.preference.SeekBarPreference;
 
-import org.omnirom.omnigears.PackageUtils;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class StyleSettings extends SettingsPreferenceFragment implements
         Preference.OnPreferenceChangeListener, Indexable {
     private static final String TAG = "StyleSettings";
     private static final String CUSTOM_WALL_BROWSE = "custom_wall_browse";
-    
+    private static final String CUSTOM_HEADER_BROWSE = "custom_header_browse";
+    private static final String CUSTOM_HEADER_IMAGE = "status_bar_custom_header";
+    private static final String DAYLIGHT_HEADER_PACK = "daylight_header_pack";
+    private static final String CUSTOM_HEADER_IMAGE_SHADOW = "status_bar_custom_header_shadow";
+    private static final String CUSTOM_HEADER_PROVIDER = "custom_header_provider";
+    private static final String STATUS_BAR_CUSTOM_HEADER = "status_bar_custom_header";
+    private static final String CUSTOM_HEADER_ENABLED = "status_bar_custom_header";
+
     private Preference mWallBrowse;
+    private Preference mHeaderBrowse;
+    private ListPreference mDaylightHeaderPack;
+    private SeekBarPreference mHeaderShadow;
+    private ListPreference mHeaderProvider;
+    private String mDaylightHeaderProvider;
+    private SystemSettingSwitchPreference mHeaderEnabled;
 
     @Override
     public int getMetricsCategory() {
@@ -62,6 +82,61 @@
 
         mWallBrowse = findPreference(CUSTOM_WALL_BROWSE);
         mWallBrowse.setEnabled(isBrowseWallsAvailable());
+
+        mHeaderBrowse = findPreference(CUSTOM_HEADER_BROWSE);
+        mHeaderBrowse.setEnabled(isBrowseHeaderAvailable());
+
+        mHeaderEnabled = (SystemSettingSwitchPreference) findPreference(CUSTOM_HEADER_ENABLED);
+        mHeaderEnabled.setOnPreferenceChangeListener(this);
+
+        mDaylightHeaderPack = (ListPreference) findPreference(DAYLIGHT_HEADER_PACK);
+
+        List<String> entries = new ArrayList<String>();
+        List<String> values = new ArrayList<String>();
+        getAvailableHeaderPacks(entries, values);
+        mDaylightHeaderPack.setEntries(entries.toArray(new String[entries.size()]));
+        mDaylightHeaderPack.setEntryValues(values.toArray(new String[values.size()]));
+
+        boolean headerEnabled = Settings.System.getInt(getContentResolver(),
+                Settings.System.STATUS_BAR_CUSTOM_HEADER, 0) != 0;
+        updateHeaderProviderSummary(headerEnabled);
+        mDaylightHeaderPack.setOnPreferenceChangeListener(this);
+
+        mHeaderShadow = (SeekBarPreference) findPreference(CUSTOM_HEADER_IMAGE_SHADOW);
+        final int headerShadow = Settings.System.getInt(getContentResolver(),
+                Settings.System.STATUS_BAR_CUSTOM_HEADER_SHADOW, 0);
+        mHeaderShadow.setValue((int)(((double) headerShadow / 255) * 100));
+        mHeaderShadow.setOnPreferenceChangeListener(this);
+
+        mDaylightHeaderProvider = getResources().getString(R.string.daylight_header_provider);
+        String providerName = Settings.System.getString(getContentResolver(),
+                Settings.System.STATUS_BAR_CUSTOM_HEADER_PROVIDER);
+        if (providerName == null) {
+            providerName = mDaylightHeaderProvider;
+        }
+        mHeaderProvider = (ListPreference) findPreference(CUSTOM_HEADER_PROVIDER);
+        int valueIndex = mHeaderProvider.findIndexOfValue(providerName);
+        mHeaderProvider.setValueIndex(valueIndex >= 0 ? valueIndex : 0);
+        mHeaderProvider.setSummary(mHeaderProvider.getEntry());
+        mHeaderProvider.setOnPreferenceChangeListener(this);
+        mDaylightHeaderPack.setEnabled(providerName.equals(mDaylightHeaderProvider));
+    }
+
+    private void updateHeaderProviderSummary(boolean headerEnabled) {
+        mDaylightHeaderPack.setSummary(getResources().getString(R.string.header_provider_disabled));
+        if (headerEnabled) {
+            String settingHeaderPackage = Settings.System.getString(getContentResolver(),
+                    Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK);
+            int valueIndex = mDaylightHeaderPack.findIndexOfValue(settingHeaderPackage);
+            if (valueIndex == -1) {
+                // no longer found
+                Settings.System.putInt(getContentResolver(),
+                        Settings.System.STATUS_BAR_CUSTOM_HEADER, 0);
+            } else {
+                mDaylightHeaderPack.setValueIndex(valueIndex >= 0 ? valueIndex : 0);
+                mDaylightHeaderPack.setSummary(mDaylightHeaderPack.getEntry());
+            }
+        }
     }
 
     @Override
@@ -71,6 +146,30 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (preference == mDaylightHeaderPack) {
+            String value = (String) newValue;
+            Settings.System.putString(getContentResolver(),
+                    Settings.System.STATUS_BAR_DAYLIGHT_HEADER_PACK, value);
+            int valueIndex = mDaylightHeaderPack.findIndexOfValue(value);
+            mDaylightHeaderPack.setSummary(mDaylightHeaderPack.getEntries()[valueIndex]);
+        } else if (preference == mHeaderShadow) {
+            Integer headerShadow = (Integer) newValue;
+            int realHeaderValue = (int) (((double) headerShadow / 100) * 255);
+            Settings.System.putInt(getContentResolver(),
+                    Settings.System.STATUS_BAR_CUSTOM_HEADER_SHADOW, realHeaderValue);
+        } else if (preference == mHeaderProvider) {
+            String value = (String) newValue;
+            Settings.System.putString(getContentResolver(),
+                    Settings.System.STATUS_BAR_CUSTOM_HEADER_PROVIDER, value);
+            int valueIndex = mHeaderProvider.findIndexOfValue(value);
+            mHeaderProvider.setSummary(mHeaderProvider.getEntries()[valueIndex]);
+            mDaylightHeaderPack.setEnabled(value.equals(mDaylightHeaderProvider));
+            mHeaderBrowse.setTitle(valueIndex == 0 ? R.string.custom_header_browse_title : R.string.custom_header_pick_title);
+            mHeaderBrowse.setSummary(valueIndex == 0 ? R.string.custom_header_browse_summary_new : R.string.custom_header_pick_summary);
+        } else if (preference == mHeaderEnabled) {
+            Boolean headerEnabled = (Boolean) newValue;
+            updateHeaderProviderSummary(headerEnabled);
+        }
         return true;
     }
 
@@ -81,6 +180,47 @@
         return pm.resolveActivity(browse, 0) != null;
     }
 
+    private boolean isBrowseHeaderAvailable() {
+        PackageManager pm = getPackageManager();
+        Intent browse = new Intent();
+        browse.setClassName("org.omnirom.omnistyle", "org.omnirom.omnistyle.PickHeaderActivity");
+        return pm.resolveActivity(browse, 0) != null;
+    }
+
+    private void getAvailableHeaderPacks(List<String> entries, List<String> values) {
+        Map<String, String> headerMap = new HashMap<String, String>();
+        Intent i = new Intent();
+        PackageManager packageManager = getPackageManager();
+        i.setAction("org.omnirom.DaylightHeaderPack");
+        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;
+            }
+            headerMap.put(label, packageName);
+        }
+        i.setAction("org.omnirom.DaylightHeaderPack1");
+        for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) {
+            String packageName = r.activityInfo.packageName;
+            String label = r.activityInfo.loadLabel(getPackageManager()).toString();
+            if (r.activityInfo.name.endsWith(".theme")) {
+                continue;
+            }
+            if (label == null) {
+                label = packageName;
+            }
+            headerMap.put(label, packageName  + "/" + r.activityInfo.name);
+        }
+        List<String> labelList = new ArrayList<String>();
+        labelList.addAll(headerMap.keySet());
+        Collections.sort(labelList);
+        for (String label : labelList) {
+            entries.add(label);
+            values.add(headerMap.get(label));
+        }
+    }
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override