Merge "Abstract ZygoteInit.maybePreload call for webview."
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 0a32f0d..802b180 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -256,7 +256,7 @@
      * Specifies if managed profiles of this user can be removed, other than by its profile owner.
      * The default value is <code>false</code>.
      * <p>
-     * This restriction can only be set by device owners.
+     * This restriction has no effect on managed profiles.
      *
      * <p>Key for user restrictions.
      * <p>Type: Boolean
@@ -353,8 +353,8 @@
     /**
      * Specifies if a user is disallowed from adding managed profiles.
      * <p>The default value for an unmanaged user is <code>false</code>.
-     * For users with a device owner set, the default is <code>true</code>
-     * <p>This restriction can only be set by device owners.
+     * For users with a device owner set, the default is <code>true</code>.
+     * <p>This restriction has no effect on managed profiles.
      *
      * <p>Key for user restrictions.
      * <p>Type: Boolean
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index a13ebaf..252f168 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -215,6 +215,7 @@
     external/skia/src/effects \
     external/skia/src/image \
     external/skia/src/images \
+    external/skia/src/utils \
     external/sqlite/dist \
     external/sqlite/android \
     external/tremor/Tremor \
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 1165a45..19d4848 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -8,6 +8,7 @@
 #include "SkBRDAllocator.h"
 #include "SkFrontBufferedStream.h"
 #include "SkMath.h"
+#include "SkOpts.h"
 #include "SkPixelRef.h"
 #include "SkStream.h"
 #include "SkUtils.h"
@@ -224,6 +225,45 @@
            needsFineScale(fullSize.height(), decodedSize.height(), sampleSize);
 }
 
+static inline SkAlphaType computeDecodeAlphaType(SkColorType colorType, SkAlphaType alphaType) {
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+    // Skia premultiplies linearly.  Until the framework enables linear blending,
+    // it expects a legacy premultiply.
+    if (kPremul_SkAlphaType == alphaType && kRGBA_F16_SkColorType != colorType) {
+        return kUnpremul_SkAlphaType;
+    }
+#endif
+
+    return alphaType;
+}
+
+static inline void premultiplyIfNecessary(SkBitmap* bitmap, SkPMColor* colorPtr, int* colorCount,
+        SkAlphaType alphaType, bool requireUnpremultiplied) {
+#ifndef ANDROID_ENABLE_LINEAR_BLENDING
+    if (kUnpremul_SkAlphaType != alphaType || requireUnpremultiplied) {
+        return;
+    }
+
+    switch (bitmap->colorType()) {
+        case kN32_SkColorType:
+            for (int y = 0; y < bitmap->height(); y++) {
+                SkOpts::RGBA_to_rgbA(bitmap->getAddr32(0, y), bitmap->getAddr32(0, y),
+                    bitmap->width());
+            }
+
+            return;
+        case kIndex_8_SkColorType:
+            SkOpts::RGBA_to_rgbA(colorPtr, colorPtr, *colorCount);
+            return;
+        default:
+            // kRGBA_F16 will be premultiplied by the codec if necessary.
+            // kGray_8 (alias kAlpha_8) and k565 are opaque.
+            LOG_ALWAYS_FATAL("Should be unreachable - no need for legacy premultiply.");
+            return;
+    }
+#endif
+}
+
 static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding, jobject options) {
     // This function takes ownership of the input stream.  Since the SkAndroidCodec
     // will take ownership of the stream, we don't necessarily need to take ownership
@@ -391,13 +431,17 @@
         colorCount = &maxColors;
     }
 
-    // Set the alpha type for the decode.
     SkAlphaType alphaType = codec->computeOutputAlphaType(requireUnpremultiplied);
+    SkAlphaType decodeAlphaType = computeDecodeAlphaType(decodeColorType, alphaType);
 
     const SkImageInfo decodeInfo = SkImageInfo::Make(size.width(), size.height(),
-            decodeColorType, alphaType, GraphicsJNI::colorSpaceForType(decodeColorType));
+            decodeColorType, decodeAlphaType, codec->computeOutputColorSpace(decodeColorType));
 
-    SkImageInfo bitmapInfo = decodeInfo;
+    // When supported by the colorType, we will decode to sRGB (or linear sRGB).  However,
+    // we only want to mark the bitmap as sRGB when linear blending is enabled.
+    SkImageInfo bitmapInfo = decodeInfo.makeAlphaType(alphaType)
+            .makeColorSpace(GraphicsJNI::colorSpaceForType(decodeColorType));
+
     if (decodeColorType == kGray_8_SkColorType) {
         // The legacy implementation of BitmapFactory used kAlpha8 for
         // grayscale images (before kGray8 existed).  While the codec
@@ -433,6 +477,8 @@
         default:
             return nullObjectReturn("codec->getAndroidPixels() failed.");
     }
+    premultiplyIfNecessary(&decodingBitmap, colorPtr, colorCount, decodeAlphaType,
+            requireUnpremultiplied);
 
     jbyteArray ninePatchChunk = NULL;
     if (peeker.mPatch != NULL) {
diff --git a/packages/SettingsLib/res/values/config.xml b/packages/SettingsLib/res/values/config.xml
index 64f21b5..ee69b56 100755
--- a/packages/SettingsLib/res/values/config.xml
+++ b/packages/SettingsLib/res/values/config.xml
@@ -26,6 +26,9 @@
     <!-- Whether to send a custom package name with the PSD.-->
     <bool name="config_sendPackageName">false</bool>
 
+    <!-- Whether to enable the left nav drawer in all Settings UI.-->
+    <bool name="config_enable_nav_drawer">false</bool>
+
     <!-- Name for the set of keys associating package names -->
     <string name="config_helpPackageNameKey" translatable="false"></string>
 
diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
index 86514dc..5041e0d 100644
--- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
+++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java
@@ -28,7 +28,6 @@
 import android.content.res.TypedArray;
 import android.os.AsyncTask;
 import android.os.Bundle;
-import android.os.UserManager;
 import android.provider.Settings;
 import android.support.v4.widget.DrawerLayout;
 import android.util.ArraySet;
@@ -72,7 +71,6 @@
     private FrameLayout mContentHeaderContainer;
     private DrawerLayout mDrawerLayout;
     private boolean mShowingMenu;
-    private UserManager mUserManager;
 
     // Remove below after new IA
     @Deprecated
@@ -108,6 +106,9 @@
             mDrawerLayout = null;
             return;
         }
+        if (!isNavDrawerEnabled()) {
+            setIsDrawerPresent(false);
+        }
         if (!isDashboardFeatureEnabled()) {
             getDashboardCategories();
         }
@@ -122,7 +123,6 @@
             }
         });
 
-        mUserManager = UserManager.get(this);
         if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
                 + " ms");
     }
@@ -138,6 +138,15 @@
     }
 
     @Override
+    public boolean onNavigateUp() {
+        if (!isNavDrawerEnabled()) {
+            finish();
+            return true;
+        }
+        return super.onNavigateUp();
+    }
+
+    @Override
     protected void onResume() {
         super.onResume();
 
@@ -277,10 +286,13 @@
     }
 
     public void showMenuIcon() {
-        mShowingMenu = true;
-        getActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
-        getActionBar().setHomeActionContentDescription(R.string.content_description_menu_button);
         getActionBar().setDisplayHomeAsUpEnabled(true);
+        if (isNavDrawerEnabled()) {
+            mShowingMenu = true;
+            getActionBar().setHomeAsUpIndicator(R.drawable.ic_menu);
+            getActionBar().setHomeActionContentDescription(
+                    R.string.content_description_menu_button);
+        }
     }
 
     public List<DashboardCategory> getDashboardCategories() {
@@ -429,6 +441,11 @@
         return false;
     }
 
+    boolean isNavDrawerEnabled() {
+        return !isDashboardFeatureEnabled()
+                || getResources().getBoolean(R.bool.config_enable_nav_drawer);
+    }
+
     private class PackageReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
index 1e87ea0f..2fd5ec0 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/drawer/SettingsDrawerActivityTest.java
@@ -52,34 +52,34 @@
     }
 
     @Test
-    public void startActivityWithNoExtra_showNoHamburgerMenu() {
+    public void startActivityWithNoExtra_showNoNavUp() {
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         instrumentation.startActivitySync(new Intent(instrumentation.getTargetContext(),
                 TestActivity.class));
 
-        onView(withContentDescription(R.string.content_description_menu_button))
+        onView(withContentDescription(com.android.internal.R.string.action_bar_up_description))
                 .check(doesNotExist());
     }
 
     @Test
-    public void startActivityWithExtraToHideMenu_showNoHamburgerMenu() {
+    public void startActivityWithExtraToHideMenu_showNavUp() {
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         Intent intent = new Intent(instrumentation.getTargetContext(), TestActivity.class)
                 .putExtra(TestActivity.EXTRA_SHOW_MENU, false);
         instrumentation.startActivitySync(intent);
 
-        onView(withContentDescription(R.string.content_description_menu_button))
+        onView(withContentDescription(com.android.internal.R.string.action_bar_up_description))
                 .check(doesNotExist());
     }
 
     @Test
-    public void startActivityWithExtraToShowMenu_showHamburgerMenu() {
+    public void startActivityWithExtraToShowMenu_showNavUp() {
         Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         Intent intent = new Intent(instrumentation.getTargetContext(), TestActivity.class)
                 .putExtra(TestActivity.EXTRA_SHOW_MENU, true);
         instrumentation.startActivitySync(intent);
 
-        onView(withContentDescription(R.string.content_description_menu_button))
+        onView(withContentDescription(com.android.internal.R.string.action_bar_up_description))
                 .check(matches(isDisplayed()));
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index a7cbb3d..d4bb994 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -147,8 +147,6 @@
             filter.addAction(Intent.ACTION_SCREEN_OFF);
             filter.addAction(Intent.ACTION_SCREEN_ON);
             filter.addAction(Intent.ACTION_USER_SWITCHED);
-            filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
-            filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
             mContext.registerReceiver(this, filter, null, mHandler);
         }
 
diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
index e91cce1..f5b8669 100644
--- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
+++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java
@@ -126,8 +126,6 @@
             UserManager.DISALLOW_NETWORK_RESET,
             UserManager.DISALLOW_FACTORY_RESET,
             UserManager.DISALLOW_ADD_USER,
-            UserManager.DISALLOW_ADD_MANAGED_PROFILE,
-            UserManager.DISALLOW_REMOVE_MANAGED_PROFILE,
             UserManager.DISALLOW_CONFIG_CELL_BROADCASTS,
             UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS,
             UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,
@@ -261,6 +259,7 @@
 
     /**
      * Returns the user restrictions that default to {@code true} for device owners.
+     * These user restrictions are local, though. ie only for the device owner's user id.
      */
     public static @NonNull Set<String> getDefaultEnabledForDeviceOwner() {
         return DEFAULT_ENABLED_FOR_DEVICE_OWNERS;
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 469dea5..d392459 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -1208,8 +1208,8 @@
         );
         verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
                 eq(UserHandle.USER_SYSTEM),
