Adding ability to add multiple widgets to keyguard

Bug: 7381803
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 8897039..cda0f36 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3222,18 +3222,11 @@
         public static final String LOCK_SCREEN_OWNER_INFO = "lock_screen_owner_info";
 
         /**
-         * Id of the time appwidget on the lockscreen, or -1 if none
-         * @hide
-         */
-        public static final String LOCK_SCREEN_STATUS_APPWIDGET_ID =
-            "lock_screen_status_appwidget_id";
-
-        /**
          * Id of the user-selected appwidget on the lockscreen, or -1 if none
          * @hide
          */
-        public static final String LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID =
-            "lock_screen_user_selected_appwidget_id";
+        public static final String LOCK_SCREEN_APPWIDGET_IDS =
+            "lock_screen_appwidget_ids";
 
         /**
          * This preference enables showing the owner info on LockScren.
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 3f40f20..a75b1ca 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -29,7 +29,6 @@
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.os.Process;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.SystemClock;
@@ -43,9 +42,12 @@
 import android.view.View;
 import android.widget.Button;
 
+import org.apache.harmony.kernel.vm.StringUtils;
+
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -1045,28 +1047,103 @@
         }
     }
 
-    public int[] getUserDefinedWidgets() {
-        int appWidgetId = -1;
+    public int[] getAppWidgets() {
         String appWidgetIdString = Settings.Secure.getStringForUser(
-                mContentResolver, Settings.Secure.LOCK_SCREEN_USER_SELECTED_APPWIDGET_ID,
+                mContentResolver, Settings.Secure.LOCK_SCREEN_APPWIDGET_IDS,
                 UserHandle.USER_CURRENT);
+        String delims = ",";
         if (appWidgetIdString != null) {
-            appWidgetId = (int) Integer.decode(appWidgetIdString);
+            String[] appWidgetStringIds = appWidgetIdString.split(delims);
+            int[] appWidgetIds = new int[appWidgetStringIds.length];
+            for (int i = 0; i < appWidgetStringIds.length; i++) {
+                String appWidget = appWidgetStringIds[i];
+                try {
+                    appWidgetIds[i] = Integer.decode(appWidget);
+                } catch (NumberFormatException e) {
+                    return null;
+                }
+            }
+            return appWidgetIds;
         }
-
-        return new int[] { appWidgetId };
+        return new int[0];
     }
 
-    public int getStatusWidget() {
-        int appWidgetId = -1;
-        String appWidgetIdString = Settings.Secure.getStringForUser(
-                mContentResolver, Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID,
-                UserHandle.USER_CURRENT);
-        if (appWidgetIdString != null) {
-            appWidgetId = (int) Integer.decode(appWidgetIdString);
+    private static String combineStrings(int[] list, String separator) {
+        int listLength = list.length;
+
+        switch (listLength) {
+            case 0: {
+                return "";
+            }
+            case 1: {
+                return Integer.toString(list[0]);
+            }
         }
 
-        return appWidgetId;
+        int strLength = 0;
+        int separatorLength = separator.length();
+
+        String[] stringList = new String[list.length];
+        for (int i = 0; i < listLength; i++) {
+            stringList[i] = Integer.toString(list[i]);
+            strLength += stringList[i].length();
+            if (i < listLength - 1) {
+                strLength += separatorLength;
+            }
+        }
+
+        StringBuilder sb = new StringBuilder(strLength);
+
+        for (int i = 0; i < listLength; i++) {
+            sb.append(list[i]);
+            if (i < listLength - 1) {
+                sb.append(separator);
+            }
+        }
+
+        return sb.toString();
+    }
+
+    private void writeAppWidgets(int[] appWidgetIds) {
+        Settings.Secure.putString(mContentResolver,
+        Settings.Secure.putStringForUser(mContentResolver,
+                        Settings.Secure.LOCK_SCREEN_APPWIDGET_IDS,
+                        combineStrings(appWidgetIds, ","),
+                        UserHandle.USER_CURRENT);
+    }
+
+    public void addAppWidget(int widgetId, int index) {
+        int[] widgets = getAppWidgets();
+        int[] newWidgets = new int[widgets.length + 1];
+        for (int i = 0, j = 0; i < newWidgets.length; i++) {
+            if (index == i) {
+                newWidgets[i] = widgetId;
+                i++;
+            }
+            if (i < newWidgets.length) {
+                newWidgets[i] = widgets[j];
+                j++;
+            }
+        }
+        writeAppWidgets(newWidgets);
+    }
+
+    public boolean removeAppWidget(int widgetId, int index) {
+        int[] widgets = getAppWidgets();
+        int[] newWidgets = new int[widgets.length - 1];
+        for (int i = 0, j = 0; i < widgets.length; i++) {
+            if (index == i) {
+                if (widgets[i] != widgetId) {
+                    return false;
+                }
+                // continue...
+            } else {
+                newWidgets[j] = widgets[i];
+                j++;
+            }
+        }
+        writeAppWidgets(newWidgets);
+        return true;
     }
 
     private long getLong(String secureSettingKey, long defaultValue) {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
index 118a3ce..c9d92b9 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -950,13 +950,17 @@
         }
 
         // Add user-selected widget
-        final int[] widgets = mLockPatternUtils.getUserDefinedWidgets();
-        for (int i = widgets.length -1; i >= 0; i--) {
-            if (widgets[i] != -1) {
-                // We add the widgets from left to right, starting after the first page after
-                // the add page. We count down, since the order will be persisted from right
-                // to left, starting after camera.
-                addWidget(widgets[i], addPageIndex + 1);
+        final int[] widgets = mLockPatternUtils.getAppWidgets();
+        if (widgets == null) {
+            Log.d(TAG, "Problem reading widgets");
+        } else {
+            for (int i = widgets.length -1; i >= 0; i--) {
+                if (widgets[i] != -1) {
+                    // We add the widgets from left to right, starting after the first page after
+                    // the add page. We count down, since the order will be persisted from right
+                    // to left, starting after camera.
+                    addWidget(widgets[i], addPageIndex + 1);
+                }
             }
         }
     }