Added Developer Options settings for multi-window mode.

Enables/disables the development multi-windows UI under Recents UI.
Setting is hidden on -user builds.

Bug: 19494313
Change-Id: Id1ccec5d9552dfdc74cc8d0af26ba7e6c4456166
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0e535c6..18de05e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4787,6 +4787,14 @@
     <!-- UI debug setting: simulate secondary display devices using overlays [CHAR LIMIT=25] -->
     <string name="overlay_display_devices_title">Simulate secondary displays</string>
 
+    <!-- UI debug setting: enable/disable debug multi-window ui [CHAR LIMIT=25] -->
+    <string name="enable_multi_window">Multi-window mode</string>
+    <!-- setting Checkbox summary whether to enable debug multi-window ui [CHAR_LIMIT=50] -->
+    <string name="enable_multi_window_summary">Multiple activities on screen at the same time.</string>
+    <string name="confirm_enable_multi_window_title">Enable multi-window mode?</string>
+    <!-- Warning dialog message to confirm user wishes to enable experimental multi-window mode feature -->
+    <string name="confirm_enable_multi_window_text">WARNING: This is a highly experimental feature that allows multiple activities on-screen at the same time through the Recent apps UI. Some apps may crash or not function correctly when used with this feature.</string>
+
     <!-- Preference category for application debugging development settings. [CHAR LIMIT=25] -->
     <string name="debug_applications_category">Apps</string>
 
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index 44a502d..71351c4e 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -200,6 +200,11 @@
             android:entries="@array/overlay_display_devices_entries"
             android:entryValues="@array/overlay_display_devices_values" />
 
+        <SwitchPreference
+            android:key="enable_multi_window"
+            android:title="@string/enable_multi_window"
+            android:summary="@string/enable_multi_window_summary"/>
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="debug_hw_drawing_category"
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index dd7f5df..a4002ab 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -138,8 +138,8 @@
     private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale";
     private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale";
     private static final String OVERLAY_DISPLAY_DEVICES_KEY = "overlay_display_devices";
+    private static final String ENABLE_MULTI_WINDOW_KEY = "enable_multi_window";
     private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category";
-    private static final String DEBUG_APPLICATIONS_CATEGORY_KEY = "debug_applications_category";
     private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification";
     private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging";
     private static final String WIFI_AGGRESSIVE_HANDOVER_KEY = "wifi_aggressive_handover";
@@ -160,8 +160,6 @@
 
     private static final String PROCESS_STATS = "proc_stats";
 
-    private static final String TAG_CONFIRM_ENFORCE = "confirm_enforce";
-
     private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
 
     private static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
@@ -174,6 +172,7 @@
 
     private static String DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = "262144"; // 256K
 
+    private static final String MULTI_WINDOW_SYSTEM_PROPERTY = "persist.sys.debug.multi_window";
     private IWindowManager mWindowManager;
     private IBackupManager mBackupManager;
     private DevicePolicyManager mDpm;
@@ -211,6 +210,7 @@
     private SwitchPreference mShowTouches;
     private SwitchPreference mShowScreenUpdates;
     private SwitchPreference mDisableOverlays;
+    private SwitchPreference mEnableMultiWindow;
     private SwitchPreference mShowCpuUsage;
     private SwitchPreference mForceHardwareUi;
     private SwitchPreference mForceMsaa;
@@ -277,7 +277,6 @@
 
         final PreferenceGroup debugDebuggingCategory = (PreferenceGroup)
                 findPreference(DEBUG_DEBUGGING_CATEGORY_KEY);
-
         mEnableAdb = findAndInitSwitchPref(ENABLE_ADB);
         mClearAdbKeys = findPreference(CLEAR_ADB_KEYS);
         if (!SystemProperties.getBoolean("ro.adb.secure", false)) {
@@ -351,6 +350,18 @@
         mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
         mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY);
         mOverlayDisplayDevices = addListPreference(OVERLAY_DISPLAY_DEVICES_KEY);
+        mEnableMultiWindow = findAndInitSwitchPref(ENABLE_MULTI_WINDOW_KEY);
+        if (!showEnableMultiWindowPreference()) {
+            final PreferenceGroup drawingGroup =
+                    (PreferenceGroup)findPreference("debug_drawing_category");
+            if (drawingGroup != null) {
+                drawingGroup.removePreference(mEnableMultiWindow);
+            } else {
+                mEnableMultiWindow.setEnabled(false);
+            }
+            removePreference(mEnableMultiWindow);
+            mEnableMultiWindow = null;
+        }
         mOpenGLTraces = addListPreference(OPENGL_TRACES_KEY);
         mSimulateColorSpace = addListPreference(SIMULATE_COLOR_SPACE);
         mUseAwesomePlayer = findAndInitSwitchPref(USE_AWESOMEPLAYER_KEY);