-                MockUtils.checkUserRestrictions(),
-                MockUtils.checkUserRestrictions(defaultRestrictions)
+                MockUtils.checkUserRestrictions(defaultRestrictions),
+                MockUtils.checkUserRestrictions()
         );
         reset(mContext.userManagerInternal);
 
@@ -1479,8 +1479,8 @@
         );
         verify(mContext.userManagerInternal).setDevicePolicyUserRestrictions(
                 eq(UserHandle.USER_SYSTEM),
-                MockUtils.checkUserRestrictions(),
-                MockUtils.checkUserRestrictions(defaultRestrictions)
+                MockUtils.checkUserRestrictions(defaultRestrictions),
+                MockUtils.checkUserRestrictions()
         );
         reset(mContext.userManagerInternal);
 
@@ -1521,8 +1521,8 @@
             );
             verify(mContext.userManagerInternal, atLeast(1)).setDevicePolicyUserRestrictions(
                 eq(UserHandle.USER_SYSTEM),
-                MockUtils.checkUserRestrictions(),
-                MockUtils.checkUserRestrictions(newDefaultEnabledRestriction)
+                MockUtils.checkUserRestrictions(newDefaultEnabledRestriction),
+                MockUtils.checkUserRestrictions()
             );
             reset(mContext.userManagerInternal);