Merge "Remove use of SkAutoSTMalloc from Android."
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index b629435..9709299 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -18,6 +18,8 @@
package com.android.commands.am;
+import static android.app.ActivityManager.DOCKED_STACK_ID;
+
import android.app.ActivityManager;
import android.app.ActivityManager.StackInfo;
import android.app.ActivityManagerNative;
@@ -147,6 +149,7 @@
" am stack start <DISPLAY_ID> <INTENT>\n" +
" am stack movetask <TASK_ID> <STACK_ID> [true|false]\n" +
" am stack resize <STACK_ID> <LEFT,TOP,RIGHT,BOTTOM>\n" +
+ " am stack size-docked-stack-test: <STEP_SIZE> <l|t|r|b> [DELAY_MS]\n" +
" am stack split <STACK_ID> <v|h> [INTENT]\n" +
" am stack positiontask <TASK_ID> <STACK_ID> <POSITION>\n" +
" am stack list\n" +
@@ -283,8 +286,11 @@
"am stack movetask: move <TASK_ID> from its current stack to the top (true) or" +
" bottom (false) of <STACK_ID>.\n" +
"\n" +
- "am stack resize: change <STACK_ID> size and position to <LEFT,TOP,RIGHT,BOTTOM>" +
- ".\n" +
+ "am stack resize: change <STACK_ID> size and position to <LEFT,TOP,RIGHT,BOTTOM>." +
+ "\n" +
+ "am stack size-docked-stack-test: test command for sizing docked stack by\n" +
+ " <STEP_SIZE> increments from the side <l>eft, <t>op, <r>ight, or <b>ottom\n" +
+ " applying the optional [DELAY_MS] between each step.\n" +
"\n" +
"am stack split: split <STACK_ID> into 2 stacks <v>ertically or <h>orizontally\n" +
" starting the new stack with [INTENT] if specified. If [INTENT] isn't\n" +
@@ -1951,6 +1957,8 @@
runStackInfo();
} else if (op.equals("split")) {
runStackSplit();
+ } else if (op.equals("size-docked-stack-test")) {
+ runStackSizeDockedStackTest();
} else {
showError("Error: unknown command '" + op + "'");
return;
@@ -2001,10 +2009,21 @@
System.err.println("Error: invalid input bounds");
return;
}
+ resizeStack(stackId, bounds, 0);
+ }
+
+ private void resizeStack(int stackId, Rect bounds, int delayMs) throws Exception {
+ if (bounds == null) {
+ showError("Error: invalid input bounds");
+ return;
+ }
try {
mAm.resizeStack(stackId, bounds);
+ Thread.sleep(delayMs);
} catch (RemoteException e) {
+ showError("Error: resizing stack " + e);
+ } catch (InterruptedException e) {
}
}
@@ -2100,6 +2119,100 @@
}
}
+ private void runStackSizeDockedStackTest() throws Exception {
+ final int stepSize = Integer.valueOf(nextArgRequired());
+ final String side = nextArgRequired();
+ final String delayStr = nextArg();
+ final int delayMs = (delayStr != null) ? Integer.valueOf(delayStr) : 0;
+
+ Rect bounds;
+ try {
+ StackInfo info = mAm.getStackInfo(DOCKED_STACK_ID);
+ if (info == null) {
+ showError("Docked stack doesn't exist");
+ return;
+ }
+ if (info.bounds == null) {
+ showError("Docked stack doesn't have a bounds");
+ return;
+ }
+ bounds = info.bounds;
+ } catch (RemoteException e) {
+ showError("Unable to get docked stack info:" + e);
+ return;
+ }
+
+ final boolean horizontalGrowth = "l".equals(side) || "r".equals(side);
+ final int changeSize = (horizontalGrowth ? bounds.width() : bounds.height()) / 2;
+ int currentPoint;
+ switch (side) {
+ case "l":
+ currentPoint = bounds.left;
+ break;
+ case "r":
+ currentPoint = bounds.right;
+ break;
+ case "t":
+ currentPoint = bounds.top;
+ break;
+ case "b":
+ currentPoint = bounds.bottom;
+ break;
+ default:
+ showError("Unknown growth side: " + side);
+ return;
+ }
+
+ final int startPoint = currentPoint;
+ final int minPoint = currentPoint - changeSize;
+ final int maxPoint = currentPoint + changeSize;
+
+ int maxChange;
+ System.out.println("Shrinking docked stack side=" + side);
+ while (currentPoint > minPoint) {
+ maxChange = Math.min(stepSize, currentPoint - minPoint);
+ currentPoint -= maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ }
+
+ System.out.println("Growing docked stack side=" + side);
+ while (currentPoint < maxPoint) {
+ maxChange = Math.min(stepSize, maxPoint - currentPoint);
+ currentPoint += maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ }
+
+ System.out.println("Back to Original size side=" + side);
+ while (currentPoint > startPoint) {
+ maxChange = Math.min(stepSize, currentPoint - startPoint);
+ currentPoint -= maxChange;
+ setBoundsSide(bounds, side, currentPoint);
+ resizeStack(DOCKED_STACK_ID, bounds, delayMs);
+ }
+ }
+
+ private void setBoundsSide(Rect bounds, String side, int value) {
+ switch (side) {
+ case "l":
+ bounds.left = value;
+ break;
+ case "r":
+ bounds.right = value;
+ break;
+ case "t":
+ bounds.top = value;
+ break;
+ case "b":
+ bounds.bottom = value;
+ break;
+ default:
+ showError("Unknown set side: " + side);
+ break;
+ }
+ }
+
private void runTask() throws Exception {
String op = nextArgRequired();
if (op.equals("lock")) {
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 449a4ab..2e02382 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -304,9 +304,9 @@
}
if (zygote) {
- runtime.start("com.android.internal.os.ZygoteInit", args);
+ runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
- runtime.start("com.android.internal.os.RuntimeInit", args);
+ runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
} else {
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index fba462b..8f361ce 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -556,15 +556,10 @@
mZip->endIteration(cookie);
- // clear screen
glShadeModel(GL_FLAT);
glDisable(GL_DITHER);
glDisable(GL_SCISSOR_TEST);
glDisable(GL_BLEND);
- glClearColor(0,0,0,1);
- glClear(GL_COLOR_BUFFER_BIT);
-
- eglSwapBuffers(mDisplay, mSurface);
glBindTexture(GL_TEXTURE_2D, 0);
glEnable(GL_TEXTURE_2D);
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 8c84b4d..a475041 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -1555,9 +1555,10 @@
}
/**
- * Copies an account from the primary user to another user.
+ * Copies an account from one user to another user.
* @param account the account to copy
- * @param user the target user
+ * @param fromUser the user to copy the account from
+ * @param toUser the target user
* @param callback Callback to invoke when the request completes,
* null for no callback
* @param handler {@link Handler} identifying the callback thread,
@@ -1567,16 +1568,18 @@
* @hide
*/
public AccountManagerFuture<Boolean> copyAccountToUser(
- final Account account, final UserHandle user,
+ final Account account, final UserHandle fromUser, final UserHandle toUser,
AccountManagerCallback<Boolean> callback, Handler handler) {
if (account == null) throw new IllegalArgumentException("account is null");
- if (user == null) throw new IllegalArgumentException("user is null");
+ if (toUser == null || fromUser == null) {
+ throw new IllegalArgumentException("fromUser and toUser cannot be null");
+ }
return new Future2Task<Boolean>(handler, callback) {
@Override
public void doWork() throws RemoteException {
mService.copyAccountToUser(
- mResponse, account, UserHandle.USER_OWNER, user.getIdentifier());
+ mResponse, account, fromUser.getIdentifier(), toUser.getIdentifier());
}
@Override
public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException {
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 8c25c58..580f721 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -405,6 +405,12 @@
public static final int COMPAT_MODE_TOGGLE = 2;
/**
+ * Invalid stack ID.
+ * @hide
+ */
+ public static final int INVALID_STACK_ID = -1;
+
+ /**
* First static stack ID.
* @hide
*/
@@ -429,10 +435,16 @@
public static final int FREEFORM_WORKSPACE_STACK_ID = FULLSCREEN_WORKSPACE_STACK_ID + 1;
/**
+ * ID of stack that occupies a dedicated region of the screen.
+ * @hide
+ */
+ public static final int DOCKED_STACK_ID = FREEFORM_WORKSPACE_STACK_ID + 1;
+
+ /**
* Last static stack stack ID.
* @hide
*/
- public static final int LAST_STATIC_STACK_ID = FREEFORM_WORKSPACE_STACK_ID;
+ public static final int LAST_STATIC_STACK_ID = DOCKED_STACK_ID;
/**
* Start of ID range used by stacks that are created dynamically.
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java
index 5f33344..b003b31 100644
--- a/core/java/android/app/ActivityManagerNative.java
+++ b/core/java/android/app/ActivityManagerNative.java
@@ -3528,12 +3528,12 @@
reply.recycle();
}
@Override
- public void resizeStack(int stackBoxId, Rect r) throws RemoteException
+ public void resizeStack(int stackId, Rect r) throws RemoteException
{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
- data.writeInt(stackBoxId);
+ data.writeInt(stackId);
r.writeToParcel(data, 0);
mRemote.transact(RESIZE_STACK_TRANSACTION, data, reply, 0);
reply.readException();
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index ee37047..061fad9 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -668,6 +668,25 @@
return 0;
}
+ /**
+ * Reset the lockout timer when asked to do so by keyguard.
+ *
+ * @param token an opaque token returned by password confirmation.
+ *
+ * @hide
+ */
+ public void resetTimeout(byte[] token) {
+ if (mService != null) {
+ try {
+ mService.resetTimeout(token);
+ } catch (RemoteException e) {
+ Log.v(TAG, "Remote exception in getAuthenticatorId(): ", e);
+ }
+ } else {
+ Log.w(TAG, "getAuthenticatorId(): Service not connected!");
+ }
+ }
+
private class MyHandler extends Handler {
private MyHandler(Context context) {
super(context.getMainLooper());
@@ -677,6 +696,7 @@
super(looper);
}
+ @Override
public void handleMessage(android.os.Message msg) {
switch(msg.what) {
case MSG_ENROLL_RESULT:
diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
index 5e233b8..3356354 100644
--- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl
+++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl
@@ -68,4 +68,7 @@
// Gets the authenticator ID for fingerprint
long getAuthenticatorId(String opPackageName);
+
+ // Reset the timeout when user authenticates with strong auth (e.g. PIN, pattern or password)
+ void resetTimeout(in byte [] cryptoToken);
}
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 0c79094..8c544f4 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -68,7 +68,7 @@
/** Send progress to listeners no more often than this (in ms). */
private static final long PUBLISH_PROGRESS_INTERVAL_MS = 500;
- /** Used to communicate with recovery. See bootable/recovery/recovery.c. */
+ /** Used to communicate with recovery. See bootable/recovery/recovery.cpp. */
private static File RECOVERY_DIR = new File("/cache/recovery");
private static File COMMAND_FILE = new File(RECOVERY_DIR, "command");
private static File UNCRYPT_FILE = new File(RECOVERY_DIR, "uncrypt_file");
@@ -506,18 +506,32 @@
String[] names = RECOVERY_DIR.list();
for (int i = 0; names != null && i < names.length; i++) {
if (names[i].startsWith(LAST_PREFIX)) continue;
- File f = new File(RECOVERY_DIR, names[i]);
- if (!f.delete()) {
- Log.e(TAG, "Can't delete: " + f);
- } else {
- Log.i(TAG, "Deleted: " + f);
- }
+ recursiveDelete(new File(RECOVERY_DIR, names[i]));
}
return log;
}
/**
+ * Internally, delete a given file or directory recursively.
+ */
+ private static void recursiveDelete(File name) {
+ if (name.isDirectory()) {
+ String[] files = name.list();
+ for (int i = 0; files != null && i < files.length; i++) {
+ File f = new File(name, files[i]);
+ recursiveDelete(f);
+ }
+ }
+
+ if (!name.delete()) {
+ Log.e(TAG, "Can't delete: " + name);
+ } else {
+ Log.i(TAG, "Deleted: " + name);
+ }
+ }
+
+ /**
* Internally, recovery treats each line of the command file as a separate
* argv, so we only need to protect against newlines and nulls.
*/
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index 9babf43..48b3c1a 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -240,9 +240,6 @@
* An application implementing a prewarm service should do the absolute minimum amount of work
* to initialize the camera in order to reduce startup time in likely case that shortly after a
* camera launch intent would be sent.
- * <p>
- * If the camera launch intent gets fired shortly after, the service will be unbound
- * asynchronously, without receiving
*/
public static final String META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE =
"android.media.still_image_camera_preview_service";
diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java
index 4dfa7db..abcd614 100644
--- a/core/java/android/widget/RelativeLayout.java
+++ b/core/java/android/widget/RelativeLayout.java
@@ -704,7 +704,7 @@
}
final int heightMode;
- if (params.width == LayoutParams.MATCH_PARENT) {
+ if (params.height == LayoutParams.MATCH_PARENT) {
heightMode = MeasureSpec.EXACTLY;
} else {
heightMode = MeasureSpec.AT_MOST;
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index ea2b30f..be26c24 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -2028,18 +2028,22 @@
}
// Save the accessibility focused view ID.
- final ViewRootImpl viewRootImpl = mContentParent.getViewRootImpl();
- final View accessFocusHost = viewRootImpl.getAccessibilityFocusedHost();
- if (accessFocusHost != null && accessFocusHost.getId() != View.NO_ID) {
- outState.putInt(ACCESSIBILITY_FOCUSED_ID_TAG, accessFocusHost.getId());
+ if (mDecor != null) {
+ final ViewRootImpl viewRootImpl = mDecor.getViewRootImpl();
+ if (viewRootImpl != null) {
+ final View accessFocusHost = viewRootImpl.getAccessibilityFocusedHost();
+ if (accessFocusHost != null && accessFocusHost.getId() != View.NO_ID) {
+ outState.putInt(ACCESSIBILITY_FOCUSED_ID_TAG, accessFocusHost.getId());
- // If we have a focused virtual node ID, save that too.
- final AccessibilityNodeInfo accessFocusedNode =
- viewRootImpl.getAccessibilityFocusedVirtualView();
- if (accessFocusedNode != null) {
- final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
- accessFocusedNode.getSourceNodeId());
- outState.putInt(ACCESSIBILITY_FOCUSED_VIRTUAL_ID_TAG, virtualNodeId);
+ // If we have a focused virtual node ID, save that too.
+ final AccessibilityNodeInfo accessFocusedNode =
+ viewRootImpl.getAccessibilityFocusedVirtualView();
+ if (accessFocusedNode != null) {
+ final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId(
+ accessFocusedNode.getSourceNodeId());
+ outState.putInt(ACCESSIBILITY_FOCUSED_VIRTUAL_ID_TAG, virtualNodeId);
+ }
+ }
}
}
@@ -2112,8 +2116,8 @@
}
private void tryRestoreAccessibilityFocus(int hostViewId, int virtualViewId) {
- if (hostViewId != View.NO_ID) {
- final View needsAccessFocus = mContentParent.findViewById(hostViewId);
+ if (hostViewId != View.NO_ID && mDecor != null) {
+ final View needsAccessFocus = mDecor.findViewById(hostViewId);
if (needsAccessFocus != null) {
if (!tryFocusingVirtualView(needsAccessFocus, virtualViewId)
&& !needsAccessFocus.requestAccessibilityFocus()) {
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 991ea25..f7a2f9f 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -565,7 +565,7 @@
*
* Returns 0 on success.
*/
-int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
+int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
{
JavaVMInitArgs initArgs;
char propBuf[PROPERTY_VALUE_MAX];
@@ -701,9 +701,13 @@
parseRuntimeOption("dalvik.vm.gctype", gctypeOptsBuf, "-Xgc:");
parseRuntimeOption("dalvik.vm.backgroundgctype", backgroundgcOptsBuf, "-XX:BackgroundGC=");
- /* enable debugging; set suspend=y to pause during VM init */
- /* use android ADB transport */
- addOption("-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y");
+ /*
+ * Enable debugging only for apps forked from zygote.
+ * Set suspend=y to pause during VM init and use android ADB transport.
+ */
+ if (zygote) {
+ addOption("-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y");
+ }
parseRuntimeOption("dalvik.vm.lockprof.threshold",
lockProfThresholdBuf,
@@ -999,7 +1003,7 @@
* Passes the main function two arguments, the class name and the specified
* options string.
*/
-void AndroidRuntime::start(const char* className, const Vector<String8>& options)
+void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
ALOGD(">>>>>> START %s uid %d <<<<<<\n",
className != NULL ? className : "(unknown)", getuid());
@@ -1035,7 +1039,7 @@
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
- if (startVm(&mJavaVM, &env) != 0) {
+ if (startVm(&mJavaVM, &env, zygote) != 0) {
return;
}
onVmCreated(env);
diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp
index 97e6bb9..5ddf235 100644
--- a/core/jni/android_graphics_Canvas.cpp
+++ b/core/jni/android_graphics_Canvas.cpp
@@ -19,8 +19,9 @@
#include "core_jni_helpers.h"
#include <androidfw/ResourceTypes.h>
-
#include <Canvas.h>
+
+#include "Bitmap.h"
#include "SkDrawFilter.h"
#include "SkGraphics.h"
#include "Paint.h"
@@ -332,19 +333,19 @@
indices, indexCount, *paint);
}
-static void drawNinePatch(JNIEnv* env, jlong canvasHandle, jobject jbitmap, jlong chunkHandle,
- jfloat left, jfloat top, jfloat right, jfloat bottom,
+static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle,
+ jlong chunkHandle, jfloat left, jfloat top, jfloat right, jfloat bottom,
jlong paintHandle, jint dstDensity, jint srcDensity) {
Canvas* canvas = get_canvas(canvasHandle);
- SkBitmap bitmap;
- GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
+ Bitmap* bitmap = reinterpret_cast<Bitmap*>(bitmapHandle);
+ SkBitmap skiaBitmap;
+ bitmap->getSkBitmap(&skiaBitmap);
const android::Res_png_9patch* chunk = reinterpret_cast<android::Res_png_9patch*>(chunkHandle);
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
if (CC_LIKELY(dstDensity == srcDensity || dstDensity == 0 || srcDensity == 0)) {
- ALOGV("Drawing unscaled 9-patch: (%g,%g)-(%g,%g)", left, top, right, bottom);
- canvas->drawNinePatch(bitmap, *chunk, left, top, right, bottom, paint);
+ canvas->drawNinePatch(skiaBitmap, *chunk, left, top, right, bottom, paint);
} else {
canvas->save(SkCanvas::kMatrixClip_SaveFlag);
@@ -358,9 +359,7 @@
}
filteredPaint.setFilterQuality(kLow_SkFilterQuality);
- ALOGV("Drawing scaled 9-patch: (0,0)-(%g,%g) srcDensity=%d destDensity=%d",
- (right-left)/scale, (bottom-top)/scale, srcDensity, dstDensity);
- canvas->drawNinePatch(bitmap, *chunk, 0, 0, (right-left)/scale, (bottom-top)/scale,
+ canvas->drawNinePatch(skiaBitmap, *chunk, 0, 0, (right-left)/scale, (bottom-top)/scale,
&filteredPaint);
canvas->restore();
@@ -788,7 +787,7 @@
{"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc},
{"native_drawPath","(JJJ)V", (void*) CanvasJNI::drawPath},
{"nativeDrawVertices", "(JII[FI[FI[II[SIIJ)V", (void*)CanvasJNI::drawVertices},
- {"native_drawNinePatch", "(JLandroid/graphics/Bitmap;JFFFFJII)V", (void*)CanvasJNI::drawNinePatch},
+ {"native_drawNinePatch", "(JJJFFFFJII)V", (void*)CanvasJNI::drawNinePatch},
{"native_drawBitmap","(JLandroid/graphics/Bitmap;FFJIII)V", (void*) CanvasJNI::drawBitmap},
{"nativeDrawBitmapMatrix", "(JLandroid/graphics/Bitmap;JJ)V", (void*)CanvasJNI::drawBitmapMatrix},
{"native_drawBitmap","(JLandroid/graphics/Bitmap;FFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect},
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 69645c7..d591f8b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2480,6 +2480,10 @@
<permission android:name="android.permission.MANAGE_FINGERPRINT"
android:protectionLevel="system|signature" />
+ <!-- Allows an app to reset fingerprint attempt counter. Reserved for the system. @hide -->
+ <permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT"
+ android:protectionLevel="signature" />
+
<!-- Allows an application to control keyguard. Only allowed for system processes.
@hide -->
<permission android:name="android.permission.CONTROL_KEYGUARD"
diff --git a/core/res/res/values-mcc334-mnc020/config.xml b/core/res/res/values-mcc334-mnc020/config.xml
new file mode 100644
index 0000000..0970517
--- /dev/null
+++ b/core/res/res/values-mcc334-mnc020/config.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, 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>
+ <bool name="config_use_sim_language_file">false</bool>
+</resources>
\ No newline at end of file
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 01ab624..7acc25d 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -491,10 +491,6 @@
<!-- Boolean indicating that wifi only link configuratios that have exact same credentials (i.e PSK) -->
<bool translatable="false" name="config_wifi_only_link_same_credential_configurations">true</bool>
- <!-- Wifi driver stop delay, in milliseconds.
- Default value is 2 minutes. -->
- <integer translatable="false" name="config_wifi_driver_stop_delay">120000</integer>
-
<!-- Wifi driver supports batched scan -->
<bool translatable="false" name="config_wifi_batched_scan_supported">false</bool>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 31cf9b8..004407f 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -393,7 +393,6 @@
<java-symbol type="integer" name="db_journal_size_limit" />
<java-symbol type="integer" name="db_wal_autocheckpoint" />
<java-symbol type="integer" name="max_action_buttons" />
- <java-symbol type="integer" name="config_wifi_driver_stop_delay" />
<java-symbol type="integer" name="config_soundEffectVolumeDb" />
<java-symbol type="integer" name="config_lockSoundVolumeDb" />
<java-symbol type="integer" name="config_multiuserMaximumUsers" />
diff --git a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
index e2077a3..5e7f127 100644
--- a/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/inputmethod/InputMethodUtilsTest.java
@@ -950,6 +950,7 @@
}
}
+ @SmallTest
public void testParseInputMethodsAndSubtypesString() {
// Trivial cases.
{
diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk
index 39458f9..3181017 100644
--- a/data/fonts/Android.mk
+++ b/data/fonts/Android.mk
@@ -17,13 +17,10 @@
LOCAL_PATH := $(call my-dir)
-# Use full Noto Sans Japanese font on the normal footprints, but
-# exclude it from SMALLER and use a subset on the CONSTRAINED ones.
+# Use full Noto Sans Japanese font on non-smaller footprints
ifneq ($(SMALLER_FONT_FOOTPRINT),true)
-ifneq ($(CONSTRAINED_FONT_FOOTPRINT),true)
FONT_NOTOSANS_JP_FULL := true
endif
-endif
##########################################
# create symlink for given font
@@ -85,32 +82,19 @@
extra_font_files :=
################################
-# Include the DroidSansFallback subset on SMALLER_FONT_FOOTPRINT builds,
-# and the full font on CONSTRAINED_FONT_FOOTPRINT ones.
+# Include the DroidSansFallback subset on SMALLER_FONT_FOOTPRINT build
ifeq ($(SMALLER_FONT_FOOTPRINT),true)
-droidsans_fallback_src := DroidSansFallback.ttf
-build_droidsans_fallback := true
-endif # SMALLER_FONT_FOOTPRINT
-
-ifeq ($(CONSTRAINED_FONT_FOOTPRINT),true)
-droidsans_fallback_src := DroidSansFallbackFull.ttf
-build_droidsans_fallback := true
-endif # CONSTRAINED_FONT_FOOTPRINT
-
-ifeq ($(build_droidsans_fallback),true)
include $(CLEAR_VARS)
LOCAL_MODULE := DroidSansFallback.ttf
-LOCAL_SRC_FILES := $(droidsans_fallback_src)
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
include $(BUILD_PREBUILT)
droidsans_fallback_src :=
-endif # build_droidsans_fallback
-
-build_droidsans_fallback :=
+endif # SMALLER_FONT_FOOTPRINT
################################
# Build the rest of font files as prebuilt.
diff --git a/docs/html/preview/download.jd b/docs/html/preview/download.jd
index de99d0d..ecc0c7e 100644
--- a/docs/html/preview/download.jd
+++ b/docs/html/preview/download.jd
@@ -247,34 +247,34 @@
<tr id="hammerhead">
<td>Nexus 5 (GSM/LTE) <br>"hammerhead"</td>
<td><a href="#top" onclick="onDownload(this)"
- >hammerhead-MPA44G-preview-3fff4cf7.tgz</a><br>
- MD5: ce86cb083174fab9f52483fa0828b23f<br>
- SHA-1: 3fff4cf707c2ce5a5efbb7238982a41d36bd7dcc
+ >hammerhead-MPA44I-preview-2ebbc049.tgz</a><br>
+ MD5: 91a924fb0c9f8e716e3b4c9954fd0dbb<br>
+ SHA-1: 2ebbc049b68c4da8baeee3e42bb94d7a965ba4a3
</td>
</tr>
<tr id="shamu">
<td>Nexus 6 <br>"shamu"</td>
<td><a href="#top" onclick="onDownload(this)"
- >shamu-MPA44G-preview-6ad5fb56.tgz</a><br>
- MD5: d1ec118d4b7dc564f048542576885985<br>
- SHA-1: 6ad5fb561e3ccc7fd8c12f8513984a64a0a265da
+ >shamu-MPA44I-preview-62b9c486.tgz</a><br>
+ MD5: ac6e58da86125073d9c395257fd42664<br>
+ SHA-1: 62b9c486fd7a5020e228d53ca5acd5c1857e48ff
</td>
</tr>
<tr id="volantis">
<td>Nexus 9 <br>"volantis"</td>
<td><a href="#top" onclick="onDownload(this)"
- >volantis-MPA44G-preview-7ff8343a.tgz</a><br>
- MD5: 2f764a8d0b2c176ab723ed7e26907075<br>
- SHA-1: 7ff8343a0545a142e6a84023940b75ab328b6ae8
+ >volantis-MPA44I-preview-5c30a6e2.tgz</a><br>
+ MD5: 7f83768757913d3fea945a661020d185<br>
+ SHA-1: 5c30a6e2acd11a81f4105b12d23ff654f534f699
</td>
</tr>
<tr id="fugu">
<td>Nexus Player <br>"fugu"</td>
<td><a href="#top" onclick="onDownload(this)"
- >fugu-MPA44G-preview-f9cc2862.tgz</a><br>
- MD5: 876fdc064836fa7ddf33d34e04fbd772<br>
- SHA-1: f9cc2862fa5314393ec5780a6a9e08f9a9aacf4d
+ >fugu-MPA44I-preview-2860040a.tgz</a><br>
+ MD5: 438da8d37da9e341a69cfb16a4001ac5<br>
+ SHA-1: 2860040a326582f1ff5f702bf9a1ef002717fc98
</td>
</tr>
diff --git a/docs/html/preview/features/app-linking.jd b/docs/html/preview/features/app-linking.jd
index 5592323..b8fb300 100644
--- a/docs/html/preview/features/app-linking.jd
+++ b/docs/html/preview/features/app-linking.jd
@@ -7,61 +7,295 @@
<div id="qv">
<h2>In this document</h2>
<ol>
- <li><a href="#web-assoc">Declare a Website Association</a></li>
- <li><a href="#verfy-links">Request App Link Verification</a></li>
- <li><a href="#user-manage">Managing App Link Settings</a></li>
+ <li><a href="#url-handling">Understanding URL Request Handling</a> </li>
+ <li><a href="#intent-handler">Create an Intent Handler for URLs</a></li>
+ <li><a href="#request-verify">Request App Links Verification</a></li>
+ <li><a href="#web-assoc">Declare Website Associations</a></li>
+ <li><a href="#testing">Testing App Links</a></li>
</ol>
</div>
</div>
+
<p>
- The Android Intent system is a flexible mechanism to enable apps to handle content and requests.
- Multiple apps may declare matching URI patterns in their intent filters. When a user clicks on a
- web link that does not have a default launch handler, the platform may show a dialog for the user
- to select from a list of apps that have declared matching intent filters.
+ The M Developer Preview introduces a new option for handling web site links, allowing clicked
+ links to go directly to the website's official app, instead of asking the user to chose how to
+ handle the link. This feature saves the user time and helps developers deliver a better
+ experience. Users can also select whether an app should always open specific types of links
+ automatically or prompt the user each time.
</p>
<p>
- The Android M Developer Preview introduces support for App Links, which improves upon existing
- link handling by allowing app developers to associate an app with a web domain they own. When
- developers create this association, the platform can automatically determine the default app used
- to handle a particular web link and skip asking users.
+ Handling links automatically requires the cooperation of app developers and website owners.
+ Developers must configure their apps to declare connections with websites and request
+ verification. Website owners can publish a
+ Digital Asset Links file
+ to allow Android to verify the association of apps with their sites. The general steps for
+ creating verified app links are as follows:
</p>
+<ol>
+ <li>Create intent filters within your app for your website URLs</li>
+ <li>Configure your app to request verification of app links</li>
+ <li>Publish a Digital Asset Links JSON file on your websites</li>
+</ol>
-<h2 id="web-assoc">Declare a Website Association</h2>
+<h2 id="url-handling">Understanding URL Request Handling</h2>
<p>
- Website owners must declare associations with apps to establish an app link. The site owner
- declares the relationship to an app by hosting a JSON file, named {@code statements.json}, at the
- well-known location on the domain:
+ The app links feature allows your app to become the default handler for your website URLs, as
+ long as the user has not already chosen an app to handle that URL pattern. When a web URI intent
+ is invoked through a clicked link or programatic request, the Android system determines what app
+ is used to handle the intent. The system use these criteria, in order, to determine how to handle
+ the request:
</p>
-<pre>http://<domain>:<optional port>/.well-known/statements.json</pre>
+<ol>
+ <li>
+ <strong>User has set app link associations</strong>: If the user has designated an app to
+ handle app links, the system passes the web URI request to that app. Users set this association
+ by opening <strong>Settings > Apps > Configure apps (gear icon) > App links</strong>,
+ then selecting an app to use and configuring it's <strong>App links</strong> property to the
+ <em>Open in this app</em> option.
+ </li>
+
+ <li>
+ <strong>No association set by user and a single supporting app</strong>: If the user
+ has not set a preference that matches the web URI request, and there is only one app declaring
+ support for the intent’s URI pattern, the system passes the request to that app.
+ </li>
+
+ <li>
+ <strong>No association set by user and multiple supporting apps</strong>: If there is
+ no explicit user preference and there are multiple apps declaring support for the web URI
+ pattern, the system prompts the user to select one of the available apps
+ </li>
+</ol>
+
+<p>
+ In case #2 (no user setting and no other app handlers), if an app is newly installed and verified
+ as a handler for this type of link, the system sets it as the default handler. In the other two
+ cases, the system behavior is the same, regardless of the presence of a verified app link
+ handler.
+</p>
+
+
+<h2 id="intent-handler">Create an Intent Handler for URLs</h2>
+
+<p>
+ App links are based on the <a href="{@docRoot}guide/components/intents-filters.html">Intent</a>
+ framework, which enables apps to handle requests from the system or other apps. Multiple apps may
+ declare matching web link URI patterns in their intent filters. When a user clicks on a web link
+ that does not have a default launch handler, the platform selects an app to handle the request,
+ based on the criteria described in the previous section.
+</p>
+
+<p>
+ To enable your app to handle links, use intent filters in your app manifest to declare the URI
+ patterns to be handled by your app. The following sample code shows an intent filter that can
+ handle links to {@code http://www.android.com} and {@code https://www.android.com}:
+</p>
+
+<pre>
+ <activity ...>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
+ <data android:host="www.android.com" />
+ </intent-filter>
+ </activity>
+</pre>
+
+<p>
+ As shown in the example above, intent filters for app links must declare an {@code android:scheme}
+ value of either {@code http} or {@code https}, or both. The filter should not declare
+ any other schemes. The filter must also include the {@code android.intent.action.VIEW}; and
+ {@code android.intent.category.BROWSABLE} category names.
+</p>
+
+<p>
+ This manifest declaration defines the connection between your app and a website. However, in
+ order to have the system treat your app as the default handler for a set of URLs, you must
+ also request that the system verify this connection, which is explained in the next section.
+</p>
+
+
+<h2 id="request-verify">Request App Links Verification</h2>
+
+<p>
+ In addition to declaring an association between your app and a web site using intent filters,
+ your app must also request automatic verification with an additional manifest declaration. When
+ this declaration is set, the Android system attempts to verify your app after it is installed.
+ If the verification succeeds, and the user has not set a preference for your website URLs, the
+ system automatically routes those URL requests to your app.
+</p>
+
+<p>
+ The system performs app link verifications by comparing the host names in the data elements of
+ the app’s intent filters against the Digital Asset Links files ({@code assetlinks.json}) hosted
+ on the respective web domains. To enable the system to verify a host, make sure that your intent
+ filter declarations include the {@code android.intent.action.VIEW} intent action and {@code
+ android.intent.category.BROWSABLE} intent category.
+</p>
+
+
+<h3 id="config-verify">Enabling automatic verification</h3>
+
+<p>
+ To enable link handling verification for your app, set the {@code android:autoVerify} attribute to
+ {@code true} on at least one of the web URI intent filters in your app manifest, as shown in the
+ following manifest code snippet:
+</p>
+
+<pre>
+<activity ...>
+
+ <intent-filter <strong>android:autoVerify="true"</strong>>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT"gt;
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.android.com" />
+ <data android:scheme="https" android:host="www.android.com" />
+ </intent-filter>
+
+</activity>
+</pre>
+
+<p>
+ When the {@code android:autoVerify} attribute is set, the system attempts to verify all hosts
+ associated with web URI’s in all of your app's intent filters when the app is installed. The
+ system treats your app as the default handler for the specified URI pattern only if it
+ successfully verifies <em>all</em> app link patterns declared in your manifest.
+</p>
+
+
+<h3 id="multi-host">Supporting app linking for multiple hosts</h3>
+
+<p>
+ The system must be able to verify each host specified in the app’s web URI intent filters’ data
+ elements against the Digital Asset Links files hosted on the respective web domains. If any
+ verification fails, the app is not verified to be a default handler for any of the web URL
+ patterns defined in its intent filters. For example, an app with the following intent filters
+ would fail verification if an {@code assetlinks.json} file were not found at both
+ {@code https://www.domain1.com/.well-known/assetlinks.json} and
+ {@code https://www.domain2.com/.well-known/assetlinks.json}:
+</p>
+
+<pre>
+<application>
+
+ <activity android:name=”MainActivity”>
+ <intent-filter <strong>android:autoVerify="true"</strong>>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.domain1.com" />
+ <data android:scheme="https" android:host="www.domain1.com" />
+ </intent-filter>
+ </activity>
+ <activity android:name=”SecondActivity”>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="https" android:host="www.domain2.com" />
+ </intent-filter>
+ </activity>
+
+</application
+</pre>
+
+
+<h3 id="multi-subdomain">Supporting app linking for multiple subdomains</h3>
+
+<p>
+ The Digital Asset Links protocol treats subdomains as unique, separate hosts. If your intent
+ filter lists both the {@code www.example.com} and {@code mobile.example.com} subdomains as
+ schemes, you must host separate {@code assetlink.json} file on each subdomain. For example, an
+ app with the following intent filter declaration would pass verification only if the website
+ owner published valid {@code assetlinks.json} files at both
+ {@code https://www.example.com/.well-known/assetlinks.json} and
+ {@code https://mobile.example.com/.well-known/assetlinks.json}:
+</p>
+
+<pre>
+<application>
+ <activity android:name=”MainActivity”>
+ <intent-filter <strong>android:autoVerify="true"</strong>>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.example.com" />
+ <data android:scheme="https" android:host="mobile.example.com" />
+ </intent-filter>
+ </activity>
+</application>
+</pre>
+
+
+<h2 id="web-assoc">Declare Website Associations</h2>
+
+<p>
+ For app link verification to be successful, website owners must declare associations
+ with apps. A site owner declares the relationship to an app by hosting a Digital Asset Links JSON
+ file, with the name {@code assetlinks.json}, at the following well-known location on the domain:
+</p>
+
+<pre>
+ https://<em>domain</em>[:<em>optional_port</em>]/.well-known/assetlinks.json
+</pre>
<p class="note">
- <strong>Note:</strong>
- During the M Developer Preview period, the JSON file is verified via http protocol. For
- the official release of the platform, the file is verified over encrypted, https protocol.
+ <strong>Important:</strong> With M Preview 3 and the Android 6.0 (API level 23) release, the JSON
+ file is verified via the encrypted HTTPS protocol. Make sure that your hosted file can be
+ accessed over an HTTPS connection, regardless of whether your app's intent filter declares an
+ {@code android:scheme} setting of {@code http}, {@code https} or both.
</p>
<p>
- This JSON file indicates the Android app that should be used as the default handler for the URLs
- under this domain. It identifies the app based on these fields:
+ A Digital Asset Links JSON file indicates the Android apps that are associated with the web site.
+ The JSON file identifies associated apps with the following fields:
</p>
<ul>
<li>{@code package_name}: The package name declared in the app's manifest.</li>
- <li>{@code sha256_cert_fingerprints}: The SHA256 fingerprint of your app’s signing certificate.
+ <li>{@code sha256_cert_fingerprints}: The SHA256 fingerprints of your app’s signing certificate.
You can use the Java keytool to generate the fingerprint using the following command:
<pre>keytool -list -v -keystore my-release-key.keystore</pre>
+ This field supports multiple fingerprints, which can be used to support different versions
+ of your app, such as debug and production builds.
</li>
</ul>
<p>
- The following file listing shows an example of the contents and format of a
- {@code statements.json} file:
+ The following example {@code assetlinks.json} file grants link opening rights to a
+ {@code com.example} Android application:
+</p>
+
+<pre>
+ [{
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "com.example",
+ "sha256_cert_fingerprints":
+ ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
+ }
+ }]
+</pre>
+
+
+<h3 id="multiple-apps">Associating a website with multiple apps</h3>
+
+<p>
+ A website can declare associations with multiple apps within the same {@code assetlinks.json}
+ file. The following file listing shows an example of a statement file that declares association
+ with two, separate apps and is hosted at
+ <code>https://www.example.com/.well-known/assetlinks.json</code>:
</p>
<pre>
@@ -69,55 +303,269 @@
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
- "package_name": "<strong><package name></strong>",
- "sha256_cert_fingerprints": ["<strong>6C:EC:C5:0E:34:AE....EB:0C:9B</strong>"]
+ "package_name": <strong>"example.com.puppies.app"</strong>,
+ "sha256_cert_fingerprints":
+ ["<strong>14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5</strong>"]
+ }
+ },
+ {
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "<strong>example.com.monkeys.app</strong>",
+ "sha256_cert_fingerprints":
+ ["<strong>14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5</strong>"]
+ }
+}]
+</pre>
+
+<p>
+ When multiple apps handle links to the same host, the system determines which one to use for
+ a given link based on the intent filters defined in each app’s manifest. Different apps may
+ handle links for different resources under the same web host. For example, app1 may
+ declare an intent filter for {@code https://example.com/articles}, and app2 may declare
+ an intent filter for {@code https://example.com/videos}.
+</p>
+
+<p class="note">
+ <strong>Note:</strong> Multiple apps associated with a domain may be signed with the same or
+ different certificates.
+</p>
+
+
+<h3 id="multi-site">Associating multiple websites with a single app</h3>
+
+<p>
+ Multiple websites can declare associations with the same app in their respective {@code
+ assetlinks.json} files. The following file listings show an example of how to declare the
+ association of domain1 and domain2 with app1:
+</p>
+
+<pre>
+https://www.domain1.com/.well-known/assetlinks.json
+
+[{
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "<strong>com.mycompany.app1</strong>",
+ "sha256_cert_fingerprints":
+ ["<strong>14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5</strong>"]
+ }
+}]
+</pre>
+
+<pre>
+https://www.domain2.com/.well-known/assetlinks.json
+
+[{
+ "relation": ["delegate_permission/common.handle_all_urls"],
+ "target": {
+ "namespace": "android_app",
+ "package_name": "<strong>com.mycompany.app1</strong>",
+ "sha256_cert_fingerprints":
+ ["<strong>14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5</strong>"]
}
}]
</pre>
-<h2 id="verfy-links">Request App Link Verification</h2>
+
+<h2 id="testing">Testing App Links</h2>
<p>
- An app can request that the platform automatically verify any app links defined by the host names
- in the data elements of its intent filters against the {@code statements.json} files hosted on
- the respective web domains. To request app link verification, add an {@code android:autoVerify}
- attribute to each desired intent filter in the manifest, as shown in the following manifest code
- snippet:
+ When implementing the app linking feature, you should test the linking functionality to
+ make your app can be successfully associated with your websites and handle URL requests
+ as you expect.
+</p>
+
+
+<h3 id="test-hosts">Confirm the list of hosts to verify</h3>
+
+<p>
+ When testing, you should confirm the list of associated hosts that the system should verify
+ for your app. Make a list of all web URI’s in intent-filters in your manifest that
+ includes the following:
+</p>
+
+<ul>
+ <li>{@code android:scheme} attribute with a value of {@code http} or {@code https}
+ </li>
+ <li>{@code android:host} attribute with a domain URI pattern
+ </li>
+ <li>{@code android.intent.action.VIEW} category element
+ </li>
+ <li>{@code android.intent.category.BROWSABLE} category element
+ </li>
+</ul>
+
+<p>
+ Use this list to check that a Digital Asset Links JSON file is provided on each named host
+ and subdomain.
+</p>
+
+
+<h3 id="test-dal-files">Confirm the Digital Asset Links files</h3>
+
+<p>
+ For each website, confirm that the Digital Asset Links JSON file is properly hosted and
+ defined by using the Digital Asset Links API:
</p>
<pre>
-<activity ...>
- <intent-filter <strong>android:autoVerify="true"</strong>>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.BROWSABLE" />
- <data android:scheme="http" android:host="www.android.com" />
- <data android:scheme="https" android:host="www.android.com" />
- </intent-filter>
-</activity>
+https://digitalassetlinks.googleapis.com/v1/statements:list?
+ source.web.site=https://<strong><domain1>:<port></strong>&
+ relation=delegate_permission/common.handle_all_urls
+</pre>
+
+
+<h3 id="test-intent">Testing a web URI intent</h3>
+
+<p>
+ Once you have confirmed the list of websites to associate with your app, and you have confirmed
+ that the hosted JSON file is valid, install the app on your device. Wait at least 20 seconds for
+ the asynchronous verification process to complete. Use the following command to check
+ if the system verified your app and set the correct link handling policies:
+</p>
+
+<pre>
+adb shell am start -a android.intent.action.VIEW \
+ -c android.intent.category.BROWSABLE \
+ -d "http://<domain1>:<port>"
+</pre>
+
+
+<h3 id="check-link-policies">Check link policies</h3>
+
+<p>
+ As part of your testing process, you can check the current system settings for link handling.
+ Use the following command to get a listing of link-handling policies for all applications:
+</p>
+
+<pre>
+ adb shell dumpsys package domain-preferred-apps
+ --or--
+ adb shell dumpsys package d
+</pre>
+
+<p class="note">
+ <strong>Note:</strong> Make sure you wait at least 20 seconds after installation of your app to
+ allow for the system to complete the verification process.
+</p>
+
+<p>
+ The command returns a listing of each user or profile defined on the device,
+ indicated by a header in the following format:
+</p>
+
+<pre>
+App linkages for user 0:
</pre>
<p>
- When the {@code android:autoVerify} attribute is present in an app manifest, the platform
- attempts to verify app links when the app is installed. If the platform cannot successfully
- verify the app links, the app is not set as the preferred app to handle the web links. The next
- time a user opens one of the links, the platform falls back to presenting the user with a
- dialog.
+ Following this heading, the output lists the link-handling settings for that user in this format:
</p>
+<pre>
+Package: com.android.vending
+Domains: play.google.com market.android.com
+Status: always : 200000002
+</pre>
+
+<p>This listing indicates the what apps are associated with what domains for that user, as
+ described below:</p>
+
+<ul>
+ <li>{@code Package} - Identifies an app by its package name, as declared in its manifest.
+ </li>
+ <li>{@code Domains} - Shows the full list of hosts whose web links this app handles.
+ </li>
+ <li>{@code Status} - Shows the current link-handling setting for this app. An app that set {@code
+ android:autoVerify="true"} value and passed verification is shown with a status of {@code
+ always}. The hexadecimal number after this status is related to the Android system's record of
+ the user’s app linkage preferences. This value is not relevant for interpreting whether the
+ verification operation passed.
+ </li>
+</ul>
+
<p class="note">
- <strong>Note:</strong> In testing, there is a potential for a false positive if verfication
- fails, but the user has explicitly enabled the app to open supported links without asking, using
- the system Settings app. In this case, no dialog is shown and the link goes directly to your
- app, but only because of the user setting, and not because verification succeeded.
+ <strong>Note:</strong>It is possible for a user to change the app link settings for an app
+ before the verification operation has completed. If this
+ situation occurs, you may see a false positive for a successful verification, even though
+ verification has failed. However, the user has already explicitly enabled the app to open
+ supported links without asking. In this case, no dialog is shown and the link goes directly to
+ your app, but only because explicit user preferences take precedence.
</p>
-<h2 id="user-manage">Managing App Link Settings</h2>
+
+<h3 id="test-example">Test example</h3>
<p>
- Users can change app link settings so URLs are handled the way they prefer. You can review and
- manage app links in the system Settings app, under <strong>Settings > Apps > App Info >
- Open by default</strong>.
+ For app link verification to succeed, the system must be able to verify your app with all of
+ the websites referenced in your app’s intent filters, that meet the criteria for app links.
+ The following example manifest snippet shows app configuration with several app links defined:
</p>
+
+<pre>
+ <application>
+
+ <activity android:name=”MainActivity”>
+ <intent-filter <strong>android:autoVerify="true"</strong>>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.example.com" />
+ <data android:scheme="https" android:host="mobile.example.com" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="www.example2.com" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=”SecondActivity”>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http" android:host="account.example.com" />
+ </intent-filter>
+ </activity>
+
+ <activity android:name=”ThirdActivity”>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="http" android:host="map.example.com" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="market" android:host="example.com" />
+ </intent-filter>
+ </activity>
+
+ </application>
+</pre>
+
+<p>
+ The list of hosts that the platform would attempt to verify from the above manifest is:
+</p>
+
+<pre>
+ www.example.com
+ mobile.example.com
+ www.example2.com
+ account.example.com
+</pre>
+
+<p>
+ The list of hosts that the platform would not attempt to verify from the above manifest is:
+</p>
+
+<pre>
+ map.example.com (it does not have android.intent.category.BROWSABLE)
+ market://example.com (it does not have either an “http” or “https” scheme)
+</pre>
diff --git a/docs/html/preview/support.jd b/docs/html/preview/support.jd
index d3aa0d3..cfd9467 100644
--- a/docs/html/preview/support.jd
+++ b/docs/html/preview/support.jd
@@ -57,7 +57,7 @@
<div class="col-9of16">
<p>
<em>Date: August 2015<br>
- Build: MPA44G<br>
+ Build: MPA44I<br>
Hardware support: Nexus 5, 6, 9, Player<br>
Emulator support: x86 & ARM 32/64-bit<br>
Google Play services: 7.8</em>
@@ -151,16 +151,19 @@
</h3>
<ul>
<li>General
- <ul>
- <li>Final Permissions user interface — the permissions user interface is updated
- and some of the permissions behaviors are enhanced. </li>
- <li>Updates to the Fingerprint API — updated API that enables better error reporting,
- better fingerprint enrollment experience, plus enumeration support for greater
- reliability.</li>
- </ul>
+ <ul>
+ <li>Updated the Fingerprint API to enables better error reporting,
+ better fingerprint enrollment experience, and enumeration support for greater
+ reliability.</li>
+ <li>Modified app access to BLE and Wi-Fi scans to require the location permisssion when they
+ target Android 6.0 (API level 23) or higher. Apps targeting API 22 or earlier can
+ still perform BTLE and WiFi scans, but only when they are in the foreground. While in the background, those apps will get no results from BTLE and WiFi scans.</li>
+ </ul>
</li>
<li>Permission changes
<ul>
+ <li>Updated the user interface for permissions and enhanced some of the permissions
+ behaviors.</li>
<li>The {@link android.Manifest.permission#GET_ACCOUNTS} permission is now a member of the
{@link android.Manifest.permission_group#CONTACTS} permission group and it has a
{@code android:protectionLevel} of {@code dangerous}. This change means that when
@@ -193,6 +196,11 @@
</li>
<li>During Hangouts calls, users may experience distorted or low audio on some devices.
</li>
+ <li>The Google Apps Device Policy app bundled with MPA44G is unable to set up an Android for
+Work Profile, so you cannot create a new Work Profile with that version of the app. This issue is
+resolved in the Google Apps Device Policy app bundled with MPA44I. Other apps that provide Android
+for Work functionality remain unaffected on either build.
+ </li>
</ul>
</li>
</ul>
diff --git a/docs/html/reference/gcm_lists.js b/docs/html/reference/gcm_lists.js
new file mode 100644
index 0000000..2672fab
--- /dev/null
+++ b/docs/html/reference/gcm_lists.js
@@ -0,0 +1,18 @@
+var GCM_DATA = [
+ { id:0, label:"com.google.android.gcm", link:"reference/com/google/android/gcm/package-summary.html", type:"package", deprecated:"false" },
+ { id:1, label:"com.google.android.gcm.GCMBaseIntentService", link:"reference/com/google/android/gcm/GCMBaseIntentService.html", type:"class", deprecated:"true" },
+ { id:2, label:"com.google.android.gcm.GCMBroadcastReceiver", link:"reference/com/google/android/gcm/GCMBroadcastReceiver.html", type:"class", deprecated:"true" },
+ { id:3, label:"com.google.android.gcm.GCMConstants", link:"reference/com/google/android/gcm/GCMConstants.html", type:"class", deprecated:"true" },
+ { id:4, label:"com.google.android.gcm.GCMRegistrar", link:"reference/com/google/android/gcm/GCMRegistrar.html", type:"class", deprecated:"true" },
+ { id:5, label:"com.google.android.gcm.server", link:"reference/com/google/android/gcm/server/package-summary.html", type:"package", deprecated:"false" },
+ { id:6, label:"com.google.android.gcm.server.Constants", link:"reference/com/google/android/gcm/server/Constants.html", type:"class", deprecated:"false" },
+ { id:7, label:"com.google.android.gcm.server.InvalidRequestException", link:"reference/com/google/android/gcm/server/InvalidRequestException.html", type:"class", deprecated:"false" },
+ { id:8, label:"com.google.android.gcm.server.Message", link:"reference/com/google/android/gcm/server/Message.html", type:"class", deprecated:"false" },
+ { id:9, label:"com.google.android.gcm.server.Message.Builder", link:"reference/com/google/android/gcm/server/Message.Builder.html", type:"class", deprecated:"false" },
+ { id:10, label:"com.google.android.gcm.server.MulticastResult", link:"reference/com/google/android/gcm/server/MulticastResult.html", type:"class", deprecated:"false" },
+ { id:11, label:"com.google.android.gcm.server.MulticastResult.Builder", link:"reference/com/google/android/gcm/server/MulticastResult.Builder.html", type:"class", deprecated:"false" },
+ { id:12, label:"com.google.android.gcm.server.Result", link:"reference/com/google/android/gcm/server/Result.html", type:"class", deprecated:"false" },
+ { id:13, label:"com.google.android.gcm.server.Result.Builder", link:"reference/com/google/android/gcm/server/Result.Builder.html", type:"class", deprecated:"false" },
+ { id:14, label:"com.google.android.gcm.server.Sender", link:"reference/com/google/android/gcm/server/Sender.html", type:"class", deprecated:"false" }
+
+ ];
diff --git a/docs/html/reference/gms_lists.js b/docs/html/reference/gms_lists.js
new file mode 100644
index 0000000..942c8ab
--- /dev/null
+++ b/docs/html/reference/gms_lists.js
@@ -0,0 +1,889 @@
+var GMS_DATA = [
+ { id:0, label:"com.google.android.gms", link:"reference/com/google/android/gms/package-summary.html", type:"package", deprecated:"false" },
+ { id:1, label:"com.google.android.gms.R", link:"reference/com/google/android/gms/R.html", type:"class", deprecated:"false" },
+ { id:2, label:"com.google.android.gms.R.attr", link:"reference/com/google/android/gms/R.attr.html", type:"class", deprecated:"false" },
+ { id:3, label:"com.google.android.gms.R.color", link:"reference/com/google/android/gms/R.color.html", type:"class", deprecated:"false" },
+ { id:4, label:"com.google.android.gms.R.drawable", link:"reference/com/google/android/gms/R.drawable.html", type:"class", deprecated:"false" },
+ { id:5, label:"com.google.android.gms.R.id", link:"reference/com/google/android/gms/R.id.html", type:"class", deprecated:"false" },
+ { id:6, label:"com.google.android.gms.R.integer", link:"reference/com/google/android/gms/R.integer.html", type:"class", deprecated:"false" },
+ { id:7, label:"com.google.android.gms.R.raw", link:"reference/com/google/android/gms/R.raw.html", type:"class", deprecated:"false" },
+ { id:8, label:"com.google.android.gms.R.string", link:"reference/com/google/android/gms/R.string.html", type:"class", deprecated:"false" },
+ { id:9, label:"com.google.android.gms.R.style", link:"reference/com/google/android/gms/R.style.html", type:"class", deprecated:"false" },
+ { id:10, label:"com.google.android.gms.R.styleable", link:"reference/com/google/android/gms/R.styleable.html", type:"class", deprecated:"false" },
+ { id:11, label:"com.google.android.gms.actions", link:"reference/com/google/android/gms/actions/package-summary.html", type:"package", deprecated:"false" },
+ { id:12, label:"com.google.android.gms.actions.ItemListIntents", link:"reference/com/google/android/gms/actions/ItemListIntents.html", type:"class", deprecated:"false" },
+ { id:13, label:"com.google.android.gms.actions.NoteIntents", link:"reference/com/google/android/gms/actions/NoteIntents.html", type:"class", deprecated:"false" },
+ { id:14, label:"com.google.android.gms.actions.ReserveIntents", link:"reference/com/google/android/gms/actions/ReserveIntents.html", type:"class", deprecated:"false" },
+ { id:15, label:"com.google.android.gms.actions.SearchIntents", link:"reference/com/google/android/gms/actions/SearchIntents.html", type:"class", deprecated:"false" },
+ { id:16, label:"com.google.android.gms.ads", link:"reference/com/google/android/gms/ads/package-summary.html", type:"package", deprecated:"false" },
+ { id:17, label:"com.google.android.gms.ads.AdListener", link:"reference/com/google/android/gms/ads/AdListener.html", type:"class", deprecated:"false" },
+ { id:18, label:"com.google.android.gms.ads.AdLoader", link:"reference/com/google/android/gms/ads/AdLoader.html", type:"class", deprecated:"false" },
+ { id:19, label:"com.google.android.gms.ads.AdLoader.Builder", link:"reference/com/google/android/gms/ads/AdLoader.Builder.html", type:"class", deprecated:"false" },
+ { id:20, label:"com.google.android.gms.ads.AdRequest", link:"reference/com/google/android/gms/ads/AdRequest.html", type:"class", deprecated:"false" },
+ { id:21, label:"com.google.android.gms.ads.AdRequest.Builder", link:"reference/com/google/android/gms/ads/AdRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:22, label:"com.google.android.gms.ads.AdSize", link:"reference/com/google/android/gms/ads/AdSize.html", type:"class", deprecated:"false" },
+ { id:23, label:"com.google.android.gms.ads.AdView", link:"reference/com/google/android/gms/ads/AdView.html", type:"class", deprecated:"false" },
+ { id:24, label:"com.google.android.gms.ads.InterstitialAd", link:"reference/com/google/android/gms/ads/InterstitialAd.html", type:"class", deprecated:"false" },
+ { id:25, label:"com.google.android.gms.ads.MobileAds", link:"reference/com/google/android/gms/ads/MobileAds.html", type:"class", deprecated:"false" },
+ { id:26, label:"com.google.android.gms.ads.MobileAds.Settings", link:"reference/com/google/android/gms/ads/MobileAds.Settings.html", type:"class", deprecated:"false" },
+ { id:27, label:"com.google.android.gms.ads.doubleclick", link:"reference/com/google/android/gms/ads/doubleclick/package-summary.html", type:"package", deprecated:"false" },
+ { id:28, label:"com.google.android.gms.ads.doubleclick.AppEventListener", link:"reference/com/google/android/gms/ads/doubleclick/AppEventListener.html", type:"class", deprecated:"false" },
+ { id:29, label:"com.google.android.gms.ads.doubleclick.CustomRenderedAd", link:"reference/com/google/android/gms/ads/doubleclick/CustomRenderedAd.html", type:"class", deprecated:"false" },
+ { id:30, label:"com.google.android.gms.ads.doubleclick.OnCustomRenderedAdLoadedListener", link:"reference/com/google/android/gms/ads/doubleclick/OnCustomRenderedAdLoadedListener.html", type:"class", deprecated:"false" },
+ { id:31, label:"com.google.android.gms.ads.doubleclick.PublisherAdRequest", link:"reference/com/google/android/gms/ads/doubleclick/PublisherAdRequest.html", type:"class", deprecated:"false" },
+ { id:32, label:"com.google.android.gms.ads.doubleclick.PublisherAdRequest.Builder", link:"reference/com/google/android/gms/ads/doubleclick/PublisherAdRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:33, label:"com.google.android.gms.ads.doubleclick.PublisherAdView", link:"reference/com/google/android/gms/ads/doubleclick/PublisherAdView.html", type:"class", deprecated:"false" },
+ { id:34, label:"com.google.android.gms.ads.doubleclick.PublisherInterstitialAd", link:"reference/com/google/android/gms/ads/doubleclick/PublisherInterstitialAd.html", type:"class", deprecated:"false" },
+ { id:35, label:"com.google.android.gms.ads.formats", link:"reference/com/google/android/gms/ads/formats/package-summary.html", type:"package", deprecated:"false" },
+ { id:36, label:"com.google.android.gms.ads.formats.NativeAd", link:"reference/com/google/android/gms/ads/formats/NativeAd.html", type:"class", deprecated:"false" },
+ { id:37, label:"com.google.android.gms.ads.formats.NativeAd.Image", link:"reference/com/google/android/gms/ads/formats/NativeAd.Image.html", type:"class", deprecated:"false" },
+ { id:38, label:"com.google.android.gms.ads.formats.NativeAdOptions", link:"reference/com/google/android/gms/ads/formats/NativeAdOptions.html", type:"class", deprecated:"false" },
+ { id:39, label:"com.google.android.gms.ads.formats.NativeAdOptions.Builder", link:"reference/com/google/android/gms/ads/formats/NativeAdOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:40, label:"com.google.android.gms.ads.formats.NativeAdView", link:"reference/com/google/android/gms/ads/formats/NativeAdView.html", type:"class", deprecated:"false" },
+ { id:41, label:"com.google.android.gms.ads.formats.NativeAppInstallAd", link:"reference/com/google/android/gms/ads/formats/NativeAppInstallAd.html", type:"class", deprecated:"false" },
+ { id:42, label:"com.google.android.gms.ads.formats.NativeAppInstallAd.OnAppInstallAdLoadedListener", link:"reference/com/google/android/gms/ads/formats/NativeAppInstallAd.OnAppInstallAdLoadedListener.html", type:"class", deprecated:"false" },
+ { id:43, label:"com.google.android.gms.ads.formats.NativeAppInstallAdView", link:"reference/com/google/android/gms/ads/formats/NativeAppInstallAdView.html", type:"class", deprecated:"false" },
+ { id:44, label:"com.google.android.gms.ads.formats.NativeContentAd", link:"reference/com/google/android/gms/ads/formats/NativeContentAd.html", type:"class", deprecated:"false" },
+ { id:45, label:"com.google.android.gms.ads.formats.NativeContentAd.OnContentAdLoadedListener", link:"reference/com/google/android/gms/ads/formats/NativeContentAd.OnContentAdLoadedListener.html", type:"class", deprecated:"false" },
+ { id:46, label:"com.google.android.gms.ads.formats.NativeContentAdView", link:"reference/com/google/android/gms/ads/formats/NativeContentAdView.html", type:"class", deprecated:"false" },
+ { id:47, label:"com.google.android.gms.ads.formats.NativeCustomTemplateAd", link:"reference/com/google/android/gms/ads/formats/NativeCustomTemplateAd.html", type:"class", deprecated:"false" },
+ { id:48, label:"com.google.android.gms.ads.formats.NativeCustomTemplateAd.OnCustomClickListener", link:"reference/com/google/android/gms/ads/formats/NativeCustomTemplateAd.OnCustomClickListener.html", type:"class", deprecated:"false" },
+ { id:49, label:"com.google.android.gms.ads.formats.NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener", link:"reference/com/google/android/gms/ads/formats/NativeCustomTemplateAd.OnCustomTemplateAdLoadedListener.html", type:"class", deprecated:"false" },
+ { id:50, label:"com.google.android.gms.ads.identifier", link:"reference/com/google/android/gms/ads/identifier/package-summary.html", type:"package", deprecated:"false" },
+ { id:51, label:"com.google.android.gms.ads.identifier.AdvertisingIdClient", link:"reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.html", type:"class", deprecated:"false" },
+ { id:52, label:"com.google.android.gms.ads.identifier.AdvertisingIdClient.Info", link:"reference/com/google/android/gms/ads/identifier/AdvertisingIdClient.Info.html", type:"class", deprecated:"false" },
+ { id:53, label:"com.google.android.gms.ads.mediation", link:"reference/com/google/android/gms/ads/mediation/package-summary.html", type:"package", deprecated:"false" },
+ { id:54, label:"com.google.android.gms.ads.mediation.MediationAdRequest", link:"reference/com/google/android/gms/ads/mediation/MediationAdRequest.html", type:"class", deprecated:"false" },
+ { id:55, label:"com.google.android.gms.ads.mediation.MediationAdapter", link:"reference/com/google/android/gms/ads/mediation/MediationAdapter.html", type:"class", deprecated:"false" },
+ { id:56, label:"com.google.android.gms.ads.mediation.MediationBannerAdapter", link:"reference/com/google/android/gms/ads/mediation/MediationBannerAdapter.html", type:"class", deprecated:"false" },
+ { id:57, label:"com.google.android.gms.ads.mediation.MediationBannerListener", link:"reference/com/google/android/gms/ads/mediation/MediationBannerListener.html", type:"class", deprecated:"false" },
+ { id:58, label:"com.google.android.gms.ads.mediation.MediationInterstitialAdapter", link:"reference/com/google/android/gms/ads/mediation/MediationInterstitialAdapter.html", type:"class", deprecated:"false" },
+ { id:59, label:"com.google.android.gms.ads.mediation.MediationInterstitialListener", link:"reference/com/google/android/gms/ads/mediation/MediationInterstitialListener.html", type:"class", deprecated:"false" },
+ { id:60, label:"com.google.android.gms.ads.mediation.NativeAdMapper", link:"reference/com/google/android/gms/ads/mediation/NativeAdMapper.html", type:"class", deprecated:"false" },
+ { id:61, label:"com.google.android.gms.ads.mediation.NativeAppInstallAdMapper", link:"reference/com/google/android/gms/ads/mediation/NativeAppInstallAdMapper.html", type:"class", deprecated:"false" },
+ { id:62, label:"com.google.android.gms.ads.mediation.NativeContentAdMapper", link:"reference/com/google/android/gms/ads/mediation/NativeContentAdMapper.html", type:"class", deprecated:"false" },
+ { id:63, label:"com.google.android.gms.ads.mediation.NativeMediationAdRequest", link:"reference/com/google/android/gms/ads/mediation/NativeMediationAdRequest.html", type:"class", deprecated:"false" },
+ { id:64, label:"com.google.android.gms.ads.mediation.NetworkExtras", link:"reference/com/google/android/gms/ads/mediation/NetworkExtras.html", type:"class", deprecated:"true" },
+ { id:65, label:"com.google.android.gms.ads.mediation.admob", link:"reference/com/google/android/gms/ads/mediation/admob/package-summary.html", type:"package", deprecated:"false" },
+ { id:66, label:"com.google.android.gms.ads.mediation.admob.AdMobExtras", link:"reference/com/google/android/gms/ads/mediation/admob/AdMobExtras.html", type:"class", deprecated:"true" },
+ { id:67, label:"com.google.android.gms.ads.mediation.customevent", link:"reference/com/google/android/gms/ads/mediation/customevent/package-summary.html", type:"package", deprecated:"false" },
+ { id:68, label:"com.google.android.gms.ads.mediation.customevent.CustomEvent", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEvent.html", type:"class", deprecated:"false" },
+ { id:69, label:"com.google.android.gms.ads.mediation.customevent.CustomEventBanner", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventBanner.html", type:"class", deprecated:"false" },
+ { id:70, label:"com.google.android.gms.ads.mediation.customevent.CustomEventBannerListener", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventBannerListener.html", type:"class", deprecated:"false" },
+ { id:71, label:"com.google.android.gms.ads.mediation.customevent.CustomEventExtras", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventExtras.html", type:"class", deprecated:"true" },
+ { id:72, label:"com.google.android.gms.ads.mediation.customevent.CustomEventInterstitial", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventInterstitial.html", type:"class", deprecated:"false" },
+ { id:73, label:"com.google.android.gms.ads.mediation.customevent.CustomEventInterstitialListener", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventInterstitialListener.html", type:"class", deprecated:"false" },
+ { id:74, label:"com.google.android.gms.ads.mediation.customevent.CustomEventListener", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventListener.html", type:"class", deprecated:"false" },
+ { id:75, label:"com.google.android.gms.ads.mediation.customevent.CustomEventNative", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventNative.html", type:"class", deprecated:"false" },
+ { id:76, label:"com.google.android.gms.ads.mediation.customevent.CustomEventNativeListener", link:"reference/com/google/android/gms/ads/mediation/customevent/CustomEventNativeListener.html", type:"class", deprecated:"false" },
+ { id:77, label:"com.google.android.gms.ads.purchase", link:"reference/com/google/android/gms/ads/purchase/package-summary.html", type:"package", deprecated:"false" },
+ { id:78, label:"com.google.android.gms.ads.purchase.InAppPurchase", link:"reference/com/google/android/gms/ads/purchase/InAppPurchase.html", type:"class", deprecated:"false" },
+ { id:79, label:"com.google.android.gms.ads.purchase.InAppPurchaseListener", link:"reference/com/google/android/gms/ads/purchase/InAppPurchaseListener.html", type:"class", deprecated:"false" },
+ { id:80, label:"com.google.android.gms.ads.purchase.InAppPurchaseResult", link:"reference/com/google/android/gms/ads/purchase/InAppPurchaseResult.html", type:"class", deprecated:"false" },
+ { id:81, label:"com.google.android.gms.ads.purchase.PlayStorePurchaseListener", link:"reference/com/google/android/gms/ads/purchase/PlayStorePurchaseListener.html", type:"class", deprecated:"false" },
+ { id:82, label:"com.google.android.gms.ads.reward", link:"reference/com/google/android/gms/ads/reward/package-summary.html", type:"package", deprecated:"false" },
+ { id:83, label:"com.google.android.gms.ads.reward.RewardItem", link:"reference/com/google/android/gms/ads/reward/RewardItem.html", type:"class", deprecated:"false" },
+ { id:84, label:"com.google.android.gms.ads.reward.RewardedVideoAd", link:"reference/com/google/android/gms/ads/reward/RewardedVideoAd.html", type:"class", deprecated:"false" },
+ { id:85, label:"com.google.android.gms.ads.reward.RewardedVideoAdListener", link:"reference/com/google/android/gms/ads/reward/RewardedVideoAdListener.html", type:"class", deprecated:"false" },
+ { id:86, label:"com.google.android.gms.ads.reward.mediation", link:"reference/com/google/android/gms/ads/reward/mediation/package-summary.html", type:"package", deprecated:"false" },
+ { id:87, label:"com.google.android.gms.ads.reward.mediation.MediationRewardedVideoAdAdapter", link:"reference/com/google/android/gms/ads/reward/mediation/MediationRewardedVideoAdAdapter.html", type:"class", deprecated:"false" },
+ { id:88, label:"com.google.android.gms.ads.reward.mediation.MediationRewardedVideoAdListener", link:"reference/com/google/android/gms/ads/reward/mediation/MediationRewardedVideoAdListener.html", type:"class", deprecated:"false" },
+ { id:89, label:"com.google.android.gms.ads.search", link:"reference/com/google/android/gms/ads/search/package-summary.html", type:"package", deprecated:"false" },
+ { id:90, label:"com.google.android.gms.ads.search.SearchAdRequest", link:"reference/com/google/android/gms/ads/search/SearchAdRequest.html", type:"class", deprecated:"false" },
+ { id:91, label:"com.google.android.gms.ads.search.SearchAdRequest.Builder", link:"reference/com/google/android/gms/ads/search/SearchAdRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:92, label:"com.google.android.gms.ads.search.SearchAdView", link:"reference/com/google/android/gms/ads/search/SearchAdView.html", type:"class", deprecated:"false" },
+ { id:93, label:"com.google.android.gms.analytics", link:"reference/com/google/android/gms/analytics/package-summary.html", type:"package", deprecated:"false" },
+ { id:94, label:"com.google.android.gms.analytics.AnalyticsReceiver", link:"reference/com/google/android/gms/analytics/AnalyticsReceiver.html", type:"class", deprecated:"false" },
+ { id:95, label:"com.google.android.gms.analytics.AnalyticsService", link:"reference/com/google/android/gms/analytics/AnalyticsService.html", type:"class", deprecated:"false" },
+ { id:96, label:"com.google.android.gms.analytics.CampaignTrackingReceiver", link:"reference/com/google/android/gms/analytics/CampaignTrackingReceiver.html", type:"class", deprecated:"false" },
+ { id:97, label:"com.google.android.gms.analytics.CampaignTrackingService", link:"reference/com/google/android/gms/analytics/CampaignTrackingService.html", type:"class", deprecated:"false" },
+ { id:98, label:"com.google.android.gms.analytics.ExceptionParser", link:"reference/com/google/android/gms/analytics/ExceptionParser.html", type:"class", deprecated:"false" },
+ { id:99, label:"com.google.android.gms.analytics.ExceptionReporter", link:"reference/com/google/android/gms/analytics/ExceptionReporter.html", type:"class", deprecated:"false" },
+ { id:100, label:"com.google.android.gms.analytics.GoogleAnalytics", link:"reference/com/google/android/gms/analytics/GoogleAnalytics.html", type:"class", deprecated:"false" },
+ { id:101, label:"com.google.android.gms.analytics.HitBuilders", link:"reference/com/google/android/gms/analytics/HitBuilders.html", type:"class", deprecated:"false" },
+ { id:102, label:"com.google.android.gms.analytics.HitBuilders.AppViewBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.AppViewBuilder.html", type:"class", deprecated:"true" },
+ { id:103, label:"com.google.android.gms.analytics.HitBuilders.EventBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.EventBuilder.html", type:"class", deprecated:"false" },
+ { id:104, label:"com.google.android.gms.analytics.HitBuilders.ExceptionBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.ExceptionBuilder.html", type:"class", deprecated:"false" },
+ { id:105, label:"com.google.android.gms.analytics.HitBuilders.HitBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.HitBuilder.html", type:"class", deprecated:"false" },
+ { id:106, label:"com.google.android.gms.analytics.HitBuilders.ItemBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.ItemBuilder.html", type:"class", deprecated:"true" },
+ { id:107, label:"com.google.android.gms.analytics.HitBuilders.ScreenViewBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.ScreenViewBuilder.html", type:"class", deprecated:"false" },
+ { id:108, label:"com.google.android.gms.analytics.HitBuilders.SocialBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.SocialBuilder.html", type:"class", deprecated:"false" },
+ { id:109, label:"com.google.android.gms.analytics.HitBuilders.TimingBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.TimingBuilder.html", type:"class", deprecated:"false" },
+ { id:110, label:"com.google.android.gms.analytics.HitBuilders.TransactionBuilder", link:"reference/com/google/android/gms/analytics/HitBuilders.TransactionBuilder.html", type:"class", deprecated:"true" },
+ { id:111, label:"com.google.android.gms.analytics.Logger", link:"reference/com/google/android/gms/analytics/Logger.html", type:"class", deprecated:"true" },
+ { id:112, label:"com.google.android.gms.analytics.Logger.LogLevel", link:"reference/com/google/android/gms/analytics/Logger.LogLevel.html", type:"class", deprecated:"true" },
+ { id:113, label:"com.google.android.gms.analytics.StandardExceptionParser", link:"reference/com/google/android/gms/analytics/StandardExceptionParser.html", type:"class", deprecated:"false" },
+ { id:114, label:"com.google.android.gms.analytics.Tracker", link:"reference/com/google/android/gms/analytics/Tracker.html", type:"class", deprecated:"false" },
+ { id:115, label:"com.google.android.gms.analytics.ecommerce", link:"reference/com/google/android/gms/analytics/ecommerce/package-summary.html", type:"package", deprecated:"false" },
+ { id:116, label:"com.google.android.gms.analytics.ecommerce.Product", link:"reference/com/google/android/gms/analytics/ecommerce/Product.html", type:"class", deprecated:"false" },
+ { id:117, label:"com.google.android.gms.analytics.ecommerce.ProductAction", link:"reference/com/google/android/gms/analytics/ecommerce/ProductAction.html", type:"class", deprecated:"false" },
+ { id:118, label:"com.google.android.gms.analytics.ecommerce.Promotion", link:"reference/com/google/android/gms/analytics/ecommerce/Promotion.html", type:"class", deprecated:"false" },
+ { id:119, label:"com.google.android.gms.appindexing", link:"reference/com/google/android/gms/appindexing/package-summary.html", type:"package", deprecated:"false" },
+ { id:120, label:"com.google.android.gms.appindexing.Action", link:"reference/com/google/android/gms/appindexing/Action.html", type:"class", deprecated:"false" },
+ { id:121, label:"com.google.android.gms.appindexing.Action.Builder", link:"reference/com/google/android/gms/appindexing/Action.Builder.html", type:"class", deprecated:"false" },
+ { id:122, label:"com.google.android.gms.appindexing.AndroidAppUri", link:"reference/com/google/android/gms/appindexing/AndroidAppUri.html", type:"class", deprecated:"false" },
+ { id:123, label:"com.google.android.gms.appindexing.AppIndex", link:"reference/com/google/android/gms/appindexing/AppIndex.html", type:"class", deprecated:"false" },
+ { id:124, label:"com.google.android.gms.appindexing.AppIndexApi", link:"reference/com/google/android/gms/appindexing/AppIndexApi.html", type:"class", deprecated:"false" },
+ { id:125, label:"com.google.android.gms.appindexing.AppIndexApi.ActionResult", link:"reference/com/google/android/gms/appindexing/AppIndexApi.ActionResult.html", type:"class", deprecated:"true" },
+ { id:126, label:"com.google.android.gms.appindexing.AppIndexApi.AppIndexingLink", link:"reference/com/google/android/gms/appindexing/AppIndexApi.AppIndexingLink.html", type:"class", deprecated:"true" },
+ { id:127, label:"com.google.android.gms.appindexing.Thing", link:"reference/com/google/android/gms/appindexing/Thing.html", type:"class", deprecated:"false" },
+ { id:128, label:"com.google.android.gms.appindexing.Thing.Builder", link:"reference/com/google/android/gms/appindexing/Thing.Builder.html", type:"class", deprecated:"false" },
+ { id:129, label:"com.google.android.gms.appinvite", link:"reference/com/google/android/gms/appinvite/package-summary.html", type:"package", deprecated:"false" },
+ { id:130, label:"com.google.android.gms.appinvite.AppInvite", link:"reference/com/google/android/gms/appinvite/AppInvite.html", type:"class", deprecated:"false" },
+ { id:131, label:"com.google.android.gms.appinvite.AppInviteApi", link:"reference/com/google/android/gms/appinvite/AppInviteApi.html", type:"class", deprecated:"false" },
+ { id:132, label:"com.google.android.gms.appinvite.AppInviteInvitation", link:"reference/com/google/android/gms/appinvite/AppInviteInvitation.html", type:"class", deprecated:"false" },
+ { id:133, label:"com.google.android.gms.appinvite.AppInviteInvitation.IntentBuilder", link:"reference/com/google/android/gms/appinvite/AppInviteInvitation.IntentBuilder.html", type:"class", deprecated:"false" },
+ { id:134, label:"com.google.android.gms.appinvite.AppInviteReferral", link:"reference/com/google/android/gms/appinvite/AppInviteReferral.html", type:"class", deprecated:"false" },
+ { id:135, label:"com.google.android.gms.appstate", link:"reference/com/google/android/gms/appstate/package-summary.html", type:"package", deprecated:"false" },
+ { id:136, label:"com.google.android.gms.appstate.AppState", link:"reference/com/google/android/gms/appstate/AppState.html", type:"class", deprecated:"true" },
+ { id:137, label:"com.google.android.gms.appstate.AppStateBuffer", link:"reference/com/google/android/gms/appstate/AppStateBuffer.html", type:"class", deprecated:"false" },
+ { id:138, label:"com.google.android.gms.appstate.AppStateManager", link:"reference/com/google/android/gms/appstate/AppStateManager.html", type:"class", deprecated:"true" },
+ { id:139, label:"com.google.android.gms.appstate.AppStateManager.StateConflictResult", link:"reference/com/google/android/gms/appstate/AppStateManager.StateConflictResult.html", type:"class", deprecated:"false" },
+ { id:140, label:"com.google.android.gms.appstate.AppStateManager.StateDeletedResult", link:"reference/com/google/android/gms/appstate/AppStateManager.StateDeletedResult.html", type:"class", deprecated:"false" },
+ { id:141, label:"com.google.android.gms.appstate.AppStateManager.StateListResult", link:"reference/com/google/android/gms/appstate/AppStateManager.StateListResult.html", type:"class", deprecated:"false" },
+ { id:142, label:"com.google.android.gms.appstate.AppStateManager.StateLoadedResult", link:"reference/com/google/android/gms/appstate/AppStateManager.StateLoadedResult.html", type:"class", deprecated:"false" },
+ { id:143, label:"com.google.android.gms.appstate.AppStateManager.StateResult", link:"reference/com/google/android/gms/appstate/AppStateManager.StateResult.html", type:"class", deprecated:"false" },
+ { id:144, label:"com.google.android.gms.appstate.AppStateStatusCodes", link:"reference/com/google/android/gms/appstate/AppStateStatusCodes.html", type:"class", deprecated:"false" },
+ { id:145, label:"com.google.android.gms.auth", link:"reference/com/google/android/gms/auth/package-summary.html", type:"package", deprecated:"false" },
+ { id:146, label:"com.google.android.gms.auth.AccountChangeEvent", link:"reference/com/google/android/gms/auth/AccountChangeEvent.html", type:"class", deprecated:"false" },
+ { id:147, label:"com.google.android.gms.auth.AccountChangeEventsRequest", link:"reference/com/google/android/gms/auth/AccountChangeEventsRequest.html", type:"class", deprecated:"false" },
+ { id:148, label:"com.google.android.gms.auth.AccountChangeEventsResponse", link:"reference/com/google/android/gms/auth/AccountChangeEventsResponse.html", type:"class", deprecated:"false" },
+ { id:149, label:"com.google.android.gms.auth.GoogleAuthException", link:"reference/com/google/android/gms/auth/GoogleAuthException.html", type:"class", deprecated:"false" },
+ { id:150, label:"com.google.android.gms.auth.GoogleAuthUtil", link:"reference/com/google/android/gms/auth/GoogleAuthUtil.html", type:"class", deprecated:"false" },
+ { id:151, label:"com.google.android.gms.auth.GooglePlayServicesAvailabilityException", link:"reference/com/google/android/gms/auth/GooglePlayServicesAvailabilityException.html", type:"class", deprecated:"false" },
+ { id:152, label:"com.google.android.gms.auth.UserRecoverableAuthException", link:"reference/com/google/android/gms/auth/UserRecoverableAuthException.html", type:"class", deprecated:"false" },
+ { id:153, label:"com.google.android.gms.auth.UserRecoverableNotifiedException", link:"reference/com/google/android/gms/auth/UserRecoverableNotifiedException.html", type:"class", deprecated:"false" },
+ { id:154, label:"com.google.android.gms.auth.api", link:"reference/com/google/android/gms/auth/api/package-summary.html", type:"package", deprecated:"false" },
+ { id:155, label:"com.google.android.gms.auth.api.Auth", link:"reference/com/google/android/gms/auth/api/Auth.html", type:"class", deprecated:"false" },
+ { id:156, label:"com.google.android.gms.auth.api.Auth.AuthCredentialsOptions", link:"reference/com/google/android/gms/auth/api/Auth.AuthCredentialsOptions.html", type:"class", deprecated:"false" },
+ { id:157, label:"com.google.android.gms.auth.api.Auth.AuthCredentialsOptions.Builder", link:"reference/com/google/android/gms/auth/api/Auth.AuthCredentialsOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:158, label:"com.google.android.gms.auth.api.credentials", link:"reference/com/google/android/gms/auth/api/credentials/package-summary.html", type:"package", deprecated:"false" },
+ { id:159, label:"com.google.android.gms.auth.api.credentials.Credential", link:"reference/com/google/android/gms/auth/api/credentials/Credential.html", type:"class", deprecated:"false" },
+ { id:160, label:"com.google.android.gms.auth.api.credentials.Credential.Builder", link:"reference/com/google/android/gms/auth/api/credentials/Credential.Builder.html", type:"class", deprecated:"false" },
+ { id:161, label:"com.google.android.gms.auth.api.credentials.CredentialPickerConfig", link:"reference/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.html", type:"class", deprecated:"false" },
+ { id:162, label:"com.google.android.gms.auth.api.credentials.CredentialPickerConfig.Builder", link:"reference/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.Builder.html", type:"class", deprecated:"false" },
+ { id:163, label:"com.google.android.gms.auth.api.credentials.CredentialRequest", link:"reference/com/google/android/gms/auth/api/credentials/CredentialRequest.html", type:"class", deprecated:"false" },
+ { id:164, label:"com.google.android.gms.auth.api.credentials.CredentialRequest.Builder", link:"reference/com/google/android/gms/auth/api/credentials/CredentialRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:165, label:"com.google.android.gms.auth.api.credentials.CredentialRequestResult", link:"reference/com/google/android/gms/auth/api/credentials/CredentialRequestResult.html", type:"class", deprecated:"false" },
+ { id:166, label:"com.google.android.gms.auth.api.credentials.CredentialsApi", link:"reference/com/google/android/gms/auth/api/credentials/CredentialsApi.html", type:"class", deprecated:"false" },
+ { id:167, label:"com.google.android.gms.auth.api.credentials.IdentityProviders", link:"reference/com/google/android/gms/auth/api/credentials/IdentityProviders.html", type:"class", deprecated:"false" },
+ { id:168, label:"com.google.android.gms.cast", link:"reference/com/google/android/gms/cast/package-summary.html", type:"package", deprecated:"false" },
+ { id:169, label:"com.google.android.gms.cast.ApplicationMetadata", link:"reference/com/google/android/gms/cast/ApplicationMetadata.html", type:"class", deprecated:"false" },
+ { id:170, label:"com.google.android.gms.cast.Cast", link:"reference/com/google/android/gms/cast/Cast.html", type:"class", deprecated:"false" },
+ { id:171, label:"com.google.android.gms.cast.Cast.ApplicationConnectionResult", link:"reference/com/google/android/gms/cast/Cast.ApplicationConnectionResult.html", type:"class", deprecated:"false" },
+ { id:172, label:"com.google.android.gms.cast.Cast.CastApi", link:"reference/com/google/android/gms/cast/Cast.CastApi.html", type:"class", deprecated:"false" },
+ { id:173, label:"com.google.android.gms.cast.Cast.CastOptions", link:"reference/com/google/android/gms/cast/Cast.CastOptions.html", type:"class", deprecated:"false" },
+ { id:174, label:"com.google.android.gms.cast.Cast.CastOptions.Builder", link:"reference/com/google/android/gms/cast/Cast.CastOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:175, label:"com.google.android.gms.cast.Cast.Listener", link:"reference/com/google/android/gms/cast/Cast.Listener.html", type:"class", deprecated:"false" },
+ { id:176, label:"com.google.android.gms.cast.Cast.MessageReceivedCallback", link:"reference/com/google/android/gms/cast/Cast.MessageReceivedCallback.html", type:"class", deprecated:"false" },
+ { id:177, label:"com.google.android.gms.cast.CastDevice", link:"reference/com/google/android/gms/cast/CastDevice.html", type:"class", deprecated:"false" },
+ { id:178, label:"com.google.android.gms.cast.CastMediaControlIntent", link:"reference/com/google/android/gms/cast/CastMediaControlIntent.html", type:"class", deprecated:"false" },
+ { id:179, label:"com.google.android.gms.cast.CastPresentation", link:"reference/com/google/android/gms/cast/CastPresentation.html", type:"class", deprecated:"false" },
+ { id:180, label:"com.google.android.gms.cast.CastRemoteDisplay", link:"reference/com/google/android/gms/cast/CastRemoteDisplay.html", type:"class", deprecated:"false" },
+ { id:181, label:"com.google.android.gms.cast.CastRemoteDisplay.CastRemoteDisplayOptions", link:"reference/com/google/android/gms/cast/CastRemoteDisplay.CastRemoteDisplayOptions.html", type:"class", deprecated:"false" },
+ { id:182, label:"com.google.android.gms.cast.CastRemoteDisplay.CastRemoteDisplayOptions.Builder", link:"reference/com/google/android/gms/cast/CastRemoteDisplay.CastRemoteDisplayOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:183, label:"com.google.android.gms.cast.CastRemoteDisplay.CastRemoteDisplaySessionCallbacks", link:"reference/com/google/android/gms/cast/CastRemoteDisplay.CastRemoteDisplaySessionCallbacks.html", type:"class", deprecated:"false" },
+ { id:184, label:"com.google.android.gms.cast.CastRemoteDisplay.CastRemoteDisplaySessionResult", link:"reference/com/google/android/gms/cast/CastRemoteDisplay.CastRemoteDisplaySessionResult.html", type:"class", deprecated:"false" },
+ { id:185, label:"com.google.android.gms.cast.CastRemoteDisplayApi", link:"reference/com/google/android/gms/cast/CastRemoteDisplayApi.html", type:"class", deprecated:"false" },
+ { id:186, label:"com.google.android.gms.cast.CastRemoteDisplayLocalService", link:"reference/com/google/android/gms/cast/CastRemoteDisplayLocalService.html", type:"class", deprecated:"false" },
+ { id:187, label:"com.google.android.gms.cast.CastRemoteDisplayLocalService.Callbacks", link:"reference/com/google/android/gms/cast/CastRemoteDisplayLocalService.Callbacks.html", type:"class", deprecated:"false" },
+ { id:188, label:"com.google.android.gms.cast.CastRemoteDisplayLocalService.NotificationSettings", link:"reference/com/google/android/gms/cast/CastRemoteDisplayLocalService.NotificationSettings.html", type:"class", deprecated:"false" },
+ { id:189, label:"com.google.android.gms.cast.CastRemoteDisplayLocalService.NotificationSettings.Builder", link:"reference/com/google/android/gms/cast/CastRemoteDisplayLocalService.NotificationSettings.Builder.html", type:"class", deprecated:"false" },
+ { id:190, label:"com.google.android.gms.cast.CastStatusCodes", link:"reference/com/google/android/gms/cast/CastStatusCodes.html", type:"class", deprecated:"false" },
+ { id:191, label:"com.google.android.gms.cast.LaunchOptions", link:"reference/com/google/android/gms/cast/LaunchOptions.html", type:"class", deprecated:"false" },
+ { id:192, label:"com.google.android.gms.cast.LaunchOptions.Builder", link:"reference/com/google/android/gms/cast/LaunchOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:193, label:"com.google.android.gms.cast.MediaInfo", link:"reference/com/google/android/gms/cast/MediaInfo.html", type:"class", deprecated:"false" },
+ { id:194, label:"com.google.android.gms.cast.MediaInfo.Builder", link:"reference/com/google/android/gms/cast/MediaInfo.Builder.html", type:"class", deprecated:"false" },
+ { id:195, label:"com.google.android.gms.cast.MediaMetadata", link:"reference/com/google/android/gms/cast/MediaMetadata.html", type:"class", deprecated:"false" },
+ { id:196, label:"com.google.android.gms.cast.MediaQueueItem", link:"reference/com/google/android/gms/cast/MediaQueueItem.html", type:"class", deprecated:"false" },
+ { id:197, label:"com.google.android.gms.cast.MediaQueueItem.Builder", link:"reference/com/google/android/gms/cast/MediaQueueItem.Builder.html", type:"class", deprecated:"false" },
+ { id:198, label:"com.google.android.gms.cast.MediaStatus", link:"reference/com/google/android/gms/cast/MediaStatus.html", type:"class", deprecated:"false" },
+ { id:199, label:"com.google.android.gms.cast.MediaTrack", link:"reference/com/google/android/gms/cast/MediaTrack.html", type:"class", deprecated:"false" },
+ { id:200, label:"com.google.android.gms.cast.MediaTrack.Builder", link:"reference/com/google/android/gms/cast/MediaTrack.Builder.html", type:"class", deprecated:"false" },
+ { id:201, label:"com.google.android.gms.cast.RemoteMediaPlayer", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.html", type:"class", deprecated:"false" },
+ { id:202, label:"com.google.android.gms.cast.RemoteMediaPlayer.MediaChannelResult", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.MediaChannelResult.html", type:"class", deprecated:"false" },
+ { id:203, label:"com.google.android.gms.cast.RemoteMediaPlayer.OnMetadataUpdatedListener", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.OnMetadataUpdatedListener.html", type:"class", deprecated:"false" },
+ { id:204, label:"com.google.android.gms.cast.RemoteMediaPlayer.OnPreloadStatusUpdatedListener", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.OnPreloadStatusUpdatedListener.html", type:"class", deprecated:"false" },
+ { id:205, label:"com.google.android.gms.cast.RemoteMediaPlayer.OnQueueStatusUpdatedListener", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.OnQueueStatusUpdatedListener.html", type:"class", deprecated:"false" },
+ { id:206, label:"com.google.android.gms.cast.RemoteMediaPlayer.OnStatusUpdatedListener", link:"reference/com/google/android/gms/cast/RemoteMediaPlayer.OnStatusUpdatedListener.html", type:"class", deprecated:"false" },
+ { id:207, label:"com.google.android.gms.cast.TextTrackStyle", link:"reference/com/google/android/gms/cast/TextTrackStyle.html", type:"class", deprecated:"false" },
+ { id:208, label:"com.google.android.gms.cast.games", link:"reference/com/google/android/gms/cast/games/package-summary.html", type:"package", deprecated:"false" },
+ { id:209, label:"com.google.android.gms.cast.games.GameManagerClient", link:"reference/com/google/android/gms/cast/games/GameManagerClient.html", type:"class", deprecated:"false" },
+ { id:210, label:"com.google.android.gms.cast.games.GameManagerClient.GameManagerInstanceResult", link:"reference/com/google/android/gms/cast/games/GameManagerClient.GameManagerInstanceResult.html", type:"class", deprecated:"false" },
+ { id:211, label:"com.google.android.gms.cast.games.GameManagerClient.GameManagerResult", link:"reference/com/google/android/gms/cast/games/GameManagerClient.GameManagerResult.html", type:"class", deprecated:"false" },
+ { id:212, label:"com.google.android.gms.cast.games.GameManagerClient.Listener", link:"reference/com/google/android/gms/cast/games/GameManagerClient.Listener.html", type:"class", deprecated:"false" },
+ { id:213, label:"com.google.android.gms.cast.games.GameManagerState", link:"reference/com/google/android/gms/cast/games/GameManagerState.html", type:"class", deprecated:"false" },
+ { id:214, label:"com.google.android.gms.cast.games.PlayerInfo", link:"reference/com/google/android/gms/cast/games/PlayerInfo.html", type:"class", deprecated:"false" },
+ { id:215, label:"com.google.android.gms.common", link:"reference/com/google/android/gms/common/package-summary.html", type:"package", deprecated:"false" },
+ { id:216, label:"com.google.android.gms.common.AccountPicker", link:"reference/com/google/android/gms/common/AccountPicker.html", type:"class", deprecated:"false" },
+ { id:217, label:"com.google.android.gms.common.ConnectionResult", link:"reference/com/google/android/gms/common/ConnectionResult.html", type:"class", deprecated:"false" },
+ { id:218, label:"com.google.android.gms.common.ErrorDialogFragment", link:"reference/com/google/android/gms/common/ErrorDialogFragment.html", type:"class", deprecated:"false" },
+ { id:219, label:"com.google.android.gms.common.GoogleApiAvailability", link:"reference/com/google/android/gms/common/GoogleApiAvailability.html", type:"class", deprecated:"false" },
+ { id:220, label:"com.google.android.gms.common.GooglePlayServicesNotAvailableException", link:"reference/com/google/android/gms/common/GooglePlayServicesNotAvailableException.html", type:"class", deprecated:"false" },
+ { id:221, label:"com.google.android.gms.common.GooglePlayServicesRepairableException", link:"reference/com/google/android/gms/common/GooglePlayServicesRepairableException.html", type:"class", deprecated:"false" },
+ { id:222, label:"com.google.android.gms.common.GooglePlayServicesUtil", link:"reference/com/google/android/gms/common/GooglePlayServicesUtil.html", type:"class", deprecated:"false" },
+ { id:223, label:"com.google.android.gms.common.Scopes", link:"reference/com/google/android/gms/common/Scopes.html", type:"class", deprecated:"false" },
+ { id:224, label:"com.google.android.gms.common.SignInButton", link:"reference/com/google/android/gms/common/SignInButton.html", type:"class", deprecated:"false" },
+ { id:225, label:"com.google.android.gms.common.SupportErrorDialogFragment", link:"reference/com/google/android/gms/common/SupportErrorDialogFragment.html", type:"class", deprecated:"false" },
+ { id:226, label:"com.google.android.gms.common.UserRecoverableException", link:"reference/com/google/android/gms/common/UserRecoverableException.html", type:"class", deprecated:"false" },
+ { id:227, label:"com.google.android.gms.common.annotation", link:"reference/com/google/android/gms/common/annotation/package-summary.html", type:"package", deprecated:"false" },
+ { id:228, label:"com.google.android.gms.common.annotation.KeepName", link:"reference/com/google/android/gms/common/annotation/KeepName.html", type:"class", deprecated:"false" },
+ { id:229, label:"com.google.android.gms.common.api", link:"reference/com/google/android/gms/common/api/package-summary.html", type:"package", deprecated:"false" },
+ { id:230, label:"com.google.android.gms.common.api.Api", link:"reference/com/google/android/gms/common/api/Api.html", type:"class", deprecated:"false" },
+ { id:231, label:"com.google.android.gms.common.api.Api.ApiOptions", link:"reference/com/google/android/gms/common/api/Api.ApiOptions.html", type:"class", deprecated:"false" },
+ { id:232, label:"com.google.android.gms.common.api.Api.ApiOptions.HasOptions", link:"reference/com/google/android/gms/common/api/Api.ApiOptions.HasOptions.html", type:"class", deprecated:"false" },
+ { id:233, label:"com.google.android.gms.common.api.Api.ApiOptions.NoOptions", link:"reference/com/google/android/gms/common/api/Api.ApiOptions.NoOptions.html", type:"class", deprecated:"false" },
+ { id:234, label:"com.google.android.gms.common.api.Api.ApiOptions.NotRequiredOptions", link:"reference/com/google/android/gms/common/api/Api.ApiOptions.NotRequiredOptions.html", type:"class", deprecated:"false" },
+ { id:235, label:"com.google.android.gms.common.api.Api.ApiOptions.Optional", link:"reference/com/google/android/gms/common/api/Api.ApiOptions.Optional.html", type:"class", deprecated:"false" },
+ { id:236, label:"com.google.android.gms.common.api.Batch", link:"reference/com/google/android/gms/common/api/Batch.html", type:"class", deprecated:"false" },
+ { id:237, label:"com.google.android.gms.common.api.Batch.Builder", link:"reference/com/google/android/gms/common/api/Batch.Builder.html", type:"class", deprecated:"false" },
+ { id:238, label:"com.google.android.gms.common.api.BatchResult", link:"reference/com/google/android/gms/common/api/BatchResult.html", type:"class", deprecated:"false" },
+ { id:239, label:"com.google.android.gms.common.api.BatchResultToken", link:"reference/com/google/android/gms/common/api/BatchResultToken.html", type:"class", deprecated:"false" },
+ { id:240, label:"com.google.android.gms.common.api.BooleanResult", link:"reference/com/google/android/gms/common/api/BooleanResult.html", type:"class", deprecated:"false" },
+ { id:241, label:"com.google.android.gms.common.api.CommonStatusCodes", link:"reference/com/google/android/gms/common/api/CommonStatusCodes.html", type:"class", deprecated:"false" },
+ { id:242, label:"com.google.android.gms.common.api.GoogleApiClient", link:"reference/com/google/android/gms/common/api/GoogleApiClient.html", type:"class", deprecated:"false" },
+ { id:243, label:"com.google.android.gms.common.api.GoogleApiClient.Builder", link:"reference/com/google/android/gms/common/api/GoogleApiClient.Builder.html", type:"class", deprecated:"false" },
+ { id:244, label:"com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks", link:"reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks.html", type:"class", deprecated:"false" },
+ { id:245, label:"com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener", link:"reference/com/google/android/gms/common/api/GoogleApiClient.OnConnectionFailedListener.html", type:"class", deprecated:"false" },
+ { id:246, label:"com.google.android.gms.common.api.GoogleApiClient.ServerAuthCodeCallbacks", link:"reference/com/google/android/gms/common/api/GoogleApiClient.ServerAuthCodeCallbacks.html", type:"class", deprecated:"false" },
+ { id:247, label:"com.google.android.gms.common.api.GoogleApiClient.ServerAuthCodeCallbacks.CheckResult", link:"reference/com/google/android/gms/common/api/GoogleApiClient.ServerAuthCodeCallbacks.CheckResult.html", type:"class", deprecated:"false" },
+ { id:248, label:"com.google.android.gms.common.api.OptionalPendingResult", link:"reference/com/google/android/gms/common/api/OptionalPendingResult.html", type:"class", deprecated:"false" },
+ { id:249, label:"com.google.android.gms.common.api.PendingResult", link:"reference/com/google/android/gms/common/api/PendingResult.html", type:"class", deprecated:"false" },
+ { id:250, label:"com.google.android.gms.common.api.PendingResults", link:"reference/com/google/android/gms/common/api/PendingResults.html", type:"class", deprecated:"false" },
+ { id:251, label:"com.google.android.gms.common.api.Releasable", link:"reference/com/google/android/gms/common/api/Releasable.html", type:"class", deprecated:"false" },
+ { id:252, label:"com.google.android.gms.common.api.Result", link:"reference/com/google/android/gms/common/api/Result.html", type:"class", deprecated:"false" },
+ { id:253, label:"com.google.android.gms.common.api.ResultCallback", link:"reference/com/google/android/gms/common/api/ResultCallback.html", type:"class", deprecated:"false" },
+ { id:254, label:"com.google.android.gms.common.api.Scope", link:"reference/com/google/android/gms/common/api/Scope.html", type:"class", deprecated:"false" },
+ { id:255, label:"com.google.android.gms.common.api.Status", link:"reference/com/google/android/gms/common/api/Status.html", type:"class", deprecated:"false" },
+ { id:256, label:"com.google.android.gms.common.data", link:"reference/com/google/android/gms/common/data/package-summary.html", type:"package", deprecated:"false" },
+ { id:257, label:"com.google.android.gms.common.data.AbstractDataBuffer", link:"reference/com/google/android/gms/common/data/AbstractDataBuffer.html", type:"class", deprecated:"false" },
+ { id:258, label:"com.google.android.gms.common.data.DataBuffer", link:"reference/com/google/android/gms/common/data/DataBuffer.html", type:"class", deprecated:"false" },
+ { id:259, label:"com.google.android.gms.common.data.DataBufferObserver", link:"reference/com/google/android/gms/common/data/DataBufferObserver.html", type:"class", deprecated:"false" },
+ { id:260, label:"com.google.android.gms.common.data.DataBufferObserver.Observable", link:"reference/com/google/android/gms/common/data/DataBufferObserver.Observable.html", type:"class", deprecated:"false" },
+ { id:261, label:"com.google.android.gms.common.data.DataBufferObserverSet", link:"reference/com/google/android/gms/common/data/DataBufferObserverSet.html", type:"class", deprecated:"false" },
+ { id:262, label:"com.google.android.gms.common.data.DataBufferUtils", link:"reference/com/google/android/gms/common/data/DataBufferUtils.html", type:"class", deprecated:"false" },
+ { id:263, label:"com.google.android.gms.common.data.Freezable", link:"reference/com/google/android/gms/common/data/Freezable.html", type:"class", deprecated:"false" },
+ { id:264, label:"com.google.android.gms.common.data.FreezableUtils", link:"reference/com/google/android/gms/common/data/FreezableUtils.html", type:"class", deprecated:"false" },
+ { id:265, label:"com.google.android.gms.common.images", link:"reference/com/google/android/gms/common/images/package-summary.html", type:"package", deprecated:"false" },
+ { id:266, label:"com.google.android.gms.common.images.ImageManager", link:"reference/com/google/android/gms/common/images/ImageManager.html", type:"class", deprecated:"false" },
+ { id:267, label:"com.google.android.gms.common.images.ImageManager.OnImageLoadedListener", link:"reference/com/google/android/gms/common/images/ImageManager.OnImageLoadedListener.html", type:"class", deprecated:"false" },
+ { id:268, label:"com.google.android.gms.common.images.Size", link:"reference/com/google/android/gms/common/images/Size.html", type:"class", deprecated:"false" },
+ { id:269, label:"com.google.android.gms.common.images.WebImage", link:"reference/com/google/android/gms/common/images/WebImage.html", type:"class", deprecated:"false" },
+ { id:270, label:"com.google.android.gms.drive", link:"reference/com/google/android/gms/drive/package-summary.html", type:"package", deprecated:"false" },
+ { id:271, label:"com.google.android.gms.drive.CreateFileActivityBuilder", link:"reference/com/google/android/gms/drive/CreateFileActivityBuilder.html", type:"class", deprecated:"false" },
+ { id:272, label:"com.google.android.gms.drive.Drive", link:"reference/com/google/android/gms/drive/Drive.html", type:"class", deprecated:"false" },
+ { id:273, label:"com.google.android.gms.drive.DriveApi", link:"reference/com/google/android/gms/drive/DriveApi.html", type:"class", deprecated:"false" },
+ { id:274, label:"com.google.android.gms.drive.DriveApi.DriveContentsResult", link:"reference/com/google/android/gms/drive/DriveApi.DriveContentsResult.html", type:"class", deprecated:"false" },
+ { id:275, label:"com.google.android.gms.drive.DriveApi.DriveIdResult", link:"reference/com/google/android/gms/drive/DriveApi.DriveIdResult.html", type:"class", deprecated:"false" },
+ { id:276, label:"com.google.android.gms.drive.DriveApi.MetadataBufferResult", link:"reference/com/google/android/gms/drive/DriveApi.MetadataBufferResult.html", type:"class", deprecated:"false" },
+ { id:277, label:"com.google.android.gms.drive.DriveContents", link:"reference/com/google/android/gms/drive/DriveContents.html", type:"class", deprecated:"false" },
+ { id:278, label:"com.google.android.gms.drive.DriveFile", link:"reference/com/google/android/gms/drive/DriveFile.html", type:"class", deprecated:"false" },
+ { id:279, label:"com.google.android.gms.drive.DriveFile.DownloadProgressListener", link:"reference/com/google/android/gms/drive/DriveFile.DownloadProgressListener.html", type:"class", deprecated:"false" },
+ { id:280, label:"com.google.android.gms.drive.DriveFolder", link:"reference/com/google/android/gms/drive/DriveFolder.html", type:"class", deprecated:"false" },
+ { id:281, label:"com.google.android.gms.drive.DriveFolder.DriveFileResult", link:"reference/com/google/android/gms/drive/DriveFolder.DriveFileResult.html", type:"class", deprecated:"false" },
+ { id:282, label:"com.google.android.gms.drive.DriveFolder.DriveFolderResult", link:"reference/com/google/android/gms/drive/DriveFolder.DriveFolderResult.html", type:"class", deprecated:"false" },
+ { id:283, label:"com.google.android.gms.drive.DriveId", link:"reference/com/google/android/gms/drive/DriveId.html", type:"class", deprecated:"false" },
+ { id:284, label:"com.google.android.gms.drive.DrivePreferencesApi", link:"reference/com/google/android/gms/drive/DrivePreferencesApi.html", type:"class", deprecated:"false" },
+ { id:285, label:"com.google.android.gms.drive.DrivePreferencesApi.FileUploadPreferencesResult", link:"reference/com/google/android/gms/drive/DrivePreferencesApi.FileUploadPreferencesResult.html", type:"class", deprecated:"false" },
+ { id:286, label:"com.google.android.gms.drive.DriveResource", link:"reference/com/google/android/gms/drive/DriveResource.html", type:"class", deprecated:"false" },
+ { id:287, label:"com.google.android.gms.drive.DriveResource.MetadataResult", link:"reference/com/google/android/gms/drive/DriveResource.MetadataResult.html", type:"class", deprecated:"false" },
+ { id:288, label:"com.google.android.gms.drive.DriveStatusCodes", link:"reference/com/google/android/gms/drive/DriveStatusCodes.html", type:"class", deprecated:"false" },
+ { id:289, label:"com.google.android.gms.drive.ExecutionOptions", link:"reference/com/google/android/gms/drive/ExecutionOptions.html", type:"class", deprecated:"false" },
+ { id:290, label:"com.google.android.gms.drive.ExecutionOptions.Builder", link:"reference/com/google/android/gms/drive/ExecutionOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:291, label:"com.google.android.gms.drive.FileUploadPreferences", link:"reference/com/google/android/gms/drive/FileUploadPreferences.html", type:"class", deprecated:"false" },
+ { id:292, label:"com.google.android.gms.drive.Metadata", link:"reference/com/google/android/gms/drive/Metadata.html", type:"class", deprecated:"false" },
+ { id:293, label:"com.google.android.gms.drive.MetadataBuffer", link:"reference/com/google/android/gms/drive/MetadataBuffer.html", type:"class", deprecated:"false" },
+ { id:294, label:"com.google.android.gms.drive.MetadataChangeSet", link:"reference/com/google/android/gms/drive/MetadataChangeSet.html", type:"class", deprecated:"false" },
+ { id:295, label:"com.google.android.gms.drive.MetadataChangeSet.Builder", link:"reference/com/google/android/gms/drive/MetadataChangeSet.Builder.html", type:"class", deprecated:"false" },
+ { id:296, label:"com.google.android.gms.drive.OpenFileActivityBuilder", link:"reference/com/google/android/gms/drive/OpenFileActivityBuilder.html", type:"class", deprecated:"false" },
+ { id:297, label:"com.google.android.gms.drive.events", link:"reference/com/google/android/gms/drive/events/package-summary.html", type:"package", deprecated:"false" },
+ { id:298, label:"com.google.android.gms.drive.events.ChangeEvent", link:"reference/com/google/android/gms/drive/events/ChangeEvent.html", type:"class", deprecated:"false" },
+ { id:299, label:"com.google.android.gms.drive.events.ChangeListener", link:"reference/com/google/android/gms/drive/events/ChangeListener.html", type:"class", deprecated:"false" },
+ { id:300, label:"com.google.android.gms.drive.events.CompletionEvent", link:"reference/com/google/android/gms/drive/events/CompletionEvent.html", type:"class", deprecated:"false" },
+ { id:301, label:"com.google.android.gms.drive.events.CompletionListener", link:"reference/com/google/android/gms/drive/events/CompletionListener.html", type:"class", deprecated:"false" },
+ { id:302, label:"com.google.android.gms.drive.events.DriveEvent", link:"reference/com/google/android/gms/drive/events/DriveEvent.html", type:"class", deprecated:"false" },
+ { id:303, label:"com.google.android.gms.drive.events.DriveEventService", link:"reference/com/google/android/gms/drive/events/DriveEventService.html", type:"class", deprecated:"false" },
+ { id:304, label:"com.google.android.gms.drive.events.ResourceEvent", link:"reference/com/google/android/gms/drive/events/ResourceEvent.html", type:"class", deprecated:"false" },
+ { id:305, label:"com.google.android.gms.drive.metadata", link:"reference/com/google/android/gms/drive/metadata/package-summary.html", type:"package", deprecated:"false" },
+ { id:306, label:"com.google.android.gms.drive.metadata.CustomPropertyKey", link:"reference/com/google/android/gms/drive/metadata/CustomPropertyKey.html", type:"class", deprecated:"false" },
+ { id:307, label:"com.google.android.gms.drive.metadata.MetadataField", link:"reference/com/google/android/gms/drive/metadata/MetadataField.html", type:"class", deprecated:"false" },
+ { id:308, label:"com.google.android.gms.drive.metadata.SearchableCollectionMetadataField", link:"reference/com/google/android/gms/drive/metadata/SearchableCollectionMetadataField.html", type:"class", deprecated:"false" },
+ { id:309, label:"com.google.android.gms.drive.metadata.SearchableMetadataField", link:"reference/com/google/android/gms/drive/metadata/SearchableMetadataField.html", type:"class", deprecated:"false" },
+ { id:310, label:"com.google.android.gms.drive.metadata.SearchableOrderedMetadataField", link:"reference/com/google/android/gms/drive/metadata/SearchableOrderedMetadataField.html", type:"class", deprecated:"false" },
+ { id:311, label:"com.google.android.gms.drive.metadata.SortableMetadataField", link:"reference/com/google/android/gms/drive/metadata/SortableMetadataField.html", type:"class", deprecated:"false" },
+ { id:312, label:"com.google.android.gms.drive.query", link:"reference/com/google/android/gms/drive/query/package-summary.html", type:"package", deprecated:"false" },
+ { id:313, label:"com.google.android.gms.drive.query.Filter", link:"reference/com/google/android/gms/drive/query/Filter.html", type:"class", deprecated:"false" },
+ { id:314, label:"com.google.android.gms.drive.query.Filters", link:"reference/com/google/android/gms/drive/query/Filters.html", type:"class", deprecated:"false" },
+ { id:315, label:"com.google.android.gms.drive.query.Query", link:"reference/com/google/android/gms/drive/query/Query.html", type:"class", deprecated:"false" },
+ { id:316, label:"com.google.android.gms.drive.query.Query.Builder", link:"reference/com/google/android/gms/drive/query/Query.Builder.html", type:"class", deprecated:"false" },
+ { id:317, label:"com.google.android.gms.drive.query.SearchableField", link:"reference/com/google/android/gms/drive/query/SearchableField.html", type:"class", deprecated:"false" },
+ { id:318, label:"com.google.android.gms.drive.query.SortOrder", link:"reference/com/google/android/gms/drive/query/SortOrder.html", type:"class", deprecated:"false" },
+ { id:319, label:"com.google.android.gms.drive.query.SortOrder.Builder", link:"reference/com/google/android/gms/drive/query/SortOrder.Builder.html", type:"class", deprecated:"false" },
+ { id:320, label:"com.google.android.gms.drive.query.SortableField", link:"reference/com/google/android/gms/drive/query/SortableField.html", type:"class", deprecated:"false" },
+ { id:321, label:"com.google.android.gms.drive.widget", link:"reference/com/google/android/gms/drive/widget/package-summary.html", type:"package", deprecated:"false" },
+ { id:322, label:"com.google.android.gms.drive.widget.DataBufferAdapter", link:"reference/com/google/android/gms/drive/widget/DataBufferAdapter.html", type:"class", deprecated:"false" },
+ { id:323, label:"com.google.android.gms.fitness", link:"reference/com/google/android/gms/fitness/package-summary.html", type:"package", deprecated:"false" },
+ { id:324, label:"com.google.android.gms.fitness.BleApi", link:"reference/com/google/android/gms/fitness/BleApi.html", type:"class", deprecated:"false" },
+ { id:325, label:"com.google.android.gms.fitness.ConfigApi", link:"reference/com/google/android/gms/fitness/ConfigApi.html", type:"class", deprecated:"false" },
+ { id:326, label:"com.google.android.gms.fitness.Fitness", link:"reference/com/google/android/gms/fitness/Fitness.html", type:"class", deprecated:"false" },
+ { id:327, label:"com.google.android.gms.fitness.FitnessActivities", link:"reference/com/google/android/gms/fitness/FitnessActivities.html", type:"class", deprecated:"false" },
+ { id:328, label:"com.google.android.gms.fitness.FitnessStatusCodes", link:"reference/com/google/android/gms/fitness/FitnessStatusCodes.html", type:"class", deprecated:"false" },
+ { id:329, label:"com.google.android.gms.fitness.HistoryApi", link:"reference/com/google/android/gms/fitness/HistoryApi.html", type:"class", deprecated:"false" },
+ { id:330, label:"com.google.android.gms.fitness.HistoryApi.ViewIntentBuilder", link:"reference/com/google/android/gms/fitness/HistoryApi.ViewIntentBuilder.html", type:"class", deprecated:"false" },
+ { id:331, label:"com.google.android.gms.fitness.RecordingApi", link:"reference/com/google/android/gms/fitness/RecordingApi.html", type:"class", deprecated:"false" },
+ { id:332, label:"com.google.android.gms.fitness.SensorsApi", link:"reference/com/google/android/gms/fitness/SensorsApi.html", type:"class", deprecated:"false" },
+ { id:333, label:"com.google.android.gms.fitness.SessionsApi", link:"reference/com/google/android/gms/fitness/SessionsApi.html", type:"class", deprecated:"false" },
+ { id:334, label:"com.google.android.gms.fitness.SessionsApi.ViewIntentBuilder", link:"reference/com/google/android/gms/fitness/SessionsApi.ViewIntentBuilder.html", type:"class", deprecated:"false" },
+ { id:335, label:"com.google.android.gms.fitness.data", link:"reference/com/google/android/gms/fitness/data/package-summary.html", type:"package", deprecated:"false" },
+ { id:336, label:"com.google.android.gms.fitness.data.BleDevice", link:"reference/com/google/android/gms/fitness/data/BleDevice.html", type:"class", deprecated:"false" },
+ { id:337, label:"com.google.android.gms.fitness.data.Bucket", link:"reference/com/google/android/gms/fitness/data/Bucket.html", type:"class", deprecated:"false" },
+ { id:338, label:"com.google.android.gms.fitness.data.DataPoint", link:"reference/com/google/android/gms/fitness/data/DataPoint.html", type:"class", deprecated:"false" },
+ { id:339, label:"com.google.android.gms.fitness.data.DataSet", link:"reference/com/google/android/gms/fitness/data/DataSet.html", type:"class", deprecated:"false" },
+ { id:340, label:"com.google.android.gms.fitness.data.DataSource", link:"reference/com/google/android/gms/fitness/data/DataSource.html", type:"class", deprecated:"false" },
+ { id:341, label:"com.google.android.gms.fitness.data.DataSource.Builder", link:"reference/com/google/android/gms/fitness/data/DataSource.Builder.html", type:"class", deprecated:"false" },
+ { id:342, label:"com.google.android.gms.fitness.data.DataType", link:"reference/com/google/android/gms/fitness/data/DataType.html", type:"class", deprecated:"false" },
+ { id:343, label:"com.google.android.gms.fitness.data.Device", link:"reference/com/google/android/gms/fitness/data/Device.html", type:"class", deprecated:"false" },
+ { id:344, label:"com.google.android.gms.fitness.data.Field", link:"reference/com/google/android/gms/fitness/data/Field.html", type:"class", deprecated:"false" },
+ { id:345, label:"com.google.android.gms.fitness.data.Session", link:"reference/com/google/android/gms/fitness/data/Session.html", type:"class", deprecated:"false" },
+ { id:346, label:"com.google.android.gms.fitness.data.Session.Builder", link:"reference/com/google/android/gms/fitness/data/Session.Builder.html", type:"class", deprecated:"false" },
+ { id:347, label:"com.google.android.gms.fitness.data.Subscription", link:"reference/com/google/android/gms/fitness/data/Subscription.html", type:"class", deprecated:"false" },
+ { id:348, label:"com.google.android.gms.fitness.data.Value", link:"reference/com/google/android/gms/fitness/data/Value.html", type:"class", deprecated:"false" },
+ { id:349, label:"com.google.android.gms.fitness.data.WorkoutExercises", link:"reference/com/google/android/gms/fitness/data/WorkoutExercises.html", type:"class", deprecated:"false" },
+ { id:350, label:"com.google.android.gms.fitness.request", link:"reference/com/google/android/gms/fitness/request/package-summary.html", type:"package", deprecated:"false" },
+ { id:351, label:"com.google.android.gms.fitness.request.BleScanCallback", link:"reference/com/google/android/gms/fitness/request/BleScanCallback.html", type:"class", deprecated:"false" },
+ { id:352, label:"com.google.android.gms.fitness.request.DataDeleteRequest", link:"reference/com/google/android/gms/fitness/request/DataDeleteRequest.html", type:"class", deprecated:"false" },
+ { id:353, label:"com.google.android.gms.fitness.request.DataDeleteRequest.Builder", link:"reference/com/google/android/gms/fitness/request/DataDeleteRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:354, label:"com.google.android.gms.fitness.request.DataReadRequest", link:"reference/com/google/android/gms/fitness/request/DataReadRequest.html", type:"class", deprecated:"false" },
+ { id:355, label:"com.google.android.gms.fitness.request.DataReadRequest.Builder", link:"reference/com/google/android/gms/fitness/request/DataReadRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:356, label:"com.google.android.gms.fitness.request.DataSourcesRequest", link:"reference/com/google/android/gms/fitness/request/DataSourcesRequest.html", type:"class", deprecated:"false" },
+ { id:357, label:"com.google.android.gms.fitness.request.DataSourcesRequest.Builder", link:"reference/com/google/android/gms/fitness/request/DataSourcesRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:358, label:"com.google.android.gms.fitness.request.DataTypeCreateRequest", link:"reference/com/google/android/gms/fitness/request/DataTypeCreateRequest.html", type:"class", deprecated:"false" },
+ { id:359, label:"com.google.android.gms.fitness.request.DataTypeCreateRequest.Builder", link:"reference/com/google/android/gms/fitness/request/DataTypeCreateRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:360, label:"com.google.android.gms.fitness.request.OnDataPointListener", link:"reference/com/google/android/gms/fitness/request/OnDataPointListener.html", type:"class", deprecated:"false" },
+ { id:361, label:"com.google.android.gms.fitness.request.SensorRequest", link:"reference/com/google/android/gms/fitness/request/SensorRequest.html", type:"class", deprecated:"false" },
+ { id:362, label:"com.google.android.gms.fitness.request.SensorRequest.Builder", link:"reference/com/google/android/gms/fitness/request/SensorRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:363, label:"com.google.android.gms.fitness.request.SessionInsertRequest", link:"reference/com/google/android/gms/fitness/request/SessionInsertRequest.html", type:"class", deprecated:"false" },
+ { id:364, label:"com.google.android.gms.fitness.request.SessionInsertRequest.Builder", link:"reference/com/google/android/gms/fitness/request/SessionInsertRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:365, label:"com.google.android.gms.fitness.request.SessionReadRequest", link:"reference/com/google/android/gms/fitness/request/SessionReadRequest.html", type:"class", deprecated:"false" },
+ { id:366, label:"com.google.android.gms.fitness.request.SessionReadRequest.Builder", link:"reference/com/google/android/gms/fitness/request/SessionReadRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:367, label:"com.google.android.gms.fitness.request.StartBleScanRequest", link:"reference/com/google/android/gms/fitness/request/StartBleScanRequest.html", type:"class", deprecated:"false" },
+ { id:368, label:"com.google.android.gms.fitness.request.StartBleScanRequest.Builder", link:"reference/com/google/android/gms/fitness/request/StartBleScanRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:369, label:"com.google.android.gms.fitness.result", link:"reference/com/google/android/gms/fitness/result/package-summary.html", type:"package", deprecated:"false" },
+ { id:370, label:"com.google.android.gms.fitness.result.BleDevicesResult", link:"reference/com/google/android/gms/fitness/result/BleDevicesResult.html", type:"class", deprecated:"false" },
+ { id:371, label:"com.google.android.gms.fitness.result.DailyTotalResult", link:"reference/com/google/android/gms/fitness/result/DailyTotalResult.html", type:"class", deprecated:"false" },
+ { id:372, label:"com.google.android.gms.fitness.result.DataReadResult", link:"reference/com/google/android/gms/fitness/result/DataReadResult.html", type:"class", deprecated:"false" },
+ { id:373, label:"com.google.android.gms.fitness.result.DataSourcesResult", link:"reference/com/google/android/gms/fitness/result/DataSourcesResult.html", type:"class", deprecated:"false" },
+ { id:374, label:"com.google.android.gms.fitness.result.DataTypeResult", link:"reference/com/google/android/gms/fitness/result/DataTypeResult.html", type:"class", deprecated:"false" },
+ { id:375, label:"com.google.android.gms.fitness.result.ListSubscriptionsResult", link:"reference/com/google/android/gms/fitness/result/ListSubscriptionsResult.html", type:"class", deprecated:"false" },
+ { id:376, label:"com.google.android.gms.fitness.result.SessionReadResult", link:"reference/com/google/android/gms/fitness/result/SessionReadResult.html", type:"class", deprecated:"false" },
+ { id:377, label:"com.google.android.gms.fitness.result.SessionStopResult", link:"reference/com/google/android/gms/fitness/result/SessionStopResult.html", type:"class", deprecated:"false" },
+ { id:378, label:"com.google.android.gms.fitness.service", link:"reference/com/google/android/gms/fitness/service/package-summary.html", type:"package", deprecated:"false" },
+ { id:379, label:"com.google.android.gms.fitness.service.FitnessSensorService", link:"reference/com/google/android/gms/fitness/service/FitnessSensorService.html", type:"class", deprecated:"false" },
+ { id:380, label:"com.google.android.gms.fitness.service.FitnessSensorServiceRequest", link:"reference/com/google/android/gms/fitness/service/FitnessSensorServiceRequest.html", type:"class", deprecated:"false" },
+ { id:381, label:"com.google.android.gms.fitness.service.SensorEventDispatcher", link:"reference/com/google/android/gms/fitness/service/SensorEventDispatcher.html", type:"class", deprecated:"false" },
+ { id:382, label:"com.google.android.gms.games", link:"reference/com/google/android/gms/games/package-summary.html", type:"package", deprecated:"false" },
+ { id:383, label:"com.google.android.gms.games.Game", link:"reference/com/google/android/gms/games/Game.html", type:"class", deprecated:"false" },
+ { id:384, label:"com.google.android.gms.games.GameBuffer", link:"reference/com/google/android/gms/games/GameBuffer.html", type:"class", deprecated:"false" },
+ { id:385, label:"com.google.android.gms.games.GameEntity", link:"reference/com/google/android/gms/games/GameEntity.html", type:"class", deprecated:"false" },
+ { id:386, label:"com.google.android.gms.games.Games", link:"reference/com/google/android/gms/games/Games.html", type:"class", deprecated:"false" },
+ { id:387, label:"com.google.android.gms.games.Games.GamesOptions", link:"reference/com/google/android/gms/games/Games.GamesOptions.html", type:"class", deprecated:"false" },
+ { id:388, label:"com.google.android.gms.games.Games.GamesOptions.Builder", link:"reference/com/google/android/gms/games/Games.GamesOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:389, label:"com.google.android.gms.games.GamesActivityResultCodes", link:"reference/com/google/android/gms/games/GamesActivityResultCodes.html", type:"class", deprecated:"false" },
+ { id:390, label:"com.google.android.gms.games.GamesMetadata", link:"reference/com/google/android/gms/games/GamesMetadata.html", type:"class", deprecated:"false" },
+ { id:391, label:"com.google.android.gms.games.GamesMetadata.LoadGamesResult", link:"reference/com/google/android/gms/games/GamesMetadata.LoadGamesResult.html", type:"class", deprecated:"false" },
+ { id:392, label:"com.google.android.gms.games.GamesStatusCodes", link:"reference/com/google/android/gms/games/GamesStatusCodes.html", type:"class", deprecated:"false" },
+ { id:393, label:"com.google.android.gms.games.Notifications", link:"reference/com/google/android/gms/games/Notifications.html", type:"class", deprecated:"false" },
+ { id:394, label:"com.google.android.gms.games.PageDirection", link:"reference/com/google/android/gms/games/PageDirection.html", type:"class", deprecated:"false" },
+ { id:395, label:"com.google.android.gms.games.Player", link:"reference/com/google/android/gms/games/Player.html", type:"class", deprecated:"false" },
+ { id:396, label:"com.google.android.gms.games.PlayerBuffer", link:"reference/com/google/android/gms/games/PlayerBuffer.html", type:"class", deprecated:"false" },
+ { id:397, label:"com.google.android.gms.games.PlayerEntity", link:"reference/com/google/android/gms/games/PlayerEntity.html", type:"class", deprecated:"false" },
+ { id:398, label:"com.google.android.gms.games.PlayerLevel", link:"reference/com/google/android/gms/games/PlayerLevel.html", type:"class", deprecated:"false" },
+ { id:399, label:"com.google.android.gms.games.PlayerLevelInfo", link:"reference/com/google/android/gms/games/PlayerLevelInfo.html", type:"class", deprecated:"false" },
+ { id:400, label:"com.google.android.gms.games.Players", link:"reference/com/google/android/gms/games/Players.html", type:"class", deprecated:"false" },
+ { id:401, label:"com.google.android.gms.games.Players.LoadPlayersResult", link:"reference/com/google/android/gms/games/Players.LoadPlayersResult.html", type:"class", deprecated:"false" },
+ { id:402, label:"com.google.android.gms.games.Players.LoadProfileSettingsResult", link:"reference/com/google/android/gms/games/Players.LoadProfileSettingsResult.html", type:"class", deprecated:"false" },
+ { id:403, label:"com.google.android.gms.games.achievement", link:"reference/com/google/android/gms/games/achievement/package-summary.html", type:"package", deprecated:"false" },
+ { id:404, label:"com.google.android.gms.games.achievement.Achievement", link:"reference/com/google/android/gms/games/achievement/Achievement.html", type:"class", deprecated:"false" },
+ { id:405, label:"com.google.android.gms.games.achievement.AchievementBuffer", link:"reference/com/google/android/gms/games/achievement/AchievementBuffer.html", type:"class", deprecated:"false" },
+ { id:406, label:"com.google.android.gms.games.achievement.AchievementEntity", link:"reference/com/google/android/gms/games/achievement/AchievementEntity.html", type:"class", deprecated:"false" },
+ { id:407, label:"com.google.android.gms.games.achievement.Achievements", link:"reference/com/google/android/gms/games/achievement/Achievements.html", type:"class", deprecated:"false" },
+ { id:408, label:"com.google.android.gms.games.achievement.Achievements.LoadAchievementsResult", link:"reference/com/google/android/gms/games/achievement/Achievements.LoadAchievementsResult.html", type:"class", deprecated:"false" },
+ { id:409, label:"com.google.android.gms.games.achievement.Achievements.UpdateAchievementResult", link:"reference/com/google/android/gms/games/achievement/Achievements.UpdateAchievementResult.html", type:"class", deprecated:"false" },
+ { id:410, label:"com.google.android.gms.games.event", link:"reference/com/google/android/gms/games/event/package-summary.html", type:"package", deprecated:"false" },
+ { id:411, label:"com.google.android.gms.games.event.Event", link:"reference/com/google/android/gms/games/event/Event.html", type:"class", deprecated:"false" },
+ { id:412, label:"com.google.android.gms.games.event.EventBuffer", link:"reference/com/google/android/gms/games/event/EventBuffer.html", type:"class", deprecated:"false" },
+ { id:413, label:"com.google.android.gms.games.event.EventEntity", link:"reference/com/google/android/gms/games/event/EventEntity.html", type:"class", deprecated:"false" },
+ { id:414, label:"com.google.android.gms.games.event.Events", link:"reference/com/google/android/gms/games/event/Events.html", type:"class", deprecated:"false" },
+ { id:415, label:"com.google.android.gms.games.event.Events.LoadEventsResult", link:"reference/com/google/android/gms/games/event/Events.LoadEventsResult.html", type:"class", deprecated:"false" },
+ { id:416, label:"com.google.android.gms.games.leaderboard", link:"reference/com/google/android/gms/games/leaderboard/package-summary.html", type:"package", deprecated:"false" },
+ { id:417, label:"com.google.android.gms.games.leaderboard.Leaderboard", link:"reference/com/google/android/gms/games/leaderboard/Leaderboard.html", type:"class", deprecated:"false" },
+ { id:418, label:"com.google.android.gms.games.leaderboard.LeaderboardBuffer", link:"reference/com/google/android/gms/games/leaderboard/LeaderboardBuffer.html", type:"class", deprecated:"false" },
+ { id:419, label:"com.google.android.gms.games.leaderboard.LeaderboardScore", link:"reference/com/google/android/gms/games/leaderboard/LeaderboardScore.html", type:"class", deprecated:"false" },
+ { id:420, label:"com.google.android.gms.games.leaderboard.LeaderboardScoreBuffer", link:"reference/com/google/android/gms/games/leaderboard/LeaderboardScoreBuffer.html", type:"class", deprecated:"false" },
+ { id:421, label:"com.google.android.gms.games.leaderboard.LeaderboardVariant", link:"reference/com/google/android/gms/games/leaderboard/LeaderboardVariant.html", type:"class", deprecated:"false" },
+ { id:422, label:"com.google.android.gms.games.leaderboard.Leaderboards", link:"reference/com/google/android/gms/games/leaderboard/Leaderboards.html", type:"class", deprecated:"false" },
+ { id:423, label:"com.google.android.gms.games.leaderboard.Leaderboards.LeaderboardMetadataResult", link:"reference/com/google/android/gms/games/leaderboard/Leaderboards.LeaderboardMetadataResult.html", type:"class", deprecated:"false" },
+ { id:424, label:"com.google.android.gms.games.leaderboard.Leaderboards.LoadPlayerScoreResult", link:"reference/com/google/android/gms/games/leaderboard/Leaderboards.LoadPlayerScoreResult.html", type:"class", deprecated:"false" },
+ { id:425, label:"com.google.android.gms.games.leaderboard.Leaderboards.LoadScoresResult", link:"reference/com/google/android/gms/games/leaderboard/Leaderboards.LoadScoresResult.html", type:"class", deprecated:"false" },
+ { id:426, label:"com.google.android.gms.games.leaderboard.Leaderboards.SubmitScoreResult", link:"reference/com/google/android/gms/games/leaderboard/Leaderboards.SubmitScoreResult.html", type:"class", deprecated:"false" },
+ { id:427, label:"com.google.android.gms.games.leaderboard.ScoreSubmissionData", link:"reference/com/google/android/gms/games/leaderboard/ScoreSubmissionData.html", type:"class", deprecated:"false" },
+ { id:428, label:"com.google.android.gms.games.leaderboard.ScoreSubmissionData.Result", link:"reference/com/google/android/gms/games/leaderboard/ScoreSubmissionData.Result.html", type:"class", deprecated:"false" },
+ { id:429, label:"com.google.android.gms.games.multiplayer", link:"reference/com/google/android/gms/games/multiplayer/package-summary.html", type:"package", deprecated:"false" },
+ { id:430, label:"com.google.android.gms.games.multiplayer.Invitation", link:"reference/com/google/android/gms/games/multiplayer/Invitation.html", type:"class", deprecated:"false" },
+ { id:431, label:"com.google.android.gms.games.multiplayer.InvitationBuffer", link:"reference/com/google/android/gms/games/multiplayer/InvitationBuffer.html", type:"class", deprecated:"false" },
+ { id:432, label:"com.google.android.gms.games.multiplayer.InvitationEntity", link:"reference/com/google/android/gms/games/multiplayer/InvitationEntity.html", type:"class", deprecated:"false" },
+ { id:433, label:"com.google.android.gms.games.multiplayer.Invitations", link:"reference/com/google/android/gms/games/multiplayer/Invitations.html", type:"class", deprecated:"false" },
+ { id:434, label:"com.google.android.gms.games.multiplayer.Invitations.LoadInvitationsResult", link:"reference/com/google/android/gms/games/multiplayer/Invitations.LoadInvitationsResult.html", type:"class", deprecated:"false" },
+ { id:435, label:"com.google.android.gms.games.multiplayer.Multiplayer", link:"reference/com/google/android/gms/games/multiplayer/Multiplayer.html", type:"class", deprecated:"false" },
+ { id:436, label:"com.google.android.gms.games.multiplayer.OnInvitationReceivedListener", link:"reference/com/google/android/gms/games/multiplayer/OnInvitationReceivedListener.html", type:"class", deprecated:"false" },
+ { id:437, label:"com.google.android.gms.games.multiplayer.Participant", link:"reference/com/google/android/gms/games/multiplayer/Participant.html", type:"class", deprecated:"false" },
+ { id:438, label:"com.google.android.gms.games.multiplayer.ParticipantBuffer", link:"reference/com/google/android/gms/games/multiplayer/ParticipantBuffer.html", type:"class", deprecated:"false" },
+ { id:439, label:"com.google.android.gms.games.multiplayer.ParticipantEntity", link:"reference/com/google/android/gms/games/multiplayer/ParticipantEntity.html", type:"class", deprecated:"false" },
+ { id:440, label:"com.google.android.gms.games.multiplayer.ParticipantResult", link:"reference/com/google/android/gms/games/multiplayer/ParticipantResult.html", type:"class", deprecated:"false" },
+ { id:441, label:"com.google.android.gms.games.multiplayer.ParticipantUtils", link:"reference/com/google/android/gms/games/multiplayer/ParticipantUtils.html", type:"class", deprecated:"false" },
+ { id:442, label:"com.google.android.gms.games.multiplayer.Participatable", link:"reference/com/google/android/gms/games/multiplayer/Participatable.html", type:"class", deprecated:"false" },
+ { id:443, label:"com.google.android.gms.games.multiplayer.realtime", link:"reference/com/google/android/gms/games/multiplayer/realtime/package-summary.html", type:"package", deprecated:"false" },
+ { id:444, label:"com.google.android.gms.games.multiplayer.realtime.RealTimeMessage", link:"reference/com/google/android/gms/games/multiplayer/realtime/RealTimeMessage.html", type:"class", deprecated:"false" },
+ { id:445, label:"com.google.android.gms.games.multiplayer.realtime.RealTimeMessageReceivedListener", link:"reference/com/google/android/gms/games/multiplayer/realtime/RealTimeMessageReceivedListener.html", type:"class", deprecated:"false" },
+ { id:446, label:"com.google.android.gms.games.multiplayer.realtime.RealTimeMultiplayer", link:"reference/com/google/android/gms/games/multiplayer/realtime/RealTimeMultiplayer.html", type:"class", deprecated:"false" },
+ { id:447, label:"com.google.android.gms.games.multiplayer.realtime.RealTimeMultiplayer.ReliableMessageSentCallback", link:"reference/com/google/android/gms/games/multiplayer/realtime/RealTimeMultiplayer.ReliableMessageSentCallback.html", type:"class", deprecated:"false" },
+ { id:448, label:"com.google.android.gms.games.multiplayer.realtime.Room", link:"reference/com/google/android/gms/games/multiplayer/realtime/Room.html", type:"class", deprecated:"false" },
+ { id:449, label:"com.google.android.gms.games.multiplayer.realtime.RoomConfig", link:"reference/com/google/android/gms/games/multiplayer/realtime/RoomConfig.html", type:"class", deprecated:"false" },
+ { id:450, label:"com.google.android.gms.games.multiplayer.realtime.RoomConfig.Builder", link:"reference/com/google/android/gms/games/multiplayer/realtime/RoomConfig.Builder.html", type:"class", deprecated:"false" },
+ { id:451, label:"com.google.android.gms.games.multiplayer.realtime.RoomEntity", link:"reference/com/google/android/gms/games/multiplayer/realtime/RoomEntity.html", type:"class", deprecated:"false" },
+ { id:452, label:"com.google.android.gms.games.multiplayer.realtime.RoomStatusUpdateListener", link:"reference/com/google/android/gms/games/multiplayer/realtime/RoomStatusUpdateListener.html", type:"class", deprecated:"false" },
+ { id:453, label:"com.google.android.gms.games.multiplayer.realtime.RoomUpdateListener", link:"reference/com/google/android/gms/games/multiplayer/realtime/RoomUpdateListener.html", type:"class", deprecated:"false" },
+ { id:454, label:"com.google.android.gms.games.multiplayer.turnbased", link:"reference/com/google/android/gms/games/multiplayer/turnbased/package-summary.html", type:"package", deprecated:"false" },
+ { id:455, label:"com.google.android.gms.games.multiplayer.turnbased.LoadMatchesResponse", link:"reference/com/google/android/gms/games/multiplayer/turnbased/LoadMatchesResponse.html", type:"class", deprecated:"false" },
+ { id:456, label:"com.google.android.gms.games.multiplayer.turnbased.OnTurnBasedMatchUpdateReceivedListener", link:"reference/com/google/android/gms/games/multiplayer/turnbased/OnTurnBasedMatchUpdateReceivedListener.html", type:"class", deprecated:"false" },
+ { id:457, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatch", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMatch.html", type:"class", deprecated:"false" },
+ { id:458, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchBuffer", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMatchBuffer.html", type:"class", deprecated:"false" },
+ { id:459, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMatchConfig.html", type:"class", deprecated:"false" },
+ { id:460, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchConfig.Builder", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMatchConfig.Builder.html", type:"class", deprecated:"false" },
+ { id:461, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMatchEntity", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMatchEntity.html", type:"class", deprecated:"false" },
+ { id:462, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.html", type:"class", deprecated:"false" },
+ { id:463, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.CancelMatchResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.CancelMatchResult.html", type:"class", deprecated:"false" },
+ { id:464, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.InitiateMatchResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.InitiateMatchResult.html", type:"class", deprecated:"false" },
+ { id:465, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.LeaveMatchResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.LeaveMatchResult.html", type:"class", deprecated:"false" },
+ { id:466, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.LoadMatchResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.LoadMatchResult.html", type:"class", deprecated:"false" },
+ { id:467, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.LoadMatchesResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.LoadMatchesResult.html", type:"class", deprecated:"false" },
+ { id:468, label:"com.google.android.gms.games.multiplayer.turnbased.TurnBasedMultiplayer.UpdateMatchResult", link:"reference/com/google/android/gms/games/multiplayer/turnbased/TurnBasedMultiplayer.UpdateMatchResult.html", type:"class", deprecated:"false" },
+ { id:469, label:"com.google.android.gms.games.quest", link:"reference/com/google/android/gms/games/quest/package-summary.html", type:"package", deprecated:"false" },
+ { id:470, label:"com.google.android.gms.games.quest.Milestone", link:"reference/com/google/android/gms/games/quest/Milestone.html", type:"class", deprecated:"false" },
+ { id:471, label:"com.google.android.gms.games.quest.MilestoneBuffer", link:"reference/com/google/android/gms/games/quest/MilestoneBuffer.html", type:"class", deprecated:"false" },
+ { id:472, label:"com.google.android.gms.games.quest.MilestoneEntity", link:"reference/com/google/android/gms/games/quest/MilestoneEntity.html", type:"class", deprecated:"false" },
+ { id:473, label:"com.google.android.gms.games.quest.Quest", link:"reference/com/google/android/gms/games/quest/Quest.html", type:"class", deprecated:"false" },
+ { id:474, label:"com.google.android.gms.games.quest.QuestBuffer", link:"reference/com/google/android/gms/games/quest/QuestBuffer.html", type:"class", deprecated:"false" },
+ { id:475, label:"com.google.android.gms.games.quest.QuestEntity", link:"reference/com/google/android/gms/games/quest/QuestEntity.html", type:"class", deprecated:"false" },
+ { id:476, label:"com.google.android.gms.games.quest.QuestUpdateListener", link:"reference/com/google/android/gms/games/quest/QuestUpdateListener.html", type:"class", deprecated:"false" },
+ { id:477, label:"com.google.android.gms.games.quest.Quests", link:"reference/com/google/android/gms/games/quest/Quests.html", type:"class", deprecated:"false" },
+ { id:478, label:"com.google.android.gms.games.quest.Quests.AcceptQuestResult", link:"reference/com/google/android/gms/games/quest/Quests.AcceptQuestResult.html", type:"class", deprecated:"false" },
+ { id:479, label:"com.google.android.gms.games.quest.Quests.ClaimMilestoneResult", link:"reference/com/google/android/gms/games/quest/Quests.ClaimMilestoneResult.html", type:"class", deprecated:"false" },
+ { id:480, label:"com.google.android.gms.games.quest.Quests.LoadQuestsResult", link:"reference/com/google/android/gms/games/quest/Quests.LoadQuestsResult.html", type:"class", deprecated:"false" },
+ { id:481, label:"com.google.android.gms.games.request", link:"reference/com/google/android/gms/games/request/package-summary.html", type:"package", deprecated:"false" },
+ { id:482, label:"com.google.android.gms.games.request.GameRequest", link:"reference/com/google/android/gms/games/request/GameRequest.html", type:"class", deprecated:"false" },
+ { id:483, label:"com.google.android.gms.games.request.GameRequestBuffer", link:"reference/com/google/android/gms/games/request/GameRequestBuffer.html", type:"class", deprecated:"false" },
+ { id:484, label:"com.google.android.gms.games.request.GameRequestEntity", link:"reference/com/google/android/gms/games/request/GameRequestEntity.html", type:"class", deprecated:"false" },
+ { id:485, label:"com.google.android.gms.games.request.OnRequestReceivedListener", link:"reference/com/google/android/gms/games/request/OnRequestReceivedListener.html", type:"class", deprecated:"false" },
+ { id:486, label:"com.google.android.gms.games.request.Requests", link:"reference/com/google/android/gms/games/request/Requests.html", type:"class", deprecated:"false" },
+ { id:487, label:"com.google.android.gms.games.request.Requests.LoadRequestsResult", link:"reference/com/google/android/gms/games/request/Requests.LoadRequestsResult.html", type:"class", deprecated:"false" },
+ { id:488, label:"com.google.android.gms.games.request.Requests.UpdateRequestsResult", link:"reference/com/google/android/gms/games/request/Requests.UpdateRequestsResult.html", type:"class", deprecated:"false" },
+ { id:489, label:"com.google.android.gms.games.snapshot", link:"reference/com/google/android/gms/games/snapshot/package-summary.html", type:"package", deprecated:"false" },
+ { id:490, label:"com.google.android.gms.games.snapshot.Snapshot", link:"reference/com/google/android/gms/games/snapshot/Snapshot.html", type:"class", deprecated:"false" },
+ { id:491, label:"com.google.android.gms.games.snapshot.SnapshotContents", link:"reference/com/google/android/gms/games/snapshot/SnapshotContents.html", type:"class", deprecated:"false" },
+ { id:492, label:"com.google.android.gms.games.snapshot.SnapshotEntity", link:"reference/com/google/android/gms/games/snapshot/SnapshotEntity.html", type:"class", deprecated:"false" },
+ { id:493, label:"com.google.android.gms.games.snapshot.SnapshotMetadata", link:"reference/com/google/android/gms/games/snapshot/SnapshotMetadata.html", type:"class", deprecated:"false" },
+ { id:494, label:"com.google.android.gms.games.snapshot.SnapshotMetadataBuffer", link:"reference/com/google/android/gms/games/snapshot/SnapshotMetadataBuffer.html", type:"class", deprecated:"false" },
+ { id:495, label:"com.google.android.gms.games.snapshot.SnapshotMetadataChange", link:"reference/com/google/android/gms/games/snapshot/SnapshotMetadataChange.html", type:"class", deprecated:"false" },
+ { id:496, label:"com.google.android.gms.games.snapshot.SnapshotMetadataChange.Builder", link:"reference/com/google/android/gms/games/snapshot/SnapshotMetadataChange.Builder.html", type:"class", deprecated:"false" },
+ { id:497, label:"com.google.android.gms.games.snapshot.SnapshotMetadataEntity", link:"reference/com/google/android/gms/games/snapshot/SnapshotMetadataEntity.html", type:"class", deprecated:"false" },
+ { id:498, label:"com.google.android.gms.games.snapshot.Snapshots", link:"reference/com/google/android/gms/games/snapshot/Snapshots.html", type:"class", deprecated:"false" },
+ { id:499, label:"com.google.android.gms.games.snapshot.Snapshots.CommitSnapshotResult", link:"reference/com/google/android/gms/games/snapshot/Snapshots.CommitSnapshotResult.html", type:"class", deprecated:"false" },
+ { id:500, label:"com.google.android.gms.games.snapshot.Snapshots.DeleteSnapshotResult", link:"reference/com/google/android/gms/games/snapshot/Snapshots.DeleteSnapshotResult.html", type:"class", deprecated:"false" },
+ { id:501, label:"com.google.android.gms.games.snapshot.Snapshots.LoadSnapshotsResult", link:"reference/com/google/android/gms/games/snapshot/Snapshots.LoadSnapshotsResult.html", type:"class", deprecated:"false" },
+ { id:502, label:"com.google.android.gms.games.snapshot.Snapshots.OpenSnapshotResult", link:"reference/com/google/android/gms/games/snapshot/Snapshots.OpenSnapshotResult.html", type:"class", deprecated:"false" },
+ { id:503, label:"com.google.android.gms.gcm", link:"reference/com/google/android/gms/gcm/package-summary.html", type:"package", deprecated:"false" },
+ { id:504, label:"com.google.android.gms.gcm.GcmListenerService", link:"reference/com/google/android/gms/gcm/GcmListenerService.html", type:"class", deprecated:"false" },
+ { id:505, label:"com.google.android.gms.gcm.GcmNetworkManager", link:"reference/com/google/android/gms/gcm/GcmNetworkManager.html", type:"class", deprecated:"false" },
+ { id:506, label:"com.google.android.gms.gcm.GcmPubSub", link:"reference/com/google/android/gms/gcm/GcmPubSub.html", type:"class", deprecated:"false" },
+ { id:507, label:"com.google.android.gms.gcm.GcmReceiver", link:"reference/com/google/android/gms/gcm/GcmReceiver.html", type:"class", deprecated:"false" },
+ { id:508, label:"com.google.android.gms.gcm.GcmTaskService", link:"reference/com/google/android/gms/gcm/GcmTaskService.html", type:"class", deprecated:"false" },
+ { id:509, label:"com.google.android.gms.gcm.GoogleCloudMessaging", link:"reference/com/google/android/gms/gcm/GoogleCloudMessaging.html", type:"class", deprecated:"false" },
+ { id:510, label:"com.google.android.gms.gcm.OneoffTask", link:"reference/com/google/android/gms/gcm/OneoffTask.html", type:"class", deprecated:"false" },
+ { id:511, label:"com.google.android.gms.gcm.OneoffTask.Builder", link:"reference/com/google/android/gms/gcm/OneoffTask.Builder.html", type:"class", deprecated:"false" },
+ { id:512, label:"com.google.android.gms.gcm.PeriodicTask", link:"reference/com/google/android/gms/gcm/PeriodicTask.html", type:"class", deprecated:"false" },
+ { id:513, label:"com.google.android.gms.gcm.PeriodicTask.Builder", link:"reference/com/google/android/gms/gcm/PeriodicTask.Builder.html", type:"class", deprecated:"false" },
+ { id:514, label:"com.google.android.gms.gcm.Task", link:"reference/com/google/android/gms/gcm/Task.html", type:"class", deprecated:"false" },
+ { id:515, label:"com.google.android.gms.gcm.Task.Builder", link:"reference/com/google/android/gms/gcm/Task.Builder.html", type:"class", deprecated:"false" },
+ { id:516, label:"com.google.android.gms.gcm.TaskParams", link:"reference/com/google/android/gms/gcm/TaskParams.html", type:"class", deprecated:"false" },
+ { id:517, label:"com.google.android.gms.identity.intents", link:"reference/com/google/android/gms/identity/intents/package-summary.html", type:"package", deprecated:"false" },
+ { id:518, label:"com.google.android.gms.identity.intents.Address", link:"reference/com/google/android/gms/identity/intents/Address.html", type:"class", deprecated:"false" },
+ { id:519, label:"com.google.android.gms.identity.intents.Address.AddressOptions", link:"reference/com/google/android/gms/identity/intents/Address.AddressOptions.html", type:"class", deprecated:"false" },
+ { id:520, label:"com.google.android.gms.identity.intents.AddressConstants", link:"reference/com/google/android/gms/identity/intents/AddressConstants.html", type:"class", deprecated:"false" },
+ { id:521, label:"com.google.android.gms.identity.intents.AddressConstants.ErrorCodes", link:"reference/com/google/android/gms/identity/intents/AddressConstants.ErrorCodes.html", type:"class", deprecated:"false" },
+ { id:522, label:"com.google.android.gms.identity.intents.AddressConstants.Extras", link:"reference/com/google/android/gms/identity/intents/AddressConstants.Extras.html", type:"class", deprecated:"false" },
+ { id:523, label:"com.google.android.gms.identity.intents.AddressConstants.ResultCodes", link:"reference/com/google/android/gms/identity/intents/AddressConstants.ResultCodes.html", type:"class", deprecated:"false" },
+ { id:524, label:"com.google.android.gms.identity.intents.AddressConstants.Themes", link:"reference/com/google/android/gms/identity/intents/AddressConstants.Themes.html", type:"class", deprecated:"false" },
+ { id:525, label:"com.google.android.gms.identity.intents.UserAddressRequest", link:"reference/com/google/android/gms/identity/intents/UserAddressRequest.html", type:"class", deprecated:"false" },
+ { id:526, label:"com.google.android.gms.identity.intents.UserAddressRequest.Builder", link:"reference/com/google/android/gms/identity/intents/UserAddressRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:527, label:"com.google.android.gms.identity.intents.model", link:"reference/com/google/android/gms/identity/intents/model/package-summary.html", type:"package", deprecated:"false" },
+ { id:528, label:"com.google.android.gms.identity.intents.model.CountrySpecification", link:"reference/com/google/android/gms/identity/intents/model/CountrySpecification.html", type:"class", deprecated:"false" },
+ { id:529, label:"com.google.android.gms.identity.intents.model.UserAddress", link:"reference/com/google/android/gms/identity/intents/model/UserAddress.html", type:"class", deprecated:"false" },
+ { id:530, label:"com.google.android.gms.iid", link:"reference/com/google/android/gms/iid/package-summary.html", type:"package", deprecated:"false" },
+ { id:531, label:"com.google.android.gms.iid.InstanceID", link:"reference/com/google/android/gms/iid/InstanceID.html", type:"class", deprecated:"false" },
+ { id:532, label:"com.google.android.gms.iid.InstanceIDListenerService", link:"reference/com/google/android/gms/iid/InstanceIDListenerService.html", type:"class", deprecated:"false" },
+ { id:533, label:"com.google.android.gms.location", link:"reference/com/google/android/gms/location/package-summary.html", type:"package", deprecated:"false" },
+ { id:534, label:"com.google.android.gms.location.ActivityRecognition", link:"reference/com/google/android/gms/location/ActivityRecognition.html", type:"class", deprecated:"false" },
+ { id:535, label:"com.google.android.gms.location.ActivityRecognitionApi", link:"reference/com/google/android/gms/location/ActivityRecognitionApi.html", type:"class", deprecated:"false" },
+ { id:536, label:"com.google.android.gms.location.ActivityRecognitionResult", link:"reference/com/google/android/gms/location/ActivityRecognitionResult.html", type:"class", deprecated:"false" },
+ { id:537, label:"com.google.android.gms.location.DetectedActivity", link:"reference/com/google/android/gms/location/DetectedActivity.html", type:"class", deprecated:"false" },
+ { id:538, label:"com.google.android.gms.location.FusedLocationProviderApi", link:"reference/com/google/android/gms/location/FusedLocationProviderApi.html", type:"class", deprecated:"false" },
+ { id:539, label:"com.google.android.gms.location.Geofence", link:"reference/com/google/android/gms/location/Geofence.html", type:"class", deprecated:"false" },
+ { id:540, label:"com.google.android.gms.location.Geofence.Builder", link:"reference/com/google/android/gms/location/Geofence.Builder.html", type:"class", deprecated:"false" },
+ { id:541, label:"com.google.android.gms.location.GeofenceStatusCodes", link:"reference/com/google/android/gms/location/GeofenceStatusCodes.html", type:"class", deprecated:"false" },
+ { id:542, label:"com.google.android.gms.location.GeofencingApi", link:"reference/com/google/android/gms/location/GeofencingApi.html", type:"class", deprecated:"false" },
+ { id:543, label:"com.google.android.gms.location.GeofencingEvent", link:"reference/com/google/android/gms/location/GeofencingEvent.html", type:"class", deprecated:"false" },
+ { id:544, label:"com.google.android.gms.location.GeofencingRequest", link:"reference/com/google/android/gms/location/GeofencingRequest.html", type:"class", deprecated:"false" },
+ { id:545, label:"com.google.android.gms.location.GeofencingRequest.Builder", link:"reference/com/google/android/gms/location/GeofencingRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:546, label:"com.google.android.gms.location.LocationAvailability", link:"reference/com/google/android/gms/location/LocationAvailability.html", type:"class", deprecated:"false" },
+ { id:547, label:"com.google.android.gms.location.LocationCallback", link:"reference/com/google/android/gms/location/LocationCallback.html", type:"class", deprecated:"false" },
+ { id:548, label:"com.google.android.gms.location.LocationListener", link:"reference/com/google/android/gms/location/LocationListener.html", type:"class", deprecated:"false" },
+ { id:549, label:"com.google.android.gms.location.LocationRequest", link:"reference/com/google/android/gms/location/LocationRequest.html", type:"class", deprecated:"false" },
+ { id:550, label:"com.google.android.gms.location.LocationResult", link:"reference/com/google/android/gms/location/LocationResult.html", type:"class", deprecated:"false" },
+ { id:551, label:"com.google.android.gms.location.LocationServices", link:"reference/com/google/android/gms/location/LocationServices.html", type:"class", deprecated:"false" },
+ { id:552, label:"com.google.android.gms.location.LocationSettingsRequest", link:"reference/com/google/android/gms/location/LocationSettingsRequest.html", type:"class", deprecated:"false" },
+ { id:553, label:"com.google.android.gms.location.LocationSettingsRequest.Builder", link:"reference/com/google/android/gms/location/LocationSettingsRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:554, label:"com.google.android.gms.location.LocationSettingsResult", link:"reference/com/google/android/gms/location/LocationSettingsResult.html", type:"class", deprecated:"false" },
+ { id:555, label:"com.google.android.gms.location.LocationSettingsStates", link:"reference/com/google/android/gms/location/LocationSettingsStates.html", type:"class", deprecated:"false" },
+ { id:556, label:"com.google.android.gms.location.LocationSettingsStatusCodes", link:"reference/com/google/android/gms/location/LocationSettingsStatusCodes.html", type:"class", deprecated:"false" },
+ { id:557, label:"com.google.android.gms.location.LocationStatusCodes", link:"reference/com/google/android/gms/location/LocationStatusCodes.html", type:"class", deprecated:"true" },
+ { id:558, label:"com.google.android.gms.location.SettingsApi", link:"reference/com/google/android/gms/location/SettingsApi.html", type:"class", deprecated:"false" },
+ { id:559, label:"com.google.android.gms.location.places", link:"reference/com/google/android/gms/location/places/package-summary.html", type:"package", deprecated:"false" },
+ { id:560, label:"com.google.android.gms.location.places.AddPlaceRequest", link:"reference/com/google/android/gms/location/places/AddPlaceRequest.html", type:"class", deprecated:"false" },
+ { id:561, label:"com.google.android.gms.location.places.AutocompleteFilter", link:"reference/com/google/android/gms/location/places/AutocompleteFilter.html", type:"class", deprecated:"false" },
+ { id:562, label:"com.google.android.gms.location.places.AutocompletePrediction", link:"reference/com/google/android/gms/location/places/AutocompletePrediction.html", type:"class", deprecated:"false" },
+ { id:563, label:"com.google.android.gms.location.places.AutocompletePrediction.Substring", link:"reference/com/google/android/gms/location/places/AutocompletePrediction.Substring.html", type:"class", deprecated:"false" },
+ { id:564, label:"com.google.android.gms.location.places.AutocompletePredictionBuffer", link:"reference/com/google/android/gms/location/places/AutocompletePredictionBuffer.html", type:"class", deprecated:"false" },
+ { id:565, label:"com.google.android.gms.location.places.GeoDataApi", link:"reference/com/google/android/gms/location/places/GeoDataApi.html", type:"class", deprecated:"false" },
+ { id:566, label:"com.google.android.gms.location.places.Place", link:"reference/com/google/android/gms/location/places/Place.html", type:"class", deprecated:"false" },
+ { id:567, label:"com.google.android.gms.location.places.PlaceBuffer", link:"reference/com/google/android/gms/location/places/PlaceBuffer.html", type:"class", deprecated:"false" },
+ { id:568, label:"com.google.android.gms.location.places.PlaceDetectionApi", link:"reference/com/google/android/gms/location/places/PlaceDetectionApi.html", type:"class", deprecated:"false" },
+ { id:569, label:"com.google.android.gms.location.places.PlaceFilter", link:"reference/com/google/android/gms/location/places/PlaceFilter.html", type:"class", deprecated:"false" },
+ { id:570, label:"com.google.android.gms.location.places.PlaceLikelihood", link:"reference/com/google/android/gms/location/places/PlaceLikelihood.html", type:"class", deprecated:"false" },
+ { id:571, label:"com.google.android.gms.location.places.PlaceLikelihoodBuffer", link:"reference/com/google/android/gms/location/places/PlaceLikelihoodBuffer.html", type:"class", deprecated:"false" },
+ { id:572, label:"com.google.android.gms.location.places.PlacePhotoMetadata", link:"reference/com/google/android/gms/location/places/PlacePhotoMetadata.html", type:"class", deprecated:"false" },
+ { id:573, label:"com.google.android.gms.location.places.PlacePhotoMetadataBuffer", link:"reference/com/google/android/gms/location/places/PlacePhotoMetadataBuffer.html", type:"class", deprecated:"false" },
+ { id:574, label:"com.google.android.gms.location.places.PlacePhotoMetadataResult", link:"reference/com/google/android/gms/location/places/PlacePhotoMetadataResult.html", type:"class", deprecated:"false" },
+ { id:575, label:"com.google.android.gms.location.places.PlacePhotoResult", link:"reference/com/google/android/gms/location/places/PlacePhotoResult.html", type:"class", deprecated:"false" },
+ { id:576, label:"com.google.android.gms.location.places.PlaceReport", link:"reference/com/google/android/gms/location/places/PlaceReport.html", type:"class", deprecated:"false" },
+ { id:577, label:"com.google.android.gms.location.places.PlaceTypes", link:"reference/com/google/android/gms/location/places/PlaceTypes.html", type:"class", deprecated:"false" },
+ { id:578, label:"com.google.android.gms.location.places.Places", link:"reference/com/google/android/gms/location/places/Places.html", type:"class", deprecated:"false" },
+ { id:579, label:"com.google.android.gms.location.places.PlacesOptions", link:"reference/com/google/android/gms/location/places/PlacesOptions.html", type:"class", deprecated:"false" },
+ { id:580, label:"com.google.android.gms.location.places.PlacesOptions.Builder", link:"reference/com/google/android/gms/location/places/PlacesOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:581, label:"com.google.android.gms.location.places.PlacesStatusCodes", link:"reference/com/google/android/gms/location/places/PlacesStatusCodes.html", type:"class", deprecated:"false" },
+ { id:582, label:"com.google.android.gms.location.places.ui", link:"reference/com/google/android/gms/location/places/ui/package-summary.html", type:"package", deprecated:"false" },
+ { id:583, label:"com.google.android.gms.location.places.ui.PlacePicker", link:"reference/com/google/android/gms/location/places/ui/PlacePicker.html", type:"class", deprecated:"false" },
+ { id:584, label:"com.google.android.gms.location.places.ui.PlacePicker.IntentBuilder", link:"reference/com/google/android/gms/location/places/ui/PlacePicker.IntentBuilder.html", type:"class", deprecated:"false" },
+ { id:585, label:"com.google.android.gms.maps", link:"reference/com/google/android/gms/maps/package-summary.html", type:"package", deprecated:"false" },
+ { id:586, label:"com.google.android.gms.maps.CameraUpdate", link:"reference/com/google/android/gms/maps/CameraUpdate.html", type:"class", deprecated:"false" },
+ { id:587, label:"com.google.android.gms.maps.CameraUpdateFactory", link:"reference/com/google/android/gms/maps/CameraUpdateFactory.html", type:"class", deprecated:"false" },
+ { id:588, label:"com.google.android.gms.maps.GoogleMap", link:"reference/com/google/android/gms/maps/GoogleMap.html", type:"class", deprecated:"false" },
+ { id:589, label:"com.google.android.gms.maps.GoogleMap.CancelableCallback", link:"reference/com/google/android/gms/maps/GoogleMap.CancelableCallback.html", type:"class", deprecated:"false" },
+ { id:590, label:"com.google.android.gms.maps.GoogleMap.InfoWindowAdapter", link:"reference/com/google/android/gms/maps/GoogleMap.InfoWindowAdapter.html", type:"class", deprecated:"false" },
+ { id:591, label:"com.google.android.gms.maps.GoogleMap.OnCameraChangeListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnCameraChangeListener.html", type:"class", deprecated:"false" },
+ { id:592, label:"com.google.android.gms.maps.GoogleMap.OnIndoorStateChangeListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnIndoorStateChangeListener.html", type:"class", deprecated:"false" },
+ { id:593, label:"com.google.android.gms.maps.GoogleMap.OnInfoWindowClickListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnInfoWindowClickListener.html", type:"class", deprecated:"false" },
+ { id:594, label:"com.google.android.gms.maps.GoogleMap.OnMapClickListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMapClickListener.html", type:"class", deprecated:"false" },
+ { id:595, label:"com.google.android.gms.maps.GoogleMap.OnMapLoadedCallback", link:"reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback.html", type:"class", deprecated:"false" },
+ { id:596, label:"com.google.android.gms.maps.GoogleMap.OnMapLongClickListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMapLongClickListener.html", type:"class", deprecated:"false" },
+ { id:597, label:"com.google.android.gms.maps.GoogleMap.OnMarkerClickListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMarkerClickListener.html", type:"class", deprecated:"false" },
+ { id:598, label:"com.google.android.gms.maps.GoogleMap.OnMarkerDragListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMarkerDragListener.html", type:"class", deprecated:"false" },
+ { id:599, label:"com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMyLocationButtonClickListener.html", type:"class", deprecated:"false" },
+ { id:600, label:"com.google.android.gms.maps.GoogleMap.OnMyLocationChangeListener", link:"reference/com/google/android/gms/maps/GoogleMap.OnMyLocationChangeListener.html", type:"class", deprecated:"true" },
+ { id:601, label:"com.google.android.gms.maps.GoogleMap.SnapshotReadyCallback", link:"reference/com/google/android/gms/maps/GoogleMap.SnapshotReadyCallback.html", type:"class", deprecated:"false" },
+ { id:602, label:"com.google.android.gms.maps.GoogleMapOptions", link:"reference/com/google/android/gms/maps/GoogleMapOptions.html", type:"class", deprecated:"false" },
+ { id:603, label:"com.google.android.gms.maps.LocationSource", link:"reference/com/google/android/gms/maps/LocationSource.html", type:"class", deprecated:"false" },
+ { id:604, label:"com.google.android.gms.maps.LocationSource.OnLocationChangedListener", link:"reference/com/google/android/gms/maps/LocationSource.OnLocationChangedListener.html", type:"class", deprecated:"false" },
+ { id:605, label:"com.google.android.gms.maps.MapFragment", link:"reference/com/google/android/gms/maps/MapFragment.html", type:"class", deprecated:"false" },
+ { id:606, label:"com.google.android.gms.maps.MapView", link:"reference/com/google/android/gms/maps/MapView.html", type:"class", deprecated:"false" },
+ { id:607, label:"com.google.android.gms.maps.MapsInitializer", link:"reference/com/google/android/gms/maps/MapsInitializer.html", type:"class", deprecated:"false" },
+ { id:608, label:"com.google.android.gms.maps.OnMapReadyCallback", link:"reference/com/google/android/gms/maps/OnMapReadyCallback.html", type:"class", deprecated:"false" },
+ { id:609, label:"com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback", link:"reference/com/google/android/gms/maps/OnStreetViewPanoramaReadyCallback.html", type:"class", deprecated:"false" },
+ { id:610, label:"com.google.android.gms.maps.Projection", link:"reference/com/google/android/gms/maps/Projection.html", type:"class", deprecated:"false" },
+ { id:611, label:"com.google.android.gms.maps.StreetViewPanorama", link:"reference/com/google/android/gms/maps/StreetViewPanorama.html", type:"class", deprecated:"false" },
+ { id:612, label:"com.google.android.gms.maps.StreetViewPanorama.OnStreetViewPanoramaCameraChangeListener", link:"reference/com/google/android/gms/maps/StreetViewPanorama.OnStreetViewPanoramaCameraChangeListener.html", type:"class", deprecated:"false" },
+ { id:613, label:"com.google.android.gms.maps.StreetViewPanorama.OnStreetViewPanoramaChangeListener", link:"reference/com/google/android/gms/maps/StreetViewPanorama.OnStreetViewPanoramaChangeListener.html", type:"class", deprecated:"false" },
+ { id:614, label:"com.google.android.gms.maps.StreetViewPanorama.OnStreetViewPanoramaClickListener", link:"reference/com/google/android/gms/maps/StreetViewPanorama.OnStreetViewPanoramaClickListener.html", type:"class", deprecated:"false" },
+ { id:615, label:"com.google.android.gms.maps.StreetViewPanorama.OnStreetViewPanoramaLongClickListener", link:"reference/com/google/android/gms/maps/StreetViewPanorama.OnStreetViewPanoramaLongClickListener.html", type:"class", deprecated:"false" },
+ { id:616, label:"com.google.android.gms.maps.StreetViewPanoramaFragment", link:"reference/com/google/android/gms/maps/StreetViewPanoramaFragment.html", type:"class", deprecated:"false" },
+ { id:617, label:"com.google.android.gms.maps.StreetViewPanoramaOptions", link:"reference/com/google/android/gms/maps/StreetViewPanoramaOptions.html", type:"class", deprecated:"false" },
+ { id:618, label:"com.google.android.gms.maps.StreetViewPanoramaView", link:"reference/com/google/android/gms/maps/StreetViewPanoramaView.html", type:"class", deprecated:"false" },
+ { id:619, label:"com.google.android.gms.maps.SupportMapFragment", link:"reference/com/google/android/gms/maps/SupportMapFragment.html", type:"class", deprecated:"false" },
+ { id:620, label:"com.google.android.gms.maps.SupportStreetViewPanoramaFragment", link:"reference/com/google/android/gms/maps/SupportStreetViewPanoramaFragment.html", type:"class", deprecated:"false" },
+ { id:621, label:"com.google.android.gms.maps.UiSettings", link:"reference/com/google/android/gms/maps/UiSettings.html", type:"class", deprecated:"false" },
+ { id:622, label:"com.google.android.gms.maps.model", link:"reference/com/google/android/gms/maps/model/package-summary.html", type:"package", deprecated:"false" },
+ { id:623, label:"com.google.android.gms.maps.model.BitmapDescriptor", link:"reference/com/google/android/gms/maps/model/BitmapDescriptor.html", type:"class", deprecated:"false" },
+ { id:624, label:"com.google.android.gms.maps.model.BitmapDescriptorFactory", link:"reference/com/google/android/gms/maps/model/BitmapDescriptorFactory.html", type:"class", deprecated:"false" },
+ { id:625, label:"com.google.android.gms.maps.model.CameraPosition", link:"reference/com/google/android/gms/maps/model/CameraPosition.html", type:"class", deprecated:"false" },
+ { id:626, label:"com.google.android.gms.maps.model.CameraPosition.Builder", link:"reference/com/google/android/gms/maps/model/CameraPosition.Builder.html", type:"class", deprecated:"false" },
+ { id:627, label:"com.google.android.gms.maps.model.Circle", link:"reference/com/google/android/gms/maps/model/Circle.html", type:"class", deprecated:"false" },
+ { id:628, label:"com.google.android.gms.maps.model.CircleOptions", link:"reference/com/google/android/gms/maps/model/CircleOptions.html", type:"class", deprecated:"false" },
+ { id:629, label:"com.google.android.gms.maps.model.GroundOverlay", link:"reference/com/google/android/gms/maps/model/GroundOverlay.html", type:"class", deprecated:"false" },
+ { id:630, label:"com.google.android.gms.maps.model.GroundOverlayOptions", link:"reference/com/google/android/gms/maps/model/GroundOverlayOptions.html", type:"class", deprecated:"false" },
+ { id:631, label:"com.google.android.gms.maps.model.IndoorBuilding", link:"reference/com/google/android/gms/maps/model/IndoorBuilding.html", type:"class", deprecated:"false" },
+ { id:632, label:"com.google.android.gms.maps.model.IndoorLevel", link:"reference/com/google/android/gms/maps/model/IndoorLevel.html", type:"class", deprecated:"false" },
+ { id:633, label:"com.google.android.gms.maps.model.LatLng", link:"reference/com/google/android/gms/maps/model/LatLng.html", type:"class", deprecated:"false" },
+ { id:634, label:"com.google.android.gms.maps.model.LatLngBounds", link:"reference/com/google/android/gms/maps/model/LatLngBounds.html", type:"class", deprecated:"false" },
+ { id:635, label:"com.google.android.gms.maps.model.LatLngBounds.Builder", link:"reference/com/google/android/gms/maps/model/LatLngBounds.Builder.html", type:"class", deprecated:"false" },
+ { id:636, label:"com.google.android.gms.maps.model.Marker", link:"reference/com/google/android/gms/maps/model/Marker.html", type:"class", deprecated:"false" },
+ { id:637, label:"com.google.android.gms.maps.model.MarkerOptions", link:"reference/com/google/android/gms/maps/model/MarkerOptions.html", type:"class", deprecated:"false" },
+ { id:638, label:"com.google.android.gms.maps.model.Polygon", link:"reference/com/google/android/gms/maps/model/Polygon.html", type:"class", deprecated:"false" },
+ { id:639, label:"com.google.android.gms.maps.model.PolygonOptions", link:"reference/com/google/android/gms/maps/model/PolygonOptions.html", type:"class", deprecated:"false" },
+ { id:640, label:"com.google.android.gms.maps.model.Polyline", link:"reference/com/google/android/gms/maps/model/Polyline.html", type:"class", deprecated:"false" },
+ { id:641, label:"com.google.android.gms.maps.model.PolylineOptions", link:"reference/com/google/android/gms/maps/model/PolylineOptions.html", type:"class", deprecated:"false" },
+ { id:642, label:"com.google.android.gms.maps.model.RuntimeRemoteException", link:"reference/com/google/android/gms/maps/model/RuntimeRemoteException.html", type:"class", deprecated:"false" },
+ { id:643, label:"com.google.android.gms.maps.model.StreetViewPanoramaCamera", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaCamera.html", type:"class", deprecated:"false" },
+ { id:644, label:"com.google.android.gms.maps.model.StreetViewPanoramaCamera.Builder", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaCamera.Builder.html", type:"class", deprecated:"false" },
+ { id:645, label:"com.google.android.gms.maps.model.StreetViewPanoramaLink", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaLink.html", type:"class", deprecated:"false" },
+ { id:646, label:"com.google.android.gms.maps.model.StreetViewPanoramaLocation", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaLocation.html", type:"class", deprecated:"false" },
+ { id:647, label:"com.google.android.gms.maps.model.StreetViewPanoramaOrientation", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaOrientation.html", type:"class", deprecated:"false" },
+ { id:648, label:"com.google.android.gms.maps.model.StreetViewPanoramaOrientation.Builder", link:"reference/com/google/android/gms/maps/model/StreetViewPanoramaOrientation.Builder.html", type:"class", deprecated:"false" },
+ { id:649, label:"com.google.android.gms.maps.model.Tile", link:"reference/com/google/android/gms/maps/model/Tile.html", type:"class", deprecated:"false" },
+ { id:650, label:"com.google.android.gms.maps.model.TileOverlay", link:"reference/com/google/android/gms/maps/model/TileOverlay.html", type:"class", deprecated:"false" },
+ { id:651, label:"com.google.android.gms.maps.model.TileOverlayOptions", link:"reference/com/google/android/gms/maps/model/TileOverlayOptions.html", type:"class", deprecated:"false" },
+ { id:652, label:"com.google.android.gms.maps.model.TileProvider", link:"reference/com/google/android/gms/maps/model/TileProvider.html", type:"class", deprecated:"false" },
+ { id:653, label:"com.google.android.gms.maps.model.UrlTileProvider", link:"reference/com/google/android/gms/maps/model/UrlTileProvider.html", type:"class", deprecated:"false" },
+ { id:654, label:"com.google.android.gms.maps.model.VisibleRegion", link:"reference/com/google/android/gms/maps/model/VisibleRegion.html", type:"class", deprecated:"false" },
+ { id:655, label:"com.google.android.gms.nearby", link:"reference/com/google/android/gms/nearby/package-summary.html", type:"package", deprecated:"false" },
+ { id:656, label:"com.google.android.gms.nearby.Nearby", link:"reference/com/google/android/gms/nearby/Nearby.html", type:"class", deprecated:"false" },
+ { id:657, label:"com.google.android.gms.nearby.connection", link:"reference/com/google/android/gms/nearby/connection/package-summary.html", type:"package", deprecated:"false" },
+ { id:658, label:"com.google.android.gms.nearby.connection.AppIdentifier", link:"reference/com/google/android/gms/nearby/connection/AppIdentifier.html", type:"class", deprecated:"false" },
+ { id:659, label:"com.google.android.gms.nearby.connection.AppMetadata", link:"reference/com/google/android/gms/nearby/connection/AppMetadata.html", type:"class", deprecated:"false" },
+ { id:660, label:"com.google.android.gms.nearby.connection.Connections", link:"reference/com/google/android/gms/nearby/connection/Connections.html", type:"class", deprecated:"false" },
+ { id:661, label:"com.google.android.gms.nearby.connection.Connections.ConnectionRequestListener", link:"reference/com/google/android/gms/nearby/connection/Connections.ConnectionRequestListener.html", type:"class", deprecated:"false" },
+ { id:662, label:"com.google.android.gms.nearby.connection.Connections.ConnectionResponseCallback", link:"reference/com/google/android/gms/nearby/connection/Connections.ConnectionResponseCallback.html", type:"class", deprecated:"false" },
+ { id:663, label:"com.google.android.gms.nearby.connection.Connections.EndpointDiscoveryListener", link:"reference/com/google/android/gms/nearby/connection/Connections.EndpointDiscoveryListener.html", type:"class", deprecated:"false" },
+ { id:664, label:"com.google.android.gms.nearby.connection.Connections.MessageListener", link:"reference/com/google/android/gms/nearby/connection/Connections.MessageListener.html", type:"class", deprecated:"false" },
+ { id:665, label:"com.google.android.gms.nearby.connection.Connections.StartAdvertisingResult", link:"reference/com/google/android/gms/nearby/connection/Connections.StartAdvertisingResult.html", type:"class", deprecated:"false" },
+ { id:666, label:"com.google.android.gms.nearby.connection.ConnectionsStatusCodes", link:"reference/com/google/android/gms/nearby/connection/ConnectionsStatusCodes.html", type:"class", deprecated:"false" },
+ { id:667, label:"com.google.android.gms.nearby.messages", link:"reference/com/google/android/gms/nearby/messages/package-summary.html", type:"package", deprecated:"false" },
+ { id:668, label:"com.google.android.gms.nearby.messages.Message", link:"reference/com/google/android/gms/nearby/messages/Message.html", type:"class", deprecated:"false" },
+ { id:669, label:"com.google.android.gms.nearby.messages.MessageFilter", link:"reference/com/google/android/gms/nearby/messages/MessageFilter.html", type:"class", deprecated:"false" },
+ { id:670, label:"com.google.android.gms.nearby.messages.MessageFilter.Builder", link:"reference/com/google/android/gms/nearby/messages/MessageFilter.Builder.html", type:"class", deprecated:"false" },
+ { id:671, label:"com.google.android.gms.nearby.messages.MessageListener", link:"reference/com/google/android/gms/nearby/messages/MessageListener.html", type:"class", deprecated:"false" },
+ { id:672, label:"com.google.android.gms.nearby.messages.Messages", link:"reference/com/google/android/gms/nearby/messages/Messages.html", type:"class", deprecated:"false" },
+ { id:673, label:"com.google.android.gms.nearby.messages.MessagesOptions", link:"reference/com/google/android/gms/nearby/messages/MessagesOptions.html", type:"class", deprecated:"false" },
+ { id:674, label:"com.google.android.gms.nearby.messages.NearbyMessagesStatusCodes", link:"reference/com/google/android/gms/nearby/messages/NearbyMessagesStatusCodes.html", type:"class", deprecated:"false" },
+ { id:675, label:"com.google.android.gms.nearby.messages.Strategy", link:"reference/com/google/android/gms/nearby/messages/Strategy.html", type:"class", deprecated:"false" },
+ { id:676, label:"com.google.android.gms.nearby.messages.Strategy.Builder", link:"reference/com/google/android/gms/nearby/messages/Strategy.Builder.html", type:"class", deprecated:"false" },
+ { id:677, label:"com.google.android.gms.panorama", link:"reference/com/google/android/gms/panorama/package-summary.html", type:"package", deprecated:"false" },
+ { id:678, label:"com.google.android.gms.panorama.Panorama", link:"reference/com/google/android/gms/panorama/Panorama.html", type:"class", deprecated:"false" },
+ { id:679, label:"com.google.android.gms.panorama.PanoramaApi", link:"reference/com/google/android/gms/panorama/PanoramaApi.html", type:"class", deprecated:"false" },
+ { id:680, label:"com.google.android.gms.panorama.PanoramaApi.PanoramaResult", link:"reference/com/google/android/gms/panorama/PanoramaApi.PanoramaResult.html", type:"class", deprecated:"false" },
+ { id:681, label:"com.google.android.gms.plus", link:"reference/com/google/android/gms/plus/package-summary.html", type:"package", deprecated:"false" },
+ { id:682, label:"com.google.android.gms.plus.Account", link:"reference/com/google/android/gms/plus/Account.html", type:"class", deprecated:"false" },
+ { id:683, label:"com.google.android.gms.plus.Moments", link:"reference/com/google/android/gms/plus/Moments.html", type:"class", deprecated:"false" },
+ { id:684, label:"com.google.android.gms.plus.Moments.LoadMomentsResult", link:"reference/com/google/android/gms/plus/Moments.LoadMomentsResult.html", type:"class", deprecated:"false" },
+ { id:685, label:"com.google.android.gms.plus.People", link:"reference/com/google/android/gms/plus/People.html", type:"class", deprecated:"false" },
+ { id:686, label:"com.google.android.gms.plus.People.LoadPeopleResult", link:"reference/com/google/android/gms/plus/People.LoadPeopleResult.html", type:"class", deprecated:"false" },
+ { id:687, label:"com.google.android.gms.plus.People.OrderBy", link:"reference/com/google/android/gms/plus/People.OrderBy.html", type:"class", deprecated:"false" },
+ { id:688, label:"com.google.android.gms.plus.Plus", link:"reference/com/google/android/gms/plus/Plus.html", type:"class", deprecated:"false" },
+ { id:689, label:"com.google.android.gms.plus.Plus.PlusOptions", link:"reference/com/google/android/gms/plus/Plus.PlusOptions.html", type:"class", deprecated:"false" },
+ { id:690, label:"com.google.android.gms.plus.Plus.PlusOptions.Builder", link:"reference/com/google/android/gms/plus/Plus.PlusOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:691, label:"com.google.android.gms.plus.PlusOneButton", link:"reference/com/google/android/gms/plus/PlusOneButton.html", type:"class", deprecated:"false" },
+ { id:692, label:"com.google.android.gms.plus.PlusOneButton.DefaultOnPlusOneClickListener", link:"reference/com/google/android/gms/plus/PlusOneButton.DefaultOnPlusOneClickListener.html", type:"class", deprecated:"false" },
+ { id:693, label:"com.google.android.gms.plus.PlusOneButton.OnPlusOneClickListener", link:"reference/com/google/android/gms/plus/PlusOneButton.OnPlusOneClickListener.html", type:"class", deprecated:"false" },
+ { id:694, label:"com.google.android.gms.plus.PlusOneDummyView", link:"reference/com/google/android/gms/plus/PlusOneDummyView.html", type:"class", deprecated:"false" },
+ { id:695, label:"com.google.android.gms.plus.PlusShare", link:"reference/com/google/android/gms/plus/PlusShare.html", type:"class", deprecated:"false" },
+ { id:696, label:"com.google.android.gms.plus.PlusShare.Builder", link:"reference/com/google/android/gms/plus/PlusShare.Builder.html", type:"class", deprecated:"false" },
+ { id:697, label:"com.google.android.gms.plus.model.moments", link:"reference/com/google/android/gms/plus/model/moments/package-summary.html", type:"package", deprecated:"false" },
+ { id:698, label:"com.google.android.gms.plus.model.moments.ItemScope", link:"reference/com/google/android/gms/plus/model/moments/ItemScope.html", type:"class", deprecated:"false" },
+ { id:699, label:"com.google.android.gms.plus.model.moments.ItemScope.Builder", link:"reference/com/google/android/gms/plus/model/moments/ItemScope.Builder.html", type:"class", deprecated:"false" },
+ { id:700, label:"com.google.android.gms.plus.model.moments.Moment", link:"reference/com/google/android/gms/plus/model/moments/Moment.html", type:"class", deprecated:"false" },
+ { id:701, label:"com.google.android.gms.plus.model.moments.Moment.Builder", link:"reference/com/google/android/gms/plus/model/moments/Moment.Builder.html", type:"class", deprecated:"false" },
+ { id:702, label:"com.google.android.gms.plus.model.moments.MomentBuffer", link:"reference/com/google/android/gms/plus/model/moments/MomentBuffer.html", type:"class", deprecated:"false" },
+ { id:703, label:"com.google.android.gms.plus.model.people", link:"reference/com/google/android/gms/plus/model/people/package-summary.html", type:"package", deprecated:"false" },
+ { id:704, label:"com.google.android.gms.plus.model.people.Person", link:"reference/com/google/android/gms/plus/model/people/Person.html", type:"class", deprecated:"false" },
+ { id:705, label:"com.google.android.gms.plus.model.people.Person.AgeRange", link:"reference/com/google/android/gms/plus/model/people/Person.AgeRange.html", type:"class", deprecated:"false" },
+ { id:706, label:"com.google.android.gms.plus.model.people.Person.Cover", link:"reference/com/google/android/gms/plus/model/people/Person.Cover.html", type:"class", deprecated:"false" },
+ { id:707, label:"com.google.android.gms.plus.model.people.Person.Cover.CoverInfo", link:"reference/com/google/android/gms/plus/model/people/Person.Cover.CoverInfo.html", type:"class", deprecated:"false" },
+ { id:708, label:"com.google.android.gms.plus.model.people.Person.Cover.CoverPhoto", link:"reference/com/google/android/gms/plus/model/people/Person.Cover.CoverPhoto.html", type:"class", deprecated:"false" },
+ { id:709, label:"com.google.android.gms.plus.model.people.Person.Cover.Layout", link:"reference/com/google/android/gms/plus/model/people/Person.Cover.Layout.html", type:"class", deprecated:"false" },
+ { id:710, label:"com.google.android.gms.plus.model.people.Person.Gender", link:"reference/com/google/android/gms/plus/model/people/Person.Gender.html", type:"class", deprecated:"false" },
+ { id:711, label:"com.google.android.gms.plus.model.people.Person.Image", link:"reference/com/google/android/gms/plus/model/people/Person.Image.html", type:"class", deprecated:"false" },
+ { id:712, label:"com.google.android.gms.plus.model.people.Person.Name", link:"reference/com/google/android/gms/plus/model/people/Person.Name.html", type:"class", deprecated:"false" },
+ { id:713, label:"com.google.android.gms.plus.model.people.Person.ObjectType", link:"reference/com/google/android/gms/plus/model/people/Person.ObjectType.html", type:"class", deprecated:"false" },
+ { id:714, label:"com.google.android.gms.plus.model.people.Person.Organizations", link:"reference/com/google/android/gms/plus/model/people/Person.Organizations.html", type:"class", deprecated:"false" },
+ { id:715, label:"com.google.android.gms.plus.model.people.Person.Organizations.Type", link:"reference/com/google/android/gms/plus/model/people/Person.Organizations.Type.html", type:"class", deprecated:"false" },
+ { id:716, label:"com.google.android.gms.plus.model.people.Person.PlacesLived", link:"reference/com/google/android/gms/plus/model/people/Person.PlacesLived.html", type:"class", deprecated:"false" },
+ { id:717, label:"com.google.android.gms.plus.model.people.Person.RelationshipStatus", link:"reference/com/google/android/gms/plus/model/people/Person.RelationshipStatus.html", type:"class", deprecated:"false" },
+ { id:718, label:"com.google.android.gms.plus.model.people.Person.Urls", link:"reference/com/google/android/gms/plus/model/people/Person.Urls.html", type:"class", deprecated:"false" },
+ { id:719, label:"com.google.android.gms.plus.model.people.Person.Urls.Type", link:"reference/com/google/android/gms/plus/model/people/Person.Urls.Type.html", type:"class", deprecated:"false" },
+ { id:720, label:"com.google.android.gms.plus.model.people.PersonBuffer", link:"reference/com/google/android/gms/plus/model/people/PersonBuffer.html", type:"class", deprecated:"false" },
+ { id:721, label:"com.google.android.gms.safetynet", link:"reference/com/google/android/gms/safetynet/package-summary.html", type:"package", deprecated:"false" },
+ { id:722, label:"com.google.android.gms.safetynet.SafetyNet", link:"reference/com/google/android/gms/safetynet/SafetyNet.html", type:"class", deprecated:"false" },
+ { id:723, label:"com.google.android.gms.safetynet.SafetyNetApi", link:"reference/com/google/android/gms/safetynet/SafetyNetApi.html", type:"class", deprecated:"false" },
+ { id:724, label:"com.google.android.gms.safetynet.SafetyNetApi.AttestationResult", link:"reference/com/google/android/gms/safetynet/SafetyNetApi.AttestationResult.html", type:"class", deprecated:"false" },
+ { id:725, label:"com.google.android.gms.search", link:"reference/com/google/android/gms/search/package-summary.html", type:"package", deprecated:"false" },
+ { id:726, label:"com.google.android.gms.search.GoogleNowAuthState", link:"reference/com/google/android/gms/search/GoogleNowAuthState.html", type:"class", deprecated:"false" },
+ { id:727, label:"com.google.android.gms.search.SearchAuth", link:"reference/com/google/android/gms/search/SearchAuth.html", type:"class", deprecated:"false" },
+ { id:728, label:"com.google.android.gms.search.SearchAuth.StatusCodes", link:"reference/com/google/android/gms/search/SearchAuth.StatusCodes.html", type:"class", deprecated:"false" },
+ { id:729, label:"com.google.android.gms.search.SearchAuthApi", link:"reference/com/google/android/gms/search/SearchAuthApi.html", type:"class", deprecated:"false" },
+ { id:730, label:"com.google.android.gms.search.SearchAuthApi.GoogleNowAuthResult", link:"reference/com/google/android/gms/search/SearchAuthApi.GoogleNowAuthResult.html", type:"class", deprecated:"false" },
+ { id:731, label:"com.google.android.gms.security", link:"reference/com/google/android/gms/security/package-summary.html", type:"package", deprecated:"false" },
+ { id:732, label:"com.google.android.gms.security.ProviderInstaller", link:"reference/com/google/android/gms/security/ProviderInstaller.html", type:"class", deprecated:"false" },
+ { id:733, label:"com.google.android.gms.security.ProviderInstaller.ProviderInstallListener", link:"reference/com/google/android/gms/security/ProviderInstaller.ProviderInstallListener.html", type:"class", deprecated:"false" },
+ { id:734, label:"com.google.android.gms.tagmanager", link:"reference/com/google/android/gms/tagmanager/package-summary.html", type:"package", deprecated:"false" },
+ { id:735, label:"com.google.android.gms.tagmanager.Container", link:"reference/com/google/android/gms/tagmanager/Container.html", type:"class", deprecated:"false" },
+ { id:736, label:"com.google.android.gms.tagmanager.Container.FunctionCallMacroCallback", link:"reference/com/google/android/gms/tagmanager/Container.FunctionCallMacroCallback.html", type:"class", deprecated:"false" },
+ { id:737, label:"com.google.android.gms.tagmanager.Container.FunctionCallTagCallback", link:"reference/com/google/android/gms/tagmanager/Container.FunctionCallTagCallback.html", type:"class", deprecated:"false" },
+ { id:738, label:"com.google.android.gms.tagmanager.ContainerHolder", link:"reference/com/google/android/gms/tagmanager/ContainerHolder.html", type:"class", deprecated:"false" },
+ { id:739, label:"com.google.android.gms.tagmanager.ContainerHolder.ContainerAvailableListener", link:"reference/com/google/android/gms/tagmanager/ContainerHolder.ContainerAvailableListener.html", type:"class", deprecated:"false" },
+ { id:740, label:"com.google.android.gms.tagmanager.DataLayer", link:"reference/com/google/android/gms/tagmanager/DataLayer.html", type:"class", deprecated:"false" },
+ { id:741, label:"com.google.android.gms.tagmanager.InstallReferrerReceiver", link:"reference/com/google/android/gms/tagmanager/InstallReferrerReceiver.html", type:"class", deprecated:"false" },
+ { id:742, label:"com.google.android.gms.tagmanager.InstallReferrerService", link:"reference/com/google/android/gms/tagmanager/InstallReferrerService.html", type:"class", deprecated:"false" },
+ { id:743, label:"com.google.android.gms.tagmanager.PreviewActivity", link:"reference/com/google/android/gms/tagmanager/PreviewActivity.html", type:"class", deprecated:"false" },
+ { id:744, label:"com.google.android.gms.tagmanager.TagManager", link:"reference/com/google/android/gms/tagmanager/TagManager.html", type:"class", deprecated:"false" },
+ { id:745, label:"com.google.android.gms.vision", link:"reference/com/google/android/gms/vision/package-summary.html", type:"package", deprecated:"false" },
+ { id:746, label:"com.google.android.gms.vision.CameraSource", link:"reference/com/google/android/gms/vision/CameraSource.html", type:"class", deprecated:"false" },
+ { id:747, label:"com.google.android.gms.vision.CameraSource.Builder", link:"reference/com/google/android/gms/vision/CameraSource.Builder.html", type:"class", deprecated:"false" },
+ { id:748, label:"com.google.android.gms.vision.CameraSource.PictureCallback", link:"reference/com/google/android/gms/vision/CameraSource.PictureCallback.html", type:"class", deprecated:"false" },
+ { id:749, label:"com.google.android.gms.vision.CameraSource.ShutterCallback", link:"reference/com/google/android/gms/vision/CameraSource.ShutterCallback.html", type:"class", deprecated:"false" },
+ { id:750, label:"com.google.android.gms.vision.Detector", link:"reference/com/google/android/gms/vision/Detector.html", type:"class", deprecated:"false" },
+ { id:751, label:"com.google.android.gms.vision.Detector.Detections", link:"reference/com/google/android/gms/vision/Detector.Detections.html", type:"class", deprecated:"false" },
+ { id:752, label:"com.google.android.gms.vision.Detector.Processor", link:"reference/com/google/android/gms/vision/Detector.Processor.html", type:"class", deprecated:"false" },
+ { id:753, label:"com.google.android.gms.vision.FocusingProcessor", link:"reference/com/google/android/gms/vision/FocusingProcessor.html", type:"class", deprecated:"false" },
+ { id:754, label:"com.google.android.gms.vision.Frame", link:"reference/com/google/android/gms/vision/Frame.html", type:"class", deprecated:"false" },
+ { id:755, label:"com.google.android.gms.vision.Frame.Builder", link:"reference/com/google/android/gms/vision/Frame.Builder.html", type:"class", deprecated:"false" },
+ { id:756, label:"com.google.android.gms.vision.Frame.Metadata", link:"reference/com/google/android/gms/vision/Frame.Metadata.html", type:"class", deprecated:"false" },
+ { id:757, label:"com.google.android.gms.vision.MultiDetector", link:"reference/com/google/android/gms/vision/MultiDetector.html", type:"class", deprecated:"false" },
+ { id:758, label:"com.google.android.gms.vision.MultiDetector.Builder", link:"reference/com/google/android/gms/vision/MultiDetector.Builder.html", type:"class", deprecated:"false" },
+ { id:759, label:"com.google.android.gms.vision.MultiProcessor", link:"reference/com/google/android/gms/vision/MultiProcessor.html", type:"class", deprecated:"false" },
+ { id:760, label:"com.google.android.gms.vision.MultiProcessor.Builder", link:"reference/com/google/android/gms/vision/MultiProcessor.Builder.html", type:"class", deprecated:"false" },
+ { id:761, label:"com.google.android.gms.vision.MultiProcessor.Factory", link:"reference/com/google/android/gms/vision/MultiProcessor.Factory.html", type:"class", deprecated:"false" },
+ { id:762, label:"com.google.android.gms.vision.Tracker", link:"reference/com/google/android/gms/vision/Tracker.html", type:"class", deprecated:"false" },
+ { id:763, label:"com.google.android.gms.vision.barcode", link:"reference/com/google/android/gms/vision/barcode/package-summary.html", type:"package", deprecated:"false" },
+ { id:764, label:"com.google.android.gms.vision.barcode.Barcode", link:"reference/com/google/android/gms/vision/barcode/Barcode.html", type:"class", deprecated:"false" },
+ { id:765, label:"com.google.android.gms.vision.barcode.Barcode.Address", link:"reference/com/google/android/gms/vision/barcode/Barcode.Address.html", type:"class", deprecated:"false" },
+ { id:766, label:"com.google.android.gms.vision.barcode.Barcode.CalendarDateTime", link:"reference/com/google/android/gms/vision/barcode/Barcode.CalendarDateTime.html", type:"class", deprecated:"false" },
+ { id:767, label:"com.google.android.gms.vision.barcode.Barcode.CalendarEvent", link:"reference/com/google/android/gms/vision/barcode/Barcode.CalendarEvent.html", type:"class", deprecated:"false" },
+ { id:768, label:"com.google.android.gms.vision.barcode.Barcode.ContactInfo", link:"reference/com/google/android/gms/vision/barcode/Barcode.ContactInfo.html", type:"class", deprecated:"false" },
+ { id:769, label:"com.google.android.gms.vision.barcode.Barcode.DriverLicense", link:"reference/com/google/android/gms/vision/barcode/Barcode.DriverLicense.html", type:"class", deprecated:"false" },
+ { id:770, label:"com.google.android.gms.vision.barcode.Barcode.Email", link:"reference/com/google/android/gms/vision/barcode/Barcode.Email.html", type:"class", deprecated:"false" },
+ { id:771, label:"com.google.android.gms.vision.barcode.Barcode.GeoPoint", link:"reference/com/google/android/gms/vision/barcode/Barcode.GeoPoint.html", type:"class", deprecated:"false" },
+ { id:772, label:"com.google.android.gms.vision.barcode.Barcode.PersonName", link:"reference/com/google/android/gms/vision/barcode/Barcode.PersonName.html", type:"class", deprecated:"false" },
+ { id:773, label:"com.google.android.gms.vision.barcode.Barcode.Phone", link:"reference/com/google/android/gms/vision/barcode/Barcode.Phone.html", type:"class", deprecated:"false" },
+ { id:774, label:"com.google.android.gms.vision.barcode.Barcode.Sms", link:"reference/com/google/android/gms/vision/barcode/Barcode.Sms.html", type:"class", deprecated:"false" },
+ { id:775, label:"com.google.android.gms.vision.barcode.Barcode.UrlBookmark", link:"reference/com/google/android/gms/vision/barcode/Barcode.UrlBookmark.html", type:"class", deprecated:"false" },
+ { id:776, label:"com.google.android.gms.vision.barcode.Barcode.WiFi", link:"reference/com/google/android/gms/vision/barcode/Barcode.WiFi.html", type:"class", deprecated:"false" },
+ { id:777, label:"com.google.android.gms.vision.barcode.BarcodeDetector", link:"reference/com/google/android/gms/vision/barcode/BarcodeDetector.html", type:"class", deprecated:"false" },
+ { id:778, label:"com.google.android.gms.vision.barcode.BarcodeDetector.Builder", link:"reference/com/google/android/gms/vision/barcode/BarcodeDetector.Builder.html", type:"class", deprecated:"false" },
+ { id:779, label:"com.google.android.gms.vision.face", link:"reference/com/google/android/gms/vision/face/package-summary.html", type:"package", deprecated:"false" },
+ { id:780, label:"com.google.android.gms.vision.face.Face", link:"reference/com/google/android/gms/vision/face/Face.html", type:"class", deprecated:"false" },
+ { id:781, label:"com.google.android.gms.vision.face.FaceDetector", link:"reference/com/google/android/gms/vision/face/FaceDetector.html", type:"class", deprecated:"false" },
+ { id:782, label:"com.google.android.gms.vision.face.FaceDetector.Builder", link:"reference/com/google/android/gms/vision/face/FaceDetector.Builder.html", type:"class", deprecated:"false" },
+ { id:783, label:"com.google.android.gms.vision.face.Landmark", link:"reference/com/google/android/gms/vision/face/Landmark.html", type:"class", deprecated:"false" },
+ { id:784, label:"com.google.android.gms.vision.face.LargestFaceFocusingProcessor", link:"reference/com/google/android/gms/vision/face/LargestFaceFocusingProcessor.html", type:"class", deprecated:"false" },
+ { id:785, label:"com.google.android.gms.wallet", link:"reference/com/google/android/gms/wallet/package-summary.html", type:"package", deprecated:"false" },
+ { id:786, label:"com.google.android.gms.wallet.Address", link:"reference/com/google/android/gms/wallet/Address.html", type:"class", deprecated:"true" },
+ { id:787, label:"com.google.android.gms.wallet.Cart", link:"reference/com/google/android/gms/wallet/Cart.html", type:"class", deprecated:"false" },
+ { id:788, label:"com.google.android.gms.wallet.Cart.Builder", link:"reference/com/google/android/gms/wallet/Cart.Builder.html", type:"class", deprecated:"false" },
+ { id:789, label:"com.google.android.gms.wallet.CountrySpecification", link:"reference/com/google/android/gms/wallet/CountrySpecification.html", type:"class", deprecated:"true" },
+ { id:790, label:"com.google.android.gms.wallet.EnableWalletOptimizationReceiver", link:"reference/com/google/android/gms/wallet/EnableWalletOptimizationReceiver.html", type:"class", deprecated:"false" },
+ { id:791, label:"com.google.android.gms.wallet.FullWallet", link:"reference/com/google/android/gms/wallet/FullWallet.html", type:"class", deprecated:"false" },
+ { id:792, label:"com.google.android.gms.wallet.FullWalletRequest", link:"reference/com/google/android/gms/wallet/FullWalletRequest.html", type:"class", deprecated:"false" },
+ { id:793, label:"com.google.android.gms.wallet.FullWalletRequest.Builder", link:"reference/com/google/android/gms/wallet/FullWalletRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:794, label:"com.google.android.gms.wallet.GiftCardWalletObject", link:"reference/com/google/android/gms/wallet/GiftCardWalletObject.html", type:"class", deprecated:"false" },
+ { id:795, label:"com.google.android.gms.wallet.InstrumentInfo", link:"reference/com/google/android/gms/wallet/InstrumentInfo.html", type:"class", deprecated:"false" },
+ { id:796, label:"com.google.android.gms.wallet.LineItem", link:"reference/com/google/android/gms/wallet/LineItem.html", type:"class", deprecated:"false" },
+ { id:797, label:"com.google.android.gms.wallet.LineItem.Builder", link:"reference/com/google/android/gms/wallet/LineItem.Builder.html", type:"class", deprecated:"false" },
+ { id:798, label:"com.google.android.gms.wallet.LineItem.Role", link:"reference/com/google/android/gms/wallet/LineItem.Role.html", type:"class", deprecated:"false" },
+ { id:799, label:"com.google.android.gms.wallet.LoyaltyWalletObject", link:"reference/com/google/android/gms/wallet/LoyaltyWalletObject.html", type:"class", deprecated:"false" },
+ { id:800, label:"com.google.android.gms.wallet.MaskedWallet", link:"reference/com/google/android/gms/wallet/MaskedWallet.html", type:"class", deprecated:"false" },
+ { id:801, label:"com.google.android.gms.wallet.MaskedWallet.Builder", link:"reference/com/google/android/gms/wallet/MaskedWallet.Builder.html", type:"class", deprecated:"false" },
+ { id:802, label:"com.google.android.gms.wallet.MaskedWalletRequest", link:"reference/com/google/android/gms/wallet/MaskedWalletRequest.html", type:"class", deprecated:"false" },
+ { id:803, label:"com.google.android.gms.wallet.MaskedWalletRequest.Builder", link:"reference/com/google/android/gms/wallet/MaskedWalletRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:804, label:"com.google.android.gms.wallet.NotifyTransactionStatusRequest", link:"reference/com/google/android/gms/wallet/NotifyTransactionStatusRequest.html", type:"class", deprecated:"false" },
+ { id:805, label:"com.google.android.gms.wallet.NotifyTransactionStatusRequest.Builder", link:"reference/com/google/android/gms/wallet/NotifyTransactionStatusRequest.Builder.html", type:"class", deprecated:"false" },
+ { id:806, label:"com.google.android.gms.wallet.NotifyTransactionStatusRequest.Status", link:"reference/com/google/android/gms/wallet/NotifyTransactionStatusRequest.Status.html", type:"class", deprecated:"false" },
+ { id:807, label:"com.google.android.gms.wallet.NotifyTransactionStatusRequest.Status.Error", link:"reference/com/google/android/gms/wallet/NotifyTransactionStatusRequest.Status.Error.html", type:"class", deprecated:"false" },
+ { id:808, label:"com.google.android.gms.wallet.OfferWalletObject", link:"reference/com/google/android/gms/wallet/OfferWalletObject.html", type:"class", deprecated:"false" },
+ { id:809, label:"com.google.android.gms.wallet.PaymentInstrumentType", link:"reference/com/google/android/gms/wallet/PaymentInstrumentType.html", type:"class", deprecated:"false" },
+ { id:810, label:"com.google.android.gms.wallet.PaymentMethodToken", link:"reference/com/google/android/gms/wallet/PaymentMethodToken.html", type:"class", deprecated:"false" },
+ { id:811, label:"com.google.android.gms.wallet.PaymentMethodTokenizationParameters", link:"reference/com/google/android/gms/wallet/PaymentMethodTokenizationParameters.html", type:"class", deprecated:"false" },
+ { id:812, label:"com.google.android.gms.wallet.PaymentMethodTokenizationParameters.Builder", link:"reference/com/google/android/gms/wallet/PaymentMethodTokenizationParameters.Builder.html", type:"class", deprecated:"false" },
+ { id:813, label:"com.google.android.gms.wallet.PaymentMethodTokenizationType", link:"reference/com/google/android/gms/wallet/PaymentMethodTokenizationType.html", type:"class", deprecated:"false" },
+ { id:814, label:"com.google.android.gms.wallet.Payments", link:"reference/com/google/android/gms/wallet/Payments.html", type:"class", deprecated:"false" },
+ { id:815, label:"com.google.android.gms.wallet.ProxyCard", link:"reference/com/google/android/gms/wallet/ProxyCard.html", type:"class", deprecated:"false" },
+ { id:816, label:"com.google.android.gms.wallet.Wallet", link:"reference/com/google/android/gms/wallet/Wallet.html", type:"class", deprecated:"false" },
+ { id:817, label:"com.google.android.gms.wallet.Wallet.WalletOptions", link:"reference/com/google/android/gms/wallet/Wallet.WalletOptions.html", type:"class", deprecated:"false" },
+ { id:818, label:"com.google.android.gms.wallet.Wallet.WalletOptions.Builder", link:"reference/com/google/android/gms/wallet/Wallet.WalletOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:819, label:"com.google.android.gms.wallet.WalletConstants", link:"reference/com/google/android/gms/wallet/WalletConstants.html", type:"class", deprecated:"false" },
+ { id:820, label:"com.google.android.gms.wallet.WalletConstants.CardNetwork", link:"reference/com/google/android/gms/wallet/WalletConstants.CardNetwork.html", type:"class", deprecated:"false" },
+ { id:821, label:"com.google.android.gms.wallet.fragment", link:"reference/com/google/android/gms/wallet/fragment/package-summary.html", type:"package", deprecated:"false" },
+ { id:822, label:"com.google.android.gms.wallet.fragment.BuyButtonAppearance", link:"reference/com/google/android/gms/wallet/fragment/BuyButtonAppearance.html", type:"class", deprecated:"true" },
+ { id:823, label:"com.google.android.gms.wallet.fragment.BuyButtonText", link:"reference/com/google/android/gms/wallet/fragment/BuyButtonText.html", type:"class", deprecated:"true" },
+ { id:824, label:"com.google.android.gms.wallet.fragment.Dimension", link:"reference/com/google/android/gms/wallet/fragment/Dimension.html", type:"class", deprecated:"true" },
+ { id:825, label:"com.google.android.gms.wallet.fragment.SupportWalletFragment", link:"reference/com/google/android/gms/wallet/fragment/SupportWalletFragment.html", type:"class", deprecated:"false" },
+ { id:826, label:"com.google.android.gms.wallet.fragment.SupportWalletFragment.OnStateChangedListener", link:"reference/com/google/android/gms/wallet/fragment/SupportWalletFragment.OnStateChangedListener.html", type:"class", deprecated:"false" },
+ { id:827, label:"com.google.android.gms.wallet.fragment.WalletFragment", link:"reference/com/google/android/gms/wallet/fragment/WalletFragment.html", type:"class", deprecated:"false" },
+ { id:828, label:"com.google.android.gms.wallet.fragment.WalletFragment.OnStateChangedListener", link:"reference/com/google/android/gms/wallet/fragment/WalletFragment.OnStateChangedListener.html", type:"class", deprecated:"false" },
+ { id:829, label:"com.google.android.gms.wallet.fragment.WalletFragmentInitParams", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentInitParams.html", type:"class", deprecated:"false" },
+ { id:830, label:"com.google.android.gms.wallet.fragment.WalletFragmentInitParams.Builder", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentInitParams.Builder.html", type:"class", deprecated:"false" },
+ { id:831, label:"com.google.android.gms.wallet.fragment.WalletFragmentMode", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentMode.html", type:"class", deprecated:"false" },
+ { id:832, label:"com.google.android.gms.wallet.fragment.WalletFragmentOptions", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentOptions.html", type:"class", deprecated:"false" },
+ { id:833, label:"com.google.android.gms.wallet.fragment.WalletFragmentOptions.Builder", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:834, label:"com.google.android.gms.wallet.fragment.WalletFragmentState", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentState.html", type:"class", deprecated:"false" },
+ { id:835, label:"com.google.android.gms.wallet.fragment.WalletFragmentStyle", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentStyle.html", type:"class", deprecated:"false" },
+ { id:836, label:"com.google.android.gms.wallet.fragment.WalletFragmentStyle.BuyButtonAppearance", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentStyle.BuyButtonAppearance.html", type:"class", deprecated:"false" },
+ { id:837, label:"com.google.android.gms.wallet.fragment.WalletFragmentStyle.BuyButtonText", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentStyle.BuyButtonText.html", type:"class", deprecated:"false" },
+ { id:838, label:"com.google.android.gms.wallet.fragment.WalletFragmentStyle.Dimension", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentStyle.Dimension.html", type:"class", deprecated:"false" },
+ { id:839, label:"com.google.android.gms.wallet.fragment.WalletFragmentStyle.LogoImageType", link:"reference/com/google/android/gms/wallet/fragment/WalletFragmentStyle.LogoImageType.html", type:"class", deprecated:"false" },
+ { id:840, label:"com.google.android.gms.wallet.fragment.WalletLogoImageType", link:"reference/com/google/android/gms/wallet/fragment/WalletLogoImageType.html", type:"class", deprecated:"true" },
+ { id:841, label:"com.google.android.gms.wearable", link:"reference/com/google/android/gms/wearable/package-summary.html", type:"package", deprecated:"false" },
+ { id:842, label:"com.google.android.gms.wearable.Asset", link:"reference/com/google/android/gms/wearable/Asset.html", type:"class", deprecated:"false" },
+ { id:843, label:"com.google.android.gms.wearable.CapabilityApi", link:"reference/com/google/android/gms/wearable/CapabilityApi.html", type:"class", deprecated:"false" },
+ { id:844, label:"com.google.android.gms.wearable.CapabilityApi.AddLocalCapabilityResult", link:"reference/com/google/android/gms/wearable/CapabilityApi.AddLocalCapabilityResult.html", type:"class", deprecated:"false" },
+ { id:845, label:"com.google.android.gms.wearable.CapabilityApi.CapabilityListener", link:"reference/com/google/android/gms/wearable/CapabilityApi.CapabilityListener.html", type:"class", deprecated:"false" },
+ { id:846, label:"com.google.android.gms.wearable.CapabilityApi.GetAllCapabilitiesResult", link:"reference/com/google/android/gms/wearable/CapabilityApi.GetAllCapabilitiesResult.html", type:"class", deprecated:"false" },
+ { id:847, label:"com.google.android.gms.wearable.CapabilityApi.GetCapabilityResult", link:"reference/com/google/android/gms/wearable/CapabilityApi.GetCapabilityResult.html", type:"class", deprecated:"false" },
+ { id:848, label:"com.google.android.gms.wearable.CapabilityApi.RemoveLocalCapabilityResult", link:"reference/com/google/android/gms/wearable/CapabilityApi.RemoveLocalCapabilityResult.html", type:"class", deprecated:"false" },
+ { id:849, label:"com.google.android.gms.wearable.CapabilityInfo", link:"reference/com/google/android/gms/wearable/CapabilityInfo.html", type:"class", deprecated:"false" },
+ { id:850, label:"com.google.android.gms.wearable.Channel", link:"reference/com/google/android/gms/wearable/Channel.html", type:"class", deprecated:"false" },
+ { id:851, label:"com.google.android.gms.wearable.Channel.GetInputStreamResult", link:"reference/com/google/android/gms/wearable/Channel.GetInputStreamResult.html", type:"class", deprecated:"false" },
+ { id:852, label:"com.google.android.gms.wearable.Channel.GetOutputStreamResult", link:"reference/com/google/android/gms/wearable/Channel.GetOutputStreamResult.html", type:"class", deprecated:"false" },
+ { id:853, label:"com.google.android.gms.wearable.ChannelApi", link:"reference/com/google/android/gms/wearable/ChannelApi.html", type:"class", deprecated:"false" },
+ { id:854, label:"com.google.android.gms.wearable.ChannelApi.ChannelListener", link:"reference/com/google/android/gms/wearable/ChannelApi.ChannelListener.html", type:"class", deprecated:"false" },
+ { id:855, label:"com.google.android.gms.wearable.ChannelApi.CloseReason", link:"reference/com/google/android/gms/wearable/ChannelApi.CloseReason.html", type:"class", deprecated:"false" },
+ { id:856, label:"com.google.android.gms.wearable.ChannelApi.OpenChannelResult", link:"reference/com/google/android/gms/wearable/ChannelApi.OpenChannelResult.html", type:"class", deprecated:"false" },
+ { id:857, label:"com.google.android.gms.wearable.ChannelIOException", link:"reference/com/google/android/gms/wearable/ChannelIOException.html", type:"class", deprecated:"false" },
+ { id:858, label:"com.google.android.gms.wearable.DataApi", link:"reference/com/google/android/gms/wearable/DataApi.html", type:"class", deprecated:"false" },
+ { id:859, label:"com.google.android.gms.wearable.DataApi.DataItemResult", link:"reference/com/google/android/gms/wearable/DataApi.DataItemResult.html", type:"class", deprecated:"false" },
+ { id:860, label:"com.google.android.gms.wearable.DataApi.DataListener", link:"reference/com/google/android/gms/wearable/DataApi.DataListener.html", type:"class", deprecated:"false" },
+ { id:861, label:"com.google.android.gms.wearable.DataApi.DeleteDataItemsResult", link:"reference/com/google/android/gms/wearable/DataApi.DeleteDataItemsResult.html", type:"class", deprecated:"false" },
+ { id:862, label:"com.google.android.gms.wearable.DataApi.GetFdForAssetResult", link:"reference/com/google/android/gms/wearable/DataApi.GetFdForAssetResult.html", type:"class", deprecated:"false" },
+ { id:863, label:"com.google.android.gms.wearable.DataEvent", link:"reference/com/google/android/gms/wearable/DataEvent.html", type:"class", deprecated:"false" },
+ { id:864, label:"com.google.android.gms.wearable.DataEventBuffer", link:"reference/com/google/android/gms/wearable/DataEventBuffer.html", type:"class", deprecated:"false" },
+ { id:865, label:"com.google.android.gms.wearable.DataItem", link:"reference/com/google/android/gms/wearable/DataItem.html", type:"class", deprecated:"false" },
+ { id:866, label:"com.google.android.gms.wearable.DataItemAsset", link:"reference/com/google/android/gms/wearable/DataItemAsset.html", type:"class", deprecated:"false" },
+ { id:867, label:"com.google.android.gms.wearable.DataItemBuffer", link:"reference/com/google/android/gms/wearable/DataItemBuffer.html", type:"class", deprecated:"false" },
+ { id:868, label:"com.google.android.gms.wearable.DataMap", link:"reference/com/google/android/gms/wearable/DataMap.html", type:"class", deprecated:"false" },
+ { id:869, label:"com.google.android.gms.wearable.DataMapItem", link:"reference/com/google/android/gms/wearable/DataMapItem.html", type:"class", deprecated:"false" },
+ { id:870, label:"com.google.android.gms.wearable.MessageApi", link:"reference/com/google/android/gms/wearable/MessageApi.html", type:"class", deprecated:"false" },
+ { id:871, label:"com.google.android.gms.wearable.MessageApi.MessageListener", link:"reference/com/google/android/gms/wearable/MessageApi.MessageListener.html", type:"class", deprecated:"false" },
+ { id:872, label:"com.google.android.gms.wearable.MessageApi.SendMessageResult", link:"reference/com/google/android/gms/wearable/MessageApi.SendMessageResult.html", type:"class", deprecated:"false" },
+ { id:873, label:"com.google.android.gms.wearable.MessageEvent", link:"reference/com/google/android/gms/wearable/MessageEvent.html", type:"class", deprecated:"false" },
+ { id:874, label:"com.google.android.gms.wearable.Node", link:"reference/com/google/android/gms/wearable/Node.html", type:"class", deprecated:"false" },
+ { id:875, label:"com.google.android.gms.wearable.NodeApi", link:"reference/com/google/android/gms/wearable/NodeApi.html", type:"class", deprecated:"false" },
+ { id:876, label:"com.google.android.gms.wearable.NodeApi.GetConnectedNodesResult", link:"reference/com/google/android/gms/wearable/NodeApi.GetConnectedNodesResult.html", type:"class", deprecated:"false" },
+ { id:877, label:"com.google.android.gms.wearable.NodeApi.GetLocalNodeResult", link:"reference/com/google/android/gms/wearable/NodeApi.GetLocalNodeResult.html", type:"class", deprecated:"false" },
+ { id:878, label:"com.google.android.gms.wearable.NodeApi.NodeListener", link:"reference/com/google/android/gms/wearable/NodeApi.NodeListener.html", type:"class", deprecated:"false" },
+ { id:879, label:"com.google.android.gms.wearable.PutDataMapRequest", link:"reference/com/google/android/gms/wearable/PutDataMapRequest.html", type:"class", deprecated:"false" },
+ { id:880, label:"com.google.android.gms.wearable.PutDataRequest", link:"reference/com/google/android/gms/wearable/PutDataRequest.html", type:"class", deprecated:"false" },
+ { id:881, label:"com.google.android.gms.wearable.Wearable", link:"reference/com/google/android/gms/wearable/Wearable.html", type:"class", deprecated:"false" },
+ { id:882, label:"com.google.android.gms.wearable.Wearable.WearableOptions", link:"reference/com/google/android/gms/wearable/Wearable.WearableOptions.html", type:"class", deprecated:"false" },
+ { id:883, label:"com.google.android.gms.wearable.Wearable.WearableOptions.Builder", link:"reference/com/google/android/gms/wearable/Wearable.WearableOptions.Builder.html", type:"class", deprecated:"false" },
+ { id:884, label:"com.google.android.gms.wearable.WearableListenerService", link:"reference/com/google/android/gms/wearable/WearableListenerService.html", type:"class", deprecated:"false" },
+ { id:885, label:"com.google.android.gms.wearable.WearableStatusCodes", link:"reference/com/google/android/gms/wearable/WearableStatusCodes.html", type:"class", deprecated:"false" }
+
+ ];
diff --git a/docs/html/sdk/installing/adding-packages.jd b/docs/html/sdk/installing/adding-packages.jd
index 58a8065..88619bd 100644
--- a/docs/html/sdk/installing/adding-packages.jd
+++ b/docs/html/sdk/installing/adding-packages.jd
@@ -64,10 +64,10 @@
<p>To start adding packages, launch the Android SDK Manager in one of the following ways:</p>
<ul>
- <li>In Eclipse or Android Studio, click <strong>SDK Manager</strong>
+ <li>In Android Studio, click <strong>SDK Manager</strong>
<img src="{@docRoot}images/tools/sdk-manager-studio.png"
style="vertical-align:bottom;margin:0;height:17px" /> in the toolbar.</li>
- <li>If you're not using Eclipse or Android Studio:
+ <li>If you're not using Android Studio:
<ul>
<li>Windows: Double-click the <code>SDK Manager.exe</code> file at the root of the Android
SDK directory.</li>
@@ -77,7 +77,7 @@
</li>
</ul>
-<p>When you open the SDK Manager for the first time, several packages will be selected by
+<p>When you open the SDK Manager for the first time, several packages are selected by
default. Leave these selected, but be sure you have everything you need
to get started by following these steps:</p>
diff --git a/docs/html/sdk/installing/index.jd b/docs/html/sdk/installing/index.jd
index 45d1890..dc258db 100644
--- a/docs/html/sdk/installing/index.jd
+++ b/docs/html/sdk/installing/index.jd
@@ -87,7 +87,7 @@
<p><b>To set up Android Studio on Mac OSX:</b></p>
<ol>
- <li>Unzip the downloaded zip file, {@code android-studio-ide-<version>-mac.zip}.</li>
+ <li>Launch the {@code .dmg} file you just downloaded.</li>
<li>Drag and drop Android Studio into the Applications folder.
<li>Open Android Studio and follow the setup wizard to install any necessary SDK tools.
<p>
@@ -97,13 +97,11 @@
<strong>Allow applications downloaded from</strong>, select <strong>Anywhere</strong>.
Then open Android Studio again.</p>
</li>
- <li>Follow the links to install the SDK outside of the Android Studio directories.</li>
</ol>
-<p>The individual tools and other SDK packages are saved outside the Android Studio application
-directory. If you need access the tools directly, use a terminal to navigate into the location
-where they are installed. For example:</p>
-<p><code>/Applications/sdk/</code></p>
+<p>If you need use the Android SDK tools from a command line,
+you can access them at:</p>
+<p><code>/Users/<user>/Library/Android/sdk/</code></p>
</div><!-- end mac -->
@@ -114,7 +112,7 @@
<p><b>To set up Android Studio on Linux:</b></p>
<ol>
- <li>Unpack the downloaded Tar file, {@code android-studio-ide-<version>-linux.zip}, into an
+ <li>Unpack the downloaded ZIP file into an
appropriate location for your applications.
<li>To launch Android Studio, navigate to the {@code android-studio/bin/} directory
in a terminal and execute {@code studio.sh}.
diff --git a/docs/html/tools/building/buidling-cmdline-ant.jd b/docs/html/tools/building/buidling-cmdline-ant.jd
deleted file mode 100644
index 51158de..0000000
--- a/docs/html/tools/building/buidling-cmdline-ant.jd
+++ /dev/null
@@ -1,381 +0,0 @@
-page.title=Building and Running from the Command Line
-parent.title=Building and Running
-parent.link=index.html
-@jd:body
-
- <div id="qv-wrapper">
- <div id="qv">
- <h2>In this document</h2>
- <ol>
- <li><a href="#DebugMode">Building in Debug Mode</a></li>
- <li><a href="#ReleaseMode">Building in Release Mode</a>
- <ol>
- <li><a href="#ManualReleaseMode">Build unsigned</a></li>
- <li><a href="#AutoReleaseMode">Build signed and aligned</a></li>
- <li><a href="#OnceBuilt">Once built and signed in release mode</a></li>
- </ol>
- </li>
- <li><a href="#RunningOnEmulator">Running on the Emulator</a></li>
- <li><a href="#RunningOnDevice">Running on a Device</a></li>
- <li><a href="#Signing">Application Signing</a></li>
- <li><a href="#AntReference">Ant Command Reference</a></li>
- </ol>
- <h2>See also</h2>
- <ol>
- <li><a href="{@docRoot}tools/devices/managing-avds-cmdline.html">Managing AVDs from
-the Command Line</a></li>
- <li><a href="{@docRoot}tools/devices/emulator.html">Using the Android
-Emulator</a></li>
- <li><a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a></li>
- </ol>
- </div>
- </div>
-
- <p>There are two ways to build your application using the Ant build script: one for
- testing/debugging your application — <em>debug mode</em> — and one for building your
- final package for release — <em>release mode</em>. Regardless of which way you build your application,
- it must be signed before it can install on an emulator or device—with a debug key when building
- in debug mode and with your own private key when building in release mode.</p>
-
- <p>Whether you're building in debug mode or release mode, you need to use the Ant tool to compile
- and build your project. This will create the .apk file that you can install on an emulator or device.
- When you build in debug mode, the .apk file is automatically signed by the SDK tools with
- a debug key, so it's instantly ready for installation onto an emulator or attached
- development device. You cannot distribute an application that is signed with a debug key.
- When you build in release mode, the .apk file is <em>unsigned</em>, so you
- must manually sign it with your own private key, using Keytool and Jarsigner.</p>
-
- <p>It's important that you read and understand <a href=
- "{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a>, particularly once
- you're ready to release your application and share it with end-users. That document describes the
- procedure for generating a private key and then using it to sign your .apk file. If you're just
- getting started, however, you can quickly run your applications on an emulator or your own
- development device by building in debug mode.</p>
-
- <p>If you don't have Ant, you can obtain it from the <a href="http://ant.apache.org/">Apache Ant
- home page</a>. Install it and make sure it is in your executable PATH. Before calling Ant, you
- need to declare the JAVA_HOME environment variable to specify the path to where the JDK is
- installed.</p>
-
- <p class="note"><strong>Note:</strong> When installing JDK on Windows, the default is to install
- in the "Program Files" directory. This location will cause <code>ant</code> to fail, because of
- the space. To fix the problem, you can specify the JAVA_HOME variable like this:
- <pre>set JAVA_HOME=c:\Progra~1\Java\<jdkdir></pre>
-
- <p>The easiest solution, however, is to install JDK in a non-space directory, for example:</p>
-
- <pre>c:\java\jdk1.7</pre>
-
- <h2 id="DebugMode">Building in Debug Mode</h2>
-
- <p>For immediate application testing and debugging, you can build your application in debug mode
- and immediately install it on an emulator. In debug mode, the build tools automatically sign your
- application with a debug key and optimize the package with {@code zipalign}.</p>
-
- <p>To build in debug mode:</p>
-
- <ol>
- <li>Open a command-line and navigate to the root of your project directory.</li>
- <li>Use Ant to compile your project in debug mode:
- <pre>
-ant debug
-</pre>
-
- <p>This creates your debug <code>.apk</code> file inside the project <code>bin/</code> directory, named
- <code><your_project_name>-debug.apk</code>. The file is already signed with
- the debug key and has been aligned with
- <a href="{@docRoot}tools/help/zipalign.html"><code>zipalign</code></a>.
- </p>
- </li>
- </ol>
-
- <p>Each time you change a source file or resource, you must run Ant again in order to package up
- the latest version of the application.</p>
-
- <p>To install and run your application on an emulator, see the following section about <a href=
- "#RunningOnEmulator">Running on the Emulator</a>.</p>
-
- <h2 id="ReleaseMode">Building in Release Mode</h2>
-
- <p>When you're ready to release and distribute your application to end-users, you must build your
- application in release mode. Once you have built in release mode, it's a good idea to perform
- additional testing and debugging with the final .apk.</p>
-
- <p>Before you start building your application in release mode, be aware that you must sign the
- resulting application package with your private key, and should then align it using the {@code
- zipalign} tool. There are two approaches to building in release mode: build an unsigned package
- in release mode and then manually sign and align the package, or allow the build script to sign
- and align the package for you.</p>
-
- <h3 id="ManualReleaseMode">Build unsigned</h3>
-
- <p>If you build your application <em>unsigned</em>, then you will need to manually sign and align
- the package.</p>
-
- <p>To build an <em>unsigned</em> .apk in release mode:</p>
-
- <ol>
- <li>Open a command-line and navigate to the root of your project directory.</li>
-
- <li>Use Ant to compile your project in release mode:
- <pre>
-ant release
-</pre>
- </li>
- </ol>
-
- <p>This creates your Android application .apk file inside the project <code>bin/</code>
- directory, named <code><em><your_project_name></em>-unsigned.apk</code>.</p>
-
- <p class="note"><strong>Note:</strong> The .apk file is <em>unsigned</em> at this point and can't
- be installed until signed with your private key.</p>
-
- <p>Once you have created the unsigned .apk, your next step is to sign the .apk with your private
- key and then align it with {@code zipalign}. To complete this procedure, read <a href=
- "{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a>.</p>
-
- <p>When your <code>.apk</code> has been signed and aligned, it's ready to be distributed to end-users.
- You should test the final build on different devices or AVDs to ensure that it
- runs properly on different platforms.</p>
-
- <h3 id="AutoReleaseMode">Build signed and aligned</h3>
-
- <p>If you would like, you can configure the Android build script to automatically sign and align
- your application package. To do so, you must provide the path to your keystore and the name of
- your key alias in your project's {@code ant.properties} file. With this information provided,
- the build script will prompt you for your keystore and alias password when you build in release
- mode and produce your final application package, which will be ready for distribution.</p>
-
- <p class="caution"><strong>Caution:</strong> Due to the way Ant handles input, the password that
- you enter during the build process <strong>will be visible</strong>. If you are concerned about
- your keystore and alias password being visible on screen, then you may prefer to perform the
- application signing manually, via Jarsigner (or a similar tool). To instead perform the signing
- procedure manually, <a href="#ManualReleaseMode">build unsigned</a> and then continue with
- <a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a>.</p>
-
- <p>To specify your keystore and alias, open the project {@code ant.properties} file (found in
- the root of the project directory) and add entries for {@code key.store} and {@code key.alias}.
- For example:</p>
- <pre>
-key.store=path/to/my.keystore
-key.alias=mykeystore
-</pre>
-
- <p>Save your changes. Now you can build a <em>signed</em> .apk in release mode:</p>
-
- <ol>
- <li>Open a command-line and navigate to the root of your project directory.</li>
-
- <li>Use Ant to compile your project in release mode:
- <pre>
-ant release
-</pre>
- </li>
-
- <li>When prompted, enter you keystore and alias passwords.
-
- <p class="caution"><strong>Caution:</strong> As described above, your password will be
- visible on the screen.</p>
- </li>
- </ol>
-
- <p>This creates your Android application .apk file inside the project <code>bin/</code>
- directory, named <code><em><your_project_name></em>-release.apk</code>. This .apk file has
- been signed with the private key specified in {@code ant.properties} and aligned with {@code
- zipalign}. It's ready for installation and distribution.</p>
-
- <h3 id="OnceBuilt">Once built and signed in release mode</h3>
-
- <p>Once you have signed your application with a private key, you can install and run it on an
- <a href="#RunningOnEmulator">emulator</a> or <a href="#RunningOnDevice">device</a>. You can
- also try installing it onto a device from a web server. Simply upload the signed .apk to a web
- site, then load the .apk URL in your Android web browser to download the application and begin
- installation. (On your device, be sure you have enabled
- <em>Settings > Applications > Unknown sources</em>.)</p>
-
- <h2 id="RunningOnEmulator">Running on the Emulator</h2>
-
- <p>Before you can run your application on the Android Emulator, you must <a href=
- "{@docRoot}tools/devices/managing-avds.html">create an AVD</a>.</p>
-
- <p>To run your application:</p>
-
- <ol>
- <li>
- <strong>Open the AVD Manager and launch a virtual device</strong>
-
- <p>From your SDK's <code>platform-tools/</code> directory, execute the {@code android} tool
-with the <code>avd</code> options:</p>
- <pre>
-android avd
-</pre>
-
- <p>In the <em>Virtual Devices</em> view, select an AVD and click <strong>Start</strong>.</p>
- </li>
-
- <li>
- <strong>Install your application</strong>
-
- <p>From your SDK's <code>tools/</code> directory, install the {@code .apk} on the
- emulator:</p>
- <pre>
-adb install <em><path_to_your_bin></em>.apk
-</pre>
-
- <p>Your .apk file (signed with either a release or debug key) is in your project {@code bin/}
- directory after you build your application.</p>
-
- <p>If there is more than one emulator running, you must specify the emulator upon which to
- install the application, by its serial number, with the <code>-s</code> option. For
- example:</p>
- <pre>
-adb -s emulator-5554 install <em>path/to/your/app</em>.apk
-</pre>
-
- <p>To see a list of available device serial numbers, execute {@code adb devices}.</p>
- </li>
- </ol>
-
- <p>If you don't see your application on the emulator, try closing the emulator and launching the
- virtual device again from the AVD Manager. Sometimes when you install an application for the
- first time, it won't show up in the application launcher or be accessible by other applications.
- This is because the package manager usually examines manifests completely only on emulator
- startup.</p>
-
- <p>Be certain to create multiple AVDs upon which to test your application. You should have one
- AVD for each platform and screen type with which your application is compatible. For instance, if
- your application compiles against the Android 4.0 (API Level 14) platform, you should create an
- AVD for each platform equal to and greater than 4.0 and an AVD for each <a href=
- "{@docRoot}guide/practices/screens_support.html">screen type</a> you support, then test your
- application on each one.</p>
-
- <p class="note"><strong>Tip:</strong> If you have <em>only one</em> emulator running, you can
- build your application and install it on the emulator in one simple step. Navigate to the root of
- your project directory and use Ant to compile the project with <em>install mode</em>: <code>ant
- install</code>. This will build your application, sign it with the debug key, and install it on
- the currently running emulator.</p>
-
- <h2 id="RunningOnDevice">Running on a Device</h2>
-
- <p>Before you can run your application on a device, you must perform some basic setup for your
- device:</p>
-
- <ul>
- <li>Enable <strong>USB debugging</strong> on your device.
- <ul>
- <li>On most devices running Android 3.2 or older, you can find the option under
- <strong>Settings > Applications > Development</strong>.</li>
- <li>On Android 4.0 and newer, it's in <strong>Settings > Developer options</strong>.
- <p class="note"><strong>Note:</strong> On Android 4.2 and newer, <strong>Developer
- options</strong> is hidden by default. To make it available, go
- to <strong>Settings > About phone</strong> and tap <strong>Build number</strong>
- seven times. Return to the previous screen to find <strong>Developer options</strong>.</p>
- </li>
- </ul>
- </li>
-
- <li>Ensure that your development computer can detect your device when connected via USB</li>
- </ul>
-
- <p>Read <a href="{@docRoot}tools/device.html#setting-up">Setting up a Device for
- Development</a> for more information.</p>
-
- <p>Once your device is set up and connected via USB, navigate to your SDK's <code>platform-tools/</code>
- directory and install the <code>.apk</code> on the device:</p>
- <pre>
-adb -d install <em>path/to/your/app</em>.apk
-</pre>
-
- <p>The {@code -d} flag specifies that you want to use the attached device (in case you also have
- an emulator running).</p>
-
- <p>For more information on the tools used above, please see the following documents:</p>
-
- <ul>
- <li><a href="{@docRoot}tools/help/android.html">android Tool</a></li>
-
- <li><a href="{@docRoot}tools/devices/emulator.html">Android Emulator</a></li>
-
- <li><a href="{@docRoot}tools/help/adb.html">Android Debug Bridge</a> (ADB)</li>
- </ul>
-
- <h2 id="Signing">Application Signing</h2>
-
- <p>As you begin developing Android applications, understand that all Android applications must be
- digitally signed before the system will install them on an emulator or device. There are two ways
- to do this: with a <em>debug key</em> (for immediate testing on an emulator or development
- device) or with a <em>private key</em> (for application distribution).</p>
-
- <p>The Android build tools help you get started by automatically signing your .apk files with a
- debug key at build time. This means that you can compile your application and install it on the
- emulator without having to generate your own private key. However, please note that if you intend
- to publish your application, you <strong>must</strong> sign the application with your own private
- key, rather than the debug key generated by the SDK tools.</p>
-
- <p>The ADT plugin helps you get started quickly by signing your .apk files with a debug key,
- prior to installing them on an emulator or development device. This means that you can quickly
- run your application from Eclipse without having to generate your own private key. No specific
- action on your part is needed, provided ADT has access to Keytool. However, please note that if
- you intend to publish your application, you <strong>must</strong> sign the application with your
- own private key, rather than the debug key generated by the SDK tools.</p>
-
- <p>Please read <a href="{@docRoot}tools/publishing/app-signing.html">Signing Your
- Applications</a>, which provides a thorough guide to application signing on Android and what it
- means to you as an Android application developer. The document also includes a guide to exporting
- and signing your application with the ADT's Export Wizard.</p>
-
- <h2 id="AntReference">Ant Command Reference</h2>
- <dt><code>ant clean</code></dt>
- <dd>Cleans the project. If you include the <code>all</code> target before <code>clean</code>
-(<code>ant all clean</code>), other projects are also cleaned. For instance if you clean a
-test project, the tested project is also cleaned.</dd>
-
- <dt><code>ant debug</code></dt>
- <dd>Builds a debug package. Works on application, library, and test projects and compiles
- dependencies as needed.</dd>
-
- <dt id="emma"><code>ant emma debug</code></dt>
- <dd>Builds a test project while building the tested project with instrumentation turned on.
- This is used to run tests with code coverage enabled.</dd>
-
- <dt><code>ant release</code></dt>
- <dd>Builds a release package.</dd>
-
- <dt><code>ant instrument</code>
- </dt>
- <dd>Builds an instrumented debug package. This is generally called automatically when building a
- test project with code coverage enabled (with the <code>emma</code>
- target)</dd>
-
- <dt><code>ant <build_target> install</code></dt>
- <dd>Builds and installs a package. Using <code>install</code> by itself fails.</dd>
-
- <dt><code>ant installd</code></dt>
- <dd>Installs an already compiled debug package. This fails if the <code>.apk</code> is not
- already built.</dd>
-
- <dt><code>ant installr</code></dt>
- <dd>Installs an already compiled release package. This fails if the <code>.apk</code> is not
- already built.</dd>
-
- <dt><code>ant installt</code></dt>
- <dd>Installs an already compiled test package. Also installs the <code>.apk</code> of the
- tested application. This fails if the <code>.apk</code> is not already built.</dd>
-
- <dt><code>ant installi</code></dt>
- <dd>Installs an already compiled instrumented package. This is generally not used manually as
- it's called when installing a test package. This fails if the <code>.apk</code> is not already
- built.</dd>
-
- <dt><code>ant test</code></dt>
- <dd>Runs the tests (for test projects). The tested and test <code>.apk</code> files must be
- previously installed.</dd>
-
- <dt><code>ant debug installt test</code></dt>
- <dd>Builds a test project and the tested project, installs both <code>.apk</code> files, and
- runs the tests.</dd>
-
- <dt><code>ant emma debug install test</code></dt>
- <dd>Builds a test project and the tested project, installs both <code>.apk</code> files, and
- runs the tests with code coverage enabled.</dd>
-
diff --git a/docs/html/tools/building/building-eclipse.jd b/docs/html/tools/building/building-eclipse.jd
index 79ef3de..89c3e16 100644
--- a/docs/html/tools/building/building-eclipse.jd
+++ b/docs/html/tools/building/building-eclipse.jd
@@ -34,12 +34,12 @@
<p>This document shows you how to run your application on an emulator or a real device
from Eclipse—all of which is done using the debug version of your application.
For more information about how to sign your application with a private key for release, see <a href=
- "{@docRoot}tools/workflow/publishing/app-signing.html#ExportWizard">Signing Your Applications</a></p>
+ "{@docRoot}tools/publishing/app-signing.html#ExportWizard">Signing Your Applications</a></p>
<h2 id="RunningOnEmulatorEclipse">Running on the emulator</h2>
<p>Before you can run your application on the Android Emulator, you must <a href=
- "{@docRoot}tools/workflow/devices/managing-avds.html">create an AVD</a>.</p>
+ "{@docRoot}tools/devices/managing-avds.html">create an AVD</a>.</p>
<p>To run (or debug) your application, select <strong>Run</strong> > <strong>Run</strong> (or
<strong>Run</strong> > <strong>Debug</strong>) from the Eclipse menu bar. The ADT plugin will
@@ -100,7 +100,7 @@
<li>Ensure that your development computer can detect your device when connected via USB</li>
</ul>
- <p>Read <a href="{@docRoot}tools/workflow/devices/device.html">Using Hardware Devices</a>
+ <p>Read <a href="{@docRoot}tools/device.html">Using Hardware Devices</a>
for more information.</p>
<p>Once set up and your device is connected via USB, install your application on the device by
diff --git a/docs/html/tools/building/plugin-for-gradle.jd b/docs/html/tools/building/plugin-for-gradle.jd
index c1ec425..513153d 100644
--- a/docs/html/tools/building/plugin-for-gradle.jd
+++ b/docs/html/tools/building/plugin-for-gradle.jd
@@ -112,7 +112,7 @@
configuration options common to all application modules in the project. Each application module
also has its own build.gradle file for build settings specific to that module.</p>
-<h3>Project Build File</h3>
+<h3 id="projectBuildFile">Project Build File</h3>
<p>By default, the project-level Gradle file uses <em>buildscript</em> to define the Gradle
<em>repositories</em> and <em>dependencies</em>. This allows different projects to use different
Gradle versions. Supported repositories include JCenter, Maven Central, or Ivy. This example
@@ -144,7 +144,7 @@
the <em>local.properties</em> file in the <code>sdk.dir<sdk location></code> setting or through an
<code>ANDROID_HOME</code> environment variable.</p>
-<h3>Module Build File</h3>
+<h3 id="moduleBuildFile">Module Build File</h3>
<p>The application module Gradle build file allows you to configure module build settings,
including overriding the <code>src/main</code> manifest settings and setting custom packaging
options. </p>
@@ -378,7 +378,7 @@
CPU/ABI (x86, ARM, or MIPS). </p>
-<h3>Source directories</h3>
+<h3 id="sourceDirectories">Source directories</h3>
<p>To build each version of your app, the build system combines source code and
resources from:</p>
diff --git a/docs/html/tools/support-library/index.jd b/docs/html/tools/support-library/index.jd
index c1c2143..9dc0ed1 100644
--- a/docs/html/tools/support-library/index.jd
+++ b/docs/html/tools/support-library/index.jd
@@ -80,6 +80,11 @@
</dd>
</dl>
+
+ <p>For a complete list of the Support Library changes, see the
+ <a href="{@docRoot}sdk/support_api_diff/23/changes.html">Support
+ Library API Differences Report</a>. </p>
+
</div>
</div> <!-- end of collapsible section -->
diff --git a/docs/html/training/basics/firstapp/creating-project.jd b/docs/html/training/basics/firstapp/creating-project.jd
index 79268a0..4bd92ee 100644
--- a/docs/html/training/basics/firstapp/creating-project.jd
+++ b/docs/html/training/basics/firstapp/creating-project.jd
@@ -24,8 +24,6 @@
<h2>You should also read</h2>
<ul>
- <li><a href="{@docRoot}sdk/installing/index.html">Installing the
-SDK</a></li>
<li><a href="{@docRoot}tools/projects/index.html">Managing Projects</a></li>
</ul>
@@ -34,8 +32,7 @@
</div>
<p>An Android project contains all the files that comprise the source code for your Android
-app. The Android SDK tools make it easy to start a new Android project with a set of
-default project directories and files.</p>
+app.</p>
<p>This lesson
shows how to create a new project either using Android Studio or using the
diff --git a/docs/html/training/basics/firstapp/index.jd b/docs/html/training/basics/firstapp/index.jd
index 1b6e00f..4e3689a 100644
--- a/docs/html/training/basics/firstapp/index.jd
+++ b/docs/html/training/basics/firstapp/index.jd
@@ -12,7 +12,7 @@
<div id="tb-wrapper">
<div id="tb">
-<h2>Dependencies and prerequisites</h2>
+<h2>Dependencies</h2>
<ul>
<li><a href="{@docRoot}sdk/index.html">Android Studio</a></li>
@@ -37,14 +37,11 @@
<a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a>.</li>
</ol>
-<p class="note"><strong>Note:</strong> Make sure you install the most recent versions of Android
-Studio and the Android SDK before you start this class. The procedures described in this class may
-not apply to earlier versions.</p>
+<p class="note"><strong>Note:</strong> Although most of this training class
+expects that you're using Android Studio, some procedures include alternative
+instructions for using
+the SDK tools from the command line instead.</p>
-<p>If you haven't already done these tasks, start by downloading the
- <a href="{@docRoot}sdk/index.html">Android SDK</a> and following the install steps.
- Once you've finished the setup, you're ready to begin this class.</p>
-
-<p>This class uses a tutorial format that incrementally builds a small Android app that teaches
+<p>This class uses a tutorial format to create a small Android app that teaches
you some fundamental concepts about Android development, so it's important that you follow each
step.</p>
diff --git a/docs/html/training/basics/firstapp/running-app.jd b/docs/html/training/basics/firstapp/running-app.jd
index fdf0d1f..6e4605f 100644
--- a/docs/html/training/basics/firstapp/running-app.jd
+++ b/docs/html/training/basics/firstapp/running-app.jd
@@ -25,7 +25,7 @@
<ul>
<li><a href="{@docRoot}tools/device.html">Using Hardware Devices</a></li>
- <li><a href="{@docRoot}tools/devices/index.html">Managing Virtual Devices</a></li>
+ <li><a href="{@docRoot}tools/devices/managing-avds.html">Managing AVDs with AVD Manager</a></li>
<li><a href="{@docRoot}tools/projects/index.html">Managing Projects</a></li>
</ul>
@@ -128,10 +128,6 @@
AVD is a device configuration for the Android emulator that allows you to model a specific
device.</p>
-<div class="figure" style="width:457px">
- <img src="{@docRoot}images/screens_support/as-mac-avds-config.png" />
- <p class="img-caption"><strong>Figure 1.</strong> The AVD Manager showing a virtual device.</p>
-</div>
<h3>Create an AVD</h3>
<ol>
@@ -161,19 +157,11 @@
</li>
<li>Verify the configuration settings, then click <strong>Finish</strong>.
</li>
- <li>In the <strong>Android Virtual Device Manager</strong> window, click <strong>Create</strong>.</li>
- <li>Enter an <strong>AVD Name</strong>.</li>
- <li>Select a <strong>Device</strong> type.
- <p>When you select a device type, most of the fields auto-populate.</p>
- <li>For <strong>Skin</strong> select <strong>HVGA</strong>.</li>
- <li>For <strong>SD Card</strong>, enter something small, like 10 MiB.
- <p>It really doesn't matter what you enter here since you're not using any storage. But if you
- reuse this AVD, you might have to adjust this setting.</p></li>
- <li>Ignore the <strong>Emulation Options</strong> and click <strong>OK</strong>.</li>
- <li>In the <strong>Result</strong> screen, click <strong>OK</strong>.</li>
- <li>Close the <strong>Android Virtual Device Manager</strong> window.</li>
</ol>
+<p>For more information about using AVDs, see
+<a href="{@docRoot}tools/devices/managing-avds.html">Managing AVDs with AVD Manager</a>.</p>
+
<h3>Run the app from Android Studio</h3>
<ol>
<li>In <strong>Android Studio</strong>, select your project and click <strong>Run</strong>
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 1add3b85..b5b1a25 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -131,6 +131,13 @@
}
/**
+ * Return the pointer to the native object.
+ */
+ long getNativeInstance() {
+ return mNativePtr;
+ }
+
+ /**
* Native bitmap has been reconfigured, so set premult and cached
* width/height values
*/
diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java
index d0eb26d..95ae72e 100644
--- a/graphics/java/android/graphics/Canvas.java
+++ b/graphics/java/android/graphics/Canvas.java
@@ -1281,8 +1281,10 @@
* @hide
*/
public void drawPatch(@NonNull NinePatch patch, @NonNull Rect dst, @Nullable Paint paint) {
+ Bitmap bitmap = patch.getBitmap();
+ throwIfCannotDraw(bitmap);
final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
- native_drawNinePatch(mNativeCanvasWrapper, patch.getBitmap(), patch.mNativeChunk,
+ native_drawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk,
dst.left, dst.top, dst.right, dst.bottom, nativePaint,
mDensity, patch.getDensity());
}
@@ -1297,8 +1299,10 @@
* @hide
*/
public void drawPatch(@NonNull NinePatch patch, @NonNull RectF dst, @Nullable Paint paint) {
+ Bitmap bitmap = patch.getBitmap();
+ throwIfCannotDraw(bitmap);
final long nativePaint = paint == null ? 0 : paint.getNativeInstance();
- native_drawNinePatch(mNativeCanvasWrapper, patch.getBitmap(), patch.mNativeChunk,
+ native_drawNinePatch(mNativeCanvasWrapper, bitmap.getNativeInstance(), patch.mNativeChunk,
dst.left, dst.top, dst.right, dst.bottom, nativePaint,
mDensity, patch.getDensity());
}
@@ -2068,7 +2072,7 @@
long nativePaint);
private static native void native_drawRegion(long nativeCanvas,
long nativeRegion, long nativePaint);
- private native void native_drawNinePatch(long nativeCanvas, Bitmap bitmap,
+ private native void native_drawNinePatch(long nativeCanvas, long nativeBitmap,
long ninePatch, float dstLeft, float dstTop, float dstRight, float dstBottom,
long nativePaintOrZero, int screenDensity, int bitmapDensity);
private native void native_drawBitmap(long nativeCanvas, Bitmap bitmap,
diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h
index fc33b7e..9a3b990 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -64,7 +64,7 @@
*/
static jclass findClass(JNIEnv* env, const char* className);
- void start(const char *classname, const Vector<String8>& options);
+ void start(const char *classname, const Vector<String8>& options, bool zygote);
void exit(int code);
@@ -131,7 +131,7 @@
const char* runtimeArg,
const char* quotingArg);
void parseExtraOpts(char* extraOptsBuf, const char* quotingArg);
- int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
+ int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote);
Vector<JavaVMOption> mOptions;
bool mExitWithoutCleanup;
diff --git a/libs/hwui/Android.common.mk b/libs/hwui/Android.common.mk
new file mode 100644
index 0000000..5c48709
--- /dev/null
+++ b/libs/hwui/Android.common.mk
@@ -0,0 +1,118 @@
+# getConfig in external/skia/include/core/SkBitmap.h is deprecated.
+# Allow Gnu extension: in-class initializer of static 'const float' member.
+# DeferredLayerUpdater.h: private field 'mRenderThread' is not used.
+
+LOCAL_SRC_FILES := \
+ font/CacheTexture.cpp \
+ font/Font.cpp \
+ renderstate/Blend.cpp \
+ renderstate/MeshState.cpp \
+ renderstate/PixelBufferState.cpp \
+ renderstate/RenderState.cpp \
+ renderstate/Scissor.cpp \
+ renderstate/Stencil.cpp \
+ renderstate/TextureState.cpp \
+ renderthread/CanvasContext.cpp \
+ renderthread/DrawFrameTask.cpp \
+ renderthread/EglManager.cpp \
+ renderthread/RenderProxy.cpp \
+ renderthread/RenderTask.cpp \
+ renderthread/RenderThread.cpp \
+ renderthread/TimeLord.cpp \
+ thread/TaskManager.cpp \
+ utils/Blur.cpp \
+ utils/GLUtils.cpp \
+ utils/LinearAllocator.cpp \
+ utils/NinePatchImpl.cpp \
+ AmbientShadow.cpp \
+ AnimationContext.cpp \
+ Animator.cpp \
+ AnimatorManager.cpp \
+ AssetAtlas.cpp \
+ Caches.cpp \
+ CanvasState.cpp \
+ ClipArea.cpp \
+ DamageAccumulator.cpp \
+ DeferredDisplayList.cpp \
+ DeferredLayerUpdater.cpp \
+ DisplayList.cpp \
+ DisplayListCanvas.cpp \
+ Dither.cpp \
+ Extensions.cpp \
+ FboCache.cpp \
+ FontRenderer.cpp \
+ FrameInfo.cpp \
+ FrameInfoVisualizer.cpp \
+ GammaFontRenderer.cpp \
+ GlopBuilder.cpp \
+ GradientCache.cpp \
+ Image.cpp \
+ Interpolator.cpp \
+ JankTracker.cpp \
+ Layer.cpp \
+ LayerCache.cpp \
+ LayerRenderer.cpp \
+ Matrix.cpp \
+ OpenGLRenderer.cpp \
+ Patch.cpp \
+ PatchCache.cpp \
+ PathCache.cpp \
+ PathTessellator.cpp \
+ PixelBuffer.cpp \
+ Program.cpp \
+ ProgramCache.cpp \
+ Properties.cpp \
+ RenderBufferCache.cpp \
+ RenderNode.cpp \
+ RenderProperties.cpp \
+ ResourceCache.cpp \
+ ShadowTessellator.cpp \
+ SkiaCanvas.cpp \
+ SkiaCanvasProxy.cpp \
+ SkiaShader.cpp \
+ Snapshot.cpp \
+ SpotShadow.cpp \
+ TessellationCache.cpp \
+ TextDropShadowCache.cpp \
+ Texture.cpp \
+ TextureCache.cpp
+
+intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,libRS,TARGET,)
+
+LOCAL_C_INCLUDES += \
+ external/skia/src/core
+
+LOCAL_CFLAGS += -DEGL_EGLEXT_PROTOTYPES -DGL_GLEXT_PROTOTYPES
+LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libEGL libGLESv2 libskia libui libgui
+
+ifneq (false,$(ANDROID_ENABLE_RENDERSCRIPT))
+ LOCAL_CFLAGS += -DANDROID_ENABLE_RENDERSCRIPT
+ LOCAL_SHARED_LIBRARIES += libRS libRScpp
+ LOCAL_C_INCLUDES += \
+ $(intermediates) \
+ frameworks/rs/cpp \
+ frameworks/rs \
+
+endif
+
+ifndef HWUI_COMPILE_SYMBOLS
+ LOCAL_CFLAGS += -fvisibility=hidden
+endif
+
+ifdef HWUI_COMPILE_FOR_PERF
+ # TODO: Non-arm?
+ LOCAL_CFLAGS += -fno-omit-frame-pointer -marm -mapcs
+endif
+
+ifeq (true, $(HWUI_NULL_GPU))
+ LOCAL_SRC_FILES += \
+ tests/nullegl.cpp \
+ tests/nullgles.cpp
+
+ LOCAL_CFLAGS += -DHWUI_NULL_GPU
+endif
+
+# Defaults for ATRACE_TAG and LOG_TAG for libhwui
+LOCAL_CFLAGS += -DATRACE_TAG=ATRACE_TAG_VIEW -DLOG_TAG=\"OpenGLRenderer\"
+LOCAL_CFLAGS += -Wall -Wno-unused-parameter -Wunreachable-code
+LOCAL_CFLAGS += -ffast-math -O3 -Werror
diff --git a/libs/hwui/DisplayListCanvas.cpp b/libs/hwui/DisplayListCanvas.cpp
index a8dd71e..61c5883 100644
--- a/libs/hwui/DisplayListCanvas.cpp
+++ b/libs/hwui/DisplayListCanvas.cpp
@@ -247,7 +247,9 @@
const SkPaint* paint) {
if (matrix.isIdentity()) {
drawBitmap(&bitmap, paint);
- } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask))) {
+ } else if (!(matrix.getType() & ~(SkMatrix::kScale_Mask | SkMatrix::kTranslate_Mask))
+ && MathUtils::isPositive(matrix.getScaleX())
+ && MathUtils::isPositive(matrix.getScaleY())) {
// SkMatrix::isScaleTranslate() not available in L
SkRect src;
SkRect dst;
diff --git a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
index 1cf438b..969ec599 100644
--- a/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-ro/strings.xml
@@ -18,17 +18,17 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="backup_confirm_title" msgid="827563724209303345">"Copiere de rezervă completă"</string>
<string name="restore_confirm_title" msgid="5469365809567486602">"Restabilire completă"</string>
- <string name="backup_confirm_text" msgid="1878021282758896593">"S-a solicitat crearea unei copii de rezervă complete a tuturor datelor pe un computer desktop conectat. Doriţi să permiteţi acest lucru?\n\nDacă nu aţi solicitat dvs. copierea de rezervă, nu permiteţi ca operaţiunea să continue."</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"S-a solicitat crearea unei copii de rezervă complete a tuturor datelor pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu aţi solicitat dvs. copierea de rezervă, nu permiteți ca operaţiunea să continue."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Creaţi copii de rezervă pentru datele dvs."</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nu creaţi copii de rezervă"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Doriţi să permiteţi acest lucru?\n\nDacă nu dvs. aţi solicitat această restabilire, nu permiteţi continuarea operaţiunii. Acest proces va înlocui toate datele existente în prezent pe dispozitiv!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"S-a solicitat o restabilire completă a tuturor datelor de pe un computer desktop conectat. Doriți să permiteți acest lucru?\n\nDacă nu dvs. aţi solicitat această restabilire, nu permiteți continuarea operaţiunii. Acest proces va înlocui toate datele existente în prezent pe dispozitiv!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Restabiliţi datele dvs."</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Nu restabiliţi"</string>
<string name="current_password_text" msgid="8268189555578298067">"Introduceţi mai jos parola actuală pentru copia de rezervă:"</string>
<string name="device_encryption_restore_text" msgid="1570864916855208992">"Introduceţi mai jos parola pentru criptarea dispozitivului."</string>
<string name="device_encryption_backup_text" msgid="5866590762672844664">"Introduceţi mai jos parola de criptare a dispozitivului. Aceasta va fi utilizată, de asemenea, pentru a cripta arhiva copiei de rezervă."</string>
<string name="backup_enc_password_text" msgid="4981585714795233099">"Introduceţi o parolă pentru a o utiliza la criptarea datelor copiei de rezervă complete. Dacă acest câmp rămâne necompletat, pentru copierea de rezervă se va utiliza parola dvs. actuală."</string>
- <string name="backup_enc_password_optional" msgid="1350137345907579306">"Dacă doriţi să criptaţi datele copiei de rezervă complete, introduceţi o parolă mai jos:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"Dacă doriți să criptaţi datele copiei de rezervă complete, introduceţi o parolă mai jos:"</string>
<string name="backup_enc_password_required" msgid="7889652203371654149">"Întrucât dispozitivul este criptat, trebuie să criptați backupurile. Introduceți o parolă mai jos:"</string>
<string name="restore_enc_password_text" msgid="6140898525580710823">"Dacă datele pentru restabilire sunt criptate, introduceţi parola mai jos:"</string>
<string name="toast_backup_started" msgid="550354281452756121">"Se începe copierea de rezervă..."</string>
diff --git a/packages/Keyguard/res/values-eu-rES/strings.xml b/packages/Keyguard/res/values-eu-rES/strings.xml
index 7300584..3a740f6 100644
--- a/packages/Keyguard/res/values-eu-rES/strings.xml
+++ b/packages/Keyguard/res/values-eu-rES/strings.xml
@@ -113,9 +113,9 @@
<string name="kg_prompt_reason_restart_pattern" msgid="489430505491862444">"Gailua berrabiarazi duzunez, eredua marraztu behar duzu."</string>
<string name="kg_prompt_reason_restart_pin" msgid="994878216570694974">"Gailua berrabiarazi duzunez, PIN kodea idatzi behar duzu."</string>
<string name="kg_prompt_reason_restart_password" msgid="2375742919528461664">"Gailua berrabiarazi duzunez, pasahitza idatzi behar duzu."</string>
- <string name="kg_prompt_reason_timeout_pattern" msgid="8930047492617900785">"Segurtasun gehiago izateko, eredua behar da."</string>
- <string name="kg_prompt_reason_timeout_pin" msgid="7470468607947726377">"Segurtasun gehiago izateko, PIN kodea behar da."</string>
- <string name="kg_prompt_reason_timeout_password" msgid="1177412542773936957">"Segurtasun gehiago izateko, pasahitza behar da."</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="8930047492617900785">"Segurtasun handiagoa izateko, eredua behar da."</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="7470468607947726377">"Segurtasun handiagoa izateko, PIN kodea behar da."</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="1177412542773936957">"Segurtasun handiagoa izateko, pasahitza behar da."</string>
<string name="kg_prompt_reason_switch_profiles_pattern" msgid="3802056699323773969">"Profilez aldatu duzunez, eredua marraztu behar duzu."</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="8108020184731052246">"Profilez aldatu duzunez, PIN kodea idatzi behar duzu."</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="6755997057852042672">"Profilez aldatu duzunez, pasahitza idatzi behar duzu."</string>
diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml
index 1f4edc1..afefc9a 100644
--- a/packages/Keyguard/res/values-fr/strings.xml
+++ b/packages/Keyguard/res/values-fr/strings.xml
@@ -110,18 +110,18 @@
<string name="keyguard_carrier_default" msgid="8700650403054042153">"Aucun service"</string>
<string name="accessibility_ime_switch_button" msgid="5032926134740456424">"Bouton \"Changer le mode de saisie\""</string>
<string name="airplane_mode" msgid="3122107900897202805">"Mode Avion"</string>
- <string name="kg_prompt_reason_restart_pattern" msgid="489430505491862444">"Veuillez saisir le motif au redémarrage de l\'appareil."</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="489430505491862444">"Veuillez saisir le schéma au redémarrage de l\'appareil."</string>
<string name="kg_prompt_reason_restart_pin" msgid="994878216570694974">"Veuillez saisir le code d\'accès au redémarrage de l\'appareil."</string>
<string name="kg_prompt_reason_restart_password" msgid="2375742919528461664">"Veuillez saisir le mot de passe au redémarrage de l\'appareil."</string>
<string name="kg_prompt_reason_timeout_pattern" msgid="8930047492617900785">"Veuillez saisir le schéma pour renforcer la sécurité."</string>
<string name="kg_prompt_reason_timeout_pin" msgid="7470468607947726377">"Veuillez saisir le code d\'accès pour renforcer la sécurité."</string>
<string name="kg_prompt_reason_timeout_password" msgid="1177412542773936957">"Veuillez saisir le mot de passe pour renforcer la sécurité."</string>
- <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3802056699323773969">"Veuillez saisir le motif lorsque vous changez de profil."</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3802056699323773969">"Veuillez saisir le schéma lorsque vous changez de profil."</string>
<string name="kg_prompt_reason_switch_profiles_pin" msgid="8108020184731052246">"Veuillez saisir le code d\'accès lorsque vous changez de profil."</string>
<string name="kg_prompt_reason_switch_profiles_password" msgid="6755997057852042672">"Veuillez saisir le mot de passe lorsque vous changez de profil."</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="2697444392228541853">
- <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le motif.</item>
- <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le motif.</item>
+ <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
+ <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="2118758475374354849">
<item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le code d\'accès.</item>
diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml
index e4d88f7..a017564 100644
--- a/packages/Keyguard/res/values-ro/strings.xml
+++ b/packages/Keyguard/res/values-ro/strings.xml
@@ -25,7 +25,7 @@
<string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"Introduceți codul PUK pentru cardul SIM și codul PIN nou"</string>
<string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"Codul PUK pentru cardul SIM"</string>
<string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"Codul PIN nou pentru cardul SIM"</string>
- <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Atingeţi și introduceţi parola"</font></string>
+ <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"Atingeți și introduceţi parola"</font></string>
<string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Introduceţi parola pentru a debloca"</string>
<string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Introduceţi codul PIN pentru a debloca"</string>
<string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Cod PIN incorect."</string>
@@ -55,7 +55,7 @@
<string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona codului PIN al cardului SIM"</string>
<string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona codului PUK al cardului SIM"</string>
<string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Următoarea alarmă este setată la <xliff:g id="ALARM">%1$s</xliff:g>"</string>
- <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ștergeţi"</string>
+ <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Ștergeți"</string>
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Model uitat"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greşit"</string>
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 3232f65..4eb6f88 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -94,15 +94,12 @@
private static final String TAG = "KeyguardUpdateMonitor";
private static final boolean DEBUG = KeyguardConstants.DEBUG;
private static final boolean DEBUG_SIM_STATES = KeyguardConstants.DEBUG_SIM_STATES;
- private static final boolean DEBUG_FP_WAKELOCK = KeyguardConstants.DEBUG_FP_WAKELOCK;
private static final int LOW_BATTERY_THRESHOLD = 20;
- private static final long FINGERPRINT_WAKELOCK_TIMEOUT_MS = 15 * 1000;
private static final String ACTION_FACE_UNLOCK_STARTED
= "com.android.facelock.FACE_UNLOCK_STARTED";
private static final String ACTION_FACE_UNLOCK_STOPPED
= "com.android.facelock.FACE_UNLOCK_STOPPED";
- private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
private static final String ACTION_STRONG_AUTH_TIMEOUT =
"com.android.systemui.ACTION_STRONG_AUTH_TIMEOUT";
@@ -111,29 +108,6 @@
private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF";
/**
- * Mode in which we don't need to wake up the device when we get a fingerprint.
- */
- private static final int FP_WAKE_NONE = 0;
-
- /**
- * Mode in which we wake up the device, and directly dismiss Keyguard. Active when we acquire
- * a fingerprint while the screen is off and the device was sleeping.
- */
- private static final int FP_WAKE_DIRECT_UNLOCK = 1;
-
- /**
- * Mode in which we wake up the device, but play the normal dismiss animation. Active when we
- * acquire a fingerprint pulsing in doze mode.
- * */
- private static final int FP_WAKE_TO_BOUNCER = 2;
-
- /**
- * Mode in which we only wake up the device, and keyguard was not showing when we acquired a
- * fingerprint.
- * */
- private static final int FP_ONLY_WAKE = 3;
-
- /**
* Milliseconds after unlocking with fingerprint times out, i.e. the user has to use a
* strong auth method like password, PIN or pattern.
*/
@@ -202,7 +176,6 @@
private List<SubscriptionInfo> mSubscriptionInfo;
private boolean mFingerprintDetectionRunning;
private TrustManager mTrustManager;
- private PowerManager mPowerManager;
private final Handler mHandler = new Handler() {
@Override
@@ -398,18 +371,23 @@
}
}
- private void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
+ private void onFingerprintAuthenticated(int userId) {
mUserFingerprintAuthenticated.put(userId, true);
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
- cb.onFingerprintAuthenticated(userId, wakeAndUnlocking);
+ cb.onFingerprintAuthenticated(userId);
}
}
}
private void handleFingerprintAuthFailed() {
- releaseFingerprintWakeLock();
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onFingerprintAuthFailed();
+ }
+ }
handleFingerprintHelp(-1, mContext.getString(R.string.fingerprint_not_recognized));
}
@@ -417,54 +395,15 @@
if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
return;
}
- if (!mDeviceInteractive && !mScreenOn) {
- releaseFingerprintWakeLock();
- mWakeLock = mPowerManager.newWakeLock(
- PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME);
- mWakeLock.acquire();
- mFpWakeMode = mKeyguardIsVisible ? FP_WAKE_DIRECT_UNLOCK : FP_ONLY_WAKE;
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fingerprint acquired, grabbing fp wakelock");
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
+ if (cb != null) {
+ cb.onFingerprintAcquired();
}
- mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable,
- FINGERPRINT_WAKELOCK_TIMEOUT_MS);
- } else if (!mDeviceInteractive) {
- mFpWakeMode = FP_WAKE_TO_BOUNCER;
- } else {
- mFpWakeMode = FP_WAKE_NONE;
- }
- }
-
- private final Runnable mReleaseFingerprintWakeLockRunnable = new Runnable() {
- @Override
- public void run() {
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fp wakelock: TIMEOUT!!");
- }
- releaseFingerprintWakeLock();
- }
- };
-
- private void releaseFingerprintWakeLock() {
- if (mWakeLock != null) {
- mHandler.removeCallbacks(mReleaseFingerprintWakeLockRunnable);
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "releasing fp wakelock");
- }
- mWakeLock.release();
- mWakeLock = null;
}
}
private void handleFingerprintAuthenticated() {
- if (mFpWakeMode == FP_WAKE_TO_BOUNCER || mFpWakeMode == FP_WAKE_DIRECT_UNLOCK
- || mFpWakeMode == FP_ONLY_WAKE) {
- if (DEBUG_FP_WAKELOCK) {
- Log.i(TAG, "fp wakelock: Authenticated, waking up...");
- }
- mPowerManager.wakeUp(SystemClock.uptimeMillis());
- }
- releaseFingerprintWakeLock();
try {
final int userId;
try {
@@ -477,7 +416,7 @@
Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId);
return;
}
- onFingerprintAuthenticated(userId, mFpWakeMode == FP_WAKE_DIRECT_UNLOCK);
+ onFingerprintAuthenticated(userId);
} finally {
setFingerprintRunningDetectionRunning(false);
}
@@ -578,6 +517,10 @@
public void reportSuccessfulStrongAuthUnlockAttempt() {
mStrongAuthTimedOut.remove(sCurrentUser);
scheduleStrongAuthTimeout();
+ if (mFpm != null) {
+ byte[] token = null; /* TODO: pass real auth token once fp HAL supports it */
+ mFpm.resetTimeout(token);
+ }
}
private void scheduleStrongAuthTimeout() {
@@ -611,7 +554,6 @@
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (DEBUG) Log.d(TAG, "received broadcast " + action);
@@ -665,7 +607,6 @@
private final BroadcastReceiver mBroadcastAllReceiver = new BroadcastReceiver() {
- @Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(action)) {
@@ -727,7 +668,6 @@
};
private CancellationSignal mFingerprintCancelSignal;
private FingerprintManager mFpm;
- private PowerManager.WakeLock mWakeLock;
/**
* When we receive a
@@ -791,7 +731,6 @@
return new SimData(state, slotId, subId);
}
- @Override
public String toString() {
return "SimData{state=" + simState + ",slotId=" + slotId + ",subId=" + subId + "}";
}
@@ -928,7 +867,6 @@
private KeyguardUpdateMonitor(Context context) {
mContext = context;
mSubscriptionManager = SubscriptionManager.from(context);
- mPowerManager = context.getSystemService(PowerManager.class);
mAlarmManager = context.getSystemService(AlarmManager.class);
mDeviceProvisioned = isDeviceProvisionedInSettingsDb();
@@ -1019,7 +957,7 @@
private void startListeningForFingerprint() {
if (DEBUG) Log.v(TAG, "startListeningForFingerprint()");
int userId = ActivityManager.getCurrentUser();
- if (isUnlockWithFingerprintPossible(userId)) {
+ if (!mFingerprintDetectionRunning && isUnlockWithFingerprintPossible(userId)) {
mUserHasAuthenticatedSinceBoot = mTrustManager.hasUserAuthenticatedSinceBoot(
ActivityManager.getCurrentUser());
if (mFingerprintCancelSignal != null) {
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
index 52412f7..7ca67b0 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java
@@ -186,12 +186,23 @@
public void onTrustGrantedWithFlags(int flags, int userId) { }
/**
+ * Called when a finger has been acquired.
+ * <p>
+ * It is guaranteed that either {@link #onFingerprintAuthenticated} or
+ * {@link #onFingerprintAuthFailed()} is called after this method eventually.
+ */
+ public void onFingerprintAcquired() { }
+
+ /**
+ * Called when a fingerprint couldn't be authenticated.
+ */
+ public void onFingerprintAuthFailed() { }
+
+ /**
* Called when a fingerprint is recognized.
* @param userId the user id for which the fingerprint was authenticated
- * @param wakeAndUnlocking whether the authentication woke the device up and thus we'd like to
- * dismiss the lockscreen before turning on the screen
*/
- public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) { }
+ public void onFingerprintAuthenticated(int userId) { }
/**
* Called when fingerprint provides help string (e.g. "Try again")
diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
index 3a98a58..61b9fc5 100644
--- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
+++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDocumentsProvider.java
@@ -188,7 +188,7 @@
try {
return new AssetFileDescriptor(
mPipeManager.readThumbnail(mMtpManager, identifier),
- 0,
+ 0, // Start offset.
AssetFileDescriptor.UNKNOWN_LENGTH);
} catch (IOException error) {
throw new FileNotFoundException(error.getMessage());
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index c347486..8ab53b8 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -108,6 +108,7 @@
<uses-permission android:name="android.permission.ACCESS_KEYGUARD_SECURE_STORAGE" />
<uses-permission android:name="android.permission.TRUST_LISTENER" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
+ <uses-permission android:name="android.permission.RESET_FINGERPRINT_LOCKOUT" />
<!-- Needed for WallpaperManager.clear in ImageWallpaper.updateWallpaperLocked -->
<uses-permission android:name="android.permission.SET_WALLPAPER"/>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index ffdcd0e..26d5274 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"MELD GEBRUIKER AF"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Voeg nuwe gebruiker by?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer jy \'n nuwe gebruiker byvoeg, moet daardie persoon hul spasie opstel.\n\nEnige gebruiker kan programme vir al die ander gebruikers opdateer."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Verwyder gebruiker?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alle programme en data van hierdie gebruiker sal uitgevee word."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Verwyder"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Verminder werkverrigting en agtergronddata"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Skakel batterybespaarder af"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index 87df43b..e61b6c3 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ተጠቃሚን አስወጣ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"አዲስ ተጠቃሚ ይታከል?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"እርስዎ አንድ አዲስ ተጠቃሚ ሲያክሉ ያ ሰው የራሱ ቦታ ማዘጋጀት አለበት።\n\nማንኛውም ተጠቃሚ መተግበሪያዎችን ለሌሎች ተጠቃሚዎች ሁሉ ሊያዘምን ይችላል።"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ተጠቃሚ ይወገድ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ሁሉም የዚህ ተጠቃሚ መተግበሪያዎች እና ውሂብ ይሰረዛሉ።"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"አስወግድ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"የባትሪ ኃይል ቆጣቢ በርቷል"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"አፈጻጸምን እና የጀርባ ውሂብ ይቀንሳል"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ባትሪ ቆጣቢን አጥፋ"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 1778fad..2e358a1 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -353,6 +353,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"خروج المستخدم"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"هل تريد إضافة مستخدم جديد؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"عند إضافة مستخدم جديد، يلزمه إعداد مساحته.\n\nعلمًا بأنه يُمكن لأي مستخدم تحديث التطبيقات لجميع المستخدمين الآخرين."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"هل تريد إزالة المستخدم؟"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"سيتم حذف جميع تطبيقات وبيانات هذا المستخدم."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"إزالة"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"وضع توفير الطاقة قيد التشغيل"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"لخفض مستوى الأداء وبيانات الخلفية"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"إيقاف توفير شحن البطارية"</string>
diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml
index 5a43bc3..b82b42e 100644
--- a/packages/SystemUI/res/values-az-rAZ/strings.xml
+++ b/packages/SystemUI/res/values-az-rAZ/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"İSTİFADƏÇİ ÇIXIŞI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Yeni istifadəçi əlavə edilsin?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni istifadəçi əlavə etdiyiniz zaman həmin şəxs öz yerini quraşdırmalıdır. \n\n İstənilən istifadəçi bütün digər istifadəçilərdən olan tətbiqləri güncəlləşdirə bilər."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"İstifadəçi silinsin?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Bu istifadəçinin bütün tətbiqləri və datası silinəcək."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Silin"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Enerji qənaəti aktivdir"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Performansı azaldır və arxa fon datasını məhdudlaşdırır"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Enerjiyə qənaət rejimini deaktiv edin"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2b8660e..82ace52 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ИЗЛИЗАНЕ НА ПОТРЕБИТЕЛЯ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Да се добави ли нов потреб.?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Когато добавите нов потребител, той трябва да настрои работното си пространство.\n\nВсеки потребител може да актуализира приложенията за всички останали потребители."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Да се премахне ли потребителят?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Всички приложения и данни на този потребител ще бъдат изтрити."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Премахване"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режимът за запазване на батерията е включен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Намалява ефективността и данните на заден план"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Изключване на режима за запазване на батерията"</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index 4a0a46c..884fc42 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ব্যবহারকারীকে লগ-আউট করুন"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যবহারকারীকে যোগ করবেন?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"আপনি একজন নতুন ব্যবহারকারী যোগ করলে তাকে তার জায়গা সেট আপ করে নিতে হবে৷\n\nযেকোনো ব্যবহারকারী অন্য সব ব্যবহারকারীর জন্য অ্যাপ্লিকেশান আপডেট করতে পারবেন৷"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ব্যবহারকারী সরাবেন?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"এই ব্যবহারকারীর সমস্ত অ্যাপ্লিকেশান ও ডেটা মুছে ফেলা হবে।"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"সরান"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ব্যাটারি সেভার চালু রয়েছে"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"কার্য-সম্পাদনা ও পশ্চাদপট ডেটাকে কমিয়ে দেয়"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ব্যাটারি সঞ্চয়কারী বন্ধ করুন"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 2b7171a..cc04fd6 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"TANCA LA SESSIÓ DE L\'USUARI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vols afegir un usuari nou?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar-se l\'espai.\n\nQualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Vols suprimir l\'usuari?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Totes les aplicacions i les dades d\'aquest usuari se suprimiran."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Suprimeix"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Estalvi de bateria activada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Redueix el rendiment i l\'ús de les dades en segon pla."</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactiva l\'estalvi de bateria"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index ce1749d..7f94577 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -353,6 +353,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ODHLÁSIT UŽIVATELE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Přidat nového uživatele?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Když přidáte nového uživatele, musí si nastavit vlastní prostor.\n\nJakýkoli uživatel může aktualizovat aplikace všech ostatních uživatelů."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Odstranit uživatele?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Veškeré aplikace a data tohoto uživatele budou smazána."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Odstranit"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Režim Úspora baterie je zapnutý."</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Omezuje výkon a data na pozadí"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Vypnout úsporu baterie"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 6871c46..2129f03 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOG BRUGEREN UD"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vil du tilføje den nye bruger?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Når du tilføjer en ny bruger, skal personen konfigurere sit område.\n\nEnhver bruger kan opdatere apps for alle andre brugere."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Vil du fjerne brugeren?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alle apps og data for denne bruger slettes."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Fjern"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparefunktion er slået til"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reducerer ydeevne og baggrundsdata"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Deaktiver batterisparefunktion"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index a9d2fd4a..30a2baf 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"Nutzer abmelden"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Neuen Nutzer hinzufügen?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wenn Sie einen neuen Nutzer hinzufügen, muss dieser seinen Bereich einrichten.\n\nJeder Nutzer kann Apps für alle anderen Nutzer aktualisieren."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Nutzer entfernen?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alle Apps und Daten dieses Nutzers werden gelöscht."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Entfernen"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Energiesparmodus ist aktiviert"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduzierung der Leistung und Hintergrunddaten"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Energiesparmodus deaktivieren"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 82ec24f..f2fc602 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ΑΠΟΣΥΝΔΕΣΗ ΧΡΗΣΤΗ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Προσθήκη νέου χρήστη;"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Κατά την προσθήκη ενός νέου χρήστη, αυτός θα πρέπει να ρυθμίσει το χώρο του.\n\nΟποιοσδήποτε χρήστης μπορεί να ενημερώσει τις εφαρμογές για όλους τους άλλους χρήστες."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Κατάργηση χρήστη;"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Όλες οι εφαρμογές και τα δεδομένα αυτού του χρήστη θα διαγραφούν."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Κατάργηση"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Μειώνει την απόδοση και τα δεδομένα παρασκηνίου"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Απενερ. εξοικ/σης μπαταρίας"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index b416ab3..f1aafb6 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Remove user?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"All apps and data of this user will be deleted."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remove"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Turn off battery saver"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b416ab3..f1aafb6 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Remove user?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"All apps and data of this user will be deleted."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remove"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Turn off battery saver"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b416ab3..f1aafb6 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGOUT USER"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Add new user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Remove user?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"All apps and data of this user will be deleted."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remove"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduces performance and background data"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Turn off battery saver"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 80d2916..5136545 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"SALIR DE SESIÓN DEL USUARIO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"¿Agregar usuario nuevo?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Cuando agregas un nuevo usuario, esa persona debe configurar su espacio.\n\nCualquier usuario puede actualizar aplicaciones para todos los usuarios."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"¿Confirmas que quieres quitar el usuario?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Se borrarán todas las aplicaciones y los datos de este usuario."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el uso de datos en segundo plano."</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar el ahorro de batería"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index b44a1f6..82fd6fc 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"SALIR DE USUARIO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"¿Añadir nuevo usuario?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Al añadir un usuario nuevo, este debe configurar su espacio.\n\nCualquier usuario puede actualizar las aplicaciones del resto de usuarios."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"¿Quitar usuario?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Se eliminarán todas las aplicaciones y todos los datos de este usuario."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Quitar"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce el rendimiento y el envío de datos en segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar ahorro de batería"</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 01dfe89..dd3d823 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGI KASUTAJA VÄLJA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Kas lisada uus kasutaja?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kui lisate uue kasutaja, siis peab ta seadistama oma ruumi.\n\nIga kasutaja saab värskendada rakendusi kõigi kasutajate jaoks."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Kas eemaldada kasutaja?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Kasutaja kõik rakendused ja andmed kustutatakse."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Eemalda"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akusäästja on sisse lülitatud"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Vähendab jõudlust ja taustaandmeid"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Akusäästja väljalülitamine"</string>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index 7052b80..a856c09 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"AMAITU ERABILTZAILEAREN SAIOA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Beste erabiltzaile bat gehitu?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Erabiltzaile bat gehitzen duzunean, horrek bere eremua konfiguratu beharko du.\n\nEdozein erabiltzailek egunera ditzake beste erabiltzaile guztien aplikazioak."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Erabiltzailea kendu nahi duzu?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Erabiltzailearen aplikazio eta datu guztiak ezabatuko dira."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Kendu"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Errendimendua eta atzeko planoko datuak murrizten ditu"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desaktibatu bateria aurrezteko aukera"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index d4a1fa2..412f808 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"خروج کاربر از سیستم"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"کاربر جدیدی اضافه میکنید؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"وقتی کاربر جدیدی را اضافه میکنید آن فرد باید فضای خودش را تنظیم کند.\n\nهر کاربری میتواند برنامهها را برای همه کاربران دیگر بهروزرسانی کند."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"کاربر حذف شود؟"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"همه برنامهها و دادههای این کاربر حذف میشود."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"حذف"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ذخیره کننده باتری روشن است."</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"عملکرد و اطلاعات پسزمینه را کاهش میدهد"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"خاموش کردن ذخیرهکننده باتری"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index c906e8a..836b136 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"KIRJAA KÄYTTÄJÄ ULOS"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Lisätäänkö uusi käyttäjä?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kun lisäät uuden käyttäjän, hänen tulee määrittää oman tilansa asetukset.\n\nKaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Poistetaanko käyttäjä?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Kaikki käyttäjän tiedot ja sovellukset poistetaan."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Poista"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Virransäästö on käytössä"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Rajoittaa suorituskykyä ja taustatiedonsiirtoa"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Poista virransäästö käytöstä"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index eceee64..8c6773f 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DÉCONNECTER L\'UTILISATEUR"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Supprimer l\'utilisateur?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Toutes les applications et les données de cet utilisateur seront supprimées."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Supprimer"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"La fonction Économie d\'énergie est activée"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Réduire les performances et de fond"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Désactiver l\'économiseur d\'énergie"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index f2bc9d0..666c0ef 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DÉCONNECTER L\'UTILISATEUR"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ajouter un utilisateur ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Lorsque vous ajoutez un utilisateur, celui-ci doit configurer son espace.\n\nN\'importe quel utilisateur peut mettre à jour les applications pour tous les autres utilisateurs."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Supprimer l\'utilisateur ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Toutes les applications et les données de cet utilisateur seront supprimées."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Supprimer"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"L\'économiseur de batterie est activé"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Limite les performances et les données en arrière-plan."</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Désactiver l\'économiseur de batterie"</string>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index 1f80aa7..d192257 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"PECHAR SESIÓN DO USUARIO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Engadir un usuario novo?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Cando engadas un usuario novo, este deberá configurar o seu espazo\n\nCalquera usuario pode actualizar as aplicacións para todos os demais usuarios."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Queres eliminar o usuario?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Eliminaranse todas as aplicacións e os datos deste usuario."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Eliminar"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"O aforro de batería está activado"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce o rendemento e os datos en segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desactivar o aforro de batería"</string>
diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml
index 39782a2..81dab35 100644
--- a/packages/SystemUI/res/values-gu-rIN/strings.xml
+++ b/packages/SystemUI/res/values-gu-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"વપરાશકર્તાને લૉગઆઉટ કરો"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"નવા વપરાશકર્તાને ઉમેરીએ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"જ્યારે તમે કોઈ નવા વપરાશકર્તાને ઉમેરો છો, ત્યારે તે વ્યક્તિને તેમનું સ્થાન સેટ કરવાની જરૂર પડે છે.\n\nકોઈપણ વપરાશકર્તા બધા અન્ય વપરાશકર્તાઓ માટે એપ્લિકેશન્સને અપડેટ કરી શકે છે."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"વપરાશકર્તાને દૂર કરીએ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"આ વપરાશકર્તાની તમામ એપ્લિકેશન્સ અને ડેટા કાઢી નાખવામાં આવશે."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"દૂર કરો"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"બેટરી સેવર ચાલુ છે"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"પ્રદર્શન અને પૃષ્ઠભૂમિ ડેટા ઘટાડે છે"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"બૅટરી સેવર બંધ કરો"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index e2ac2b8..a4bf691 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"उपयोगकर्ता को प्रस्थान करवाएं"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नया उपयोगकर्ता जोड़ें?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"जब आप कोई नया उपयोगकर्ता जोड़ते हैं तो उस व्यक्ति को अपना स्थान सेट करना होता है.\n\nकोई भी उपयोगकर्ता अन्य सभी उपयोगकर्ताओं के लिए ऐप्स अपडेट कर सकता है."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"उपयोगकर्ता निकालें?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"इस उपयोगकर्ता के सभी ऐप्स और डेटा को हटा दिया जाएगा."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"निकालें"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"निष्पादन और पृष्ठभूमि डेटा को कम करता है"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"बैटरी बचतकर्ता को बंद करें"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 27b2e9c..d18c04b 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -350,6 +350,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ODJAVI KORISNIKA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodati novog korisnika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kada dodate novog korisnika, ta osoba mora postaviti vlastiti prostor.\n\nBilo koji korisnik može ažurirati aplikacije za sve ostale korisnike."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Ukloniti korisnika?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Izbrisat će se sve aplikacije i podaci ovog korisnika."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Ukloni"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Štednja baterije je uključena"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Smanjuje količinu rada i pozadinske podatke"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Isključi uštedu baterije"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 634bccc..49543cb 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"FELHASZNÁLÓ KIJELENTKEZÉSE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Új felhasználó hozzáadása?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ha új felhasználót ad hozzá, az illetőnek be kell állítania saját tárterületét.\n\nBármely felhasználó frissítheti az alkalmazásokat valamennyi felhasználó számára."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Törli a felhasználót?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"A felhasználóhoz tartozó minden adat és alkalmazás törölve lesz."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Eltávolítás"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Csökkenti a teljesítményt és a háttéradatok használatát"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Akkumulátorkímélő mód kikapcsolása"</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index b6d3f35..8cf062f 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ԸՆԹԱՑԻԿ ՕԳՏՎՈՂԻ ԴՈՒՐՍ ԳՐՈՒՄ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ավելացնե՞լ նոր պրոֆիլ:"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Երբ նոր օգտվող եք ավելացնում, նա պետք է կարգավորի իր պրոֆիլը:\n\nՑանկացած օգտվող կարող է թարմացնել հավելվածները մյուս բոլոր հաշիվների համար:"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Հեռացնե՞լ օգտվողին:"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Այս օգտվողի բոլոր հավելվածներն ու տվյալները կջնջվեն:"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Հեռացնել"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Նվազեցնում է ծանրաբեռնվածությունը և ֆոնային տվյալները"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Անջատել մարտկոցի տնտեսումը"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 832dfcf..6e738de 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"KELUARKAN PENGGUNA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Tambahkan pengguna baru?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri.\n\n1Pengguna mana pun dapat memperbarui aplikasi untuk semua pengguna lain."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Hapus pengguna?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Semua aplikasi dan data pengguna ini akan dihapus."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Hapus"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penghemat baterai aktif"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Mengurangi kinerja dan data latar belakang"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Nonaktifkan penghemat baterai"</string>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 5636e66..4c5bffb 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"SKRÁ NOTANDA ÚT"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Bæta nýjum notanda við?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Þegar þú bætir nýjum notanda við þarf sá notandi að setja upp svæðið sitt.\n\nHvaða notandi sem er getur uppfært forrit fyrir alla aðra notendur."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Fjarlægja notandann?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Öllum forritum og gögnum þessa notanda verður eytt."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Fjarlægja"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kveikt er á rafhlöðusparnaði"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Dregur úr afköstum og bakgrunnsgögnum"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Slökkva á rafhlöðusparnaði"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index a98597b..75ea3f6 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DISCONNETTI UTENTE"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Aggiungere un nuovo utente?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Il nuovo utente, una volta aggiunto, deve impostare il proprio spazio.\n\nQualsiasi utente può aggiornare le app per tutti gli altri."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Rimuovere l\'utente?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Tutte le app e i dati di questo utente verranno eliminati."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Rimuovi"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Risparmio batteria attivo"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Riduce le prestazioni e i dati in background"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Disattiva risparmio energetico"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index bf8a41d..4db88bd 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"נתק משתמש"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"האם להוסיף משתמש חדש?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"בעת הוספת משתמש חדש, על משתמש זה להגדיר את השטח שלו.\n\nכל משתמש יכול לעדכן אפליקציות עבור כל המשתמשים האחרים."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"האם להסיר את המשתמש?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"כל האפליקציות והנתונים של המשתמש הזה יימחקו."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"הסר"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"תכונת \'חיסכון בסוללה\' פועלת"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"מפחית את הביצועים ונתונים ברקע"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"כבה את החיסכון בסוללה"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index bd14b33..d7b687b 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ユーザーをログアウト"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新しいユーザーを追加しますか?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新しいユーザーを追加したら、そのユーザーは自分のスペースをセットアップする必要があります。\n\nすべてのユーザーは他のユーザーに代わってアプリを更新できます。"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ユーザーを削除しますか?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"このユーザーのアプリとデータがすべて削除されます。"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"削除"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"バッテリーセーバーがON"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"パフォーマンスとバックグラウンドデータを制限します"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"バッテリーセーバーをOFFにします"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index 6d567cc..2097996 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"მომხმარებლის გასვლა"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"დაემატოს ახალი მომხმარებელი?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ახალი მომხმარებლის დამატებისას, ამ მომხმარებელს საკუთარი სივრცის შექმნა მოუწევს.\n\nნებისმიერ მომხმარებელს შეუძლია აპები ყველა სხვა მომხმარებლისათვის განაახლოს."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"გსურთ მომხმარებლის წაშლა?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ამ მომხმარებლის ყველა აპი და მონაცემი წაიშლება."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"წაშლა"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ბატარეის დამზოგი ჩართულია"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ამცირებს წარმადობას და უკანა ფონის მონაცემებს"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ბატარეის დაზოგვის გამორთვა"</string>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index 6903b19..bd49612 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ПАЙДАЛАНУШЫНЫ ШЫҒАРУ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Жаңа пайд-ны қосу керек пе?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңа пайдаланушыны қосқанда сол адам өз кеңістігін реттеуі керек.\n\nКез келген пайдаланушы барлық басқа пайдаланушылар үшін қолданбаларды жаңарта алады."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Пайдаланушы жойылсын ба?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Осы пайдаланушының барлық қолданбалары мен деректері жойылады."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Жою"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батарея үнемдегіш қосулы"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Өнімділікті және фондық деректерді азайтады"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Батарея үнемдегішті өшіру"</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index d24b070..db5057e 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ចុះឈ្មោះអ្នកប្រើចេញ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"បន្ថែមអ្នកប្រើថ្មី?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ពេលអ្នកបន្ថែមអ្នកប្រើថ្មី អ្នកប្រើនោះត្រូវកំណត់ទំហំផ្ទាល់របស់គេ។\n\nអ្នកប្រើណាមួយក៏អាចធ្វើបច្ចុប្បន្នភាពកម្មវិធីសម្រាប់អ្នកប្រើផ្សេងបានដែរ។"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"យកអ្នកប្រើចេញ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"កម្មវិធី និងទិន្នន័យទាំងអស់របស់អ្នកប្រើនេះនឹងត្រូវបានលុប។"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"យកចេញ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"កម្មវិធីសន្សំថ្មគឺបើក"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ការបន្ថយការប្រតិបត្តិ និងទិន្នន័យផ្ទៃខាងក្រោយ"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"បិទធាតុរក្សាថាមពលថ្ម"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index baaba3c..7d88681e 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ಬಳಕೆದಾರರನ್ನು ಲಾಗ್ಔಟ್ ಮಾಡಿ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸುವುದೇ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ಅವರ ಸ್ಥಳವನ್ನು ಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನವೀಕರಿಸಬಹುದು."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ಈ ಬಳಕೆದಾರರ ಎಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುವುದು."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ತೆಗೆದುಹಾಕಿ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ಬ್ಯಾಟರಿ ಉಳಿತಾಯವನ್ನು ಆಫ್ ಮಾಡಿ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index e8a19c8..af02943 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"사용자 로그아웃"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"새 사용자를 추가할까요?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"사용자를 삭제할까요?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"이 사용자의 모든 앱과 데이터가 삭제됩니다."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"삭제"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"배터리 세이버 사용 중"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"성능 및 백그라운드 데이터를 줄입니다."</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"배터리 절약 기능 사용 중지"</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index 5f88549..058cc18 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"КОЛДОНУУЧУНУ ТУТУМДАН ЧЫГАРУУ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Жаңы колдонуучу кошосузбу?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Жаңы колдонуучу кошулганда, ал өз мейкиндигин түзүп алышы керек.\n\nКолдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Колдонуучу алынып салынсынбы?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Бул колдонуучунун бардык колдонмолору жана дайындары жок кылынат."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Алып салуу"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батареяны үнөмдөгүч күйгүзүлдү"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Иштин майнаптуулугун начарлатып, фондук дайындарды чектейт"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Батареянын кубатын үнөмдөгүчтү өчүрүп коюу"</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index 4a4140d..3067fb7 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ເອົາຜູ້ໃຊ້ອອກຈາກລະບົບ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ເພີ່ມຜູ່ໃຊ້ໃໝ່ບໍ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ເມື່ອທ່ານເພີ່ມຜູ່ໃຊ້ໃໝ່, ຜູ່ໃຊ້ນັ້ນຈະຕ້ອງຕັ້ງຄ່າພື້ນທີ່ບ່ອນຈັດເກັບຂໍ້ມູນຂອງລາວ.\n\nຜູ່ໃຊ້ທຸກຄົນສາມາດອັບເດດແອັບຯຂອງຜູ່ໃຊ້ຄົນອື່ນທັງໝົດໄດ້."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ລຶບຜູ້ໃຊ້ອອກບໍ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ທຸກແອັບ ແລະ ຂໍ້ມູນຂອງຜູ້ໃຊ້ນີ້ຈະຖືກລຶບ."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ເອົາອອກ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີແລ້ວ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ຫຼຸດປະສິທິພາບແລະການນຳໃຊ້ຂໍ້ມູນພື້ນຫຼັງ"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ປິດໂຕປະຢັດແບັດເຕີຣີ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 39b48b1..e195444 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ATJUNGTI NAUDOTOJĄ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Pridėti naują naudotoją?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kai pridedate naują naudotoją, šis asmuo turi nustatyti savo erdvę.\n\nBet kuris naudotojas gali atnaujinti visų kitų naudotojų programas."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Pašalinti naudotoją?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Bus ištrinti visi šio naudotojo duomenys ir programos."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Pašalinti"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akumuliatoriaus tausojimo priemonė įjungta"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Sumažinamas našumas ir foninių duomenų naudojimas"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Išjungti Akumuliatoriaus tausojimo priemonę"</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index df7a292..4350876 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -350,6 +350,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ATTEIKT LIETOTĀJU"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vai pievienot jaunu lietotāju?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kad pievienosiet jaunu lietotāju, viņam būs jāizveido savs profils.\n\nIkviens lietotājs var atjaunināt lietotnes citu lietotāju vietā."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Vai noņemt lietotāju?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Tiks dzēstas visas šī lietotāja lietotnes un dati."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Noņemt"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ieslēgts akumulatora enerģijas taupīšanas režīms"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Samazina veiktspēju un fona datus"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Izslēgt akumulatora jaudas taupīšanu"</string>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 5743762..9e7a717 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ОДЈАВИ ГО КОРИСНИКОТ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Да се додаде нов корисник?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Кога додавате нов корисник, тоа лице треба да го постави својот простор.\n\nСекој корисник може да ажурира апликации за сите други корисници."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Да се отстрани корисникот?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Сите апликации и податоци од овој корисник ќе се избришат."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Отстрани"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедачот на батерија е вклучен"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Ја намалува изведбата и податоците во заднина"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Исклучете го штедачот на батерија"</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index b7fdeae..e941427 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ഉപയോക്താവിനെ ലോഗൗട്ട് ചെയ്യുക"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"പുതിയ ഉപയോക്താവിനെ ചേർക്കണോ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"നിങ്ങൾ ഒരു പുതിയ ഉപയോക്താവിനെ ചേർക്കുമ്പോൾ, ആ വ്യക്തിയ്ക്ക് അവരുടെ ഇടം സജ്ജീകരിക്കേണ്ടതുണ്ട്.\n\nമറ്റ് എല്ലാ ഉപയോക്താക്കൾക്കുമായി ഏതൊരു ഉപയോക്താവിനും അപ്ലിക്കേഷനുകൾ അപ്ഡേറ്റുചെയ്യാനാവും."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ഉപയോക്താവിനെ ഇല്ലാതാക്കണോ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ഈ ഉപയോക്താവിന്റെ എല്ലാ ആപ്സും ഡാറ്റയും ഇല്ലാതാക്കും."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"നീക്കംചെയ്യുക"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ബാറ്ററി സേവർ ഓണാണ്"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്ക്കുന്നു"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ബാറ്ററി സേവർ ഓഫാക്കുക"</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index 5d61c88..69a94c2 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -347,6 +347,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ХЭРЭГЛЭГЧЭЭС ГАРАХ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Шинэ хэрэглэгч нэмэх үү?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Та шинэ хэрэглэгч нэмбэл, тухайн хүн өөрийн профайлыг тохируулах шаардлагатай.\n\nАль ч хэрэглэгч бүх хэрэглэгчийн апп-уудыг шинэчлэх боломжтой."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Хэрэглэгчийг устгах уу?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Энэ хэрэглэгчийн бүх апп болон мэдээлэл устах болно."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Арилгах"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батерей хэмнэгч асаалттай"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Ажиллагаа болон далд датаг бууруулна"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Батерей хэмнэгчийг унтраах"</string>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index 8f43871..3184de5 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"वापरकर्त्यास लॉगआउट करा"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नवीन वापरकर्ता जोडायचा?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"आपण एक नवीन वापरकर्ता जोडता तेव्हा, त्या व्यक्तीने त्यांचे स्थान सेट करणे आवश्यक असते.\n\nकोणताही वापरकर्ता इतर सर्व वापरकर्त्यांसाठी अॅप्स अद्यतनित करू शकतो."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"वापरकर्त्यास काढायचे?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"या वापरकर्त्याचे सर्व अॅप्स आणि डेटा काढून टाकला जाईल."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"काढा"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बॅटरी बचतकर्ता चालू आहे"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"कार्यप्रदर्शन आणि पार्श्वभूमी डेटा कमी करते"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"बॅटरी बचतकर्ता बंद करा"</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 08a4dec..b12046b 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOG KELUAR PENGGUNA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Tambah pengguna baharu?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Apabila anda menambah pengguna baharu, orang itu perlu menyediakan ruang mereka.\n\nMana-mana pengguna boleh mengemas kini apl untuk semua pengguna lain."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Alih keluar pengguna?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Semua apl dan data pengguna ini akan dipadamkan."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Alih keluar"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penjimat bateri dihidupkan"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Mengurangkan prestasi dan data latar belakang"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Matikan penjimat bateri"</string>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 4551f64..6f843b0 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"အသုံးပြုသူ ထွက်လိုက်ပါ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"အသုံးပြုသူ အသစ်ကို ထည့်ရမလား?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"သင်က အသုံးပြုသူ အသစ် တစ်ဦးကို ထည့်ပေးလိုက်လျှင်၊ ထိုသူသည် ၎င်း၏ နေရာကို သတ်မှတ်စီစဉ်ရန် လိုအပ်မည်။\n\n အသုံးပြုသူ မည်သူမဆို ကျန်အသုံးပြုသူ အားလုံးတို့အတွက် appများကို မွမ်းမံပေးနိုင်သည်။"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"သုံးစွဲသူကိုဖယ်ရှားမည်လား?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ဤအသုံးပြုသူ၏ ဒေတာနှင့် အပ်ဖ်များအားလုံး ဖျက်လိုက်ပါမည်"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ဖယ်ရှားရန်"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ဘက်ထရီ ချွေတာမှုကို ပိတ်ထားရန်"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 70308ce..3a34cdd 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGG UT BRUKER"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Vil du legge til en ny bruker?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Når du legger til en ny bruker, må vedkommende konfigurere sitt eget område.\n\nAlle brukere kan oppdatere apper for alle andre brukere."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Vil du fjerne brukeren?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alle apper og data som tilhører denne brukeren, blir slettet."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Fjern"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparing er på"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduserer ytelsen og begrenser bakgrunnsdataene"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Slå av batterisparing"</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 027e2f1..5fadbde 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"प्रयोगकर्ता लगआउट गर्नुहोस्"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"नयाँ प्रयोगकर्ता थप्नुहुन्छ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"जब तपाईँले नयाँ प्रयोगकर्ता थप्नुहुन्छ, त्यस प्रयोगकर्ताले आफ्नो स्थान स्थापना गर्न पर्ने छ।\n\nकुनै पनि प्रयोगकर्ताले सबै अन्य प्रयोगकर्ताहरूका लागि अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"प्रयोगकर्ता हटाउन चाहनुहुन्छ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"यस प्रयोगकर्ताको सबै अनुप्रयोगहरू तथा डेटा हटाइनेछ।"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"हटाउनुहोस्"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ब्याट्रि सेभर चालु छ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ब्याट्री बचत बन्द गर्नुहोस्"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index a4aa1c4..9b7e3409 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"GEBRUIKER UITLOGGEN"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Nieuwe gebruiker toevoegen?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Wanneer u een nieuwe gebruiker toevoegt, moet die persoon zijn eigen profiel instellen.\n\n1Elke gebruiker kan apps updaten voor alle andere gebruikers."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Gebruiker verwijderen?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alle apps en gegevens van deze gebruiker worden verwijderd."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Verwijderen"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Accubesparing is ingeschakeld"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Vermindert de prestaties en achtergrondgegevens"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Accubesparing uitschakelen"</string>
diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml
index fc9d600..2d70c8a 100644
--- a/packages/SystemUI/res/values-pa-rIN/strings.xml
+++ b/packages/SystemUI/res/values-pa-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ਉਪਭੋਗਤਾ ਨੂੰ ਲੌਗ ਆਉਟ ਕਰੋ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ਕੀ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਨਾ ਹੈ?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਨਵਾਂ ਉਪਭੋਗਤਾ ਜੋੜਦੇ ਹੋ, ਉਸ ਵਿਅਕਤੀ ਨੂੰ ਆਪਣਾ ਸਪੇਸ ਸੈਟ ਅਪ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।\n\nਕੋਈ ਵੀ ਉਪਭੋਗਤਾ ਹੋਰ ਸਾਰੇ ਉਪਭੋਗਤਾਵਾਂ ਦੇ ਐਪਸ ਨੂੰ ਅਪਡੇਟ ਕਰ ਸਕਦਾ ਹੈ।"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"ਕੀ ਉਪਭੋਗਤਾ ਹਟਾਉਣਾ ਹੈ?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ਇਸ ਉਪਭੋਗਤਾ ਦੇ ਸਾਰੇ ਐਪਸ ਅਤੇ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਏਗਾ।"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ਹਟਾਓ"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ਪ੍ਰਦਰਸ਼ਨ ਅਤੇ ਪਿਛੋਕੜ ਡਾਟਾ ਘੱਟ ਕਰਦਾ ਹੈ"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ਬੈਟਰੀ ਸੇਵਰ ਬੰਦ ਕਰੋ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index b6c9964..93fa170 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"WYLOGUJ UŻYTKOWNIKA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodać nowego użytkownika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Gdy dodasz nowego użytkownika, musi on skonfigurować swój profil.\n\nKażdy użytkownik może aktualizować aplikacje wszystkich innych użytkowników."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Usunąć użytkownika?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Wszystkie aplikacje i dane tego użytkownika zostaną usunięte."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Usuń"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Oszczędzanie baterii jest włączone"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Zmniejsza wydajność i ogranicza dane w tle"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Wyłącz oszczędzanie baterii"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 9656de1..78eee7b 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DESCONECTAR USUÁRIO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Remover usuário?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Todos os apps e dados deste usuário serão excluídos."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remover"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados em segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desativar a economia de bateria"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index cde3da9..9c221dd 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"TERMINAR SESSÃO DO UTILIZADOR"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adicionar um novo utilizador?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ao adicionar um novo utilizador, essa pessoa tem de configurar o respetivo espaço.\n\nQualquer utilizador pode atualizar aplicações para todos os outros utilizadores."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Pretende remover o utilizador?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Serão eliminados todos os dados e todas as aplicações deste utilizador."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remover"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A poupança de bateria está ligada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados de segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desativar a poupança de bateria"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 9656de1..78eee7b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DESCONECTAR USUÁRIO"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adicionar novo usuário?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Quando você adiciona um novo usuário, essa pessoa precisa configurar o próprio espaço.\n\nQualquer usuário pode atualizar apps para os demais usuários."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Remover usuário?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Todos os apps e dados deste usuário serão excluídos."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Remover"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduz o desempenho e os dados em segundo plano"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Desativar a economia de bateria"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index a62dd6c..e9ff595 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -20,9 +20,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="7164937344850004466">"UI sistem"</string>
- <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ștergeţi"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"Ștergeți"</string>
<string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"Eliminaţi din listă"</string>
- <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informaţii despre aplicație"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"Informații despre aplicație"</string>
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Ecranele dvs. recente apar aici"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Renunţaţi la aplicațiile recente"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
@@ -52,8 +52,8 @@
<string name="bluetooth_tethered" msgid="7094101612161133267">"Conectat prin tethering prin Bluetooth"</string>
<string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Setaţi metode introducere text"</string>
<string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Tastatură fizică"</string>
- <string name="usb_device_permission_prompt" msgid="834698001271562057">"Permiteţi aplicației <xliff:g id="APPLICATION">%1$s</xliff:g> să acceseze dispozitivul USB?"</string>
- <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Permiteţi aplicației <xliff:g id="APPLICATION">%1$s</xliff:g> să acceseze accesoriul USB?"</string>
+ <string name="usb_device_permission_prompt" msgid="834698001271562057">"Permiteți aplicației <xliff:g id="APPLICATION">%1$s</xliff:g> să acceseze dispozitivul USB?"</string>
+ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"Permiteți aplicației <xliff:g id="APPLICATION">%1$s</xliff:g> să acceseze accesoriul USB?"</string>
<string name="usb_device_confirm_prompt" msgid="5161205258635253206">"Deschideţi <xliff:g id="ACTIVITY">%1$s</xliff:g> la conectarea acestui dispozitiv USB?"</string>
<string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"Deschideţi <xliff:g id="ACTIVITY">%1$s</xliff:g> la conectarea acestui accesoriu USB?"</string>
<string name="usb_accessory_uri_prompt" msgid="513450621413733343">"Aplic. instal. nu funcţ. cu acest acces. USB. Aflaţi despre acest accesoriu la <xliff:g id="URL">%1$s</xliff:g>"</string>
@@ -61,9 +61,9 @@
<string name="label_view" msgid="6304565553218192990">"Afişaţi"</string>
<string name="always_use_device" msgid="1450287437017315906">"Utilizaţi în mod prestabilit pt. acest dispoz. USB"</string>
<string name="always_use_accessory" msgid="1210954576979621596">"Utiliz. în mod prestabilit pt. acest accesoriu USB"</string>
- <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteţi depanarea USB?"</string>
+ <string name="usb_debugging_title" msgid="4513918393387141949">"Permiteți depanarea USB?"</string>
<string name="usb_debugging_message" msgid="2220143855912376496">"Amprenta digitală din cheia RSA a computerului este:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
- <string name="usb_debugging_always" msgid="303335496705863070">"Permiteţi întotdeauna de pe acest computer"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"Permiteți întotdeauna de pe acest computer"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Remedierea erorilor prin USB nu este permisă"</string>
<string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"Utilizatorul conectat momentan pe acest dispozitiv nu poate activa remedierea erorilor prin USB. Pentru a folosi această funcție, comutați la utilizatorul Administrator."</string>
<string name="compat_mode_on" msgid="6623839244840638213">"Zoom pt. a umple ecranul"</string>
@@ -72,13 +72,13 @@
<string name="screenshot_saving_title" msgid="8242282144535555697">"Se salvează captura de ecran..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Captura de ecran este salvată."</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"Captură de ecran realizată."</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"Atingeţi pentru a vedea captura de ecran."</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Atingeți pentru a vedea captura de ecran."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"Captura de ecran nu a putut fi realizată."</string>
<string name="screenshot_failed_text" msgid="1260203058661337274">"Captură de ecran impos. de realizat: spațiu de stoc. limitat sau nu este permisă de apl. sau de organiz."</string>
- <string name="usb_preference_title" msgid="6551050377388882787">"Opţiuni pentru transferul de fişiere prin USB"</string>
+ <string name="usb_preference_title" msgid="6551050377388882787">"Opţiuni pentru transferul de fișiere prin USB"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"Montaţi ca player media (MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"Montaţi drept cameră foto (PTP)"</string>
- <string name="installer_cd_button_title" msgid="2312667578562201583">"Instal. aplic. Transfer de fişiere Android pt. Mac"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Instal. aplic. Transfer de fișiere Android pt. Mac"</string>
<string name="accessibility_back" msgid="567011538994429120">"Înapoi"</string>
<string name="accessibility_home" msgid="8217216074895377641">"Ecranul de pornire"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Meniu"</string>
@@ -154,7 +154,7 @@
<string name="accessibility_battery_level" msgid="7451474187113371965">"Baterie: <xliff:g id="NUMBER">%d</xliff:g> procente."</string>
<string name="accessibility_settings_button" msgid="799583911231893380">"Setări de sistem."</string>
<string name="accessibility_notifications_button" msgid="4498000369779421892">"Notificări."</string>
- <string name="accessibility_remove_notification" msgid="3603099514902182350">"Ștergeţi notificarea."</string>
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"Ștergeți notificarea."</string>
<string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS activat."</string>
<string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Se obţine GPS."</string>
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter activat."</string>
@@ -223,9 +223,9 @@
<string name="status_bar_settings_signal_meter_disconnected" msgid="1940231521274147771">"Fără conex. internet"</string>
<string name="status_bar_settings_signal_meter_wifi_nossid" msgid="6557486452774597820">"Wi-Fi conectat"</string>
<string name="gps_notification_searching_text" msgid="8574247005642736060">"Se caută GPS"</string>
- <string name="gps_notification_found_text" msgid="4619274244146446464">"Locaţie setată prin GPS"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"Locație setată prin GPS"</string>
<string name="accessibility_location_active" msgid="2427290146138169014">"Solicitări locație active"</string>
- <string name="accessibility_clear_all" msgid="5235938559247164925">"Ștergeţi toate notificările."</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"Ștergeți toate notificările."</string>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Setări pentru notificări"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Setări <xliff:g id="APP_NAME">%s</xliff:g>"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ecranul se va roti în mod automat."</string>
@@ -263,7 +263,7 @@
<string name="quick_settings_user_new_user" msgid="9030521362023479778">"Utilizator nou"</string>
<string name="quick_settings_wifi_label" msgid="9135344704899546041">"Wi-Fi"</string>
<string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"Neconectat"</string>
- <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Nicio reţea"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Nicio rețea"</string>
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi deconectat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Proiectați"</string>
@@ -304,7 +304,7 @@
<string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"<xliff:g id="CHARGING_TIME">%s</xliff:g> până la încărcare completă"</string>
<string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"Nu se încarcă"</string>
<string name="ssl_ca_cert_warning" msgid="9005954106902053641">"Rețeaua poate\nfi monitorizată"</string>
- <string name="description_target_search" msgid="3091587249776033139">"Căutaţi"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"Căutați"</string>
<string name="description_direction_up" msgid="7169032478259485180">"Glisaţi în sus pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="description_direction_left" msgid="7207478719805562165">"Glisaţi spre stânga pentru <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string>
<string name="zen_priority_introduction" msgid="3070506961866919502">"Nu veți fi deranjat(ă) de sunete și vibrații, exceptând alarmele, mementourile, evenimentele și apelanții pe care îi menționați."</string>
@@ -350,6 +350,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"DECONECTAȚI UTILIZATORUL"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Adăugați utilizator nou?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Când adăugați un utilizator nou, acesta trebuie să-și configureze spațiul.\n\nOrice utilizator poate actualiza aplicațiile pentru toți ceilalți utilizatori."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Eliminați utilizatorul?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Toate aplicațiile și datele acestui utilizator vor fi șterse."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Eliminați"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Economisirea bateriei este activată"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Reduce performanța și datele de fundal"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Dezactivați economisirea bateriei"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 6ad8a67..8691233 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -353,6 +353,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ВЫЙТИ ОТ ИМЕНИ ПОЛЬЗОВАТЕЛЯ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Добавить пользователя?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"После создания профиля его необходимо настроить.\n\nОбновлять приложения для всех аккаунтов может любой пользователь устройства."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Удалить аккаунт?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Все приложения и данные этого пользователя будут удалены."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Удалить"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Включен режим энергосбережения"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Откл. фоновой передачи данных"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Отключить режим энергосбережения"</string>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index da41c3f..02533f5 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"පරිශීලකයා වරන්න"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"අලුත් පරිශීලකයෙක් එකතු කරන්නද?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"ඔබ අලුත් පරිශීලකයෙක් එකතු කරන විට, එම පුද්ගලයා ඔහුගේ වැඩ කරන ඉඩ සකසා ගත යුතුය.\n\nසියළුම අනෙක් පරිශීලකයින් සඳහා ඕනෑම පරිශීලකයෙකුට යාවත්කාලීන කළ හැක."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"පරිශීලකයා ඉවත් කරන්නද?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"මෙම පරිශීලකයාගේ සියලු යෙදුම් සහ දත්ත මකනු ඇත."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ඉවත් කරන්න"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"බැටරිය සුරකින්නා සක්රීයයි"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ක්රියාකාරිත්වය සහ පසුබිම් දත්ත අඩු කරන්න"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"බැටරි සුරැකීම අක්රිය කරන්න"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index af5d046..522d0a6 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -353,6 +353,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ODHLÁSIŤ POUŽÍVATEĽA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Pridať nového používateľa?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor.\n\nAkýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Odstrániť používateľa?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Všetky aplikácie a údaje tohto používateľa budú odstránené."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Odstrániť"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Šetrič batérie je zapnutý"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Obmedzí výkonnosť a prenos údajov na pozadí"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Vypnúť šetrič batérie"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 1205758..770844e 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ODJAVA UPORABNIKA"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Dodajanje novega uporabnika?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Ko dodate novega uporabnika, mora ta nastaviti svoj prostor.\n\nVsak uporabnik lahko posodobi aplikacije za vse druge uporabnike."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Želite odstraniti uporabnika?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Vse aplikacije in podatki tega uporabnika bodo izbrisani."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Odstrani"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Omeji zmogljivost delovanja in prenos podatkov v ozadju"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Izklop varčevanja z energijo akumulatorja"</string>
diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml
index baf17d1..1072b54 100644
--- a/packages/SystemUI/res/values-sq-rAL/strings.xml
+++ b/packages/SystemUI/res/values-sq-rAL/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"NXJERRJA E PËRDORUESIT NGA IDENTIFIKIMI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Të shtohet përdorues i ri?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kur shton një përdorues të ri, ai person duhet të konfigurojë hapësirën e vet.\n\nÇdo përdorues mund t\'i përditësojë aplikacionet për të gjithë përdoruesit e tjerë."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Të hiqet ky përdorues?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Të gjitha aplikacionet dhe të dhënat e këtij përdoruesi do të fshihen."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Hiqe"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kursimi i baterisë është i aktivizuar"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Pakëson veprimtarinë dhe të dhënat në sfond"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Çaktivizo kursimin e baterisë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 282bdcc..5df6d62 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -350,6 +350,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ОДЈАВИ КОРИСНИКА"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Додајете новог корисника?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Када додате новог корисника, та особа треба да подеси сопствени простор.\n\nСваки корисник може да ажурира апликације за све остале кориснике."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Желите ли да уклоните корисника?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Све апликације и подаци овог корисника ће бити избрисани."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Уклони"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедња батерије је укључена"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Смањује перформансе и позадинске податке"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Искључи штедњу батерије"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index cb8cbcb..807c53e 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"LOGGA UT ANVÄNDAREN"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Lägga till ny användare?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"När du lägger till en ny användare måste den personen konfigurera sitt utrymme.\n\nAlla användare kan uppdatera appar för samtliga användares räkning."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Vill du ta bort användaren?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Alla appar och all data som tillhör den här användaren raderas."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Ta bort"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparläget har aktiverats"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Minskar prestanda och bakgrundsdata"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Inaktivera batterisparläget"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index def1786..1bb6c0b 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ONDOA MTUMIAJI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Ungependa kuongeza mtumiaji?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Unapomwongeza mtumiaji mpya, mtu huyo anahitaji kusanidi nafasi yake.\n\nMtumiaji yoyote anaweza kusasisha programu kwa ajili ya watumiaji wengine wote."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Je, ungependa kuondoa mtumiaji?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Programu na data yote ya mtumiaji huyu itafutwa."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Ondoa"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kiokoa betri kimewashwa"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Hupunguza utendaji na data ya chini chini"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Zima kiokoa betri"</string>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index c9d0853..8e64e85 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"பயனரை வெளியேற்று"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"புதியவரைச் சேர்க்கவா?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"புதிய பயனரைச் சேர்க்கும்போது, அவர் தனக்கான இடத்தை அமைக்க வேண்டும்.\n\nஎந்தவொரு பயனரும், மற்ற எல்லா பயனர்களுக்காகவும் பயன்பாடுகளைப் புதுப்பிக்கலாம்."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"பயனரை அகற்றவா?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"இந்தப் பயனரின் எல்லா பயன்பாடுகளும் தரவும் நீக்கப்படும்."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"அகற்று"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"பேட்டரி சேமிப்பான் இயக்கத்தில் உள்ளது"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"செயல்திறனையும் பின்புலத் தரவையும் குறைக்கிறது"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"பேட்டரி சேமிப்பானை முடக்கு"</string>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 548c021..36b00f8 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"వినియోగదారుని లాగ్ అవుట్ చేయి"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"కొత్త వినియోగదారుని జోడించాలా?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"మీరు కొత్త వినియోగదారుని జోడించినప్పుడు, ఆ వ్యక్తి తన స్థలాన్ని సెటప్ చేసుకోవాలి.\n\nఏ వినియోగదారు అయినా మిగతా అందరు వినియోగదారుల కోసం అనువర్తనాలను నవీకరించగలరు."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"వినియోగదారుని తీసివేయాలా?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"ఈ వినియోగదారుకు సంబంధించిన అన్ని అనువర్తనాలు మరియు డేటా తొలగించబడతాయి."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"తీసివేయి"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"బ్యాటర్ సేవర్ ఆన్ చేయబడింది"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"పనితీరుని మరియు నేపథ్య డేటాను తగ్గిస్తుంది"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"బ్యాటరీ సేవర్ను ఆఫ్ చేయి"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ddae7f6..0ef2c66 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ออกจากระบบผู้ใช้"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"ต้องการเพิ่มผู้ใช้ใหม่ใช่ไหม"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"เมื่อคุณเพิ่มผู้ใช้ใหม่ ผู้ใช้ดังกล่าวจะต้องตั้งค่าพื้นที่ของตนเอง\n\nผู้ใช้ทุกคนสามารถอัปเดตแอปสำหรับผู้ใช้รายอื่นทุกคนได้"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"นำผู้ใช้ออกใช่ไหม"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"แอปและข้อมูลทั้งหมดของผู้ใช้นี้จะถูกลบ"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"นำออก"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"ลดการใช้แบตเตอรี่และข้อมูลแบ็กกราวด์"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"ปิดโหมดประหยัดแบตเตอรี่"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index d001ba9..a208c96 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"I-LOGOUT ANG USER"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Magdagdag ng bagong user?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Kapag nagdagdag ka ng bagong user, kailangang i-set up ng taong iyon ang kanyang espasyo.\n\nAng sinumang user ay maaaring mag-update ng mga app para sa lahat ng iba pang user."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Gusto mo bang alisin ang user?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Made-delete ang lahat ng app at data ng user na ito."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Alisin"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Binabawasan ang pagganap at data sa background"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"I-off ang pagtitipid ng baterya"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 5f804cf..d359cf1 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"KULLANICI OTURUMUNU KAPAT"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Yeni kullanıcı eklensin mi?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Yeni bir kullanıcı eklediğinizde, bu kişinin kendi alanını ayarlaması gerekir.\n\nHerhangi bir kullanıcı, diğer tüm kullanıcılar için uygulamaları güncelleyebilir."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Kullanıcı kaldırılsın mı?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Bu kullanıcının tüm uygulamaları ve verileri silinecek."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Kaldır"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Pil tasarrufu açık"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Performansı ve arka plan verilerini azaltır"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Pil tasarrufunu kapat"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 0c1d328..3e34a1f 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ВИЙТИ З ОБЛІКОВОГО ЗАПИСУ"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Додати нового користувача?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Користувач має налаштувати свій профіль після створення.\n\nБудь-який користувач пристрою може оновлювати додатки для решти користувачів."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Видалити користувача?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Усі додатки й дані цього користувача буде видалено."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Видалити"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режим заощадження заряду акумулятора ввімкнено"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Знижується продуктивність і обмежуються фонові дані"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Вимкнути режим заощадження заряду акумулятора"</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index d0e2fc6..650095d 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"صارف لاگ آؤٹ کریں"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"نیا صارف شامل کریں؟"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"جب آپ ایک نیا صارف شامل کرتے ہیں تو اس شخص کو اپنی جگہ کو ترتیب دینے کی ضرورت ہوتی ہے۔\n\nکوئی بھی صارف دیگر سبھی صارفین کیلئے ایپس کو اپ ڈیٹ کر سکتا ہے۔"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"صارف کو ہٹائیں؟"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"اس صارف کی سبھی ایپس اور ڈیٹا حذف کر دیا جائے گا۔"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"ہٹائیں"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"کارکردگی اور پس منظر کا ڈیٹا کم کر دیتا ہے"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"بیٹری کی بچت آف کریں"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index 8def6f42..e3073bc 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"FOYDALANUVCHI NOMIDAN CHIQISH"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Yangi foyd-chi qo‘shilsinmi?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Yangi foydalanuvchi qo‘shilgach, o‘sha shaxs o‘z hududini sozlashi lozim bo‘ladi.\n\nHar qanday foydalanuvchi ilovalarni barcha foydalanuvchilar uchun yangilashi mumkin."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Foydalanuvchi olib tashlansinmi?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Ushbu foydalanuvchining barcha ilovalari va ma’lumotlari o‘chirib tashlanadi."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Olib tashlash"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash rejimi yoqildi"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Unumdorlikni pasaytiradi va fonda int-dan foyd-ni cheklaydi"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Quvvat tejash funksiyasini o‘chiring"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 0fc90d7..4459497 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"ĐĂNG XUẤT NGƯỜI DÙNG"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Thêm người dùng mới?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Khi bạn thêm người dùng mới, người dùng đó cần thiết lập dung lượng lưu trữ của mình.\n\nMọi người dùng đều có thể cập nhật ứng dụng cho tất cả người dùng khác."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Xóa người dùng?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Tất cả các ứng dụng và dữ liệu của người dùng này sẽ bị xóa."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Xóa"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Trình tiết kiệm pin đang bật"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Giảm hiệu suất và dữ liệu nền"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Tắt trình tiết kiệm pin"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 53980c1..0272328 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"退出当前用户"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"要添加新用户吗?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"当您添加新用户时,该用户必须设置自己的空间。\n\n任何用户均可为其他所有用户更新应用。"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"是否移除用户?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"此用户的所有应用和数据均将被删除。"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"移除"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"节电助手已开启"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低性能并限制后台流量"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"关闭节电助手"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 65e200b..8adaeac 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"登出使用者"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者均可為所有其他使用者更新應用程式。"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"移除使用者?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"系統將會刪除這個使用者的所有應用程式和資料。"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"移除"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"關閉省電模式"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 04d914b..759b585 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -351,6 +351,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"登出使用者"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"新增使用者?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"新增的使用者需要自行設定個人空間。\n\n任何使用者皆可為其他所有使用者更新應用程式。"</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"要移除使用者嗎?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"系統將刪除這個使用者的所有應用程式和資料。"</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"移除"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"降低效能並限制背景數據傳輸"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"關閉節約耗電量模式"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 7a7e3fe..1e7be90 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -349,6 +349,9 @@
<string name="user_logout_notification_action" msgid="1195428991423425062">"KHIPHA UMSEBENZISI"</string>
<string name="user_add_user_title" msgid="4553596395824132638">"Engeza umsebenzisi omusha?"</string>
<string name="user_add_user_message_short" msgid="2161624834066214559">"Uma ungeza umsebenzisi omusha, loyo muntu udinga ukusetha isikhala sakhe.\n\nNoma yimuphi umsebenzisi angabuyekeza izinhlelo zokusebenza kubo bonke abasebenzisi."</string>
+ <string name="user_remove_user_title" msgid="4681256956076895559">"Susa umsebenzisi?"</string>
+ <string name="user_remove_user_message" msgid="1453218013959498039">"Zonke izinhlelo zokusebenza nedatha yalo msebenzisi kuzosuswa."</string>
+ <string name="user_remove_user_remove" msgid="7479275741742178297">"Susa"</string>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Isilondolozi sebhethri sivuliwe"</string>
<string name="battery_saver_notification_text" msgid="820318788126672692">"Sehlisa ukusebenza nedatha yasemuva"</string>
<string name="battery_saver_notification_action_text" msgid="109158658238110382">"Vala isilondolozi sebhethri"</string>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 66470cb..8da1148 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -295,7 +295,7 @@
<bool name="config_enableAppShelf">false</bool>
<!-- Whether to show the full screen user switcher. -->
- <bool name="enable_fullscreen_user_switcher">false</bool>
+ <bool name="config_enableFullscreenUserSwitcher">false</bool>
</resources>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 8eef23e..13128b7 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -37,6 +37,7 @@
<item type="id" name="doze_saved_filter_tag"/>
<item type="id" name="qs_icon_tag"/>
<item type="id" name="scrim"/>
+ <item type="id" name="scrim_target"/>
<item type="id" name="hun_scrim_alpha_start"/>
<item type="id" name="hun_scrim_alpha_end"/>
<item type="id" name="notification_power"/>
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
index 89a2c74..82a1bfe 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeHost.java
@@ -29,6 +29,7 @@
void stopDozing();
boolean isPowerSaveActive();
boolean isNotificationLightOn();
+ boolean isPulsingBlocked();
public interface Callback {
void onNewNotifications();
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index 887391c..328ee35 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -255,6 +255,9 @@
}
private void continuePulsing(int reason) {
+ if (mHost.isPulsingBlocked()) {
+ return;
+ }
mHost.pulseWhileDozing(new DozeHost.PulseCallback() {
@Override
public void onPulseStarted() {
@@ -534,8 +537,8 @@
}
}
- requestPulse(mPulseReason);
mRegistered = false;
+ requestPulse(mPulseReason);
updateListener(); // reregister, this sensor only fires once
// reset the notification pulse schedule, but only if we think we were not triggered
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 9239eac..aafa991 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -68,6 +68,7 @@
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.SystemUI;
+import com.android.systemui.statusbar.phone.FingerprintUnlockController;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.phone.ScrimController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -176,11 +177,6 @@
*/
private static final String KEYGUARD_ANALYTICS_SETTING = "keyguard_analytics";
- /**
- * How much faster we collapse the lockscreen when authenticating with fingerprint.
- */
- private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.3f;
-
/** The stream type that the lock sounds are tied to. */
private int mUiSoundsStreamType;
@@ -458,31 +454,6 @@
break;
}
}
-
- @Override
- public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
- boolean unlockingWithFingerprintAllowed =
- mUpdateMonitor.isUnlockingWithFingerprintAllowed();
- if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
- if (unlockingWithFingerprintAllowed) {
- mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(
- false /* strongAuth */);
- }
- } else {
- if (wakeAndUnlocking && mShowing && unlockingWithFingerprintAllowed) {
- mWakeAndUnlocking = true;
- mStatusBarKeyguardViewManager.setWakeAndUnlocking();
- keyguardDone(true);
- } else if (mShowing) {
- if (wakeAndUnlocking) {
- mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
- }
- mStatusBarKeyguardViewManager.animateCollapsePanels(
- FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
- }
- }
- };
-
};
ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() {
@@ -1634,11 +1605,17 @@
}
}
+ public void onWakeAndUnlocking() {
+ mWakeAndUnlocking = true;
+ keyguardDone(true /* authenticated */);
+ }
+
public StatusBarKeyguardViewManager registerStatusBar(PhoneStatusBar phoneStatusBar,
ViewGroup container, StatusBarWindowManager statusBarWindowManager,
- ScrimController scrimController) {
+ ScrimController scrimController,
+ FingerprintUnlockController fingerprintUnlockController) {
mStatusBarKeyguardViewManager.registerStatusBar(phoneStatusBar, container,
- statusBarWindowManager, scrimController);
+ statusBarWindowManager, scrimController, fingerprintUnlockController);
return mStatusBarKeyguardViewManager;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 94d5170..b640cf1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -30,7 +30,9 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.internal.logging.MetricsLogger;
@@ -46,8 +48,7 @@
import java.util.Collection;
/** View that represents the quick settings tile panel. **/
-public class QSPanel extends ViewGroup {
- private static final float TILE_ASPECT = 1.2f;
+public class QSPanel extends FrameLayout {
private final Context mContext;
protected final ArrayList<TileRecord> mRecords = new ArrayList<TileRecord>();
@@ -59,15 +60,8 @@
private final QSDetailClipper mClipper;
private final H mHandler = new H();
- private int mColumns;
- private int mCellWidth;
- private int mCellHeight;
- private int mLargeCellWidth;
- private int mLargeCellHeight;
private int mPanelPaddingBottom;
- private int mDualTileUnderlap;
private int mBrightnessPaddingTop;
- private int mGridHeight;
private boolean mExpanded;
private boolean mListening;
private boolean mClosingDetail;
@@ -80,6 +74,9 @@
private QSFooter mFooter;
private boolean mGridContentVisible = true;
+ private LinearLayout mQsContainer;
+ private TileLayout mTileLayout;
+
public QSPanel(Context context) {
this(context, null);
}
@@ -99,8 +96,19 @@
R.layout.quick_settings_brightness_dialog, this, false);
mFooter = new QSFooter(this, context);
addView(mDetail);
- addView(mBrightnessView);
- addView(mFooter.getView());
+
+ mQsContainer = new LinearLayout(mContext);
+ mQsContainer.setOrientation(LinearLayout.VERTICAL);
+ mQsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT));
+
+ addView(mQsContainer);
+
+ mTileLayout = new TileLayout(mContext, mRecords);
+
+ mQsContainer.addView(mBrightnessView);
+ mQsContainer.addView(mTileLayout);
+ mQsContainer.addView(mFooter.getView());
mClipper = new QSDetailClipper(mDetail);
updateResources();
@@ -146,18 +154,9 @@
public void updateResources() {
final Resources res = mContext.getResources();
- final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
- mCellHeight = res.getDimensionPixelSize(R.dimen.qs_tile_height);
- mCellWidth = (int)(mCellHeight * TILE_ASPECT);
- mLargeCellHeight = res.getDimensionPixelSize(R.dimen.qs_dual_tile_height);
- mLargeCellWidth = (int)(mLargeCellHeight * TILE_ASPECT);
mPanelPaddingBottom = res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom);
- mDualTileUnderlap = res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical);
mBrightnessPaddingTop = res.getDimensionPixelSize(R.dimen.qs_brightness_padding_top);
- if (mColumns != columns) {
- mColumns = columns;
- postInvalidate();
- }
+ mQsContainer.setPadding(0, mBrightnessPaddingTop, 0, mPanelPaddingBottom);
for (TileRecord r : mRecords) {
r.tile.clearState();
}
@@ -165,6 +164,7 @@
refreshAllTiles();
}
updateDetailText();
+ mTileLayout.updateResources();
}
@Override
@@ -245,9 +245,6 @@
}
private void handleSetTileVisibility(View v, int visibility) {
- if (visibility == VISIBLE && !mGridContentVisible) {
- visibility = INVISIBLE;
- }
if (visibility == v.getVisibility()) return;
v.setVisibility(visibility);
}
@@ -332,7 +329,7 @@
r.tile.refreshState();
mRecords.add(r);
- addView(r.tileView);
+ mTileLayout.addView(r.tileView);
}
public boolean isShowingDetail() {
@@ -348,7 +345,7 @@
}
public int getGridHeight() {
- return mGridHeight;
+ return mQsContainer.getMeasuredHeight();
}
private void handleShowDetail(Record r, boolean show) {
@@ -374,7 +371,7 @@
}
r.tile.setDetailListening(show);
int x = r.tileView.getLeft() + r.tileView.getWidth() / 2;
- int y = r.tileView.getTop() + r.tileView.getHeight() / 2;
+ int y = r.tileView.getTop() + mTileLayout.getTop() + r.tileView.getHeight() / 2;
handleShowDetailImpl(r, show, x, y);
}
@@ -427,13 +424,7 @@
private void setGridContentVisibility(boolean visible) {
int newVis = visible ? VISIBLE : INVISIBLE;
- for (int i = 0; i < mRecords.size(); i++) {
- TileRecord tileRecord = mRecords.get(i);
- if (tileRecord.tileView.getVisibility() != GONE) {
- tileRecord.tileView.setVisibility(newVis);
- }
- }
- mBrightnessView.setVisibility(newVis);
+ mQsContainer.setVisibility(newVis);
if (mGridContentVisible != visible) {
MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, newVis);
}
@@ -449,107 +440,6 @@
}
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final int width = MeasureSpec.getSize(widthMeasureSpec);
- mBrightnessView.measure(exactly(width), MeasureSpec.UNSPECIFIED);
- final int brightnessHeight = mBrightnessView.getMeasuredHeight() + mBrightnessPaddingTop;
- mFooter.getView().measure(exactly(width), MeasureSpec.UNSPECIFIED);
- int r = -1;
- int c = -1;
- int rows = 0;
- boolean rowIsDual = false;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- // wrap to next column if we've reached the max # of columns
- // also don't allow dual + single tiles on the same row
- if (r == -1 || c == (mColumns - 1) || rowIsDual != record.tile.supportsDualTargets()) {
- r++;
- c = 0;
- rowIsDual = record.tile.supportsDualTargets();
- } else {
- c++;
- }
- record.row = r;
- record.col = c;
- rows = r + 1;
- }
-
- View previousView = mBrightnessView;
- for (TileRecord record : mRecords) {
- if (record.tileView.setDual(record.tile.supportsDualTargets())) {
- record.tileView.handleStateChanged(record.tile.getState());
- }
- if (record.tileView.getVisibility() == GONE) continue;
- final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth;
- final int ch = record.row == 0 ? mLargeCellHeight : mCellHeight;
- record.tileView.measure(exactly(cw), exactly(ch));
- previousView = record.tileView.updateAccessibilityOrder(previousView);
- }
- int h = rows == 0 ? brightnessHeight : (getRowTop(rows) + mPanelPaddingBottom);
- if (mFooter.hasFooter()) {
- h += mFooter.getView().getMeasuredHeight();
- }
- mDetail.measure(exactly(width), MeasureSpec.UNSPECIFIED);
- if (mDetail.getMeasuredHeight() < h) {
- mDetail.measure(exactly(width), exactly(h));
- }
- mGridHeight = h;
- setMeasuredDimension(width, Math.max(h, mDetail.getMeasuredHeight()));
- }
-
- private static int exactly(int size) {
- return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
- }
-
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- final int w = getWidth();
- mBrightnessView.layout(0, mBrightnessPaddingTop,
- mBrightnessView.getMeasuredWidth(),
- mBrightnessPaddingTop + mBrightnessView.getMeasuredHeight());
- boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- final int cols = getColumnCount(record.row);
- final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth;
- final int extra = (w - cw * cols) / (cols + 1);
- int left = record.col * cw + (record.col + 1) * extra;
- final int top = getRowTop(record.row);
- int right;
- int tileWith = record.tileView.getMeasuredWidth();
- if (isRtl) {
- right = w - left;
- left = right - tileWith;
- } else {
- right = left + tileWith;
- }
- record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight());
- }
- final int dh = Math.max(mDetail.getMeasuredHeight(), getMeasuredHeight());
- mDetail.layout(0, 0, mDetail.getMeasuredWidth(), dh);
- if (mFooter.hasFooter()) {
- View footer = mFooter.getView();
- footer.layout(0, getMeasuredHeight() - footer.getMeasuredHeight(),
- footer.getMeasuredWidth(), getMeasuredHeight());
- }
- }
-
- private int getRowTop(int row) {
- if (row <= 0) return mBrightnessView.getMeasuredHeight() + mBrightnessPaddingTop;
- return mBrightnessView.getMeasuredHeight() + mBrightnessPaddingTop
- + mLargeCellHeight - mDualTileUnderlap + (row - 1) * mCellHeight;
- }
-
- private int getColumnCount(int row) {
- int cols = 0;
- for (TileRecord record : mRecords) {
- if (record.tileView.getVisibility() == GONE) continue;
- if (record.row == row) cols++;
- }
- return cols;
- }
-
private void fireShowingDetail(QSTile.DetailAdapter detail) {
if (mCallback != null) {
mCallback.onShowingDetail(detail);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
new file mode 100644
index 0000000..02b8fe3
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -0,0 +1,127 @@
+package com.android.systemui.qs;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.android.systemui.R;
+import com.android.systemui.qs.QSPanel.TileRecord;
+
+import java.util.ArrayList;
+
+public class TileLayout extends ViewGroup {
+
+ private static final float TILE_ASPECT = 1.2f;
+
+ private static final String TAG = "TileLayout";
+
+ private int mDualTileUnderlap;
+ private int mColumns;
+ private int mCellWidth;
+ private int mCellHeight;
+ private int mLargeCellWidth;
+ private int mLargeCellHeight;
+
+ private final ArrayList<TileRecord> mRecords;
+
+ public TileLayout(Context context, ArrayList<TileRecord> records) {
+ super(context);
+ mRecords = records;
+ updateResources();
+ }
+
+ public void updateResources() {
+ final Resources res = mContext.getResources();
+ final int columns = Math.max(1, res.getInteger(R.integer.quick_settings_num_columns));
+ mCellHeight = res.getDimensionPixelSize(R.dimen.qs_tile_height);
+ mCellWidth = (int)(mCellHeight * TILE_ASPECT);
+ mLargeCellHeight = res.getDimensionPixelSize(R.dimen.qs_dual_tile_height);
+ mLargeCellWidth = (int)(mLargeCellHeight * TILE_ASPECT);
+ mDualTileUnderlap = res.getDimensionPixelSize(R.dimen.qs_dual_tile_padding_vertical);
+ if (mColumns != columns) {
+ mColumns = columns;
+ postInvalidate();
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int width = MeasureSpec.getSize(widthMeasureSpec);
+ int r = -1;
+ int c = -1;
+ int rows = 0;
+ boolean rowIsDual = false;
+ for (TileRecord record : mRecords) {
+ if (record.tileView.getVisibility() == GONE) continue;
+ // wrap to next column if we've reached the max # of columns
+ // also don't allow dual + single tiles on the same row
+ if (r == -1 || c == (mColumns - 1) || rowIsDual != record.tile.supportsDualTargets()) {
+ r++;
+ c = 0;
+ rowIsDual = record.tile.supportsDualTargets();
+ } else {
+ c++;
+ }
+ record.row = r;
+ record.col = c;
+ rows = r + 1;
+ }
+
+ View previousView = this;
+ for (TileRecord record : mRecords) {
+ if (record.tileView.setDual(record.tile.supportsDualTargets())) {
+ record.tileView.handleStateChanged(record.tile.getState());
+ }
+ if (record.tileView.getVisibility() == GONE) continue;
+ final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth;
+ final int ch = record.row == 0 ? mLargeCellHeight : mCellHeight;
+ record.tileView.measure(exactly(cw), exactly(ch));
+ previousView = record.tileView.updateAccessibilityOrder(previousView);
+ }
+ int h = rows == 0 ? 0 : getRowTop(rows);
+ setMeasuredDimension(width, h);
+ }
+
+ private static int exactly(int size) {
+ return MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY);
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ final int w = getWidth();
+ boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
+ for (TileRecord record : mRecords) {
+ if (record.tileView.getVisibility() == GONE) continue;
+ final int cols = getColumnCount(record.row);
+ final int cw = record.row == 0 ? mLargeCellWidth : mCellWidth;
+ final int extra = (w - cw * cols) / (cols + 1);
+ int left = record.col * cw + (record.col + 1) * extra;
+ final int top = getRowTop(record.row);
+ int right;
+ int tileWith = record.tileView.getMeasuredWidth();
+ if (isRtl) {
+ right = w - left;
+ left = right - tileWith;
+ } else {
+ right = left + tileWith;
+ }
+ record.tileView.layout(left, top, right, top + record.tileView.getMeasuredHeight());
+ }
+ }
+
+ private int getRowTop(int row) {
+ if (row <= 0) return 0;
+ return mLargeCellHeight - mDualTileUnderlap + (row - 1) * mCellHeight;
+ }
+
+ private int getColumnCount(int row) {
+ int cols = 0;
+ for (TileRecord record : mRecords) {
+ if (record.tileView.getVisibility() == GONE) continue;
+ if (record.row == row) cols++;
+ }
+ return cols;
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 403af70..7f17885 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -350,6 +350,7 @@
} else {
updateBackground();
}
+ setOutlineAlpha(dark ? 0f : 1f);
}
public void setShowingLegacyBackground(boolean showing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
index d77e050..a6fc4bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
@@ -34,6 +34,7 @@
private final Rect mOutlineRect = new Rect();
protected final int mRoundedRectCornerRadius;
private boolean mCustomOutline;
+ private float mOutlineAlpha = 1f;
public ExpandableOutlineView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -50,6 +51,7 @@
} else {
outline.setRoundRect(mOutlineRect, mRoundedRectCornerRadius);
}
+ outline.setAlpha(mOutlineAlpha);
}
});
}
@@ -66,6 +68,11 @@
invalidateOutline();
}
+ protected void setOutlineAlpha(float alpha) {
+ mOutlineAlpha = alpha;
+ invalidateOutline();
+ }
+
protected void setOutlineRect(RectF rect) {
if (rect != null) {
setOutlineRect(rect.left, rect.top, rect.right, rect.bottom);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index 86b8972..4d3e57e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -100,6 +100,19 @@
mHandler.post(mPulseIn);
}
+ /**
+ * Aborts pulsing immediately.
+ */
+ public void abortPulsing() {
+ mHandler.removeCallbacks(mPulseIn);
+ abortAnimations();
+ if (mDozing) {
+ mScrimController.setDozeBehindAlpha(1f);
+ mScrimController.setDozeInFrontAlpha(1f);
+ }
+ mPulseCallback = null;
+ }
+
public void onScreenTurnedOn() {
if (isPulsing()) {
final boolean pickup = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP;
@@ -114,6 +127,10 @@
return mPulseCallback != null;
}
+ public boolean isDozing() {
+ return mDozing;
+ }
+
private void cancelPulsing() {
if (DEBUG) Log.d(TAG, "Cancel pulsing");
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
new file mode 100644
index 0000000..28d4a42ef
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2015 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
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.os.SystemClock;
+import android.util.Log;
+
+import com.android.keyguard.KeyguardConstants;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
+import com.android.systemui.keyguard.KeyguardViewMediator;
+
+/**
+ * Controller which coordinates all the fingerprint unlocking actions with the UI.
+ */
+public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback {
+
+ private static final String TAG = "FingerprintController";
+ private static final boolean DEBUG_FP_WAKELOCK = KeyguardConstants.DEBUG_FP_WAKELOCK;
+ private static final long FINGERPRINT_WAKELOCK_TIMEOUT_MS = 15 * 1000;
+ private static final String FINGERPRINT_WAKE_LOCK_NAME = "wake-and-unlock wakelock";
+
+ /**
+ * Mode in which we don't need to wake up the device when we get a fingerprint.
+ */
+ public static final int MODE_NONE = 0;
+
+ /**
+ * Mode in which we wake up the device, and directly dismiss Keyguard. Active when we acquire
+ * a fingerprint while the screen is off and the device was sleeping.
+ */
+ public static final int MODE_WAKE_AND_UNLOCK = 1;
+
+ /**
+ * Mode in which we wake the device up, and fade out the Keyguard contents because they were
+ * already visible while pulsing in doze mode.
+ */
+ public static final int MODE_WAKE_AND_UNLOCK_PULSING = 2;
+
+ /**
+ * Mode in which we wake up the device, but play the normal dismiss animation. Active when we
+ * acquire a fingerprint pulsing in doze mode.
+ */
+ public static final int MODE_SHOW_BOUNCER = 3;
+
+ /**
+ * Mode in which we only wake up the device, and keyguard was not showing when we acquired a
+ * fingerprint.
+ * */
+ public static final int MODE_ONLY_WAKE = 4;
+
+ /**
+ * Mode in which fingerprint unlocks the device.
+ */
+ public static final int MODE_UNLOCK = 5;
+
+ /**
+ * Mode in which fingerprint brings up the bouncer because fingerprint unlocking is currently
+ * not allowed.
+ */
+ public static final int MODE_DISMISS_BOUNCER = 6;
+
+ /**
+ * How much faster we collapse the lockscreen when authenticating with fingerprint.
+ */
+ private static final float FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR = 1.3f;
+
+ private PowerManager mPowerManager;
+ private Handler mHandler = new Handler();
+ private PowerManager.WakeLock mWakeLock;
+ private KeyguardUpdateMonitor mUpdateMonitor;
+ private int mMode;
+ private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
+ private StatusBarWindowManager mStatusBarWindowManager;
+ private DozeScrimController mDozeScrimController;
+ private KeyguardViewMediator mKeyguardViewMediator;
+ private ScrimController mScrimController;
+ private PhoneStatusBar mPhoneStatusBar;
+
+ public FingerprintUnlockController(Context context,
+ StatusBarWindowManager statusBarWindowManager,
+ DozeScrimController dozeScrimController,
+ KeyguardViewMediator keyguardViewMediator,
+ ScrimController scrimController,
+ PhoneStatusBar phoneStatusBar) {
+ mPowerManager = context.getSystemService(PowerManager.class);
+ mUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
+ mUpdateMonitor.registerCallback(this);
+ mStatusBarWindowManager = statusBarWindowManager;
+ mDozeScrimController = dozeScrimController;
+ mKeyguardViewMediator = keyguardViewMediator;
+ mScrimController = scrimController;
+ mPhoneStatusBar = phoneStatusBar;
+ }
+
+ public void setStatusBarKeyguardViewManager(
+ StatusBarKeyguardViewManager statusBarKeyguardViewManager) {
+ mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
+ }
+
+ private final Runnable mReleaseFingerprintWakeLockRunnable = new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG_FP_WAKELOCK) {
+ Log.i(TAG, "fp wakelock: TIMEOUT!!");
+ }
+ releaseFingerprintWakeLock();
+ }
+ };
+
+ private void releaseFingerprintWakeLock() {
+ if (mWakeLock != null) {
+ mHandler.removeCallbacks(mReleaseFingerprintWakeLockRunnable);
+ if (DEBUG_FP_WAKELOCK) {
+ Log.i(TAG, "releasing fp wakelock");
+ }
+ mWakeLock.release();
+ mWakeLock = null;
+ }
+ }
+
+ @Override
+ public void onFingerprintAcquired() {
+ releaseFingerprintWakeLock();
+ if (!mUpdateMonitor.isDeviceInteractive()) {
+ mWakeLock = mPowerManager.newWakeLock(
+ PowerManager.PARTIAL_WAKE_LOCK, FINGERPRINT_WAKE_LOCK_NAME);
+ mWakeLock.acquire();
+ if (DEBUG_FP_WAKELOCK) {
+ Log.i(TAG, "fingerprint acquired, grabbing fp wakelock");
+ }
+ mHandler.postDelayed(mReleaseFingerprintWakeLockRunnable,
+ FINGERPRINT_WAKELOCK_TIMEOUT_MS);
+ if (mDozeScrimController.isPulsing()) {
+
+ // If we are waking the device up while we are pulsing the clock and the
+ // notifications would light up first, creating an unpleasant animation.
+ // Defer changing the screen brightness by forcing doze brightness on our window
+ // until the clock and the notifications are faded out.
+ mStatusBarWindowManager.setForceDozeBrightness(true);
+ }
+ }
+ }
+
+ @Override
+ public void onFingerprintAuthenticated(int userId) {
+ boolean wasDeviceInteractive = mUpdateMonitor.isDeviceInteractive();
+ mMode = calculateMode();
+ if (!wasDeviceInteractive) {
+ if (DEBUG_FP_WAKELOCK) {
+ Log.i(TAG, "fp wakelock: Authenticated, waking up...");
+ }
+ mPowerManager.wakeUp(SystemClock.uptimeMillis());
+ }
+ releaseFingerprintWakeLock();
+ switch (mMode) {
+ case MODE_DISMISS_BOUNCER:
+ mStatusBarKeyguardViewManager.notifyKeyguardAuthenticated(
+ false /* strongAuth */);
+ break;
+ case MODE_UNLOCK:
+ case MODE_SHOW_BOUNCER:
+ if (!wasDeviceInteractive) {
+ mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
+ }
+ mStatusBarKeyguardViewManager.animateCollapsePanels(
+ FINGERPRINT_COLLAPSE_SPEEDUP_FACTOR);
+ break;
+ case MODE_WAKE_AND_UNLOCK:
+ case MODE_WAKE_AND_UNLOCK_PULSING:
+ mDozeScrimController.abortPulsing();
+ mKeyguardViewMediator.onWakeAndUnlocking();
+ mScrimController.setWakeAndUnlocking();
+ if (mPhoneStatusBar.getNavigationBarView() != null) {
+ mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
+ }
+ break;
+ case MODE_ONLY_WAKE:
+ case MODE_NONE:
+ break;
+ }
+ if (mMode != MODE_WAKE_AND_UNLOCK_PULSING) {
+ mStatusBarWindowManager.setForceDozeBrightness(false);
+ }
+ mPhoneStatusBar.notifyFpAuthModeChanged();
+ }
+
+ public int getMode() {
+ return mMode;
+ }
+
+ private int calculateMode() {
+ boolean unlockingAllowed = mUpdateMonitor.isUnlockingWithFingerprintAllowed();
+ if (!mUpdateMonitor.isDeviceInteractive()) {
+ if (!mStatusBarKeyguardViewManager.isShowing()) {
+ return MODE_ONLY_WAKE;
+ } else if (mDozeScrimController.isPulsing() && unlockingAllowed) {
+ return MODE_WAKE_AND_UNLOCK_PULSING;
+ } else if (unlockingAllowed) {
+ return MODE_WAKE_AND_UNLOCK;
+ } else {
+ return MODE_SHOW_BOUNCER;
+ }
+ }
+ if (mStatusBarKeyguardViewManager.isShowing()) {
+ if (mStatusBarKeyguardViewManager.isBouncerShowing() && unlockingAllowed) {
+ return MODE_DISMISS_BOUNCER;
+ } else if (unlockingAllowed) {
+ return MODE_UNLOCK;
+ } else {
+ return MODE_SHOW_BOUNCER;
+ }
+ }
+ return MODE_NONE;
+ }
+
+ @Override
+ public void onFingerprintAuthFailed() {
+ cleanup();
+ }
+
+ @Override
+ public void onFingerprintError(int msgId, String errString) {
+ cleanup();
+ }
+
+ private void cleanup() {
+ mMode = MODE_NONE;
+ releaseFingerprintWakeLock();
+ mStatusBarWindowManager.setForceDozeBrightness(false);
+ mPhoneStatusBar.notifyFpAuthModeChanged();
+ }
+
+ public void startKeyguardFadingAway() {
+
+ // Disable brightness override when the ambient contents are fully invisible.
+ mHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ mStatusBarWindowManager.setForceDozeBrightness(false);
+ }
+ }, PhoneStatusBar.FADE_KEYGUARD_DURATION_PULSING);
+ }
+
+ public void finishKeyguardFadingAway() {
+ mMode = MODE_NONE;
+ if (mPhoneStatusBar.getNavigationBarView() != null) {
+ mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
+ }
+ mPhoneStatusBar.notifyFpAuthModeChanged();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index f1b8873..4da9acd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -113,12 +113,10 @@
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mPrewarmMessenger = new Messenger(service);
- mPrewarmBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
- mPrewarmBound = false;
mPrewarmMessenger = null;
}
};
@@ -376,7 +374,7 @@
Intent intent = getCameraIntent();
ActivityInfo targetInfo = PreviewInflater.getTargetActivityInfo(mContext, intent,
KeyguardUpdateMonitor.getCurrentUser());
- if (targetInfo != null) {
+ if (targetInfo != null && targetInfo.metaData != null) {
String clazz = targetInfo.metaData.getString(
MediaStore.META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE);
if (clazz != null) {
@@ -384,8 +382,10 @@
serviceIntent.setClassName(targetInfo.packageName, clazz);
serviceIntent.setAction(CameraPrewarmService.ACTION_PREWARM);
try {
- getContext().bindServiceAsUser(serviceIntent, mPrewarmConnection,
- Context.BIND_AUTO_CREATE, new UserHandle(UserHandle.USER_CURRENT));
+ if (getContext().bindServiceAsUser(serviceIntent, mPrewarmConnection,
+ Context.BIND_AUTO_CREATE, new UserHandle(UserHandle.USER_CURRENT))) {
+ mPrewarmBound = true;
+ }
} catch (SecurityException e) {
Log.w(TAG, "Unable to bind to prewarm service package=" + targetInfo.packageName
+ " class=" + clazz, e);
@@ -396,7 +396,7 @@
public void unbindCameraPrewarmService(boolean launched) {
if (mPrewarmBound) {
- if (launched) {
+ if (mPrewarmMessenger != null && launched) {
try {
mPrewarmMessenger.send(Message.obtain(null /* handler */,
CameraPrewarmService.MSG_CAMERA_FIRED));
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 b487fa3..b794353 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -99,6 +99,7 @@
import com.android.internal.statusbar.StatusBarIcon;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.DemoMode;
@@ -231,6 +232,7 @@
public static final int FADE_KEYGUARD_START_DELAY = 100;
public static final int FADE_KEYGUARD_DURATION = 300;
+ public static final int FADE_KEYGUARD_DURATION_PULSING = 120;
/** Allow some time inbetween the long press for back and recents. */
private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
@@ -272,6 +274,7 @@
BrightnessMirrorController mBrightnessMirrorController;
AccessibilityController mAccessibilityController;
FullscreenUserSwitcher mFullscreenUserSwitcher;
+ FingerprintUnlockController mFingerprintUnlockController;
int mNaturalBarHeight = -1;
@@ -623,6 +626,7 @@
startKeyguard();
mDozeServiceHost = new DozeServiceHost();
+ KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mDozeServiceHost);
putComponent(DozeHost.class, mDozeServiceHost);
putComponent(PhoneStatusBar.class, this);
@@ -1038,10 +1042,15 @@
private void startKeyguard() {
KeyguardViewMediator keyguardViewMediator = getComponent(KeyguardViewMediator.class);
+ mFingerprintUnlockController = new FingerprintUnlockController(mContext,
+ mStatusBarWindowManager, mDozeScrimController, keyguardViewMediator,
+ mScrimController, this);
mStatusBarKeyguardViewManager = keyguardViewMediator.registerStatusBar(this,
- mStatusBarWindow, mStatusBarWindowManager, mScrimController);
+ mStatusBarWindow, mStatusBarWindowManager, mScrimController,
+ mFingerprintUnlockController);
mKeyguardIndicationController.setStatusBarKeyguardViewManager(
mStatusBarKeyguardViewManager);
+ mFingerprintUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
mKeyguardViewMediatorCallback = keyguardViewMediator.getViewMediatorCallback();
}
@@ -3460,6 +3469,27 @@
}
/**
+ * Fades the content of the Keyguard while we are dozing and makes it invisible when finished
+ * fading.
+ */
+ public void fadeKeyguardWhilePulsing() {
+ mNotificationPanel.animate()
+ .alpha(0f)
+ .setStartDelay(0)
+ .setDuration(FADE_KEYGUARD_DURATION_PULSING)
+ .setInterpolator(ScrimController.KEYGUARD_FADE_OUT_INTERPOLATOR)
+ .withLayer()
+ .withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ mNotificationPanel.setAlpha(1f);
+ hideKeyguard();
+ }
+ })
+ .start();
+ }
+
+ /**
* Starts the timeout when we try to start the affordances on Keyguard. We usually rely that
* Keyguard goes away via fadeKeyguardAfterLaunchTransition, however, that might not happen
* because the launched app crashed or something else went wrong.
@@ -3613,7 +3643,12 @@
mNotificationPanel.setDozing(mDozing, animate);
mStackScroller.setDark(mDozing, animate, mWakeUpTouchLocation);
mScrimController.setDozing(mDozing);
- mDozeScrimController.setDozing(mDozing, animate);
+
+ // Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock
+ // for pulsing so the Keyguard fade-out animation scrim can take over.
+ mDozeScrimController.setDozing(mDozing &&
+ mFingerprintUnlockController.getMode()
+ != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING, animate);
}
public void updateStackScrollerState(boolean goingToFullShade) {
@@ -4045,8 +4080,15 @@
}
}
+ public void notifyFpAuthModeChanged() {
+ updateDozing();
+ }
+
private void updateDozing() {
- mDozing = mDozingRequested && mState == StatusBarState.KEYGUARD;
+ // When in wake-and-unlock while pulsing, keep dozing state until fully unlocked.
+ mDozing = mDozingRequested && mState == StatusBarState.KEYGUARD
+ || mFingerprintUnlockController.getMode()
+ == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
updateDozingState();
}
@@ -4076,7 +4118,7 @@
}
}
- private final class DozeServiceHost implements DozeHost {
+ private final class DozeServiceHost extends KeyguardUpdateMonitorCallback implements DozeHost {
// Amount of time to allow to update the time shown on the screen before releasing
// the wakelock. This timeout is design to compensate for the fact that we don't
// currently have a way to know when time display contents have actually been
@@ -4150,6 +4192,12 @@
}
@Override
+ public boolean isPulsingBlocked() {
+ return mFingerprintUnlockController.getMode()
+ == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
+ }
+
+ @Override
public boolean isNotificationLightOn() {
return mNotificationLightOn;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 1a35500..5b009ee 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -44,12 +44,15 @@
public class ScrimController implements ViewTreeObserver.OnPreDrawListener,
HeadsUpManager.OnHeadsUpChangedListener {
public static final long ANIMATION_DURATION = 220;
+ public static final Interpolator KEYGUARD_FADE_OUT_INTERPOLATOR
+ = new PathInterpolator(0f, 0, 0.7f, 1f);
private static final float SCRIM_BEHIND_ALPHA = 0.62f;
private static final float SCRIM_BEHIND_ALPHA_KEYGUARD = 0.45f;
private static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f;
private static final float SCRIM_IN_FRONT_ALPHA = 0.75f;
private static final int TAG_KEY_ANIM = R.id.scrim;
+ private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;
private static final int TAG_HUN_START_ALPHA = R.id.hun_scrim_alpha_start;
private static final int TAG_HUN_END_ALPHA = R.id.hun_scrim_alpha_end;
@@ -71,9 +74,7 @@
private long mDurationOverride = -1;
private long mAnimationDelay;
private Runnable mOnAnimationFinished;
- private boolean mAnimationStarted;
private final Interpolator mInterpolator = new DecelerateInterpolator();
- private final Interpolator mKeyguardFadeOutInterpolator = new PathInterpolator(0f, 0, 0.7f, 1f);
private BackDropView mBackDropView;
private boolean mScrimSrcEnabled;
private boolean mDozing;
@@ -145,7 +146,7 @@
public void abortKeyguardFadingOut() {
if (mAnimateKeyguardFadingOut) {
- endAnimateKeyguardFadingOut();
+ endAnimateKeyguardFadingOut(true /* force */);
}
}
@@ -198,8 +199,13 @@
// During wake and unlock, we first hide everything behind a black scrim, which then
// gets faded out from animateKeyguardFadingOut.
- setScrimInFrontColor(1f);
- setScrimBehindColor(0f);
+ if (mDozing) {
+ setScrimInFrontColor(0f);
+ setScrimBehindColor(1f);
+ } else {
+ setScrimInFrontColor(1f);
+ setScrimBehindColor(0f);
+ }
} else if (!mKeyguardShowing && !mBouncerShowing) {
updateScrimNormal();
setScrimInFrontColor(0);
@@ -258,10 +264,14 @@
}
private void setScrimColor(View scrim, float alpha) {
- Object runningAnim = scrim.getTag(TAG_KEY_ANIM);
- if (runningAnim instanceof ValueAnimator) {
- ((ValueAnimator) runningAnim).cancel();
- scrim.setTag(TAG_KEY_ANIM, null);
+ ValueAnimator runningAnim = (ValueAnimator) scrim.getTag(TAG_KEY_ANIM);
+ Float target = (Float) scrim.getTag(TAG_KEY_ANIM_TARGET);
+ if (runningAnim != null && target != null) {
+ if (alpha != target) {
+ runningAnim.cancel();
+ } else {
+ return;
+ }
}
if (mAnimateChange) {
startScrimAnimation(scrim, alpha);
@@ -325,15 +335,16 @@
mOnAnimationFinished = null;
}
scrim.setTag(TAG_KEY_ANIM, null);
+ scrim.setTag(TAG_KEY_ANIM_TARGET, null);
}
});
anim.start();
scrim.setTag(TAG_KEY_ANIM, anim);
- mAnimationStarted = true;
+ scrim.setTag(TAG_KEY_ANIM_TARGET, target);
}
private Interpolator getInterpolator() {
- return mAnimateKeyguardFadingOut ? mKeyguardFadeOutInterpolator : mInterpolator;
+ return mAnimateKeyguardFadingOut ? KEYGUARD_FADE_OUT_INTERPOLATOR : mInterpolator;
}
@Override
@@ -345,19 +356,23 @@
mAnimationDelay = 0;
// Make sure that we always call the listener even if we didn't start an animation.
- endAnimateKeyguardFadingOut();
- mAnimationStarted = false;
+ endAnimateKeyguardFadingOut(false /* force */);
return true;
}
- private void endAnimateKeyguardFadingOut() {
+ private void endAnimateKeyguardFadingOut(boolean force) {
mAnimateKeyguardFadingOut = false;
- if (!mAnimationStarted && mOnAnimationFinished != null) {
+ if ((force || (!isAnimating(mScrimInFront) && !isAnimating(mScrimBehind)))
+ && mOnAnimationFinished != null) {
mOnAnimationFinished.run();
mOnAnimationFinished = null;
}
}
+ private boolean isAnimating(View scrim) {
+ return scrim.getTag(TAG_KEY_ANIM) != null;
+ }
+
public void setBackDropView(BackDropView backDropView) {
mBackDropView = backDropView;
mBackDropView.setOnVisibilityChangedRunnable(new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 9d47713..448f16d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -48,6 +48,8 @@
// with the appear animations of the PIN/pattern/password views.
private static final long NAV_BAR_SHOW_DELAY_BOUNCER = 320;
+ private static final long WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS = 200;
+
private static String TAG = "StatusBarKeyguardViewManager";
private final Context mContext;
@@ -56,6 +58,7 @@
private ViewMediatorCallback mViewMediatorCallback;
private PhoneStatusBar mPhoneStatusBar;
private ScrimController mScrimController;
+ private FingerprintUnlockController mFingerprintUnlockController;
private ViewGroup mContainer;
private StatusBarWindowManager mStatusBarWindowManager;
@@ -74,7 +77,6 @@
private boolean mLastDeferScrimFadeOut;
private OnDismissAction mAfterKeyguardGoneAction;
private boolean mDeviceWillWakeUp;
- private boolean mWakeAndUnlocking;
private boolean mDeferScrimFadeOut;
public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
@@ -86,11 +88,13 @@
public void registerStatusBar(PhoneStatusBar phoneStatusBar,
ViewGroup container, StatusBarWindowManager statusBarWindowManager,
- ScrimController scrimController) {
+ ScrimController scrimController,
+ FingerprintUnlockController fingerprintUnlockController) {
mPhoneStatusBar = phoneStatusBar;
mContainer = container;
mStatusBarWindowManager = statusBarWindowManager;
mScrimController = scrimController;
+ mFingerprintUnlockController = fingerprintUnlockController;
mBouncer = new KeyguardBouncer(mContext, mViewMediatorCallback, mLockPatternUtils,
mStatusBarWindowManager, container);
}
@@ -178,10 +182,9 @@
public void onScreenTurnedOn() {
mScreenTurnedOn = true;
- mWakeAndUnlocking = false;
if (mDeferScrimFadeOut) {
mDeferScrimFadeOut = false;
- animateScrimControllerKeyguardFadingOut(0, 200);
+ animateScrimControllerKeyguardFadingOut(0, WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS);
updateStates();
}
mPhoneStatusBar.onScreenTurnedOn();
@@ -273,18 +276,36 @@
}
});
} else {
- mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
- boolean staying = mPhoneStatusBar.hideKeyguard();
- if (!staying) {
+ if (mFingerprintUnlockController.getMode()
+ == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING) {
+ mFingerprintUnlockController.startKeyguardFadingAway();
+ mPhoneStatusBar.setKeyguardFadingAway(startTime, 0, 250);
mStatusBarWindowManager.setKeyguardFadingAway(true);
- if (mWakeAndUnlocking && !mScreenTurnedOn) {
- mDeferScrimFadeOut = true;
- } else {
- animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration);
- }
+ mPhoneStatusBar.fadeKeyguardWhilePulsing();
+ animateScrimControllerKeyguardFadingOut(0, 250);
} else {
- mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
- mPhoneStatusBar.finishKeyguardFadingAway();
+ mFingerprintUnlockController.startKeyguardFadingAway();
+ mPhoneStatusBar.setKeyguardFadingAway(startTime, delay, fadeoutDuration);
+ boolean staying = mPhoneStatusBar.hideKeyguard();
+ if (!staying) {
+ mStatusBarWindowManager.setKeyguardFadingAway(true);
+ if (mFingerprintUnlockController.getMode()
+ == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
+ if (!mScreenTurnedOn) {
+ mDeferScrimFadeOut = true;
+ } else {
+
+ // Screen is already on, don't defer with fading out.
+ animateScrimControllerKeyguardFadingOut(0,
+ WAKE_AND_UNLOCK_SCRIM_FADEOUT_DURATION_MS);
+ }
+ } else {
+ animateScrimControllerKeyguardFadingOut(delay, fadeoutDuration);
+ }
+ } else {
+ mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
+ mPhoneStatusBar.finishKeyguardFadingAway();
+ }
}
mStatusBarWindowManager.setKeyguardShowing(false);
mBouncer.hide(true /* destroyView */);
@@ -292,7 +313,6 @@
executeAfterKeyguardGoneAction();
updateStates();
}
-
}
private void animateScrimControllerKeyguardFadingOut(long delay, long duration) {
@@ -302,9 +322,7 @@
public void run() {
mStatusBarWindowManager.setKeyguardFadingAway(false);
mPhoneStatusBar.finishKeyguardFadingAway();
- if (mPhoneStatusBar.getNavigationBarView() != null) {
- mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
- }
+ mFingerprintUnlockController.finishKeyguardFadingAway();
WindowManagerGlobal.getInstance().trimMemory(
ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, "Fading out", 0);
@@ -402,8 +420,13 @@
if (navBarVisible != lastNavBarVisible || mFirstUpdate) {
if (mPhoneStatusBar.getNavigationBarView() != null) {
if (navBarVisible) {
- mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
- getNavBarShowDelay());
+ long delay = getNavBarShowDelay();
+ if (delay == 0) {
+ mMakeNavigationBarVisibleRunnable.run();
+ } else {
+ mContainer.postOnAnimationDelayed(mMakeNavigationBarVisibleRunnable,
+ delay);
+ }
} else {
mContainer.removeCallbacks(mMakeNavigationBarVisibleRunnable);
mPhoneStatusBar.getNavigationBarView().setVisibility(View.GONE);
@@ -489,14 +512,6 @@
mBouncer.notifyKeyguardAuthenticated(strongAuth);
}
- public void setWakeAndUnlocking() {
- mWakeAndUnlocking = true;
- mScrimController.setWakeAndUnlocking();
- if (mPhoneStatusBar.getNavigationBarView() != null) {
- mPhoneStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
- }
- }
-
public void showBouncerMessage(String message, int color) {
mBouncer.showMessage(message, color);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
index 2626fba..dd62d9b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java
@@ -24,6 +24,7 @@
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
+import android.view.Window;
import android.view.WindowManager;
import com.android.keyguard.R;
@@ -47,13 +48,15 @@
private WindowManager.LayoutParams mLpChanged;
private int mBarHeight;
private final boolean mKeyguardScreenRotation;
-
+ private final float mScreenBrightnessDoze;
private final State mCurrentState = new State();
public StatusBarWindowManager(Context context) {
mContext = context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mKeyguardScreenRotation = shouldEnableKeyguardScreenRotation();
+ mScreenBrightnessDoze = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_screenBrightnessDoze) / 255f;
}
private boolean shouldEnableKeyguardScreenRotation() {
@@ -183,6 +186,7 @@
applyInputFeatures(state);
applyFitsSystemWindows(state);
applyModalFlag(state);
+ applyBrightness(state);
if (mLp.copyFrom(mLpChanged) != 0) {
mWindowManager.updateViewLayout(mStatusBarView, mLp);
}
@@ -206,6 +210,14 @@
}
}
+ private void applyBrightness(State state) {
+ if (state.forceDozeBrightness) {
+ mLpChanged.screenBrightness = mScreenBrightnessDoze;
+ } else {
+ mLpChanged.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
+ }
+ }
+
public void setKeyguardShowing(boolean showing) {
mCurrentState.keyguardShowing = showing;
apply(mCurrentState);
@@ -280,6 +292,15 @@
apply(mCurrentState);
}
+ /**
+ * Set whether the screen brightness is forced to the value we use for doze mode by the status
+ * bar window.
+ */
+ public void setForceDozeBrightness(boolean forceDozeBrightness) {
+ mCurrentState.forceDozeBrightness = forceDozeBrightness;
+ apply(mCurrentState);
+ }
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("StatusBarWindowManager state:");
pw.println(mCurrentState);
@@ -298,6 +319,7 @@
boolean headsUpShowing;
boolean forceStatusBarVisible;
boolean forceCollapsed;
+ boolean forceDozeBrightness;
/**
* The {@link BaseStatusBar} state from the status bar.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
index d646d0d..091db76 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockMethodCache.java
@@ -132,7 +132,7 @@
}
@Override
- public void onFingerprintAuthenticated(int userId, boolean wakeAndUnlocking) {
+ public void onFingerprintAuthenticated(int userId) {
if (!mKeyguardUpdateMonitor.isUnlockingWithFingerprintAllowed()) {
return;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 564a197..8165894 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -286,7 +286,7 @@
return overrideUseFullscreenUserSwitcher != 0;
}
// Otherwise default to the build setting.
- return mContext.getResources().getBoolean(R.bool.enable_fullscreen_user_switcher);
+ return mContext.getResources().getBoolean(R.bool.config_enableFullscreenUserSwitcher);
}
public void removeUserId(int userId) {
@@ -400,12 +400,6 @@
switchToUserId(UserHandle.USER_SYSTEM);
stopUserId(currentUser);
}
- } else if (Intent.ACTION_USER_ADDED.equals(intent.getAction())) {
- final int currentId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
- UserInfo userInfo = mUserManager.getUserInfo(currentId);
- if (userInfo != null && userInfo.isGuest()) {
- showGuestNotification(currentId);
- }
} else if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
if (mExitGuestDialog != null && mExitGuestDialog.isShowing()) {
mExitGuestDialog.cancel();
@@ -437,6 +431,9 @@
&& userInfo.id != UserHandle.USER_SYSTEM) {
showLogoutNotification(currentId);
}
+ if (userInfo != null && userInfo.isGuest()) {
+ showGuestNotification(currentId);
+ }
unpauseRefreshUsers = true;
} else if (Intent.ACTION_USER_INFO_CHANGED.equals(intent.getAction())) {
forcePictureLoadForId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE,
@@ -457,6 +454,7 @@
.setSmallIcon(R.drawable.ic_person)
.setContentTitle(mContext.getString(R.string.guest_notification_title))
.setContentText(mContext.getString(R.string.guest_notification_text))
+ .setContentIntent(removeGuestPI)
.setShowWhen(false)
.addAction(R.drawable.ic_delete,
mContext.getString(R.string.guest_notification_remove_action),
@@ -475,6 +473,8 @@
.setSmallIcon(R.drawable.ic_person)
.setContentTitle(mContext.getString(R.string.user_logout_notification_title))
.setContentText(mContext.getString(R.string.user_logout_notification_text))
+ .setContentIntent(logoutPI)
+ .setOngoing(true)
.setShowWhen(false)
.addAction(R.drawable.ic_delete,
mContext.getString(R.string.user_logout_notification_action),
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index 7836411..95a8d39 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -127,6 +127,7 @@
private boolean mPendingStateChanged;
private boolean mPendingRecheckAll;
private long mCollapseTime;
+ private boolean mHovering = false;
public VolumeDialog(Context context, int windowType, VolumeDialogController controller,
ZenModeController zenModeController, Callback callback) {
@@ -165,6 +166,16 @@
mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive);
mDialog.setContentView(R.layout.volume_dialog);
mDialogView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog);
+ mDialogView.setOnHoverListener(new View.OnHoverListener() {
+ @Override
+ public boolean onHover(View v, MotionEvent event) {
+ int action = event.getActionMasked();
+ mHovering = (action == MotionEvent.ACTION_HOVER_ENTER)
+ || (action == MotionEvent.ACTION_HOVER_MOVE);
+ rescheduleTimeoutH();
+ return true;
+ }
+ });
mDialogContentView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog_content);
mExpandButton = (ImageButton) mDialogView.findViewById(R.id.volume_expand_button);
mExpandButton.setOnClickListener(mClickExpand);
@@ -456,6 +467,7 @@
private int computeTimeoutH() {
if (mAccessibility.mFeedbackEnabled) return 20000;
+ if (mHovering) return 16000;
if (mSafetyWarning != null) return 5000;
if (mExpanded || mExpandButtonAnimationRunning) return 5000;
if (mActiveStream == AudioManager.STREAM_MUSIC) return 1500;
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 6481ada..34aeb60 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -7848,8 +7848,12 @@
// If we get this far, the callback or timeout will schedule the
// next restore state, so we're done
} catch (Exception e) {
- Slog.e(TAG, "Unable to finalize restore of " + mCurrentPackage.packageName);
- executeNextState(UnifiedRestoreState.FINAL);
+ final String packageName = mCurrentPackage.packageName;
+ Slog.e(TAG, "Unable to finalize restore of " + packageName);
+ EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE,
+ packageName, e.toString());
+ keyValueAgentErrorCleanup();
+ executeNextState(UnifiedRestoreState.RUNNING_QUEUE);
}
}
diff --git a/services/core/java/com/android/server/AnyMotionDetector.java b/services/core/java/com/android/server/AnyMotionDetector.java
index 6390bcd..6a67316 100644
--- a/services/core/java/com/android/server/AnyMotionDetector.java
+++ b/services/core/java/com/android/server/AnyMotionDetector.java
@@ -16,9 +16,6 @@
package com.android.server;
-import android.app.AlarmManager;
-import android.content.BroadcastReceiver;
-import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
@@ -85,17 +82,12 @@
/** The accelerometer sampling interval. */
private static final int SAMPLING_INTERVAL_MILLIS = 40;
- private AlarmManager mAlarmManager;
private final Handler mHandler;
- private Intent mAlarmIntent;
private final Object mLock = new Object();
private Sensor mAccelSensor;
private SensorManager mSensorManager;
private PowerManager.WakeLock mWakeLock;
- /** The time when detection was last performed. */
- private long mDetectionStartTime;
-
/** The minimum number of samples required to detect AnyMotion. */
private int mNumSufficientSamples;
@@ -113,11 +105,11 @@
private DeviceIdleCallback mCallback = null;
- public AnyMotionDetector(AlarmManager am, PowerManager pm, Handler handler, SensorManager sm,
+ public AnyMotionDetector(PowerManager pm, Handler handler, SensorManager sm,
DeviceIdleCallback callback) {
if (DEBUG) Slog.d(TAG, "AnyMotionDetector instantiated.");
- mAlarmManager = am;
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
+ mWakeLock.setReferenceCounted(false);
mHandler = handler;
mSensorManager = sm;
mAccelSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
@@ -144,6 +136,22 @@
}
}
+ public void stop() {
+ if (mState == STATE_ACTIVE) {
+ mState = STATE_INACTIVE;
+ if (DEBUG) Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE.");
+ if (mMeasurementInProgress) {
+ mMeasurementInProgress = false;
+ mSensorManager.unregisterListener(mListener);
+ }
+ mHandler.removeCallbacks(mMeasurementTimeout);
+ mHandler.removeCallbacks(mSensorRestart);
+ mWakeLock.release();
+ mCurrentGravityVector = null;
+ mPreviousGravityVector = null;
+ }
+ }
+
private void startOrientationMeasurement() {
if (DEBUG) Slog.d(TAG, "startOrientationMeasurement: mMeasurementInProgress=" +
mMeasurementInProgress + ", (mAccelSensor != null)=" + (mAccelSensor != null));
@@ -153,7 +161,6 @@
SAMPLING_INTERVAL_MILLIS * 1000)) {
mWakeLock.acquire();
mMeasurementInProgress = true;
- mDetectionStartTime = SystemClock.elapsedRealtime();
mRunningStats.reset();
}
@@ -170,9 +177,7 @@
if (mMeasurementInProgress) {
mSensorManager.unregisterListener(mListener);
mHandler.removeCallbacks(mMeasurementTimeout);
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
+ mWakeLock.release();
long detectionEndTime = SystemClock.elapsedRealtime();
mMeasurementInProgress = false;
mPreviousGravityVector = mCurrentGravityVector;
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 921e71e..e19447d 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1597,7 +1597,7 @@
NetworkCapabilities.TRANSPORT_CELLULAR)) {
timeout = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.DATA_ACTIVITY_TIMEOUT_MOBILE,
- 5);
+ 10);
type = ConnectivityManager.TYPE_MOBILE;
} else if (networkAgent.networkCapabilities.hasTransport(
NetworkCapabilities.TRANSPORT_WIFI)) {
diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java
index e678bbc..80fd441 100644
--- a/services/core/java/com/android/server/DeviceIdleController.java
+++ b/services/core/java/com/android/server/DeviceIdleController.java
@@ -34,10 +34,15 @@
import android.hardware.TriggerEvent;
import android.hardware.TriggerEventListener;
import android.hardware.display.DisplayManager;
+import android.location.LocationRequest;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
import android.net.INetworkPolicyManager;
import android.net.Uri;
import android.os.BatteryStats;
import android.os.Binder;
+import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
@@ -107,6 +112,8 @@
private DisplayManager mDisplayManager;
private SensorManager mSensorManager;
private Sensor mSigMotionSensor;
+ private LocationManager mLocationManager;
+ private LocationRequest mLocationRequest;
private PendingIntent mSensingAlarmIntent;
private PendingIntent mAlarmIntent;
private Intent mIdleIntent;
@@ -117,6 +124,13 @@
private boolean mScreenOn;
private boolean mCharging;
private boolean mSigMotionActive;
+ private boolean mSensing;
+ private boolean mNotMoving;
+ private boolean mLocating;
+ private boolean mLocated;
+ private boolean mHaveGps;
+ private Location mLastGenericLocation;
+ private Location mLastGpsLocation;
/** Device is currently active. */
private static final int STATE_ACTIVE = 0;
@@ -126,16 +140,19 @@
private static final int STATE_IDLE_PENDING = 2;
/** Device is currently sensing motion. */
private static final int STATE_SENSING = 3;
+ /** Device is currently finding location (and may still be sensing). */
+ private static final int STATE_LOCATING = 4;
/** Device is in the idle state, trying to stay asleep as much as possible. */
- private static final int STATE_IDLE = 4;
+ private static final int STATE_IDLE = 5;
/** Device is in the idle state, but temporarily out of idle to do regular maintenance. */
- private static final int STATE_IDLE_MAINTENANCE = 5;
+ private static final int STATE_IDLE_MAINTENANCE = 6;
private static String stateToString(int state) {
switch (state) {
case STATE_ACTIVE: return "ACTIVE";
case STATE_INACTIVE: return "INACTIVE";
case STATE_IDLE_PENDING: return "IDLE_PENDING";
case STATE_SENSING: return "SENSING";
+ case STATE_LOCATING: return "LOCATING";
case STATE_IDLE: return "IDLE";
case STATE_IDLE_MAINTENANCE: return "IDLE_MAINTENANCE";
default: return Integer.toString(state);
@@ -258,6 +275,48 @@
}
};
+ private final LocationListener mGenericLocationListener = new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ synchronized (DeviceIdleController.this) {
+ receivedGenericLocationLocked(location);
+ }
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ }
+
+ @Override
+ public void onProviderEnabled(String provider) {
+ }
+
+ @Override
+ public void onProviderDisabled(String provider) {
+ }
+ };
+
+ private final LocationListener mGpsLocationListener = new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ synchronized (DeviceIdleController.this) {
+ receivedGpsLocationLocked(location);
+ }
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+ }
+
+ @Override
+ public void onProviderEnabled(String provider) {
+ }
+
+ @Override
+ public void onProviderDisabled(String provider) {
+ }
+ };
+
/**
* All times are in milliseconds. These constants are kept synchronized with the system
* global Settings. Any access to this class or its fields should be done while
@@ -267,6 +326,8 @@
// Key names stored in the settings value.
private static final String KEY_INACTIVE_TIMEOUT = "inactive_to";
private static final String KEY_SENSING_TIMEOUT = "sensing_to";
+ private static final String KEY_LOCATING_TIMEOUT = "locating_to";
+ private static final String KEY_LOCATION_ACCURACY = "location_accuracy";
private static final String KEY_MOTION_INACTIVE_TIMEOUT = "motion_inactive_to";
private static final String KEY_IDLE_AFTER_INACTIVE_TIMEOUT = "idle_after_inactive_to";
private static final String KEY_IDLE_PENDING_TIMEOUT = "idle_pending_to";
@@ -294,7 +355,8 @@
public long INACTIVE_TIMEOUT;
/**
- * If we don't receive a callback from AnyMotion in this amount of time, we will change from
+ * If we don't receive a callback from AnyMotion in this amount of time +
+ * {@link #LOCATING_TIMEOUT}, we will change from
* STATE_SENSING to STATE_INACTIVE, and any AnyMotion callbacks while not in STATE_SENSING
* will be ignored.
* @see Settings.Global#DEVICE_IDLE_CONSTANTS
@@ -303,6 +365,23 @@
public long SENSING_TIMEOUT;
/**
+ * This is how long we will wait to try to get a good location fix before going in to
+ * idle mode.
+ * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+ * @see #KEY_LOCATING_TIMEOUT
+ */
+ public long LOCATING_TIMEOUT;
+
+ /**
+ * The desired maximum accuracy (in meters) we consider the location to be good enough to go
+ * on to idle. We will be trying to get an accuracy fix at least this good or until
+ * {@link #LOCATING_TIMEOUT} expires.
+ * @see Settings.Global#DEVICE_IDLE_CONSTANTS
+ * @see #KEY_LOCATION_ACCURACY
+ */
+ public float LOCATION_ACCURACY;
+
+ /**
* This is the time, after seeing motion, that we wait after becoming inactive from
* that until we start looking for motion again.
* @see Settings.Global#DEVICE_IDLE_CONSTANTS
@@ -423,7 +502,10 @@
INACTIVE_TIMEOUT = mParser.getLong(KEY_INACTIVE_TIMEOUT,
!COMPRESS_TIME ? 30 * 60 * 1000L : 3 * 60 * 1000L);
SENSING_TIMEOUT = mParser.getLong(KEY_SENSING_TIMEOUT,
- !DEBUG ? 5 * 60 * 1000L : 60 * 1000L);
+ !DEBUG ? 4 * 60 * 1000L : 60 * 1000L);
+ LOCATING_TIMEOUT = mParser.getLong(KEY_LOCATING_TIMEOUT,
+ !DEBUG ? 30 * 1000L : 15 * 1000L);
+ LOCATION_ACCURACY = mParser.getFloat(KEY_LOCATION_ACCURACY, 20);
MOTION_INACTIVE_TIMEOUT = mParser.getLong(KEY_MOTION_INACTIVE_TIMEOUT,
!COMPRESS_TIME ? 10 * 60 * 1000L : 60 * 1000L);
IDLE_AFTER_INACTIVE_TIMEOUT = mParser.getLong(KEY_IDLE_AFTER_INACTIVE_TIMEOUT,
@@ -462,6 +544,14 @@
TimeUtils.formatDuration(SENSING_TIMEOUT, pw);
pw.println();
+ pw.print(" "); pw.print(KEY_LOCATING_TIMEOUT); pw.print("=");
+ TimeUtils.formatDuration(LOCATING_TIMEOUT, pw);
+ pw.println();
+
+ pw.print(" "); pw.print(KEY_LOCATION_ACCURACY); pw.print("=");
+ pw.print(LOCATION_ACCURACY); pw.print("m");
+ pw.println();
+
pw.print(" "); pw.print(KEY_MOTION_INACTIVE_TIMEOUT); pw.print("=");
TimeUtils.formatDuration(MOTION_INACTIVE_TIMEOUT, pw);
pw.println();
@@ -515,17 +605,27 @@
@Override
public void onAnyMotionResult(int result) {
if (DEBUG) Slog.d(TAG, "onAnyMotionResult(" + result + ")");
- if (mState == STATE_SENSING) {
- if (result == AnyMotionDetector.RESULT_STATIONARY) {
- if (DEBUG) Slog.d(TAG, "RESULT_STATIONARY received.");
+ if (result == AnyMotionDetector.RESULT_MOVED) {
+ if (DEBUG) Slog.d(TAG, "RESULT_MOVED received.");
+ synchronized (this) {
+ handleMotionDetectedLocked(mConstants.INACTIVE_TIMEOUT, "sense_motion");
+ }
+ } else if (result == AnyMotionDetector.RESULT_STATIONARY) {
+ if (DEBUG) Slog.d(TAG, "RESULT_STATIONARY received.");
+ if (mState == STATE_SENSING) {
+ // If we are currently sensing, it is time to move to locating.
synchronized (this) {
+ mNotMoving = true;
stepIdleStateLocked();
}
- } else if (result == AnyMotionDetector.RESULT_MOVED) {
- if (DEBUG) Slog.d(TAG, "RESULT_MOVED received.");
+ } else if (mState == STATE_LOCATING) {
+ // If we are currently locating, note that we are not moving and step
+ // if we have located the position.
synchronized (this) {
- EventLogTags.writeDeviceIdle(mState, "sense_moved");
- enterInactiveStateLocked();
+ mNotMoving = true;
+ if (mLocated) {
+ stepIdleStateLocked();
+ }
}
}
}
@@ -778,13 +878,19 @@
mBatteryStats = BatteryStatsService.getService();
mLocalPowerManager = getLocalService(PowerManagerInternal.class);
mNetworkPolicyManager = INetworkPolicyManager.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
+ ServiceManager.getService(Context.NETWORK_POLICY_SERVICE));
mDisplayManager = (DisplayManager) getContext().getSystemService(
Context.DISPLAY_SERVICE);
mSensorManager = (SensorManager) getContext().getSystemService(Context.SENSOR_SERVICE);
mSigMotionSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
+ mLocationManager = (LocationManager) getContext().getSystemService(
+ Context.LOCATION_SERVICE);
+ mLocationRequest = new LocationRequest()
+ .setQuality(LocationRequest.ACCURACY_FINE)
+ .setInterval(0)
+ .setFastestInterval(0)
+ .setNumUpdates(1);
mAnyMotionDetector = new AnyMotionDetector(
- mAlarmManager,
(PowerManager) getContext().getSystemService(Context.POWER_SERVICE),
mHandler, mSensorManager, this);
@@ -1049,7 +1155,7 @@
// We consider any situation where the display is showing something to be it on,
// because if there is anything shown we are going to be updating it at some
// frequency so can't be allowed to go into deep sleeps.
- boolean screenOn = mCurDisplay.getState() != Display.STATE_OFF;;
+ boolean screenOn = mCurDisplay.getState() == Display.STATE_ON;
if (DEBUG) Slog.d(TAG, "updateDisplayLocked: screenOn=" + screenOn);
if (!screenOn && mScreenOn) {
mScreenOn = false;
@@ -1092,10 +1198,7 @@
scheduleReportActiveLocked(activeReason, activeUid);
mState = STATE_ACTIVE;
mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
- mNextIdlePendingDelay = 0;
- mNextIdleDelay = 0;
- cancelAlarmLocked();
- stopMonitoringSignificantMotion();
+ resetIdleManagementLocked();
}
}
@@ -1106,20 +1209,20 @@
// waiting to see if we will ultimately go idle.
mState = STATE_INACTIVE;
if (DEBUG) Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE");
- mNextIdlePendingDelay = 0;
- mNextIdleDelay = 0;
+ resetIdleManagementLocked();
scheduleAlarmLocked(mInactiveTimeout, false);
EventLogTags.writeDeviceIdle(mState, "no activity");
}
}
- /**
- * This is called when we've failed to receive a callback from AnyMotionDetector
- * within the DEFAULT_SENSING_TIMEOUT, to return to STATE_INACTIVE.
- */
- void enterInactiveStateLocked() {
- mInactiveTimeout = mConstants.INACTIVE_TIMEOUT;
- becomeInactiveIfAppropriateLocked();
+ void resetIdleManagementLocked() {
+ mNextIdlePendingDelay = 0;
+ mNextIdleDelay = 0;
+ cancelAlarmLocked();
+ cancelSensingAlarmLocked();
+ cancelLocatingLocked();
+ stopMonitoringSignificantMotion();
+ mAnyMotionDetector.stop();
}
void exitForceIdleLocked() {
@@ -1160,11 +1263,37 @@
case STATE_IDLE_PENDING:
mState = STATE_SENSING;
if (DEBUG) Slog.d(TAG, "Moved from STATE_IDLE_PENDING to STATE_SENSING.");
+ EventLogTags.writeDeviceIdle(mState, "step");
scheduleSensingAlarmLocked(mConstants.SENSING_TIMEOUT);
+ cancelSensingAlarmLocked();
+ cancelLocatingLocked();
mAnyMotionDetector.checkForAnyMotion();
+ mNotMoving = false;
+ mLocated = false;
+ mLastGenericLocation = null;
+ mLastGpsLocation = null;
break;
case STATE_SENSING:
+ mState = STATE_LOCATING;
+ if (DEBUG) Slog.d(TAG, "Moved from STATE_SENSING to STATE_LOCATING.");
+ EventLogTags.writeDeviceIdle(mState, "step");
cancelSensingAlarmLocked();
+ scheduleSensingAlarmLocked(mConstants.LOCATING_TIMEOUT);
+ mLocating = true;
+ mLocationManager.requestLocationUpdates(mLocationRequest, mGenericLocationListener,
+ mHandler.getLooper());
+ if (mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) {
+ mHaveGps = true;
+ mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5,
+ mGpsLocationListener, mHandler.getLooper());
+ } else {
+ mHaveGps = false;
+ }
+ break;
+ case STATE_LOCATING:
+ cancelSensingAlarmLocked();
+ cancelLocatingLocked();
+ mAnyMotionDetector.stop();
case STATE_IDLE_MAINTENANCE:
scheduleAlarmLocked(mNextIdleDelay, true);
if (DEBUG) Slog.d(TAG, "Moved to STATE_IDLE. Next alarm in " + mNextIdleDelay +
@@ -1173,6 +1302,7 @@
if (DEBUG) Slog.d(TAG, "Setting mNextIdleDelay = " + mNextIdleDelay);
mNextIdleDelay = Math.min(mNextIdleDelay, mConstants.MAX_IDLE_TIMEOUT);
mState = STATE_IDLE;
+ EventLogTags.writeDeviceIdle(mState, "step");
mHandler.sendEmptyMessage(MSG_REPORT_IDLE_ON);
break;
case STATE_IDLE:
@@ -1193,18 +1323,54 @@
if (DEBUG) Slog.d(TAG, "significantMotionLocked()");
// When the sensor goes off, its trigger is automatically removed.
mSigMotionActive = false;
+ handleMotionDetectedLocked(mConstants.MOTION_INACTIVE_TIMEOUT, "motion");
+ }
+
+ void handleMotionDetectedLocked(long timeout, String type) {
// The device is not yet active, so we want to go back to the pending idle
// state to wait again for no motion. Note that we only monitor for significant
// motion after moving out of the inactive state, so no need to worry about that.
if (mState != STATE_ACTIVE) {
- scheduleReportActiveLocked("motion", Process.myUid());
+ scheduleReportActiveLocked(type, Process.myUid());
mState = STATE_ACTIVE;
- mInactiveTimeout = mConstants.MOTION_INACTIVE_TIMEOUT;
- EventLogTags.writeDeviceIdle(mState, "motion");
+ mInactiveTimeout = timeout;
+ EventLogTags.writeDeviceIdle(mState, type);
becomeInactiveIfAppropriateLocked();
}
}
+ void receivedGenericLocationLocked(Location location) {
+ if (mState != STATE_LOCATING) {
+ cancelLocatingLocked();
+ return;
+ }
+ if (DEBUG) Slog.d(TAG, "Generic location: " + location);
+ mLastGenericLocation = new Location(location);
+ if (location.getAccuracy() > mConstants.LOCATION_ACCURACY && mHaveGps) {
+ return;
+ }
+ mLocated = true;
+ if (mNotMoving) {
+ stepIdleStateLocked();
+ }
+ }
+
+ void receivedGpsLocationLocked(Location location) {
+ if (mState != STATE_LOCATING) {
+ cancelLocatingLocked();
+ return;
+ }
+ if (DEBUG) Slog.d(TAG, "GPS location: " + location);
+ mLastGpsLocation = new Location(location);
+ if (location.getAccuracy() > mConstants.LOCATION_ACCURACY) {
+ return;
+ }
+ mLocated = true;
+ if (mNotMoving) {
+ stepIdleStateLocked();
+ }
+ }
+
void startMonitoringSignificantMotion() {
if (DEBUG) Slog.d(TAG, "startMonitoringSignificantMotion()");
if (mSigMotionSensor != null && !mSigMotionActive) {
@@ -1229,8 +1395,19 @@
}
void cancelSensingAlarmLocked() {
- if (DEBUG) Slog.d(TAG, "cancelSensingAlarmLocked()");
- mAlarmManager.cancel(mSensingAlarmIntent);
+ if (mSensing) {
+ if (DEBUG) Slog.d(TAG, "cancelSensingAlarmLocked()");
+ mAlarmManager.cancel(mSensingAlarmIntent);
+ mSensing = false;
+ }
+ }
+
+ void cancelLocatingLocked() {
+ if (mLocating) {
+ mLocationManager.removeUpdates(mGenericLocationListener);
+ mLocationManager.removeUpdates(mGpsLocationListener);
+ mLocating = false;
+ }
}
void scheduleAlarmLocked(long delay, boolean idleUntil) {
@@ -1253,10 +1430,12 @@
}
void scheduleSensingAlarmLocked(long delay) {
- if (DEBUG) Slog.d(TAG, "scheduleSensingAlarmLocked(" + delay + ")");
- mNextAlarmTime = SystemClock.elapsedRealtime() + delay;
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- mNextAlarmTime, mSensingAlarmIntent);
+ if (DEBUG) Slog.d(TAG, "scheduleSensingAlarmLocked(" + delay + ")");
+ cancelSensingAlarmLocked();
+ mNextAlarmTime = SystemClock.elapsedRealtime() + delay;
+ mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
+ mNextAlarmTime, mSensingAlarmIntent);
+ mSensing = true;
}
private static int[] buildAppIdArray(ArrayMap<String, Integer> systemApps,
@@ -1721,6 +1900,16 @@
pw.print(" mScreenOn="); pw.println(mScreenOn);
pw.print(" mCharging="); pw.println(mCharging);
pw.print(" mSigMotionActive="); pw.println(mSigMotionActive);
+ pw.print(" mSensing="); pw.print(mSensing); pw.print(" mNotMoving=");
+ pw.println(mNotMoving);
+ pw.print(" mLocating="); pw.print(mLocating); pw.print(" mHaveGps=");
+ pw.print(mHaveGps); pw.print(" mLocated="); pw.println(mLocated);
+ if (mLastGenericLocation != null) {
+ pw.print(" mLastGenericLocation="); pw.println(mLastGenericLocation);
+ }
+ if (mLastGpsLocation != null) {
+ pw.print(" mLastGpsLocation="); pw.println(mLastGpsLocation);
+ }
pw.print(" mState="); pw.println(stateToString(mState));
pw.print(" mInactiveTimeout="); TimeUtils.formatDuration(mInactiveTimeout, pw);
pw.println();
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index d54930f..f3ea1c4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -19,6 +19,7 @@
import static android.Manifest.permission.INTERACT_ACROSS_USERS;
import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
+import static android.app.ActivityManager.DOCKED_STACK_ID;
import static android.app.ActivityManager.HOME_STACK_ID;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
@@ -29,6 +30,7 @@
import static com.android.internal.util.XmlUtils.writeLongAttribute;
import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST;
import static com.android.server.am.ActivityManagerDebugConfig.*;
+import static com.android.server.am.ActivityStackSupervisor.FORCE_FOCUS;
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
@@ -8653,7 +8655,11 @@
Slog.e(TAG, "setActivityBounds: No TaskRecord for the ActivityRecord r=" + r);
return;
}
- mStackSupervisor.resizeTaskLocked(task, bounds);
+ if (task.stack != null && task.stack.mStackId == DOCKED_STACK_ID) {
+ mStackSupervisor.resizeStackLocked(task.stack.mStackId, bounds);
+ } else {
+ mStackSupervisor.resizeTaskLocked(task, bounds);
+ }
}
} finally {
Binder.restoreCallingIdentity(ident);
@@ -9010,7 +9016,7 @@
public void moveActivityToStack(IBinder token, int stackId) throws RemoteException {
if (stackId == HOME_STACK_ID) {
throw new IllegalArgumentException(
- "moveTaskToStack: Attempt to move token " + token + " to home stack");
+ "moveActivityToStack: Attempt to move token " + token + " to home stack");
}
synchronized (this) {
long ident = Binder.clearCallingIdentity();
@@ -9022,13 +9028,7 @@
}
if (DEBUG_STACK) Slog.d(TAG_STACK, "moveActivityToStack: moving r=" + r
+ " to stackId=" + stackId);
- mStackSupervisor.moveTaskToStackLocked(r.task.taskId, stackId, ON_TOP);
- if (mFocusedActivity != r) {
- setFocusedActivityLocked(r, "moveActivityToStack");
- } else {
- mStackSupervisor.setFocusedStack(r, "moveActivityToStack");
- }
- mStackSupervisor.resumeTopActivitiesLocked(r.task.stack, null, null);
+ mStackSupervisor.moveTaskToStackLocked(r.task.taskId, stackId, ON_TOP, FORCE_FOCUS);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -9048,7 +9048,7 @@
try {
if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
+ " to stackId=" + stackId + " toTop=" + toTop);
- mStackSupervisor.moveTaskToStackLocked(taskId, stackId, toTop);
+ mStackSupervisor.moveTaskToStackLocked(taskId, stackId, toTop, !FORCE_FOCUS);
} finally {
Binder.restoreCallingIdentity(ident);
}
@@ -9074,9 +9074,9 @@
enforceCallingPermission(android.Manifest.permission.MANAGE_ACTIVITY_STACKS,
"positionTaskInStack()");
if (stackId == HOME_STACK_ID) {
- Slog.e(TAG, "positionTaskInStack: Attempt to change the position of task "
- + taskId + " in/to home stack",
- new RuntimeException("here").fillInStackTrace());
+ throw new IllegalArgumentException(
+ "positionTaskInStack: Attempt to change the position of task "
+ + taskId + " in/to home stack");
}
synchronized (this) {
long ident = Binder.clearCallingIdentity();
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 8eea00f..d54c16f 100755
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -1278,7 +1278,7 @@
int event;
while (((event = in.next()) != XmlPullParser.END_DOCUMENT) &&
- (event != XmlPullParser.END_TAG || in.getDepth() < outerDepth)) {
+ (event != XmlPullParser.END_TAG || in.getDepth() >= outerDepth)) {
if (event == XmlPullParser.START_TAG) {
final String name = in.getName();
if (TaskPersister.DEBUG)
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 18a0a36..356565f 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import static android.app.ActivityManager.DOCKED_STACK_ID;
import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.HOME_STACK_ID;
@@ -229,6 +230,8 @@
// Whether or not this stack covers the entire screen; by default stacks are fullscreen
boolean mFullscreen = true;
+ // Current bounds of the stack or null if fullscreen.
+ Rect mBounds = null;
long mLaunchStartTime = 0;
long mFullyDrawnStartTime = 0;
@@ -1227,8 +1230,42 @@
return null;
}
- // Checks if any of the stacks above this one has a fullscreen activity behind it.
- // If so, this stack is hidden, otherwise it is visible.
+ /** Returns true if the stack contains a fullscreen task. */
+ private boolean hasFullscreenTask() {
+ for (int i = mTaskHistory.size() - 1; i >= 0; --i) {
+ final TaskRecord task = mTaskHistory.get(i);
+ if (task.mFullscreen) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /** Return true if this stack is hidden by the presence of a docked stack. */
+ private boolean isHiddenByDockedStack() {
+ final ActivityStack dockedStack = mStackSupervisor.getStack(DOCKED_STACK_ID);
+ if (dockedStack != null) {
+ final int dockedStackIndex = mStacks.indexOf(dockedStack);
+ final int stackIndex = mStacks.indexOf(this);
+ if (dockedStackIndex > stackIndex) {
+ // Fullscreen stacks or stacks with fullscreen task below the docked stack are not
+ // visible. We do this so we don't have the 2 stacks and their tasks overlap.
+ if (mFullscreen) {
+ return true;
+ }
+
+ // We need to also check the tasks in the stack because they can be fullscreen
+ // even though their stack isn't due to their root activity not been resizeable
+ // (i.e. doesn't support multi-window mode).
+ if (hasFullscreenTask()) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ /** Returns true if the stack is considered visible. */
private boolean isStackVisibleLocked() {
if (!isAttached()) {
return false;
@@ -1238,12 +1275,15 @@
return true;
}
- // Any stack that isn't the front stack is not visible, except for the case of the home
- // stack behind the main application stack since we can have dialog activities on the
- // main application stack that need the home stack to display behind them.
- // TODO(multi-window): Also need to add exception for side-by-side stacks.
- final boolean homeStack = mStackId == HOME_STACK_ID;
- if (!homeStack) {
+ final int stackIndex = mStacks.indexOf(this);
+
+ if (stackIndex == mStacks.size() - 1) {
+ Slog.wtf(TAG,
+ "Stack=" + this + " isn't front stack but is at the top of the stack list");
+ return false;
+ }
+
+ if (isHiddenByDockedStack()) {
return false;
}
@@ -1252,13 +1292,24 @@
* fullscreen activity, or a translucent activity that requested the
* wallpaper to be shown behind it.
*/
- for (int i = mStacks.indexOf(this) + 1; i < mStacks.size(); i++) {
+ for (int i = stackIndex + 1; i < mStacks.size(); i++) {
final ActivityStack stack = mStacks.get(i);
- if (stack.mStackId != FULLSCREEN_WORKSPACE_STACK_ID) {
+ final ArrayList<TaskRecord> tasks = stack.getAllTasks();
+
+ if (!stack.mFullscreen && !stack.hasFullscreenTask()) {
+ continue;
+ }
+
+ if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID
+ || stack.mStackId == HOME_STACK_ID) {
+ // The freeform and home stacks can't have any other stack visible behind them
+ // when they are fullscreen since they act as base/cut-off points for visibility.
+ // NOTE: we don't cut-off at the FULLSCREEN_WORKSPACE_STACK_ID because the home
+ // stack sometimes needs to be visible behind it when it is displaying a dialog
+ // activity. We let it fall through to the logic below to determine visibility.
return false;
}
- final ArrayList<TaskRecord> tasks = stack.getAllTasks();
for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = tasks.get(taskNdx);
// task above isn't fullscreen, so, we assume we're still visible.
@@ -2680,9 +2731,10 @@
ActivityRecord next = topRunningActivityLocked(null);
final String myReason = reason + " adjustFocus";
if (next != r) {
- if (next != null && mStackId == FREEFORM_WORKSPACE_STACK_ID) {
- // For freeform stack we always keep the focus within the stack as long as
- // there is a running activity in the stack that we can adjust focus to.
+ if (next != null && (mStackId == FREEFORM_WORKSPACE_STACK_ID
+ || mStackId == DOCKED_STACK_ID)) {
+ // For freeform and docked stacks we always keep the focus within the stack as
+ // long as there is a running activity in the stack that we can adjust focus to.
mService.setFocusedActivityLocked(next, myReason);
return;
} else {
@@ -4321,7 +4373,10 @@
printed |= ActivityStackSupervisor.dumpHistoryList(fd, pw,
mTaskHistory.get(taskNdx).mActivities, " ", "Hist", true, !dumpAll,
dumpClient, dumpPackage, needSep, header,
- " Task id #" + task.taskId);
+ " Task id #" + task.taskId + "\n" +
+ " mFullscreen=" + task.mFullscreen + "\n" +
+ " mBounds=" + task.mBounds + "\n" +
+ " mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds);
if (printed) {
header = null;
}
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 464a1e4..12b848b 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -184,6 +184,9 @@
// (e.g. stack) is due to it moving to another container.
static final boolean MOVING = true;
+ // Force the focus to change to the stack we are moving a task to..
+ static final boolean FORCE_FOCUS = true;
+
// Activity actions an app cannot start if it uses a permission which is not granted.
private static final ArrayMap<String, String> ACTION_TO_RUNTIME_PERMISSION =
new ArrayMap<>();
@@ -328,6 +331,9 @@
/** Used to keep resumeTopActivityLocked() from being entered recursively */
boolean inResumeTopActivity;
+ // temp. rect used during resize calculation so we don't need to create a new object each time.
+ private final Rect tempRect = new Rect();
+
/**
* Description of a request to start a new activity, which has been held
* due to app switches being disabled.
@@ -562,7 +568,7 @@
return task;
}
- if (!restoreRecentTaskLocked(task)) {
+ if (!restoreRecentTaskLocked(task, INVALID_STACK_ID)) {
if (DEBUG_RECENTS) Slog.w(TAG_RECENTS,
"Couldn't restore task id=" + id + " found in recents");
return null;
@@ -2908,16 +2914,13 @@
return;
}
- final ActivityRecord r = stack.topRunningActivityLocked(null);
- if (r != null && !r.task.mResizeable) {
- Slog.w(TAG, "resizeStack: top task " + r.task + " not resizeable.");
- return;
- }
+ ActivityRecord r = stack.topRunningActivityLocked(null);
+ final boolean resizeTasks = r != null && r.task.mResizeable;
final IntArray changedTaskIds = new IntArray(stack.numTasks());
final List<Configuration> newTaskConfigs = new ArrayList<>(stack.numTasks());
- stack.mFullscreen =
- mWindowManager.resizeStack(stackId, bounds, changedTaskIds, newTaskConfigs);
+ stack.mFullscreen = mWindowManager.resizeStack(
+ stackId, bounds, resizeTasks, changedTaskIds, newTaskConfigs);
for (int i = changedTaskIds.size() - 1; i >= 0; i--) {
final TaskRecord task = anyTaskForIdLocked(changedTaskIds.get(i), false);
if (task == null) {
@@ -2927,6 +2930,55 @@
task.updateOverrideConfiguration(newTaskConfigs.get(i), bounds);
}
+ if (stack.mStackId == DOCKED_STACK_ID) {
+ // Dock stack funness...Yay!
+ if (stack.mFullscreen) {
+ // The dock stack went fullscreen which is kinda like dismissing it.
+ // In this case we make all other static stacks fullscreen and move all
+ // docked stack tasks to the fullscreen stack.
+ for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
+ if (i != DOCKED_STACK_ID) {
+ resizeStackLocked(i, null);
+ }
+ }
+
+ final ArrayList<TaskRecord> tasks = stack.getAllTasks();
+ final int count = tasks.size();
+ for (int i = 0; i < count; i++) {
+ moveTaskToStackLocked(tasks.get(i).taskId,
+ FULLSCREEN_WORKSPACE_STACK_ID, ON_TOP, FORCE_FOCUS);
+ }
+
+ // stack shouldn't contain anymore activities, so nothing to resume.
+ r = null;
+ } else {
+ // Docked stacks occupy a dedicated region on screen so the size of all other
+ // static stacks need to be adjusted so they don't overlap with the docked stack.
+ final int leftChange = stack.mBounds.left - bounds.left;
+ final int rightChange = stack.mBounds.right - bounds.right;
+ final int topChange = stack.mBounds.top - bounds.top;
+ final int bottomChange = stack.mBounds.bottom - bounds.bottom;
+
+ for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
+ if (i != DOCKED_STACK_ID) {
+ ActivityStack otherStack = getStack(i);
+ if (otherStack != null) {
+ tempRect.set(otherStack.mBounds);
+ // We adjust the opposing sides of the other stacks to
+ // the side in the dock stack that changed.
+ tempRect.left -= rightChange;
+ tempRect.right -= leftChange;
+ tempRect.top -= bottomChange;
+ tempRect.bottom -= topChange;
+ resizeStackLocked(i, tempRect);
+ }
+ }
+ }
+
+ }
+ }
+ stack.mBounds = stack.mFullscreen ? null : new Rect(bounds);
+
if (r != null) {
final boolean updated = stack.ensureActivityConfigurationLocked(r, 0);
// And we need to make sure at this point that all other activities
@@ -2956,7 +3008,7 @@
task.mBounds = task.mLastNonFullscreenBounds = new Rect(bounds);
if (task.stack != null && task.stack.mStackId != FREEFORM_WORKSPACE_STACK_ID) {
// re-restore the task so it can have the proper stack association.
- restoreRecentTaskLocked(task);
+ restoreRecentTaskLocked(task, FREEFORM_WORKSPACE_STACK_ID);
}
return;
}
@@ -2968,7 +3020,8 @@
final boolean wasFrontStack = isFrontStack(task.stack);
if (bounds == null && stackId != FULLSCREEN_WORKSPACE_STACK_ID) {
stackId = FULLSCREEN_WORKSPACE_STACK_ID;
- } else if (bounds != null && task.stack.mStackId != FREEFORM_WORKSPACE_STACK_ID) {
+ } else if (bounds != null
+ && stackId != FREEFORM_WORKSPACE_STACK_ID && stackId != DOCKED_STACK_ID) {
stackId = FREEFORM_WORKSPACE_STACK_ID;
}
if (stackId != task.stack.mStackId) {
@@ -3021,9 +3074,18 @@
return mNextFreeStackId;
}
- private boolean restoreRecentTaskLocked(TaskRecord task) {
- final int stackId =
- mLeanbackOnlyDevice ? mHomeStack.mStackId : task.getLaunchStackId(mFocusedStack);
+ /**
+ * Restores a recent task to a stack
+ * @param task The recent task to be restored.
+ * @param stackId The stack to restore the task to (default launch stack will be used
+ * if stackId is invalid).
+ * @return true if the task has been restored successfully.
+ */
+ private boolean restoreRecentTaskLocked(TaskRecord task, int stackId) {
+ if (stackId == INVALID_STACK_ID) {
+ stackId = mLeanbackOnlyDevice ?
+ mHomeStack.mStackId : task.getLaunchStackId(mFocusedStack);
+ }
if (task.stack != null) {
// Task has already been restored once. See if we need to do anything more
if (task.stack.mStackId == stackId) {
@@ -3069,8 +3131,7 @@
*/
private ActivityStack moveTaskToStackUncheckedLocked(
TaskRecord task, int stackId, boolean toTop, String reason) {
- final ActivityStack stack =
- getStack(stackId, CREATE_IF_NEEDED, toTop);
+ final ActivityStack stack = getStack(stackId, CREATE_IF_NEEDED, toTop);
mWindowManager.moveTaskToStack(task.taskId, stack.mStackId, toTop);
if (task.stack != null) {
task.stack.removeTask(task, reason, MOVING);
@@ -3079,26 +3140,39 @@
return stack;
}
- void moveTaskToStackLocked(int taskId, int stackId, boolean toTop) {
+ void moveTaskToStackLocked(int taskId, int stackId, boolean toTop, boolean forceFocus) {
final TaskRecord task = anyTaskForIdLocked(taskId);
if (task == null) {
Slog.w(TAG, "moveTaskToStack: no task for id=" + taskId);
return;
}
- ActivityStack stack =
- moveTaskToStackUncheckedLocked(task, stackId, toTop, "moveTaskToStack");
+ final String reason = "moveTaskToStack";
+ final ActivityRecord top = task.topRunningActivityLocked(null);
+ final boolean adjustFocus = forceFocus || mService.mFocusedActivity == top;
+ final ActivityStack stack =
+ moveTaskToStackUncheckedLocked(task, stackId, toTop, reason);
// Make sure the task has the appropriate bounds/size for the stack it is in.
if (stackId == FULLSCREEN_WORKSPACE_STACK_ID && task.mBounds != null) {
- resizeTaskLocked(task, null);
+ resizeTaskLocked(task, stack.mBounds);
} else if (stackId == FREEFORM_WORKSPACE_STACK_ID
&& task.mBounds == null && task.mLastNonFullscreenBounds != null) {
resizeTaskLocked(task, task.mLastNonFullscreenBounds);
+ } else if (stackId == DOCKED_STACK_ID) {
+ resizeTaskLocked(task, stack.mBounds);
+ }
+
+ if (top != null && adjustFocus) {
+ if (mService.mFocusedActivity != top) {
+ mService.setFocusedActivityLocked(top, reason);
+ } else {
+ setFocusedStack(top, reason);
+ }
}
// The task might have already been running and its visibility needs to be synchronized with
// the visibility of the stack / windows.
- stack.ensureActivitiesVisibleLocked(null, 0);
+ ensureActivitiesVisibleLocked(null, 0);
resumeTopActivitiesLocked();
}
@@ -3659,6 +3733,10 @@
stackHeader.append(" Stack #");
stackHeader.append(stack.mStackId);
stackHeader.append(":");
+ stackHeader.append("\n");
+ stackHeader.append(" mFullscreen=" + stack.mFullscreen);
+ stackHeader.append("\n");
+ stackHeader.append(" mBounds=" + stack.mBounds);
printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
needSep, stackHeader.toString());
printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false,
@@ -4313,7 +4391,9 @@
mStack.mStacks = activityDisplay.mStacks;
activityDisplay.attachActivities(mStack, onTop);
- mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId, onTop);
+ mStack.mBounds =
+ mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId, onTop);
+ mStack.mFullscreen = mStack.mBounds == null;
}
@Override
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index dd57f80..ed935a1 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -16,6 +16,7 @@
package com.android.server.am;
+import static android.app.ActivityManager.DOCKED_STACK_ID;
import static android.app.ActivityManager.FREEFORM_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.HOME_STACK_ID;
@@ -1102,7 +1103,7 @@
int event;
while (((event = in.next()) != XmlPullParser.END_DOCUMENT) &&
- (event != XmlPullParser.END_TAG || in.getDepth() < outerDepth)) {
+ (event != XmlPullParser.END_TAG || in.getDepth() >= outerDepth)) {
if (event == XmlPullParser.START_TAG) {
final String name = in.getName();
if (TaskPersister.DEBUG) Slog.d(TaskPersister.TAG, "TaskRecord: START_TAG name=" +
@@ -1172,12 +1173,15 @@
// is necessarily fullscreen.
mFullscreen = Configuration.EMPTY.equals(mOverrideConfig);
if (mFullscreen) {
- if (mBounds != null) {
+ if (mBounds != null && stack.mStackId != DOCKED_STACK_ID) {
mLastNonFullscreenBounds = mBounds;
}
mBounds = null;
} else {
- mBounds = mLastNonFullscreenBounds = new Rect(bounds);
+ mBounds = new Rect(bounds);
+ if (stack.mStackId != DOCKED_STACK_ID) {
+ mLastNonFullscreenBounds = mBounds;
+ }
}
return !mOverrideConfig.equals(oldConfig);
}
@@ -1207,6 +1211,8 @@
|| stack.mStackId == HOME_STACK_ID
|| stack.mStackId == FULLSCREEN_WORKSPACE_STACK_ID) {
return null;
+ } else if (stack.mStackId == DOCKED_STACK_ID) {
+ return stack.mBounds;
}
return mLastNonFullscreenBounds;
}
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 17607ff..befa311 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -54,6 +54,7 @@
import android.view.Display;
import static android.Manifest.permission.MANAGE_FINGERPRINT;
+import static android.Manifest.permission.RESET_FINGERPRINT_LOCKOUT;
import static android.Manifest.permission.USE_FINGERPRINT;
import java.io.File;
@@ -255,6 +256,9 @@
Slog.v(TAG, "Reset fingerprint lockout");
}
mFailedAttempts = 0;
+ // If we're asked to reset failed attempts externally (i.e. from Keyguard), the runnable
+ // may still be in the queue; remove it.
+ mHandler.removeCallbacks(mLockoutReset);
}
private boolean handleFailedAttempt(ClientMonitor clientMonitor) {
@@ -878,6 +882,12 @@
Binder.restoreCallingIdentity(ident);
}
}
+ @Override // Binder call
+ public void resetTimeout(byte [] token) {
+ checkPermission(RESET_FINGERPRINT_LOCKOUT);
+ // TODO: confirm security token when we move timeout management into the HAL layer.
+ mLockoutReset.run();
+ }
}
private void dumpInternal(PrintWriter pw) {
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
index d274412..49dc8e4 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java
@@ -19,6 +19,7 @@
import android.content.Context;
import android.hardware.fingerprint.Fingerprint;
import android.os.Vibrator;
+import android.text.TextUtils;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -64,6 +65,10 @@
}
public void renameFingerprintForUser(Context ctx, int fingerId, int userId, CharSequence name) {
+ if (TextUtils.isEmpty(name)) {
+ // Don't do the rename if it's empty
+ return;
+ }
getStateForUser(ctx, userId).renameFingerprint(fingerId, name);
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e8ec8b9..47729f9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2080,24 +2080,24 @@
// For security and version matching reason, only consider
// overlay packages if they reside in VENDOR_OVERLAY_DIR.
File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
- scanDirLI(vendorOverlayDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(vendorOverlayDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags | SCAN_TRUSTED_OVERLAY, 0);
// Find base frameworks (resource packages without code).
- scanDirLI(frameworkDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(frameworkDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED,
scanFlags | SCAN_NO_DEX, 0);
// Collected privileged system packages.
final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app");
- scanDirLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(privilegedAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
| PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0);
// Collect ordinary system packages.
final File systemAppDir = new File(Environment.getRootDirectory(), "app");
- scanDirLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(systemAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
// Collect all vendor packages.
@@ -2107,12 +2107,12 @@
} catch (IOException e) {
// failed to look up canonical path, continue with original one
}
- scanDirLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(vendorAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
// Collect all OEM packages.
final File oemAppDir = new File(Environment.getOemDirectory(), "app");
- scanDirLI(oemAppDir, PackageParser.PARSE_IS_SYSTEM
+ scanDirTracedLI(oemAppDir, PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0);
if (DEBUG_UPGRADE) Log.v(TAG, "Running installd update commands");
@@ -2188,9 +2188,9 @@
if (!mOnlyCore) {
EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
SystemClock.uptimeMillis());
- scanDirLI(mAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0);
+ scanDirTracedLI(mAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0);
- scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
+ scanDirTracedLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,
scanFlags | SCAN_REQUIRE_KNOWN, 0);
/**
@@ -5619,6 +5619,15 @@
return true;
}
+ private void scanDirTracedLI(File dir, int parseFlags, int scanFlags, long currentTime) {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "scanDir");
+ try {
+ scanDirLI(dir, parseFlags, scanFlags, currentTime);
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ }
+
private void scanDirLI(File dir, int parseFlags, int scanFlags, long currentTime) {
final File[] files = dir.listFiles();
if (ArrayUtils.isEmpty(files)) {
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 2a12aac..b9e8851 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -579,14 +579,8 @@
private void clearUserHasAuthenticated(int userId) {
if (userId == UserHandle.USER_ALL) {
mUserHasAuthenticated.clear();
- synchronized (mUserHasAuthenticatedSinceBoot) {
- mUserHasAuthenticatedSinceBoot.clear();
- }
} else {
mUserHasAuthenticated.put(userId, false);
- synchronized (mUserHasAuthenticatedSinceBoot) {
- mUserHasAuthenticatedSinceBoot.put(userId, false);
- }
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 2b26b42..99e9fe6 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -173,7 +173,7 @@
void updateDisplayInfo() {
mDisplay.getDisplayInfo(mDisplayInfo);
for (int i = mStacks.size() - 1; i >= 0; --i) {
- mStacks.get(i).updateDisplayInfo();
+ mStacks.get(i).updateDisplayInfo(null);
}
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 1eddb04..554af28 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -41,6 +41,13 @@
* when no window animation is driving it. */
private static final int DEFAULT_DIM_DURATION = 200;
+ // The amount we divide the height/width of the bounds we are trying to fit the task within
+ // when using the method {@link #fitWithinBounds}.
+ // We always want the task to to be visible in the bounds without affecting its size when
+ // fitting. To make sure this is the case, we don't adjust the task left or top side pass
+ // the input bounds right or bottom side minus the width or height divided by this value.
+ private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3;
+
TaskStack mStack;
final AppTokenList mAppTokens = new AppTokenList();
final int mTaskId;
@@ -165,6 +172,41 @@
}
}
+ /** Fits the tasks within the input bounds adjusting the task bounds as needed.
+ * @param bounds Bounds to fit the task within. Nothing is done if null.
+ * @return Returns true if the task bounds was adjusted in any way.
+ * */
+ boolean fitWithinBounds(Rect bounds) {
+ if (bounds == null || bounds.contains(mBounds)) {
+ return false;
+ }
+ mTmpRect2.set(mBounds);
+
+ if (mBounds.left < bounds.left || mBounds.right > bounds.right) {
+ final int maxRight = bounds.right - (bounds.width() / FIT_WITHIN_BOUNDS_DIVIDER);
+ int horizontalDiff = bounds.left - mBounds.left;
+ if ((horizontalDiff < 0 && mBounds.left >= maxRight)
+ || (mBounds.left + horizontalDiff >= maxRight)) {
+ horizontalDiff = maxRight - mBounds.left;
+ }
+ mTmpRect2.left += horizontalDiff;
+ mTmpRect2.right += horizontalDiff;
+ }
+
+ if (mBounds.top < bounds.top || mBounds.bottom > bounds.bottom) {
+ final int maxBottom = bounds.bottom - (bounds.height() / FIT_WITHIN_BOUNDS_DIVIDER);
+ int verticalDiff = bounds.top - mBounds.top;
+ if ((verticalDiff < 0 && mBounds.top >= maxBottom)
+ || (mBounds.top + verticalDiff >= maxBottom)) {
+ verticalDiff = maxBottom - mBounds.top;
+ }
+ mTmpRect2.top += verticalDiff;
+ mTmpRect2.bottom += verticalDiff;
+ }
+
+ return setBounds(mTmpRect2);
+ }
+
/** Set the task bounds. Passing in null sets the bounds to fullscreen. */
boolean setBounds(Rect bounds) {
boolean oldFullscreen = mFullscreen;
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 1c65c27..25a71d9 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -16,12 +16,14 @@
package com.android.server.wm;
+import static android.app.ActivityManager.*;
import static com.android.server.wm.WindowManagerService.DEBUG_TASK_MOVEMENT;
import static com.android.server.wm.WindowManagerService.TAG;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Debug;
+import android.os.RemoteException;
import android.util.EventLog;
import android.util.IntArray;
import android.util.Slog;
@@ -34,6 +36,10 @@
import java.util.List;
public class TaskStack implements DimLayer.DimLayerUser {
+
+ // If the stack should be resized to fullscreen.
+ private static final boolean FULLSCREEN = true;
+
/** Unique identifier */
final int mStackId;
@@ -91,20 +97,34 @@
/**
* Set the bounds of the stack and its containing tasks.
* @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
+ * @param resizeTasks If true, the tasks within the stack will also be resized.
* @param changedTaskIds Output list of Ids of tasks that changed in bounds.
* @param newTaskConfigs Output list of new Configuation of the tasks that changed.
* @return True if the stack bounds was changed.
* */
- boolean setBounds(Rect bounds, IntArray changedTaskIds, List<Configuration> newTaskConfigs) {
+ boolean setBounds(Rect bounds, boolean resizeTasks, IntArray changedTaskIds,
+ List<Configuration> newTaskConfigs) {
if (!setBounds(bounds)) {
return false;
}
+ if (!resizeTasks) {
+ return true;
+ }
+
// Update bounds of containing tasks.
final Rect newBounds = mFullscreen ? null : mBounds;
for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
final Task task = mTasks.get(taskNdx);
- if (task.setBounds(newBounds)) {
+ if (mStackId == FREEFORM_WORKSPACE_STACK_ID) {
+ // For freeform stack we don't adjust the size of the tasks to match that of the
+ // stack, but we do try to make sure the tasks are still contained with the
+ // bounds of the stack.
+ if (task.fitWithinBounds(newBounds)) {
+ changedTaskIds.add(task.mTaskId);
+ newTaskConfigs.add(task.mOverrideConfig);
+ }
+ } else if (task.setBounds(newBounds)) {
changedTaskIds.add(task.mTaskId);
newTaskConfigs.add(task.mOverrideConfig);
}
@@ -146,9 +166,13 @@
out.set(mBounds);
}
- void updateDisplayInfo() {
+ void updateDisplayInfo(Rect bounds) {
if (mDisplayContent != null) {
- setBounds(mFullscreen ? null : mBounds);
+ if (bounds != null) {
+ setBounds(bounds);
+ } else {
+ setBounds(mFullscreen ? null : mBounds);
+ }
for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
mTasks.get(taskNdx).updateDisplayInfo(mDisplayContent);
}
@@ -296,7 +320,82 @@
mDisplayContent = displayContent;
mAnimationBackgroundSurface = new DimLayer(mService, this, mDisplayContent.getDisplayId());
- updateDisplayInfo();
+
+ Rect bounds = null;
+ final boolean dockedStackExists = mService.mStackIdToStack.get(DOCKED_STACK_ID) != null;
+ if (mStackId == DOCKED_STACK_ID || (dockedStackExists
+ && mStackId >= FIRST_STATIC_STACK_ID && mStackId <= LAST_STATIC_STACK_ID)) {
+ // The existence of a docked stack affects the size of any static stack created since
+ // the docked stack occupies a dedicated region on screen.
+ bounds = new Rect();
+ displayContent.getLogicalDisplayRect(mTmpRect);
+ getInitialDockedStackBounds(mTmpRect, bounds, mStackId);
+ }
+
+ updateDisplayInfo(bounds);
+
+ if (mStackId == DOCKED_STACK_ID) {
+ // Attaching a docked stack to the display affects the size of all other static
+ // stacks since the docked stack occupies a dedicated region on screen.
+ // Resize existing static stacks so they are pushed to the side of the docked stack.
+ resizeNonDockedStacks(!FULLSCREEN);
+ }
+ }
+
+ /**
+ * Outputs the initial bounds a stack should be given the presence of a docked stack on the
+ * display.
+ * @param displayRect The bounds of the display the docked stack is on.
+ * @param outBounds Output bounds that should be used for the stack.
+ * @param stackId Id of stack we are calculating the bounds for.
+ */
+ private static void getInitialDockedStackBounds(
+ Rect displayRect, Rect outBounds, int stackId) {
+ // Docked stack start off occupying half the screen space.
+ // TODO(multi-window): Need to support the selecting which half of the screen the
+ // docked stack uses for snapping windows to the edge of the screen.
+ final boolean splitHorizontally = displayRect.width() > displayRect.height();
+ outBounds.set(displayRect);
+ if (stackId == DOCKED_STACK_ID) {
+ if (splitHorizontally) {
+ outBounds.right = displayRect.centerX();
+ } else {
+ outBounds.bottom = displayRect.centerY();
+ }
+ } else {
+ if (splitHorizontally) {
+ outBounds.left = displayRect.centerX();
+ } else {
+ outBounds.top = displayRect.centerY();
+ }
+ }
+ }
+
+ /** Resizes all non-docked stacks in the system to either fullscreen or the appropriate size
+ * based on the presence of a docked stack.
+ * @param fullscreen If true the stacks will be resized to fullscreen, else they will be
+ * resized to the appropriate size based on the presence of a docked stack.
+ */
+ private void resizeNonDockedStacks(boolean fullscreen) {
+ mDisplayContent.getLogicalDisplayRect(mTmpRect);
+ if (!fullscreen) {
+ getInitialDockedStackBounds(mTmpRect, mTmpRect, FULLSCREEN_WORKSPACE_STACK_ID);
+ }
+
+ final int count = mService.mStackIdToStack.size();
+ for (int i = 0; i < count; i++) {
+ final TaskStack otherStack = mService.mStackIdToStack.valueAt(i);
+ final int otherStackId = otherStack.mStackId;
+ if (otherStackId != DOCKED_STACK_ID
+ && otherStackId >= FIRST_STATIC_STACK_ID
+ && otherStackId <= LAST_STATIC_STACK_ID) {
+ try {
+ mService.mActivityManager.resizeStack(otherStackId, mTmpRect);
+ } catch (RemoteException e) {
+ // This will not happen since we are in the same process.
+ }
+ }
+ }
}
void detachDisplay() {
@@ -317,6 +416,12 @@
mService.requestTraversalLocked();
}
+ if (mStackId == DOCKED_STACK_ID) {
+ // Docked stack was detached from the display, so we no longer need to restrict the
+ // region of the screen other static stacks occupy. Go ahead and make them fullscreen.
+ resizeNonDockedStacks(FULLSCREEN);
+ }
+
close();
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index ec61a1d..355b09b 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5123,8 +5123,9 @@
* @param displayId The unique identifier of the DisplayContent.
* @param onTop If true the stack will be place at the top of the display,
* else at the bottom
+ * @return The initial bounds the stack was created with. null means fullscreen.
*/
- public void attachStack(int stackId, int displayId, boolean onTop) {
+ public Rect attachStack(int stackId, int displayId, boolean onTop) {
final long origId = Binder.clearCallingIdentity();
try {
synchronized (mWindowMap) {
@@ -5138,16 +5139,24 @@
}
stack.attachDisplayContent(displayContent);
displayContent.attachStack(stack, onTop);
+
moveStackWindowsLocked(displayContent);
final WindowList windows = displayContent.getWindowList();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
windows.get(winNdx).reportResized();
}
+ if (stack.isFullscreen()) {
+ return null;
+ }
+ Rect bounds = new Rect();
+ stack.getBounds(bounds);
+ return bounds;
}
}
} finally {
Binder.restoreCallingIdentity(origId);
}
+ return null;
}
void detachStackLocked(DisplayContent displayContent, TaskStack stack) {
@@ -5239,19 +5248,20 @@
* Re-sizes a stack and its containing tasks.
* @param stackId Id of stack to resize.
* @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
+ * @param resizeTasks If true, the tasks within the stack will also be resized.
* @param changedTaskIds Output list of Ids of tasks that changed in bounds due to resize.
* @param newTaskConfigs Output list of new Configuation of the tasks that changed.
* @return True if the stack is now fullscreen.
* */
- public boolean resizeStack(
- int stackId, Rect bounds, IntArray changedTaskIds, List<Configuration> newTaskConfigs) {
+ public boolean resizeStack(int stackId, Rect bounds, boolean resizeTasks,
+ IntArray changedTaskIds, List<Configuration> newTaskConfigs) {
synchronized (mWindowMap) {
final TaskStack stack = mStackIdToStack.get(stackId);
if (stack == null) {
throw new IllegalArgumentException("resizeStack: stackId " + stackId
+ " not found.");
}
- if (stack.setBounds(bounds, changedTaskIds, newTaskConfigs)) {
+ if (stack.setBounds(bounds, resizeTasks, changedTaskIds, newTaskConfigs)) {
stack.resizeWindows();
stack.getDisplayContent().layoutNeeded = true;
performLayoutAndPlaceSurfacesLocked();
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 5d33cbd..28491e4 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -40,7 +40,6 @@
import android.graphics.Region;
import android.os.Debug;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.Slog;
import android.view.Display;
import android.view.DisplayInfo;
@@ -834,6 +833,8 @@
mSurfaceX = 0;
mSurfaceY = 0;
w.mLastSystemDecorRect.set(0, 0, 0, 0);
+ mHasClipRect = false;
+ mClipRect.set(0, 0, 0, 0);
mLastClipRect.set(0, 0, 0, 0);
// Set up surface control with initial size.
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 8e475e6..8b37ec4 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -848,6 +848,9 @@
try {
ParceledListSlice<ApplicationInfo> slice
= AppGlobals.getPackageManager().getInstalledApplications(0, userId);
+ if (slice == null) {
+ return new int[0];
+ }
apps = slice.getList();
} catch (RemoteException e) {
return new int[0];
diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java
index 52abcfe..7f182a4 100644
--- a/services/usb/java/com/android/server/usb/UsbPortManager.java
+++ b/services/usb/java/com/android/server/usb/UsbPortManager.java
@@ -26,8 +26,13 @@
import android.hardware.usb.UsbPortStatus;
import android.os.Handler;
import android.os.Message;
+import android.os.SystemClock;
+import android.os.SystemProperties;
import android.os.UEventObserver;
import android.os.UserHandle;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
@@ -89,6 +94,9 @@
private static final String PORT_DATA_ROLE_HOST = "host";
private static final String PORT_DATA_ROLE_DEVICE = "device";
+ private static final String USB_TYPEC_PROP_PREFIX = "sys.usb.typec.";
+ private static final String USB_TYPEC_STATE = "sys.usb.typec.state";
+
// All non-trivial role combinations.
private static final int COMBO_SOURCE_HOST =
UsbPort.combineRolesAsBit(UsbPort.POWER_ROLE_SOURCE, UsbPort.DATA_ROLE_HOST);
@@ -621,16 +629,25 @@
return 0;
}
+ private static boolean fileIsRootWritable(String path) {
+ try {
+ // If the file is user writable, then it is root writable.
+ return (Os.stat(path).st_mode & OsConstants.S_IWUSR) != 0;
+ } catch (ErrnoException e) {
+ return false;
+ }
+ }
+
private static boolean canChangeMode(File portDir) {
- return new File(portDir, SYSFS_PORT_MODE).canWrite();
+ return fileIsRootWritable(new File(portDir, SYSFS_PORT_MODE).getPath());
}
private static boolean canChangePowerRole(File portDir) {
- return new File(portDir, SYSFS_PORT_POWER_ROLE).canWrite();
+ return fileIsRootWritable(new File(portDir, SYSFS_PORT_POWER_ROLE).getPath());
}
private static boolean canChangeDataRole(File portDir) {
- return new File(portDir, SYSFS_PORT_DATA_ROLE).canWrite();
+ return fileIsRootWritable(new File(portDir, SYSFS_PORT_DATA_ROLE).getPath());
}
private static String readFile(File dir, String filename) {
@@ -642,16 +659,29 @@
}
}
- private static boolean writeFile(File dir, String filename, String contents) {
- final File file = new File(dir, filename);
- try {
- try (FileWriter writer = new FileWriter(file)) {
- writer.write(contents);
- }
- return true;
- } catch (IOException ex) {
- return false;
+ private static boolean waitForState(String property, String state) {
+ // wait for the transition to complete.
+ // give up after 5 seconds.
+ // 5 seconds is probably too long, but we have seen hardware that takes
+ // over 3 seconds to change states.
+ String value = null;
+ for (int i = 0; i < 100; i++) {
+ // State transition is done when property is set to the new configuration
+ value = SystemProperties.get(property);
+ if (state.equals(value)) return true;
+ SystemClock.sleep(50);
}
+ Slog.e(TAG, "waitForState(" + state + ") for " + property + " FAILED: got " + value);
+ return false;
+ }
+
+ private static String propertyFromFilename(String filename) {
+ return USB_TYPEC_PROP_PREFIX + filename;
+ }
+
+ private static boolean writeFile(File dir, String filename, String contents) {
+ SystemProperties.set(propertyFromFilename(filename), contents);
+ return waitForState(USB_TYPEC_STATE, contents);
}
private static void logAndPrint(int priority, IndentingPrintWriter pw, String msg) {