Merge "Finish this bit before I forget." into jb-mr1-dev
diff --git a/api/current.txt b/api/current.txt
index 318707c..ac27f03 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3848,6 +3848,7 @@
     method public android.app.Notification.Builder setOnlyAlertOnce(boolean);
     method public android.app.Notification.Builder setPriority(int);
     method public android.app.Notification.Builder setProgress(int, int, boolean);
+    method public android.app.Notification.Builder setShowWhen(boolean);
     method public android.app.Notification.Builder setSmallIcon(int);
     method public android.app.Notification.Builder setSmallIcon(int, int);
     method public android.app.Notification.Builder setSound(android.net.Uri);
@@ -16592,6 +16593,7 @@
 
   public class UserManager {
     method public java.lang.String getUserName();
+    method public boolean isUserAGoat();
   }
 
   public abstract class Vibrator {
@@ -18430,7 +18432,9 @@
     field public static final deprecated java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
     field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
     field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE";
+    field public static final java.lang.String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH = "android.media.action.TEXT_OPEN_FROM_SEARCH";
     field public static final java.lang.String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
+    field public static final java.lang.String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH = "android.media.action.VIDEO_PLAY_FROM_SEARCH";
     field public static final java.lang.String MEDIA_IGNORE_FILENAME = ".nomedia";
     field public static final java.lang.String MEDIA_SCANNER_VOLUME = "volume";
     field public static final java.lang.String UNKNOWN_STRING = "<unknown>";
@@ -20270,8 +20274,11 @@
     method public void finish();
     method public android.view.Window getWindow();
     method public android.view.WindowManager getWindowManager();
+    method public boolean isFullscreen();
     method public boolean isInteractive();
-    method protected void lightsOut();
+    method public boolean isLowProfile();
+    method public boolean isScreenBright();
+    method protected deprecated void lightsOut();
     method public void onActionModeFinished(android.view.ActionMode);
     method public void onActionModeStarted(android.view.ActionMode);
     method public void onAttachedToWindow();
@@ -20292,11 +20299,14 @@
     method public void setContentView(int);
     method public void setContentView(android.view.View);
     method public void setContentView(android.view.View, android.view.ViewGroup.LayoutParams);
+    method public void setFullscreen(boolean);
     method public void setInteractive(boolean);
+    method public void setLowProfile(boolean);
+    method public void setScreenBright(boolean);
     field public static final java.lang.String ACTION_DREAMING_STARTED = "android.intent.action.DREAMING_STARTED";
     field public static final java.lang.String ACTION_DREAMING_STOPPED = "android.intent.action.DREAMING_STOPPED";
+    field public static final java.lang.String CATEGORY_DREAM = "android.intent.category.DREAM";
     field public static final java.lang.String METADATA_NAME_CONFIG_ACTIVITY = "android.service.dreams.config_activity";
-    field public static final java.lang.String SERVICE_INTERFACE = "android.service.dreams.Dream";
   }
 
 }
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index e0f54fb..5f898c2 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -1025,7 +1025,7 @@
 
     public void runListUsers() {
         try {
-            List<UserInfo> users = mUm.getUsers();
+            List<UserInfo> users = mUm.getUsers(false);
             if (users == null) {
                 System.err.println("Error: couldn't get users");
             } else {
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 7896450..17c2c6b 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -951,6 +951,7 @@
         private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS);
         private boolean mUseChronometer;
         private Style mStyle;
+        private boolean mShowWhen = true;
 
         /**
          * Constructs a new Builder with the defaults:
@@ -982,8 +983,9 @@
 
         /**
          * Add a timestamp pertaining to the notification (usually the time the event occurred).
+         * It will be shown in the notification content view by default; use
+         * {@link Builder#setShowWhen(boolean) setShowWhen} to control this.
          *
-
          * @see Notification#when
          */
         public Builder setWhen(long when) {
@@ -992,6 +994,15 @@
         }
 
         /**
+         * Control whether the timestamp set with {@link Builder#setWhen(long) setWhen} is shown
+         * in the content view.
+         */
+        public Builder setShowWhen(boolean show) {
+            mShowWhen = show;
+            return this;
+        }
+
+        /**
          * Show the {@link Notification#when} field as a stopwatch.
          * 
          * Instead of presenting <code>when</code> as a timestamp, the notification will show an 
@@ -1467,7 +1478,7 @@
                 contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
             }
 
-            if (mWhen != 0) {
+            if (mWhen != 0 && mShowWhen) {
                 if (mUseChronometer) {
                     contentView.setViewVisibility(R.id.chronometer, View.VISIBLE);
                     contentView.setLong(R.id.chronometer, "setBase",
@@ -1477,7 +1488,10 @@
                     contentView.setViewVisibility(R.id.time, View.VISIBLE);
                     contentView.setLong(R.id.time, "setTime", mWhen);
                 }
+            } else {
+                contentView.setViewVisibility(R.id.time, View.GONE);
             }
+
             contentView.setViewVisibility(R.id.line3, showLine3 ? View.VISIBLE : View.GONE);
             contentView.setViewVisibility(R.id.overflow_divider, showLine3 ? View.VISIBLE : View.GONE);
             return contentView;
diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java
index a06aba9..ab32523 100644
--- a/core/java/android/content/pm/UserInfo.java
+++ b/core/java/android/content/pm/UserInfo.java
@@ -68,6 +68,8 @@
     public String name;
     public String iconPath;
     public int flags;
+    public long creationTime;
+    public long lastLoggedInTime;
 
     public UserInfo(int id, String name, int flags) {
         this(id, name, null, flags);
@@ -101,6 +103,8 @@
         id = orig.id;
         flags = orig.flags;
         serialNumber = orig.serialNumber;
+        creationTime = orig.creationTime;
+        lastLoggedInTime = orig.lastLoggedInTime;
     }
 
     public UserHandle getUserHandle() {
@@ -122,6 +126,8 @@
         dest.writeString(iconPath);
         dest.writeInt(flags);
         dest.writeInt(serialNumber);
+        dest.writeLong(creationTime);
+        dest.writeLong(lastLoggedInTime);
     }
 
     public static final Parcelable.Creator<UserInfo> CREATOR
@@ -140,5 +146,7 @@
         iconPath = source.readString();
         flags = source.readInt();
         serialNumber = source.readInt();
+        creationTime = source.readLong();
+        lastLoggedInTime = source.readLong();
     }
 }
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index 0798913..ec02ae0 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -30,7 +30,7 @@
     void setUserName(int userHandle, String name);
     void setUserIcon(int userHandle, in Bitmap icon);
     Bitmap getUserIcon(int userHandle);
-    List<UserInfo> getUsers();
+    List<UserInfo> getUsers(boolean excludeDying);
     UserInfo getUserInfo(int userHandle);
     void setGuestEnabled(boolean enable);
     boolean isGuestEnabled();
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index b532966..96c96d7 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -72,6 +72,15 @@
         }
     }
 
+   /**
+     * Used to determine whether the user making this call is subject to
+     * teleportations.
+     * @return whether the user making this call is a goat 
+     */
+    public boolean isUserAGoat() {
+        return false;
+    }
+ 
     /**
      * Returns the UserInfo object describing a specific user.
      * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
@@ -116,7 +125,23 @@
      */
     public List<UserInfo> getUsers() {
         try {
-            return mService.getUsers();
+            return mService.getUsers(false);
+        } catch (RemoteException re) {
+            Log.w(TAG, "Could not get user list", re);
+            return null;
+        }
+    }
+
+    /**
+     * Returns information for all users on this device.
+     * Requires {@link android.Manifest.permission#MANAGE_USERS} permission.
+     * @param excludeDying specify if the list should exclude users being removed.
+     * @return the list of users that were created.
+     * @hide
+     */
+    public List<UserInfo> getUsers(boolean excludeDying) {
+        try {
+            return mService.getUsers(excludeDying);
         } catch (RemoteException re) {
             Log.w(TAG, "Could not get user list", re);
             return null;
@@ -271,6 +296,4 @@
         }
         return -1;
     }
-
-
 }
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 3c2d164..3c90f1c 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -122,6 +122,38 @@
             "android.media.action.MEDIA_PLAY_FROM_SEARCH";
 
     /**
+     * An intent to perform a search for readable media and automatically play content from the
+     * result when possible. This can be fired, for example, by the result of a voice recognition
+     * command to read a book or magazine.
+     * <p>
+     * Contains the {@link android.app.SearchManager#QUERY} extra, which is a string that can
+     * contain any type of unstructured text search, like the name of a book or magazine, an author
+     * a genre, a publisher, or any combination of these.
+     * <p>
+     * Because this intent includes an open-ended unstructured search string, it makes the most
+     * sense for apps that can support large-scale search of text media, such as services connected
+     * to an online database of books and/or magazines which can be read on the device.
+     */
+    public static final String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH =
+            "android.media.action.TEXT_OPEN_FROM_SEARCH";
+
+    /**
+     * An intent to perform a search for video media and automatically play content from the
+     * result when possible. This can be fired, for example, by the result of a voice recognition
+     * command to play movies.
+     * <p>
+     * Contains the {@link android.app.SearchManager#QUERY} extra, which is a string that can
+     * contain any type of unstructured video search, like the name of a movie, one or more actors,
+     * a genre, or any combination of these.
+     * <p>
+     * Because this intent includes an open-ended unstructured search string, it makes the most
+     * sense for apps that can support large-scale search of video, such as services connected to an
+     * online database of videos which can be streamed and played on the device.
+     */
+    public static final String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH =
+            "android.media.action.VIDEO_PLAY_FROM_SEARCH";
+
+    /**
      * The name of the Intent-extra used to define the artist
      */
     public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
@@ -206,6 +238,29 @@
     public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
 
     /**
+     * Intent action that can be sent to have the camera application capture an image and return
+     * it when the device is secured (e.g. with a pin, password, pattern, or face unlock).
+     * Applications responding to this intent must not expose any personal content like existing
+     * photos or videos on the device. The applications should be careful not to share any photo
+     * or video with other applications or internet. The activity should use {@link
+     * android.view.WindowManager.LayoutParams#FLAG_SHOW_WHEN_LOCKED} to display on top of the
+     * lock screen while secured. There is no activity stack when this flag is used, so
+     * launching more than one activity is strongly discouraged.
+     * <p>
+     * The caller may pass an extra EXTRA_OUTPUT to control where this image will be written.
+     * If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap
+     * object in the extra field. This is useful for applications that only need a small image.
+     * If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri
+     * value of EXTRA_OUTPUT.
+     *
+     * @see #ACTION_IMAGE_CAPTURE
+     * @see #EXTRA_OUTPUT
+     * @hide
+     */
+    public static final String ACTION_IMAGE_CAPTURE_SECURE =
+            "android.media.action.IMAGE_CAPTURE_SECURE";
+
+    /**
      * Standard Intent action that can be sent to have the camera application
      * capture a video and return it.
      * <p>
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index cc9abff..7864302 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3219,8 +3219,8 @@
          * Id of the time appwidget on the lockscreen, or -1 if none
          * @hide
          */
-        public static final String LOCK_SCREEN_CLOCK_APPWIDGET_ID =
-            "lock_screen_clock_appwidget_id";
+        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
@@ -5334,26 +5334,35 @@
         * review apps prior to installation.
         * 1 = request apps to be verified prior to installation, if a verifier exists.
         * 0 = do not verify apps before installation
-        * {@hide}
+        * @hide
         */
        public static final String PACKAGE_VERIFIER_ENABLE = "package_verifier_enable";
 
        /** Timeout for package verification.
-        * {@hide} */
+        * @hide */
        public static final String PACKAGE_VERIFIER_TIMEOUT = "verifier_timeout";
 
        /** Default response code for package verification.
-        * {@hide} */
+        * @hide */
        public static final String PACKAGE_VERIFIER_DEFAULT_RESPONSE = "verifier_default_response";
 
-       /** Show package verification setting in the Settings app.
+       /**
+        * Show package verification setting in the Settings app.
         * 1 = show (default)
         * 0 = hide
-        * {@hide}
+        * @hide
         */
        public static final String PACKAGE_VERIFIER_SETTING_VISIBLE = "verifier_setting_visible";
 
        /**
+        * Run package verificaiton on apps installed through ADB/ADT/USB
+        * 1 = perform package verification on ADB installs (default)
+        * 0 = bypass package verification on ADB installs
+        * @hide
+        */
+       public static final String PACKAGE_VERIFIER_INCLUDE_ADB = "verifier_verify_adb_installs";
+
+       /**
         * The interval in milliseconds at which to check packet counts on the
         * mobile data interface when screen is on, to detect possible data
         * connection problems.
diff --git a/core/java/android/service/dreams/Dream.java b/core/java/android/service/dreams/Dream.java
index 4a23d39..dedfb0c 100644
--- a/core/java/android/service/dreams/Dream.java
+++ b/core/java/android/service/dreams/Dream.java
@@ -44,22 +44,47 @@
  * <p>Dreams are interactive screensavers launched when a charging device is idle, or docked in a
  * desk dock. Dreams provide another modality for apps to express themselves, tailored for
  * an exhibition/lean-back experience.</p>
+ *
+ * <p>Dreams should be declared in the manifest as follows:</p>
+ * <pre>
+ * {@code
+ * <service
+ *     android:name=".MyDream"
+ *     android:exported="true"
+ *     android:icon="@drawable/my_icon"
+ *     android:label="@string/my_dream_label" >
+ *
+ *     <intent-filter>
+ *         <action android:name="android.intent.action.MAIN" />
+ *         <category android:name="android.intent.category.DREAM" />
+ *     </intent-filter>
+ *
+ *     <!-- Point to configuration activity for this dream (optional) -->
+ *     <meta-data
+ *         android:name="android.service.dreams.config_activity"
+ *         android:value="com.example.mypackage/com.example.mypackage.MyDreamSettingsActivity" />
+ * </service>
+ * }
+ * </pre>
  */
 public class Dream extends Service implements Window.Callback {
     private final static boolean DEBUG = true;
     private final String TAG = Dream.class.getSimpleName() + "[" + getClass().getSimpleName() + "]";
 
     /**
-     * The {@link Intent} that must be declared as handled by the service.
-     * To be supported, the service must also require the
-     * {@link android.Manifest.permission#BIND_WALLPAPER} permission so
-     * that other applications can not abuse it.
+     * Used with {@link Intent#ACTION_MAIN} to declare the necessary intent-filter for a dream.
+     *
+     * @see Dream
      */
-    @SdkConstant(SdkConstantType.SERVICE_ACTION)
-    public static final String SERVICE_INTERFACE =
-            "android.service.dreams.Dream";
+    @SdkConstant(SdkConstantType.INTENT_CATEGORY)
+    public static final String CATEGORY_DREAM =
+            "android.intent.category.DREAM";
 
-    /** Service meta-data key for declaring an optional configuration activity. */
+    /**
+     * Service meta-data key for declaring an optional configuration activity.
+     *
+     * @see Dream
+     * */
     public static final String METADATA_NAME_CONFIG_ACTIVITY =
             "android.service.dreams.config_activity";
 
@@ -86,10 +111,14 @@
     private Window mWindow;
     private WindowManager mWindowManager;
     private IDreamManager mSandman;
-    private boolean mInteractive;
+    private boolean mInteractive = false;
+    private boolean mLowProfile = true;
+    private boolean mFullscreen = false;
+    private boolean mScreenBright = false;
     private boolean mFinished;
 
     // begin Window.Callback methods
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchKeyEvent(KeyEvent event) {
         // TODO: create more flexible version of mInteractive that allows use of KEYCODE_BACK
@@ -105,6 +134,7 @@
         return mWindow.superDispatchKeyEvent(event);
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchKeyShortcutEvent(KeyEvent event) {
         if (!mInteractive) { 
@@ -115,6 +145,7 @@
         return mWindow.superDispatchKeyShortcutEvent(event);
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchTouchEvent(MotionEvent event) {
         // TODO: create more flexible version of mInteractive that allows clicks 
@@ -127,6 +158,7 @@
         return mWindow.superDispatchTouchEvent(event);
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchTrackballEvent(MotionEvent event) {
         if (!mInteractive) {
@@ -137,6 +169,7 @@
         return mWindow.superDispatchTrackballEvent(event);
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchGenericMotionEvent(MotionEvent event) {
         if (!mInteractive) { 
@@ -147,86 +180,112 @@
         return mWindow.superDispatchGenericMotionEvent(event);
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public View onCreatePanelView(int featureId) {
         return null;
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean onCreatePanelMenu(int featureId, Menu menu) {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean onPreparePanel(int featureId, View view, Menu menu) {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean onMenuOpened(int featureId, Menu menu) {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean onMenuItemSelected(int featureId, MenuItem item) {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onWindowAttributesChanged(LayoutParams attrs) {
-
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onContentChanged() {
-
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onWindowFocusChanged(boolean hasFocus) {
-
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onAttachedToWindow() {
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onDetachedFromWindow() {
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onPanelClosed(int featureId, Menu menu) {
     }
 
+    /** {@inheritDoc} */
     @Override
     public boolean onSearchRequested() {
         return false;
     }
 
+    /** {@inheritDoc} */
     @Override
     public ActionMode onWindowStartingActionMode(android.view.ActionMode.Callback callback) {
         return null;
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onActionModeStarted(ActionMode mode) {
     }
 
+    /** {@inheritDoc} */
     @Override
     public void onActionModeFinished(ActionMode mode) {
     }
     // end Window.Callback methods
 
+    // begin public api
+    /**
+     * Retrieves the current {@link android.view.WindowManager} for the dream.
+     * Behaves similarly to {@link android.app.Activity#getWindowManager()}.
+     *
+     * @return The current window manager, or null if the dream is not started.
+     */
     public WindowManager getWindowManager() {
         return mWindowManager;
     }
 
+    /**
+     * Retrieves the current {@link android.view.Window} for the dream.
+     * Behaves similarly to {@link android.app.Activity#getWindow()}.
+     *
+     * @return The current window, or null if the dream is not started.
+     */
     public Window getWindow() {
         return mWindow;
     }
@@ -235,6 +294,8 @@
      * Inflates a layout resource and set it to be the content view for this Dream.
      * Behaves similarly to {@link android.app.Activity#setContentView(int)}.
      *
+     * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p>
+     *
      * @param layoutResID Resource ID to be inflated.
      * 
      * @see #setContentView(android.view.View)
@@ -248,7 +309,8 @@
      * Sets a view to be the content view for this Dream.
      * Behaves similarly to {@link android.app.Activity#setContentView(android.view.View)},
      * including using {@link ViewGroup.LayoutParams#MATCH_PARENT} as the layout height and width of the view.
-     * 
+     *
+     * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p>
      * @param view The desired content to display.
      *
      * @see #setContentView(int)
@@ -263,6 +325,8 @@
      * Behaves similarly to 
      * {@link android.app.Activity#setContentView(android.view.View, android.view.ViewGroup.LayoutParams)}.
      *
+     * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p>
+     *
      * @param view The desired content to display.
      * @param params Layout parameters for the view.
      *
@@ -275,7 +339,9 @@
 
     /**
      * Adds a view to the Dream's window, leaving other content views in place.
-     * 
+     *
+     * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p>
+     *
      * @param view The desired content to display.
      * @param params Layout parameters for the view.
      */
@@ -284,6 +350,25 @@
     }
 
     /**
+     * Finds a view that was identified by the id attribute from the XML that
+     * was processed in {@link #onCreate}.
+     *
+     * <p>Note: Requires a window, do not call before {@link #onAttachedToWindow()}</p>
+     *
+     * @return The view if found or null otherwise.
+     */
+    public View findViewById(int id) {
+        return getWindow().findViewById(id);
+    }
+
+    /** FIXME remove once platform dreams are updated */
+    @Deprecated
+    protected void lightsOut() {
+        setLowProfile(true);
+        setFullscreen(true);
+    }
+
+    /**
      * Marks this dream as interactive to receive input events.
      *
      * <p>Non-interactive dreams (default) will dismiss on the first input event.</p>
@@ -297,36 +382,79 @@
     }
 
     /**
-     * Returns whether or not this dream is interactive.
+     * Returns whether or not this dream is interactive.  Defaults to false.
+     *
+     * @see #setInteractive(boolean)
      */
     public boolean isInteractive() {
         return mInteractive;
     }
 
-    /** Convenience method for setting View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view. */
-    protected void lightsOut() {
-        // turn the lights down low
-        final View v = mWindow.getDecorView();
-        if (v != null) {
-            v.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE 
-                                  | View.SYSTEM_UI_FLAG_FULLSCREEN);
-        }
+    /**
+     * Sets View.SYSTEM_UI_FLAG_LOW_PROFILE on the content view.
+     *
+     * @param lowProfile True to set View.SYSTEM_UI_FLAG_LOW_PROFILE
+     */
+    public void setLowProfile(boolean lowProfile) {
+        mLowProfile = lowProfile;
+        int flag = View.SYSTEM_UI_FLAG_LOW_PROFILE;
+        applySystemUiVisibilityFlags(mLowProfile ? flag : 0, flag);
     }
 
     /**
-     * Finds a view that was identified by the id attribute from the XML that
-     * was processed in {@link #onCreate}.
+     * Returns whether or not this dream is in low profile mode. Defaults to true.
      *
-     * @return The view if found or null otherwise.
+     * @see #setLowProfile(boolean)
      */
-    public View findViewById(int id) {
-        return getWindow().findViewById(id);
+    public boolean isLowProfile() {
+        return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_LOW_PROFILE, mLowProfile);
+    }
+
+    /**
+     * Sets View.SYSTEM_UI_FLAG_FULLSCREEN on the content view.
+     *
+     * @param fullscreen True to set View.SYSTEM_UI_FLAG_FULLSCREEN
+     */
+    public void setFullscreen(boolean fullscreen) {
+        mFullscreen = fullscreen;
+        int flag = View.SYSTEM_UI_FLAG_FULLSCREEN;
+        applySystemUiVisibilityFlags(mFullscreen ? flag : 0, flag);
+    }
+
+    /**
+     * Returns whether or not this dream is in fullscreen mode. Defaults to false.
+     *
+     * @see #setFullscreen(boolean)
+     */
+    public boolean isFullscreen() {
+        return getSystemUiVisibilityFlagValue(View.SYSTEM_UI_FLAG_FULLSCREEN, mFullscreen);
+    }
+
+    /**
+     * Marks this dream as keeping the screen bright while dreaming.
+     *
+     * @param screenBright True to keep the screen bright while dreaming.
+     */
+    public void setScreenBright(boolean screenBright) {
+        mScreenBright = screenBright;
+        int flag = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
+        applyWindowFlags(mScreenBright ? flag : 0, flag);
+    }
+
+    /**
+     * Returns whether or not this dream keeps the screen bright while dreaming. Defaults to false,
+     * allowing the screen to dim if necessary.
+     *
+     * @see #setScreenBright(boolean)
+     */
+    public boolean isScreenBright() {
+        return getWindowFlagValue(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, mScreenBright);
     }
 
     /**
      * Called when this Dream is constructed. Place your initialization here.
      *
-     * Subclasses must call through to the superclass implementation.
+     * <p>Subclasses must call through to the superclass implementation.</p>
      */
     @Override
     public void onCreate() {
@@ -336,23 +464,51 @@
     }
 
     /**
-     * Called when this Dream is started.
+     * Called when this Dream is started.  The window is created and visible at this point.
      */
     public void onStart() {
+        if (DEBUG) Slog.v(TAG, "onStart()");
         // hook for subclasses
-        Slog.v(TAG, "called Dream.onStart()");
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public final IBinder onBind(Intent intent) {
+        if (DEBUG) Slog.v(TAG, "onBind() intent = " + intent);
+        return new DreamServiceWrapper();
+    }
+
+    /**
+     * Stops the dream, detaches from the window, and wakes up.
+     *
+     * <p>Subclasses must call through to the superclass implementation.</p>
+     *
+     * <p>After this method is called, the service will be stopped.</p>
+     */
+    public void finish() {
+        if (DEBUG) Slog.v(TAG, "finish()");
+        finishInternal();
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void onDestroy() {
+        if (DEBUG) Slog.v(TAG, "onDestroy()");
+        super.onDestroy();
+
+        if (DEBUG) Slog.v(TAG, "Removing window");
+        try {
+            mWindowManager.removeView(mWindow.getDecorView());
+        } catch (Throwable t) {
+            Slog.w(TAG, "Crashed removing window view", t);
+        }
+    }
+    // end public api
+
     private void loadSandman() {
         mSandman = IDreamManager.Stub.asInterface(ServiceManager.getService("dreams"));
     }
 
-    /**
-     * Creates a new dream window, attaches the current content view, and shows it.
-     * 
-     * @param windowToken Binder to attach to the window to allow access to the correct window type.
-     * @hide
-     */
     private final void attach(IBinder windowToken) {
         if (DEBUG) Slog.v(TAG, "Attached on thread " + Thread.currentThread().getId());
 
@@ -375,7 +531,8 @@
         lp.windowAnimations = com.android.internal.R.style.Animation_Dream;
         lp.flags |= ( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
-                    | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON 
+                    | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
+                    | (mScreenBright ? WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON : 0)
                     );
         mWindow.setAttributes(lp);
 
@@ -389,8 +546,11 @@
             @Override
             public void run() {
                 if (DEBUG) Slog.v(TAG, "Window added on thread " + Thread.currentThread().getId());
-
                 try {
+                    applySystemUiVisibilityFlags(
+                            (mLowProfile ? View.SYSTEM_UI_FLAG_LOW_PROFILE : 0)
+                          | (mFullscreen ? View.SYSTEM_UI_FLAG_FULLSCREEN : 0),
+                            View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN);
                     getWindowManager().addView(mWindow.getDecorView(), mWindow.getAttributes());
                 } catch (Throwable t) {
                     Slog.w("Crashed adding window view", t);
@@ -424,18 +584,6 @@
         }
     }
 
-    /**
-     * Stops the dream, detaches from the window, and wakes up.
-     *
-     * Subclasses must call through to the superclass implementation.
-     *
-     * <p>After this method is called, the service will be stopped.</p>
-     */
-    public void finish() {
-        if (DEBUG) Slog.v(TAG, "finish()");
-        finishInternal();
-    }
-
     private void finishInternal() {
         if (DEBUG) Slog.v(TAG, "finishInternal() mFinished = " + mFinished);
         if (mFinished) return;
@@ -454,23 +602,33 @@
         }
     }
 
-    @Override
-    public void onDestroy() {
-        if (DEBUG) Slog.v(TAG, "onDestroy()");
-        super.onDestroy();
+    private boolean getWindowFlagValue(int flag, boolean defaultValue) {
+        return mWindow == null ? defaultValue : (mWindow.getAttributes().flags & flag) != 0;
+    }
 
-        if (DEBUG) Slog.v(TAG, "Removing window");
-        try {
-            mWindowManager.removeView(mWindow.getDecorView());
-        } catch (Throwable t) {
-            Slog.w(TAG, "Crashed removing window view", t);
+    private void applyWindowFlags(int flags, int mask) {
+        if (mWindow != null) {
+            WindowManager.LayoutParams lp = mWindow.getAttributes();
+            lp.flags = applyFlags(lp.flags, flags, mask);
+            mWindow.setAttributes(lp);
+            mWindowManager.updateViewLayout(mWindow.getDecorView(), lp);
         }
     }
 
-    @Override
-    public final IBinder onBind(Intent intent) {
-        if (DEBUG) Slog.v(TAG, "onBind() intent = " + intent);
-        return new DreamServiceWrapper();
+    private boolean getSystemUiVisibilityFlagValue(int flag, boolean defaultValue) {
+        View v = mWindow == null ? null : mWindow.getDecorView();
+        return v == null ? defaultValue : (v.getSystemUiVisibility() & flag) != 0;
+    }
+
+    private void applySystemUiVisibilityFlags(int flags, int mask) {
+        View v = mWindow == null ? null : mWindow.getDecorView();
+        if (v != null) {
+            v.setSystemUiVisibility(applyFlags(v.getSystemUiVisibility(), flags, mask));
+        }
+    }
+
+    private int applyFlags(int oldFlags, int flags, int mask) {
+        return (oldFlags&~mask) | (flags&mask);
     }
 
     private class DreamServiceWrapper extends IDreamService.Stub {
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 8756950..f3bef08 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -1044,6 +1044,17 @@
         return new int[] { appWidgetId };
     }
 
+    public int getStatusWidget() {
+        int appWidgetId = -1;
+        String appWidgetIdString = Settings.Secure.getString(
+                mContentResolver, Settings.Secure.LOCK_SCREEN_STATUS_APPWIDGET_ID);
+        if (appWidgetIdString != null) {
+            appWidgetId = (int) Integer.decode(appWidgetIdString);
+        }
+
+        return appWidgetId;
+    }
+
     private long getLong(String secureSettingKey, long defaultValue) {
         try {
             return getLockSettings().getLong(secureSettingKey, defaultValue,
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 69ef080..8823328 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -340,7 +340,9 @@
 
         bitmap->setConfig(config, scaledWidth, scaledHeight);
         bitmap->setIsOpaque(decoded->isOpaque());
-        bitmap->allocPixels(&javaAllocator, NULL);
+        if (!bitmap->allocPixels(&javaAllocator, NULL)) {
+            return nullObjectReturn("allocation failed for scaled bitmap");
+        }
         bitmap->eraseColor(0);
 
         SkPaint paint;
diff --git a/core/res/res/menu/webview_find.xml b/core/res/res/menu/webview_find.xml
index 1770bd9..54f25d2 100644
--- a/core/res/res/menu/webview_find.xml
+++ b/core/res/res/menu/webview_find.xml
@@ -18,9 +18,11 @@
     <item android:id="@+id/find_prev"
         android:icon="?android:attr/findOnPagePreviousDrawable"
         android:showAsAction="always"
+        android:title="@string/find_previous"
         />
     <item android:id="@+id/find_next"
         android:icon="?android:attr/findOnPageNextDrawable"
         android:showAsAction="always"
+        android:title="@string/find_next"
         />
 </menu>
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 7209e4e..0775040 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -708,11 +708,11 @@
          backup and restore of the application's data on external storage. -->
     <attr name="backupAgent" format="string" />
 
-    <!-- Whether to allow the application to participate in backup
-         infrastructure.  If this attribute is set to <code>false</code>, no backup
-         of the application will ever be performed, even by a full-system backup that
-         would otherwise cause all application data to be saved via adb.  The
-         default value of this attribute is <code>true</code>. -->
+    <!-- Whether to allow the application to participate in the backup
+         and restore infrastructure.  If this attribute is set to <code>false</code>,
+         no backup or restore of the application will ever be performed, even by a
+         full-system backup that would otherwise cause all application data to be saved
+         via adb.  The default value of this attribute is <code>true</code>. -->
     <attr name="allowBackup" format="boolean" />
 
     <!-- Whether the application in question should be terminated after its
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 761bfba..185725b 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3141,7 +3141,7 @@
 
     <!-- Security Permissions strings-->
     <!-- Text that is placed at the front of a permission name that is being added to an app [CHAR LIMIT=NONE] -->
-    <string name="perms_new_perm_prefix"><font size="12" fgcolor="#ff900000">NEW: </font></string>
+    <string name="perms_new_perm_prefix"><font size="12" fgcolor="#ff33b5e5">NEW: </font></string>
     <!-- Text that is placed at the front of a permission name that is being added to an app [CHAR LIMIT=NONE] -->
     <string name="perms_description_app">Provided by <xliff:g id="app_name">%1$s</xliff:g>.</string>
     <!-- Shown for an application when it doesn't require any permission grants. -->
@@ -3495,6 +3495,10 @@
     <string name="find">Find</string>
     <!-- ActionBar action to use the current selection to perform a web search [CHAR-LIMIT=16] -->
     <string name="websearch">Web Search</string>
+    <!-- ActionBar action to find the next match in the page [CHAR LIMIT=24] -->
+    <string name="find_next">Find next</string>
+    <!-- ActionBar action to find the previous match in the page [CHAR LIMIT=24] -->
+    <string name="find_previous">Find previous</string>
 
     <!-- Network positioning notification ticker. The name of the user (e.g. John Doe) who sent
          the request is shown as a dynamic string. -->
diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java
index c1d3407..b38d107 100644
--- a/graphics/java/android/graphics/BitmapRegionDecoder.java
+++ b/graphics/java/android/graphics/BitmapRegionDecoder.java
@@ -36,6 +36,9 @@
 public final class BitmapRegionDecoder {
     private int mNativeBitmapRegionDecoder;
     private boolean mRecycled;
+    // ensures that the native decoder object exists and that only one decode can
+    // occur at a time.
+    private final Object mNativeLock = new Object();
 
     /**
      * Create a BitmapRegionDecoder from the specified byte array.
@@ -179,24 +182,30 @@
      *         decoded.
      */
     public Bitmap decodeRegion(Rect rect, BitmapFactory.Options options) {
-        checkRecycled("decodeRegion called on recycled region decoder");
-        if (rect.right <= 0 || rect.bottom <= 0 || rect.left >= getWidth()
-                || rect.top >= getHeight())
-            throw new IllegalArgumentException("rectangle is outside the image");
-        return nativeDecodeRegion(mNativeBitmapRegionDecoder, rect.left, rect.top,
-                rect.right - rect.left, rect.bottom - rect.top, options);
+        synchronized (mNativeLock) {
+            checkRecycled("decodeRegion called on recycled region decoder");
+            if (rect.right <= 0 || rect.bottom <= 0 || rect.left >= getWidth()
+                    || rect.top >= getHeight())
+                throw new IllegalArgumentException("rectangle is outside the image");
+            return nativeDecodeRegion(mNativeBitmapRegionDecoder, rect.left, rect.top,
+                    rect.right - rect.left, rect.bottom - rect.top, options);
+        }
     }
 
     /** Returns the original image's width */
     public int getWidth() {
-        checkRecycled("getWidth called on recycled region decoder");
-        return nativeGetWidth(mNativeBitmapRegionDecoder);
+        synchronized (mNativeLock) {
+            checkRecycled("getWidth called on recycled region decoder");
+            return nativeGetWidth(mNativeBitmapRegionDecoder);
+        }
     }
 
     /** Returns the original image's height */
     public int getHeight() {
-        checkRecycled("getHeight called on recycled region decoder");
-        return nativeGetHeight(mNativeBitmapRegionDecoder);
+        synchronized (mNativeLock) {
+            checkRecycled("getHeight called on recycled region decoder");
+            return nativeGetHeight(mNativeBitmapRegionDecoder);
+        }
     }
 
     /**
@@ -210,9 +219,11 @@
      * memory when there are no more references to this region decoder.
      */
     public void recycle() {
-        if (!mRecycled) {
-            nativeClean(mNativeBitmapRegionDecoder);
-            mRecycled = true;
+        synchronized (mNativeLock) {
+            if (!mRecycled) {
+                nativeClean(mNativeBitmapRegionDecoder);
+                mRecycled = true;
+            }
         }
     }
 
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index e032ae4..549edd2 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -21,6 +21,7 @@
 		LayerRenderer.cpp \
 		Matrix.cpp \
 		OpenGLRenderer.cpp \
+		PathRenderer.cpp \
 		Patch.cpp \
 		PatchCache.cpp \
 		PathCache.cpp \
@@ -34,7 +35,7 @@
 		Stencil.cpp \
 		TextureCache.cpp \
 		TextDropShadowCache.cpp
-	
+
 	LOCAL_C_INCLUDES += \
 		$(JNI_H_INCLUDE) \
 		$(LOCAL_PATH)/../../include/utils \
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index bb004c0..799aea3 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -349,7 +349,7 @@
 
 bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) {
     Caches& caches = Caches::getInstance();
-    if (layer && layer->isTextureLayer() && bitmap->width() <= caches.maxTextureSize &&
+    if (layer && bitmap->width() <= caches.maxTextureSize &&
             bitmap->height() <= caches.maxTextureSize) {
 
         GLuint fbo = caches.fboCache.get();
@@ -362,6 +362,7 @@
 
         GLuint texture;
         GLuint previousFbo;
+        GLuint previousViewport[4];
 
         GLenum format;
         GLenum type;
@@ -391,11 +392,13 @@
 
         float alpha = layer->getAlpha();
         SkXfermode::Mode mode = layer->getMode();
+        GLuint previousLayerFbo = layer->getFbo();
 
         layer->setAlpha(255, SkXfermode::kSrc_Mode);
         layer->setFbo(fbo);
 
         glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo);
+        glGetIntegerv(GL_VIEWPORT, (GLint*) &previousViewport);
         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
 
         glGenTextures(1, &texture);
@@ -463,9 +466,11 @@
 
         glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
         layer->setAlpha(alpha, mode);
-        layer->setFbo(0);
+        layer->setFbo(previousLayerFbo);
         glDeleteTextures(1, &texture);
         caches.fboCache.put(fbo);
+        glViewport(previousViewport[0], previousViewport[1],
+                previousViewport[2], previousViewport[3]);
 
         return status;
     }
diff --git a/libs/hwui/Matrix.cpp b/libs/hwui/Matrix.cpp
index 7348f4d..87add17 100644
--- a/libs/hwui/Matrix.cpp
+++ b/libs/hwui/Matrix.cpp
@@ -55,21 +55,21 @@
     mSimpleMatrix = true;
 }
 
-bool Matrix4::changesBounds() {
+bool Matrix4::changesBounds() const {
     return !(data[0] == 1.0f && data[1] == 0.0f && data[2] == 0.0f && data[4] == 0.0f &&
              data[5] == 1.0f && data[6] == 0.0f && data[8] == 0.0f && data[9] == 0.0f &&
              data[10] == 1.0f);
 }
 
-bool Matrix4::isPureTranslate() {
+bool Matrix4::isPureTranslate() const {
     return mSimpleMatrix && data[kScaleX] == 1.0f && data[kScaleY] == 1.0f;
 }
 
-bool Matrix4::isSimple() {
+bool Matrix4::isSimple() const {
     return mSimpleMatrix;
 }
 
-bool Matrix4::isIdentity() {
+bool Matrix4::isIdentity() const {
     return mIsIdentity;
 }
 
diff --git a/libs/hwui/Matrix.h b/libs/hwui/Matrix.h
index 22220a9..02b781e 100644
--- a/libs/hwui/Matrix.h
+++ b/libs/hwui/Matrix.h
@@ -112,11 +112,11 @@
         multiply(u);
     }
 
-    bool isPureTranslate();
-    bool isSimple();
-    bool isIdentity();
+    bool isPureTranslate() const;
+    bool isSimple() const;
+    bool isIdentity() const;
 
-    bool changesBounds();
+    bool changesBounds() const;
 
     void copyTo(float* v) const;
     void copyTo(SkMatrix& v) const;
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index c475f20..bdf1229b 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -33,6 +33,7 @@
 
 #include "OpenGLRenderer.h"
 #include "DisplayListRenderer.h"
+#include "PathRenderer.h"
 #include "Vector.h"
 
 namespace android {
@@ -540,15 +541,7 @@
 
         if (p) {
             alpha = p->getAlpha();
-            if (!mCaches.extensions.hasFramebufferFetch()) {
-                const bool isMode = SkXfermode::IsMode(p->getXfermode(), &mode);
-                if (!isMode) {
-                    // Assume SRC_OVER
-                    mode = SkXfermode::kSrcOver_Mode;
-                }
-            } else {
-                mode = getXfermode(p->getXfermode());
-            }
+            mode = getXfermode(p->getXfermode());
         } else {
             mode = SkXfermode::kSrcOver_Mode;
         }
@@ -1260,12 +1253,12 @@
     mCaches.disbaleTexCoordsVertexArray();
 }
 
-void OpenGLRenderer::setupDrawAALine() {
+void OpenGLRenderer::setupDrawAA() {
     mDescription.isAA = true;
 }
 
-void OpenGLRenderer::setupDrawAARect() {
-    mDescription.isAARect = true;
+void OpenGLRenderer::setupDrawVertexShape() {
+    mDescription.isVertexShape = true;
 }
 
 void OpenGLRenderer::setupDrawPoint(float pointSize) {
@@ -1872,97 +1865,48 @@
  * a fragment shader to compute the translucency of the color from its position, we simply use a
  * varying parameter to define how far a given pixel is into the region.
  */
-void OpenGLRenderer::drawAARect(float left, float top, float right, float bottom,
-        int color, SkXfermode::Mode mode) {
-    float inverseScaleX = 1.0f;
-    float inverseScaleY = 1.0f;
+void OpenGLRenderer::drawConvexPath(const SkPath& path, int color, SkXfermode::Mode mode, bool isAA) {
+    VertexBuffer vertexBuffer;
+    // TODO: try clipping large paths to viewport
+    PathRenderer::convexPathFillVertices(path, mSnapshot->transform, vertexBuffer, isAA);
 
-    // The quad that we use needs to account for scaling.
-    if (CC_UNLIKELY(!mSnapshot->transform->isPureTranslate())) {
-        Matrix4 *mat = mSnapshot->transform;
-        float m00 = mat->data[Matrix4::kScaleX];
-        float m01 = mat->data[Matrix4::kSkewY];
-        float m10 = mat->data[Matrix4::kSkewX];
-        float m11 = mat->data[Matrix4::kScaleY];
-        float scaleX = sqrt(m00 * m00 + m01 * m01);
-        float scaleY = sqrt(m10 * m10 + m11 * m11);
-        inverseScaleX = (scaleX != 0) ? (inverseScaleX / scaleX) : 0;
-        inverseScaleY = (scaleY != 0) ? (inverseScaleY / scaleY) : 0;
-    }
+    setupDraw();
+    setupDrawNoTexture();
+    if (isAA) setupDrawAA();
+    setupDrawVertexShape();
+    setupDrawColor(color, ((color >> 24) & 0xFF) * mSnapshot->alpha);
+    setupDrawColorFilter();
+    setupDrawShader();
+    setupDrawBlending(isAA, mode);
+    setupDrawProgram();
+    setupDrawModelViewIdentity(true);
+    setupDrawColorUniforms();
+    setupDrawColorFilterUniforms();
+    setupDrawShaderIdentityUniforms();
 
-    float boundarySizeX = .5 * inverseScaleX;
-    float boundarySizeY = .5 * inverseScaleY;
+    void* vertices = vertexBuffer.getBuffer();
+    bool force = mCaches.unbindMeshBuffer();
+    mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position,
+                                      vertices, isAA ? gAlphaVertexStride : gVertexStride);
+    mCaches.resetTexCoordsVertexPointer();
+    mCaches.unbindIndicesBuffer();
 
-    float innerLeft = left + boundarySizeX;
-    float innerRight = right - boundarySizeX;
-    float innerTop = top + boundarySizeY;
-    float innerBottom = bottom - boundarySizeY;
+    int alphaSlot = -1;
+    if (isAA) {
+        void* alphaCoords = ((GLbyte*) vertices) + gVertexAlphaOffset;
+        alphaSlot = mCaches.currentProgram->getAttrib("vtxAlpha");
 
-    // Adjust the rect by the AA boundary padding
-    left -= boundarySizeX;
-    right += boundarySizeX;
-    top -= boundarySizeY;
-    bottom += boundarySizeY;
-
-    if (!quickReject(left, top, right, bottom)) {
-        setupDraw();
-        setupDrawNoTexture();
-        setupDrawAARect();
-        setupDrawColor(color, ((color >> 24) & 0xFF) * mSnapshot->alpha);
-        setupDrawColorFilter();
-        setupDrawShader();
-        setupDrawBlending(true, mode);
-        setupDrawProgram();
-        setupDrawModelViewIdentity(true);
-        setupDrawColorUniforms();
-        setupDrawColorFilterUniforms();
-        setupDrawShaderIdentityUniforms();
-
-        AlphaVertex rects[14];
-        AlphaVertex* aVertices = &rects[0];
-        void* alphaCoords = ((GLbyte*) aVertices) + gVertexAlphaOffset;
-
-        bool force = mCaches.unbindMeshBuffer();
-        mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position,
-                aVertices, gAlphaVertexStride);
-        mCaches.resetTexCoordsVertexPointer();
-        mCaches.unbindIndicesBuffer();
-
-        int alphaSlot = mCaches.currentProgram->getAttrib("vtxAlpha");
+        // TODO: avoid enable/disable in back to back uses of the alpha attribute
         glEnableVertexAttribArray(alphaSlot);
         glVertexAttribPointer(alphaSlot, 1, GL_FLOAT, GL_FALSE, gAlphaVertexStride, alphaCoords);
+    }
 
-        // draw left
-        AlphaVertex::set(aVertices++, left, bottom, 0);
-        AlphaVertex::set(aVertices++, innerLeft, innerBottom, 1);
-        AlphaVertex::set(aVertices++, left, top, 0);
-        AlphaVertex::set(aVertices++, innerLeft, innerTop, 1);
+    SkRect bounds = path.getBounds();
+    dirtyLayer(bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom, *mSnapshot->transform);
 
-        // draw top
-        AlphaVertex::set(aVertices++, right, top, 0);
-        AlphaVertex::set(aVertices++, innerRight, innerTop, 1);
+    glDrawArrays(GL_TRIANGLE_STRIP, 0, vertexBuffer.getSize());
 
-        // draw right
-        AlphaVertex::set(aVertices++, right, bottom, 0);
-        AlphaVertex::set(aVertices++, innerRight, innerBottom, 1);
-
-        // draw bottom
-        AlphaVertex::set(aVertices++, left, bottom, 0);
-        AlphaVertex::set(aVertices++, innerLeft, innerBottom, 1);
-
-        // draw inner rect (repeating last vertex to create degenerate bridge triangles)
-        // TODO: also consider drawing the inner rect without the blending-forced shader, if
-        // blending is expensive. Note: can't use drawColorRect() since it doesn't use vertex
-        // buffers like below, resulting in slightly different transformed coordinates.
-        AlphaVertex::set(aVertices++, innerLeft, innerBottom, 1);
-        AlphaVertex::set(aVertices++, innerLeft, innerTop, 1);
-        AlphaVertex::set(aVertices++, innerRight, innerBottom, 1);
-        AlphaVertex::set(aVertices++, innerRight, innerTop, 1);
-
-        dirtyLayer(left, top, right, bottom, *mSnapshot->transform);
-
-        glDrawArrays(GL_TRIANGLE_STRIP, 0, 14);
-
+    if (isAA) {
         glDisableVertexAttribArray(alphaSlot);
     }
 }
@@ -2040,7 +1984,7 @@
     setupDraw();
     setupDrawNoTexture();
     if (isAA) {
-        setupDrawAALine();
+        setupDrawAA();
     }
     setupDrawColor(paint->getColor(), alpha);
     setupDrawColorFilter();
@@ -2326,30 +2270,62 @@
 }
 
 status_t OpenGLRenderer::drawRoundRect(float left, float top, float right, float bottom,
-        float rx, float ry, SkPaint* paint) {
-    if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
+        float rx, float ry, SkPaint* p) {
+    if (mSnapshot->isIgnored() || quickReject(left, top, right, bottom)) {
+        return DrawGlInfo::kStatusDone;
+    }
 
-    mCaches.activeTexture(0);
-    const PathTexture* texture = mCaches.roundRectShapeCache.getRoundRect(
-            right - left, bottom - top, rx, ry, paint);
-    return drawShape(left, top, texture, paint);
+    if (p->getStyle() != SkPaint::kFill_Style) {
+        mCaches.activeTexture(0);
+        const PathTexture* texture = mCaches.roundRectShapeCache.getRoundRect(
+                right - left, bottom - top, rx, ry, p);
+        return drawShape(left, top, texture, p);
+    }
+
+    SkPath path;
+    SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
+    path.addRoundRect(rect, rx, ry);
+    drawConvexPath(path, p->getColor(), getXfermode(p->getXfermode()), p->isAntiAlias());
+
+    return DrawGlInfo::kStatusDrew;
 }
 
-status_t OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
-    if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
+status_t OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* p) {
+    if (mSnapshot->isIgnored() || quickReject(x - radius, y - radius, x + radius, y + radius)) {
+        return DrawGlInfo::kStatusDone;
+    }
 
-    mCaches.activeTexture(0);
-    const PathTexture* texture = mCaches.circleShapeCache.getCircle(radius, paint);
-    return drawShape(x - radius, y - radius, texture, paint);
+    if (p->getStyle() != SkPaint::kFill_Style) {
+        mCaches.activeTexture(0);
+        const PathTexture* texture = mCaches.circleShapeCache.getCircle(radius, p);
+        return drawShape(x - radius, y - radius, texture, p);
+    }
+
+    SkPath path;
+    path.addCircle(x, y, radius);
+    drawConvexPath(path, p->getColor(), getXfermode(p->getXfermode()), p->isAntiAlias());
+
+    return DrawGlInfo::kStatusDrew;
 }
 
 status_t OpenGLRenderer::drawOval(float left, float top, float right, float bottom,
-        SkPaint* paint) {
-    if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
+        SkPaint* p) {
+    if (mSnapshot->isIgnored() || quickReject(left, top, right, bottom)) {
+        return DrawGlInfo::kStatusDone;
+    }
 
-    mCaches.activeTexture(0);
-    const PathTexture* texture = mCaches.ovalShapeCache.getOval(right - left, bottom - top, paint);
-    return drawShape(left, top, texture, paint);
+    if (p->getStyle() != SkPaint::kFill_Style) {
+        mCaches.activeTexture(0);
+        const PathTexture* texture = mCaches.ovalShapeCache.getOval(right - left, bottom - top, p);
+        return drawShape(left, top, texture, p);
+    }
+
+    SkPath path;
+    SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
+    path.addOval(rect);
+    drawConvexPath(path, p->getColor(), getXfermode(p->getXfermode()), p->isAntiAlias());
+
+    return DrawGlInfo::kStatusDrew;
 }
 
 status_t OpenGLRenderer::drawArc(float left, float top, float right, float bottom,
@@ -2366,40 +2342,23 @@
     return drawShape(left, top, texture, paint);
 }
 
-status_t OpenGLRenderer::drawRectAsShape(float left, float top, float right, float bottom,
-        SkPaint* paint) {
-    if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
-
-    mCaches.activeTexture(0);
-    const PathTexture* texture = mCaches.rectShapeCache.getRect(right - left, bottom - top, paint);
-    return drawShape(left, top, texture, paint);
-}
-
 status_t OpenGLRenderer::drawRect(float left, float top, float right, float bottom, SkPaint* p) {
-    if (p->getStyle() != SkPaint::kFill_Style) {
-        return drawRectAsShape(left, top, right, bottom, p);
-    }
-
-    if (quickReject(left, top, right, bottom)) {
+    if (mSnapshot->isIgnored() || quickReject(left, top, right, bottom)) {
         return DrawGlInfo::kStatusDone;
     }
 
-    SkXfermode::Mode mode;
-    if (!mCaches.extensions.hasFramebufferFetch()) {
-        const bool isMode = SkXfermode::IsMode(p->getXfermode(), &mode);
-        if (!isMode) {
-            // Assume SRC_OVER
-            mode = SkXfermode::kSrcOver_Mode;
-        }
-    } else {
-        mode = getXfermode(p->getXfermode());
+    if (p->getStyle() != SkPaint::kFill_Style) {
+        mCaches.activeTexture(0);
+        const PathTexture* texture = mCaches.rectShapeCache.getRect(right - left, bottom - top, p);
+        return drawShape(left, top, texture, p);
     }
 
-    int color = p->getColor();
     if (p->isAntiAlias() && !mSnapshot->transform->isSimple()) {
-        drawAARect(left, top, right, bottom, color, mode);
+        SkPath path;
+        path.addRect(left, top, right, bottom);
+        drawConvexPath(path, p->getColor(), getXfermode(p->getXfermode()), true);
     } else {
-        drawColorRect(left, top, right, bottom, color, mode);
+        drawColorRect(left, top, right, bottom, p->getColor(), getXfermode(p->getXfermode()));
     }
 
     return DrawGlInfo::kStatusDrew;
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index 3e34336..7d5da68 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -493,19 +493,6 @@
     status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
 
     /**
-     * Renders the rect defined by the specified bounds as a shape.
-     * This will render the rect using a path texture, which is used to render
-     * rects with stroke effects.
-     *
-     * @param left The left coordinate of the rect to draw
-     * @param top The top coordinate of the rect to draw
-     * @param right The right coordinate of the rect to draw
-     * @param bottom The bottom coordinate of the rect to draw
-     * @param p The paint to draw the rect with
-     */
-    status_t drawRectAsShape(float left, float top, float right, float bottom, SkPaint* p);
-
-    /**
      * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
      * different compositing rules.
      *
@@ -517,17 +504,14 @@
     void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint);
 
     /**
-     * Renders the rect defined by the specified bounds as an anti-aliased rect.
+     * Renders the convex hull defined by the specified path as a strip of polygons.
      *
-     * @param left The left coordinate of the rect to draw
-     * @param top The top coordinate of the rect to draw
-     * @param right The right coordinate of the rect to draw
-     * @param bottom The bottom coordinate of the rect to draw
+     * @param path The hull of the path to draw
      * @param color The color of the rect
-     * @param mode The blending mode to draw the rect
+     * @param mode The blending mode to draw the path
+     * @param isAA True if the drawing should be anti-aliased
      */
-    void drawAARect(float left, float top, float right, float bottom,
-            int color, SkXfermode::Mode mode);
+    void drawConvexPath(const SkPath& path, int color, SkXfermode::Mode mode, bool isAA);
 
     /**
      * Draws a textured rectangle with the specified texture. The specified coordinates
@@ -688,8 +672,8 @@
     void setupDrawWithTexture(bool isAlpha8 = false);
     void setupDrawWithExternalTexture();
     void setupDrawNoTexture();
-    void setupDrawAALine();
-    void setupDrawAARect();
+    void setupDrawAA();
+    void setupDrawVertexShape();
     void setupDrawPoint(float pointSize);
     void setupDrawColor(int color);
     void setupDrawColor(int color, int alpha);
diff --git a/libs/hwui/PathRenderer.cpp b/libs/hwui/PathRenderer.cpp
new file mode 100644
index 0000000..d222009
--- /dev/null
+++ b/libs/hwui/PathRenderer.cpp
@@ -0,0 +1,304 @@
+/*
+ * Copyright (C) 2012 The Android Open Source 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.
+ */
+
+#define LOG_TAG "PathRenderer"
+#define LOG_NDEBUG 1
+#define ATRACE_TAG ATRACE_TAG_GRAPHICS
+
+#define VERTEX_DEBUG 0
+
+#include <SkPath.h>
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <utils/Log.h>
+#include <utils/Trace.h>
+
+#include "PathRenderer.h"
+#include "Matrix.h"
+#include "Vector.h"
+#include "Vertex.h"
+
+namespace android {
+namespace uirenderer {
+
+#define THRESHOLD 0.5f
+
+void PathRenderer::computeInverseScales(const mat4 *transform,
+        float &inverseScaleX, float& inverseScaleY) {
+    inverseScaleX = 1.0f;
+    inverseScaleY = 1.0f;
+    if (CC_UNLIKELY(!transform->isPureTranslate())) {
+        float m00 = transform->data[Matrix4::kScaleX];
+        float m01 = transform->data[Matrix4::kSkewY];
+        float m10 = transform->data[Matrix4::kSkewX];
+        float m11 = transform->data[Matrix4::kScaleY];
+        float scaleX = sqrt(m00 * m00 + m01 * m01);
+        float scaleY = sqrt(m10 * m10 + m11 * m11);
+        inverseScaleX = (scaleX != 0) ? (inverseScaleX / scaleX) : 0;
+        inverseScaleY = (scaleY != 0) ? (inverseScaleY / scaleY) : 0;
+    }
+}
+
+void PathRenderer::convexPathFillVertices(const SkPath &path, const mat4 *transform,
+        VertexBuffer &vertexBuffer, bool isAA) {
+    ATRACE_CALL();
+    float inverseScaleX;
+    float inverseScaleY;
+    computeInverseScales(transform, inverseScaleX, inverseScaleY);
+
+    Vector<Vertex> tempVertices;
+    float thresholdx = THRESHOLD * inverseScaleX;
+    float thresholdy = THRESHOLD * inverseScaleY;
+    convexPathVertices(path,
+                       thresholdx * thresholdx,
+                       thresholdy * thresholdy,
+                       tempVertices);
+
+#if VERTEX_DEBUG
+    for (unsigned int i = 0; i < tempVertices.size(); i++) {
+        ALOGD("orig path: point at %f %f",
+              tempVertices[i].position[0],
+              tempVertices[i].position[1]);
+    }
+#endif
+    int currentIndex = 0;
+    if (!isAA) {
+        Vertex* buffer = vertexBuffer.alloc<Vertex>(tempVertices.size());
+
+        // zig zag between all previous points on the inside of the hull to create a
+        // triangle strip that fills the hull
+        int srcAindex = 0;
+        int srcBindex = tempVertices.size() - 1;
+        while (srcAindex <= srcBindex) {
+            Vertex::set(&buffer[currentIndex++],
+                        tempVertices.editArray()[srcAindex].position[0],
+                        tempVertices.editArray()[srcAindex].position[1]);
+            if (srcAindex == srcBindex) break;
+            Vertex::set(&buffer[currentIndex++],
+                        tempVertices.editArray()[srcBindex].position[0],
+                        tempVertices.editArray()[srcBindex].position[1]);
+            srcAindex++;
+            srcBindex--;
+        }
+        return;
+    }
+    AlphaVertex* buffer = vertexBuffer.alloc<AlphaVertex>(tempVertices.size() * 3 + 2);
+
+    // generate alpha points - fill Alpha vertex gaps in between each point with
+    // alpha 0 vertex, offset by a scaled normal.
+    Vertex* last = &(tempVertices.editArray()[tempVertices.size()-1]);
+
+    for (unsigned int i = 0; i<tempVertices.size(); i++) {
+        Vertex* current = &(tempVertices.editArray()[i]);
+        Vertex* next = &(tempVertices.editArray()[i + 1 >= tempVertices.size() ? 0 : i + 1]);
+
+        vec2 lastNormal(current->position[1] - last->position[1],
+                        last->position[0] - current->position[0]);
+        lastNormal.normalize();
+        vec2 nextNormal(next->position[1] - current->position[1],
+                        current->position[0] - next->position[0]);
+        nextNormal.normalize();
+
+        // AA point offset from original point is that point's normal, such that
+        // each side is offset by .5 pixels
+        vec2 totalOffset = (lastNormal + nextNormal) / (2 * (1 + lastNormal.dot(nextNormal)));
+        totalOffset.x *= inverseScaleX;
+        totalOffset.y *= inverseScaleY;
+
+        AlphaVertex::set(&buffer[currentIndex++],
+                         current->position[0] + totalOffset.x,
+                         current->position[1] + totalOffset.y,
+                         0.0f);
+        AlphaVertex::set(&buffer[currentIndex++],
+                         current->position[0] - totalOffset.x,
+                         current->position[1] - totalOffset.y,
+                         1.0f);
+        last = current;
+    }
+
+    // wrap around to beginning
+    AlphaVertex::set(&buffer[currentIndex++],
+                     buffer[0].position[0],
+                     buffer[0].position[1], 0.0f);
+    AlphaVertex::set(&buffer[currentIndex++],
+                     buffer[1].position[0],
+                     buffer[1].position[1], 1.0f);
+
+    // zig zag between all previous points on the inside of the hull to create a
+    // triangle strip that fills the hull, repeating the first inner point to
+    // create degenerate tris to start inside path
+    int srcAindex = 0;
+    int srcBindex = tempVertices.size() - 1;
+    while (srcAindex <= srcBindex) {
+        AlphaVertex::set(&buffer[currentIndex++],
+                         buffer[srcAindex * 2 + 1].position[0],
+                         buffer[srcAindex * 2 + 1].position[1],
+                         1.0f);
+        if (srcAindex == srcBindex) break;
+        AlphaVertex::set(&buffer[currentIndex++],
+                         buffer[srcBindex * 2 + 1].position[0],
+                         buffer[srcBindex * 2 + 1].position[1],
+                         1.0f);
+        srcAindex++;
+        srcBindex--;
+    }
+
+#if VERTEX_DEBUG
+    for (unsigned int i = 0; i < vertexBuffer.mSize; i++) {
+        ALOGD("point at %f %f",
+              buffer[i].position[0],
+              buffer[i].position[1]);
+    }
+#endif
+}
+
+
+void PathRenderer::convexPathVertices(const SkPath &path, float thresholdx, float thresholdy,
+        Vector<Vertex> &outputVertices) {
+    ATRACE_CALL();
+
+    SkPath::Iter iter(path, true);
+    SkPoint pos;
+    SkPoint pts[4];
+    SkPath::Verb v;
+    Vertex* newVertex = 0;
+    while (SkPath::kDone_Verb != (v = iter.next(pts))) {
+            switch (v) {
+                case SkPath::kMove_Verb:
+                    pos = pts[0];
+                    ALOGV("Move to pos %f %f", pts[0].x(), pts[0].y());
+                    break;
+                case SkPath::kClose_Verb:
+                    ALOGV("Close at pos %f %f", pts[0].x(), pts[0].y());
+                    break;
+                case SkPath::kLine_Verb:
+                    ALOGV("kLine_Verb %f %f -> %f %f",
+                          pts[0].x(), pts[0].y(),
+                          pts[1].x(), pts[1].y());
+
+                    // TODO: make this not yuck
+                    outputVertices.push();
+                    newVertex = &(outputVertices.editArray()[outputVertices.size()-1]);
+                    Vertex::set(newVertex, pts[1].x(), pts[1].y());
+                    break;
+                case SkPath::kQuad_Verb:
+                    ALOGV("kQuad_Verb");
+                    recursiveQuadraticBezierVertices(
+                        pts[0].x(), pts[0].y(),
+                        pts[2].x(), pts[2].y(),
+                        pts[1].x(), pts[1].y(),
+                        thresholdx, thresholdy,
+                        outputVertices);
+                    break;
+                case SkPath::kCubic_Verb:
+                    ALOGV("kCubic_Verb");
+                    recursiveCubicBezierVertices(
+                        pts[0].x(), pts[0].y(),
+                        pts[1].x(), pts[1].y(),
+                        pts[3].x(), pts[3].y(),
+                        pts[2].x(), pts[2].y(),
+                        thresholdx, thresholdy, outputVertices);
+                    break;
+                default:
+                    break;
+            }
+    }
+}
+
+void PathRenderer::recursiveCubicBezierVertices(
+        float p1x, float p1y, float c1x, float c1y,
+        float p2x, float p2y, float c2x, float c2y,
+        float thresholdx, float thresholdy, Vector<Vertex> &outputVertices) {
+    float dx = p2x - p1x;
+    float dy = p2y - p1y;
+    float d1 = fabs((c1x - p2x) * dy - (c1y - p2y) * dx);
+    float d2 = fabs((c2x - p2x) * dy - (c2y - p2y) * dx);
+    float d = d1 + d2;
+
+    if (d * d < (thresholdx * (dx * dx) + thresholdy * (dy * dy))) {
+        // below thresh, draw line by adding endpoint
+        // TODO: make this not yuck
+        outputVertices.push();
+        Vertex* newVertex = &(outputVertices.editArray()[outputVertices.size()-1]);
+        Vertex::set(newVertex, p2x, p2y);
+    } else {
+        float p1c1x = (p1x + c1x) * 0.5f;
+        float p1c1y = (p1y + c1y) * 0.5f;
+        float p2c2x = (p2x + c2x) * 0.5f;
+        float p2c2y = (p2y + c2y) * 0.5f;
+
+        float c1c2x = (c1x + c2x) * 0.5f;
+        float c1c2y = (c1y + c2y) * 0.5f;
+
+        float p1c1c2x = (p1c1x + c1c2x) * 0.5f;
+        float p1c1c2y = (p1c1y + c1c2y) * 0.5f;
+
+        float p2c1c2x = (p2c2x + c1c2x) * 0.5f;
+        float p2c1c2y = (p2c2y + c1c2y) * 0.5f;
+
+        float mx = (p1c1c2x + p2c1c2x) * 0.5f;
+        float my = (p1c1c2y + p2c1c2y) * 0.5f;
+
+        recursiveCubicBezierVertices(
+                p1x, p1y, p1c1x, p1c1y,
+                mx, my, p1c1c2x, p1c1c2y,
+                thresholdx, thresholdy,
+                outputVertices);
+        recursiveCubicBezierVertices(
+                mx, my, p2c1c2x, p2c1c2y,
+                p2x, p2y, p2c2x, p2c2y,
+                thresholdx, thresholdy,
+                outputVertices);
+    }
+}
+
+void PathRenderer::recursiveQuadraticBezierVertices(
+        float ax, float ay,
+        float bx, float by,
+        float cx, float cy,
+        float thresholdx, float thresholdy, Vector<Vertex> &outputVertices) {
+    float dx = bx - ax;
+    float dy = by - ay;
+    float d = (cx - bx) * dy - (cy - by) * dx;
+
+    if (d * d < (thresholdx * (dx * dx) + thresholdy * (dy * dy))) {
+        // below thresh, draw line by adding endpoint
+        // TODO: make this not yuck
+        outputVertices.push();
+        Vertex* newVertex = &(outputVertices.editArray()[outputVertices.size()-1]);
+        Vertex::set(newVertex, bx, by);
+    } else {
+        float acx = (ax + cx) * 0.5f;
+        float bcx = (bx + cx) * 0.5f;
+        float acy = (ay + cy) * 0.5f;
+        float bcy = (by + cy) * 0.5f;
+
+        // midpoint
+        float mx = (acx + bcx) * 0.5f;
+        float my = (acy + bcy) * 0.5f;
+
+        recursiveQuadraticBezierVertices(ax, ay, mx, my, acx, acy,
+                thresholdx, thresholdy, outputVertices);
+        recursiveQuadraticBezierVertices(mx, my, bx, by, bcx, bcy,
+                thresholdx, thresholdy, outputVertices);
+    }
+}
+
+}; // namespace uirenderer
+}; // namespace android
diff --git a/libs/hwui/PathRenderer.h b/libs/hwui/PathRenderer.h
new file mode 100644
index 0000000..1354f16
--- /dev/null
+++ b/libs/hwui/PathRenderer.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2012 The Android Open Source 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.
+ */
+
+#ifndef ANDROID_HWUI_PATH_RENDERER_H
+#define ANDROID_HWUI_PATH_RENDERER_H
+
+#include <utils/Vector.h>
+
+#include "Vertex.h"
+
+namespace android {
+namespace uirenderer {
+
+class Matrix4;
+typedef Matrix4 mat4;
+
+class VertexBuffer {
+public:
+    VertexBuffer():
+        mBuffer(0),
+        mSize(0),
+        mCleanupMethod(0)
+    {}
+
+    ~VertexBuffer()
+    {
+        if (mCleanupMethod)
+            mCleanupMethod(mBuffer);
+    }
+
+    template <class TYPE>
+    TYPE* alloc(int size)
+    {
+        mSize = size;
+        mBuffer = (void*)new TYPE[size];
+        mCleanupMethod = &(cleanup<TYPE>);
+
+        return (TYPE*)mBuffer;
+    }
+
+    void* getBuffer() { return mBuffer; }
+    unsigned int getSize() { return mSize; }
+
+private:
+    template <class TYPE>
+    static void cleanup(void* buffer)
+    {
+        delete[] (TYPE*)buffer;
+    }
+
+    void* mBuffer;
+    unsigned int mSize;
+    void (*mCleanupMethod)(void*);
+};
+
+class PathRenderer {
+public:
+    static void computeInverseScales(
+        const mat4 *transform, float &inverseScaleX, float& inverseScaleY);
+
+    static void convexPathFillVertices(
+        const SkPath &path, const mat4 *transform,
+        VertexBuffer &vertexBuffer, bool isAA);
+
+private:
+    static void convexPathVertices(
+        const SkPath &path,
+        float thresholdx, float thresholdy,
+        Vector<Vertex> &outputVertices);
+
+/*
+  endpoints a & b,
+  control c
+ */
+    static void recursiveQuadraticBezierVertices(
+        float ax, float ay,
+        float bx, float by,
+        float cx, float cy,
+        float thresholdx, float thresholdy,
+        Vector<Vertex> &outputVertices);
+
+/*
+  endpoints p1, p2
+  control c1, c2
+ */
+    static void recursiveCubicBezierVertices(
+        float p1x, float p1y,
+        float c1x, float c1y,
+        float p2x, float p2y,
+        float c2x, float c2y,
+        float thresholdx, float thresholdy,
+        Vector<Vertex> &outputVertices);
+};
+
+}; // namespace uirenderer
+}; // namespace android
+
+#endif // ANDROID_HWUI_PATH_RENDERER_H
diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h
index a821a9c..b1cb446 100644
--- a/libs/hwui/Program.h
+++ b/libs/hwui/Program.h
@@ -81,7 +81,7 @@
 
 #define PROGRAM_IS_SIMPLE_GRADIENT 41
 
-#define PROGRAM_IS_AA_RECT_SHIFT 42
+#define PROGRAM_IS_VERTEX_SHAPE_SHIFT 42
 
 ///////////////////////////////////////////////////////////////////////////////
 // Types
@@ -130,7 +130,7 @@
     bool isBitmapNpot;
 
     bool isAA;
-    bool isAARect;
+    bool isVertexShape;
 
     bool hasGradient;
     Gradient gradientType;
@@ -168,7 +168,7 @@
         hasTextureTransform = false;
 
         isAA = false;
-        isAARect = false;
+        isVertexShape = false;
 
         modulate = false;
 
@@ -263,7 +263,7 @@
         if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT;
         if (hasGammaCorrection) key |= programid(0x1) << PROGRAM_HAS_GAMMA_CORRECTION;
         if (isSimpleGradient) key |= programid(0x1) << PROGRAM_IS_SIMPLE_GRADIENT;
-        if (isAARect) key |= programid(0x1) << PROGRAM_IS_AA_RECT_SHIFT;
+        if (isVertexShape) key |= programid(0x1) << PROGRAM_IS_VERTEX_SHAPE_SHIFT;
         return key;
     }
 
diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp
index 6baf448..de7afed 100644
--- a/libs/hwui/ProgramCache.cpp
+++ b/libs/hwui/ProgramCache.cpp
@@ -40,10 +40,10 @@
         "attribute vec4 position;\n";
 const char* gVS_Header_Attributes_TexCoords =
         "attribute vec2 texCoords;\n";
-const char* gVS_Header_Attributes_AAParameters =
+const char* gVS_Header_Attributes_AALineParameters =
         "attribute float vtxWidth;\n"
         "attribute float vtxLength;\n";
-const char* gVS_Header_Attributes_AARectParameters =
+const char* gVS_Header_Attributes_AAVertexShapeParameters =
         "attribute float vtxAlpha;\n";
 const char* gVS_Header_Uniforms_TextureTransform =
         "uniform mat4 mainTextureTransform;\n";
@@ -64,10 +64,10 @@
         "uniform mediump vec2 textureDimension;\n";
 const char* gVS_Header_Varyings_HasTexture =
         "varying vec2 outTexCoords;\n";
-const char* gVS_Header_Varyings_IsAA =
+const char* gVS_Header_Varyings_IsAALine =
         "varying float widthProportion;\n"
         "varying float lengthProportion;\n";
-const char* gVS_Header_Varyings_IsAARect =
+const char* gVS_Header_Varyings_IsAAVertexShape =
         "varying float alpha;\n";
 const char* gVS_Header_Varyings_HasBitmap =
         "varying highp vec2 outBitmapTexCoords;\n";
@@ -113,10 +113,10 @@
         "    gl_Position = transform * position;\n";
 const char* gVS_Main_PointSize =
         "    gl_PointSize = pointSize;\n";
-const char* gVS_Main_AA =
+const char* gVS_Main_AALine =
         "    widthProportion = vtxWidth;\n"
         "    lengthProportion = vtxLength;\n";
-const char* gVS_Main_AARect =
+const char* gVS_Main_AAVertexShape =
         "    alpha = vtxAlpha;\n";
 const char* gVS_Footer =
         "}\n\n";
@@ -133,7 +133,7 @@
         "precision mediump float;\n\n";
 const char* gFS_Uniforms_Color =
         "uniform vec4 color;\n";
-const char* gFS_Uniforms_AA =
+const char* gFS_Uniforms_AALine =
         "uniform float boundaryWidth;\n"
         "uniform float boundaryLength;\n";
 const char* gFS_Header_Uniforms_PointHasBitmap =
@@ -243,10 +243,10 @@
         "    fragColor = color;\n";
 const char* gFS_Main_ModulateColor =
         "    fragColor *= color.a;\n";
-const char* gFS_Main_AccountForAA =
+const char* gFS_Main_AccountForAALine =
         "    fragColor *= (1.0 - smoothstep(boundaryWidth, 0.5, abs(0.5 - widthProportion)))\n"
         "               * (1.0 - smoothstep(boundaryLength, 0.5, abs(0.5 - lengthProportion)));\n";
-const char* gFS_Main_AccountForAARect =
+const char* gFS_Main_AccountForAAVertexShape =
         "    fragColor *= alpha;\n";
 
 const char* gFS_Main_FetchTexture[2] = {
@@ -456,10 +456,12 @@
     if (description.hasTexture || description.hasExternalTexture) {
         shader.append(gVS_Header_Attributes_TexCoords);
     }
-    if (description.isAARect) {
-        shader.append(gVS_Header_Attributes_AARectParameters);
-    } else if (description.isAA) {
-        shader.append(gVS_Header_Attributes_AAParameters);
+    if (description.isAA) {
+        if (description.isVertexShape) {
+            shader.append(gVS_Header_Attributes_AAVertexShapeParameters);
+        } else {
+            shader.append(gVS_Header_Attributes_AALineParameters);
+        }
     }
     // Uniforms
     shader.append(gVS_Header_Uniforms);
@@ -479,10 +481,12 @@
     if (description.hasTexture || description.hasExternalTexture) {
         shader.append(gVS_Header_Varyings_HasTexture);
     }
-    if (description.isAARect) {
-        shader.append(gVS_Header_Varyings_IsAARect);
-    } else if (description.isAA) {
-        shader.append(gVS_Header_Varyings_IsAA);
+    if (description.isAA) {
+        if (description.isVertexShape) {
+            shader.append(gVS_Header_Varyings_IsAAVertexShape);
+        } else {
+            shader.append(gVS_Header_Varyings_IsAALine);
+        }
     }
     if (description.hasGradient) {
         shader.append(gVS_Header_Varyings_HasGradient[gradientIndex(description)]);
@@ -500,10 +504,12 @@
         } else if (description.hasTexture || description.hasExternalTexture) {
             shader.append(gVS_Main_OutTexCoords);
         }
-        if (description.isAARect) {
-            shader.append(gVS_Main_AARect);
-        } else if (description.isAA) {
-            shader.append(gVS_Main_AA);
+        if (description.isAA) {
+            if (description.isVertexShape) {
+                shader.append(gVS_Main_AAVertexShape);
+            } else {
+                shader.append(gVS_Main_AALine);
+            }
         }
         if (description.hasGradient) {
             shader.append(gVS_Main_OutGradient[gradientIndex(description)]);
@@ -552,10 +558,12 @@
     if (description.hasTexture || description.hasExternalTexture) {
         shader.append(gVS_Header_Varyings_HasTexture);
     }
-    if (description.isAARect) {
-        shader.append(gVS_Header_Varyings_IsAARect);
-    } else if (description.isAA) {
-        shader.append(gVS_Header_Varyings_IsAA);
+    if (description.isAA) {
+        if (description.isVertexShape) {
+            shader.append(gVS_Header_Varyings_IsAAVertexShape);
+        } else {
+            shader.append(gVS_Header_Varyings_IsAALine);
+        }
     }
     if (description.hasGradient) {
         shader.append(gVS_Header_Varyings_HasGradient[gradientIndex(description)]);
@@ -580,8 +588,8 @@
     } else if (description.hasExternalTexture) {
         shader.append(gFS_Uniforms_ExternalTextureSampler);
     }
-    if (description.isAA) {
-        shader.append(gFS_Uniforms_AA);
+    if (description.isAA && !description.isVertexShape) {
+        shader.append(gFS_Uniforms_AALine);
     }
     if (description.hasGradient) {
         shader.append(gFS_Uniforms_GradientSampler[gradientIndex(description)]);
@@ -596,7 +604,7 @@
     // Optimization for common cases
     if (!description.isAA && !blendFramebuffer &&
             description.colorOp == ProgramDescription::kColorNone &&
-            !description.isPoint && !description.isAARect) {
+            !description.isPoint && !description.isVertexShape) {
         bool fast = false;
 
         const bool noShader = !description.hasGradient && !description.hasBitmap;
@@ -730,10 +738,12 @@
         // Apply the color op if needed
         shader.append(gFS_Main_ApplyColorOp[description.colorOp]);
 
-        if (description.isAARect) {
-            shader.append(gFS_Main_AccountForAARect);
-        } else if (description.isAA) {
-            shader.append(gFS_Main_AccountForAA);
+        if (description.isAA) {
+            if (description.isVertexShape) {
+                shader.append(gFS_Main_AccountForAAVertexShape);
+            } else {
+                shader.append(gFS_Main_AccountForAALine);
+            }
         }
 
         // Output the fragment
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 5b3350a..cee8da8 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -457,6 +457,7 @@
         updateStreamVolumeAlias(false /*updateVolumes*/);
         createStreamStates();
 
+        mSafeMediaVolumeEnabled = new Boolean(true);
         synchronized (mSafeMediaVolumeEnabled) {
             enforceSafeMediaVolume();
         }
@@ -1715,7 +1716,9 @@
         checkAllAliasStreamVolumes();
 
         synchronized (mSafeMediaVolumeEnabled) {
-            enforceSafeMediaVolume();
+            if (mSafeMediaVolumeEnabled) {
+                enforceSafeMediaVolume();
+            }
         }
 
         // apply new ringer mode
@@ -2184,11 +2187,14 @@
                     sendMsg(mAudioHandler,
                             MSG_CHECK_MUSIC_ACTIVE,
                             SENDMSG_REPLACE,
-                            device,
+                            0,
                             0,
                             null,
                             MUSIC_ACTIVE_POLL_PERIOD_MS);
-                    if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0)) {
+                    int index = mStreamStates[AudioSystem.STREAM_MUSIC].getIndex(device,
+                                                                            false /*lastAudible*/);
+                    if (AudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0) &&
+                            (index > mSafeMediaVolumeIndex)) {
                         // Approximate cumulative active music time
                         mMusicActiveMs += MUSIC_ACTIVE_POLL_PERIOD_MS;
                         if (mMusicActiveMs > UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX) {
@@ -2461,14 +2467,6 @@
     public void setWiredDeviceConnectionState(int device, int state, String name) {
         synchronized (mConnectedDevices) {
             int delay = checkSendBecomingNoisyIntent(device, state);
-            if ((device & mSafeMediaVolumeDevices) != 0) {
-                setSafeMediaVolumeEnabled(state != 0);
-                // insert delay to allow new volume to apply before switching to headphones
-                if ((delay < SAFE_VOLUME_DELAY_MS) && (state != 0)) {
-                    delay = SAFE_VOLUME_DELAY_MS;
-                }
-            }
-
             queueMsgUnderWakeLock(mAudioHandler,
                     MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
                     device,
@@ -3519,9 +3517,20 @@
             }
             boolean isUsb = ((device & AudioSystem.DEVICE_OUT_ALL_USB) != 0);
             handleDeviceConnection((state == 1), device, (isUsb ? name : ""));
-            if ((state != 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
-                    (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE))) {
-                setBluetoothA2dpOnInt(false);
+            if (state != 0) {
+                if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
+                    (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE)) {
+                    setBluetoothA2dpOnInt(false);
+                }
+                if ((device & mSafeMediaVolumeDevices) != 0) {
+                    sendMsg(mAudioHandler,
+                            MSG_CHECK_MUSIC_ACTIVE,
+                            SENDMSG_REPLACE,
+                            0,
+                            0,
+                            null,
+                            MUSIC_ACTIVE_POLL_PERIOD_MS);
+                }
             }
             if (!isUsb) {
                 sendDeviceConnectionIntent(device, state, name);
@@ -5528,7 +5537,7 @@
     // mSafeMediaVolumeEnabled indicates whether the media volume is limited over headphones.
     // It is true by default when headphones or a headset are inserted and can be overriden by
     // calling AudioService.disableSafeMediaVolume() (when user opts out).
-    private Boolean mSafeMediaVolumeEnabled = new Boolean(false);
+    private Boolean mSafeMediaVolumeEnabled;
     // mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property
     private final int mSafeMediaVolumeIndex;
     // mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced,
@@ -5540,7 +5549,6 @@
     private int mMusicActiveMs;
     private static final int UNSAFE_VOLUME_MUSIC_ACTIVE_MS_MAX = (20 * 3600 * 1000); // 20 hours
     private static final int MUSIC_ACTIVE_POLL_PERIOD_MS = 60000;  // 1 minute polling interval
-    private static final int SAFE_VOLUME_DELAY_MS = 500;  // 500ms before switching to headphones
 
     private void setSafeMediaVolumeEnabled(boolean on) {
         synchronized (mSafeMediaVolumeEnabled) {
diff --git a/packages/SystemUI/res/layout/quick_settings.xml b/packages/SystemUI/res/layout/quick_settings.xml
index 2dd3b9f..da4b133 100644
--- a/packages/SystemUI/res/layout/quick_settings.xml
+++ b/packages/SystemUI/res/layout/quick_settings.xml
@@ -29,9 +29,6 @@
           android:id="@+id/quick_settings_container"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:paddingBottom="@dimen/quick_settings_container_padding"
-          android:paddingLeft="@dimen/quick_settings_container_padding"
-          android:paddingRight="@dimen/quick_settings_container_padding"
           android:animateLayoutChanges="true"
           android:columnCount="@integer/quick_settings_num_columns"
           />
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 5f46e96..5a5769b 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -17,16 +17,13 @@
 <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:padding="16dp">
+    style="@style/BrightnessDialogContainer">
 
     <ImageView
         android:id="@+id/brightness_icon"
-        style="@style/SystemBarPanelSettingsIcon"
         android:layout_gravity="center_vertical"
         android:paddingRight="10dp"
-        android:src="@drawable/ic_sysbar_brightness"
+        android:src="@drawable/ic_qs_brightness_auto_off"
         />
     <com.android.systemui.statusbar.policy.ToggleSlider
         android:id="@+id/brightness_slider"
diff --git a/packages/SystemUI/res/layout/quick_settings_tile_bugreport.xml b/packages/SystemUI/res/layout/quick_settings_tile_bugreport.xml
new file mode 100644
index 0000000..0b6a614
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_tile_bugreport.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source 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.
+-->
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/TextAppearance.QuickSettings.TileView"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_gravity="center"
+    android:gravity="center"
+    android:drawableTop="@*android:drawable/stat_sys_adb"
+    android:text="@*android:string/bugreport_title"
+    />
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index b462c00..da766f5 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -60,7 +60,7 @@
     <string name="always_use_accessory" msgid="1210954576979621596">"Gebruik by verstek vir hierdie USB-toebehoorsel"</string>
     <string name="usb_debugging_title" msgid="4513918393387141949">"Laat USB-ontfouting toe?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Die rekenaar se RSA-sleutel-vingerafdruk is:"\n"<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
-    <string name="usb_debugging_always" msgid="303335496705863070">"Altyd laat toe uit hierdie rekenaar"</string>
+    <string name="usb_debugging_always" msgid="303335496705863070">"Laat altyd toe van hierdie rekenaar af"</string>
     <string name="compat_mode_on" msgid="6623839244840638213">"Zoem om skerm te vul"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Strek om skerm te vul"</string>
     <string name="compat_mode_help_header" msgid="7969493989397529910">"Versoenbaarheidszoem"</string>
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Geen Wi-Fi-skerm-verbinding nie"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skandeer"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Ontkoppel"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi-skerm"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Beskikbaar"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Om te koppel"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Gekoppel"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index f33b469..2abd458 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"ህልሞችን ጀምር"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"የአውሮፕላን ሁነታ"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"ባትሪ በመሙላት ላይ፣ <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ባትሪ ሞልቷል።"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ብሉቱዝ"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ብሉቱዝ (<xliff:g id="NUMBER">%d</xliff:g> መሣሪያዎች)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ብሩህነት"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"ራስ-አዙር"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"አዙሪት ተቆልፏል"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"የግቤት ዘዴ"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"በስራ ላይ ያለው አካባቢ"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"የሚዲያ መሣሪያ"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"ምንም የWifi ማሳያ ግንኙነት የለም"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ብሩህነት"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ራስ-ሰር"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"ቃኝ"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"አለያይ"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"የWifi ማሳያ"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"የሚገኝ"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"በመገናኘት ላይ"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"ተገናኝቷል"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index bae41b0..3d19afe 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"بدء Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"وضع الطائرة"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"جارٍ الشحن، <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"تم الشحن"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"بلوتوث"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"بلوتوث (<xliff:g id="NUMBER">%d</xliff:g> من الأجهزة)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"السطوع"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"تدوير تلقائي"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"تم قفل التدوير"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"أسلوب الإدخال"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"الموقع المستخدم"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"جهاز الوسائط"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"لا يتوفر اتصال بشاشة Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"السطوع"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"تلقائي"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"فحص"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"قطع الاتصال"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"شاشة Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"متوفرة"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"جارٍ الاتصال"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"متصلة"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index c448ba2..50bda312 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Няма падключэння да дысплея Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркасць"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АЎТА"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Сканiраваць"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Адключыцца"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Дысплей Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Даступна"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Падключэнне"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Падключана"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index d13ed1a..c11ba77 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Няма връзка с дисплея през WiFi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркост"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТ."</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Сканиране"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Изключване"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Дисплей през WiFi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Налице"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Установява се връзка"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Установена е връзка"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index c23b23a..154c5c2 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"No hi ha cap connexió de pantalla Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillantor"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÀTICA"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Explora"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Desconnecta"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Pantalla Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponible"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"S\'està connectant"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Connectada"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 25002ca..e56b591 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Žádné připojení k displeji přes Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Vyhledat"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Odpojit"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Displej přes Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Dostupné"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Připojování"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Připojeno"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 76a070c..7fb2d26 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Start Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flytilstand"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Oplader, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Opladet"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> enheder)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Lysstyrke"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automatisk rotation"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotation er låst"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Inputmetode"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Placering i brug"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Medieenhed"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Ingen forbindelse til Wi-Fi-skærm"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scan"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Afbryd forbindelsen"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi-skærm"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Tilgængelig"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Tilslutter"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Tilsluttet"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index fd1ef1e..6916d56 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -153,18 +153,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Träume starten"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Flugmodus"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Akku wird aufgeladen (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Aufgeladen"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Geräte)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helligkeit"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automatisch drehen"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Drehung gesperrt"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Eingabemethode"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Verwendeter Standort"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Mediengerät"</string>
@@ -179,10 +174,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Keine Verbindung zur WLAN-Anzeige"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helligkeit"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scannen"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Trennen"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"WLAN-Anzeige"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Verfügbar"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Verbinden"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Verbunden"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index fd8be33..922d957 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -174,10 +174,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Δεν υπάρχει σύνδεση οθόνης Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Φωτεινότητα"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ΑΥΤΟΜΑΤΗ"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Σάρωση"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Αποσύνδεση"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Οθόνη Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Διαθέσιμη"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Σύνδεση"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Έχει συνδεθεί"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 8ff3b0e..8670d49 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -172,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"No Wifi Display Connection"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scan"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Disconnect"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wifi Display"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Available"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Connecting"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Connected"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index daf2119..1c3c3c3 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Sin conexión a pantalla de Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÁTICO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Explorar"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Desconectar"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Pantalla Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponible"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Conectando"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Conectado"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 3a1b781..e7c4b3e 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Iniciar Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo avión"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Cargando (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Cargada"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivos)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brillo"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Girar automáticamente"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotación bloqueada"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de entrada"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Ubicación en uso"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo multimedia"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Sin conexión a pantalla Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brillo"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Escanear"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Desconectar"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Pantalla Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponible"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Conectando..."</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Conectada"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index a545b46..7c83bf7 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"WiFi-ekraani ühendus puudub"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Heledus"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAATNE"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skannimine"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Katkesta ühendus"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"WiFi-ekraan"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Saadaval"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Ühendamine"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Ühendatud"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 67687b6..bd6e194 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"اتصال صفحه نمایش Wifi وجود ندارد"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"روشنایی"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"خودکار"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"اسکن"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"قطع اتصال"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"صفحه نمایش Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"در دسترس"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"در حال اتصال"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"متصل"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 248abc7..727b42f 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Aloita unelmointi"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lentokonetila"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Ladataan (<xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Täynnä"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> laitetta)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Kirkkaus"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automaattinen kääntö"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Kääntö lukittu"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Syöttötapa"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Sijainti käytössä"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Medialaite"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Ei yhteyttä wifi-näyttöön"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kirkkaus"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Etsi"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Katkaise yhteys"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wifi-näyttö"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Käytettävissä"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Yhdistetään"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Yhdistetty"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index cd2aef8..b87f18c 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Aucune connexion à un écran Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosité"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATIQUE"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Rechercher"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Déconnecter"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Écran Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponible"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Connexion en cours…"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Connecté"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index e0279be..81bc85a 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"कोई Wifi डिस्प्ले कनेक्शन नहीं"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"चमक"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"स्वत:"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"स्कैन करें"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"डिस्कनेक्ट करें"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wifi डिस्प्ले"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"उपलब्ध"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"कनेक्ट हो रहा है"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"कनेक्ट किया गया"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 79b2952..21dabce 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Počni sanjati"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Način rada u zrakoplovu"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Puni se, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Napunjena"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (broj uređaja: <xliff:g id="NUMBER">%d</xliff:g>)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svjetlina"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automatska rotacija"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotacija zaključana"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Način unosa"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Lokacija u uporabi"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Medijski uređaj"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nema veze s Wifi zaslonom"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svjetlina"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATSKI"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skeniraj"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Isključi"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"WiFi zaslon"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Dostupan"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Povezivanje"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Povezan"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 3d2c771..58764df 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nincs kapcsolat Wi-Fi kijelzővel"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Fényerő"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"automatikus"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Keresés"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Szétkapcsol"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi kijelző"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Rendelkezésre álló"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Kapcsolódás"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Kapcsolatban"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 8909c3c..1ebb0bd 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Tidak Ada Koneksi Tampilan Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATIS"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Pindai"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Putuskan"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Tampilan Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Tersedia"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Menghubungkan"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Terhubung"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 6d7f451..cb086c7 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -153,18 +153,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Avvia Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modalità aereo"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"In carica (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Carica"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> dispositivi)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosità"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rotazione automatica"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotazione bloccata"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Metodo di immissione"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Posizione in uso"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo multimediale"</string>
@@ -179,10 +174,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nessun collegamento a schermi Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminosità"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scansione"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Disconnetti"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Schermo Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponibile"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Collegamento"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Collegato"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index 506f6c5..7a859cd 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"הפעל את Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"מצב טיסה"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"טוען (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"מלאה"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth ‏(<xliff:g id="NUMBER">%d</xliff:g> מכשירים)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"בהירות"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"סיבוב אוטומטי"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"סיבוב נעול"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"שיטת קלט"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"מיקום בשימוש"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"מכשיר מדיה"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"אין חיבור תצוגת Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"בהירות"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"אוטומטי"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"סרוק"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"נתק"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"תצוגת Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"זמין"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"מתחבר"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"מחובר"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 8d6f69e..003a333 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Wi-Fiディスプレイ接続なし"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"画面の明るさ"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"スキャン"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"切断"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fiディスプレイ"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"使用可能"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"接続中"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"接続"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index dad038e..e7e55c8 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Wi-Fi 디스플레이가 연결되지 않음"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"밝기"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"자동"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"검색"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"연결 해제"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi 디스플레이"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"사용 가능"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"연결 중"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"연결됨"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-land/styles.xml b/packages/SystemUI/res/values-land/styles.xml
new file mode 100644
index 0000000..8919198
--- /dev/null
+++ b/packages/SystemUI/res/values-land/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer">
+        <item name="android:layout_width">360dp</item>
+    </style>
+</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index ba989a5..494db0c 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Paleisti vizijas"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Lėktuvo režimas"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Įkraunama, <xliff:g id="NUMBER">%d</xliff:g> <xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Įkrauta"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"„Bluetooth“ (<xliff:g id="NUMBER">%d</xliff:g> įreng.)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Skaistis"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Automatiškai sukti"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Sukimas užrakintas"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Įvesties metodas"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Naudojama vieta"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Medijos įrenginys"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nėra „Wi-Fi“ pateikties ryšio"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Skaistis"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATINIS"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Nuskaityti"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Atjungti"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"„Wi-Fi“ pateiktis"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Pasiekiama"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Jungiama"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Prijungta"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index f931d0e..47e917d 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nav Wi-Fi displeja savienojuma"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Spilgtums"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMĀTISKI"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Meklēt"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Atvienot"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi displejs"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Pieejams"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Notiek savienojuma izveide"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Savienots"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index 9c02c08..f79ab5c 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Tiada Sambungan Paparan Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Kecerahan"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Imbas"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Nyahsambung"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Paparan Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Ada"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Menyambung"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Bersambung"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 0baf48b..2670832 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Ingen tilkobling for Wi-Fi-skjermer"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Lysstyrke"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skann"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Koble fra"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi-skjerm"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Tilgjengelig"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Kobler til"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Tilkoblet"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 239ef18..b3d36fa 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -172,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Geen wifi-displayverbinding"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Helderheid"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATISCH"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scannen"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Verbinding verbreken"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wifi-display"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Beschikbaar"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Verbinding maken"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Verbonden"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 6385e33..d07c0b68 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Zacznij śnić"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Tryb samolotowy"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Ładowanie (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Naładowana"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (urządzenia: <xliff:g id="NUMBER">%d</xliff:g>)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Jasność"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Autoobracanie"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Obracanie jest zablokowane"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Metoda wprowadzania"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Lokalizacja w użyciu"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Urządzenie multimedialne"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Brak połączenia z wyświetlaczem Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jasność"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATYCZNA"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skanuj"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Rozłącz"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wyświetlacz Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Dostępny"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Łączenie"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Połączony"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index fd8a414..5bbbd99 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Iniciar sonhos"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modo de avião"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"A carregar, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Carregada"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Dispositivos)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brilho"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Rodar Automaticamente"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Rotação Bloqueada"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Método de Introdução"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Localização em utilização"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Dispositivo multimédia"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Sem Ligação ao Visor Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMÁTICO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Procurar"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Desligar"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Visor Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponível"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"A ligar"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Ligado"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index d3bdfed..5766db6 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Sem conexão Wi-Fi Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brilho"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Verificar"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Desconectar"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi Display"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponível"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Conectando"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Conectado"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-rm/strings.xml b/packages/SystemUI/res/values-rm/strings.xml
index ffca1ab..9838d2a 100644
--- a/packages/SystemUI/res/values-rm/strings.xml
+++ b/packages/SystemUI/res/values-rm/strings.xml
@@ -314,16 +314,4 @@
     <skip />
     <!-- no translation found for quick_settings_brightness_dialog_auto_brightness_label (5064982743784071218) -->
     <skip />
-    <!-- no translation found for wifi_display_scan (8453135922233546097) -->
-    <skip />
-    <!-- no translation found for wifi_display_disconnect (5450214362789378584) -->
-    <skip />
-    <!-- no translation found for wifi_display_dialog_title (2817993038700218900) -->
-    <skip />
-    <!-- no translation found for wifi_display_state_available (980373281442607096) -->
-    <skip />
-    <!-- no translation found for wifi_display_state_connecting (1677010908036241940) -->
-    <skip />
-    <!-- no translation found for wifi_display_state_connected (9154375061719151149) -->
-    <skip />
 </resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 26d5745..0132c44 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Nu există conexiune pentru afişajul Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Luminozitate"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMAT"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Scanaţi"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Deconectaţi-vă"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Afişaj Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Disponibil"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Se conectează"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Conectat"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 7c063cb..57ed927 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -153,18 +153,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Включить заставку"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим полета"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Идет зарядка (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Заряжено"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Устройства Bluetooth (<xliff:g id="NUMBER">%d</xliff:g>)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Яркость"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Автоповорот"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Поворот экрана заблокирован"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Способ ввода"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Текущее местоположение"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медиаустройство"</string>
@@ -179,10 +174,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Экран не подключен"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яркость"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТОНАСТРОЙКА"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Искать"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Отключить"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Подключенный экран"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Доступен"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Подключение…"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Подключен"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 9bd131d..f9c3bbe 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -179,10 +179,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Žiadne pripojenie k displeju cez sieť Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Jas"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTOMATICKY"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Vyhľadať"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Odpojiť"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Displej cez sieť Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"K dispozícii"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Pripájanie"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Pripojené"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 4f5a0cb..7c1b06b 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Začni sanje"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Način za letalo"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Polnjenje, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Napolnjeno"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (št. naprav: <xliff:g id="NUMBER">%d</xliff:g>)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Svetlost"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Samodejno vrtenje"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Zaklenjeno vrtenje"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Način vnosa"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Mesto uporabe"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Predstavnostna naprava"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Ni povezav z zaslonom Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Svetlost"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"SAMODEJNO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Išči"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Prek. povezavo"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Zaslon Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Na voljo"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Vzpostavljanje povezave"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Povezava vzpostavljena"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index d896e5b..b13255d 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Покрени Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Режим рада у авиону"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Пуњење, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Напуњено"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> уређаја)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Осветљеност"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Аутоматско ротирање"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Ротирање је закључано"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Метод уноса"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Локација која се користи"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Медијски уређај"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Нема везе са Wi-Fi екраном"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Осветљеност"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АУТОМАТСКА"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Скенирај"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Прекини везу"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi екран"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Доступан"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Повезивање"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Повезан"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 086c49f..779c870 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -172,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Ingen anslutning till Wi-Fi-skärm"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ljusstyrka"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skanna"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Koppla från"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wi-Fi-skärm"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Tillgänglig"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Ansluter"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Ansluten"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 04c8db3..97b25e2 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -58,7 +58,7 @@
     <string name="always_use_accessory" msgid="1210954576979621596">"Tumia kama chaguo-msingi ya kifuasi hiki cha USB"</string>
     <string name="usb_debugging_title" msgid="4513918393387141949">"Ruhusu utatuaji wa USB?"</string>
     <string name="usb_debugging_message" msgid="2220143855912376496">"Alama ya kidole ya kitufe cha RSA ya kompyuta ni:"\n"<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
-    <string name="usb_debugging_always" msgid="303335496705863070">"Kila wakati ruhusu kutoka kwenye kompyuta hii"</string>
+    <string name="usb_debugging_always" msgid="303335496705863070">"Ruhusu kutoka kwenye kompyuta hii kila wakati"</string>
     <string name="compat_mode_on" msgid="6623839244840638213">"Kuza ili kujaza skrini"</string>
     <string name="compat_mode_off" msgid="4434467572461327898">"Tanua ili kujaza skrini"</string>
     <string name="compat_mode_help_header" msgid="7969493989397529910">"Kukuza kwa Utangamanifu"</string>
@@ -149,19 +149,14 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Anza ndoto"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Modi ya ndege"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Inachaji, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Imechajiwa"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (Vifaa <xliff:g id="NUMBER">%d</xliff:g>)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Ung\'avu"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
-    <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu Ingizo"</string>
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Zungusha Otomatiki"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Mzunguko Umefungwa"</string>
+    <string name="quick_settings_ime_label" msgid="7073463064369468429">"Mbinu ya uingizaji"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Eneo linalotumika"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Kifaa cha midia"</string>
     <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
@@ -175,10 +170,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Hakuna Muunganisho wa Onyesho la Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ung\'avu"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"KIOTOMATIKI"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Changanua"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Kata muunganisho"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Onyesho la Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Inapatikana"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Inaunganisha"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Umeunganishwa"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-sw600dp/styles.xml b/packages/SystemUI/res/values-sw600dp/styles.xml
new file mode 100644
index 0000000..fc1cd88
--- /dev/null
+++ b/packages/SystemUI/res/values-sw600dp/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2006 The Android Open Source 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+    <style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer">
+        <item name="android:layout_width">560dp</item>
+    </style>
+</resources>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index f15b2c7..72c4eee 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"เริ่ม Dreams"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"โหมดใช้งานบนเครื่องบิน"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"กำลังชาร์จ, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"ชาร์จแล้ว"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"บลูทูธ"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"บลูทูธ (<xliff:g id="NUMBER">%d</xliff:g> อุปกรณ์)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ความสว่าง"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"หมุนอัตโนมัติ"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"ล็อกการหมุนแล้ว"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"วิธีป้อนข้อมูล"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"สถานที่ที่ใช้งาน"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"อุปกรณ์สื่อ"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"ไม่มีการเชื่อมต่อการแสดงผลด้วย WiFi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ความสว่าง"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"อัตโนมัติ"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"สแกน"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"เลิกต่อ"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"การแสดงผลด้วย WiFi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"มีอยู่"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"กำลังเชื่อมต่อ"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"เชื่อมต่อแล้ว"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index ddf8ec5..131d0b9 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Simulan panaginip"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Airplane mode"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Nagcha-charge, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Na-charge"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> (na) Device)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Brightness"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"I-auto Rotate"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Naka-lock ang Pag-rotate"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Pamamaraan ng Pag-input"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Lokasyong ginagamit"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Device ng media"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Walang Koneksyon sa Wifi Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Brightness"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"AUTO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"I-scan"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Idiskonekta"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Wifi Display"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Available"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Kumukonekta"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Nakakonekta"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 66194b0..ce6fb0c 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -177,10 +177,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Kablosuz Ekran Bağlantısı Yok"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Parlaklık"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OTOMATİK"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Tara"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Bağlantıyı kes"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Kablosuz Ekran"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Uygun"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Bağlanılıyor"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Bağlandı"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index b22c12d..1bf529f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -172,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Немає з’єднання з екраном Wi-Fi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Яскравість"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"АВТО"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Сканувати"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Від’єднати"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Екран Wi-Fi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Доступний"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Під’єднання"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Під’єднаний"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index ea0a35a..5f25602 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -151,18 +151,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"Bắt đầu giấc mơ"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"Chế độ trên máy bay"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"Đang sạc, <xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"Đã sạc"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> thiết bị)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Độ sáng"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"Tự động xoay"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"Khóa xoay"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"Phương thức nhập"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"Vị trí đang được sử dụng"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"Thiết bị phương tiện"</string>
@@ -177,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Không kết nối màn hình Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Độ sáng"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"TỰ ĐỘNG"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Quét"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Ngắt kết nối"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Màn hình Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Khả dụng"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Đang kết nối"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Đã kết nối"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index a408b2d..09637c8 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -150,39 +150,28 @@
     <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"屏幕会自动旋转。"</string>
     <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"屏幕锁定为横向模式。"</string>
     <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕锁定为纵向模式。"</string>
-    <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
-    <string name="start_dreams" msgid="870400522982252717">"启动 Dream"</string>
+    <string name="jelly_bean_dream_name" msgid="5992026543636816792">"果冻豆大乱舞"</string>
+    <string name="start_dreams" msgid="870400522982252717">"入梦"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飞行模式"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"正在充电 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"充电完成"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"蓝牙"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"蓝牙(<xliff:g id="NUMBER">%d</xliff:g> 台设备)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"自动旋转"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"已锁定旋转功能"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"输入法"</string>
-    <string name="quick_settings_location_label" msgid="3292451598267467545">"正在使用的位置"</string>
+    <string name="quick_settings_location_label" msgid="3292451598267467545">"位置信息"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒体设备"</string>
     <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
-    <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"只能使用紧急呼救"</string>
+    <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"只能拨打紧急呼救电话"</string>
     <string name="quick_settings_settings_label" msgid="5326556592578065401">"设置"</string>
     <string name="quick_settings_time_label" msgid="4635969182239736408">"时间"</string>
     <string name="quick_settings_user_label" msgid="5238995632130897840">"我"</string>
     <string name="quick_settings_wifi_label" msgid="4393429107095001520">"Wi-Fi"</string>
     <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"无网络"</string>
-    <string name="quick_settings_wifi_display_label" msgid="6653501376641018614">"W-Fi 显示"</string>
-    <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"没有 Wi-Fi 显示连接"</string>
+    <string name="quick_settings_wifi_display_label" msgid="6653501376641018614">"W-Fi 显示设备"</string>
+    <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"没有 Wi-Fi 显示设备连接"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自动"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"扫描"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"断开连接"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"W-Fi 显示"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"可用"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"正在连接"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"已连接"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 82f87ab..dffe46f 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -153,18 +153,13 @@
     <string name="jelly_bean_dream_name" msgid="5992026543636816792">"BeanFlinger"</string>
     <string name="start_dreams" msgid="870400522982252717">"啟動 Dream"</string>
     <string name="quick_settings_airplane_mode_label" msgid="5510520633448831350">"飛航模式"</string>
-    <!-- no translation found for quick_settings_battery_charging_label (490074774465309209) -->
-    <skip />
-    <!-- no translation found for quick_settings_battery_charged_label (8865413079414246081) -->
-    <skip />
+    <string name="quick_settings_battery_charging_label" msgid="490074774465309209">"充電中 (<xliff:g id="NUMBER">%d</xliff:g><xliff:g id="PERCENT">%%</xliff:g>)"</string>
+    <string name="quick_settings_battery_charged_label" msgid="8865413079414246081">"充電完成"</string>
     <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"藍牙"</string>
-    <!-- no translation found for quick_settings_bluetooth_multiple_devices_label (3912245565613684735) -->
-    <skip />
+    <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"藍牙 (<xliff:g id="NUMBER">%d</xliff:g> 個裝置)"</string>
     <string name="quick_settings_brightness_label" msgid="6968372297018755815">"亮度"</string>
-    <!-- no translation found for quick_settings_rotation_unlocked_label (336054930362580584) -->
-    <skip />
-    <!-- no translation found for quick_settings_rotation_locked_label (8058646447242565486) -->
-    <skip />
+    <string name="quick_settings_rotation_unlocked_label" msgid="336054930362580584">"自動旋轉"</string>
+    <string name="quick_settings_rotation_locked_label" msgid="8058646447242565486">"已鎖定螢幕旋轉功能"</string>
     <string name="quick_settings_ime_label" msgid="7073463064369468429">"輸入法"</string>
     <string name="quick_settings_location_label" msgid="3292451598267467545">"使用位置"</string>
     <string name="quick_settings_media_device_label" msgid="1302906836372603762">"媒體裝置"</string>
@@ -179,10 +174,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"未連接 WiFi Display"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"亮度"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"自動"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"掃描"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"中斷連線"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"WiFi Display"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"可以使用"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"連線中"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"已連線"</string>
 </resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index f7da7a9..bfaf8a0 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -172,10 +172,4 @@
     <string name="quick_settings_wifi_display_no_connection_label" msgid="6255615315258869136">"Alukho uxhumo lokubonisa le-Wifi"</string>
     <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"Ukugqama"</string>
     <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"OKUZENZAKALELAYO"</string>
-    <string name="wifi_display_scan" msgid="8453135922233546097">"Skena"</string>
-    <string name="wifi_display_disconnect" msgid="5450214362789378584">"Nqamula"</string>
-    <string name="wifi_display_dialog_title" msgid="2817993038700218900">"Ukubuka kwe-Wifi"</string>
-    <string name="wifi_display_state_available" msgid="980373281442607096">"Kuyatholakala"</string>
-    <string name="wifi_display_state_connecting" msgid="1677010908036241940">"Iyaxhuma"</string>
-    <string name="wifi_display_state_connected" msgid="9154375061719151149">"Ixhunyiwe"</string>
 </resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 1edc3fc..dddef6d 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -90,5 +90,9 @@
 
     <!-- Whether rotation lock shows up in quick settings or not -->
     <bool name="quick_settings_show_rotation_lock">false</bool>
+
+    <!-- Timeouts for brightness dialog to disappear -->
+    <integer name="quick_settings_brightness_dialog_short_timeout">2000</integer>
+    <integer name="quick_settings_brightness_dialog_long_timeout">4000</integer>
 </resources>
 
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 63ce2a9..e93e857 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -175,9 +175,6 @@
     <!-- The distance you can pull a notificaiton before it pops open -->
     <dimen name="one_finger_pop_limit">32dp</dimen>
 
-    <!-- The amount of padding around the QuickSettings tiles -->
-    <dimen name="quick_settings_container_padding">12dp</dimen>
-
     <!-- The fixed height of each tile -->
     <dimen name="quick_settings_cell_height">110dp</dimen>
 
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 4545706..e05c9a5 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -401,6 +401,9 @@
     <!-- Name of the launcher shortcut icon that allows dreams to be started immediately [CHAR LIMIT=20] -->
     <string name="start_dreams">Start dreams</string>
 
+    <!-- Textual description of Ethernet connections -->
+    <string name="ethernet_label">Ethernet</string>
+
     <!-- QuickSettings: Airplane mode [CHAR LIMIT=NONE] -->
     <string name="quick_settings_airplane_mode_label">Airplane mode</string>
     <!-- QuickSettings: Battery Charging [CHAR LIMIT=NONE] -->
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 738b41f..4a37f77 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -100,6 +100,15 @@
         <item name="android:textColor">#ff3a3b39</item>
     </style>
 
+    <style name="BaseBrightnessDialogContainer">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_marginLeft">8dp</item>
+        <item name="android:layout_marginRight">8dp</item>
+        <item name="android:padding">16dp</item>
+    </style>
+    <style name="BrightnessDialogContainer" parent="@style/BaseBrightnessDialogContainer" />
+
     <style name="Animation" />
 
     <style name="Animation.ShirtPocketPanel">
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 923cd93..ecb8fed 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -84,8 +84,8 @@
 
 public abstract class BaseStatusBar extends SystemUI implements
         CommandQueue.Callbacks {
-    static final String TAG = "StatusBar";
-    private static final boolean DEBUG = false;
+    public static final String TAG = "StatusBar";
+    public static final boolean DEBUG = false;
     public static final boolean MULTIUSER_DEBUG = false;
 
     protected static final int MSG_TOGGLE_RECENTS_PANEL = 1020;
@@ -162,6 +162,9 @@
     private RemoteViews.OnClickHandler mOnClickHandler = new RemoteViews.OnClickHandler() {
         @Override
         public boolean onClickHandler(View view, PendingIntent pendingIntent, Intent fillInIntent) {
+            if (DEBUG) {
+                Slog.v(TAG, "Notification click handler invoked for intent: " + pendingIntent);
+            }
             final boolean isActivity = pendingIntent.isActivity();
             if (isActivity) {
                 try {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
index bffb903..9a3648f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java
@@ -10,22 +10,23 @@
 
 public class PanelBar extends FrameLayout {
     public static final boolean DEBUG = false;
-    public static final String TAG = PanelView.class.getSimpleName();
+    public static final String TAG = PanelBar.class.getSimpleName();
     public static final void LOG(String fmt, Object... args) {
         if (!DEBUG) return;
         Slog.v(TAG, String.format(fmt, args));
     }
 
+    public static final int STATE_CLOSED = 0;
+    public static final int STATE_OPENING = 1;
+    public static final int STATE_OPEN = 2;
+
     private PanelHolder mPanelHolder;
     private ArrayList<PanelView> mPanels = new ArrayList<PanelView>();
     protected PanelView mTouchingPanel;
-    private static final int STATE_CLOSED = 0;
-    private static final int STATE_TRANSITIONING = 1;
-    private static final int STATE_OPEN = 2;
     private int mState = STATE_CLOSED;
     private boolean mTracking;
 
-    private void go(int state) {
+    public void go(int state) {
         LOG("go state: %d -> %d", mState, state);
         mState = state;
     }
@@ -80,18 +81,21 @@
 
         // figure out which panel needs to be talked to here
         if (event.getAction() == MotionEvent.ACTION_DOWN) {
-            mTouchingPanel = selectPanelForTouchX(event.getX());
-            mPanelHolder.setSelectedPanel(mTouchingPanel);
-            LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s", mState, mTouchingPanel.getName());
-            if (mState == STATE_CLOSED || mState == STATE_OPEN) {
-                go(STATE_TRANSITIONING);
-                onPanelPeeked();
-            }
+            final PanelView panel = selectPanelForTouchX(event.getX());
+            LOG("PanelBar.onTouch: state=%d ACTION_DOWN: panel %s", mState, panel);
+            startOpeningPanel(panel);
         }
         final boolean result = mTouchingPanel.getHandle().dispatchTouchEvent(event);
         return result;
     }
 
+    // called from PanelView when self-expanding, too
+    public void startOpeningPanel(PanelView panel) {
+        LOG("startOpeningPanel: " + panel);
+        mTouchingPanel = panel;
+        mPanelHolder.setSelectedPanel(mTouchingPanel);
+    }
+
     public void panelExpansionChanged(PanelView panel, float frac) {
         boolean fullyClosed = true;
         PanelView fullyOpenedPanel = null;
@@ -99,6 +103,10 @@
         for (PanelView pv : mPanels) {
             // adjust any other panels that may be partially visible
             if (pv.getExpandedHeight() > 0f) {
+                if (mState == STATE_CLOSED) {
+                    go(STATE_OPENING);
+                    onPanelPeeked();
+                }
                 fullyClosed = false;
                 final float thisFrac = pv.getExpandedFraction();
                 LOG("panelExpansionChanged:  -> %s: f=%.1f", pv.getName(), thisFrac);
@@ -112,7 +120,7 @@
         if (fullyOpenedPanel != null && !mTracking) {
             go(STATE_OPEN);
             onPanelFullyOpened(fullyOpenedPanel);
-        } else if (fullyClosed && !mTracking) {
+        } else if (fullyClosed && !mTracking && mState != STATE_CLOSED) {
             go(STATE_CLOSED);
             onAllPanelsCollapsed();
         }
@@ -122,13 +130,21 @@
     }
 
     public void collapseAllPanels(boolean animate) {
+        boolean waiting = false;
         for (PanelView pv : mPanels) {
-            if (animate && pv == mTouchingPanel) {
-                mTouchingPanel.collapse();
+            if (animate && !pv.isFullyCollapsed()) {
+                pv.collapse();
+                waiting = true;
             } else {
                 pv.setExpandedFraction(0); // just in case
             }
         }
+        if (!waiting) {
+            // it's possible that nothing animated, so we replicate the termination 
+            // conditions of panelExpansionChanged here
+            go(STATE_CLOSED);
+            onAllPanelsCollapsed();
+        }
     }
 
     public void onPanelPeeked() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 1c244d4..a4a3a6a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -9,6 +9,7 @@
 import android.view.MotionEvent;
 import android.view.VelocityTracker;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
 import com.android.systemui.R;
@@ -18,7 +19,7 @@
 import com.android.systemui.statusbar.policy.NetworkController;
 
 public class PanelView extends FrameLayout {
-    public static final boolean DEBUG = false;
+    public static final boolean DEBUG = PanelBar.DEBUG;
     public static final String TAG = PanelView.class.getSimpleName();
     public final void LOG(String fmt, Object... args) {
         if (!DEBUG) return;
@@ -298,10 +299,16 @@
 
         LOG("onMeasure(%d, %d) -> (%d, %d)",
                 widthMeasureSpec, heightMeasureSpec, getMeasuredWidth(), getMeasuredHeight());
-        mFullHeight = getMeasuredHeight();
-        // if one of our children is getting smaller, we should track that
-        if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() && mExpandedHeight > 0 && mExpandedHeight != mFullHeight) {
-            mExpandedHeight = mFullHeight;
+
+        // Did one of our children change size?
+        int newHeight = getMeasuredHeight();
+        if (newHeight != mFullHeight) {
+            mFullHeight = newHeight;
+            // If the user isn't actively poking us, let's rubberband to the content
+            if (!mTracking && !mRubberbanding && !mTimeAnimator.isStarted() 
+                    && mExpandedHeight > 0 && mExpandedHeight != mFullHeight) {
+                mExpandedHeight = mFullHeight;
+            }
         }
         heightMeasureSpec = MeasureSpec.makeMeasureSpec(
                     (int) mExpandedHeight, MeasureSpec.AT_MOST); // MeasureSpec.getMode(heightMeasureSpec));
@@ -310,6 +317,7 @@
 
 
     public void setExpandedHeight(float height) {
+        mTracking = mRubberbanding = false;
         post(mStopAnimator);
         setExpandedHeightInternal(height);
     }
@@ -326,21 +334,26 @@
             // Hmm, full height hasn't been computed yet
         }
 
-        LOG("setExpansion: height=%.1f fh=%.1f tracking=%s rubber=%s", h, fh, mTracking?"T":"f", mRubberbanding?"T":"f");
-
         if (h < 0) h = 0;
         if (!(STRETCH_PAST_CONTENTS && (mTracking || mRubberbanding)) && h > fh) h = fh;
         mExpandedHeight = h;
 
+        LOG("setExpansion: height=%.1f fh=%.1f tracking=%s rubber=%s", h, fh, mTracking?"T":"f", mRubberbanding?"T":"f");
+
         requestLayout();
 //        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
 //        lp.height = (int) mExpandedHeight;
 //        setLayoutParams(lp);
 
-        mExpandedFraction = Math.min(1f, h / fh);
+        mExpandedFraction = Math.min(1f, (fh == 0) ? 0 : h / fh);
     }
 
     private float getFullHeight() {
+        if (mFullHeight <= 0) {
+            LOG("Forcing measure() since fullHeight=" + mFullHeight);
+            measure(MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY),
+                    MeasureSpec.makeMeasureSpec(LayoutParams.WRAP_CONTENT, MeasureSpec.EXACTLY));
+        }
         return mFullHeight;
     }
 
@@ -385,8 +398,12 @@
     }
 
     public void expand() {
-        if (!isFullyExpanded()) {
+        if (isFullyCollapsed()) {
+            mBar.startOpeningPanel(this);
+            LOG("expand: calling fling(%s, true)", mSelfExpandVelocityPx);
             fling (mSelfExpandVelocityPx, /*always=*/ true);
+        } else if (DEBUG) {
+            LOG("skipping expansion: is expanded");
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 8f6a903..c55da5d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -95,7 +95,7 @@
 
 public class PhoneStatusBar extends BaseStatusBar {
     static final String TAG = "PhoneStatusBar";
-    public static final boolean DEBUG = false;
+    public static final boolean DEBUG = BaseStatusBar.DEBUG;
     public static final boolean SPEW = DEBUG;
     public static final boolean DUMPTRUCK = true; // extra dumpsys info
 
@@ -285,9 +285,6 @@
 
         mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
                 R.layout.super_status_bar, null);
-        if (DEBUG) {
-            mStatusBarWindow.setBackgroundColor(0x6000FF80);
-        }
         mStatusBarWindow.mService = this;
         mStatusBarWindow.setOnTouchListener(new View.OnTouchListener() {
             @Override
@@ -1160,7 +1157,7 @@
 
     public void animateCollapse(int flags) {
         if (SPEW) {
-            Slog.d(TAG, "animateCollapse(): "
+            Slog.d(TAG, "animateCollapse():"
                     + " mExpandedVisible=" + mExpandedVisible
                     + " mAnimating=" + mAnimating
                     + " mAnimatingReveal=" + mAnimatingReveal
@@ -1203,7 +1200,7 @@
         }
 
         // Ensure the panel is fully collapsed (just in case; bug 6765842)
-        mStatusBarView.collapseAllPanels(/*animate=*/ false);
+ // @@@        mStatusBarView.collapseAllPanels(/*animate=*/ false);
 
         mExpandedVisible = false;
         mPile.setLayoutTransitionsEnabled(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 8fe525c..95b618a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -27,6 +27,7 @@
 import android.os.SystemClock;
 import android.util.AttributeSet;
 import android.util.Log;
+import android.util.Slog;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
@@ -41,6 +42,8 @@
 
 public class PhoneStatusBarView extends PanelBar {
     private static final String TAG = "PhoneStatusBarView";
+    private static final boolean DEBUG = PhoneStatusBar.DEBUG;
+
     PhoneStatusBar mBar;
     int mScrimColor;
     float mMinFlingGutter;
@@ -152,6 +155,10 @@
     public void panelExpansionChanged(PanelView pv, float frac) {
         super.panelExpansionChanged(pv, frac);
 
+        if (DEBUG) {
+            Slog.v(TAG, "panelExpansionChanged: f=" + frac);
+        }
+
         if (mFadingPanel == pv 
                 && mScrimColor != 0 && ActivityManager.isHighEndGfx()) {
             // woo, special effects
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
index 1b28045..3fc15e0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
@@ -16,27 +16,27 @@
 
 package com.android.systemui.statusbar.phone;
 
+import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.PendingIntent;
-import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.CursorLoader;
 import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.Loader;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.LevelListDrawable;
 import android.hardware.display.DisplayManager;
-import android.hardware.display.WifiDisplay;
 import android.hardware.display.WifiDisplayStatus;
 import android.net.Uri;
-import android.os.Debug;
+import android.os.Handler;
+import android.os.SystemProperties;
 import android.provider.ContactsContract;
 import android.provider.Settings;
 import android.view.LayoutInflater;
@@ -44,16 +44,11 @@
 import android.view.ViewGroup;
 import android.view.Window;
 import android.view.WindowManager;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.Button;
 import android.widget.ImageView;
-import android.widget.ListView;
 import android.widget.TextView;
 
 import com.android.internal.view.RotationPolicy;
 import com.android.systemui.R;
-import com.android.systemui.statusbar.phone.QuickSettingsModel.BrightnessState;
 import com.android.systemui.statusbar.phone.QuickSettingsModel.RSSIState;
 import com.android.systemui.statusbar.phone.QuickSettingsModel.State;
 import com.android.systemui.statusbar.phone.QuickSettingsModel.UserState;
@@ -65,8 +60,6 @@
 import com.android.systemui.statusbar.policy.ToggleSlider;
 
 import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.Set;
 
 
 /**
@@ -84,13 +77,18 @@
 
     private BrightnessController mBrightnessController;
     private BluetoothController mBluetoothController;
+
     private Dialog mBrightnessDialog;
+    private int mBrightnessDialogShortTimeout;
+    private int mBrightnessDialogLongTimeout;
 
     private CursorLoader mUserInfoLoader;
 
     private LevelListDrawable mBatteryLevels;
     private LevelListDrawable mChargingBatteryLevels;
 
+    private Handler mHandler;
+
     // The set of QuickSettingsTiles that have dynamic spans (and need to be updated on
     // configuration change)
     private final ArrayList<QuickSettingsTileView> mDynamicSpannedTiles =
@@ -110,11 +108,16 @@
         mContainerView = container;
         mModel = new QuickSettingsModel(context);
         mWifiDisplayStatus = new WifiDisplayStatus();
+        mHandler = new Handler();
 
         Resources r = mContext.getResources();
         mBatteryLevels = (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery);
         mChargingBatteryLevels =
                 (LevelListDrawable) r.getDrawable(R.drawable.qs_sys_battery_charging);
+        mBrightnessDialogLongTimeout =
+                r.getInteger(R.integer.quick_settings_brightness_dialog_long_timeout);
+        mBrightnessDialogShortTimeout =
+                r.getInteger(R.integer.quick_settings_brightness_dialog_short_timeout);
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
@@ -209,6 +212,15 @@
         QuickSettingsTileView userTile = (QuickSettingsTileView)
                 inflater.inflate(R.layout.quick_settings_tile, parent, false);
         userTile.setContent(R.layout.quick_settings_tile_user, inflater);
+        userTile.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mBar.collapseAllPanels(true);
+                ContactsContract.QuickContact.showQuickContact(mContext, v,
+                        ContactsContract.Profile.CONTENT_URI,
+                        ContactsContract.QuickContact.MODE_LARGE, null);
+            }
+        });
         mModel.addUserTile(userTile, new QuickSettingsModel.RefreshCallback() {
             @Override
             public void refreshView(QuickSettingsTileView view, State state) {
@@ -448,6 +460,7 @@
             public void refreshView(QuickSettingsTileView view, State state) {
                 TextView tv = (TextView) view.findViewById(R.id.brightness_textview);
                 tv.setCompoundDrawablesWithIntrinsicBounds(0, state.iconId, 0, 0);
+                dismissBrightnessDialog(mBrightnessDialogShortTimeout);
             }
         });
         parent.addView(brightnessTile);
@@ -521,6 +534,24 @@
         });
         parent.addView(imeTile);
 
+        // Bug reports
+        QuickSettingsTileView bugreportTile = (QuickSettingsTileView)
+                inflater.inflate(R.layout.quick_settings_tile, parent, false);
+        bugreportTile.setContent(R.layout.quick_settings_tile_bugreport, inflater);
+        bugreportTile.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                mBar.collapseAllPanels(true);
+                showBugreportDialog();
+            }
+        });
+        mModel.addBugreportTile(bugreportTile, new QuickSettingsModel.RefreshCallback() {
+            @Override
+            public void refreshView(QuickSettingsTileView view, State state) {
+                view.setVisibility(state.enabled ? View.VISIBLE : View.GONE);
+            }
+        });
+        parent.addView(bugreportTile);
         /*
         QuickSettingsTileView mediaTile = (QuickSettingsTileView)
                 inflater.inflate(R.layout.quick_settings_tile, parent, false);
@@ -548,8 +579,34 @@
             v.setColumnSpan(span);
         }
         mContainerView.requestLayout();
+
+        // Reset the dialog
+        boolean isBrightnessDialogVisible = false;
+        if (mBrightnessDialog != null) {
+            removeAllBrightnessDialogCallbacks();
+
+            isBrightnessDialogVisible = mBrightnessDialog.isShowing();
+            mBrightnessDialog.dismiss();
+        }
+        mBrightnessDialog = null;
+        if (isBrightnessDialogVisible) {
+            showBrightnessDialog();
+        }
     }
     
+    private void removeAllBrightnessDialogCallbacks() {
+        mHandler.removeCallbacks(mDismissBrightnessDialogRunnable);
+    }
+
+    private Runnable mDismissBrightnessDialogRunnable = new Runnable() {
+        public void run() {
+            if (mBrightnessDialog != null && mBrightnessDialog.isShowing()) {
+                mBrightnessDialog.dismiss();
+            }
+            removeAllBrightnessDialogCallbacks();
+        };
+    };
+
     private void showBrightnessDialog() {
         if (mBrightnessDialog == null) {
             mBrightnessDialog = new Dialog(mContext);
@@ -572,9 +629,34 @@
         }
         if (!mBrightnessDialog.isShowing()) {
             mBrightnessDialog.show();
+            dismissBrightnessDialog(mBrightnessDialogLongTimeout);
         }
     }
 
+    private void dismissBrightnessDialog(int timeout) {
+        if (mBrightnessDialog != null) {
+            mHandler.postDelayed(mDismissBrightnessDialogRunnable, timeout);
+        }
+    }
+
+    private void showBugreportDialog() {
+        final AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
+        builder.setPositiveButton(com.android.internal.R.string.report, new OnClickListener() {
+            @Override
+            public void onClick(DialogInterface dialog, int which) {
+                if (which == DialogInterface.BUTTON_POSITIVE) {
+                    SystemProperties.set("ctl.start", "bugreport");
+                }
+            }
+        });
+        builder.setMessage(com.android.internal.R.string.bugreport_message);
+        builder.setTitle(com.android.internal.R.string.bugreport_title);
+        builder.setCancelable(true);
+        final Dialog dialog = builder.create();
+        dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
+        dialog.show();
+    }
+
     private void updateWifiDisplayStatus() {
         mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
         applyWifiDisplayStatus();
@@ -595,4 +677,4 @@
             }
         }
     };
-}
\ No newline at end of file
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
index 724df34..cc51aac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettingsModel.java
@@ -30,6 +30,7 @@
 import android.hardware.display.WifiDisplayStatus;
 import android.os.Handler;
 import android.provider.Settings;
+import android.provider.Settings.SettingNotFoundException;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.inputmethod.InputMethodInfo;
@@ -107,9 +108,26 @@
         }
     }
 
+    /** ContentObserver to watch adb */
+    private class BugreportObserver extends ContentObserver {
+        public BugreportObserver(Handler handler) {
+            super(handler);
+        }
+
+        @Override public void onChange(boolean selfChange) {
+            onBugreportChanged();
+        }
+
+        public void startObserving() {
+            final ContentResolver cr = mContext.getContentResolver();
+            cr.registerContentObserver(
+                    Settings.Secure.getUriFor(Settings.Secure.BUGREPORT_IN_POWER_MENU), false, this);
+        }
+    }
     private Context mContext;
     private Handler mHandler;
     private NextAlarmObserver mNextAlarmObserver;
+    private BugreportObserver mBugreportObserver;
 
     private QuickSettingsTileView mUserTile;
     private RefreshCallback mUserCallback;
@@ -159,11 +177,17 @@
     private RefreshCallback mBrightnessCallback;
     private BrightnessState mBrightnessState = new BrightnessState();
 
+    private QuickSettingsTileView mBugreportTile;
+    private RefreshCallback mBugreportCallback;
+    private State mBugreportState = new State();
+
     public QuickSettingsModel(Context context) {
         mContext = context;
         mHandler = new Handler();
         mNextAlarmObserver = new NextAlarmObserver(mHandler);
         mNextAlarmObserver.startObserving();
+        mBugreportObserver = new BugreportObserver(mHandler);
+        mBugreportObserver.startObserving();
 
         IntentFilter alarmIntentFilter = new IntentFilter();
         alarmIntentFilter.addAction(Intent.ACTION_ALARM_CHANGED);
@@ -341,6 +365,25 @@
         mLocationCallback.refreshView(mLocationTile, mLocationState);
     }
 
+    // Bug report
+    void addBugreportTile(QuickSettingsTileView view, RefreshCallback cb) {
+        mBugreportTile = view;
+        mBugreportCallback = cb;
+        onBugreportChanged();
+    }
+    // SettingsObserver callback
+    public void onBugreportChanged() {
+        final ContentResolver cr = mContext.getContentResolver();
+        boolean enabled = false;
+        try {
+            enabled = (Settings.Secure.getInt(cr, Settings.Secure.BUGREPORT_IN_POWER_MENU) != 0);
+        } catch (SettingNotFoundException e) {
+        }
+
+        mBugreportState.enabled = enabled;
+        mBugreportCallback.refreshView(mBugreportTile, mBugreportState);
+    }
+
     // Wifi Display
     void addWifiDisplayTile(QuickSettingsTileView view, RefreshCallback cb) {
         mWifiDisplayTile = view;
@@ -348,7 +391,7 @@
     }
     public void onWifiDisplayStateChanged(WifiDisplayStatus status) {
         mWifiDisplayState.enabled =
-                (status.getFeatureState() != WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE);
+                (status.getFeatureState() == WifiDisplayStatus.FEATURE_STATE_ON);
         if (status.getActiveDisplay() != null) {
             mWifiDisplayState.label = status.getActiveDisplay().getFriendlyDisplayName();
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index e0b7fe6..f83517b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -17,6 +17,8 @@
 package com.android.systemui.statusbar.phone;
 
 import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Paint;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -28,12 +30,14 @@
 
 import com.android.systemui.ExpandHelper;
 import com.android.systemui.R;
+import com.android.systemui.statusbar.BaseStatusBar;
 import com.android.systemui.statusbar.policy.NotificationRowLayout;
 
 
 public class StatusBarWindowView extends FrameLayout
 {
-    private static final String TAG = "StatusBarWindowView";
+    public static final String TAG = "StatusBarWindowView";
+    public static final boolean DEBUG = BaseStatusBar.DEBUG;
 
     private ExpandHelper mExpandHelper;
     private NotificationRowLayout latestItems;
@@ -44,6 +48,7 @@
     public StatusBarWindowView(Context context, AttributeSet attrs) {
         super(context, attrs);
         setMotionEventSplittingEnabled(false);
+        setWillNotDraw(!DEBUG);
     }
 
     @Override
@@ -101,5 +106,17 @@
         }
         return handled;
     }
+
+    @Override
+    public void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        if (DEBUG) {
+            Paint pt = new Paint();
+            pt.setColor(0x80FFFF00);
+            pt.setStrokeWidth(12.0f);
+            pt.setStyle(Paint.Style.STROKE);
+            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), pt);
+        }
+    }
 }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index ee82777..463aacb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -1097,8 +1097,7 @@
 
         final boolean ethernetConnected = (mConnectedNetworkType == ConnectivityManager.TYPE_ETHERNET);
         if (ethernetConnected) {
-            // TODO: icons and strings for Ethernet connectivity
-            combinedLabel = mConnectedNetworkTypeName;
+            combinedLabel = context.getString(R.string.ethernet_label);
         }
 
         if (mAirplaneMode &&
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 bbd07a3..e6d6e36 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java
@@ -33,7 +33,6 @@
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.os.Looper;
-import android.os.UserHandle;
 import android.os.UserManager;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -42,6 +41,7 @@
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.WindowManager;
 import android.view.animation.AnimationUtils;
 import android.widget.RemoteViews.OnClickHandler;
@@ -691,6 +691,23 @@
         }
         inflateAndAddUserSelectorWidgetIfNecessary();
 
+        // Add status widget
+        int statusWidgetId = mLockPatternUtils.getStatusWidget();
+        if (statusWidgetId != -1) {
+            addWidget(statusWidgetId);
+            View newStatusWidget = mAppWidgetContainer.getChildAt(
+                    mAppWidgetContainer.getChildCount() - 1);
+
+            int oldStatusWidgetPosition = getWidgetPosition(R.id.keyguard_status_view);
+            mAppWidgetContainer.removeViewAt(oldStatusWidgetPosition);
+
+            // Re-add new status widget at position of old one
+            mAppWidgetContainer.removeView(newStatusWidget);
+            newStatusWidget.setId(R.id.keyguard_status_view);
+            mAppWidgetContainer.addView(newStatusWidget, oldStatusWidgetPosition);
+        }
+
+        // Add user-selected widget
         final int[] widgets = mLockPatternUtils.getUserDefinedWidgets();
         for (int i = 0; i < widgets.length; i++) {
             if (widgets[i] != -1) {
@@ -703,7 +720,7 @@
         // if there are multiple users, we need to add the multi-user switcher widget to the
         // keyguard.
         UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        List<UserInfo> users = mUm.getUsers();
+        List<UserInfo> users = mUm.getUsers(true);
 
         if (users.size() > 1) {
             KeyguardWidgetFrame userSwitcher = (KeyguardWidgetFrame)
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserSelectorView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserSelectorView.java
index b3cd8a2..e4096b9 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserSelectorView.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardMultiUserSelectorView.java
@@ -76,7 +76,7 @@
         }
 
         UserManager mUm = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
-        ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUm.getUsers());
+        ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUm.getUsers(true));
         Collections.sort(users, mOrderAddedComparator);
 
         for (UserInfo user: users) {
diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
index 50a7134..416a0bb 100644
--- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
+++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardViewMediator.java
@@ -792,7 +792,7 @@
             return;
         }
 
-        if (mUserManager.getUsers().size() < 2
+        if (mUserManager.getUsers(true).size() < 2
                 && mLockPatternUtils.isLockScreenDisabled() && !lockedOrMissing) {
             if (DEBUG) Log.d(TAG, "doKeyguard: not showing because lockscreen is off");
             return;
diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java
index ba758e5..fe2f8d8 100644
--- a/services/java/com/android/server/MountService.java
+++ b/services/java/com/android/server/MountService.java
@@ -1176,7 +1176,7 @@
                                 true, mtpReserve, false, maxFileSize, null);
 
                         final UserManagerService userManager = UserManagerService.getInstance();
-                        for (UserInfo user : userManager.getUsers()) {
+                        for (UserInfo user : userManager.getUsers(false)) {
                             createEmulatedVolumeForUserLocked(user.getUserHandle());
                         }
 
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index cd3aeff..f162dae 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -14034,6 +14034,7 @@
                     startHomeActivityLocked(userId);
                 }
 
+                getUserManagerLocked().userForeground(userId);
                 sendUserSwitchBroadcastsLocked(oldUserId, userId);
             }
         } finally {
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index df50d89..05ff379 100755
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -3038,11 +3038,6 @@
         // Collect information about the target of the Intent.
         ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
                 profileFile, profileFd, userId);
-        if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_MULTIPROCESS) == 0
-                && mService.isSingleton(aInfo.processName, aInfo.applicationInfo, null, 0)) {
-            userId = 0;
-        }
-        aInfo = mService.getActivityInfoForUser(aInfo, userId);
 
         synchronized (mService) {
             int callingPid;
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index f3de8a4..3f2387b 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -1029,7 +1029,7 @@
 
             readPermissions();
 
-            mRestoredSettings = mSettings.readLPw(sUserManager.getUsers());
+            mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false));
             long startTime = SystemClock.uptimeMillis();
 
             EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
@@ -5904,11 +5904,20 @@
      *
      * @return true if verification should be performed
      */
-    private boolean isVerificationEnabled() {
+    private boolean isVerificationEnabled(int flags) {
         if (!DEFAULT_VERIFY_ENABLE) {
             return false;
         }
 
+        // Check if installing from ADB
+        if ((flags & PackageManager.INSTALL_FROM_ADB) != 0) {
+            // Check if the developer does not want package verification for ADB installs
+            if (android.provider.Settings.Global.getInt(mContext.getContentResolver(),
+                    android.provider.Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) == 0) {
+                return false;
+            }
+        }
+
         return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
                 android.provider.Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) == 1;
     }
@@ -6406,7 +6415,7 @@
                  */
                 final int requiredUid = mRequiredVerifierPackage == null ? -1
                         : getPackageUid(mRequiredVerifierPackage, 0);
-                if (requiredUid != -1 && isVerificationEnabled()) {
+                if (requiredUid != -1 && isVerificationEnabled(flags)) {
                     final Intent verification = new Intent(
                             Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
                     verification.setDataAndType(getPackageUri(), PACKAGE_MIME_TYPE);
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index b075da3..23e54678 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -2477,7 +2477,7 @@
     private List<UserInfo> getAllUsers() {
         long id = Binder.clearCallingIdentity();
         try {
-            return UserManagerService.getInstance().getUsers();
+            return UserManagerService.getInstance().getUsers(false);
         } catch (NullPointerException npe) {
             // packagemanager not yet initialized
         } finally {
diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java
index 2dc9a6a..2edc700 100644
--- a/services/java/com/android/server/pm/UserManagerService.java
+++ b/services/java/com/android/server/pm/UserManagerService.java
@@ -43,15 +43,19 @@
 import android.util.AtomicFile;
 import android.util.Slog;
 import android.util.SparseArray;
+import android.util.TimeUtils;
 import android.util.Xml;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
 
 import org.xmlpull.v1.XmlPullParser;
@@ -66,6 +70,8 @@
     private static final String ATTR_FLAGS = "flags";
     private static final String ATTR_ICON_PATH = "icon";
     private static final String ATTR_ID = "id";
+    private static final String ATTR_CREATION_TIME = "created";
+    private static final String ATTR_LAST_LOGGED_IN_TIME = "lastLoggedIn";
     private static final String ATTR_SERIAL_NO = "serialNumber";
     private static final String ATTR_NEXT_SERIAL_NO = "nextSerialNumber";
     private static final String TAG_USERS = "users";
@@ -75,6 +81,8 @@
     private static final String USER_LIST_FILENAME = "userlist.xml";
     private static final String USER_PHOTO_FILENAME = "photo.png";
 
+    private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms
+
     private final Context mContext;
     private final PackageManagerService mPm;
     private final Object mInstallLock;
@@ -85,6 +93,7 @@
     private final File mBaseUserPath;
 
     private SparseArray<UserInfo> mUsers = new SparseArray<UserInfo>();
+    private HashSet<Integer> mRemovingUserIds = new HashSet<Integer>();
 
     private int[] mUserIds;
     private boolean mGuestEnabled;
@@ -145,12 +154,14 @@
     }
 
     @Override
-    public List<UserInfo> getUsers() {
+    public List<UserInfo> getUsers(boolean excludeDying) {
         checkManageUsersPermission("query users");
         synchronized (mPackagesLock) {
             ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUsers.size());
             for (int i = 0; i < mUsers.size(); i++) {
-                users.add(mUsers.valueAt(i));
+                if (!excludeDying || !mRemovingUserIds.contains(mUsers.keyAt(i))) {
+                    users.add(mUsers.valueAt(i));
+                }
             }
             return users;
         }
@@ -436,6 +447,9 @@
             serializer.attribute(null, ATTR_ID, Integer.toString(userInfo.id));
             serializer.attribute(null, ATTR_SERIAL_NO, Integer.toString(userInfo.serialNumber));
             serializer.attribute(null, ATTR_FLAGS, Integer.toString(userInfo.flags));
+            serializer.attribute(null, ATTR_CREATION_TIME, Long.toString(userInfo.creationTime));
+            serializer.attribute(null, ATTR_LAST_LOGGED_IN_TIME,
+                    Long.toString(userInfo.lastLoggedInTime));
             if (userInfo.iconPath != null) {
                 serializer.attribute(null,  ATTR_ICON_PATH, userInfo.iconPath);
             }
@@ -500,6 +514,8 @@
         int serialNumber = id;
         String name = null;
         String iconPath = null;
+        long creationTime = 0L;
+        long lastLoggedInTime = 0L;
 
         FileInputStream fis = null;
         try {
@@ -520,18 +536,16 @@
             }
 
             if (type == XmlPullParser.START_TAG && parser.getName().equals(TAG_USER)) {
-                String storedId = parser.getAttributeValue(null, ATTR_ID);
-                if (Integer.parseInt(storedId) != id) {
+                int storedId = readIntAttribute(parser, ATTR_ID, -1);
+                if (storedId != id) {
                     Slog.e(LOG_TAG, "User id does not match the file name");
                     return null;
                 }
-                String serialNumberValue = parser.getAttributeValue(null, ATTR_SERIAL_NO);
-                if (serialNumberValue != null) {
-                    serialNumber = Integer.parseInt(serialNumberValue);
-                }
-                String flagString = parser.getAttributeValue(null, ATTR_FLAGS);
-                flags = Integer.parseInt(flagString);
+                serialNumber = readIntAttribute(parser, ATTR_SERIAL_NO, id);
+                flags = readIntAttribute(parser, ATTR_FLAGS, 0);
                 iconPath = parser.getAttributeValue(null, ATTR_ICON_PATH);
+                creationTime = readLongAttribute(parser, ATTR_CREATION_TIME, 0);
+                lastLoggedInTime = readLongAttribute(parser, ATTR_LAST_LOGGED_IN_TIME, 0);
 
                 while ((type = parser.next()) != XmlPullParser.START_TAG
                         && type != XmlPullParser.END_DOCUMENT) {
@@ -546,6 +560,8 @@
 
             UserInfo userInfo = new UserInfo(id, name, iconPath, flags);
             userInfo.serialNumber = serialNumber;
+            userInfo.creationTime = creationTime;
+            userInfo.lastLoggedInTime = lastLoggedInTime;
             return userInfo;
 
         } catch (IOException ioe) {
@@ -561,6 +577,26 @@
         return null;
     }
 
+    private int readIntAttribute(XmlPullParser parser, String attr, int defaultValue) {
+        String valueString = parser.getAttributeValue(null, attr);
+        if (valueString == null) return defaultValue;
+        try {
+            return Integer.parseInt(valueString);
+        } catch (NumberFormatException nfe) {
+            return defaultValue;
+        }
+    }
+
+    private long readLongAttribute(XmlPullParser parser, String attr, long defaultValue) {
+        String valueString = parser.getAttributeValue(null, attr);
+        if (valueString == null) return defaultValue;
+        try {
+            return Long.parseLong(valueString);
+        } catch (NumberFormatException nfe) {
+            return defaultValue;
+        }
+    }
+
     @Override
     public UserInfo createUser(String name, int flags) {
         checkManageUsersPermission("Only the system can create users");
@@ -575,6 +611,8 @@
                     userInfo = new UserInfo(userId, name, null, flags);
                     File userPath = new File(mBaseUserPath, Integer.toString(userId));
                     userInfo.serialNumber = mNextSerialNumber++;
+                    long now = System.currentTimeMillis();
+                    userInfo.creationTime = (now > EPOCH_PLUS_30_YEARS) ? now : 0;
                     mUsers.put(userId, userInfo);
                     writeUserListLocked();
                     writeUserLocked(userInfo);
@@ -607,6 +645,7 @@
             if (userHandle == 0 || user == null) {
                 return false;
             }
+            mRemovingUserIds.add(userHandle);
         }
 
         int res;
@@ -636,6 +675,7 @@
 
                 // Remove this user from the list
                 mUsers.remove(userHandle);
+                mRemovingUserIds.remove(userHandle);
                 // Remove user file
                 AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + ".xml"));
                 userFile.delete();
@@ -700,6 +740,21 @@
     }
 
     /**
+     * Make a note of the last started time of a user.
+     * @param userId the user that was just foregrounded
+     */
+    public void userForeground(int userId) {
+        synchronized (mPackagesLock) {
+            UserInfo user = mUsers.get(userId);
+            long now = System.currentTimeMillis();
+            if (user != null && now > EPOCH_PLUS_30_YEARS) {
+                user.lastLoggedInTime = now;
+                writeUserLocked(user);
+            }
+        }
+    }
+
+    /**
      * Returns the next available user id, filling in any holes in the ids.
      * TODO: May not be a good idea to recycle ids, in case it results in confusion
      * for data and battery stats collection, or unexpected cross-talk.
@@ -709,7 +764,7 @@
         synchronized (mPackagesLock) {
             int i = 10;
             while (i < Integer.MAX_VALUE) {
-                if (mUsers.indexOfKey(i) < 0) {
+                if (mUsers.indexOfKey(i) < 0 && !mRemovingUserIds.contains(i)) {
                     break;
                 }
                 i++;
@@ -717,4 +772,47 @@
             return i;
         }
     }
+
+    @Override
+    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+                != PackageManager.PERMISSION_GRANTED) {
+            pw.println("Permission Denial: can't dump UserManager from from pid="
+                    + Binder.getCallingPid()
+                    + ", uid=" + Binder.getCallingUid()
+                    + " without permission "
+                    + android.Manifest.permission.DUMP);
+            return;
+        }
+
+        long now = System.currentTimeMillis();
+        StringBuilder sb = new StringBuilder();
+        synchronized (mPackagesLock) {
+            pw.println("Users:");
+            for (int i = 0; i < mUsers.size(); i++) {
+                UserInfo user = mUsers.valueAt(i);
+                if (user == null) continue;
+                pw.print("  "); pw.print(user);
+                pw.println(mRemovingUserIds.contains(mUsers.keyAt(i)) ? " <removing> " : "");
+                pw.print("    Created: ");
+                if (user.creationTime == 0) {
+                    pw.println("<unknown>");
+                } else {
+                    sb.setLength(0);
+                    TimeUtils.formatDuration(now - user.creationTime, sb);
+                    sb.append(" ago");
+                    pw.println(sb);
+                }
+                pw.print("    Last logged in: ");
+                if (user.lastLoggedInTime == 0) {
+                    pw.println("<unknown>");
+                } else {
+                    sb.setLength(0);
+                    TimeUtils.formatDuration(now - user.lastLoggedInTime, sb);
+                    sb.append(" ago");
+                    pw.println(sb);
+                }
+            }
+        }
+    }
 }
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index 0a4e6d3..377e89c 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -139,10 +139,8 @@
     }
 
     void addDisplayLocked(final int displayId) {
-        DisplayContentsAnimator displayAnimator = getDisplayContentsAnimatorLocked(displayId);
-        displayAnimator.mWindowAnimationBackgroundSurface =
-                new DimSurface(mService.mFxSession, displayId);
-        displayAnimator.mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
+        // Create the DisplayContentsAnimator object by retrieving it.
+        getDisplayContentsAnimatorLocked(displayId);
         if (displayId == Display.DEFAULT_DISPLAY) {
             mInitialized = true;
         }
@@ -787,7 +785,7 @@
     private DisplayContentsAnimator getDisplayContentsAnimatorLocked(int displayId) {
         DisplayContentsAnimator displayAnimator = mDisplayContentsAnimators.get(displayId);
         if (displayAnimator == null) {
-            displayAnimator = new DisplayContentsAnimator();
+            displayAnimator = new DisplayContentsAnimator(displayId);
             mDisplayContentsAnimators.put(displayId, displayAnimator);
         }
         return displayAnimator;
@@ -801,11 +799,17 @@
         return getDisplayContentsAnimatorLocked(displayId).mScreenRotationAnimation;
     }
 
-    private static class DisplayContentsAnimator {
+    private class DisplayContentsAnimator {
         WinAnimatorList mWinAnimators = new WinAnimatorList();
-        DimAnimator mDimAnimator = null;
+        final DimAnimator mDimAnimator;
         DimAnimator.Parameters mDimParams = null;
-        DimSurface mWindowAnimationBackgroundSurface = null;
+        final DimSurface mWindowAnimationBackgroundSurface;
         ScreenRotationAnimation mScreenRotationAnimation = null;
+
+        public DisplayContentsAnimator(int displayId) {
+            mDimAnimator = new DimAnimator(mService.mFxSession, displayId);
+            mWindowAnimationBackgroundSurface =
+                    new DimSurface(mService.mFxSession, displayId);
+        }
     }
 }