@@ -428,6 +439,7 @@
     private void removePreference(Preference preference) {
         getPreferenceScreen().removePreference(preference);
         mAllPrefs.remove(preference);
+        mResetSwitchPrefs.remove(preference);
     }
 
     private void setPrefsEnabledState(boolean enabled) {
@@ -550,6 +562,10 @@
         updateDebugLayoutOptions();
         updateAnimationScaleOptions();
         updateOverlayDisplayDevicesOptions();
+        if (mEnableMultiWindow != null) {
+            updateSwitchPreference(mEnableMultiWindow,
+                    SystemProperties.getBoolean(MULTI_WINDOW_SYSTEM_PROPERTY, false));
+        }
         updateOpenGLTracesOptions();
         updateImmediatelyDestroyActivitiesOptions();
         updateAppProcessLimitOptions();
@@ -712,6 +728,15 @@
         return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("");
     }
 
+    private boolean showEnableMultiWindowPreference() {
+        return !"user".equals(Build.TYPE);
+    }
+
+    private void setEnableMultiWindow(boolean value) {
+        SystemProperties.set(MULTI_WINDOW_SYSTEM_PROPERTY, String.valueOf(value));
+        pokeSystemProperties();
+    }
+
     private void updateBugreportOptions() {
         if ("user".equals(Build.TYPE)) {
             final ContentResolver resolver = getActivity().getContentResolver();
@@ -762,7 +787,8 @@
     }
 
     private void updatePointerLocationOptions() {
-        updateSwitchPreference(mPointerLocation, Settings.System.getInt(getActivity().getContentResolver(),
+        updateSwitchPreference(mPointerLocation,
+                Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.POINTER_LOCATION, 0) != 0);
     }
 
@@ -772,7 +798,8 @@
     }
 
     private void updateShowTouchesOptions() {
-        updateSwitchPreference(mShowTouches, Settings.System.getInt(getActivity().getContentResolver(),
+        updateSwitchPreference(mShowTouches,
+                Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.SHOW_TOUCHES, 0) != 0);
     }
 
@@ -1041,7 +1068,8 @@
     }
 
     private void updateForceRtlOptions() {
-        updateSwitchPreference(mForceRtlLayout, Settings.Global.getInt(getActivity().getContentResolver(),
+        updateSwitchPreference(mForceRtlLayout,
+                Settings.Global.getInt(getActivity().getContentResolver(),
                 Settings.Global.DEVELOPMENT_FORCE_RTL, 0) != 0);
     }
 
@@ -1178,7 +1206,8 @@
     }
 
     private void updateCpuUsageOptions() {
-        updateSwitchPreference(mShowCpuUsage, Settings.Global.getInt(getActivity().getContentResolver(),
+        updateSwitchPreference(mShowCpuUsage,
+                Settings.Global.getInt(getActivity().getContentResolver(),
                 Settings.Global.SHOW_PROCESSES, 0) != 0);
     }
 
@@ -1352,6 +1381,24 @@
                 .show();
     }
 
+    private void confirmEnableMultiWindowMode() {
+        DialogInterface.OnClickListener onConfirmListener = new DialogInterface.OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                setEnableMultiWindow((which == DialogInterface.BUTTON_POSITIVE) ? true : false);
+                updateAllOptions();
+            }
+        };
+
+        new AlertDialog.Builder(getActivity())
+                .setTitle(R.string.confirm_enable_multi_window_title)
+                .setMessage(R.string.confirm_enable_multi_window_text)
+                .setPositiveButton(R.string.enable_text, onConfirmListener)
+                .setNegativeButton(android.R.string.cancel, onConfirmListener)
+                .create()
+                .show();
+    }
+
     @Override
     public void onSwitchChanged(Switch switchView, boolean isChecked) {
         if (switchView != mSwitchBar.getSwitch()) {
@@ -1479,6 +1526,12 @@
             writeShowUpdatesOption();
         } else if (preference == mDisableOverlays) {
             writeDisableOverlaysOption();
+        } else if (preference == mEnableMultiWindow) {
+            if (mEnableMultiWindow.isChecked()) {
+                confirmEnableMultiWindowMode();
+            } else {
+                setEnableMultiWindow(false);
+            }
         } else if (preference == mShowCpuUsage) {
             writeCpuUsageOptions();
         } else if (preference == mImmediatelyDestroyActivities) {