diff options
178 files changed, 1239 insertions, 887 deletions
diff --git a/cmds/app_process/Android.mk b/cmds/app_process/Android.mk index fae0400a1212..e530184b9c6a 100644 --- a/cmds/app_process/Android.mk +++ b/cmds/app_process/Android.mk @@ -12,7 +12,8 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ app_main.cpp -LOCAL_LDFLAGS := -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--export-dynamic +LOCAL_LDFLAGS_32 := -Wl,--version-script,art/sigchainlib/version-script32.txt -Wl,--export-dynamic +LOCAL_LDFLAGS_64 := -Wl,--version-script,art/sigchainlib/version-script64.txt -Wl,--export-dynamic LOCAL_SHARED_LIBRARIES := \ libdl \ @@ -58,7 +59,9 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain -LOCAL_LDFLAGS := -ldl -Wl,--version-script,art/sigchainlib/version-script.txt -Wl,--export-dynamic +LOCAL_LDFLAGS := -ldl +LOCAL_LDFLAGS_32 := -Wl,--version-script,art/sigchainlib/version-script32.txt -Wl,--export-dynamic +LOCAL_LDFLAGS_64 := -Wl,--version-script,art/sigchainlib/version-script64.txt -Wl,--export-dynamic LOCAL_CPPFLAGS := -std=c++11 LOCAL_MODULE := app_process__asan diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index bc2d788bf4c8..1e6424e165c5 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -208,7 +208,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { String selection, String[] selectionArgs, String sortOrder, ICancellationSignal cancellationSignal) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); if (enforceReadPermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) { // The caller has no access to the data, so return an empty cursor with // the columns in the requested order. The caller may ask for an invalid @@ -247,7 +247,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { @Override public String getType(Uri uri) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); return ContentProvider.this.getType(uri); } @@ -255,7 +255,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { public Uri insert(String callingPkg, Uri uri, ContentValues initialValues) { validateIncomingUri(uri); int userId = getUserIdFromUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) { return rejectInsert(uri, initialValues); } @@ -270,7 +270,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { @Override public int bulkInsert(String callingPkg, Uri uri, ContentValues[] initialValues) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) { return 0; } @@ -331,7 +331,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { @Override public int delete(String callingPkg, Uri uri, String selection, String[] selectionArgs) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) { return 0; } @@ -347,7 +347,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { public int update(String callingPkg, Uri uri, ContentValues values, String selection, String[] selectionArgs) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) { return 0; } @@ -364,7 +364,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { String callingPkg, Uri uri, String mode, ICancellationSignal cancellationSignal, IBinder callerToken) throws FileNotFoundException { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); enforceFilePermission(callingPkg, uri, mode, callerToken); final String original = setCallingPackage(callingPkg); try { @@ -380,7 +380,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { String callingPkg, Uri uri, String mode, ICancellationSignal cancellationSignal) throws FileNotFoundException { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); enforceFilePermission(callingPkg, uri, mode, null); final String original = setCallingPackage(callingPkg); try { @@ -406,7 +406,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { @Override public String[] getStreamTypes(Uri uri, String mimeTypeFilter) { validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); return ContentProvider.this.getStreamTypes(uri, mimeTypeFilter); } @@ -415,7 +415,7 @@ public abstract class ContentProvider implements ComponentCallbacks2 { Bundle opts, ICancellationSignal cancellationSignal) throws FileNotFoundException { Bundle.setDefusable(opts, true); validateIncomingUri(uri); - uri = getUriWithoutUserId(uri); + uri = maybeGetUriWithoutUserId(uri); enforceFilePermission(callingPkg, uri, "r", null); final String original = setCallingPackage(callingPkg); try { @@ -1846,10 +1846,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { /** @hide */ private void validateIncomingUri(Uri uri) throws SecurityException { String auth = uri.getAuthority(); - int userId = getUserIdFromAuthority(auth, UserHandle.USER_CURRENT); - if (userId != UserHandle.USER_CURRENT && userId != mContext.getUserId()) { - throw new SecurityException("trying to query a ContentProvider in user " - + mContext.getUserId() + " with a uri belonging to user " + userId); + if (!mSingleUser) { + int userId = getUserIdFromAuthority(auth, UserHandle.USER_CURRENT); + if (userId != UserHandle.USER_CURRENT && userId != mContext.getUserId()) { + throw new SecurityException("trying to query a ContentProvider in user " + + mContext.getUserId() + " with a uri belonging to user " + userId); + } } if (!matchesOurAuthorities(getAuthorityWithoutUserId(auth))) { String message = "The authority of the uri " + uri + " does not match the one of the " @@ -1864,6 +1866,14 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } /** @hide */ + private Uri maybeGetUriWithoutUserId(Uri uri) { + if (mSingleUser) { + return uri; + } + return getUriWithoutUserId(uri); + } + + /** @hide */ public static int getUserIdFromAuthority(String auth, int defaultUserId) { if (auth == null) return defaultUserId; int end = auth.lastIndexOf('@'); diff --git a/core/java/android/content/UriMatcher.java b/core/java/android/content/UriMatcher.java index 71a035e47f19..444edd0deac2 100644 --- a/core/java/android/content/UriMatcher.java +++ b/core/java/android/content/UriMatcher.java @@ -167,7 +167,7 @@ public class UriMatcher if (path != null) { String newPath = path; // Strip leading slash if present. - if (path.length() > 0 && path.charAt(0) == '/') { + if (path.length() > 1 && path.charAt(0) == '/') { newPath = path.substring(1); } tokens = newPath.split("/"); diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 6b23da93bb86..b9b609b5cad4 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -492,7 +492,7 @@ public class LauncherApps { * If the calling launcher application contains pinned shortcuts, they will still work, * even though the caller no longer has the shortcut host permission. * - * @throws IllegalStateException when the user is locked. + * <p>Returns {@code false} when the user is locked. * * @see ShortcutManager */ @@ -510,12 +510,13 @@ public class LauncherApps { * <p>Callers must be allowed to access the shortcut information, as defined in {@link * #hasShortcutHostPermission()}. * + * <p>Returns am empty list when the user is locked, or when the {@code user} user + * is locked or not running. + * * @param query result includes shortcuts matching this query. * @param user The UserHandle of the profile. * * @return the IDs of {@link ShortcutInfo}s that match the query. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @see ShortcutManager */ @@ -555,11 +556,12 @@ public class LauncherApps { * <p>The calling launcher application must be allowed to access the shortcut information, * as defined in {@link #hasShortcutHostPermission()}. * + * <p>Call will be ignored when the user is locked, or when the {@code user} user + * is locked or not running. + * * @param packageName The target package name. * @param shortcutIds The IDs of the shortcut to be pinned. * @param user The UserHandle of the profile. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @see ShortcutManager */ @@ -628,12 +630,13 @@ public class LauncherApps { * <p>The calling launcher application must be allowed to access the shortcut information, * as defined in {@link #hasShortcutHostPermission()}. * + * <p>Returns {@code null} when the user is locked, or when the user owning the shortcut + * is locked or not running. + * * @param density The preferred density of the icon, zero for default density. Use * density DPI values from {@link DisplayMetrics}. * * @return The drawable associated with the shortcut. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @see ShortcutManager * @see #getShortcutBadgedIconDrawable(ShortcutInfo, int) @@ -678,10 +681,11 @@ public class LauncherApps { * <p>The calling launcher application must be allowed to access the shortcut information, * as defined in {@link #hasShortcutHostPermission()}. * + * <p>Returns {@code 0} when the user is locked, or when the user owning the shortcut + * is locked or not running. + * * @param density Optional density for the icon, or 0 to use the default density. Use * @return A badged icon for the shortcut. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @see ShortcutManager * @see #getShortcutIconDrawable(ShortcutInfo, int) @@ -700,13 +704,15 @@ public class LauncherApps { * <p>The calling launcher application must be allowed to access the shortcut information, * as defined in {@link #hasShortcutHostPermission()}. * + * <p>Throws {@link android.content.ActivityNotFoundException} + * when the user is locked, or when the {@code user} user + * is locked or not running. + * * @param packageName The target shortcut package name. * @param shortcutId The target shortcut ID. * @param sourceBounds The Rect containing the source bounds of the clicked icon. * @param startActivityOptions Options to pass to startActivity. * @param user The UserHandle of the profile. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @throws android.content.ActivityNotFoundException failed to start shortcut. (e.g. * the shortcut no longer exists, is disabled, the intent receiver activity doesn't exist, etc) @@ -724,11 +730,13 @@ public class LauncherApps { * <p>The calling launcher application must be allowed to access the shortcut information, * as defined in {@link #hasShortcutHostPermission()}. * + * <p>Throws {@link android.content.ActivityNotFoundException} + * when the user is locked, or when the user owning the shortcut + * is locked or not running. + * * @param shortcut The target shortcut. * @param sourceBounds The Rect containing the source bounds of the clicked icon. * @param startActivityOptions Options to pass to startActivity. - * @throws IllegalStateException when the user is locked, or when the {@code user} user - * is locked or not running. * * @throws android.content.ActivityNotFoundException failed to start shortcut. (e.g. * the shortcut no longer exists, is disabled, the intent receiver activity doesn't exist, etc) diff --git a/core/java/android/widget/RatingBar.java b/core/java/android/widget/RatingBar.java index 223096116adb..3ad05b5e7c01 100644 --- a/core/java/android/widget/RatingBar.java +++ b/core/java/android/widget/RatingBar.java @@ -110,8 +110,8 @@ public class RatingBar extends AbsSeekBar { } // A touch inside a star fill up to that fractional area (slightly more - // than 1 so boundaries round up). - mTouchProgressOffset = 1.1f; + // than 0.5 so boundaries round up). + mTouchProgressOffset = 0.6f; } public RatingBar(Context context, AttributeSet attrs) { diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 01c2a0b50c62..2956175ed622 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -18,6 +18,7 @@ #include "CreateJavaOutputStreamAdaptor.h" #include <Caches.h> #include <hwui/Paint.h> +#include <renderthread/RenderProxy.h> #include "core_jni_helpers.h" @@ -1361,6 +1362,14 @@ static jlong Bitmap_refPixelRef(JNIEnv* env, jobject, jlong bitmapHandle) { return reinterpret_cast<jlong>(pixelRef); } +static void Bitmap_prepareToDraw(JNIEnv* env, jobject, jlong bitmapPtr) { + LocalScopedBitmap bitmapHandle(bitmapPtr); + if (!bitmapHandle.valid()) return; + SkBitmap bitmap; + bitmapHandle->getSkBitmap(&bitmap); + android::uirenderer::renderthread::RenderProxy::prepareToDraw(bitmap); +} + /////////////////////////////////////////////////////////////////////////////// static const JNINativeMethod gBitmapMethods[] = { @@ -1404,6 +1413,7 @@ static const JNINativeMethod gBitmapMethods[] = { (void*)Bitmap_copyPixelsFromBuffer }, { "nativeSameAs", "(JJ)Z", (void*)Bitmap_sameAs }, { "nativeRefPixelRef", "(J)J", (void*)Bitmap_refPixelRef }, + { "nativePrepareToDraw", "(J)V", (void*)Bitmap_prepareToDraw }, }; int register_android_graphics_Bitmap(JNIEnv* env) diff --git a/core/res/Android.mk b/core/res/Android.mk index a1bef8326fb7..b0669294dd9d 100644 --- a/core/res/Android.mk +++ b/core/res/Android.mk @@ -16,16 +16,18 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +LOCAL_USE_AAPT2 := true LOCAL_NO_STANDARD_LIBRARIES := true LOCAL_PACKAGE_NAME := framework-res LOCAL_CERTIFICATE := platform +LOCAL_MODULE_TAGS := optional -# Tell aapt to create "extending (non-application)" resource IDs, -# since these resources will be used by many apps. -LOCAL_AAPT_FLAGS := -x +# Generate private symbols into the com.android.internal.R class +# so they are not accessible to 3rd party apps. LOCAL_AAPT_FLAGS += --private-symbols com.android.internal -LOCAL_MODULE_TAGS := optional +# Framework doesn't need versioning since it IS the platform. +LOCAL_AAPT_FLAGS += --no-auto-version # Install this alongside the libraries. LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) @@ -34,12 +36,4 @@ LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) # PRODUCT-agnostic resource data like IDs and type definitions. LOCAL_EXPORT_PACKAGE_RESOURCES := true -# Include resources generated by system RenderScript files. -framework_GENERATED_SOURCE_DIR := $(call intermediates-dir-for,JAVA_LIBRARIES,framework,,COMMON)/src -framework_RenderScript_STAMP_FILE := $(framework_GENERATED_SOURCE_DIR)/RenderScript.stamp -#LOCAL_RESOURCE_DIR := $(framework_GENERATED_SOURCE_DIR)/renderscript/res $(LOCAL_PATH)/res - include $(BUILD_PACKAGE) - -# Make sure the system .rs files get compiled before building the package-export.apk. -# $(resource_export_package): $(framework_RenderScript_STAMP_FILE) diff --git a/core/res/res/color/watch_switch_thumb_color_material.xml b/core/res/res/color/watch_switch_thumb_color_material.xml index a931724f3419..d4796a032631 100644 --- a/core/res/res/color/watch_switch_thumb_color_material.xml +++ b/core/res/res/color/watch_switch_thumb_color_material.xml @@ -12,6 +12,7 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="?android:colorAccent" android:state_checked="true" /> - <item android:color="?android:colorButtonNormal" android:state_checked="false" /> + <item android:color="?android:colorButtonNormal" android:state_enabled="false" /> + <item android:color="?android:colorControlActivated" android:state_checked="true" /> + <item android:color="?android:colorButtonNormal" /> </selector>
\ No newline at end of file diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 77de87dac601..a37db7e09901 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2742,4 +2742,25 @@ <public type="attr" name="showMetadataInPreview" id="0x0101052f" /> <public type="attr" name="colorSecondary" id="0x01010530" /> + <!-- =============================================================== + Resources added in version O of the platform + + NOTE: add <public> elements within a <public-group> like so: + + <public-group type="attr" first-id="0x01010531"> + <public name="exampleAttr1" /> + <public name="exampleAttr2" /> + </public-group> + =============================================================== --> + <eat-comment /> + + <public-group type="attr" first-id="0x01010531"> + </public-group> + + <public-group type="style" first-id="0x010302e0"> + </public-group> + + <public-group type="id" first-id="0x01020041"> + </public-group> + </resources> diff --git a/core/tests/coretests/src/android/net/UriMatcherTest.java b/core/tests/coretests/src/android/net/UriMatcherTest.java index a728d4fd5813..dd46fa38d50e 100644 --- a/core/tests/coretests/src/android/net/UriMatcherTest.java +++ b/core/tests/coretests/src/android/net/UriMatcherTest.java @@ -82,9 +82,31 @@ public class UriMatcherTest extends TestCase { checkAll(matcher); } + @SmallTest + public void testContentUrisWithLeadingSlashAndOnlySlash() { + UriMatcher matcher = new UriMatcher(ROOT); + matcher.addURI("people", "/", PEOPLE); + matcher.addURI("people", "/#", PEOPLE_ID); + matcher.addURI("people", "/#/phones", PEOPLE_PHONES); + matcher.addURI("people", "/#/phones/blah", PEOPLE_PHONES_ID); + matcher.addURI("people", "/#/phones/#", PEOPLE_PHONES_ID); + matcher.addURI("people", "/#/addresses", PEOPLE_ADDRESSES); + matcher.addURI("people", "/#/addresses/#", PEOPLE_ADDRESSES_ID); + matcher.addURI("people", "/#/contact-methods", PEOPLE_CONTACTMETH); + matcher.addURI("people", "/#/contact-methods/#", PEOPLE_CONTACTMETH_ID); + matcher.addURI("calls", "/", CALLS); + matcher.addURI("calls", "/#", CALLS_ID); + matcher.addURI("caller-id", "/", CALLERID); + matcher.addURI("caller-id", "/*", CALLERID_TEXT); + matcher.addURI("filter-recent", null, FILTERRECENT); + matcher.addURI("auth", "/another/path/segment", ANOTHER_PATH_SEGMENT); + checkAll(matcher); + } + private void checkAll(UriMatcher matcher) { check("content://asdf", UriMatcher.NO_MATCH, matcher); check("content://people", PEOPLE, matcher); + check("content://people/", PEOPLE, matcher); check("content://people/1", PEOPLE_ID, matcher); check("content://people/asdf", UriMatcher.NO_MATCH, matcher); check("content://people/2/phones", PEOPLE_PHONES, matcher); @@ -97,9 +119,11 @@ public class UriMatcherTest extends TestCase { check("content://people/2/contact-methods/3", PEOPLE_CONTACTMETH_ID, matcher); check("content://people/2/contact-methods/asdf", UriMatcher.NO_MATCH, matcher); check("content://calls", CALLS, matcher); + check("content://calls/", CALLS, matcher); check("content://calls/1", CALLS_ID, matcher); check("content://calls/asdf", UriMatcher.NO_MATCH, matcher); check("content://caller-id", CALLERID, matcher); + check("content://caller-id/", CALLERID, matcher); check("content://caller-id/asdf", CALLERID_TEXT, matcher); check("content://caller-id/1", CALLERID_TEXT, matcher); check("content://filter-recent", FILTERRECENT, matcher); diff --git a/docs/html-intl/intl/es/training/articles/direct-boot.jd b/docs/html-intl/intl/es/training/articles/direct-boot.jd index e1d99e9d2b0e..0ce3f5b2db27 100644 --- a/docs/html-intl/intl/es/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/es/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>En este documento</h2> <ol> <li><a href="#run">Solicitar acceso para ejecutar durante el inicio directo</a></li> diff --git a/docs/html-intl/intl/es/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/es/training/articles/scoped-directory-access.jd index 67f9ad672d76..194bfd74d354 100644 --- a/docs/html-intl/intl/es/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/es/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>En este documento</h2> <ol> <li><a href="#accessing">Acceder a un directorio de almacenamiento externo</a></li> diff --git a/docs/html-intl/intl/es/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/es/training/tv/playback/picture-in-picture.jd index 0aa46dcaa980..30c9e8bf9cf0 100644 --- a/docs/html-intl/intl/es/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/es/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>En este documento</h2> <ol> diff --git a/docs/html-intl/intl/es/training/tv/tif/content-recording.jd b/docs/html-intl/intl/es/training/tv/tif/content-recording.jd index 855db8d5fffe..9e8a34679de4 100644 --- a/docs/html-intl/intl/es/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/es/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>En este documento</h2> <ol> <li><a href="#supporting">Indicar la compatibilidad para la grabación</a></li> diff --git a/docs/html-intl/intl/in/training/articles/direct-boot.jd b/docs/html-intl/intl/in/training/articles/direct-boot.jd index b06a7dd7864d..a7e3cf3cad77 100644 --- a/docs/html-intl/intl/in/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/in/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Dalam dokumen ini</h2> <ol> <li><a href="#run">Meminta Akses untuk Berjalan Selama Direct Boot</a></li> diff --git a/docs/html-intl/intl/in/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/in/training/articles/scoped-directory-access.jd index 855993f0b15c..30aed6fbb2a4 100644 --- a/docs/html-intl/intl/in/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/in/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Dalam dokumen ini</h2> <ol> <li><a href="#accessing">Mengakses Direktori Penyimpanan Eksternal</a></li> diff --git a/docs/html-intl/intl/in/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/in/training/tv/playback/picture-in-picture.jd index 1cad9550e40c..41af6de97723 100644 --- a/docs/html-intl/intl/in/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/in/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Dalam dokumen ini</h2> <ol> diff --git a/docs/html-intl/intl/in/training/tv/tif/content-recording.jd b/docs/html-intl/intl/in/training/tv/tif/content-recording.jd index afedf8f31b21..3389dbf84cbf 100644 --- a/docs/html-intl/intl/in/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/in/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Dalam dokumen ini</h2> <ol> <li><a href="#supporting">Menunjukkan Dukungan untuk Perekaman</a></li> diff --git a/docs/html-intl/intl/ja/training/articles/direct-boot.jd b/docs/html-intl/intl/ja/training/articles/direct-boot.jd index 933e682c062b..eaa684c76292 100644 --- a/docs/html-intl/intl/ja/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/ja/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>このドキュメントの内容</h2> <ol> <li><a href="#run">ダイレクト ブート中に実行するためのアクセスを要求する</a></li> diff --git a/docs/html-intl/intl/ja/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/ja/training/articles/scoped-directory-access.jd index 32681a03620e..076768933792 100644 --- a/docs/html-intl/intl/ja/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/ja/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>このドキュメントの内容</h2> <ol> <li><a href="#accessing">外部ストレージのディレクトリへのアクセス</a></li> diff --git a/docs/html-intl/intl/ja/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/ja/training/tv/playback/picture-in-picture.jd index 7593670c98fc..1df16cd54393 100644 --- a/docs/html-intl/intl/ja/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/ja/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>このドキュメントの内容</h2> <ol> diff --git a/docs/html-intl/intl/ja/training/tv/tif/content-recording.jd b/docs/html-intl/intl/ja/training/tv/tif/content-recording.jd index bf5f9a961a3b..3c58cfd31204 100644 --- a/docs/html-intl/intl/ja/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/ja/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>このドキュメントの内容</h2> <ol> <li><a href="#supporting">録画のサポートを示す</a></li> diff --git a/docs/html-intl/intl/ko/training/articles/direct-boot.jd b/docs/html-intl/intl/ko/training/articles/direct-boot.jd index 2674481181a4..e58a4f98019b 100644 --- a/docs/html-intl/intl/ko/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/ko/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>이 문서의 내용</h2> <ol> <li><a href="#run">직접 부팅 시 실행하기 위한 액세스 요청</a></li> diff --git a/docs/html-intl/intl/ko/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/ko/training/articles/scoped-directory-access.jd index efd05f3e3a69..f2ce6500327d 100644 --- a/docs/html-intl/intl/ko/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/ko/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>이 문서의 내용</h2> <ol> <li><a href="#accessing">외부 저장소 디렉터리 액세스</a></li> diff --git a/docs/html-intl/intl/ko/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/ko/training/tv/playback/picture-in-picture.jd index 15d85fa4626e..96129ce216e1 100644 --- a/docs/html-intl/intl/ko/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/ko/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>이 문서의 내용</h2> <ol> diff --git a/docs/html-intl/intl/ko/training/tv/tif/content-recording.jd b/docs/html-intl/intl/ko/training/tv/tif/content-recording.jd index fa557bcf14fd..ed8b6e04ec85 100644 --- a/docs/html-intl/intl/ko/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/ko/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>이 문서의 내용</h2> <ol> <li><a href="#supporting">녹화 지원 나타내기</a></li> diff --git a/docs/html-intl/intl/pt-br/training/articles/direct-boot.jd b/docs/html-intl/intl/pt-br/training/articles/direct-boot.jd index 8f588411a612..d95f4cded3c1 100644 --- a/docs/html-intl/intl/pt-br/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/pt-br/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Neste documento</h2> <ol> <li><a href="#run">Solicitar acesso para executar durante a inicialização direta</a></li> diff --git a/docs/html-intl/intl/pt-br/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/pt-br/training/articles/scoped-directory-access.jd index a4c51abe3398..215afd14b931 100644 --- a/docs/html-intl/intl/pt-br/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/pt-br/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Neste documento</h2> <ol> <li><a href="#accessing">Acessar um diretório de armazenamento externo</a></li> diff --git a/docs/html-intl/intl/pt-br/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/pt-br/training/tv/playback/picture-in-picture.jd index 14f52091c86b..baa7d61b1390 100644 --- a/docs/html-intl/intl/pt-br/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/pt-br/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Neste documento</h2> <ol> diff --git a/docs/html-intl/intl/pt-br/training/tv/tif/content-recording.jd b/docs/html-intl/intl/pt-br/training/tv/tif/content-recording.jd index 890e1403793b..c6d7bb7f4fe5 100644 --- a/docs/html-intl/intl/pt-br/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/pt-br/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Neste documento</h2> <ol> <li><a href="#supporting">Indicar suporte para gravação</a></li> diff --git a/docs/html-intl/intl/ru/training/articles/direct-boot.jd b/docs/html-intl/intl/ru/training/articles/direct-boot.jd index 3392c1355f8f..98849feeebb3 100644 --- a/docs/html-intl/intl/ru/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/ru/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Содержание документа</h2> <ol> <li><a href="#run">Запрос доступа для запуска в режиме Direct Boot</a></li> diff --git a/docs/html-intl/intl/ru/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/ru/training/articles/scoped-directory-access.jd index f70c92c4e14d..3e67d358f8ee 100644 --- a/docs/html-intl/intl/ru/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/ru/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Содержание документа</h2> <ol> <li><a href="#accessing">Доступ к каталогу во внешнем хранилище</a></li> diff --git a/docs/html-intl/intl/ru/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/ru/training/tv/playback/picture-in-picture.jd index f0ffd482d86a..fc26368bb126 100644 --- a/docs/html-intl/intl/ru/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/ru/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Содержание документа</h2> <ol> diff --git a/docs/html-intl/intl/ru/training/tv/tif/content-recording.jd b/docs/html-intl/intl/ru/training/tv/tif/content-recording.jd index 5e6ce45b99ec..19d6db37eb02 100644 --- a/docs/html-intl/intl/ru/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/ru/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Содержание документа</h2> <ol> <li><a href="#supporting">Указание на поддержку записи</a></li> diff --git a/docs/html-intl/intl/vi/training/articles/direct-boot.jd b/docs/html-intl/intl/vi/training/articles/direct-boot.jd index 9b2a557c2b16..c93e2552e208 100644 --- a/docs/html-intl/intl/vi/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/vi/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Trong tài liệu này</h2> <ol> <li><a href="#run">Yêu cầu Truy cập để Chạy trong quá trình Khởi động Trực tiếp</a></li> diff --git a/docs/html-intl/intl/vi/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/vi/training/articles/scoped-directory-access.jd index d3b71743dcae..a4d97796aaa3 100644 --- a/docs/html-intl/intl/vi/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/vi/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Trong tài liệu này</h2> <ol> <li><a href="#accessing">Truy cập một Thư mục lưu trữ bên ngoài</a></li> diff --git a/docs/html-intl/intl/vi/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/vi/training/tv/playback/picture-in-picture.jd index 8146a1578682..9156152eb0d0 100644 --- a/docs/html-intl/intl/vi/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/vi/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Trong tài liệu này</h2> <ol> diff --git a/docs/html-intl/intl/vi/training/tv/tif/content-recording.jd b/docs/html-intl/intl/vi/training/tv/tif/content-recording.jd index 6dfb53ea3c9a..bfd718b28986 100644 --- a/docs/html-intl/intl/vi/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/vi/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>Trong tài liệu này</h2> <ol> <li><a href="#supporting">Chỉ báo Hỗ trợ ghi lại</a></li> diff --git a/docs/html-intl/intl/zh-cn/training/articles/direct-boot.jd b/docs/html-intl/intl/zh-cn/training/articles/direct-boot.jd index 306a7a4130ca..20f8b57822b0 100644 --- a/docs/html-intl/intl/zh-cn/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/zh-cn/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>本文内容</h2> <ol> <li><a href="#run">请求在直接启动时运行</a></li> diff --git a/docs/html-intl/intl/zh-cn/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/zh-cn/training/articles/scoped-directory-access.jd index 6473fc85c8d5..83d50b42f277 100644 --- a/docs/html-intl/intl/zh-cn/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/zh-cn/training/articles/scoped-directory-access.jd @@ -8,8 +8,8 @@ page.tags=Android N -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>本文内容</h2> <ol> <li><a href="#accessing">访问外部存储目录</a></li> diff --git a/docs/html-intl/intl/zh-cn/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/zh-cn/training/tv/playback/picture-in-picture.jd index 782b5b868d63..6cfa815eca8b 100644 --- a/docs/html-intl/intl/zh-cn/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/zh-cn/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>本文内容</h2> <ol> diff --git a/docs/html-intl/intl/zh-cn/training/tv/tif/content-recording.jd b/docs/html-intl/intl/zh-cn/training/tv/tif/content-recording.jd index 2dec87d68724..754e0651fcb9 100644 --- a/docs/html-intl/intl/zh-cn/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/zh-cn/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>本文内容</h2> <ol> <li><a href="#supporting">指示支持录制</a></li> diff --git a/docs/html-intl/intl/zh-tw/training/articles/direct-boot.jd b/docs/html-intl/intl/zh-tw/training/articles/direct-boot.jd index 7e4ea732b244..fdcb1727cea4 100644 --- a/docs/html-intl/intl/zh-tw/training/articles/direct-boot.jd +++ b/docs/html-intl/intl/zh-tw/training/articles/direct-boot.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>此文件內容</h2> <ol> <li><a href="#run">要求直接開機期間的執行權限</a></li> diff --git a/docs/html-intl/intl/zh-tw/training/articles/scoped-directory-access.jd b/docs/html-intl/intl/zh-tw/training/articles/scoped-directory-access.jd index 0aa0034a1d1e..b1c1a76ebb09 100644 --- a/docs/html-intl/intl/zh-tw/training/articles/scoped-directory-access.jd +++ b/docs/html-intl/intl/zh-tw/training/articles/scoped-directory-access.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>此文件內容</h2> <ol> <li><a href="#accessing">存取外部儲存空間目錄</a></li> diff --git a/docs/html-intl/intl/zh-tw/training/tv/playback/picture-in-picture.jd b/docs/html-intl/intl/zh-tw/training/tv/playback/picture-in-picture.jd index b05198573eba..e643f65dbc1a 100644 --- a/docs/html-intl/intl/zh-tw/training/tv/playback/picture-in-picture.jd +++ b/docs/html-intl/intl/zh-tw/training/tv/playback/picture-in-picture.jd @@ -4,8 +4,8 @@ page.tags=androidn @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>此文件內容</h2> <ol> diff --git a/docs/html-intl/intl/zh-tw/training/tv/tif/content-recording.jd b/docs/html-intl/intl/zh-tw/training/tv/tif/content-recording.jd index d857477d760b..8b3a5ce62cac 100644 --- a/docs/html-intl/intl/zh-tw/training/tv/tif/content-recording.jd +++ b/docs/html-intl/intl/zh-tw/training/tv/tif/content-recording.jd @@ -5,8 +5,8 @@ page.image=images/cards/card-nyc_2x.jpg @jd:body -<div id="qv-wrapper"> -<div id="qv"> +<div id="tb-wrapper"> +<div id="tb"> <h2>此文件內容</h2> <ol> <li><a href="#supporting">指出錄製支援</a></li> diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml index 3dcc736d3c90..00a7edd3f528 100644 --- a/docs/html/_redirects.yaml +++ b/docs/html/_redirects.yaml @@ -479,6 +479,14 @@ redirects: to: /distribute/stories/index.html - from: /distribute/stories/tablets.html to: /distribute/stories/index.html +- from: /distribute/stories/glu-dh.html + to: /distribute/stories/games/glu-dh.html +- from: /distribute/stories/apps/tapps.html + to: /distribute/stories/games/tapps.html +- from: /distribute/stories/apps/upbeat-games.html + to: /distribute/stories/games/upbeat-games.html +- from: /distribute/stories/games/two-dots.html + to: /distribute/stories/games/dots.html - from: /distribute/googleplay/edu/index.html to: /distribute/googleplay/edu/about.html - from: /distribute/googleplay/edu/contact.html diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index 3cbfde9cc386..f5d23e8b4032 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -59,7 +59,7 @@ Platform Versions</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on July 11, 2016. +<p style="clear:both"><em>Data collected during a 7-day period ending on August 1, 2016. <br/>Any versions with less than 0.1% distribution are not shown.</em> </p> @@ -81,7 +81,7 @@ Screens</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on July 11, 2016. +<p style="clear:both"><em>Data collected during a 7-day period ending on August 1, 2016. <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> @@ -101,7 +101,7 @@ support for any lower version (for example, support for version 2.0 also implies <img alt="" style="float:right" -src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A47.5%2C41.9%2C10.6&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"> +src="//chart.googleapis.com/chart?chl=GL%202.0%7CGL%203.0%7CGL%203.1&chf=bg%2Cs%2C00000000&chd=t%3A46.0%2C42.6%2C11.4&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"> <p>To declare which version of OpenGL ES your application requires, you should use the {@code android:glEsVersion} attribute of the <a @@ -119,21 +119,21 @@ uses.</p> </tr> <tr> <td>2.0</td> -<td>47.5%</td> +<td>46.0%</td> </tr> <tr> <td>3.0</td> -<td>41.9%</td> +<td>42.6%</td> </tr> <tr> <td>3.1</td> -<td>10.6%</td> +<td>11.4%</td> </tr> </table> -<p style="clear:both"><em>Data collected during a 7-day period ending on July 11, 2016</em></p> +<p style="clear:both"><em>Data collected during a 7-day period ending on August 1, 2016</em></p> @@ -147,19 +147,19 @@ var SCREEN_DATA = "Large": { "hdpi": "0.5", "ldpi": "0.2", - "mdpi": "4.4", + "mdpi": "4.3", "tvdpi": "2.1", "xhdpi": "0.5" }, "Normal": { - "hdpi": "40.9", - "mdpi": "4.1", + "hdpi": "40.0", + "mdpi": "3.8", "tvdpi": "0.1", - "xhdpi": "26.3", - "xxhdpi": "15.1" + "xhdpi": "27.3", + "xxhdpi": "15.5" }, "Small": { - "ldpi": "1.9" + "ldpi": "1.8" }, "Xlarge": { "hdpi": "0.3", @@ -167,8 +167,8 @@ var SCREEN_DATA = "xhdpi": "0.7" } }, - "densitychart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chd=t%3A2.1%2C11.4%2C2.2%2C41.7%2C27.5%2C15.1&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chs=400x250&cht=p", - "layoutchart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chd=t%3A3.9%2C7.7%2C86.5%2C1.9&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall&chs=400x250&cht=p" + "densitychart": "//chart.googleapis.com/chart?chd=t%3A2.0%2C11.0%2C2.2%2C40.8%2C28.5%2C15.5&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&cht=p&chs=400x250&chco=c4df9b%2C6fad0c", + "layoutchart": "//chart.googleapis.com/chart?chd=t%3A3.9%2C7.6%2C86.7%2C1.8&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall&cht=p&chs=400x250&chco=c4df9b%2C6fad0c" } ]; @@ -176,7 +176,7 @@ var SCREEN_DATA = var VERSION_DATA = [ { - "chart": "//chart.googleapis.com/chart?chco=c4df9b%2C6fad0c&chd=t%3A0.1%2C1.9%2C1.7%2C17.8%2C30.2%2C35.1%2C13.3&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat%7CLollipop%7CMarshmallow&chs=500x250&cht=p", + "chart": "//chart.googleapis.com/chart?chd=t%3A0.1%2C1.7%2C1.6%2C16.7%2C29.2%2C35.5%2C15.2&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat%7CLollipop%7CMarshmallow&cht=p&chs=500x250&chco=c4df9b%2C6fad0c", "data": [ { "api": 8, @@ -186,47 +186,47 @@ var VERSION_DATA = { "api": 10, "name": "Gingerbread", - "perc": "1.9" + "perc": "1.7" }, { "api": 15, "name": "Ice Cream Sandwich", - "perc": "1.7" + "perc": "1.6" }, { "api": 16, "name": "Jelly Bean", - "perc": "6.4" + "perc": "6.0" }, { "api": 17, "name": "Jelly Bean", - "perc": "8.8" + "perc": "8.3" }, { "api": 18, "name": "Jelly Bean", - "perc": "2.6" + "perc": "2.4" }, { "api": 19, "name": "KitKat", - "perc": "30.1" + "perc": "29.2" }, { "api": 21, "name": "Lollipop", - "perc": "14.3" + "perc": "14.1" }, { "api": 22, "name": "Lollipop", - "perc": "20.8" + "perc": "21.4" }, { "api": 23, "name": "Marshmallow", - "perc": "13.3" + "perc": "15.2" } ] } diff --git a/docs/html/distribute/stories/apps/aftenposten.jd b/docs/html/distribute/stories/apps/aftenposten.jd index 149e6bbe5a4a..a813c00addca 100644 --- a/docs/html/distribute/stories/apps/aftenposten.jd +++ b/docs/html/distribute/stories/apps/aftenposten.jd @@ -2,7 +2,7 @@ page.title=Aftenposten Improves Retention by Allowing Readers to Customize Notif page.metaDescription=Aftenposten upgraded their app and improved user retention. page.tags="developerstory", "apps", "googleplay" page.image=images/cards/distribute/stories/aftenposten.png -page.timestamp=1468270114 +page.timestamp=1468901834 @jd:body diff --git a/docs/html/distribute/stories/apps/el-mundo.jd b/docs/html/distribute/stories/apps/el-mundo.jd index 2ee813d55d11..2dbaeea7c8f0 100644 --- a/docs/html/distribute/stories/apps/el-mundo.jd +++ b/docs/html/distribute/stories/apps/el-mundo.jd @@ -2,7 +2,7 @@ page.title=El Mundo Improves User Ratings and Engagement with Material Design page.metaDescription=El Mundo uses Material Design principles to enhance their app's user experience. page.tags="developerstory", "apps", "googleplay" page.image=images/cards/distribute/stories/el-mundo.png -page.timestamp=1468270112 +page.timestamp=1468901833 @jd:body diff --git a/docs/html/distribute/stories/apps/segundamano.jd b/docs/html/distribute/stories/apps/segundamano.jd index 4cbf817c6d43..7ed4d8e88a5d 100644 --- a/docs/html/distribute/stories/apps/segundamano.jd +++ b/docs/html/distribute/stories/apps/segundamano.jd @@ -2,7 +2,7 @@ page.title=Segundamano Develops Android-First as Its Fastest Channel for Growth page.metaDescription=Segundamano developed Android app to increase potential for growth. page.tags="developerstory", "apps", "googleplay" page.image=images/cards/distribute/stories/segundamano.png -page.timestamp=1468270110 +page.timestamp=1468901832 @jd:body diff --git a/docs/html/distribute/stories/glu-dh.jd b/docs/html/distribute/stories/games/glu-dh.jd index 3353f6998ee1..3353f6998ee1 100644 --- a/docs/html/distribute/stories/glu-dh.jd +++ b/docs/html/distribute/stories/games/glu-dh.jd diff --git a/docs/html/distribute/stories/apps/tapps.jd b/docs/html/distribute/stories/games/tapps.jd index 129213946630..221b9a88622f 100644 --- a/docs/html/distribute/stories/apps/tapps.jd +++ b/docs/html/distribute/stories/games/tapps.jd @@ -1,8 +1,8 @@ page.title=Tapps Games Increases Installs by More Than 20% with Store Listing Experiments page.metaDescription=Tapps Games increased their use of store listing experiments in the Developer Console, with impressive results. -page.tags="developerstory", "apps", "googleplay" +page.tags="developerstory", "games", "googleplay" page.image=images/cards/distribute/stories/tapps.png -page.timestamp=1468270108 +page.timestamp=1468901831 @jd:body diff --git a/docs/html/distribute/stories/games/two-dots.jd b/docs/html/distribute/stories/games/two-dots.jd deleted file mode 100644 index a2299ce1f7f9..000000000000 --- a/docs/html/distribute/stories/games/two-dots.jd +++ /dev/null @@ -1,77 +0,0 @@ -page.title=Two Dots increased installs by 7 percent using Store Listing Experiments -page.metaDescription=Two Dots, the sequel to the popular game Dots, is a free-to-play puzzle game launched by Playdots, Inc. Playdots decided to use Store Listing Experiments to see if adding a call to action in the games’ store listing short descriptions had an impact on installs. -page.tags="developerstory", "games", "googleplay" -page.image=images/cards/distribute/stories/two-dots.png -page.timestamp=1456431511 - -@jd:body - - -<h3>Background</h3> - -<div class="figure" style="width:113px"> - <img src="{@docRoot}images/distribute/stories/two-dots-icon.png" - height="113" /> -</div> - -<p> - <a class="external-link" - href="https://play.google.com/store/apps/details?id=com.weplaydots.twodotsandroid&hl=en"> - Two Dots</a>, the sequel to the popular game - <a class="external-link" - href="https://play.google.com/store/apps/details?id=com.nerdyoctopus.gamedots&hl=en"> - Dots</a>, is a free-to-play puzzle game launched by Playdots, Inc. in May - 2014. Since launch it has gained over 30 million downloads, seen over five - billion games played, and achieved 15 times the revenue of the original Dots - game within a year. Dots decided to use - <a class="external-link" - href="https://support.google.com/googleplay/android-developer/answer/6227309"> - Store Listing Experiments</a> to see if adding a call to action in the games' - store listing short descriptions had an impact on installs. - -</p> - -<h3>What they did</h3> - -<p> - Dots used localized store listing experiments in the Google Play Developer - Console to test both games’ short descriptions. They compared the games’ - current descriptions — the control, with no call to action — against variant - descriptions, targeting half of their traffic with the variant descriptions. -</p> - -<h3>Results</h3> - -<p> - The results showed that the addition of a call to action in the short - description had a positive impact on installs. -</p> - - - <img - src="{@docRoot}images/distribute/stories/two-dots-screenshot.png" - srcset= - "{@docRoot}images/distribute/stories/two-dots-screenshot.png 1x - {@docRoot}images/distribute/stories/two-dots-screenshot_2x.png 2x"> - <p class="img-caption"> - Beautifully designed achievements badges encourage unlock - </p> - - -<p> - In Dots, the conversion rate increased by 2 percent with a simple call to - action in the variant text. In Two Dots, where a call to action was combined - with messaging that the game is the “best puzzle game on Android”, conversion - rates increased by 7 percent compared to the control description. -</p> - -<h3>Get started</h3> - -<p> - Learn how to run - <a clas="external-link" - href="https://support.google.com/googleplay/android-developer/answer/6227309"> - Store Listing Experiments</a> and read our best practices for - <a href="https://developer.android.com/distribute/users/experiments.html"> - running successful experiments</a>. -</p> diff --git a/docs/html/distribute/stories/apps/upbeat-games.jd b/docs/html/distribute/stories/games/upbeat-games.jd index 02222d39e686..16a1d51c19c9 100644 --- a/docs/html/distribute/stories/apps/upbeat-games.jd +++ b/docs/html/distribute/stories/games/upbeat-games.jd @@ -1,8 +1,8 @@ page.title=Witch Puzzle Achieves 98% of International Installs on Android page.metaDescription=Witch Puzzle localized their app into 12 languages. -page.tags="developerstory", "apps", "googleplay" +page.tags="developerstory", "games", "googleplay" page.image=images/cards/distribute/stories/witch-puzzle.png -page.timestamp=1468270106 +page.timestamp=1468901832 @jd:body diff --git a/docs/html/distribute/stories/index.jd b/docs/html/distribute/stories/index.jd index 8fe10191247d..1adc5aeb4eba 100644 --- a/docs/html/distribute/stories/index.jd +++ b/docs/html/distribute/stories/index.jd @@ -19,21 +19,43 @@ page.metaDescription=Android developers, their apps, and their successes with An <section class="dac-section dac-small" id="latest-apps"><div class="wrap"> <h2 class="norule">Latest from apps</h2> + <h3 class="norule">Videos</h3> + + <div class="resource-widget resource-flow-layout col-16" + data-query="type:youtube+tag:developerstory+tag:apps" + data-sortOrder="-timestamp" + data-cardSizes="6x6" + data-items-per-page="15" + data-initial-results="6"></div> + + <h3 class="norule">Articles</h3> + <div class="resource-widget resource-flow-layout col-16" - data-query="type:distribute+tag:developerstory+tag:apps, type:youtube+tag:developerstory+tag:apps" + data-query="type:distribute+tag:developerstory+tag:apps" data-sortOrder="-timestamp" data-cardSizes="6x6" data-items-per-page="15" - data-initial-results="9"></div> + data-initial-results="6"></div> </div></section> <section class="dac-section dac-small" id="latest-games"><div class="wrap"> <h2 class="norule">Latest from games</h2> + <h3 class="norule">Videos</h3> + + <div class="resource-widget resource-flow-layout col-16" + data-query="type:youtube+tag:developerstory+tag:games" + data-sortOrder="-timestamp" + data-cardSizes="6x6" + data-items-per-page="15" + data-initial-results="6"></div> + + <h3 class="norule">Articles</h3> + <div class="resource-widget resource-flow-layout col-16" - data-query="type:distribute+tag:developerstory+tag:games,type:youtube+tag:developerstory+tag:games" + data-query="type:distribute+tag:developerstory+tag:games" data-sortOrder="-timestamp" data-cardSizes="6x6" data-items-per-page="15" - data-initial-results="9"></div> + data-initial-results="6"></div> </div></section> diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd index 10841d675834..9b32244b736f 100755 --- a/docs/html/guide/topics/manifest/uses-feature-element.jd +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -1230,7 +1230,7 @@ densities: '160' </p> <p> - When declared as required, this feature indicates that the app is + By default, your app requires this feature. This feature indicates that the app is compatible with a device only if that device emulates a touchscreen ("fake touch" interface) or has an actual touchscreen. </p> @@ -1240,19 +1240,12 @@ densities: '160' that emulates a subset of a touchscreen's capabilities. For example, a mouse or remote control could drive an on-screen cursor. If your app requires basic point and click interaction (in other words, it won't work - with only a d-pad controller), you should declare this feature. Because + with only a d-pad controller), you should declare this feature or simply + avoid declaring any {@code android.hardware.touchscreen.*} features. Because this is the minimum level of touch interaction, you can also use an app that declares this feature on devices that offer more complex touch interfaces. </p> - - <p class="note"> - <strong>Note:</strong> Apps require the {@code android.hardware.touchscreen} - feature by default. If you want your app to be available to devices that - provide a fake touch interface, you must also explicitly declare that a - touchscreen is not required as follows: - </p> - <pre><uses-feature android:name="android.hardware.touchscreen" <strong>android:required="false"</strong> /></pre> </dd> <dt> @@ -1327,21 +1320,9 @@ densities: '160' </p> <p> - By default, your app requires this feature. As such, your app is not - available to devices that provide only an emulated touch interface ("fake - touch") by default. If you want to make your app available on devices - that provide a fake touch interface (or even on devices that provide only - a d-pad controller), you must explicitly declare that a touchscreen is - not required by declaring {@code android.hardware.touchscreen} with - {@code android:required="false"}. You should add this declaration if your - app uses—but does not require—a real touchscreen interface. - </p> - - <p> If your app in fact requires a touch interface (to perform more advanced - touch gestures such as fling), then you don't need to declare any touch - interface features because they're required by default. However, it's - best if you explicitly declare all features that your app uses. + touch gestures such as fling), then you must explicitly declare this feature + or any advanced touchscreen features. </p> <p> diff --git a/docs/html/topic/arc/_book.yaml b/docs/html/topic/arc/_book.yaml new file mode 100644 index 000000000000..ad83ba998138 --- /dev/null +++ b/docs/html/topic/arc/_book.yaml @@ -0,0 +1,9 @@ +toc: +- title: Optimize Apps for Chromebooks + path: /topic/arc/index.html +- title: Loading Apps on Chromebooks + path: /topic/arc/sideload.html +- title: Chrome OS Device Support for Apps + path: /topic/arc/device-support.html +- title: App Manifest Compatibility for Chromebooks + path: /topic/arc/manifest.html
\ No newline at end of file diff --git a/docs/html/training/_book.yaml b/docs/html/training/_book.yaml index 0523ec9e12b0..891574fbc6ca 100644 --- a/docs/html/training/_book.yaml +++ b/docs/html/training/_book.yaml @@ -1384,6 +1384,11 @@ toc: path_attributes: - name: description value: How to use the SafetyNet service to analyze a device where your app is running and get information about its compatibility with your app. + - title: Checking URLs with the Safe Browsing API + path: /training/safebrowsing/index.html + path_attributes: + - name: description + value: How to use the SafetyNet service to determine if a URL is designated as a known threat. - title: Verifying Hardware-backed Key Pairs with Key Attestation path: /training/articles/security-key-attestation.html path_attributes: diff --git a/docs/html/training/safebrowsing/index.jd b/docs/html/training/safebrowsing/index.jd new file mode 100644 index 000000000000..c6c72bfd1460 --- /dev/null +++ b/docs/html/training/safebrowsing/index.jd @@ -0,0 +1,315 @@ +page.title=Checking URLs with the Safe Browsing API + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> + <h2> + In this document + </h2> + + <ol> + <li> + <a href="#tos">Terms of Service</a> + </li> + + <li> + <a href="#api-key">Requesting and Registering an Android API Key</a> + <ol> + <li> + <a href="#manifest">Adding the Android API to your + AndroidManifest.xml</a> + </li> + </ol> + </li> + + <li> + <a href="#connect-google-play">Connect to Google Play Services</a> + </li> + + <li> + <a href="#url-check">Requesting a URL Check</a> + <ol> + <li> + <a href="#threat-types">Specifying threat types of interest</a> + </li> + + <li> + <a href="#url-check-request">Send the URL check request</a> + </li> + + <li> + <a href="#url-check-response">Read the URL check response</a> + </li> + </ol> + </li> + + <li> + <a href="#warning-lang">Suggested Warning Language</a> + </li> + </ol> + </div> +</div> + +<p> + SafetyNet provides services for determining whether a URL has been marked as + a known threat by Google. +</p> + +<p> + The service provides an API your app can use to determine whether a + particular URL has been classified by Google as a known threat. Internally, + SafetyNet implements a client for the Safe Browsing Network Protocol v4 + developed by Google. Both the client code and the v4 network protocol were + designed to preserve users' privacy, as well as keep battery and bandwidth + consumption to a minimum. This API allows you to take full advantage of + Google's Safe Browsing service on Android in the most resource-optimized way, + and without having to implement its network protocol. +</p> + +<p> + This document shows you how to use SafetyNet for checking a URL for threat + types of interest. +</p> + +<h2 id="tos"> + Terms of Service +</h2> + +<p> + By using the Safe Browsing API, you consent to be bound by the <a href= + "https://developers.google.com/safe-browsing/terms">Terms of Service</a>. + Please read and understand all applicable terms and policies before accessing + the Safe Browsing API. +</p> + +<h2 id="api-key"> + Requesting and Registering an Android API Key +</h2> + +<p> + To create an API key, complete the following steps: +</p> + +<ol> + <li>Go to the <a href="https://console.developers.google.com/project" + class="external-link">Google Developers Console</a>. + </li> + + <li>On the upper toolbar, choose <strong>Select a project > + <em>your-project-name</em></strong>. + </li> + + <li>In the search box, enter <em>Safe Browsing APIs</em>; when the Safe + Browsing API name appears in the table, select it. + </li> + + <li>After the page redisplays, select <strong>Enable</strong> then select + <strong>Go to Credentials</strong>. + </li> + + <li>When the <em>Add credentials to your project</em> window appears, choose + your parameters then select <strong>What credentials do I need?</strong>. + </li> + + <li>Enter a name for your API key then select <strong>Create API + key</strong>. + </li> + + <li> + <p> + Your new API key appears; copy and paste this key for future use. + </p> + + <p class="note"> + <strong>Note:</strong> Your API key allows you to perform a URL check + 10,000 times each day. The key, in this instance, should just be a + hexadecimal string, not part of a URL. + </p> + </li> + + <li>Select <strong>Done</strong> to complete the process. + </li> +</ol> + +<p> + If you need more help, check out the <a href= + "https://developers.google.com/console/help/new/">Google Developers Console + Help Center</a>. +</p> + +<h3 id="manifest"> + Adding the Android API key to your AndroidManifest.xml +</h3> + +<p> + Once your key has been whitelisted, you need to add the key to the + <code>AndroidManifest.xml</code> file for your app: +</p> + +<pre> +<application> + + ... + + <!-- SafetyNet API metadata --> + <meta-data android:name="com.google.android.safetynet.API_KEY" + android:value="<var>your-API-key</var>" /> + + ... + +</application> +</pre> +<h2 id="connect-google-play"> + Connect to Google Play Services +</h2> + +<p> + The SafetyNet API is part of Google Play services. To connect to the API, you + need to create an instance of the Google Play services API client. For + details about using the client in your app, see <a href= + "https://developers.google.com/android/guides/api-client#Starting">Accessing + Google APIs</a>. Once you have established a connection to Google Play + services, you can use the Google API client classes to connect to the + SafetyNet API. +</p> + +<p> + To connect to the API, in your activity's <code><a href= + "{@docRoot}reference/android/app/Activity.html#onCreate(android.os.Bundle)">onCreate()</a></code> + method, create an instance of Google API Client using <code><a href= + "https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.Builder"> + GoogleApiClient.Builder</a></code>. Use the builder to add the SafetyNet API, + as shown in the following code example: +</p> + +<pre> +protected synchronized void buildGoogleApiClient() { + mGoogleApiClient = new GoogleApiClient.Builder(this) + .addApi(SafetyNet.API) + .addConnectionCallbacks(myMainActivity.this) + .build(); +} +</pre> +<p class="note"> + <strong>Note:</strong> You can only call these methods after your app has + established a connection to Google Play services by receiving the <code> + <a href="https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient.ConnectionCallbacks#public-methods"> + onConnected()</a></code> callback. For details about listening for a completed + client connection, see <a href= + "https://developers.google.com/android/guides/api-client#Starting">Accessing + Google APIs</a>. +</p> + +<h2 id="url-check"> + Requesting a URL Check +</h2> + +<p> + A URL check allows your app to determine if a URL has been marked as a threat + of interest. Some threat types may not be of interest to your particular + app, and the API allows you to choose which threat types are important for + your needs. You can specify multiple threat types of interest. +</p> + +<h3 id="threat-types"> + Specifying threat types of interest +</h3> + +<p> + The constants in the {@code SafeBrowsingThreat} class contain the + currently-supported threat types: +</p> + +<pre> +package com.google.android.gms.safetynet; + +public class SafeBrowsingThreat { + + /** + * This threat type identifies URLs of pages that are flagged as containing potentially + * harmful applications. + */ + public static final int TYPE_POTENTIALLY_HARMFUL_APPLICATION = 4; + + /** + * This threat type identifies URLs of pages that are flagged as containing social + * engineering threats. + */ + public static final int TYPE_SOCIAL_ENGINEERING = 5; +} +</pre> +<p> + When using the API, you must use constants that are not marked as deprecated. + You add threat type constants as arguments to the API. You may add as many + threat type constants as is required for your app. +</p> + +<h3 id="url-check-request"> + Send the URL check request +</h3> + +<p> + The API is agnostic to the scheme used, so you can pass the URL with or + without a scheme. For example, either +</p> + +<pre> +String url = "https://www.google.com"; +</pre> +<p> + or +</p> + +<pre> +String url = "www.google.com"; +</pre> +<p> + is valid. +</p> + +<pre> +SafetyNet.SafetyNetApi.lookupUri(mGoogleApiClient, url, + SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION, + SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING) + .setResultCallback( + new ResultCallback<SafetyNetApi.SafeBrowsingResult>() { + + @Override + public void onResult(SafetyNetApi.SafeBrowsingResult result) { + Status status = result.getStatus(); + if ((status != null) && status.isSuccess()) { + // Indicates communication with the service was successful. + // Identify any detected threats. + if (result.getDetectedThreats().isEmpty()) { + + } + } else { + // An error occurred. Let the user proceed without warning. + } + } +}); +</pre> +<h3 id="url-check-response"> + Read the URL check response +</h3> + +<p> + The result is provided as a list of {@code SafeBrowsingThreat} objects by + calling the {@code SafetyNetApi.SafeBrowsingResult.getDetectedThreats()} + method of the returned {@code SafetyNetApi.SafeBrowsingResult} object. If the + list is empty, no threats were detected; otherwise, calling {@code + SafeBrowsingThreat.getThreatType()} on each element in the list enumerates + the threats that were detected. +</p> + +<h2 id="warning-lang"> + Suggested Warning Language +</h2> + +<p> + Please see the Safe Browsing API Developer's Guide for <a href= + "https://developers.google.com/safe-browsing/v4/usage-limits#suggested--warning-language"> + suggested warning language</a>. +</p>
\ No newline at end of file diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 1fdc1f575bd4..49721cf42666 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -1667,10 +1667,10 @@ public final class Bitmap implements Parcelable { * and therefore is harmless. */ public void prepareToDraw() { - // TODO: Consider having this start an async upload? - // With inPurgeable no-op'd there's currently no use for this - // method, but it could have interesting future uses. checkRecycled("Can't prepareToDraw on a recycled bitmap!"); + // Kick off an update/upload of the bitmap outside of the normal + // draw path. + nativePrepareToDraw(mNativePtr); } /** @@ -1741,4 +1741,5 @@ public final class Bitmap implements Parcelable { private static native void nativeSetHasMipMap(long nativeBitmap, boolean hasMipMap); private static native boolean nativeSameAs(long nativeBitmap0, long nativeBitmap1); private static native long nativeRefPixelRef(long nativeBitmap); + private static native void nativePrepareToDraw(long nativeBitmap); } diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index cbef540562e1..ed40b77be4a4 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -571,13 +571,12 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>If this method returns {@code null}, and the spec is used to generate an asymmetric (RSA * or EC) key pair, the public key will have a self-signed certificate if it has purpose {@link - * KeyProperties#PURPOSE_SIGN} (see {@link #KeyGenParameterSpec(String, int)). If does not have - * purpose {@link KeyProperties#PURPOSE_SIGN}, it will have a fake certificate. + * KeyProperties#PURPOSE_SIGN}. If does not have purpose {@link KeyProperties#PURPOSE_SIGN}, it + * will have a fake certificate. * * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a - * {@link KeyGenParameterSpec} with {@link #hasAttestationCertificate()} returning - * non-{@code null} is used to generate a symmetric (AES or HMAC) key, - * {@link KeyGenerator#generateKey())} will throw + * KeyGenParameterSpec with getAttestationChallenge returning non-null is used to generate a + * symmetric (AES or HMAC) key, {@link javax.crypto.KeyGenerator#generateKey()} will throw * {@link java.security.InvalidAlgorithmParameterException}. * * @see Builder#setAttestationChallenge(byte[]) @@ -1050,11 +1049,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { return this; } - /* - * TODO(swillden): Update this documentation to describe the hardware and software root - * keys, including information about CRL/OCSP services for discovering revocations, and to - * link to documentation of the extension format and content. - */ /** * Sets whether an attestation certificate will be generated for this key pair, and what * challenge value will be placed in the certificate. The attestation certificate chain @@ -1074,17 +1068,15 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>If {@code attestationChallenge} is {@code null}, and this spec is used to generate an * asymmetric (RSA or EC) key pair, the public key certificate will be self-signed if the - * key has purpose {@link KeyProperties#PURPOSE_SIGN} (see - * {@link #KeyGenParameterSpec(String, int)). If the key does not have purpose - * {@link KeyProperties#PURPOSE_SIGN}, it is not possible to use the key to sign a - * certificate, so the public key certificate will contain a dummy signature. + * key has purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}. If the key + * does not have purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}, it is + * not possible to use the key to sign a certificate, so the public key certificate will + * contain a dummy signature. * * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a - * {@code getAttestationChallenge} returns non-{@code null} and the spec is used to - * generate a symmetric (AES or HMAC) key, {@link KeyGenerator#generateKey()} will throw + * {@link #getAttestationChallenge()} returns non-null and the spec is used to generate a + * symmetric (AES or HMAC) key, {@link javax.crypto.KeyGenerator#generateKey()} will throw * {@link java.security.InvalidAlgorithmParameterException}. - * - * @see Builder#setAttestationChallenge(String attestationChallenge) */ @NonNull public Builder setAttestationChallenge(byte[] attestationChallenge) { diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index ade8600ab78b..523924af5ef1 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -167,6 +167,10 @@ bool TextureCache::prefetchAndMarkInUse(void* ownerToken, const SkBitmap* bitmap return texture; } +bool TextureCache::prefetch(const SkBitmap* bitmap) { + return getCachedTexture(bitmap, AtlasUsageType::Use); +} + Texture* TextureCache::get(const SkBitmap* bitmap, AtlasUsageType atlasUsageType) { Texture* texture = getCachedTexture(bitmap, atlasUsageType); diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h index a4317cee73fd..0a61b6b1a522 100644 --- a/libs/hwui/TextureCache.h +++ b/libs/hwui/TextureCache.h @@ -78,6 +78,13 @@ public: bool prefetchAndMarkInUse(void* ownerToken, const SkBitmap* bitmap); /** + * Attempts to precache the SkBitmap. Returns true if a Texture was successfully + * acquired for the bitmap, false otherwise. Does not mark the Texture + * as in use and won't update currently in-use Textures. + */ + bool prefetch(const SkBitmap* bitmap); + + /** * Returns the texture associated with the specified bitmap from either within the cache, or * the AssetAtlas. If the texture cannot be found in the cache, a new texture is generated. */ diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index a3004df9ae0e..5f8c7989c669 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -366,11 +366,16 @@ void CanvasContext::draw() { swap.damage = windowDirty; swap.swapCompletedTime = systemTime(CLOCK_MONOTONIC); swap.vsyncTime = mRenderThread.timeLord().latestVsync(); - int durationUs; - mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs); - swap.dequeueDuration = us2ns(durationUs); - mNativeSurface->query(NATIVE_WINDOW_LAST_QUEUE_DURATION, &durationUs); - swap.queueDuration = us2ns(durationUs); + if (mNativeSurface.get()) { + int durationUs; + mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs); + swap.dequeueDuration = us2ns(durationUs); + mNativeSurface->query(NATIVE_WINDOW_LAST_QUEUE_DURATION, &durationUs); + swap.queueDuration = us2ns(durationUs); + } else { + swap.dequeueDuration = 0; + swap.queueDuration = 0; + } mCurrentFrameInfo->set(FrameInfoIndex::DequeueBufferDuration) = swap.dequeueDuration; mCurrentFrameInfo->set(FrameInfoIndex::QueueBufferDuration) diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index ad1af4043d10..d6eea877de0c 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -21,9 +21,11 @@ #include "Readback.h" #include "Rect.h" #include "renderthread/CanvasContext.h" +#include "renderthread/EglManager.h" #include "renderthread/RenderTask.h" #include "renderthread/RenderThread.h" #include "utils/Macros.h" +#include "utils/TimeUtils.h" namespace android { namespace uirenderer { @@ -43,6 +45,8 @@ namespace renderthread { typedef struct { \ a1; a2; a3; a4; a5; a6; a7; a8; \ } ARGS(name); \ + static_assert(std::is_trivially_destructible<ARGS(name)>::value, \ + "Error, ARGS must be trivially destructible!"); \ static void* Bridge_ ## name(ARGS(name)* args) #define SETUP_TASK(method) \ @@ -628,6 +632,41 @@ int RenderProxy::copySurfaceInto(sp<Surface>& surface, SkBitmap* bitmap) { reinterpret_cast<intptr_t>( staticPostAndWait(task) )); } +CREATE_BRIDGE2(prepareToDraw, RenderThread* thread, SkBitmap* bitmap) { + if (Caches::hasInstance() && args->thread->eglManager().hasEglContext()) { + ATRACE_NAME("Bitmap#prepareToDraw task"); + Caches::getInstance().textureCache.prefetch(args->bitmap); + } + delete args->bitmap; + args->bitmap = nullptr; + return nullptr; +} + +void RenderProxy::prepareToDraw(const SkBitmap& bitmap) { + // If we haven't spun up a hardware accelerated window yet, there's no + // point in precaching these bitmaps as it can't impact jank. + // We also don't know if we even will spin up a hardware-accelerated + // window or not. + if (!RenderThread::hasInstance()) return; + RenderThread* renderThread = &RenderThread::getInstance(); + SETUP_TASK(prepareToDraw); + args->thread = renderThread; + args->bitmap = new SkBitmap(bitmap); + nsecs_t lastVsync = renderThread->timeLord().latestVsync(); + nsecs_t estimatedNextVsync = lastVsync + renderThread->timeLord().frameIntervalNanos(); + nsecs_t timeToNextVsync = estimatedNextVsync - systemTime(CLOCK_MONOTONIC); + // We expect the UI thread to take 4ms and for RT to be active from VSYNC+4ms to + // VSYNC+12ms or so, so aim for the gap during which RT is expected to + // be idle + // TODO: Make this concept a first-class supported thing? RT could use + // knowledge of pending draws to better schedule this task + if (timeToNextVsync > -6_ms && timeToNextVsync < 1_ms) { + renderThread->queueAt(task, estimatedNextVsync + 8_ms); + } else { + renderThread->queue(task); + } +} + void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 0bee858a84fa..d8129705b940 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -128,6 +128,7 @@ public: ANDROID_API long getDroppedFrameReportCount(); ANDROID_API static int copySurfaceInto(sp<Surface>& surface, SkBitmap* bitmap); + ANDROID_API static void prepareToDraw(const SkBitmap& bitmap); private: RenderThread& mRenderThread; diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index dad670180ada..591ceba371f7 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -1169,7 +1169,7 @@ public class ExifInterface { }; // List of indices of the indicated tag groups according to the EXIF_POINTER_TAGS private static final int[] EXIF_POINTER_TAG_HINTS = new int[] { - IFD_TIFF_HINT, IFD_EXIF_HINT, IFD_GPS_HINT, IFD_INTEROPERABILITY_HINT, + IFD_PREVIEW_HINT, IFD_EXIF_HINT, IFD_GPS_HINT, IFD_INTEROPERABILITY_HINT, ORF_CAMERA_SETTINGS_HINT, ORF_IMAGE_PROCESSING_HINT }; // Tags for indicating the thumbnail offset and length @@ -2298,35 +2298,15 @@ public class ExifInterface { parseTiffHeaders(dataInputStream, exifBytes.length); // Read TIFF image file directories. See JEITA CP-3451C Section 4.5.2. Figure 6. - readImageFileDirectory(dataInputStream, IFD_PREVIEW_HINT); - - // Check if the preview image data should be a primary image data. - // The 0th IFD (first to be parsed) is presumed to be a preview image data, with a SubIFD - // that is a primary image data. - // But if the 0th IFD does not have a SubIFD, then it must be a primary image data since - // a primary image data must exist, but a preview image data does not have to. - if (mAttributes[IFD_TIFF_HINT].isEmpty() && !mAttributes[IFD_PREVIEW_HINT].isEmpty()) { - mAttributes[IFD_TIFF_HINT] = mAttributes[IFD_PREVIEW_HINT]; - mAttributes[IFD_PREVIEW_HINT] = new HashMap(); - } - - // Update TAG_IMAGE_WIDTH and TAG_IMAGE_LENGTH for primary image. - updatePrimaryImageSizeValues(in); - - // Check if the preview image data should be a thumbnail image data. - // In a RAW file, there may be a preview image, which is smaller than a primary image but - // larger than a thumbnail image. Normally, the preview image can be considered a thumbnail - // image if its size meets the requirements. Therefore, when a thumbnail image has not yet - // been found, we should check if the preview image can be one. - if (!mAttributes[IFD_PREVIEW_HINT].isEmpty() && mAttributes[IFD_THUMBNAIL_HINT].isEmpty()) { - // Update preview image size if necessary - retrieveJpegImageSize(in, IFD_PREVIEW_HINT); + readImageFileDirectory(dataInputStream, IFD_TIFF_HINT); - if (isThumbnail(mAttributes[IFD_PREVIEW_HINT])) { - mAttributes[IFD_THUMBNAIL_HINT] = mAttributes[IFD_PREVIEW_HINT]; - mAttributes[IFD_PREVIEW_HINT] = new HashMap(); - } - } + // Update ImageLength/Width tags for all image data. + updateImageSizeValues(in, IFD_TIFF_HINT); + updateImageSizeValues(in, IFD_PREVIEW_HINT); + updateImageSizeValues(in, IFD_THUMBNAIL_HINT); + + // Check if each image data is in valid position. + validateImages(in); if (mMimeType == IMAGE_TYPE_PEF) { // PEF files contain a MakerNote data, which contains the data for ColorSpace tag. @@ -2923,6 +2903,8 @@ public class ExifInterface { if (mAttributes[IFD_THUMBNAIL_HINT].isEmpty()) { // Do not overwrite thumbnail IFD data if it alreay exists. readImageFileDirectory(dataInputStream, IFD_THUMBNAIL_HINT); + } else if (mAttributes[IFD_PREVIEW_HINT].isEmpty()) { + readImageFileDirectory(dataInputStream, IFD_PREVIEW_HINT); } } } @@ -3081,6 +3063,28 @@ public class ExifInterface { return false; } + // Validate primary, preview, thumbnail image data by comparing image size + private void validateImages(InputStream in) throws IOException { + // Swap images based on size (primary > preview > thumbnail) + swapBasedOnImageSize(IFD_TIFF_HINT, IFD_PREVIEW_HINT); + swapBasedOnImageSize(IFD_TIFF_HINT, IFD_THUMBNAIL_HINT); + swapBasedOnImageSize(IFD_PREVIEW_HINT, IFD_THUMBNAIL_HINT); + + // Check whether thumbnail image exists and whether preview image satisfies the thumbnail + // image requirements + if (mAttributes[IFD_THUMBNAIL_HINT].isEmpty()) { + if (isThumbnail(mAttributes[IFD_PREVIEW_HINT])) { + mAttributes[IFD_THUMBNAIL_HINT] = mAttributes[IFD_PREVIEW_HINT]; + mAttributes[IFD_PREVIEW_HINT] = new HashMap(); + } + } + + // Check if the thumbnail image satisfies the thumbnail size requirements + if (!isThumbnail(mAttributes[IFD_THUMBNAIL_HINT])) { + Log.d(TAG, "No image meets the size requirements of a thumbnail image."); + } + } + /** * If image is uncompressed, ImageWidth/Length tags are used to store size info. * However, uncompressed images often store extra pixels around the edges of the final image, @@ -3098,24 +3102,19 @@ public class ExifInterface { * If image is a RW2 file, valid image sizes are stored in SensorBorder tags. * See tiff_parser.cc GetFullDimension32() * */ - private void updatePrimaryImageSizeValues(InputStream in) throws IOException { + private void updateImageSizeValues(InputStream in, int imageType) throws IOException { // Uncompressed image valid image size values ExifAttribute defaultCropSizeAttribute = - (ExifAttribute) mAttributes[IFD_TIFF_HINT].get(TAG_DEFAULT_CROP_SIZE); - // Compressed image valid image size values - ExifAttribute pixelXDimAttribute = - (ExifAttribute) mAttributes[IFD_EXIF_HINT].get(TAG_PIXEL_X_DIMENSION); - ExifAttribute pixelYDimAttribute = - (ExifAttribute) mAttributes[IFD_EXIF_HINT].get(TAG_PIXEL_Y_DIMENSION); + (ExifAttribute) mAttributes[imageType].get(TAG_DEFAULT_CROP_SIZE); // RW2 image valid image size values ExifAttribute topBorderAttribute = - (ExifAttribute) mAttributes[IFD_TIFF_HINT].get(TAG_RW2_SENSOR_TOP_BORDER); + (ExifAttribute) mAttributes[imageType].get(TAG_RW2_SENSOR_TOP_BORDER); ExifAttribute leftBorderAttribute = - (ExifAttribute) mAttributes[IFD_TIFF_HINT].get(TAG_RW2_SENSOR_LEFT_BORDER); + (ExifAttribute) mAttributes[imageType].get(TAG_RW2_SENSOR_LEFT_BORDER); ExifAttribute bottomBorderAttribute = - (ExifAttribute) mAttributes[IFD_TIFF_HINT].get(TAG_RW2_SENSOR_BOTTOM_BORDER); + (ExifAttribute) mAttributes[imageType].get(TAG_RW2_SENSOR_BOTTOM_BORDER); ExifAttribute rightBorderAttribute = - (ExifAttribute) mAttributes[IFD_TIFF_HINT].get(TAG_RW2_SENSOR_RIGHT_BORDER); + (ExifAttribute) mAttributes[imageType].get(TAG_RW2_SENSOR_RIGHT_BORDER); if (defaultCropSizeAttribute != null) { // Update for uncompressed image @@ -3135,8 +3134,8 @@ public class ExifInterface { defaultCropSizeYAttribute = ExifAttribute.createUShort(defaultCropSizeValue[1], mExifByteOrder); } - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_WIDTH, defaultCropSizeXAttribute); - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_LENGTH, defaultCropSizeYAttribute); + mAttributes[imageType].put(TAG_IMAGE_WIDTH, defaultCropSizeXAttribute); + mAttributes[imageType].put(TAG_IMAGE_LENGTH, defaultCropSizeYAttribute); } else if (topBorderAttribute != null && leftBorderAttribute != null && bottomBorderAttribute != null && rightBorderAttribute != null) { // Update for RW2 image @@ -3151,17 +3150,24 @@ public class ExifInterface { ExifAttribute.createUShort(length, mExifByteOrder); ExifAttribute imageWidthAttribute = ExifAttribute.createUShort(width, mExifByteOrder); - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_LENGTH, imageLengthAttribute); - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_WIDTH, imageWidthAttribute); + mAttributes[imageType].put(TAG_IMAGE_LENGTH, imageLengthAttribute); + mAttributes[imageType].put(TAG_IMAGE_WIDTH, imageWidthAttribute); } } else { // Update for JPEG image - if (pixelXDimAttribute != null && pixelYDimAttribute != null) { - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_WIDTH, pixelXDimAttribute); - mAttributes[IFD_TIFF_HINT].put(TAG_IMAGE_LENGTH, pixelYDimAttribute); + if (imageType == IFD_TIFF_HINT) { + ExifAttribute pixelXDimAttribute = + (ExifAttribute) mAttributes[IFD_EXIF_HINT].get(TAG_PIXEL_X_DIMENSION); + ExifAttribute pixelYDimAttribute = + (ExifAttribute) mAttributes[IFD_EXIF_HINT].get(TAG_PIXEL_Y_DIMENSION); + if (pixelXDimAttribute != null && pixelYDimAttribute != null) { + mAttributes[imageType].put(TAG_IMAGE_WIDTH, pixelXDimAttribute); + mAttributes[imageType].put(TAG_IMAGE_LENGTH, pixelYDimAttribute); + } else { + retrieveJpegImageSize(in, imageType); + } } else { - // Update image size values from SOF marker if necessary - retrieveJpegImageSize(in, IFD_TIFF_HINT); + retrieveJpegImageSize(in, imageType); } } } @@ -3654,6 +3660,48 @@ public class ExifInterface { } } + // Swaps image data based on image size + private void swapBasedOnImageSize(int firstImageHint, int secondImageHint) + throws IOException { + if (mAttributes[firstImageHint].isEmpty() || mAttributes[secondImageHint].isEmpty()) { + if (DEBUG) { + Log.d(TAG, "Cannot perform swap since only one image data exists"); + } + return; + } + + ExifAttribute firstImageLengthAttribute = + (ExifAttribute) mAttributes[firstImageHint].get(TAG_IMAGE_LENGTH); + ExifAttribute firstImageWidthAttribute = + (ExifAttribute) mAttributes[firstImageHint].get(TAG_IMAGE_WIDTH); + ExifAttribute secondImageLengthAttribute = + (ExifAttribute) mAttributes[secondImageHint].get(TAG_IMAGE_LENGTH); + ExifAttribute secondImageWidthAttribute = + (ExifAttribute) mAttributes[secondImageHint].get(TAG_IMAGE_WIDTH); + + if (firstImageLengthAttribute == null || firstImageWidthAttribute == null) { + if (DEBUG) { + Log.d(TAG, "First image does not contain valid size information"); + } + } else if (secondImageLengthAttribute == null || secondImageWidthAttribute == null) { + if (DEBUG) { + Log.d(TAG, "Second image does not contain valid size information"); + } + } else { + int firstImageLengthValue = firstImageLengthAttribute.getIntValue(mExifByteOrder); + int firstImageWidthValue = firstImageWidthAttribute.getIntValue(mExifByteOrder); + int secondImageLengthValue = secondImageLengthAttribute.getIntValue(mExifByteOrder); + int secondImageWidthValue = secondImageWidthAttribute.getIntValue(mExifByteOrder); + + if (firstImageLengthValue < secondImageLengthValue && + firstImageWidthValue < secondImageWidthValue) { + HashMap tempMap = mAttributes[firstImageHint]; + mAttributes[firstImageHint] = mAttributes[secondImageHint]; + mAttributes[secondImageHint] = tempMap; + } + } + } + // Checks if there is a match private boolean containsMatch(byte[] mainBytes, byte[] findBytes) { for (int i = 0; i < mainBytes.length - findBytes.length; i++) { diff --git a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml index 20173b0dc3bf..24cbfbd6430e 100644 --- a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml +++ b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml @@ -4,7 +4,7 @@ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string> <string name="action_use_network" msgid="6076184727448466030">"যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন"</string> <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটওয়ার্ক ব্যবহার করবেন না"</string> - <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন করুন"</string> + <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন"</string> <string name="ssl_error_warning" msgid="6653188881418638872">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।"</string> <string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string> <string name="ssl_error_continue" msgid="6492718244923937110">"যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন"</string> diff --git a/packages/SettingsLib/res/values-af/arrays.xml b/packages/SettingsLib/res/values-af/arrays.xml index 13c22c4348a1..de103c9de154 100644 --- a/packages/SettingsLib/res/values-af/arrays.xml +++ b/packages/SettingsLib/res/values-af/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Teken nie-reghoekige knipstreek in blou"</item> <item msgid="1064373276095698656">"Merk getoetsde tekenopdragte in groen"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Af"</item> - <item msgid="2751513398307949636">"Op skerm as balke"</item> - <item msgid="1851438178120770973">"In adb-dop dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Af"</item> <item msgid="7688197031296835369">"Wys oortrekareas"</item> diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index 5767829476ef..affc736636ba 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"አራት ማእዘን ያልሆነ የቅንጥብ ክልልን በሰማያዊ ይሳሉ"</item> <item msgid="1064373276095698656">"የተሞከሩ የስእል ትእዛዞችን በአረንጓዴ ያድምቁ"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ጠፍቷል"</item> - <item msgid="2751513398307949636">"ማያ ገጽ ላይ እንደ አሞሌዎች"</item> - <item msgid="1851438178120770973">"በ adb shell dumpsys gfxinfo ውስጥ"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ጠፍቷል"</item> <item msgid="7688197031296835369">"ስዕሉ አልፎ የፈሰሰባቸው አካባቢዎችን አሳይ"</item> diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml index e3d70fe08843..23f7206213dc 100644 --- a/packages/SettingsLib/res/values-ar/arrays.xml +++ b/packages/SettingsLib/res/values-ar/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"رسم منطقة قصاصة غير مستطيلة بالأزرق"</item> <item msgid="1064373276095698656">"إبراز أوامر رسم تم اختبارها بالأخضر"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"إيقاف"</item> - <item msgid="2751513398307949636">"على الشاشة كأشرطة"</item> - <item msgid="1851438178120770973">"باستخدام adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"إيقاف"</item> <item msgid="7688197031296835369">"عرض مناطق تجاوز الحد"</item> diff --git a/packages/SettingsLib/res/values-az-rAZ/arrays.xml b/packages/SettingsLib/res/values-az-rAZ/arrays.xml index 396dfa114636..26ffbaeb13d4 100644 --- a/packages/SettingsLib/res/values-az-rAZ/arrays.xml +++ b/packages/SettingsLib/res/values-az-rAZ/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Qeyri-düzbucaqlı regionu mavi rəngdə çəkin"</item> <item msgid="1064373276095698656">"Testdən keçmiş çəkmə əmrlərini yaşıl rəng ilə vurğulayın"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Deaktiv"</item> - <item msgid="2751513398307949636">"Ekranda panel şəklində"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Deaktiv"</item> <item msgid="7688197031296835369">"Böyütmə sahələrini göstər"</item> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index 3e9f9045bcdc..04b56edead8b 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Nacrtaj oblast za isecanje koja nije pravougaonog oblika plavom bojom"</item> <item msgid="1064373276095698656">"Istakni zelenom testirane komande za crtanje"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Isključeno"</item> - <item msgid="2751513398307949636">"Na ekranu u vidu traka"</item> - <item msgid="1851438178120770973">"U adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Isključi"</item> <item msgid="7688197031296835369">"Prikaži oblasti preklapanja"</item> diff --git a/packages/SettingsLib/res/values-be-rBY/arrays.xml b/packages/SettingsLib/res/values-be-rBY/arrays.xml index 20106ef70bb8..3f67789da275 100644 --- a/packages/SettingsLib/res/values-be-rBY/arrays.xml +++ b/packages/SettingsLib/res/values-be-rBY/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Намаляваць непрамавугольную вобласць кліпа сінім колерам"</item> <item msgid="1064373276095698656">"Вылучыце выпрабаваныя каманды малявання зялёным колерам"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Выключана"</item> - <item msgid="2751513398307949636">"На экране ў выглядзе слупкоў"</item> - <item msgid="1851438178120770973">"У абалонцы adb dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Адключаны"</item> <item msgid="7688197031296835369">"Паказаць вобласці з перабольшваннем"</item> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index 8e803f5a1df4..63b9d2e01b71 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Начертаване в синьо на неправоъгълна област"</item> <item msgid="1064373276095698656">"Зелено за тествани команди за начертаване"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Изкл."</item> - <item msgid="2751513398307949636">"На екрана като чертички"</item> - <item msgid="1851438178120770973">"В adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Изключено"</item> <item msgid="7688197031296835369">"Области за преизчертаване: Показв."</item> diff --git a/packages/SettingsLib/res/values-bn-rBD/arrays.xml b/packages/SettingsLib/res/values-bn-rBD/arrays.xml index d653a9717e70..d179151447c0 100644 --- a/packages/SettingsLib/res/values-bn-rBD/arrays.xml +++ b/packages/SettingsLib/res/values-bn-rBD/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"নীল বঙের অ-আয়তক্ষেত্রাকার ক্লিপ অঞ্চল অঙ্কন করুন"</item> <item msgid="1064373276095698656">"সবুজ রঙে অঙ্কন করা পরীক্ষিত কমান্ডগুলি হাইলাইট করুন"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"বন্ধ করুন"</item> - <item msgid="2751513398307949636">"দন্ড হিসাবে স্ক্রীনে"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo এ"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"বন্ধ করুন"</item> <item msgid="7688197031296835369">"অতিবর্ণনা এলাকা দেখান"</item> diff --git a/packages/SettingsLib/res/values-bs-rBA/arrays.xml b/packages/SettingsLib/res/values-bs-rBA/arrays.xml index 84526964fb04..72939b346923 100644 --- a/packages/SettingsLib/res/values-bs-rBA/arrays.xml +++ b/packages/SettingsLib/res/values-bs-rBA/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Nacrtaj plavom bojom nepravougaonu oblast za isjecanje"</item> <item msgid="1064373276095698656">"Označite zelenom bojom testirane komande za crtanje"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Isključeno"</item> - <item msgid="2751513398307949636">"Na ekranu u vidu crtica"</item> - <item msgid="1851438178120770973">"U ADB ljuski dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Isključeno"</item> <item msgid="7688197031296835369">"Prikaži overdraw područja"</item> diff --git a/packages/SettingsLib/res/values-ca/arrays.xml b/packages/SettingsLib/res/values-ca/arrays.xml index e4f618e13ead..436d91307137 100644 --- a/packages/SettingsLib/res/values-ca/arrays.xml +++ b/packages/SettingsLib/res/values-ca/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dibuixa àrea retall no rectangular en blau"</item> <item msgid="1064373276095698656">"Ressalta ordres de dibuix provats en verd"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desactivat"</item> - <item msgid="2751513398307949636">"En pantalla en forma de barres"</item> - <item msgid="1851438178120770973">"A adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desactiva"</item> <item msgid="7688197031296835369">"Mostra les àrees superposades"</item> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index fb7180a0a3b8..99850a5d5cd4 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -111,7 +111,7 @@ <string name="tts_play_example_summary" msgid="8029071615047894486">"Reprodueix una breu demostració de síntesi de veu"</string> <string name="tts_install_data_title" msgid="4264378440508149986">"Instal·la dades de veu"</string> <string name="tts_install_data_summary" msgid="5742135732511822589">"Instal·la les dades de veu necessàries per a la síntesi de veu"</string> - <string name="tts_engine_security_warning" msgid="8786238102020223650">"Pot ser que aquest motor de síntesi de la parla pugui recopilar tot el text que es dirà en veu alta, incloses les dades personals, com ara les contrasenyes i els números de les targetes de crèdit. Ve del motor <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>. Voleu activar l\'ús d\'aquest motor de síntesi de la parla?"</string> + <string name="tts_engine_security_warning" msgid="8786238102020223650">"Pot ser que aquest motor de síntesi de la parla pugui recopilar tot el text que es dirà en veu alta, incloses les dades personals, com ara les contrasenyes i els números de les targetes de crèdit. Ve del motor <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g>. Vols activar l\'ús d\'aquest motor de síntesi de la parla?"</string> <string name="tts_engine_network_required" msgid="1190837151485314743">"Aquest idioma requereix una connexió de xarxa activa per a la sortida de síntesi de veu."</string> <string name="tts_default_sample_string" msgid="4040835213373086322">"Això és un exemple de síntesi de veu"</string> <string name="tts_status_title" msgid="7268566550242584413">"Estat de l\'idioma predeterminat"</string> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index b0185e87b600..0de3833893f6 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Vykreslit neobdélníkový výstřižek modře"</item> <item msgid="1064373276095698656">"Zvýraznit testované příkazy vykreslování zeleně"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Vypnuto"</item> - <item msgid="2751513398307949636">"Na obrazovce ve formě sloupců"</item> - <item msgid="1851438178120770973">"V nástroji adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Vypnuto"</item> <item msgid="7688197031296835369">"Zobrazit překreslované oblasti"</item> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index d06f39f34a17..263969ea764d 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Tegn ikke-rektangulært klippeområde med blåt"</item> <item msgid="1064373276095698656">"Fremhæv testede tegnekommandoer med grønt"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Fra"</item> - <item msgid="2751513398307949636">"På skærmen som søjler"</item> - <item msgid="1851438178120770973">"I adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Fra"</item> <item msgid="7688197031296835369">"Vis områder med overlap"</item> diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml index 9a81e8fda6df..8aa9579369ed 100644 --- a/packages/SettingsLib/res/values-de/arrays.xml +++ b/packages/SettingsLib/res/values-de/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Nicht rechteckigen Clipbereich blau zeichnen"</item> <item msgid="1064373276095698656">"Getestete Zeichenbefehle grün hervorheben"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Aus"</item> - <item msgid="2751513398307949636">"Auf Bildschirm als Balken"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Aus"</item> <item msgid="7688197031296835369">"Überschneidungsbereiche anzeigen"</item> diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml index a6ce80ae0d01..6c36f0bc97b7 100644 --- a/packages/SettingsLib/res/values-el/arrays.xml +++ b/packages/SettingsLib/res/values-el/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Σχεδίαση μη ορθογώνιας περιοχής με μπλε χρώμα"</item> <item msgid="1064373276095698656">"Επισ/ση ελεγμένων εντολών με πράσ."</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Απενεργοποιημένο"</item> - <item msgid="2751513398307949636">"Στην οθόνη ως ράβδοι"</item> - <item msgid="1851438178120770973">"Σε adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Ανενεργές"</item> <item msgid="7688197031296835369">"Εμφάνιση περιοχών υπέρβασης"</item> diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml index 2ee613fc0343..996edc1bcfe1 100644 --- a/packages/SettingsLib/res/values-en-rAU/arrays.xml +++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Draw non-rectangular clip region in blue"</item> <item msgid="1064373276095698656">"Highlight tested drawing commands in green"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Off"</item> - <item msgid="2751513398307949636">"On screen as bars"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Off"</item> <item msgid="7688197031296835369">"Show overdraw areas"</item> diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml index 2ee613fc0343..996edc1bcfe1 100644 --- a/packages/SettingsLib/res/values-en-rGB/arrays.xml +++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Draw non-rectangular clip region in blue"</item> <item msgid="1064373276095698656">"Highlight tested drawing commands in green"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Off"</item> - <item msgid="2751513398307949636">"On screen as bars"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Off"</item> <item msgid="7688197031296835369">"Show overdraw areas"</item> diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml index 2ee613fc0343..996edc1bcfe1 100644 --- a/packages/SettingsLib/res/values-en-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Draw non-rectangular clip region in blue"</item> <item msgid="1064373276095698656">"Highlight tested drawing commands in green"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Off"</item> - <item msgid="2751513398307949636">"On screen as bars"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Off"</item> <item msgid="7688197031296835369">"Show overdraw areas"</item> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index eae9b1b30577..1a395dd50984 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Recorte no rectangular en azul"</item> <item msgid="1064373276095698656">"Comandos de dib. probados en verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desactivado"</item> - <item msgid="2751513398307949636">"En pantalla como barras"</item> - <item msgid="1851438178120770973">"Dumpsys gfxinfo en adb shell"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desactivado"</item> <item msgid="7688197031296835369">"Mostrar áreas superpuestas"</item> diff --git a/packages/SettingsLib/res/values-es/arrays.xml b/packages/SettingsLib/res/values-es/arrays.xml index 168f3789719e..2e41d71306de 100644 --- a/packages/SettingsLib/res/values-es/arrays.xml +++ b/packages/SettingsLib/res/values-es/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dibujar región de recorte no rectangular en azul"</item> <item msgid="1064373276095698656">"Resaltar comandos de dibujo probados en verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"No"</item> - <item msgid="2751513398307949636">"En pantalla como barras"</item> - <item msgid="1851438178120770973">"En adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"No"</item> <item msgid="7688197031296835369">"Mostrar áreas sobredibujadas"</item> diff --git a/packages/SettingsLib/res/values-et-rEE/arrays.xml b/packages/SettingsLib/res/values-et-rEE/arrays.xml index 019bf50499ac..e35f840bde85 100644 --- a/packages/SettingsLib/res/values-et-rEE/arrays.xml +++ b/packages/SettingsLib/res/values-et-rEE/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Joonista mittetäisnurkne osa siniselt"</item> <item msgid="1064373276095698656">"Muuda testitud käsud roheliseks"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Väljas"</item> - <item msgid="2751513398307949636">"Ekraanil ribadena"</item> - <item msgid="1851438178120770973">"Adb-kestas dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Väljas"</item> <item msgid="7688197031296835369">"Kuva ülejoonistatud alad"</item> diff --git a/packages/SettingsLib/res/values-eu-rES/arrays.xml b/packages/SettingsLib/res/values-eu-rES/arrays.xml index c6174457ca84..48a59f702110 100644 --- a/packages/SettingsLib/res/values-eu-rES/arrays.xml +++ b/packages/SettingsLib/res/values-eu-rES/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Marraztu ez-angeluzuzena urdinez"</item> <item msgid="1064373276095698656">"Nabarmendu agindu probatuak berdez"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desaktibatuta"</item> - <item msgid="2751513398307949636">"Pantailan barra gisa"</item> - <item msgid="1851438178120770973">"ADB shell dumpsys gfxinfo aginduan"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desaktibatuta"</item> <item msgid="7688197031296835369">"Erakutsi gainidatzi diren eremuak"</item> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index 6dc8491cd589..5c4a9a06493a 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"کشیدن کلیپ قسمت غیر مربعی آبی"</item> <item msgid="1064373276095698656">"هایلایت کردن دستورات کشیدن تستشده به رنگ سبز"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"خاموش"</item> - <item msgid="2751513398307949636">"روی صفحه نمایش بهصورت میلهای"</item> - <item msgid="1851438178120770973">"در adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"غیرفعال"</item> <item msgid="7688197031296835369">"نمایش نواحی بازنویسی"</item> diff --git a/packages/SettingsLib/res/values-fi/arrays.xml b/packages/SettingsLib/res/values-fi/arrays.xml index 3c2fe617c425..d3b0927e5272 100644 --- a/packages/SettingsLib/res/values-fi/arrays.xml +++ b/packages/SettingsLib/res/values-fi/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Piirrä ei-suorakulm. leikealue sinisellä"</item> <item msgid="1064373276095698656">"Korosta testatut piirtokom. vihreällä"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Pois käytöstä"</item> - <item msgid="2751513398307949636">"Ruudulla palkkeina"</item> - <item msgid="1851438178120770973">"Adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Ei käytössä"</item> <item msgid="7688197031296835369">"Näytä päällekkäiset alueet"</item> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index ba25d2752de6..972def4df2e4 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dessiner zone de découpage non rectangulaire en bleu"</item> <item msgid="1064373276095698656">"Surligner en vert les commandes de dessin testées"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Désactivé"</item> - <item msgid="2751513398307949636">"À l\'écran sous forme de barres"</item> - <item msgid="1851438178120770973">"Dans adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Désactivé"</item> <item msgid="7688197031296835369">"Afficher les zones de conflit"</item> diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml index 3340afb9341f..8948930122d5 100644 --- a/packages/SettingsLib/res/values-fr/arrays.xml +++ b/packages/SettingsLib/res/values-fr/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dessiner zone de découpage non rectangulaire en bleu"</item> <item msgid="1064373276095698656">"Surligner en vert les commandes de dessin testées"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Désactivé"</item> - <item msgid="2751513398307949636">"À l\'écran sous forme de barres"</item> - <item msgid="1851438178120770973">"Dans adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Désactivé"</item> <item msgid="7688197031296835369">"Afficher les zones de conflit"</item> diff --git a/packages/SettingsLib/res/values-gl-rES/arrays.xml b/packages/SettingsLib/res/values-gl-rES/arrays.xml index 201cda220d3e..734b529f6b38 100644 --- a/packages/SettingsLib/res/values-gl-rES/arrays.xml +++ b/packages/SettingsLib/res/values-gl-rES/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Área recorte non rectangular azul"</item> <item msgid="1064373276095698656">"Resaltar comandos debuxo en verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desactivado"</item> - <item msgid="2751513398307949636">"En pantalla en forma de barras"</item> - <item msgid="1851438178120770973">"En adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desactivado"</item> <item msgid="7688197031296835369">"Mostrar áreas superpostas"</item> diff --git a/packages/SettingsLib/res/values-gu-rIN/arrays.xml b/packages/SettingsLib/res/values-gu-rIN/arrays.xml index c7461889ac66..77553b043a81 100644 --- a/packages/SettingsLib/res/values-gu-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-gu-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"બિન-લંબચોરસ ક્લિપ પ્રદેશને વાદળીમાં દોરો"</item> <item msgid="1064373276095698656">"પરીક્ષણ કરેલ ડ્રોઇંગ આદેશો લીલામાં હાઇલાઇટ કરો"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"બંધ"</item> - <item msgid="2751513398307949636">"બાર્સ તરીકે સ્ક્રીન પર"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo માં"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"બંધ"</item> <item msgid="7688197031296835369">"ઓવરડ્રો ક્ષેત્રો બતાવો"</item> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 29b6beff427d..7b6ec0c0c140 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"गैर-आयताकार क्लिप क्षेत्र नीले रंग से बनाएं"</item> <item msgid="1064373276095698656">"परीक्षित ड्रॉइंग आदेशों को हरे रंग से हाइलाइट करें"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"बंद"</item> - <item msgid="2751513398307949636">"बार के रूप में स्क्रीन पर"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo में"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"बंद"</item> <item msgid="7688197031296835369">"ओवरड्रॉ क्षेत्रों को दिखाएं"</item> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index a2d253c05a1f..c1beeac030db 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Plavo nepravokutno područje isječka"</item> <item msgid="1064373276095698656">"Istakni testirane naredbe zelenom"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Isključeno"</item> - <item msgid="2751513398307949636">"Na zaslonu u obliku traka"</item> - <item msgid="1851438178120770973">"U naredbi adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Isključeno"</item> <item msgid="7688197031296835369">"Pokaži područja slojnih iscrtavanja"</item> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index 41ce4b06db7d..692b26a3b582 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Nem négyzetes kivágás kékkel"</item> <item msgid="1064373276095698656">"Tesztelt rajzolási parancsok kiemelése zölddel"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Ki"</item> - <item msgid="2751513398307949636">"A képernyőn sávként"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo elemben"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Ki"</item> <item msgid="7688197031296835369">"Tartalom-felülírási területek mutatása"</item> diff --git a/packages/SettingsLib/res/values-hy-rAM/arrays.xml b/packages/SettingsLib/res/values-hy-rAM/arrays.xml index e93cbfcdf547..28e8ba1dfe8b 100644 --- a/packages/SettingsLib/res/values-hy-rAM/arrays.xml +++ b/packages/SettingsLib/res/values-hy-rAM/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Ներկել ոչ ուղղանկյունային կտրվածքի տարածքը կապույտով"</item> <item msgid="1064373276095698656">"Փորձարկված թեստի գունանշումը կանաչով"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Անջատել"</item> - <item msgid="2751513398307949636">"Էկրանի վրա որպես գոտիներ"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo-ում"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Անջատված է"</item> <item msgid="7688197031296835369">"Ցույց տալ գերազանցված հատվածները"</item> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index a6126391c1c3..91fa0d771b99 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Gambar wilayah non-kotak biru"</item> <item msgid="1064373276095698656">"Sorot perintah gambar teruji hijau"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Nonaktif"</item> - <item msgid="2751513398307949636">"Di layar dalam bentuk batang"</item> - <item msgid="1851438178120770973">"Di adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Nonaktif"</item> <item msgid="7688197031296835369">"Tampilkan area overdraw"</item> diff --git a/packages/SettingsLib/res/values-is-rIS/arrays.xml b/packages/SettingsLib/res/values-is-rIS/arrays.xml index 64d4da202059..044f4e23d976 100644 --- a/packages/SettingsLib/res/values-is-rIS/arrays.xml +++ b/packages/SettingsLib/res/values-is-rIS/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Teikna klippt svæði sem ekki er rétthyrnt með bláu"</item> <item msgid="1064373276095698656">"Auðkenna prófaðar teikniskipanir með grænu"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Slökkt"</item> - <item msgid="2751513398307949636">"Á skjánum sem stikur"</item> - <item msgid="1851438178120770973">"Í adb-skel dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Slökkt"</item> <item msgid="7688197031296835369">"Sýna yfirteiknuð svæði"</item> diff --git a/packages/SettingsLib/res/values-it/arrays.xml b/packages/SettingsLib/res/values-it/arrays.xml index e6938e0e33c5..b8c58ad19509 100644 --- a/packages/SettingsLib/res/values-it/arrays.xml +++ b/packages/SettingsLib/res/values-it/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Area ritaglio non rettangolare blu"</item> <item msgid="1064373276095698656">"Evidenzia cmd disegno test in verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"OFF"</item> - <item msgid="2751513398307949636">"Su schermo sotto forma di barre"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"OFF"</item> <item msgid="7688197031296835369">"Mostra aree overdraw"</item> diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml index 7bd46ad3a301..df794d1aad48 100644 --- a/packages/SettingsLib/res/values-iw/arrays.xml +++ b/packages/SettingsLib/res/values-iw/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"שרטט אזור חיתוך שאינו מלבני בצבע כחול"</item> <item msgid="1064373276095698656">"הדגש את פקודות האיור שנבדקות בצבע ירוק"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"כבוי"</item> - <item msgid="2751513398307949636">"במסך כעמודות"</item> - <item msgid="1851438178120770973">"ב-adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"כבוי"</item> <item msgid="7688197031296835369">"הצגת אזורים עם חריגה"</item> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index 5b9b41cf6772..5914f438c3df 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"非矩形クリップ領域を青で描画"</item> <item msgid="1064373276095698656">"テスト済み描画コマンドを緑でハイライト表示"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"OFF"</item> - <item msgid="2751513398307949636">"バーとして画面に表示"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfoを使用"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"OFF"</item> <item msgid="7688197031296835369">"オーバードロー領域の表示"</item> diff --git a/packages/SettingsLib/res/values-ka-rGE/arrays.xml b/packages/SettingsLib/res/values-ka-rGE/arrays.xml index 5e63ddd2578a..8964d33bea40 100644 --- a/packages/SettingsLib/res/values-ka-rGE/arrays.xml +++ b/packages/SettingsLib/res/values-ka-rGE/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"დახატე არა მართკუთხა მოჭრის რეგიონი ლურჯად"</item> <item msgid="1064373276095698656">"ხატვის ტესტირებული ბრძანების მწვანე ფერით მონიშვნა"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"გამორთვა"</item> - <item msgid="2751513398307949636">"ეკრანზე ზოლების სახით"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"გამორთვა"</item> <item msgid="7688197031296835369">"overdraw არეების ჩვენება"</item> diff --git a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml index d1dae8744152..63551cf96cce 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/arrays.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Көкпен тіктөртбұрышты емес кесу аймағын сызу"</item> <item msgid="1064373276095698656">"Жасыл түсті тексерілген сызу пәрмендерін белгілеу"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Өшірулі"</item> - <item msgid="2751513398307949636">"Экранда жолақтар түрінде"</item> - <item msgid="1851438178120770973">"Аdb shell dumpsys gfxinfo арқылы"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Өшірулі"</item> <item msgid="7688197031296835369">"Үстінен бастырылған аймақтарды көрсету"</item> diff --git a/packages/SettingsLib/res/values-km-rKH/arrays.xml b/packages/SettingsLib/res/values-km-rKH/arrays.xml index 17371f6a8df4..a4cdeddf79c9 100644 --- a/packages/SettingsLib/res/values-km-rKH/arrays.xml +++ b/packages/SettingsLib/res/values-km-rKH/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"គូរតំបន់កាត់មិនមែនរាងចតុកោណជាពណ៌ខៀវ"</item> <item msgid="1064373276095698656">"រំលេចពាក្យបញ្ជាគូរបានសាកល្បងជាពណ៌បៃតង"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"បិទ"</item> - <item msgid="2751513398307949636">"លើអេក្រង់ជារបារ"</item> - <item msgid="1851438178120770973">"ក្នុង adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"បិទ"</item> <item msgid="7688197031296835369">"បង្ហាញតំបន់ដែលលើស"</item> diff --git a/packages/SettingsLib/res/values-kn-rIN/arrays.xml b/packages/SettingsLib/res/values-kn-rIN/arrays.xml index 5f6d69976932..30adbfc4d51e 100644 --- a/packages/SettingsLib/res/values-kn-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-kn-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"ಆಯತಾಕಾರವಲ್ಲದ ಕ್ಲಿಪ್ ಸ್ಥಳವನ್ನು ನೀಲಿಯಲ್ಲಿ ಡ್ರಾ ಮಾಡಿ"</item> <item msgid="1064373276095698656">"ಪರೀಕ್ಷಿತ ಚಿತ್ರ ಆದೇಶವನ್ನು ಹಸಿರಿನಲ್ಲಿ ಹೈಲೈಟ್ ಮಾಡಿ"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ಆಫ್"</item> - <item msgid="2751513398307949636">"ಪರದೆಯ ಮೇಲಿನ ಪಟ್ಟಿಗಳು"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ಆಫ್"</item> <item msgid="7688197031296835369">"ಓವರ್ಡ್ರಾ ಪ್ರದೇಶಗಳನ್ನು ತೋರಿಸು"</item> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 596f93e4abad..22264385671f 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"사각형이 아닌 클립 영역을 파란색으로 그립니다."</item> <item msgid="1064373276095698656">"테스트한 그림 그리기 명령을 초록색으로 강조표시합니다."</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"사용 안함"</item> - <item msgid="2751513398307949636">"화면에 막대로 표시"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo에서 사용"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"사용 안함"</item> <item msgid="7688197031296835369">"오버드로 영역 표시"</item> diff --git a/packages/SettingsLib/res/values-ky-rKG/arrays.xml b/packages/SettingsLib/res/values-ky-rKG/arrays.xml index 33a0b5d3e4c0..ebe417c04f21 100644 --- a/packages/SettingsLib/res/values-ky-rKG/arrays.xml +++ b/packages/SettingsLib/res/values-ky-rKG/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Тик бурчтуу эмес кесилген аймакты көк түстө тартуу"</item> <item msgid="1064373276095698656">"Текшерилген тартуу буйруктарын жашыл менен белгилөө"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Өчүк"</item> - <item msgid="2751513398307949636">"Экранда тилке катары"</item> - <item msgid="1851438178120770973">"adb кабыгында dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Өчүк"</item> <item msgid="7688197031296835369">"Үстүнө тартуу аймагын көргөзүү"</item> diff --git a/packages/SettingsLib/res/values-lo-rLA/arrays.xml b/packages/SettingsLib/res/values-lo-rLA/arrays.xml index 7a6b77ac4dc3..f495e8df9a1c 100644 --- a/packages/SettingsLib/res/values-lo-rLA/arrays.xml +++ b/packages/SettingsLib/res/values-lo-rLA/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"ແຕ້ມຄລິບທີ່ບໍ່ແມ່ນສີ່ຫຼ່ຽມເປັນສີຟ້າ"</item> <item msgid="1064373276095698656">"ສະແດງຄຳສັ່ງແຕ້ມທີ່ທົດສອບເປັນສີຂຽວ"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ປິດ"</item> - <item msgid="2751513398307949636">"ເປັນແຖບເທິງໜ້າຈໍ"</item> - <item msgid="1851438178120770973">"ໃນ adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ປິດ"</item> <item msgid="7688197031296835369">"ສະແດງຂອບເຂດການແຕ້ມທັບ"</item> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index 49908ada5c2b..37c4d9635d4f 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Piešti ne stačiak. reg. mėlyna sp."</item> <item msgid="1064373276095698656">"Paryš. išban. pieš. kom. žalia sp."</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Išjungta"</item> - <item msgid="2751513398307949636">"Ekrane (stulpeliai)"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Išjungta"</item> <item msgid="7688197031296835369">"Rodyti perdangos sritis"</item> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index 801de5d8fa4d..ba4a0d044841 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Lieko daļu iekrāsot zilā krāsā"</item> <item msgid="1064373276095698656">"Pārb. zīmēš. kom. iezīmēt zaļu"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Izslēgta"</item> - <item msgid="2751513398307949636">"Ekrānā kā joslas"</item> - <item msgid="1851438178120770973">"Komandā “adb shell dumpsys gfxinfo”"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Izslēgta"</item> <item msgid="7688197031296835369">"Rādīt apgab., kur pārsn. kapacitāte"</item> diff --git a/packages/SettingsLib/res/values-mk-rMK/arrays.xml b/packages/SettingsLib/res/values-mk-rMK/arrays.xml index a72bcd3ad98b..b1c5aa179362 100644 --- a/packages/SettingsLib/res/values-mk-rMK/arrays.xml +++ b/packages/SettingsLib/res/values-mk-rMK/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Нацртај неправоаголен реон со сино"</item> <item msgid="1064373276095698656">"Со зелено тестир. наредби за цртање"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Исклучено"</item> - <item msgid="2751513398307949636">"На екранот како цртички"</item> - <item msgid="1851438178120770973">"Во adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Исклучено"</item> <item msgid="7688197031296835369">"Прикажи пречекорени делови"</item> diff --git a/packages/SettingsLib/res/values-ml-rIN/arrays.xml b/packages/SettingsLib/res/values-ml-rIN/arrays.xml index ac6841eb74fe..3b903bfe182a 100644 --- a/packages/SettingsLib/res/values-ml-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-ml-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"നീലനിറത്തിൽ ചതുരമല്ലാത്ത ക്ലിപ്പ് ഭാഗം വരയ്ക്കുക"</item> <item msgid="1064373276095698656">"പരിശോധിച്ച ഡ്രോയിംഗ് കമാൻഡുകൾ പച്ചനിറത്തിൽ ഹൈലൈറ്റുചെയ്യുക"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ഓഫ്"</item> - <item msgid="2751513398307949636">"സ്ക്രീനിൽ ബാറുകളായി"</item> - <item msgid="1851438178120770973">"adb ഷെൽ dumpsys gfxinfo-യിൽ"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ഓഫ്"</item> <item msgid="7688197031296835369">"ഓവർഡ്രോ ഭാഗങ്ങൾ ദൃശ്യമാക്കുക"</item> diff --git a/packages/SettingsLib/res/values-mn-rMN/arrays.xml b/packages/SettingsLib/res/values-mn-rMN/arrays.xml index e812043b975b..559171ab87dd 100644 --- a/packages/SettingsLib/res/values-mn-rMN/arrays.xml +++ b/packages/SettingsLib/res/values-mn-rMN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Тэгш өнцөгт бус клипийн бүсийг цэнхэрээр зурах"</item> <item msgid="1064373276095698656">"Шалгасан зурах командуудыг ногоон өнгөөр тэмдэглэх"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Идэвхгүй"</item> - <item msgid="2751513398307949636">"Дэлгэц дээр савхаар"</item> - <item msgid="1851438178120770973">"adb шел доторх dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Идэвхгүй"</item> <item msgid="7688197031296835369">"Давхар дүрслэлтэй хэсгийг харуулах"</item> diff --git a/packages/SettingsLib/res/values-mr-rIN/arrays.xml b/packages/SettingsLib/res/values-mr-rIN/arrays.xml index 5de2f4976ae9..b6d62f93c68d 100644 --- a/packages/SettingsLib/res/values-mr-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-mr-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"निळ्या रंगात आयताकार नसलेला क्लिप प्रांत रेखांकित करा"</item> <item msgid="1064373276095698656">"चाचणी केलेले रेखांकित आदेश हिरव्या रंगामध्ये हायलाइट करा"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"बंद"</item> - <item msgid="2751513398307949636">"बार म्हणून स्क्रीनवर"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo मध्ये"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"बंद"</item> <item msgid="7688197031296835369">"अधोरेखांकित क्षेत्रे दर्शवा"</item> diff --git a/packages/SettingsLib/res/values-ms-rMY/arrays.xml b/packages/SettingsLib/res/values-ms-rMY/arrays.xml index d6ea50ccc195..7b344b9d03aa 100644 --- a/packages/SettingsLib/res/values-ms-rMY/arrays.xml +++ b/packages/SettingsLib/res/values-ms-rMY/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Lukis keratan bukan segi empat tepat biru"</item> <item msgid="1064373276095698656">"Serlahkan perintah lukisan diuji hijau"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Mati"</item> - <item msgid="2751513398307949636">"Pada skrin sebagai bar"</item> - <item msgid="1851438178120770973">"Dalam adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Mati"</item> <item msgid="7688197031296835369">"Tunjukkan kawasan lebih lukis"</item> diff --git a/packages/SettingsLib/res/values-my-rMM/arrays.xml b/packages/SettingsLib/res/values-my-rMM/arrays.xml index 7ba8e9495ab0..5a9a3b5c18cf 100644 --- a/packages/SettingsLib/res/values-my-rMM/arrays.xml +++ b/packages/SettingsLib/res/values-my-rMM/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"စတုဂံမဟုတ်သော ဖောက်ရန်အပိုင်းကို အပြာရောင်ဖြင့်ဆွဲပါ"</item> <item msgid="1064373276095698656">"စမ်းသပ်ထားသော ပုံဆွဲရန်ညွှန်ကြားချက်များကို အစိမ်းရောင်ဖြင့် အသားပေး ဖော်ပြပါ"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ပိတ်"</item> - <item msgid="2751513398307949636">"ဖန်သားပြင်ပေါ်မှာ မျဉ်းတန်းကဲ့သို့"</item> - <item msgid="1851438178120770973">"adb shell dumpsys ထဲမှ gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ပိတ်"</item> <item msgid="7688197031296835369">"ရှိရင်းစွဲထက်ပိုသော ဧရိယာများကိုပြရန်"</item> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index bc4ff27d85e8..8131cbfbe087 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Merk urektangulært klippefelt blått"</item> <item msgid="1064373276095698656">"Fremhev testede tegnekommandoer i grønt"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Av"</item> - <item msgid="2751513398307949636">"På skjermen som stolper"</item> - <item msgid="1851438178120770973">"I adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Av"</item> <item msgid="7688197031296835369">"Vis overtrekksområder"</item> diff --git a/packages/SettingsLib/res/values-ne-rNP/arrays.xml b/packages/SettingsLib/res/values-ne-rNP/arrays.xml index 2063f17cc8f6..8612c7362e90 100644 --- a/packages/SettingsLib/res/values-ne-rNP/arrays.xml +++ b/packages/SettingsLib/res/values-ne-rNP/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"गैर आयातकार क्षेत्र नीलो रङमा कोर्नुहोस्"</item> <item msgid="1064373276095698656">"हाइलाइट परीक्षण चित्र कोर्ने आदेशहरू हरियोमा"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"बन्द"</item> - <item msgid="2751513398307949636">"स्क्रिनमा बारको रूपमा"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo मा"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"बन्द"</item> <item msgid="7688197031296835369">"overdraw क्षेत्रहरू देखाउनुहोस्"</item> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index 4cdd4fa559a1..ffc393750f15 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Niet-rechthoekige bijsnijdregio tekenen in blauw"</item> <item msgid="1064373276095698656">"Geteste tekenopdrachten markeren in groen"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Uit"</item> - <item msgid="2751513398307949636">"Op het scherm als balken"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Uit"</item> <item msgid="7688197031296835369">"Gedeeltes met overbelasting weergeven"</item> diff --git a/packages/SettingsLib/res/values-pa-rIN/arrays.xml b/packages/SettingsLib/res/values-pa-rIN/arrays.xml index d0a26c8d40c4..48bf1073f4f2 100644 --- a/packages/SettingsLib/res/values-pa-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-pa-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"ਨੀਲੇ ਵਿੱਚ ਗ਼ੈਰ-ਆਇਤਾਕਾਰ ਕਲਿਪ ਖੇਤਰ ਡ੍ਰਾ ਕਰੋ"</item> <item msgid="1064373276095698656">"ਹਾਈਲਾਈਟ ਜਾਂਚ ਕੀਤੀਆਂ ਡ੍ਰਾਇੰਗ ਕਮਾਂਡਾਂ ਹਰੇ ਵਿੱਚ ਹਨ"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ਬੰਦ"</item> - <item msgid="2751513398307949636">"ਬਾਰਸ ਦੇ ਤੌਰ ਤੇ ਸਕ੍ਰੀਨ ਤੇ"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo ਵਿੱਚ"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ਬੰਦ"</item> <item msgid="7688197031296835369">"ਓਵਰਡ੍ਰਾ ਖੇਤਰ ਦਿਖਾਓ"</item> diff --git a/packages/SettingsLib/res/values-pl/arrays.xml b/packages/SettingsLib/res/values-pl/arrays.xml index ff36e42bdd9b..37b3e3127f68 100644 --- a/packages/SettingsLib/res/values-pl/arrays.xml +++ b/packages/SettingsLib/res/values-pl/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Rysuj nieprostokątny region przycinania na niebiesko"</item> <item msgid="1064373276095698656">"Wyróżnij testowane polecenia rysowania na zielono"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Wyłączone"</item> - <item msgid="2751513398307949636">"Na ekranie w postaci pasków"</item> - <item msgid="1851438178120770973">"W adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Wył."</item> <item msgid="7688197031296835369">"Pokaż przerysowywane obszary"</item> diff --git a/packages/SettingsLib/res/values-pt-rBR/arrays.xml b/packages/SettingsLib/res/values-pt-rBR/arrays.xml index 90f061c0f9b0..afbfedb52d62 100644 --- a/packages/SettingsLib/res/values-pt-rBR/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rBR/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Desenhar região de corte não retangular em azul"</item> <item msgid="1064373276095698656">"Destacar comandos de desenho testados em verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desativado"</item> - <item msgid="2751513398307949636">"Na tela em barras"</item> - <item msgid="1851438178120770973">"Em adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desativado"</item> <item msgid="7688197031296835369">"Mostrar áreas de overdraw"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index 2c8b835838cf..1a0b06d2dcbe 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Desenhar região de clipe não retangular a azul"</item> <item msgid="1064373276095698656">"Realçar comandos de desenho testados a verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desativado"</item> - <item msgid="2751513398307949636">"No ecrã como barras"</item> - <item msgid="1851438178120770973">"Em adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desativado"</item> <item msgid="7688197031296835369">"Mostrar áreas de sobreposição"</item> diff --git a/packages/SettingsLib/res/values-pt/arrays.xml b/packages/SettingsLib/res/values-pt/arrays.xml index 90f061c0f9b0..afbfedb52d62 100644 --- a/packages/SettingsLib/res/values-pt/arrays.xml +++ b/packages/SettingsLib/res/values-pt/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Desenhar região de corte não retangular em azul"</item> <item msgid="1064373276095698656">"Destacar comandos de desenho testados em verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Desativado"</item> - <item msgid="2751513398307949636">"Na tela em barras"</item> - <item msgid="1851438178120770973">"Em adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Desativado"</item> <item msgid="7688197031296835369">"Mostrar áreas de overdraw"</item> diff --git a/packages/SettingsLib/res/values-ro/arrays.xml b/packages/SettingsLib/res/values-ro/arrays.xml index d5574dd226c0..27bdad5c7407 100644 --- a/packages/SettingsLib/res/values-ro/arrays.xml +++ b/packages/SettingsLib/res/values-ro/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Zonă decupare non-rectangulară albastră"</item> <item msgid="1064373276095698656">"Controale de desenare testate, cu verde"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Dezactivat"</item> - <item msgid="2751513398307949636">"Pe ecran ca bare"</item> - <item msgid="1851438178120770973">"În adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Dezactivată"</item> <item msgid="7688197031296835369">"Afișați zonele cu suprapunere"</item> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index 2fff9ddf476c..6a610e23bbf0 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Непрямоугольное усечение синим"</item> <item msgid="1064373276095698656">"Тест. команды рисования зеленым"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Отключить"</item> - <item msgid="2751513398307949636">"На экране в виде полос"</item> - <item msgid="1851438178120770973">"В adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ВЫКЛ"</item> <item msgid="7688197031296835369">"Показывать области наложения"</item> diff --git a/packages/SettingsLib/res/values-si-rLK/arrays.xml b/packages/SettingsLib/res/values-si-rLK/arrays.xml index 518a3300682a..55ba70b21487 100644 --- a/packages/SettingsLib/res/values-si-rLK/arrays.xml +++ b/packages/SettingsLib/res/values-si-rLK/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"ඍජුකෝණාස්ර-නොවන ක්ලිප් ප්රදේශය නිල් පාටින් අදින්න"</item> <item msgid="1064373276095698656">"පරික්ෂා කරන ලද ඇඳීමේ විධාන කොළ පැහැයෙන් ඉස්මතු කරන්න"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"අක්රියයි"</item> - <item msgid="2751513398307949636">"තිරයෙහි පටි ලෙස"</item> - <item msgid="1851438178120770973">"Adb shell dumpsys gfxinfo තුළ"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"අක්රියයි"</item> <item msgid="7688197031296835369">"වැඩිකොට දක්වනවා ඇති ප්රදේශ පෙන්වන්න"</item> diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml index 28480404b4cb..558cee303394 100644 --- a/packages/SettingsLib/res/values-sk/arrays.xml +++ b/packages/SettingsLib/res/values-sk/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Neobdĺžnikový výstrižok modrou"</item> <item msgid="1064373276095698656">"Testované príkazy vykresľovania zelenou"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Vypnuté"</item> - <item msgid="2751513398307949636">"Na obrazovke v podobe stĺpcov"</item> - <item msgid="1851438178120770973">"V adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Vypnuté"</item> <item msgid="7688197031296835369">"Zobraziť oblasti prekreslení"</item> diff --git a/packages/SettingsLib/res/values-sl/arrays.xml b/packages/SettingsLib/res/values-sl/arrays.xml index baa16acba8e0..24c9ff15f00a 100644 --- a/packages/SettingsLib/res/values-sl/arrays.xml +++ b/packages/SettingsLib/res/values-sl/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Izris obm. nepravok. izreza z modro"</item> <item msgid="1064373276095698656">"Ozn. presk. risal. ukazov z zeleno"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Izklopljeno"</item> - <item msgid="2751513398307949636">"Na zaslonu kot vrstice"</item> - <item msgid="1851438178120770973">"V dumpsys gfxinfo lupine adb"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Izklop"</item> <item msgid="7688197031296835369">"Pokaži risanje zunaj vidnega območja"</item> diff --git a/packages/SettingsLib/res/values-sq-rAL/arrays.xml b/packages/SettingsLib/res/values-sq-rAL/arrays.xml index c40ad83466f2..9a0f3a0173a0 100644 --- a/packages/SettingsLib/res/values-sq-rAL/arrays.xml +++ b/packages/SettingsLib/res/values-sq-rAL/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Vizatoje klipin në të kaltër"</item> <item msgid="1064373276095698656">"Thekso komandat në të gjelbër"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Çaktivizuar"</item> - <item msgid="2751513398307949636">"Në ekran si shirita"</item> - <item msgid="1851438178120770973">"Në \"gfxinfo\" për ADB-në"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Çaktivizuar"</item> <item msgid="7688197031296835369">"Shfaq zonat e konfliktit"</item> diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml index 1817558cc892..7594a9a357be 100644 --- a/packages/SettingsLib/res/values-sr/arrays.xml +++ b/packages/SettingsLib/res/values-sr/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Нацртај област за исецање која није правоугаоног облика плавом бојом"</item> <item msgid="1064373276095698656">"Истакни зеленом тестиране команде за цртање"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Искључено"</item> - <item msgid="2751513398307949636">"На екрану у виду трака"</item> - <item msgid="1851438178120770973">"У adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Искључи"</item> <item msgid="7688197031296835369">"Прикажи области преклапања"</item> diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index 9ecedca8429c..f979a41a25ae 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Rita icke-rektangulära urklippsavsnitt i blått"</item> <item msgid="1064373276095698656">"Markera testade ritningskommandon i grönt"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Av"</item> - <item msgid="2751513398307949636">"På skärmen som fält"</item> - <item msgid="1851438178120770973">"I adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Av"</item> <item msgid="7688197031296835369">"Visa områden som överskrider gränsen"</item> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index e2fbfc3ac536..99ec94c5428e 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Chora eneo la klipu lisilo mstatili kwa rangi ya bluu"</item> <item msgid="1064373276095698656">"Angazia amri za michoro iliyojaribiwa kwa rangi ya kijani"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Imezimwa"</item> - <item msgid="2751513398307949636">"Kwenye skrini kama pau"</item> - <item msgid="1851438178120770973">"Katika adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Zima"</item> <item msgid="7688197031296835369">"Onyesha maeneo yaliyoondolewa"</item> diff --git a/packages/SettingsLib/res/values-ta-rIN/arrays.xml b/packages/SettingsLib/res/values-ta-rIN/arrays.xml index fed3cd10b750..c19701130c94 100644 --- a/packages/SettingsLib/res/values-ta-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-ta-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"செவ்வகம் அல்லாத கிளிப் பகுதியை நீல நிறத்தில் வரையவும்"</item> <item msgid="1064373276095698656">"சோதிக்கப்பட்ட வரைதல் கட்டளைகளைப் பச்சை நிறத்தில் தனிப்படுத்தவும்"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"முடக்கத்தில்"</item> - <item msgid="2751513398307949636">"திரையில் பட்டிகளாக"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo இல்"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"முடக்கத்தில்"</item> <item msgid="7688197031296835369">"ஓவர்டிரா பகுதிகளைக் காட்டு"</item> diff --git a/packages/SettingsLib/res/values-te-rIN/arrays.xml b/packages/SettingsLib/res/values-te-rIN/arrays.xml index 482a1da2e8c5..3ccdb7929b04 100644 --- a/packages/SettingsLib/res/values-te-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-te-rIN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"దీర్ఘచతురస్రం కాని క్లిప్ ప్రాంతాన్ని నీలి రంగులో గీయండి"</item> <item msgid="1064373276095698656">"పరీక్షించబడిన డ్రాయింగ్ ఆదేశాలను పచ్చ రంగులో హైలైట్ చేయండి"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ఆఫ్లో ఉంది"</item> - <item msgid="2751513398307949636">"స్క్రీన్లో పట్టీలుగా"</item> - <item msgid="1851438178120770973">"adb షెల్ డంప్సిస్ gfxinfoలో"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ఆఫ్"</item> <item msgid="7688197031296835369">"ఓవర్డ్రా ప్రాంతాలను చూపండి"</item> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index 08caeb6577fb..8ae8aa2089e3 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"วาดคลิปที่ไม่ใช่สี่เหลี่ยมด้วยสีฟ้า"</item> <item msgid="1064373276095698656">"ไฮไลต์คำสั่งวาดที่ทดสอบด้วยสีเขียว"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"ปิด"</item> - <item msgid="2751513398307949636">"เป็นแถบบนหน้าจอ"</item> - <item msgid="1851438178120770973">"ใน adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"ปิด"</item> <item msgid="7688197031296835369">"แสดงพื้นที่การวาดทับ"</item> diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml index a1505dc0a610..4623714034a7 100644 --- a/packages/SettingsLib/res/values-tl/arrays.xml +++ b/packages/SettingsLib/res/values-tl/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Iguhit sa asul ang di-parihabang clip region"</item> <item msgid="1064373276095698656">"I-higlight nang berde ang tested drawing commands"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Naka-off"</item> - <item msgid="2751513398307949636">"Sa screen bilang mga bar"</item> - <item msgid="1851438178120770973">"In adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"I-off"</item> <item msgid="7688197031296835369">"Tingnan ang mga overdraw na bahagi"</item> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index c97e79c33c2f..19b0b92ffc2a 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dikdörtgen olm. kırpma bölgesini mavi çiz"</item> <item msgid="1064373276095698656">"Test edilmiş çizim komutlarını yeşille vurgula"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Kapalı"</item> - <item msgid="2751513398307949636">"Ekranda çubuk şeklinde"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo içinde"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Kapalı"</item> <item msgid="7688197031296835369">"Fazla çizilen alanları göster"</item> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index 7b720f3e9a74..ba2e3487a4f9 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Непрямокутне обрізання синім"</item> <item msgid="1064373276095698656">"Тест. команди малювання зеленим"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Вимк."</item> - <item msgid="2751513398307949636">"На екрані у вигляді смужок"</item> - <item msgid="1851438178120770973">"У adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Вимк."</item> <item msgid="7688197031296835369">"Показувати області накладання"</item> diff --git a/packages/SettingsLib/res/values-ur-rPK/arrays.xml b/packages/SettingsLib/res/values-ur-rPK/arrays.xml index 4f081e55c7cf..9e02c4cd3f22 100644 --- a/packages/SettingsLib/res/values-ur-rPK/arrays.xml +++ b/packages/SettingsLib/res/values-ur-rPK/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"نیلا غیر مستطیل نما کلپ خطہ بنائیں"</item> <item msgid="1064373276095698656">"سبز رنگ میں آزمودہ ڈرائنگ کمانڈز کو نمایاں کریں"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"آف"</item> - <item msgid="2751513398307949636">"بارز کے بطور اسکرین پر"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo میں"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"آف"</item> <item msgid="7688197031296835369">"اوور ڈرا والے حصے دکھائیں"</item> diff --git a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml index f501242e96f3..8d591f91280a 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/arrays.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"To‘g‘ri burchakli bo‘lmagan kesishmalarni ko‘k bilan"</item> <item msgid="1064373276095698656">"Chizmaning sinov buyruqlarini yashil bilan"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"O‘chirib qo‘yish"</item> - <item msgid="2751513398307949636">"Ekranda bo‘laklar tarzida"</item> - <item msgid="1851438178120770973">"adb shell dumpsys gfxinfo ichida"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"O‘CHIQ"</item> <item msgid="7688197031296835369">"Ortiqcha chizilgan joylarni ko‘rsatish"</item> diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml index 237b4f4d3dda..eb773510f929 100644 --- a/packages/SettingsLib/res/values-vi/arrays.xml +++ b/packages/SettingsLib/res/values-vi/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Vẽ vùng clip khác hình chữ nhật bằng màu lam"</item> <item msgid="1064373276095698656">"Đánh dấu lệnh vẽ đã kiểm tra bằng màu lục"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Tắt"</item> - <item msgid="2751513398307949636">"Trên màn hình dưới dạng thanh"</item> - <item msgid="1851438178120770973">"Trong adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Tắt"</item> <item msgid="7688197031296835369">"Hiển thị các vùng vẽ quá"</item> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index 8a3febdaadd5..6f2b7bc9d3b7 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"以蓝色填充非矩形剪裁区域"</item> <item msgid="1064373276095698656">"以绿色突出显示测试绘制命令"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"关闭"</item> - <item msgid="2751513398307949636">"在屏幕上显示为条形图"</item> - <item msgid="1851438178120770973">"在 adb shell dumpsys gfxinfo 中"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"关闭"</item> <item msgid="7688197031296835369">"显示过度绘制区域"</item> diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml index fe658844d8c9..084277577331 100644 --- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"以藍色畫出非矩形裁剪區域"</item> <item msgid="1064373276095698656">"以綠色顯示已測試的繪圖指令"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"關閉"</item> - <item msgid="2751513398307949636">"在螢幕上以列顯示"</item> - <item msgid="1851438178120770973">"在「adb shell dumpsys gfxinfo」指令中"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"關閉"</item> <item msgid="7688197031296835369">"顯示過度繪製區域"</item> diff --git a/packages/SettingsLib/res/values-zh-rTW/arrays.xml b/packages/SettingsLib/res/values-zh-rTW/arrays.xml index 0939e93c3e69..17037a7446aa 100644 --- a/packages/SettingsLib/res/values-zh-rTW/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rTW/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"將非矩形裁剪區域塗上藍色"</item> <item msgid="1064373276095698656">"使用綠色標明測試繪圖指令"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"關閉"</item> - <item msgid="2751513398307949636">"在螢幕上以列顯示"</item> - <item msgid="1851438178120770973">"在「adb shell dumpsys gfxinfo」指令中"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"關閉"</item> <item msgid="7688197031296835369">"顯示透支區域"</item> diff --git a/packages/SettingsLib/res/values-zu/arrays.xml b/packages/SettingsLib/res/values-zu/arrays.xml index 772dee8f2826..e66d581cd341 100644 --- a/packages/SettingsLib/res/values-zu/arrays.xml +++ b/packages/SettingsLib/res/values-zu/arrays.xml @@ -144,11 +144,7 @@ <item msgid="675719912558941285">"Dweba indawo yesiqeshana engesiyena unxantathu ngokuphuzi okwesibhakabhaka"</item> <item msgid="1064373276095698656">"Beka obala iziqondiso ezihloliwe zokudwebela ngokuphuzi"</item> </string-array> - <string-array name="track_frame_time_entries"> - <item msgid="2193584639058893150">"Valiwe"</item> - <item msgid="2751513398307949636">"Kusikrini njengamabha"</item> - <item msgid="1851438178120770973">"Ku-adb shell dumpsys gfxinfo"</item> - </string-array> + <!-- no translation found for track_frame_time_entries:2 (2355151170975410323) --> <string-array name="debug_hw_overdraw_entries"> <item msgid="8190572633763871652">"Valiwe"</item> <item msgid="7688197031296835369">"Bonisa izindawo zokukhipha okungaphezulu"</item> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index d27f1f830c32..7497fc1da3c5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -511,6 +511,13 @@ public class SettingsProvider extends ContentProvider { @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { + final int userId = getUserIdFromUri(uri, UserHandle.getCallingUserId()); + if (userId != UserHandle.getCallingUserId()) { + getContext().enforceCallingPermission(Manifest.permission.INTERACT_ACROSS_USERS, + "Access files from the settings of another user"); + } + uri = ContentProvider.getUriWithoutUserId(uri); + final String cacheName; if (Settings.System.RINGTONE_CACHE_URI.equals(uri)) { cacheName = Settings.System.RINGTONE_CACHE; @@ -523,8 +530,7 @@ public class SettingsProvider extends ContentProvider { + "ringtone playback is available through android.media.Ringtone"); } - final File cacheFile = new File( - getRingtoneCacheDir(UserHandle.getCallingUserId()), cacheName); + final File cacheFile = new File(getRingtoneCacheDir(userId), cacheName); return ParcelFileDescriptor.open(cacheFile, ParcelFileDescriptor.parseMode(mode)); } diff --git a/packages/Shell/res/values-pl/strings.xml b/packages/Shell/res/values-pl/strings.xml index 73cd181bc632..9734b2ecfc2b 100644 --- a/packages/Shell/res/values-pl/strings.xml +++ b/packages/Shell/res/values-pl/strings.xml @@ -21,7 +21,7 @@ <string name="bugreport_finished_title" msgid="4429132808670114081">"Raport o błędzie <xliff:g id="ID">#%d</xliff:g> został zapisany"</string> <string name="bugreport_updating_title" msgid="4423539949559634214">"Dodaję szczegóły do raportu o błędzie"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Czekaj..."</string> - <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Raport o błędzie będzie się pojawiał na telefonie przez chwilę"</string> + <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"Raport o błędzie będzie pojawiał się na telefonie przez chwilę"</string> <string name="bugreport_finished_text" product="default" msgid="8353769438382138847">"Kliknij, by udostępnić raport o błędzie"</string> <string name="bugreport_finished_pending_screenshot_text" product="watch" msgid="1474435374470177193">"Kliknij, by udostępnić raport o błędzie bez zrzutu ekranu, lub poczekaj, aż zostanie on wygenerowany"</string> <string name="bugreport_finished_pending_screenshot_text" product="default" msgid="1474435374470177193">"Kliknij, by udostępnić raport o błędzie bez zrzutu ekranu, lub poczekaj, aż zostanie on wygenerowany"</string> diff --git a/packages/Shell/res/values/strings.xml b/packages/Shell/res/values/strings.xml index 5dfac95e3527..933d65077374 100644 --- a/packages/Shell/res/values/strings.xml +++ b/packages/Shell/res/values/strings.xml @@ -76,4 +76,7 @@ <!-- Label of button that save bugreport details. --> <string name="save">Save</string> + + <!-- Title displayed in the activity chooser used to share the bug report [CHAR LIMIT=30]--> + <string name="bugreport_intent_chooser_title">Share Bug report</string> </resources> diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 235bfcc06a4d..4211369a27cb 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -1000,12 +1000,17 @@ public class BugreportProgressService extends Service { notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Send the share intent... - mContext.startActivity(notifIntent); + sendShareIntent(mContext, notifIntent); // ... and stop watching this process. stopProgress(id); } + static void sendShareIntent(Context context, Intent intent) { + context.startActivity(Intent.createChooser(intent, + context.getResources().getText(R.string.bugreport_intent_chooser_title))); + } + /** * Sends a notification indicating the bugreport has finished so use can share it. */ diff --git a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java index 2426ba099dce..bdf41714d26c 100644 --- a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java +++ b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java @@ -21,6 +21,7 @@ import static com.android.shell.BugreportPrefs.STATE_SHOW; import static com.android.shell.BugreportPrefs.STATE_UNKNOWN; import static com.android.shell.BugreportPrefs.getWarningState; import static com.android.shell.BugreportPrefs.setWarningState; +import static com.android.shell.BugreportProgressService.sendShareIntent; import android.app.AlertDialog; import android.content.DialogInterface; @@ -78,7 +79,7 @@ public class BugreportWarningActivity extends AlertActivity if (which == AlertDialog.BUTTON_POSITIVE) { // Remember confirm state, and launch target setWarningState(this, mConfirmRepeat.isChecked() ? STATE_HIDE : STATE_SHOW); - startActivity(mSendIntent); + sendShareIntent(this, mSendIntent); } finish(); diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index ad66dfc992d0..8eed6a27d942 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -175,6 +175,8 @@ public class BugreportReceiverTest extends InstrumentationTestCase { mDescription = sb.toString(); setWarningState(mContext, STATE_HIDE); + + mUiBot.turnScreenOn(); } public void testProgress() throws Exception { diff --git a/packages/Shell/tests/src/com/android/shell/UiBot.java b/packages/Shell/tests/src/com/android/shell/UiBot.java index ef24791aac72..d9f5b7a0415c 100644 --- a/packages/Shell/tests/src/com/android/shell/UiBot.java +++ b/packages/Shell/tests/src/com/android/shell/UiBot.java @@ -22,7 +22,6 @@ import android.support.test.uiautomator.By; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject; import android.support.test.uiautomator.UiObjectNotFoundException; -import android.support.test.uiautomator.UiScrollable; import android.support.test.uiautomator.UiSelector; import android.support.test.uiautomator.Until; import android.util.Log; @@ -156,56 +155,24 @@ final class UiBot { } /** - * Chooses a given activity to handle an Intent, using the "Just Once" button. + * Chooses a given activity to handle an Intent. * * @param name name of the activity as displayed in the UI (typically the value set by * {@code android:label} in the manifest). */ - // TODO: UI Automator should provide such logic. public void chooseActivity(String name) { - // First check if the activity is the default option. - String shareText = "Share with " + name; - Log.v(TAG, "Waiting for ActivityChooser text: '" + shareText + "'"); - boolean gotIt = mDevice.wait(Until.hasObject(By.text(shareText)), mTimeout); - boolean justOnceHack = false; - - if (gotIt) { - Log.v(TAG, "Found activity " + name + ", it's the default action"); - clickJustOnce(); - } else { - // Since it's not, need to find it in the scrollable list... - Log.v(TAG, "Activity " + name + " is not default action"); - UiScrollable activitiesList = new UiScrollable(new UiSelector().scrollable(true)); - try { - activitiesList.scrollForward(); - } catch (UiObjectNotFoundException e) { - // TODO: for some paranormal issue, the first time a test is run the scrollable - // activity list is displayed but calling scrollForwad() (or even isScrollable()) - // throws a "UiObjectNotFoundException: UiSelector[SCROLLABLE=true]" exception - justOnceHack = true; - Log.d(TAG, "could not scroll forward", e); - } - UiObject activity = getVisibleObject(name); - // ... then select it. - click(activity, name); - if (justOnceHack) { - clickJustOnce(); - } - } - } - - private void clickJustOnce() { - boolean gotIt = mDevice.wait(Until.hasObject(By.res("android", "button_once")), mTimeout); - assertTrue("'Just Once' button not visible yet", gotIt); - - UiObject justOnce = mDevice - .findObject(new UiSelector().resourceId("android:id/button_once")); - assertTrue("'Just Once' button not found", justOnce.exists()); - - click(justOnce, "Just Once"); + // It uses an intent chooser now, so just getting the activity by text is enough... + UiObject activity = getVisibleObject(name); + click(activity, name); } public void pressBack() { mDevice.pressBack(); } + + public void turnScreenOn() throws Exception { + mDevice.executeShellCommand("input keyevent KEYCODE_WAKEUP"); + mDevice.executeShellCommand("wm dismiss-keyguard"); + } + } diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml index 67e6a01640b1..e207cb3808c0 100644 --- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml +++ b/packages/SystemUI/res/drawable/lockscreen_fingerprint_error_state_to_fp.xml @@ -98,11 +98,11 @@ <path android:name="path_2" android:pathData="M 1.35900878906,6.76104736328 c 0.0,0.0 -2.69998168945,0.0 -2.69998168945,0.0 c 0.0,0.0 0.0,-2.69995117188 0.0,-2.69995117188 c 0.0,0.0 2.69998168945,0.0 2.69998168945,0.0 c 0.0,0.0 0.0,2.69995117188 0.0,2.69995117188 Z" - android:fillColor="#FFF2501D" /> + android:fillColor="@*android:color/system_error" /> <path android:name="path_1" android:pathData="M 1.35363769531,1.36633300781 c 0.0,0.0 -2.69998168945,0.0 -2.69998168945,0.0 c 0.0,0.0 0.0,-8.09997558594 0.0,-8.09997558594 c 0.0,0.0 2.69998168945,0.0 2.69998168945,0.0 c 0.0,0.0 0.0,8.09997558594 0.0,8.09997558594 Z" - android:fillColor="#FFF2501D" /> + android:fillColor="@*android:color/system_error" /> </group> </group> <group @@ -117,7 +117,7 @@ <path android:name="path_3" android:pathData="M 0.0101470947266,10.8087768555 c -5.96701049805,0.0 -10.8000183105,-4.8330078125 -10.8000183105,-10.8000488281 c 0.0,-5.96691894531 4.8330078125,-10.7999267578 10.8000183105,-10.7999267578 c 5.96697998047,0.0 10.799987793,4.8330078125 10.799987793,10.7999267578 c 0.0,5.96704101562 -4.8330078125,10.8000488281 -10.799987793,10.8000488281 Z" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="2" android:trimPathStart="0" android:trimPathEnd="1" /> diff --git a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml index bbadec197dfd..2b4babce277b 100644 --- a/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml +++ b/packages/SystemUI/res/drawable/lockscreen_fingerprint_fp_to_error_state.xml @@ -96,7 +96,7 @@ <path android:name="ridge_5_path_0" android:pathData="M -25.3591003418,-24.4138946533 c -0.569000244141,0.106399536133 -1.12660217285,0.140594482422 -1.45460510254,0.140594482422 c -1.29689025879,0.0 -2.53239440918,-0.343307495117 -3.62019348145,-1.12400817871 c -1.67700195312,-1.20349121094 -2.76950073242,-3.17008972168 -2.76950073242,-5.39189147949" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="1.45" android:strokeLineCap="round" android:trimPathEnd="0" /> @@ -106,7 +106,7 @@ <path android:name="ridge_7_path_0" android:pathData="M -36.1409912109,-21.7843475342 c -1.00540161133,-1.19300842285 -1.57499694824,-1.9181060791 -2.36520385742,-3.50170898438 c -0.827560424805,-1.65869140625 -1.31352233887,-3.49159240723 -1.31352233887,-5.48489379883 c 0.0,-3.66279602051 2.96932983398,-6.63220214844 6.63221740723,-6.63220214844 c 3.6628112793,0.0 6.63220214844,2.96940612793 6.63220214844,6.63220214844" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="1.45" android:strokeLineCap="round" android:trimPathEnd="0" /> @@ -116,7 +116,7 @@ <path android:name="ridge_6_path_0" android:pathData="M -42.1907958984,-25.6756896973 c -0.758117675781,-2.14370727539 -0.896545410156,-3.86891174316 -0.896545410156,-5.12921142578 c 0.0,-1.46069335938 0.249176025391,-2.84799194336 0.814682006836,-4.09748840332 c 1.56153869629,-3.45030212402 5.03434753418,-5.85076904297 9.0679473877,-5.85076904297 c 5.49430847168,0.0 9.94830322266,4.4539642334 9.94830322266,9.94825744629 c 0.0,1.83151245117 -1.48460388184,3.31610107422 -3.31610107422,3.31610107422 c -1.83149719238,0.0 -3.31610107422,-1.48469543457 -3.31610107422,-3.31610107422 c 0.0,-1.83139038086 -1.48458862305,-3.31610107422 -3.31610107422,-3.31610107422 c -1.83149719238,0.0 -3.31610107422,1.48471069336 -3.31610107422,3.31610107422 c 0.0,2.57020568848 0.989517211914,4.88710021973 2.60510253906,6.5865020752 c 1.22210693359,1.28550720215 2.43139648438,2.09950256348 4.47590637207,2.69030761719" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="1.45" android:strokeLineCap="round" android:trimPathEnd="0" /> @@ -126,7 +126,7 @@ <path android:name="ridge_2_path_0" android:pathData="M -44.0646514893,-38.1672973633 c 1.19026184082,-1.77430725098 2.67503356934,-3.24531555176 4.55902099609,-4.27278137207 c 1.88395690918,-1.0274810791 4.04466247559,-1.61137390137 6.34175109863,-1.61137390137 c 2.28761291504,0.0 4.43991088867,0.579071044922 6.31831359863,1.59861755371 c 1.8784942627,1.01954650879 3.36059570312,2.4796295166 4.55279541016,4.24153137207" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="1.45" android:strokeLineCap="round" android:trimPathStart="1" /> @@ -138,7 +138,7 @@ <path android:name="ridge_1_path_0" android:pathData="M 71.7812347412,97.0507202148 c -2.27149963379,-1.31344604492 -4.71360778809,-2.07006835938 -7.56221008301,-2.07006835938 c -2.84869384766,0.0 -5.23320007324,0.779556274414 -7.34411621094,2.07006835938" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="1.45" android:strokeLineCap="round" android:trimPathEnd="0" /> @@ -157,11 +157,11 @@ <path android:name="path_2" android:pathData="M -1.3705291748,4.06730651855 c 0.0,0.0 0.036376953125,-0.0102386474609 0.036376953125,-0.0102386474609 c 0.0,0.0 -0.00682067871094,0.0040283203125 -0.00682067871093,0.0040283203125 c 0.0,0.0 -0.0161437988281,0.00479125976562 -0.0161437988281,0.00479125976563 c 0.0,0.0 -0.0134124755859,0.00141906738281 -0.0134124755859,0.00141906738281 Z" - android:fillColor="#FFF2501D" /> + android:fillColor="@*android:color/system_error" /> <path android:name="path_1" android:pathData="M -1.3737487793,-6.77532958984 c 0.0,0.0 0.00604248046875,0.0166625976562 0.00604248046876,0.0166625976562 c 0.0,0.0 0.0213623046875,0.0250244140625 0.0213623046875,0.0250244140625 c 0.0,0.0 -0.00604248046875,-0.0166625976562 -0.00604248046876,-0.0166625976562 c 0.0,0.0 -0.0213623046875,-0.0250244140625 -0.0213623046875,-0.0250244140625 Z" - android:fillColor="#FFF2501D" /> + android:fillColor="@*android:color/system_error" /> </group> </group> <group @@ -176,7 +176,7 @@ <path android:name="path_3" android:pathData="M 0.0101470947266,10.8087768555 c -5.96701049805,0.0 -10.8000183105,-4.8330078125 -10.8000183105,-10.8000488281 c 0.0,-5.96691894531 4.8330078125,-10.7999267578 10.8000183105,-10.7999267578 c 5.96697998047,0.0 10.799987793,4.8330078125 10.799987793,10.7999267578 c 0.0,5.96704101562 -4.8330078125,10.8000488281 -10.799987793,10.8000488281 Z" - android:strokeColor="#FFF2501D" + android:strokeColor="@*android:color/system_error" android:strokeWidth="2" android:trimPathStart="1" /> </group> diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java index 2d1f753898b7..9415b27f7570 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import android.app.ActivityManager; import android.content.Intent; import android.provider.Settings; import android.widget.Switch; @@ -29,11 +30,12 @@ import com.android.systemui.qs.QSTile; public class NightDisplayTile extends QSTile<QSTile.BooleanState> implements NightDisplayController.Callback { - private final NightDisplayController mController; + private NightDisplayController mController; + private boolean mIsListening; public NightDisplayTile(Host host) { super(host); - mController = new NightDisplayController(mContext); + mController = new NightDisplayController(mContext, ActivityManager.getCurrentUser()); } @Override @@ -54,6 +56,22 @@ public class NightDisplayTile extends QSTile<QSTile.BooleanState> } @Override + protected void handleUserSwitch(int newUserId) { + // Stop listening to the old controller. + if (mIsListening) { + mController.setListener(null); + } + + // Make a new controller for the new user. + mController = new NightDisplayController(mContext, newUserId); + if (mIsListening) { + mController.setListener(this); + } + + super.handleUserSwitch(newUserId); + } + + @Override protected void handleUpdateState(BooleanState state, Object arg) { final boolean isActivated = mController.isActivated(); state.value = isActivated; @@ -79,6 +97,7 @@ public class NightDisplayTile extends QSTile<QSTile.BooleanState> @Override protected void setListening(boolean listening) { + mIsListening = listening; if (listening) { mController.setListener(this); refreshState(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index ca59831786b4..ba31e3e835c0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -200,6 +200,10 @@ class BackgroundTaskLoader implements Runnable { if (cachedThumbnailData.thumbnail == null) { cachedThumbnailData.thumbnail = mDefaultThumbnail; + } else { + // Kick off an early upload of the bitmap to GL so + // that this won't jank the first frame it's drawn in. + cachedThumbnailData.thumbnail.prepareToDraw(); } // When svelte, we trim the memory to just the visible thumbnails when diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java index 319375950916..c46adf15861f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java @@ -164,6 +164,7 @@ public class TaskViewThumbnail extends View { /** Sets the thumbnail to a given bitmap. */ void setThumbnail(Bitmap bm, ActivityManager.TaskThumbnailInfo thumbnailInfo) { if (bm != null) { + bm.prepareToDraw(); mBitmapShader = new BitmapShader(bm, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mDrawPaint.setShader(mBitmapShader); mThumbnailRect.set(0, 0, bm.getWidth(), bm.getHeight()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java index 405ccd601ff6..10facea1e8f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -334,6 +334,9 @@ public class QSTileHost implements QSTile.Host, Tunable { || ((CustomTile) tile).getUser() == currentUser)) { if (DEBUG) Log.d(TAG, "Adding " + tile); tile.removeCallbacks(); + if (!(tile instanceof CustomTile) && mCurrentUser != currentUser) { + tile.userSwitch(currentUser); + } newTiles.put(tileSpec, tile); } else { if (DEBUG) Log.d(TAG, "Creating tile: " + tileSpec); diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 41576bf5b62e..fc19fb5f8f92 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2256,6 +2256,10 @@ message MetricsEvent { // Package: Package of print service ACTION_PRINT_RECOMMENDED_SERVICE_INSTALL = 512; + // OPEN: Settings > Display -> Ambient Display + // CATEGORY: SETTINGS + ACTION_AMBIENT_DISPLAY = 513; + // ---- End O Constants, all O constants go above this line ---- // Add new aosp constants above this line. diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 64b473941e6f..e8b5310c9326 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -3633,19 +3633,22 @@ final class ActivityStack { final ActivityState prevState = r.state; if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to FINISHING: " + r); r.state = ActivityState.FINISHING; + final boolean finishingActivityInNonFocusedStack + = r.task.stack != mStackSupervisor.getFocusedStack() + && prevState == ActivityState.PAUSED && mode == FINISH_AFTER_VISIBLE; if (mode == FINISH_IMMEDIATELY || (prevState == ActivityState.PAUSED - && (mode == FINISH_AFTER_PAUSE || mode == FINISH_AFTER_VISIBLE - || mStackId == PINNED_STACK_ID)) + && (mode == FINISH_AFTER_PAUSE || mStackId == PINNED_STACK_ID)) + || finishingActivityInNonFocusedStack || prevState == ActivityState.STOPPED || prevState == ActivityState.INITIALIZING) { r.makeFinishingLocked(); boolean activityRemoved = destroyActivityLocked(r, true, "finish-imm"); - if (prevState == ActivityState.PAUSED && mode == FINISH_AFTER_VISIBLE) { - // Finishing activity that was in paused state - this can happen if it was in - // not currently focused stack. Need to make something visible in its place. + if (finishingActivityInNonFocusedStack) { + // Finishing activity that was in paused state and it was in not currently focused + // stack, need to make something visible in its place. mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); } if (activityRemoved) { diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 02ad7c650e11..d875f1e97cac 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -2170,9 +2170,9 @@ public class ShortcutService extends IShortcutService.Stub { @Nullable ComponentName componentName, int queryFlags, int userId) { final ArrayList<ShortcutInfo> ret = new ArrayList<>(); - - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return ret; + } final boolean cloneKeyFieldOnly = ((queryFlags & ShortcutQuery.FLAG_GET_KEY_FIELDS_ONLY) != 0); @@ -2251,8 +2251,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkStringNotEmpty(packageName, "packageName"); Preconditions.checkStringNotEmpty(shortcutId, "shortcutId"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return false; + } synchronized (mLock) { getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) @@ -2270,8 +2271,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkStringNotEmpty(packageName, "packageName"); Preconditions.checkStringNotEmpty(shortcutId, "shortcutId"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return null; + } final ShortcutPackage p = getUserShortcutsLocked(userId) .getPackageShortcutsIfExists(packageName); @@ -2294,8 +2296,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkStringNotEmpty(packageName, "packageName"); Preconditions.checkNotNull(shortcutIds, "shortcutIds"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return; + } synchronized (mLock) { final ShortcutLauncher launcher = @@ -2317,8 +2320,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkStringNotEmpty(packageName, "packageName can't be empty"); Preconditions.checkStringNotEmpty(shortcutId, "shortcutId can't be empty"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return null; + } synchronized (mLock) { getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) @@ -2350,8 +2354,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkNotNull(packageName, "packageName"); Preconditions.checkNotNull(shortcutId, "shortcutId"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return 0; + } synchronized (mLock) { getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) @@ -2377,8 +2382,9 @@ public class ShortcutService extends IShortcutService.Stub { Preconditions.checkNotNull(packageName, "packageName"); Preconditions.checkNotNull(shortcutId, "shortcutId"); - throwIfUserLocked(userId); - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(userId) || !isUserUnlocked(launcherUserId)) { + return null; + } synchronized (mLock) { getLauncherShortcutsLocked(callingPackage, userId, launcherUserId) @@ -2412,7 +2418,9 @@ public class ShortcutService extends IShortcutService.Stub { @Override public boolean hasShortcutHostPermission(int launcherUserId, @NonNull String callingPackage) { - throwIfUserLocked(launcherUserId); + if (!isUserUnlocked(launcherUserId)) { + return false; + } return ShortcutService.this.hasShortcutHostPermission(callingPackage, launcherUserId); } } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 8d13b0d61414..ced84f686a52 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -2086,7 +2086,12 @@ public final class PowerManagerService extends SystemService float screenAutoBrightnessAdjustment = 0.0f; boolean autoBrightness = (mScreenBrightnessModeSetting == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); - if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) { + if (!mBootCompleted) { + // Keep the brightness steady during boot. This requires the + // bootloader brightness and the default brightness to be identical. + autoBrightness = false; + brightnessSetByUser = false; + } else if (isValidBrightness(mScreenBrightnessOverrideFromWindowManager)) { screenBrightness = mScreenBrightnessOverrideFromWindowManager; autoBrightness = false; brightnessSetByUser = false; diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index f268aa2620dd..6b0edad359eb 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -17,7 +17,9 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId; +import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; +import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; @@ -280,10 +282,10 @@ class AppWindowToken extends WindowToken { WindowState findMainWindow() { WindowState candidate = null; - int j = windows.size(); + int j = allAppWindows.size(); while (j > 0) { j--; - WindowState win = windows.get(j); + WindowState win = allAppWindows.get(j); if (win.mAttrs.type == WindowManager.LayoutParams.TYPE_BASE_APPLICATION || win.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { // In cases where there are multiple windows, we prefer the non-exiting window. This @@ -358,6 +360,7 @@ class AppWindowToken extends WindowToken { win.mWinAnimator.mAnimating = false; } } + requestUpdateWallpaperIfNeeded(); } void destroySurfaces() { @@ -405,6 +408,9 @@ class AppWindowToken extends WindowToken { if (displayContent != null && !displayList.contains(displayContent)) { displayList.add(displayContent); } + if (cleanupOnResume) { + win.requestUpdateWallpaperIfNeeded(); + } win.mDestroying = false; } for (int i = 0; i < displayList.size(); i++) { @@ -542,7 +548,7 @@ class AppWindowToken extends WindowToken { clearVisibleBeforeClientHidden(); if (DEBUG_APP_TRANSITIONS || DEBUG_ANIM) Slog.d(TAG, - "restoreSavedSurfaces: " + appWindowToken + " allDrawn=" + allDrawn + "restoreSavedSurfaces: " + this + " allDrawn=" + allDrawn + " numInteresting=" + numInteresting + " numDrawn=" + numDrawn); } @@ -609,8 +615,8 @@ class AppWindowToken extends WindowToken { } void setReplacingWindows(boolean animate) { - if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Marking app token " + appWindowToken - + " with replacing windows."); + if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, + "Marking app token " + this + " with replacing windows."); for (int i = allAppWindows.size() - 1; i >= 0; i--) { final WindowState w = allAppWindows.get(i); @@ -627,7 +633,7 @@ class AppWindowToken extends WindowToken { } void setReplacingChildren() { - if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Marking app token " + appWindowToken + if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Marking app token " + this + " with replacing child windows."); for (int i = allAppWindows.size() - 1; i >= 0; i--) { final WindowState w = allAppWindows.get(i); @@ -638,8 +644,8 @@ class AppWindowToken extends WindowToken { } void resetReplacingWindows() { - if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, "Resetting app token " + appWindowToken - + " of replacing window marks."); + if (DEBUG_ADD_REMOVE) Slog.d(TAG_WM, + "Resetting app token " + this + " of replacing window marks."); for (int i = allAppWindows.size() - 1; i >= 0; i--) { final WindowState w = allAppWindows.get(i); @@ -769,8 +775,8 @@ class AppWindowToken extends WindowToken { if (!mFrozenMergedConfig.isEmpty()) { mFrozenMergedConfig.remove(); } - for (int i = windows.size() - 1; i >= 0; i--) { - final WindowState win = windows.get(i); + for (int i = allAppWindows.size() - 1; i >= 0; i--) { + final WindowState win = allAppWindows.get(i); if (!win.mHasSurface) { continue; } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 917a899db51f..7b6f9e318650 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -590,18 +590,9 @@ class WallpaperController { "Animating wallpapers: old#" + oldI + "=" + oldW + "; new#" + wallpaperTargetIndex + "=" + wallpaperTarget); - // Set the new target correctly. - if (wallpaperTarget.mAppToken != null - && wallpaperTarget.mAppToken.hiddenRequested) { - if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, - "Old wallpaper still the target."); - mWallpaperTarget = oldW; - wallpaperTarget = oldW; - wallpaperTargetIndex = oldI; - } - // Now set the upper and lower wallpaper targets correctly, + // Set the upper and lower wallpaper targets correctly, // and make sure that we are positioning the wallpaper below the lower. - else if (wallpaperTargetIndex > oldI) { + if (wallpaperTargetIndex > oldI) { // The new target is on top of the old one. if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Found target above old target."); @@ -616,6 +607,16 @@ class WallpaperController { mUpperWallpaperTarget = oldW; mLowerWallpaperTarget = wallpaperTarget; } + + // If the new target is going hidden, set it back to the old target. + if (wallpaperTarget.mAppToken != null + && wallpaperTarget.mAppToken.hiddenRequested) { + if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, + "Old wallpaper still the target."); + mWallpaperTarget = oldW; + wallpaperTarget = oldW; + wallpaperTargetIndex = oldI; + } } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 292561a1e59e..04930847b620 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1621,7 +1621,6 @@ public class WindowManagerService extends IWindowManager.Stub void addInputMethodWindowToListLocked(WindowState win) { int pos = findDesiredInputMethodWindowIndexLocked(true); if (pos >= 0) { - win.mTargetAppToken = mInputMethodTarget.mAppToken; if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE) Slog.v( TAG_WM, "Adding input method window " + win + " at " + pos); // TODO(multidisplay): IMEs are only supported on the default display. @@ -1630,7 +1629,6 @@ public class WindowManagerService extends IWindowManager.Stub moveInputMethodDialogsLocked(pos + 1); return; } - win.mTargetAppToken = null; addWindowToListInOrderLocked(win, true); moveInputMethodDialogsLocked(pos); } @@ -1674,7 +1672,6 @@ public class WindowManagerService extends IWindowManager.Stub } if (pos >= 0) { - final AppWindowToken targetAppToken = mInputMethodTarget.mAppToken; // Skip windows owned by the input method. if (mInputMethodWindow != null) { while (pos < windows.size()) { @@ -1689,7 +1686,6 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Adding " + N + " dialogs at pos=" + pos); for (int i=0; i<N; i++) { WindowState win = dialogs.get(i); - win.mTargetAppToken = targetAppToken; pos = win.reAddWindowLocked(pos); } if (DEBUG_INPUT_METHOD) { @@ -1700,7 +1696,6 @@ public class WindowManagerService extends IWindowManager.Stub } for (int i=0; i<N; i++) { WindowState win = dialogs.get(i); - win.mTargetAppToken = null; reAddWindowToListInOrderLocked(win); if (DEBUG_INPUT_METHOD) { Slog.v(TAG_WM, "No IM target, final list:"); @@ -1756,11 +1751,6 @@ public class WindowManagerService extends IWindowManager.Stub pos++; } if (pos >= N) { - // Z order is good. - // The IM target window may be changed, so update the mTargetAppToken. - if (imWin != null) { - imWin.mTargetAppToken = mInputMethodTarget.mAppToken; - } return false; } } @@ -1775,7 +1765,6 @@ public class WindowManagerService extends IWindowManager.Stub Slog.v(TAG_WM, "List after removing with new pos " + imPos + ":"); logWindowList(windows, " "); } - imWin.mTargetAppToken = mInputMethodTarget.mAppToken; imWin.reAddWindowLocked(imPos); if (DEBUG_INPUT_METHOD) { Slog.v(TAG_WM, "List after moving IM to " + imPos + ":"); @@ -1793,7 +1782,6 @@ public class WindowManagerService extends IWindowManager.Stub if (imWin != null) { if (DEBUG_INPUT_METHOD) Slog.v(TAG_WM, "Moving IM from " + imPos); imWin.removeFromWindowList(0); - imWin.mTargetAppToken = null; reAddWindowToListInOrderLocked(imWin); if (DEBUG_INPUT_METHOD) { Slog.v(TAG_WM, "List with no IM target:"); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index f0054f83494e..d20529da6b42 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -158,7 +158,6 @@ class WindowState extends WindowContainer implements WindowManagerPolicy.WindowS WindowToken mToken; WindowToken mRootToken; AppWindowToken mAppToken; - AppWindowToken mTargetAppToken; // mAttrs.flags is tested in animation without being locked. If the bits tested are ever // modified they will need to be locked. @@ -619,17 +618,17 @@ class WindowState extends WindowContainer implements WindowManagerPolicy.WindowS } mIsFloatingLayer = mIsImWindow || mIsWallpaper; - final WindowState appWin = getTopParentWindow(); - WindowToken appToken = appWin.mToken; - while (appToken.appWindowToken == null) { - WindowToken parent = mService.mTokenMap.get(appToken.token); - if (parent == null || appToken == parent) { + final WindowState topParentWindow = getTopParentWindow(); + WindowToken rootToken = topParentWindow.mToken; + while (rootToken.appWindowToken == null) { + WindowToken parent = mService.mTokenMap.get(rootToken.token); + if (parent == null || rootToken == parent) { break; } - appToken = parent; + rootToken = parent; } - mRootToken = appToken; - mAppToken = appToken.appWindowToken; + mRootToken = rootToken; + mAppToken = rootToken.appWindowToken; if (mAppToken != null) { final DisplayContent appDisplay = getDisplayContent(); mNotOnAppsDisplay = displayContent != appDisplay; @@ -1495,14 +1494,21 @@ class WindowState extends WindowContainer implements WindowManagerPolicy.WindowS } int getAnimLayerAdjustment() { - if (mTargetAppToken != null) { - return mTargetAppToken.mAppAnimator.animLayerAdjustment; - } else if (mAppToken != null) { + final boolean isImeType = + mAttrs.type == TYPE_INPUT_METHOD || mAttrs.type == TYPE_INPUT_METHOD_DIALOG; + if (isImeType && mService.mInputMethodTarget != null) { + final AppWindowToken appToken = mService.mInputMethodTarget.mAppToken; + if (appToken != null) { + return appToken.mAppAnimator.animLayerAdjustment; + } + } + + if (mAppToken != null) { return mAppToken.mAppAnimator.animLayerAdjustment; - } else { - // Nothing is animating, so there is no animation adjustment. - return 0; } + + // Nothing is animating, so there is no animation adjustment. + return 0; } void scheduleAnimationIfDimming() { @@ -2580,9 +2586,7 @@ class WindowState extends WindowContainer implements WindowManagerPolicy.WindowS pw.print(prefix); pw.print("mBaseLayer="); pw.print(mBaseLayer); pw.print(" mSubLayer="); pw.print(mSubLayer); pw.print(" mAnimLayer="); pw.print(mLayer); pw.print("+"); - pw.print((mTargetAppToken != null ? - mTargetAppToken.mAppAnimator.animLayerAdjustment - : (mAppToken != null ? mAppToken.mAppAnimator.animLayerAdjustment : 0))); + pw.print(getAnimLayerAdjustment()); pw.print("="); pw.print(mWinAnimator.mAnimLayer); pw.print(" mLastLayer="); pw.println(mWinAnimator.mLastLayer); } @@ -2595,9 +2599,6 @@ class WindowState extends WindowContainer implements WindowManagerPolicy.WindowS pw.print(isAnimatingWithSavedSurface()); pw.print(" mAppDied=");pw.println(mAppDied); } - if (mTargetAppToken != null) { - pw.print(prefix); pw.print("mTargetAppToken="); pw.println(mTargetAppToken); - } pw.print(prefix); pw.print("mViewVisibility=0x"); pw.print(Integer.toHexString(mViewVisibility)); pw.print(" mHaveFrame="); pw.print(mHaveFrame); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index 2cd5be989bbe..95f5d424efa1 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -1096,6 +1096,26 @@ class WindowSurfacePlacer { boolean fullscreenAnim = false; boolean voiceInteraction = false; + int i; + for (i = 0; i < appsCount; i++) { + final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); + // Clearing the mAnimatingExit flag before entering animation. It's set to + // true if app window is removed, or window relayout to invisible. + // This also affects window visibility. We need to clear it *before* + // maybeUpdateTransitToWallpaper() as the transition selection depends on + // wallpaper target visibility. + wtoken.clearAnimatingFlags(); + + } + // Adjust wallpaper before we pull the lower/upper target, since pending changes + // (like the clearAnimatingFlags() above) might affect wallpaper target result. + final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); + if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && + mWallpaperControllerLocked.adjustWallpaperWindows()) { + mService.mLayersController.assignLayersLocked(windows); + displayContent.layoutNeeded = true; + } + final WindowState lowerWallpaperTarget = mWallpaperControllerLocked.getLowerWallpaperTarget(); final WindowState upperWallpaperTarget = @@ -1112,7 +1132,6 @@ class WindowSurfacePlacer { upperWallpaperAppToken = upperWallpaperTarget.mAppToken; } - int i; // Do a first pass through the tokens for two // things: // (1) Determine if both the closing and opening @@ -1137,12 +1156,6 @@ class WindowSurfacePlacer { if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { openingAppHasWallpaper = true; } - // Clearing the mAnimatingExit flag before entering animation. It's set to - // true if app window is removed, or window relayout to invisible. - // This also affects window visibility. We need to clear it *before* - // maybeUpdateTransitToWallpaper() as the transition selection depends on - // wallpaper target visibility. - wtoken.clearAnimatingFlags(); } voiceInteraction |= wtoken.voiceInteraction; @@ -1205,7 +1218,7 @@ class WindowSurfacePlacer { // This has changed the visibility of windows, so perform // a new layout to get them all up-to-date. - mService.getDefaultDisplayContentLocked().layoutNeeded = true; + displayContent.layoutNeeded = true; // TODO(multidisplay): IMEs are only supported on the default display. if (windows == mService.getDefaultWindowListLocked() diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java index 2346f8547550..16a0def7d5a5 100644 --- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java +++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java @@ -574,6 +574,7 @@ public class AppLaunch extends InstrumentationTestCase { mLaunchIntent = intent; mForceStopBeforeLaunch = forceStopBeforeLaunch; mLaunchReason = launchReason; + mResult = -1L; } public Long getResult() { diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index 288b2a320de6..cbad4b9b48a9 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -529,6 +529,16 @@ struct FeatureGroup { int openGLESVersion; }; +static bool hasFeature(const char* name, const FeatureGroup& grp, + const KeyedVector<String8, ImpliedFeature>& implied) { + String8 name8(name); + ssize_t idx = grp.features.indexOfKey(name8); + if (idx < 0) { + idx = implied.indexOfKey(name8); + } + return idx >= 0; +} + static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatures, const char* name, const char* reason, bool sdk23) { String8 name8(name); @@ -616,9 +626,16 @@ static void addParentFeatures(FeatureGroup* grp, const String8& name) { } else if (name == "android.hardware.location.gps" || name == "android.hardware.location.network") { grp->features.add(String8("android.hardware.location"), Feature(true)); + } else if (name == "android.hardware.faketouch.multitouch") { + grp->features.add(String8("android.hardware.faketouch"), Feature(true)); + } else if (name == "android.hardware.faketouch.multitouch.distinct" || + name == "android.hardware.faketouch.multitouch.jazzhands") { + grp->features.add(String8("android.hardware.faketouch.multitouch"), Feature(true)); + grp->features.add(String8("android.hardware.faketouch"), Feature(true)); } else if (name == "android.hardware.touchscreen.multitouch") { grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); - } else if (name == "android.hardware.touchscreen.multitouch.distinct") { + } else if (name == "android.hardware.touchscreen.multitouch.distinct" || + name == "android.hardware.touchscreen.multitouch.jazzhands") { grp->features.add(String8("android.hardware.touchscreen.multitouch"), Feature(true)); grp->features.add(String8("android.hardware.touchscreen"), Feature(true)); } else if (name == "android.hardware.opengles.aep") { @@ -2033,8 +2050,12 @@ int doDump(Bundle* bundle) } } - addImpliedFeature(&impliedFeatures, "android.hardware.touchscreen", - "default feature for all apps", false); + // If the app hasn't declared the touchscreen as a feature requirement (either + // directly or implied, required or not), then the faketouch feature is implied. + if (!hasFeature("android.hardware.touchscreen", commonFeatures, impliedFeatures)) { + addImpliedFeature(&impliedFeatures, "android.hardware.faketouch", + "default feature for all apps", false); + } const size_t numFeatureGroups = featureGroups.size(); if (numFeatureGroups == 0) { diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk index bbb9a51ad407..4f38e9435141 100644 --- a/tools/aapt2/Android.mk +++ b/tools/aapt2/Android.mk @@ -133,7 +133,7 @@ hostStaticLibs := \ libziparchive-host \ libpng \ libbase \ - libprotobuf-cpp-lite_static + libprotobuf-cpp-lite # Statically link libz for MinGW (Win SDK under Linux), diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp index ef095357d9e6..1203db7734ea 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -211,9 +211,11 @@ bool ManifestFixer::buildRules(xml::XmlActionExecutor* executor, IDiagnostics* d // Provider actions. applicationAction["provider"].action(requiredNameIsJavaClassName); - applicationAction["provider"]["grant-uri-permissions"]; + applicationAction["provider"]["intent-filter"] = intentFilterAction; applicationAction["provider"]["meta-data"] = metaDataAction; + applicationAction["provider"]["grant-uri-permissions"]; applicationAction["provider"]["path-permissions"]; + return true; } diff --git a/tools/aapt2/remove-duplicates.py b/tools/aapt2/remove-duplicates.py new file mode 100644 index 000000000000..fb98bb73e9a4 --- /dev/null +++ b/tools/aapt2/remove-duplicates.py @@ -0,0 +1,181 @@ +#!/usr/bin/env python + +import os +import os.path +import sys +import tempfile +import xml.parsers.expat + +""" +Scans each resource file in res/values/ looking for duplicates. +All but the last occurrence of resource definition are removed. +This creates no semantic changes, the resulting APK when built +should contain the same definition. +""" + +class Duplicate: + """A small struct to maintain the positions of a Duplicate resource definition.""" + def __init__(self, name, product, depth, start, end): + self.name = name + self.product = product + self.depth = depth + self.start = start + self.end = end + +class ResourceDefinitionLocator: + """Callback class for xml.parsers.expat which records resource definitions and their + locations. + """ + def __init__(self, parser): + self.resource_definitions = {} + self._parser = parser + self._depth = 0 + self._current_resource = None + + def start_element(self, tag_name, attrs): + self._depth += 1 + if self._depth == 2 and tag_name not in ["public", "java-symbol", "eat-comment", "skip"]: + resource_name = None + product = "" + try: + product = attrs["product"] + except KeyError: + pass + + if tag_name == "item": + resource_name = "{0}/{1}".format(attrs["type"], attrs["name"]) + else: + resource_name = "{0}/{1}".format(tag_name, attrs["name"]) + self._current_resource = Duplicate( + resource_name, + product, + self._depth, + (self._parser.CurrentLineNumber - 1, self._parser.CurrentColumnNumber), + None) + + def end_element(self, tag_name): + if self._current_resource and self._depth == self._current_resource.depth: + # Record the end position of the element, which is the length of the name + # plus the </> symbols (len("</>") == 3). + self._current_resource.end = (self._parser.CurrentLineNumber - 1, + self._parser.CurrentColumnNumber + 3 + len(tag_name)) + key_name = "{0}:{1}".format(self._current_resource.name, + self._current_resource.product) + try: + self.resource_definitions[key_name] += [self._current_resource] + except KeyError: + self.resource_definitions[key_name] = [self._current_resource] + self._current_resource = None + self._depth -= 1 + +def remove_duplicates(xml_path): + """Reads the input file and generates an output file with any duplicate + resources removed, keeping the last occurring definition and removing + the others. The output is written to a temporary and then renamed + to the original file name. + """ + input = "" + with open(xml_path) as fin: + input = fin.read() + + parser = xml.parsers.expat.ParserCreate("utf-8") + parser.returns_unicode = True + tracker = ResourceDefinitionLocator(parser) + parser.StartElementHandler = tracker.start_element + parser.EndElementHandler = tracker.end_element + parser.Parse(input) + + # Treat the input as UTF-8 or else column numbers will be wrong. + input_lines = input.decode('utf-8').splitlines(True) + + # Extract the duplicate resource definitions, ignoring the last definition + # which will take precedence and be left intact. + duplicates = [] + for res_name, entries in tracker.resource_definitions.iteritems(): + if len(entries) > 1: + duplicates += entries[:-1] + + # Sort the duplicates so that they are in order. That way we only do one pass. + duplicates = sorted(duplicates, key=lambda x: x.start) + + last_line_no = 0 + last_col_no = 0 + output_lines = [] + current_line = "" + for definition in duplicates: + print "{0}:{1}:{2}: removing duplicate resource '{3}'".format( + xml_path, definition.start[0] + 1, definition.start[1], definition.name) + + if last_line_no < definition.start[0]: + # The next definition is on a new line, so write what we have + # to the output. + new_line = current_line + input_lines[last_line_no][last_col_no:] + if not new_line.isspace(): + output_lines.append(new_line) + current_line = "" + last_col_no = 0 + last_line_no += 1 + + # Copy all the lines up until this one. + for line_to_copy in xrange(last_line_no, definition.start[0]): + output_lines.append(input_lines[line_to_copy]) + + # Add to the existing line we're building, by including the prefix of this line + # and skipping the lines and characters until the end of this duplicate definition. + last_line_no = definition.start[0] + current_line += input_lines[last_line_no][last_col_no:definition.start[1]] + last_line_no = definition.end[0] + last_col_no = definition.end[1] + + new_line = current_line + input_lines[last_line_no][last_col_no:] + if not new_line.isspace(): + output_lines.append(new_line) + current_line = "" + last_line_no += 1 + last_col_no = 0 + + for line_to_copy in xrange(last_line_no, len(input_lines)): + output_lines.append(input_lines[line_to_copy]) + + if len(duplicates) > 0: + print "{0}: writing deduped copy...".format(xml_path) + + # Write the lines to a temporary file. + dirname, basename = os.path.split(xml_path) + temp_name = "" + with tempfile.NamedTemporaryFile(prefix=basename, dir=dirname, delete=False) as temp: + temp_name = temp.name + for line in output_lines: + temp.write(line.encode('utf-8')) + + # Now rename that file to the original so we have an atomic write that is consistent. + os.rename(temp.name, xml_path) + +def enumerate_files(res_path): + """Enumerates all files in the resource directory that are XML files and + within a values-* subdirectory. These types of files end up compiled + in the resources.arsc table of an APK. + """ + values_directories = os.listdir(res_path) + values_directories = filter(lambda f: f.startswith('values'), values_directories) + values_directories = map(lambda f: os.path.join(res_path, f), values_directories) + all_files = [] + for dir in values_directories: + files = os.listdir(dir) + files = filter(lambda f: f.endswith('.xml'), files) + files = map(lambda f: os.path.join(dir, f), files) + all_files += files + return all_files + +if __name__ == '__main__': + if len(sys.argv) < 2: + print >> sys.stderr, "please specify a path to a resource directory" + sys.exit(1) + + res_path = os.path.abspath(sys.argv[1]) + print "looking in {0} ...".format(res_path) + + for f in enumerate_files(res_path): + print "checking {0} ...".format(f) + remove_duplicates(f) + |