diff options
239 files changed, 3524 insertions, 2316 deletions
diff --git a/StubLibraries.bp b/StubLibraries.bp index b46d179a6a71..49a42d7525a5 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -16,12 +16,12 @@ // // raw source files --(metalava)--> stub source files --(javac)--> stub jar files // -// The metalava conversion is done by droidstub modules *-api-stubs-docs. -// The javac compilation is done by java_library modules android_*_stubs_current. +// - The metalava conversion is done by droidstub modules +// - The javac compilation is done by java_library modules +// // The metalava conversion is also responsible for creating API signature files -// and comparing them against the last API signature in api/*-current.txt files -// and also against the latest frozen API signature in prebuilts/sdk/*/*/api/android.txt -// files. +// and comparing them against the checked in API signature, and also checking compatibility +// with the latest frozen API signature. ///////////////////////////////////////////////////////////////////// // Common metalava configs @@ -41,7 +41,7 @@ packages_to_document = [ ] stubs_defaults { - name: "metalava-base-api-stubs-default", + name: "metalava-non-updatable-api-stubs-default", srcs: [ ":framework-non-updatable-sources", "core/java/**/*.logtags", @@ -51,11 +51,14 @@ stubs_defaults { ":android_icu4j_public_api_files", "**/package.html", ], + sdk_version: "core_platform", + arg_files: ["core/res/AndroidManifest.xml"], // TODO(b/147699819, b/169090544): remove below aidl includes. aidl: { local_include_dirs: [ - "telephony/java", + "apex/media/aidl/stable", "media/aidl", + "telephony/java", ], include_dirs: ["frameworks/av/aidl"], }, @@ -77,6 +80,12 @@ stubs_defaults { "android.hardware.usb.gadget-V1.0-java", "android.hardware.vibrator-V1.3-java", "framework-protos", + // There are a few classes from modules used as type arguments that + // need to be resolved by metalava. For now, we can use a previously + // finalized stub library to resolve them. If a new class gets added, + // this may be need to be revisited to use a manually maintained stub + // library with empty classes in order to resolve those references. + "sdk_system_30_android", ], high_mem: true, // Lots of sources => high memory use, see b/170701554 installable: false, @@ -89,31 +98,6 @@ stubs_defaults { filter_packages: packages_to_document, } -stubs_defaults { - name: "metalava-full-api-stubs-default", - defaults: ["metalava-base-api-stubs-default"], - srcs: [ - ":conscrypt.module.public.api{.public.stubs.source}", - ":framework-updatable-sources", - ], - sdk_version: "core_platform", -} - -stubs_defaults { - name: "metalava-non-updatable-api-stubs-default", - defaults: ["metalava-base-api-stubs-default"], - sdk_version: "core_platform", - // There are a few classes from modules used as type arguments that - // need to be resolved by metalava. For now, we can use a previously - // finalized stub library to resolve them. If a new class gets added, - // this may be need to be revisited to use a manually maintained stub - // library with empty classes in order to resolve those references. - libs: ["sdk_system_30_android"], - aidl: { - local_include_dirs: ["apex/media/aidl/stable"], - }, -} - ///////////////////////////////////////////////////////////////////// // These modules provide source files for the stub libraries ///////////////////////////////////////////////////////////////////// @@ -121,7 +105,6 @@ stubs_defaults { droidstubs { name: "api-stubs-docs-non-updatable", defaults: ["metalava-non-updatable-api-stubs-default"], - arg_files: ["core/res/AndroidManifest.xml"], args: metalava_framework_docs_args, check_api: { current: { @@ -140,23 +123,26 @@ droidstubs { }, } -priv_apps = " " + - "--show-annotation android.annotation.SystemApi\\(" + +priv_apps = + " --show-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + - "\\) " + "\\)" -module_libs = " " + - " --show-annotation android.annotation.SystemApi\\(" + - "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + - "\\)" + +priv_apps_in_stubs = " --show-for-stub-purposes-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + - "\\) " + "\\)" + +test = " --show-annotation android.annotation.TestApi" + +module_libs = + " --show-annotation android.annotation.SystemApi\\(" + + "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + + "\\)" droidstubs { name: "system-api-stubs-docs-non-updatable", defaults: ["metalava-non-updatable-api-stubs-default"], - arg_files: ["core/res/AndroidManifest.xml"], args: metalava_framework_docs_args + priv_apps, check_api: { current: { @@ -179,14 +165,7 @@ droidstubs { droidstubs { name: "test-api-stubs-docs-non-updatable", defaults: ["metalava-non-updatable-api-stubs-default"], - arg_files: [ - "core/res/AndroidManifest.xml", - ], - args: metalava_framework_docs_args - + " --show-annotation android.annotation.TestApi" - + " --show-for-stub-purposes-annotation android.annotation.SystemApi\\(" - + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" - + "\\)", + args: metalava_framework_docs_args + test + priv_apps_in_stubs, check_api: { current: { api_file: "core/api/test-current.txt", @@ -204,16 +183,10 @@ droidstubs { }, } -///////////////////////////////////////////////////////////////////// -// Following droidstub module for extra APIs for modules, -// namely @SystemApi(client=MODULE_LIBRARIES) APIs. -///////////////////////////////////////////////////////////////////// - droidstubs { name: "module-lib-api-stubs-docs-non-updatable", defaults: ["metalava-non-updatable-api-stubs-default"], - arg_files: ["core/res/AndroidManifest.xml"], - args: metalava_framework_docs_args + priv_apps + module_libs, + args: metalava_framework_docs_args + priv_apps_in_stubs + module_libs, check_api: { current: { api_file: "core/api/module-lib-current.txt", @@ -232,7 +205,7 @@ droidstubs { ///////////////////////////////////////////////////////////////////// // android_*_stubs_current modules are the stubs libraries compiled -// from *-api-stubs-docs +// from stub sources ///////////////////////////////////////////////////////////////////// java_defaults { diff --git a/apex/statsd/apex_manifest.json b/apex/statsd/apex_manifest.json index e2972e700880..1d029c61b4bf 100644 --- a/apex/statsd/apex_manifest.json +++ b/apex/statsd/apex_manifest.json @@ -1,5 +1,5 @@ { "name": "com.android.os.statsd", - "version": 300000000 + "version": 309999900 } diff --git a/config/hiddenapi-max-target-o.txt b/config/hiddenapi-max-target-o.txt index 023bf3876228..3fee56863cf5 100644 --- a/config/hiddenapi-max-target-o.txt +++ b/config/hiddenapi-max-target-o.txt @@ -91659,8 +91659,6 @@ Lcom/android/internal/R$dimen;->notification_expand_button_padding_top:I Lcom/android/internal/R$dimen;->notification_header_app_name_margin_start:I Lcom/android/internal/R$dimen;->notification_header_background_height:I Lcom/android/internal/R$dimen;->notification_header_expand_icon_size:I -Lcom/android/internal/R$dimen;->notification_header_height:I -Lcom/android/internal/R$dimen;->notification_header_icon_margin_end:I Lcom/android/internal/R$dimen;->notification_header_icon_size:I Lcom/android/internal/R$dimen;->notification_header_separating_margin:I Lcom/android/internal/R$dimen;->notification_header_shrink_min_width:I @@ -91674,7 +91672,6 @@ Lcom/android/internal/R$dimen;->notification_media_image_max_height_low_ram:I Lcom/android/internal/R$dimen;->notification_media_image_max_width:I Lcom/android/internal/R$dimen;->notification_media_image_max_width_low_ram:I Lcom/android/internal/R$dimen;->notification_messaging_spacing:I -Lcom/android/internal/R$dimen;->notification_min_content_height:I Lcom/android/internal/R$dimen;->notification_reply_inset:I Lcom/android/internal/R$dimen;->notification_right_icon_size:I Lcom/android/internal/R$dimen;->notification_right_icon_size_low_ram:I @@ -92444,7 +92441,6 @@ Lcom/android/internal/R$id;->remote_input_send:I Lcom/android/internal/R$id;->replaceText:I Lcom/android/internal/R$id;->replace_app_icon:I Lcom/android/internal/R$id;->replace_message:I -Lcom/android/internal/R$id;->reply_icon_action:I Lcom/android/internal/R$id;->resolver_list:I Lcom/android/internal/R$id;->rew:I Lcom/android/internal/R$id;->rightSpacer:I diff --git a/core/api/current.txt b/core/api/current.txt index 629bfe9fa269..ba52ccae153d 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52173,6 +52173,7 @@ package android.view { method public android.graphics.Canvas lockHardwareCanvas(); method public void readFromParcel(android.os.Parcel); method public void release(); + method public void setFrameRate(@FloatRange(from=0.0) float, int, boolean); method public void setFrameRate(@FloatRange(from=0.0) float, int); method @Deprecated public void unlockCanvas(android.graphics.Canvas); method public void unlockCanvasAndPost(android.graphics.Canvas); @@ -52220,6 +52221,7 @@ package android.view { method @NonNull public android.view.SurfaceControl.Transaction setAlpha(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0, to=1.0) float); method @NonNull public android.view.SurfaceControl.Transaction setBufferSize(@NonNull android.view.SurfaceControl, @IntRange(from=0) int, @IntRange(from=0) int); method @NonNull public android.view.SurfaceControl.Transaction setFrameRate(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0) float, int); + method @NonNull public android.view.SurfaceControl.Transaction setFrameRate(@NonNull android.view.SurfaceControl, @FloatRange(from=0.0) float, int, boolean); method @NonNull public android.view.SurfaceControl.Transaction setGeometry(@NonNull android.view.SurfaceControl, @Nullable android.graphics.Rect, @Nullable android.graphics.Rect, int); method @NonNull public android.view.SurfaceControl.Transaction setLayer(@NonNull android.view.SurfaceControl, @IntRange(from=java.lang.Integer.MIN_VALUE, to=java.lang.Integer.MAX_VALUE) int); method @NonNull public android.view.SurfaceControl.Transaction setVisibility(@NonNull android.view.SurfaceControl, boolean); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index e5d17d0da451..75f7ceca6450 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -384,6 +384,7 @@ public class Notification implements Parcelable private static final ArraySet<Integer> STANDARD_LAYOUTS = new ArraySet<>(); static { STANDARD_LAYOUTS.add(R.layout.notification_template_material_base); + STANDARD_LAYOUTS.add(R.layout.notification_template_material_heads_up_base); STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_base); STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_picture); STANDARD_LAYOUTS.add(R.layout.notification_template_material_big_text); @@ -4886,13 +4887,16 @@ public class Notification implements Parcelable mN.mUsesStandardHeader = false; } - private RemoteViews applyStandardTemplate(int resId, TemplateBindResult result) { - return applyStandardTemplate(resId, mParams.reset().fillTextsFrom(this), - result); + private RemoteViews applyStandardTemplate(int resId, int viewType, + TemplateBindResult result) { + return applyStandardTemplate(resId, + mParams.reset().viewType(viewType).fillTextsFrom(this), result); } private RemoteViews applyStandardTemplate(int resId, StandardTemplateParams p, TemplateBindResult result) { + p.headerless(resId == getBaseLayoutResource() + || resId == getHeadsUpBaseLayoutResource()); RemoteViews contentView = new BuilderRemoteViews(mContext.getApplicationInfo(), resId); resetStandardTemplate(contentView); @@ -4900,9 +4904,9 @@ public class Notification implements Parcelable final Bundle ex = mN.extras; updateBackgroundColor(contentView, p); bindNotificationHeader(contentView, p); - bindLargeIconAndReply(contentView, p, result); + bindLargeIconAndApplyMargin(contentView, p, result); boolean showProgress = handleProgressBar(contentView, ex, p); - if (p.title != null) { + if (p.title != null && p.title.length() > 0) { contentView.setViewVisibility(R.id.title, View.VISIBLE); contentView.setTextViewText(R.id.title, processTextSpans(p.title)); setTextViewColorPrimary(contentView, R.id.title, p); @@ -4918,8 +4922,6 @@ public class Notification implements Parcelable contentView.setViewVisibility(textId, View.VISIBLE); } - setContentMinHeight(contentView, showProgress || mN.hasLargeIcon()); - return contentView; } @@ -5077,21 +5079,6 @@ public class Notification implements Parcelable } } - /** - * @param remoteView the remote view to update the minheight in - * @param hasMinHeight does it have a mimHeight - * @hide - */ - void setContentMinHeight(RemoteViews remoteView, boolean hasMinHeight) { - int minHeight = 0; - if (hasMinHeight) { - // we need to set the minHeight of the notification - minHeight = mContext.getResources().getDimensionPixelSize( - com.android.internal.R.dimen.notification_min_content_height); - } - remoteView.setInt(R.id.notification_main_column, "setMinimumHeight", minHeight); - } - private boolean handleProgressBar(RemoteViews contentView, Bundle ex, StandardTemplateParams p) { final int max = ex.getInt(EXTRA_PROGRESS_MAX, 0); @@ -5117,53 +5104,39 @@ public class Notification implements Parcelable } } - private void bindLargeIconAndReply(RemoteViews contentView, StandardTemplateParams p, - TemplateBindResult result) { + private void bindLargeIconAndApplyMargin(RemoteViews contentView, + @NonNull StandardTemplateParams p, + @Nullable TemplateBindResult result) { + if (result == null) { + result = new TemplateBindResult(); + } boolean largeIconShown = bindLargeIcon(contentView, p); - boolean replyIconShown = bindReplyIcon(contentView, p); - boolean iconContainerVisible = largeIconShown || replyIconShown; - contentView.setViewVisibility(R.id.right_icon_container, - iconContainerVisible ? View.VISIBLE : View.GONE); - int marginEnd = calculateMarginEnd(largeIconShown, replyIconShown); - contentView.setViewLayoutMarginEnd(R.id.line1, marginEnd); - contentView.setViewLayoutMarginEnd(R.id.text, marginEnd); - contentView.setViewLayoutMarginEnd(R.id.progress, marginEnd); - if (result != null) { - result.setIconMarginEnd(marginEnd); - result.setRightIconContainerVisible(iconContainerVisible); + calculateLargeIconMarginEnd(largeIconShown, result); + if (p.mHeaderless) { + // views in the headerless (collapsed) state + contentView.setViewLayoutMarginEnd(R.id.notification_standard_view_column, + result.getHeadingExtraMarginEnd()); + } else { + // views in states with a header (big states) + contentView.setInt(R.id.notification_header, "setTopLineExtraMarginEnd", + result.getHeadingExtraMarginEnd()); + contentView.setViewLayoutMarginEnd(R.id.line1, result.getTitleMarginEnd()); } } - private int calculateMarginEnd(boolean largeIconShown, boolean replyIconShown) { - int marginEnd = 0; + private void calculateLargeIconMarginEnd(boolean largeIconShown, + @NonNull TemplateBindResult result) { int contentMargin = mContext.getResources().getDimensionPixelSize( R.dimen.notification_content_margin_end); - int iconSize = mContext.getResources().getDimensionPixelSize( - R.dimen.notification_right_icon_size); - if (replyIconShown) { - // The size of the reply icon - marginEnd += iconSize; - - int replyInset = mContext.getResources().getDimensionPixelSize( - R.dimen.notification_reply_inset); - // We're subtracting the inset of the reply icon to make sure it's - // aligned nicely on the right, and remove it from the following padding - marginEnd -= replyInset * 2; - } + int expanderSize = mContext.getResources().getDimensionPixelSize( + R.dimen.notification_header_expand_icon_size) - contentMargin; + int extraMarginEnd = 0; if (largeIconShown) { - // adding size of the right icon - marginEnd += iconSize; - - if (replyIconShown) { - // We also add some padding to the reply icon if it's around - marginEnd += contentMargin; - } - } - if (replyIconShown || largeIconShown) { - // The padding to the content - marginEnd += contentMargin; + int iconSize = mContext.getResources().getDimensionPixelSize( + R.dimen.notification_right_icon_size); + extraMarginEnd = iconSize + contentMargin; } - return marginEnd; + result.setRightIconState(largeIconShown, extraMarginEnd, expanderSize); } /** @@ -5183,54 +5156,12 @@ public class Notification implements Parcelable return showLargeIcon; } - /** - * Bind the reply icon. - * @return if the reply icon is visible - */ - private boolean bindReplyIcon(RemoteViews contentView, StandardTemplateParams p) { - boolean actionVisible = !p.hideReplyIcon; - Action action = null; - if (actionVisible) { - action = findReplyAction(); - actionVisible = action != null; - } - if (actionVisible) { - contentView.setViewVisibility(R.id.reply_icon_action, View.VISIBLE); - contentView.setDrawableTint(R.id.reply_icon_action, - false /* targetBackground */, - getNeutralColor(p), - PorterDuff.Mode.SRC_ATOP); - contentView.setOnClickPendingIntent(R.id.reply_icon_action, action.actionIntent); - contentView.setRemoteInputs(R.id.reply_icon_action, action.mRemoteInputs); - } else { - contentView.setRemoteInputs(R.id.reply_icon_action, null); - } - contentView.setViewVisibility(R.id.reply_icon_action, - actionVisible ? View.VISIBLE : View.GONE); - return actionVisible; - } - - private Action findReplyAction() { - ArrayList<Action> actions = mActions; - if (mOriginalActions != null) { - actions = mOriginalActions; - } - int numActions = actions.size(); - for (int i = 0; i < numActions; i++) { - Action action = actions.get(i); - if (hasValidRemoteInput(action)) { - return action; - } - } - return null; - } - private void bindNotificationHeader(RemoteViews contentView, StandardTemplateParams p) { bindSmallIcon(contentView, p); - bindHeaderAppName(contentView, p); - bindHeaderText(contentView, p); - bindHeaderTextSecondary(contentView, p); - bindHeaderChronometerAndTime(contentView, p); + boolean hasTextToLeft = bindHeaderAppName(contentView, p); + hasTextToLeft |= bindHeaderTextSecondary(contentView, p, hasTextToLeft); + hasTextToLeft |= bindHeaderText(contentView, p, hasTextToLeft); + bindHeaderChronometerAndTime(contentView, p, hasTextToLeft); bindProfileBadge(contentView, p); bindAlertedIcon(contentView, p); bindFeedbackIcon(contentView, p); @@ -5252,10 +5183,12 @@ public class Notification implements Parcelable } private void bindHeaderChronometerAndTime(RemoteViews contentView, - StandardTemplateParams p) { + StandardTemplateParams p, boolean hasTextToLeft) { if (showsTimeOrChronometer()) { - contentView.setViewVisibility(R.id.time_divider, View.VISIBLE); - setTextViewColorSecondary(contentView, R.id.time_divider, p); + if (hasTextToLeft) { + contentView.setViewVisibility(R.id.time_divider, View.VISIBLE); + setTextViewColorSecondary(contentView, R.id.time_divider, p); + } if (mN.extras.getBoolean(EXTRA_SHOW_CHRONOMETER)) { contentView.setViewVisibility(R.id.chronometer, View.VISIBLE); contentView.setLong(R.id.chronometer, "setBase", @@ -5276,7 +5209,11 @@ public class Notification implements Parcelable } } - private void bindHeaderText(RemoteViews contentView, StandardTemplateParams p) { + /** + * @return true if the header text will be visible + */ + private boolean bindHeaderText(RemoteViews contentView, StandardTemplateParams p, + boolean hasTextToLeft) { CharSequence summaryText = p.summaryText; if (summaryText == null && mStyle != null && mStyle.mSummaryTextSet && mStyle.hasSummaryInHeader()) { @@ -5293,20 +5230,32 @@ public class Notification implements Parcelable processLegacyText(summaryText))); setTextViewColorSecondary(contentView, R.id.header_text, p); contentView.setViewVisibility(R.id.header_text, View.VISIBLE); - contentView.setViewVisibility(R.id.header_text_divider, View.VISIBLE); - setTextViewColorSecondary(contentView, R.id.header_text_divider, p); + if (hasTextToLeft) { + contentView.setViewVisibility(R.id.header_text_divider, View.VISIBLE); + setTextViewColorSecondary(contentView, R.id.header_text_divider, p); + } + return true; } + return false; } - private void bindHeaderTextSecondary(RemoteViews contentView, StandardTemplateParams p) { + /** + * @return true if the secondary header text will be visible + */ + private boolean bindHeaderTextSecondary(RemoteViews contentView, StandardTemplateParams p, + boolean hasTextToLeft) { if (!TextUtils.isEmpty(p.headerTextSecondary)) { contentView.setTextViewText(R.id.header_text_secondary, processTextSpans( processLegacyText(p.headerTextSecondary))); setTextViewColorSecondary(contentView, R.id.header_text_secondary, p); contentView.setViewVisibility(R.id.header_text_secondary, View.VISIBLE); - contentView.setViewVisibility(R.id.header_text_secondary_divider, View.VISIBLE); - setTextViewColorSecondary(contentView, R.id.header_text_secondary_divider, p); + if (hasTextToLeft) { + contentView.setViewVisibility(R.id.header_text_secondary_divider, View.VISIBLE); + setTextViewColorSecondary(contentView, R.id.header_text_secondary_divider, p); + } + return true; } + return false; } /** @@ -5343,13 +5292,23 @@ public class Notification implements Parcelable return String.valueOf(name); } - private void bindHeaderAppName(RemoteViews contentView, StandardTemplateParams p) { + + /** + * @return true if the app name will be visible + */ + private boolean bindHeaderAppName(RemoteViews contentView, StandardTemplateParams p) { + if (p.mViewType == StandardTemplateParams.VIEW_TYPE_MINIMIZED) { + contentView.setViewVisibility(R.id.app_name_text, View.GONE); + return false; + } + contentView.setViewVisibility(R.id.app_name_text, View.VISIBLE); contentView.setTextViewText(R.id.app_name_text, loadHeaderAppName()); if (isColorized(p)) { setTextViewColorPrimary(contentView, R.id.app_name_text, p); } else { contentView.setTextColor(R.id.app_name_text, getSecondaryTextColor(p)); } + return true; } private boolean isColorized(StandardTemplateParams p) { @@ -5393,10 +5352,10 @@ public class Notification implements Parcelable R.dimen.notification_content_margin); } - private RemoteViews applyStandardTemplateWithActions(int layoutId, + private RemoteViews applyStandardTemplateWithActions(int layoutId, int viewType, TemplateBindResult result) { - return applyStandardTemplateWithActions(layoutId, mParams.reset().fillTextsFrom(this), - result); + return applyStandardTemplateWithActions(layoutId, + mParams.reset().viewType(viewType).fillTextsFrom(this), result); } private static List<Notification.Action> filterOutContextualActions( @@ -5536,7 +5495,8 @@ public class Notification implements Parcelable return styleView; } } - return applyStandardTemplate(getBaseLayoutResource(), null /* result */); + return applyStandardTemplate(getBaseLayoutResource(), + StandardTemplateParams.VIEW_TYPE_NORMAL, null /* result */); } private boolean useExistingRemoteView() { @@ -5551,12 +5511,14 @@ public class Notification implements Parcelable RemoteViews result = null; if (mN.bigContentView != null && useExistingRemoteView()) { return mN.bigContentView; - } else if (mStyle != null) { + } + if (mStyle != null) { result = mStyle.makeBigContentView(); hideLine1Text(result); - } else if (mActions.size() != 0) { + } + if (result == null) { result = applyStandardTemplateWithActions(getBigBaseLayoutResource(), - null /* result */); + StandardTemplateParams.VIEW_TYPE_BIG, null /* result */); } makeHeaderExpanded(result); return result; @@ -5569,7 +5531,9 @@ public class Notification implements Parcelable * @hide */ public RemoteViews makeNotificationHeader() { - return makeNotificationHeader(mParams.reset().fillTextsFrom(this)); + return makeNotificationHeader(mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_GROUP_HEADER) + .fillTextsFrom(this)); } /** @@ -5642,9 +5606,11 @@ public class Notification implements Parcelable // We only want at most a single remote input history to be shown here, otherwise // the content would become squished. - StandardTemplateParams p = mParams.reset().fillTextsFrom(this) + StandardTemplateParams p = mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_HEADS_UP) + .fillTextsFrom(this) .setMaxRemoteInputHistory(1); - return applyStandardTemplateWithActions(getBigBaseLayoutResource(), + return applyStandardTemplateWithActions(getHeadsUpBaseLayoutResource(), p, null /* result */); } @@ -5690,7 +5656,9 @@ public class Notification implements Parcelable } mN.extras = publicExtras; RemoteViews view; - StandardTemplateParams params = mParams.reset().fillTextsFrom(this); + StandardTemplateParams params = mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_PUBLIC) + .fillTextsFrom(this); if (isLowPriority) { params.forceDefaultColor(); } @@ -5714,6 +5682,7 @@ public class Notification implements Parcelable */ public RemoteViews makeLowPriorityContentView(boolean useRegularSubtext) { StandardTemplateParams p = mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_MINIMIZED) .forceDefaultColor() .fillTextsFrom(this); if (!useRegularSubtext || TextUtils.isEmpty(mParams.summaryText)) { @@ -6199,6 +6168,10 @@ public class Notification implements Parcelable return R.layout.notification_template_material_base; } + private int getHeadsUpBaseLayoutResource() { + return R.layout.notification_template_material_heads_up_base; + } + private int getBigBaseLayoutResource() { return R.layout.notification_template_material_big_base; } @@ -6610,7 +6583,10 @@ public class Notification implements Parcelable } protected RemoteViews getStandardView(int layoutId) { - StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder); + // TODO(jeffdq): set the view type based on the layout resource? + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_UNSPECIFIED) + .fillTextsFrom(mBuilder); return getStandardView(layoutId, p, null); } @@ -6939,7 +6915,8 @@ public class Notification implements Parcelable mBuilder.mN.largeIcon = null; } - StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder); + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_BIG).fillTextsFrom(mBuilder); RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource(), p, null /* result */); if (mSummaryTextSet) { @@ -6948,7 +6925,6 @@ public class Notification implements Parcelable mBuilder.setTextViewColorSecondary(contentView, R.id.text, p); contentView.setViewVisibility(R.id.text, View.VISIBLE); } - mBuilder.setContentMinHeight(contentView, mBuilder.mN.hasLargeIcon()); if (mBigLargeIconSet) { mBuilder.mN.mLargeIcon = oldLargeIcon; @@ -7144,6 +7120,7 @@ public class Notification implements Parcelable @Override public RemoteViews makeHeadsUpContentView(boolean increasedHeight) { if (increasedHeight && mBuilder.mActions.size() > 0) { + // TODO(b/163626038): pass VIEW_TYPE_HEADS_UP? return makeBigContentView(); } return super.makeHeadsUpContentView(increasedHeight); @@ -7153,11 +7130,10 @@ public class Notification implements Parcelable * @hide */ public RemoteViews makeBigContentView() { - StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder).text(null); - TemplateBindResult result = new TemplateBindResult(); - RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), p, - result); - contentView.setInt(R.id.big_text, "setImageEndMargin", result.getIconMarginEnd()); + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_BIG) + .fillTextsFrom(mBuilder).text(null); + RemoteViews contentView = getStandardView(mBuilder.getBigTextLayoutResource(), p, null); CharSequence bigTextText = mBuilder.processLegacyText(mBigText); if (TextUtils.isEmpty(bigTextText)) { @@ -7170,8 +7146,6 @@ public class Notification implements Parcelable mBuilder.setTextViewColorSecondary(contentView, R.id.big_text, p); contentView.setViewVisibility(R.id.big_text, TextUtils.isEmpty(bigTextText) ? View.GONE : View.VISIBLE); - contentView.setBoolean(R.id.big_text, "setHasImage", - result.isRightIconContainerVisible()); return contentView; } @@ -7755,11 +7729,12 @@ public class Notification implements Parcelable Icon largeIcon = mBuilder.mN.mLargeIcon; TemplateBindResult bindResult = new TemplateBindResult(); StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(isCollapsed ? StandardTemplateParams.VIEW_TYPE_NORMAL + : StandardTemplateParams.VIEW_TYPE_BIG) .hasProgress(false) .title(conversationTitle) .text(null) .hideLargeIcon(hideRightIcons || isOneToOne) - .hideReplyIcon(hideRightIcons) .headerTextSecondary(conversationTitle); RemoteViews contentView = mBuilder.applyStandardTemplateWithActions( isConversationLayout @@ -7772,7 +7747,7 @@ public class Notification implements Parcelable if (!isConversationLayout) { // also update the end margin if there is an image contentView.setViewLayoutMarginEnd(R.id.notification_messaging, - bindResult.getIconMarginEnd()); + bindResult.getHeadingExtraMarginEnd()); } contentView.setInt(R.id.status_bar_latest_event_content, "setLayoutColor", mBuilder.isColorized(p) @@ -8260,7 +8235,9 @@ public class Notification implements Parcelable * @hide */ public RemoteViews makeBigContentView() { - StandardTemplateParams p = mBuilder.mParams.reset().fillTextsFrom(mBuilder).text(null); + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_BIG) + .fillTextsFrom(mBuilder).text(null); TemplateBindResult result = new TemplateBindResult(); RemoteViews contentView = getStandardView(mBuilder.getInboxLayoutResource(), p, result); @@ -8312,8 +8289,6 @@ public class Notification implements Parcelable mBuilder.processTextSpans(mBuilder.processLegacyText(str))); mBuilder.setTextViewColorSecondary(contentView, rowIds[i], p); contentView.setViewPadding(rowIds[i], 0, topPadding, 0, 0); - handleInboxImageMargin(contentView, rowIds[i], first, - result.getIconMarginEnd()); if (first) { onlyViewId = rowIds[i]; } else { @@ -8359,20 +8334,6 @@ public class Notification implements Parcelable } return false; } - - private void handleInboxImageMargin(RemoteViews contentView, int id, boolean first, - int marginEndValue) { - int endMargin = 0; - if (first) { - final int max = mBuilder.mN.extras.getInt(EXTRA_PROGRESS_MAX, 0); - final boolean ind = mBuilder.mN.extras.getBoolean(EXTRA_PROGRESS_INDETERMINATE); - boolean hasProgress = max != 0 || ind; - if (!hasProgress) { - endMargin = marginEndValue; - } - } - contentView.setViewLayoutMarginEnd(id, endMargin); - } } /** @@ -8580,8 +8541,9 @@ public class Notification implements Parcelable } private RemoteViews makeMediaContentView() { - StandardTemplateParams p = mBuilder.mParams.reset().hasProgress(false).fillTextsFrom( - mBuilder); + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_NORMAL) + .hasProgress(false).fillTextsFrom(mBuilder); RemoteViews view = mBuilder.applyStandardTemplate( R.layout.notification_template_material_media, p, null /* result */); @@ -8627,8 +8589,9 @@ public class Notification implements Parcelable if (!mBuilder.mN.hasLargeIcon() && actionCount <= actionsInCompact) { return null; } - StandardTemplateParams p = mBuilder.mParams.reset().hasProgress(false).fillTextsFrom( - mBuilder); + StandardTemplateParams p = mBuilder.mParams.reset() + .viewType(StandardTemplateParams.VIEW_TYPE_BIG) + .hasProgress(false).fillTextsFrom(mBuilder); RemoteViews big = mBuilder.applyStandardTemplate( R.layout.notification_template_material_big_media, p , null /* result */); @@ -8727,16 +8690,18 @@ public class Notification implements Parcelable } TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions( - mBuilder.getBigBaseLayoutResource(), result); - buildIntoRemoteViewContent(remoteViews, headsUpContentView, result); + mBuilder.getHeadsUpBaseLayoutResource(), + StandardTemplateParams.VIEW_TYPE_HEADS_UP, result); + buildIntoRemoteViewContent(remoteViews, headsUpContentView, result, true); return remoteViews; } private RemoteViews makeStandardTemplateWithCustomContent(RemoteViews customContent) { TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplate( - mBuilder.getBaseLayoutResource(), result); - buildIntoRemoteViewContent(remoteViews, customContent, result); + mBuilder.getBaseLayoutResource(), + StandardTemplateParams.VIEW_TYPE_NORMAL, result); + buildIntoRemoteViewContent(remoteViews, customContent, result, true); return remoteViews; } @@ -8744,18 +8709,16 @@ public class Notification implements Parcelable RemoteViews bigContentView = mBuilder.mN.bigContentView == null ? mBuilder.mN.contentView : mBuilder.mN.bigContentView; - if (mBuilder.mActions.size() == 0) { - return makeStandardTemplateWithCustomContent(bigContentView); - } TemplateBindResult result = new TemplateBindResult(); RemoteViews remoteViews = mBuilder.applyStandardTemplateWithActions( - mBuilder.getBigBaseLayoutResource(), result); - buildIntoRemoteViewContent(remoteViews, bigContentView, result); + mBuilder.getBigBaseLayoutResource(), + StandardTemplateParams.VIEW_TYPE_BIG, result); + buildIntoRemoteViewContent(remoteViews, bigContentView, result, false); return remoteViews; } private void buildIntoRemoteViewContent(RemoteViews remoteViews, - RemoteViews customContent, TemplateBindResult result) { + RemoteViews customContent, TemplateBindResult result, boolean headerless) { int childIndex = -1; if (customContent != null) { // Need to clone customContent before adding, because otherwise it can no longer be @@ -8769,11 +8732,13 @@ public class Notification implements Parcelable remoteViews.setIntTag(R.id.notification_main_column, com.android.internal.R.id.notification_custom_view_index_tag, childIndex); - // also update the end margin if there is an image - Resources resources = mBuilder.mContext.getResources(); - int endMargin = resources.getDimensionPixelSize( - R.dimen.notification_content_margin_end) + result.getIconMarginEnd(); - remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column, endMargin); + if (!headerless) { + // also update the end margin to account for the large icon or expander + Resources resources = mBuilder.mContext.getResources(); + int endMargin = resources.getDimensionPixelSize( + R.dimen.notification_content_margin_end) + result.getTitleMarginEnd(); + remoteViews.setViewLayoutMarginEnd(R.id.notification_main_column, endMargin); + } } /** @@ -11009,35 +10974,57 @@ public class Notification implements Parcelable * A result object where information about the template that was created is saved. */ private static class TemplateBindResult { - int mIconMarginEnd; - boolean mRightIconContainerVisible; + boolean mRightIconVisible; + int mRightIconMarginEnd; + int mExpanderSize; /** - * Get the margin end that needs to be added to any fields that may overlap - * with the right actions. + * @return the margin end that needs to be added to the heading so that it won't overlap + * with the large icon. This value includes the space required to accommodate the large + * icon, but should be added to the space needed to accommodate the expander. This does + * not include the 16dp content margin that all notification views must have. */ - public int getIconMarginEnd() { - return mIconMarginEnd; + public int getHeadingExtraMarginEnd() { + return mRightIconMarginEnd; } /** - * Is the icon container visible on the right size because of the reply button or the - * right icon. + * @return the margin end that needs to be added to the heading so that it won't overlap + * with the large icon. This value includes the space required to accommodate the large + * icon as well as the expander. This does not include the 16dp content margin that all + * notification views must have. */ - public boolean isRightIconContainerVisible() { - return mRightIconContainerVisible; + public int getHeadingFullMarginEnd() { + return mRightIconMarginEnd + mExpanderSize; } - public void setIconMarginEnd(int iconMarginEnd) { - this.mIconMarginEnd = iconMarginEnd; + /** + * @return the margin end that needs to be added to the title text of the big state + * so that it won't overlap with the large icon, but assuming the text can run under + * the expander when that icon is not visible. + */ + public int getTitleMarginEnd() { + return mRightIconVisible ? getHeadingFullMarginEnd() : 0; } - public void setRightIconContainerVisible(boolean iconContainerVisible) { - mRightIconContainerVisible = iconContainerVisible; + public void setRightIconState(boolean visible, int marginEnd, int expanderSize) { + mRightIconVisible = visible; + mRightIconMarginEnd = marginEnd; + mExpanderSize = expanderSize; } } private static class StandardTemplateParams { + public static int VIEW_TYPE_UNSPECIFIED = 0; + public static int VIEW_TYPE_NORMAL = 1; + public static int VIEW_TYPE_BIG = 2; + public static int VIEW_TYPE_HEADS_UP = 3; + public static int VIEW_TYPE_MINIMIZED = 4; + public static int VIEW_TYPE_PUBLIC = 5; + public static int VIEW_TYPE_GROUP_HEADER = 6; + + int mViewType = VIEW_TYPE_UNSPECIFIED; + boolean mHeaderless; boolean hasProgress = true; CharSequence title; CharSequence text; @@ -11045,11 +11032,12 @@ public class Notification implements Parcelable CharSequence summaryText; int maxRemoteInputHistory = Style.MAX_REMOTE_INPUT_HISTORY_LINES; boolean hideLargeIcon; - boolean hideReplyIcon; boolean allowColorization = true; boolean forceDefaultColor = false; final StandardTemplateParams reset() { + mViewType = VIEW_TYPE_UNSPECIFIED; + mHeaderless = false; hasProgress = true; title = null; text = null; @@ -11061,6 +11049,16 @@ public class Notification implements Parcelable return this; } + final StandardTemplateParams viewType(int viewType) { + mViewType = viewType; + return this; + } + + public StandardTemplateParams headerless(boolean headerless) { + mHeaderless = headerless; + return this; + } + final StandardTemplateParams hasProgress(boolean hasProgress) { this.hasProgress = hasProgress; return this; @@ -11091,11 +11089,6 @@ public class Notification implements Parcelable return this; } - final StandardTemplateParams hideReplyIcon(boolean hideReplyIcon) { - this.hideReplyIcon = hideReplyIcon; - return this; - } - final StandardTemplateParams disallowColorization() { this.allowColorization = false; return this; diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 51e0eba1ec23..a4e573876218 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -24,6 +24,7 @@ import static android.Manifest.permission.USE_BIOMETRIC; import static android.Manifest.permission.USE_BIOMETRIC_INTERNAL; import static android.Manifest.permission.USE_FINGERPRINT; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresFeature; @@ -55,6 +56,8 @@ import android.security.identity.IdentityCredential; import android.util.Slog; import android.view.Surface; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.security.Signature; import java.util.ArrayList; import java.util.List; @@ -87,6 +90,19 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing private static final int MSG_CHALLENGE_GENERATED = 106; private static final int MSG_FINGERPRINT_DETECTED = 107; + /** + * Request authentication with any single sensor. + * @hide + */ + public static final int SENSOR_ID_ANY = -1; + + /** + * @hide + */ + @IntDef({SENSOR_ID_ANY}) + @Retention(RetentionPolicy.SOURCE) + public @interface SensorId {} + private IFingerprintService mService; private Context mContext; private IBinder mToken = new Binder(); @@ -461,15 +477,23 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing } /** - * Per-user version, see {@link FingerprintManager#authenticate(CryptoObject, - * CancellationSignal, int, AuthenticationCallback, Handler)}. This version does not - * display the BiometricPrompt. - * @param userId the user ID that the fingerprint hardware will authenticate for. + * Per-user version of authenticate. * @hide */ @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT}) public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, @NonNull AuthenticationCallback callback, Handler handler, int userId) { + authenticate(crypto, cancel, callback, handler, SENSOR_ID_ANY, userId); + } + + /** + * Per-user and per-sensor version of authenticate. + * @hide + */ + @RequiresPermission(anyOf = {USE_BIOMETRIC, USE_FINGERPRINT}) + public void authenticate(@Nullable CryptoObject crypto, @Nullable CancellationSignal cancel, + @NonNull AuthenticationCallback callback, Handler handler, @SensorId int sensorId, + int userId) { if (callback == null) { throw new IllegalArgumentException("Must supply an authentication callback"); } @@ -489,7 +513,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing mAuthenticationCallback = callback; mCryptoObject = crypto; final long operationId = crypto != null ? crypto.getOpId() : 0; - mService.authenticate(mToken, operationId, userId, mServiceReceiver, + mService.authenticate(mToken, operationId, sensorId, userId, mServiceReceiver, mContext.getOpPackageName()); } catch (RemoteException e) { Slog.w(TAG, "Remote exception while authenticating: ", e); diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 9248b08f260d..a4ce29ba4ea0 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -46,7 +46,7 @@ interface IFingerprintService { // Authenticate the given sessionId with a fingerprint. This is protected by // USE_FINGERPRINT/USE_BIOMETRIC permission. This is effectively deprecated, since it only comes // through FingerprintManager now. - void authenticate(IBinder token, long operationId, int userId, + void authenticate(IBinder token, long operationId, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName); // Uses the fingerprint hardware to detect for the presence of a finger, without giving details diff --git a/core/java/android/inputmethodservice/AbstractInputMethodService.java b/core/java/android/inputmethodservice/AbstractInputMethodService.java index cd436374b489..7cf0b10031ac 100644 --- a/core/java/android/inputmethodservice/AbstractInputMethodService.java +++ b/core/java/android/inputmethodservice/AbstractInputMethodService.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.app.Service; import android.content.Intent; import android.os.IBinder; +import android.util.proto.ProtoOutputStream; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.inputmethod.InputConnection; @@ -195,15 +196,13 @@ public abstract class AbstractInputMethodService extends Service public abstract AbstractInputMethodSessionImpl onCreateInputMethodSessionInterface(); /** - * Dumps the internal state of IME to a protocol buffer output stream initialized using the - * given {@link FileDescriptor}. + * Dumps the internal state of IME to a protocol buffer output stream. * - * @param fd The file descriptor to which proto dump should be written. - * @param args The arguments passed to the dump method. + * @param proto ProtoOutputStream to dump data to. * @hide */ @SuppressWarnings("HiddenAbstractMethod") - abstract void dumpProtoInternal(FileDescriptor fd, String[] args); + public abstract void dumpProtoInternal(ProtoOutputStream proto); /** * Implement this to handle {@link android.os.Binder#dump Binder.dump()} diff --git a/core/java/android/inputmethodservice/IInputMethodWrapper.java b/core/java/android/inputmethodservice/IInputMethodWrapper.java index 3d1755e9b017..5cfcd667632b 100644 --- a/core/java/android/inputmethodservice/IInputMethodWrapper.java +++ b/core/java/android/inputmethodservice/IInputMethodWrapper.java @@ -16,8 +16,6 @@ package android.inputmethodservice; -import static android.util.imetracing.ImeTracing.PROTO_ARG; - import android.annotation.BinderThread; import android.annotation.MainThread; import android.annotation.Nullable; @@ -157,20 +155,9 @@ class IInputMethodWrapper extends IInputMethod.Stub return; } SomeArgs args = (SomeArgs)msg.obj; - String[] dumpArgs = (String[]) args.arg3; - boolean protoDumpRequested = false; - for (String arg : dumpArgs) { - if (arg.equals(PROTO_ARG)) { - protoDumpRequested = true; - break; - } - } try { - if (protoDumpRequested) { - target.dumpProtoInternal((FileDescriptor) args.arg1, dumpArgs); - } else { - target.dump((FileDescriptor) args.arg1, (PrintWriter) args.arg2, dumpArgs); - } + target.dump((FileDescriptor) args.arg1, + (PrintWriter) args.arg2, (String[]) args.arg3); } catch (RuntimeException e) { ((PrintWriter)args.arg2).println("Exception: " + e); } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 44640c44332e..ae260e16806f 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -16,7 +16,6 @@ package android.inputmethodservice; -import static android.graphics.Color.TRANSPARENT; import static android.inputmethodservice.InputMethodServiceProto.CANDIDATES_VIEW_STARTED; import static android.inputmethodservice.InputMethodServiceProto.CANDIDATES_VISIBILITY; import static android.inputmethodservice.InputMethodServiceProto.CONFIGURATION; @@ -50,6 +49,7 @@ import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static android.view.WindowInsets.Type.navigationBars; +import static android.view.WindowInsets.Type.statusBars; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -90,6 +90,7 @@ import android.text.method.MovementMethod; import android.util.Log; import android.util.PrintWriterPrinter; import android.util.Printer; +import android.util.imetracing.ImeTracing; import android.util.proto.ProtoOutputStream; import android.view.Gravity; import android.view.KeyCharacterMap; @@ -116,6 +117,7 @@ import android.view.inputmethod.InputBinding; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputContentInfo; import android.view.inputmethod.InputMethod; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodServiceTraceProto; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; import android.widget.FrameLayout; @@ -708,6 +710,8 @@ public class InputMethodService extends AbstractInputMethodService { + " Use requestHideSelf(int) itself"); return; } + ImeTracing.getInstance().triggerServiceDump( + "InputMethodService.InputMethodImpl#hideSoftInput", InputMethodService.this); final boolean wasVisible = isInputViewShown(); Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.hideSoftInput"); @@ -762,6 +766,8 @@ public class InputMethodService extends AbstractInputMethodService { Binder.disableTracing(); } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.showSoftInput"); + ImeTracing.getInstance().triggerServiceDump( + "InputMethodService.InputMethodImpl#showSoftInput", InputMethodService.this); final boolean wasVisible = isInputViewShown(); if (dispatchOnShowInputRequested(flags, false)) { @@ -1244,13 +1250,8 @@ public class InputMethodService extends AbstractInputMethodService { Context.LAYOUT_INFLATER_SERVICE); mWindow = new SoftInputWindow(this, "InputMethod", mTheme, null, null, mDispatcherState, WindowManager.LayoutParams.TYPE_INPUT_METHOD, Gravity.BOTTOM, false); - mWindow.getWindow().getAttributes().setFitInsetsTypes(navigationBars()); + mWindow.getWindow().getAttributes().setFitInsetsTypes(statusBars() | navigationBars()); mWindow.getWindow().getAttributes().setFitInsetsSides(Side.all() & ~Side.BOTTOM); - mWindow.getWindow().getAttributes().setFitInsetsIgnoringVisibility(true); - - // Our window will extend into the status bar area no matter the bar is visible or not. - // We don't want the ColorView to be visible when status bar is shown. - mWindow.getWindow().setStatusBarColor(TRANSPARENT); // Automotive devices may request the navigation bar to be hidden when the IME shows up // (controlled via config_automotiveHideNavBarForKeyboard) in order to maximize the visible @@ -2138,6 +2139,8 @@ public class InputMethodService extends AbstractInputMethodService { return; } + ImeTracing.getInstance().triggerServiceDump("InputMethodService#showWindow", this); + mDecorViewWasVisible = mDecorViewVisible; mInShowWindow = true; final int previousImeWindowStatus = @@ -2212,6 +2215,8 @@ public class InputMethodService extends AbstractInputMethodService { * @param setVisible {@code true} to make it visible, false to hide it. */ private void applyVisibilityInInsetsConsumerIfNecessary(boolean setVisible) { + ImeTracing.getInstance().triggerServiceDump( + "InputMethodService#applyVisibilityInInsetsConsumerIfNecessary", this); mPrivOps.applyImeVisibility(setVisible ? mCurShowInputToken : mCurHideInputToken, setVisible); } @@ -2236,6 +2241,7 @@ public class InputMethodService extends AbstractInputMethodService { public void hideWindow() { if (DEBUG) Log.v(TAG, "CALL: hideWindow"); + ImeTracing.getInstance().triggerServiceDump("InputMethodService#hideWindow", this); mWindowVisible = false; finishViews(false /* finishingInput */); if (mDecorViewVisible) { @@ -2306,6 +2312,7 @@ public class InputMethodService extends AbstractInputMethodService { void doFinishInput() { if (DEBUG) Log.v(TAG, "CALL: doFinishInput"); + ImeTracing.getInstance().triggerServiceDump("InputMethodService#doFinishInput", this); finishViews(true /* finishingInput */); if (mInputStarted) { mInlineSuggestionSessionController.notifyOnFinishInput(); @@ -2321,6 +2328,7 @@ public class InputMethodService extends AbstractInputMethodService { if (!restarting) { doFinishInput(); } + ImeTracing.getInstance().triggerServiceDump("InputMethodService#doStartInput", this); mInputStarted = true; mStartedInputConnection = ic; mInputEditorInfo = attribute; @@ -2479,6 +2487,7 @@ public class InputMethodService extends AbstractInputMethodService { * @param flags Provides additional operating flags. */ public void requestHideSelf(int flags) { + ImeTracing.getInstance().triggerServiceDump("InputMethodService#requestHideSelf", this); mPrivOps.hideMySoftInput(flags); } @@ -2491,6 +2500,7 @@ public class InputMethodService extends AbstractInputMethodService { * @param flags Provides additional operating flags. */ public final void requestShowSelf(int flags) { + ImeTracing.getInstance().triggerServiceDump("InputMethodService#requestShowSelf", this); mPrivOps.showMySoftInput(flags); } @@ -3310,8 +3320,8 @@ public class InputMethodService extends AbstractInputMethodService { * @hide */ @Override - final void dumpProtoInternal(FileDescriptor fd, String[] args) { - final ProtoOutputStream proto = new ProtoOutputStream(fd); + public final void dumpProtoInternal(ProtoOutputStream proto) { + final long token = proto.start(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE); mWindow.dumpDebug(proto, SOFT_INPUT_WINDOW); proto.write(VIEWS_CREATED, mViewsCreated); proto.write(DECOR_VIEW_VISIBLE, mDecorViewVisible); @@ -3339,6 +3349,6 @@ public class InputMethodService extends AbstractInputMethodService { proto.write(STATUS_ICON, mStatusIcon); mTmpInsets.dumpDebug(proto, LAST_COMPUTED_INSETS); proto.write(SETTINGS_OBSERVER, Objects.toString(mSettingsObserver)); - proto.flush(); + proto.end(token); } } diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java index f584bcd6b23f..5d718440e2da 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java @@ -98,7 +98,7 @@ class QuickAccessWalletServiceInfo { intent.setPackage(packageName); List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentServices(intent, - PackageManager.MATCH_DEFAULT_ONLY); + PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA); return resolveInfos.isEmpty() ? null : resolveInfos.get(0).serviceInfo; } diff --git a/core/java/android/util/imetracing/ImeTracing.java b/core/java/android/util/imetracing/ImeTracing.java index 865d5608a40a..4058eef3e2a3 100644 --- a/core/java/android/util/imetracing/ImeTracing.java +++ b/core/java/android/util/imetracing/ImeTracing.java @@ -16,17 +16,22 @@ package android.util.imetracing; +import android.annotation.Nullable; import android.app.ActivityThread; import android.content.Context; +import android.inputmethodservice.AbstractInputMethodService; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; import android.os.ShellCommand; import android.util.Log; import android.util.proto.ProtoOutputStream; +import android.view.inputmethod.InputMethodManager; import com.android.internal.view.IInputMethodManager; +import java.io.PrintWriter; + /** * * An abstract class that declares the methods for ime trace related operations - enable trace, @@ -40,10 +45,18 @@ public abstract class ImeTracing { static final String TAG = "imeTracing"; public static final String PROTO_ARG = "--proto-com-android-imetracing"; + /* Constants describing the component type that triggered a dump. */ + public static final int IME_TRACING_FROM_CLIENT = 0; + public static final int IME_TRACING_FROM_IMS = 1; + public static final int IME_TRACING_FROM_IMMS = 2; + private static ImeTracing sInstance; static boolean sEnabled = false; IInputMethodManager mService; + protected boolean mDumpInProgress; + protected final Object mDumpInProgressLock = new Object(); + ImeTracing() throws ServiceNotFoundException { mService = IInputMethodManager.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.INPUT_METHOD_SERVICE)); @@ -69,15 +82,22 @@ public abstract class ImeTracing { } /** - * Sends request to start proto dump to {@link ImeTracingServerImpl} when called from a - * server process and to {@link ImeTracingClientImpl} when called from a client process. + * Transmits the information from client or InputMethodService side to the server, in order to + * be stored persistently to the current IME tracing dump. + * + * @param protoDump client or service side information to be stored by the server + * @param source where the information is coming from, refer to {@see #IME_TRACING_FROM_CLIENT} + * and {@see #IME_TRACING_FROM_IMS} + * @param where */ - public abstract void triggerDump(); + public void sendToService(byte[] protoDump, int source, String where) throws RemoteException { + mService.startProtoDump(protoDump, source, where); + } /** * @param proto dump to be added to the buffer */ - public abstract void addToBuffer(ProtoOutputStream proto); + public abstract void addToBuffer(ProtoOutputStream proto, int source); /** * @param shell The shell command to process @@ -86,6 +106,28 @@ public abstract class ImeTracing { public abstract int onShellCommand(ShellCommand shell); /** + * Starts a proto dump of the client side information. + * + * @param where Place where the trace was triggered. + * @param immInstance The {@link InputMethodManager} instance to dump. + */ + public abstract void triggerClientDump(String where, InputMethodManager immInstance); + + /** + * Starts a proto dump of the currently connected InputMethodService information. + * + * @param where Place where the trace was triggered. + */ + public abstract void triggerServiceDump(String where, AbstractInputMethodService service); + + /** + * Starts a proto dump of the InputMethodManagerService information. + * + * @param where Place where the trace was triggered. + */ + public abstract void triggerManagerServiceDump(String where); + + /** * Sets whether ime tracing is enabled. * * @param enabled Tells whether ime tracing should be enabled or disabled. @@ -108,7 +150,43 @@ public abstract class ImeTracing { return mService != null; } + /** + * Writes the current tracing data to the specific output proto file. + */ + public abstract void writeTracesToFiles(); + + /** + * Starts a new IME trace if one is not already started. + * + * @param pw Print writer + */ + public abstract void startTrace(@Nullable PrintWriter pw); + + /** + * Stops the IME trace if one was previously started and writes the current buffers to disk. + * + * @param pw Print writer + */ + public abstract void stopTrace(@Nullable PrintWriter pw); + + /** + * Stops the IME trace if one was previously started. + * + * @param pw Print writer + * @param writeToFile If the current buffer should be written to disk or not + */ + public abstract void stopTrace(@Nullable PrintWriter pw, boolean writeToFile); + private static boolean isSystemProcess() { return ActivityThread.isSystem(); } + + protected void logAndPrintln(@Nullable PrintWriter pw, String msg) { + Log.i(TAG, msg); + if (pw != null) { + pw.println(msg); + pw.flush(); + } + } + } diff --git a/core/java/android/util/imetracing/ImeTracingClientImpl.java b/core/java/android/util/imetracing/ImeTracingClientImpl.java index e5d7d3380d02..904b44da97d7 100644 --- a/core/java/android/util/imetracing/ImeTracingClientImpl.java +++ b/core/java/android/util/imetracing/ImeTracingClientImpl.java @@ -16,6 +16,8 @@ package android.util.imetracing; +import android.annotation.NonNull; +import android.inputmethodservice.AbstractInputMethodService; import android.os.RemoteException; import android.os.ServiceManager.ServiceNotFoundException; import android.os.ShellCommand; @@ -23,20 +25,18 @@ import android.util.Log; import android.util.proto.ProtoOutputStream; import android.view.inputmethod.InputMethodManager; +import java.io.PrintWriter; + /** * @hide */ class ImeTracingClientImpl extends ImeTracing { - - private boolean mDumpInProgress; - private final Object mDumpInProgressLock = new Object(); - ImeTracingClientImpl() throws ServiceNotFoundException, RemoteException { sEnabled = mService.isImeTraceEnabled(); } @Override - public void addToBuffer(ProtoOutputStream proto) { + public void addToBuffer(ProtoOutputStream proto, int source) { } @Override @@ -45,27 +45,71 @@ class ImeTracingClientImpl extends ImeTracing { } @Override - public void triggerDump() { - if (isAvailable() && isEnabled()) { - boolean doDump = false; - synchronized (mDumpInProgressLock) { - if (!mDumpInProgress) { - mDumpInProgress = true; - doDump = true; - } + public void triggerClientDump(String where, @NonNull InputMethodManager immInstance) { + if (!isEnabled() || !isAvailable()) { + return; + } + + synchronized (mDumpInProgressLock) { + if (mDumpInProgress) { + return; } + mDumpInProgress = true; + } - if (doDump) { - try { - ProtoOutputStream proto = new ProtoOutputStream(); - InputMethodManager.dumpProto(proto); - mService.startProtoDump(proto.getBytes()); - } catch (RemoteException e) { - Log.e(TAG, "Exception while sending ime-related client dump to server", e); - } finally { - mDumpInProgress = false; - } + try { + ProtoOutputStream proto = new ProtoOutputStream(); + immInstance.dumpDebug(proto); + sendToService(proto.getBytes(), IME_TRACING_FROM_CLIENT, where); + } catch (RemoteException e) { + Log.e(TAG, "Exception while sending ime-related client dump to server", e); + } finally { + mDumpInProgress = false; + } + } + + @Override + public void triggerServiceDump(String where, @NonNull AbstractInputMethodService service) { + if (!isEnabled() || !isAvailable()) { + return; + } + + synchronized (mDumpInProgressLock) { + if (mDumpInProgress) { + return; } + mDumpInProgress = true; } + + try { + ProtoOutputStream proto = new ProtoOutputStream(); + service.dumpProtoInternal(proto); + sendToService(proto.getBytes(), IME_TRACING_FROM_IMS, where); + } catch (RemoteException e) { + Log.e(TAG, "Exception while sending ime-related service dump to server", e); + } finally { + mDumpInProgress = false; + } + } + + @Override + public void triggerManagerServiceDump(String where) { + // Intentionally left empty, this is implemented in ImeTracingServerImpl + } + + @Override + public void writeTracesToFiles() { + } + + @Override + public void startTrace(PrintWriter pw) { + } + + @Override + public void stopTrace(PrintWriter pw) { + } + + @Override + public void stopTrace(PrintWriter pw, boolean writeToFile) { } } diff --git a/core/java/android/util/imetracing/ImeTracingServerImpl.java b/core/java/android/util/imetracing/ImeTracingServerImpl.java index 350cf5721148..d758d77fb2f2 100644 --- a/core/java/android/util/imetracing/ImeTracingServerImpl.java +++ b/core/java/android/util/imetracing/ImeTracingServerImpl.java @@ -17,15 +17,18 @@ package android.util.imetracing; import static android.os.Build.IS_USER; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorTraceFileProto.MAGIC_NUMBER; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorTraceFileProto.MAGIC_NUMBER_H; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorTraceFileProto.MAGIC_NUMBER_L; +import android.annotation.Nullable; +import android.inputmethodservice.AbstractInputMethodService; import android.os.RemoteException; import android.os.ServiceManager.ServiceNotFoundException; import android.os.ShellCommand; import android.util.Log; import android.util.proto.ProtoOutputStream; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceFileProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodManagerServiceTraceFileProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodServiceTraceFileProto; +import android.view.inputmethod.InputMethodManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.util.TraceBuffer; @@ -38,31 +41,68 @@ import java.io.PrintWriter; * @hide */ class ImeTracingServerImpl extends ImeTracing { - private static final String TRACE_FILENAME = "/data/misc/wmtrace/ime_trace.pb"; + private static final String TRACE_DIRNAME = "/data/misc/wmtrace/"; + private static final String TRACE_FILENAME_CLIENTS = "ime_trace_clients.pb"; + private static final String TRACE_FILENAME_IMS = "ime_trace_service.pb"; + private static final String TRACE_FILENAME_IMMS = "ime_trace_managerservice.pb"; private static final int BUFFER_CAPACITY = 4096 * 1024; // Needed for winscope to auto-detect the dump type. Explained further in - // core.proto.android.view.inputmethod.inputmethodeditortrace.proto - private static final long MAGIC_NUMBER_VALUE = ((long) MAGIC_NUMBER_H << 32) | MAGIC_NUMBER_L; + // core.proto.android.view.inputmethod.inputmethodeditortrace.proto. + // This magic number corresponds to InputMethodClientsTraceFileProto. + private static final long MAGIC_NUMBER_CLIENTS_VALUE = + ((long) InputMethodClientsTraceFileProto.MAGIC_NUMBER_H << 32) + | InputMethodClientsTraceFileProto.MAGIC_NUMBER_L; + // This magic number corresponds to InputMethodServiceTraceFileProto. + private static final long MAGIC_NUMBER_IMS_VALUE = + ((long) InputMethodServiceTraceFileProto.MAGIC_NUMBER_H << 32) + | InputMethodServiceTraceFileProto.MAGIC_NUMBER_L; + // This magic number corresponds to InputMethodManagerServiceTraceFileProto. + private static final long MAGIC_NUMBER_IMMS_VALUE = + ((long) InputMethodManagerServiceTraceFileProto.MAGIC_NUMBER_H << 32) + | InputMethodManagerServiceTraceFileProto.MAGIC_NUMBER_L; + + private final TraceBuffer mBufferClients; + private final File mTraceFileClients; + private final TraceBuffer mBufferIms; + private final File mTraceFileIms; + private final TraceBuffer mBufferImms; + private final File mTraceFileImms; - private final TraceBuffer mBuffer; - private final File mTraceFile; private final Object mEnabledLock = new Object(); ImeTracingServerImpl() throws ServiceNotFoundException { - mBuffer = new TraceBuffer<>(BUFFER_CAPACITY); - mTraceFile = new File(TRACE_FILENAME); + mBufferClients = new TraceBuffer<>(BUFFER_CAPACITY); + mTraceFileClients = new File(TRACE_DIRNAME + TRACE_FILENAME_CLIENTS); + mBufferIms = new TraceBuffer<>(BUFFER_CAPACITY); + mTraceFileIms = new File(TRACE_DIRNAME + TRACE_FILENAME_IMS); + mBufferImms = new TraceBuffer<>(BUFFER_CAPACITY); + mTraceFileImms = new File(TRACE_DIRNAME + TRACE_FILENAME_IMMS); } /** - * The provided dump is added to the current dump buffer {@link ImeTracingServerImpl#mBuffer}. + * The provided dump is added to the corresponding dump buffer: + * {@link ImeTracingServerImpl#mBufferClients} or {@link ImeTracingServerImpl#mBufferIms}. * * @param proto dump to be added to the buffer */ @Override - public void addToBuffer(ProtoOutputStream proto) { + public void addToBuffer(ProtoOutputStream proto, int source) { if (isAvailable() && isEnabled()) { - mBuffer.add(proto); + switch (source) { + case IME_TRACING_FROM_CLIENT: + mBufferClients.add(proto); + return; + case IME_TRACING_FROM_IMS: + mBufferIms.add(proto); + return; + case IME_TRACING_FROM_IMMS: + mBufferImms.add(proto); + return; + default: + // Source not recognised. + Log.w(TAG, "Request to add to buffer, but source not recognised."); + } } } @@ -93,28 +133,70 @@ class ImeTracingServerImpl extends ImeTracing { } @Override - public void triggerDump() { - if (isAvailable() && isEnabled()) { - try { - mService.startProtoDump(null); - } catch (RemoteException e) { - Log.e(TAG, "Exception while triggering proto dump", e); + public void triggerClientDump(String where, InputMethodManager immInstance) { + // Intentionally left empty, this is implemented in ImeTracingClientImpl + } + + @Override + public void triggerServiceDump(String where, AbstractInputMethodService service) { + // Intentionally left empty, this is implemented in ImeTracingClientImpl + } + + @Override + public void triggerManagerServiceDump(String where) { + if (!isEnabled() || !isAvailable()) { + return; + } + + synchronized (mDumpInProgressLock) { + if (mDumpInProgress) { + return; } + mDumpInProgress = true; + } + + try { + sendToService(null, IME_TRACING_FROM_IMMS, where); + } catch (RemoteException e) { + Log.e(TAG, "Exception while sending ime-related manager service dump to server", e); + } finally { + mDumpInProgress = false; + } + } + + @GuardedBy("mEnabledLock") + @Override + public void writeTracesToFiles() { + synchronized (mEnabledLock) { + writeTracesToFilesLocked(); } } - private void writeTraceToFileLocked() { + private void writeTracesToFilesLocked() { try { - ProtoOutputStream proto = new ProtoOutputStream(); - proto.write(MAGIC_NUMBER, MAGIC_NUMBER_VALUE); - mBuffer.writeTraceToFile(mTraceFile, proto); + ProtoOutputStream clientsProto = new ProtoOutputStream(); + clientsProto.write(InputMethodClientsTraceFileProto.MAGIC_NUMBER, + MAGIC_NUMBER_CLIENTS_VALUE); + mBufferClients.writeTraceToFile(mTraceFileClients, clientsProto); + + ProtoOutputStream imsProto = new ProtoOutputStream(); + imsProto.write(InputMethodServiceTraceFileProto.MAGIC_NUMBER, MAGIC_NUMBER_IMS_VALUE); + mBufferIms.writeTraceToFile(mTraceFileIms, imsProto); + + ProtoOutputStream immsProto = new ProtoOutputStream(); + immsProto.write(InputMethodManagerServiceTraceFileProto.MAGIC_NUMBER, + MAGIC_NUMBER_IMMS_VALUE); + mBufferImms.writeTraceToFile(mTraceFileImms, immsProto); + + resetBuffers(); } catch (IOException e) { Log.e(TAG, "Unable to write buffer to file", e); } } @GuardedBy("mEnabledLock") - private void startTrace(PrintWriter pw) { + @Override + public void startTrace(@Nullable PrintWriter pw) { if (IS_USER) { Log.w(TAG, "Warn: Tracing is not supported on user builds."); return; @@ -126,14 +208,21 @@ class ImeTracingServerImpl extends ImeTracing { return; } - pw.println("Starting tracing to " + mTraceFile + "."); + logAndPrintln(pw, "Starting tracing in " + TRACE_DIRNAME + ": " + TRACE_FILENAME_CLIENTS + + ", " + TRACE_FILENAME_IMS + ", " + TRACE_FILENAME_IMMS); sEnabled = true; - mBuffer.resetBuffer(); + resetBuffers(); } } + @Override + public void stopTrace(@Nullable PrintWriter pw) { + stopTrace(pw, true /* writeToFile */); + } + @GuardedBy("mEnabledLock") - private void stopTrace(PrintWriter pw) { + @Override + public void stopTrace(@Nullable PrintWriter pw, boolean writeToFile) { if (IS_USER) { Log.w(TAG, "Warn: Tracing is not supported on user builds."); return; @@ -145,10 +234,19 @@ class ImeTracingServerImpl extends ImeTracing { return; } - pw.println("Stopping tracing and writing traces to " + mTraceFile + "."); + logAndPrintln(pw, "Stopping tracing and writing traces in " + TRACE_DIRNAME + ": " + + TRACE_FILENAME_CLIENTS + ", " + TRACE_FILENAME_IMS + ", " + + TRACE_FILENAME_IMMS); sEnabled = false; - writeTraceToFileLocked(); - mBuffer.resetBuffer(); + if (writeToFile) { + writeTracesToFilesLocked(); + } } } + + private void resetBuffers() { + mBufferClients.resetBuffer(); + mBufferIms.resetBuffer(); + mBufferImms.resetBuffer(); + } } diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 06ddf3c69f8e..75dc0c43085d 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -47,7 +47,6 @@ import android.util.Log; import android.util.SparseArray; import android.util.SparseIntArray; import android.util.SparseSetArray; -import android.util.imetracing.ImeTracing; import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsSide; import android.view.SyncRtSurfaceTransactionApplier.SurfaceParams; @@ -136,10 +135,6 @@ public class InsetsAnimationControlImpl implements WindowInsetsAnimationControll mTranslator = translator; mController.startAnimation(this, listener, types, mAnimation, new Bounds(mHiddenInsets, mShownInsets)); - - if ((mTypes & WindowInsets.Type.ime()) != 0) { - ImeTracing.getInstance().triggerDump(); - } } private boolean calculatePerceptible(Insets currentInsets, float currentAlpha) { diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index bcb3a36ebe2c..1c82619a61ad 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -312,10 +312,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public void onReady(WindowInsetsAnimationController controller, int types) { - if ((types & ime()) != 0) { - ImeTracing.getInstance().triggerDump(); - } - mController = controller; if (DEBUG) Log.d(TAG, "default animation onReady types: " + types); @@ -832,7 +828,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation Log.d(TAG, "show(ime(), fromIme=" + fromIme + ")"); } if (fromIme) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InsetsController#show", + mHost.getInputMethodManager()); Trace.asyncTraceEnd(TRACE_TAG_VIEW, "IC.showRequestFromApiToImeReady", 0); Trace.asyncTraceBegin(TRACE_TAG_VIEW, "IC.showRequestFromIme", 0); } else { @@ -888,7 +885,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation void hide(@InsetsType int types, boolean fromIme) { if (fromIme) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InsetsController#hide", + mHost.getInputMethodManager()); Trace.asyncTraceBegin(TRACE_TAG_VIEW, "IC.hideRequestFromIme", 0); } else { Trace.asyncTraceBegin(TRACE_TAG_VIEW, "IC.hideRequestFromApi", 0); @@ -928,7 +926,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return; } if (fromIme) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump( + "InsetsController#controlWindowInsetsAnimation", + mHost.getInputMethodManager()); } controlAnimationUnchecked(types, cancellationSignal, listener, mFrame, fromIme, durationMs, @@ -1020,6 +1020,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation : new InsetsAnimationControlImpl(controls, frame, mState, listener, typesReady, this, durationMs, interpolator, animationType, mHost.getTranslator()); + if ((typesReady & WindowInsets.Type.ime()) != 0) { + ImeTracing.getInstance().triggerClientDump("InsetsAnimationControlImpl", + mHost.getInputMethodManager()); + } mRunningAnimations.add(new RunningAnimation(runner, animationType)); if (DEBUG) Log.d(TAG, "Animation added to runner. useInsetsAnimationThread: " + useInsetsAnimationThread); @@ -1193,6 +1197,11 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation mRunningAnimations.remove(i); ArraySet<Integer> types = toInternalType(control.getTypes()); for (int j = types.size() - 1; j >= 0; j--) { + if (types.valueAt(j) == ITYPE_IME) { + ImeTracing.getInstance().triggerClientDump( + "InsetsSourceConsumer#notifyAnimationFinished", + mHost.getInputMethodManager()); + } stateChanged |= getSourceConsumer(types.valueAt(j)).notifyAnimationFinished(); } if (invokeCallback && runningAnimation.startDispatched) { @@ -1335,7 +1344,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @InsetsType int types, boolean animationFinished, @AnimationType int animationType, boolean fromIme) { if ((types & ime()) != 0) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InsetsController#hideDirectly", + mHost.getInputMethodManager()); } final ArraySet<Integer> internalTypes = InsetsState.toInternalType(types); for (int i = internalTypes.size() - 1; i >= 0; i--) { @@ -1350,7 +1360,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private void showDirectly(@InsetsType int types, boolean fromIme) { if ((types & ime()) != 0) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InsetsController#showDirectly", + mHost.getInputMethodManager()); } final ArraySet<Integer> internalTypes = InsetsState.toInternalType(types); for (int i = internalTypes.size() - 1; i >= 0; i--) { diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index e4a24ebfe9e4..537fd42d7135 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -25,7 +25,6 @@ import static android.view.InsetsSourceConsumerProto.IS_REQUESTED_VISIBLE; import static android.view.InsetsSourceConsumerProto.PENDING_FRAME; import static android.view.InsetsSourceConsumerProto.PENDING_VISIBLE_FRAME; import static android.view.InsetsSourceConsumerProto.SOURCE_CONTROL; -import static android.view.InsetsState.ITYPE_IME; import static android.view.InsetsState.getDefaultVisibility; import static android.view.InsetsState.toPublicType; @@ -35,7 +34,6 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Rect; import android.util.Log; -import android.util.imetracing.ImeTracing; import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsType; import android.view.SurfaceControl.Transaction; @@ -328,9 +326,6 @@ public class InsetsSourceConsumer { @VisibleForTesting(visibility = PACKAGE) public boolean notifyAnimationFinished() { - if (mType == ITYPE_IME) { - ImeTracing.getInstance().triggerDump(); - } if (mPendingFrame != null) { InsetsSource source = mState.getSource(mType); source.setFrame(mPendingFrame); diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java index 2bd3d46d389a..f7fbb1ce0ab9 100644 --- a/core/java/android/view/NotificationHeaderView.java +++ b/core/java/android/view/NotificationHeaderView.java @@ -27,6 +27,7 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Build; import android.util.AttributeSet; +import android.widget.FrameLayout; import android.widget.RemoteViews; import com.android.internal.R; @@ -41,15 +42,14 @@ import java.util.ArrayList; * @hide */ @RemoteViews.RemoteView -public class NotificationHeaderView extends ViewGroup { - private final int mChildMinWidth; +public class NotificationHeaderView extends FrameLayout { private final int mContentEndMargin; + private final int mHeadingEndMargin; private OnClickListener mExpandClickListener; private HeaderTouchListener mTouchListener = new HeaderTouchListener(); private NotificationTopLineView mTopLineView; private NotificationExpandButton mExpandButton; private CachingIconView mIcon; - private int mHeaderTextMarginEnd; private Drawable mBackground; private boolean mEntireHeaderClickable; private boolean mExpandOnlyOnButton; @@ -82,8 +82,8 @@ public class NotificationHeaderView extends ViewGroup { int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); Resources res = getResources(); - mChildMinWidth = res.getDimensionPixelSize(R.dimen.notification_header_shrink_min_width); mContentEndMargin = res.getDimensionPixelSize(R.dimen.notification_content_margin_end); + mHeadingEndMargin = res.getDimensionPixelSize(R.dimen.notification_heading_margin_end); mEntireHeaderClickable = res.getBoolean(R.bool.config_notificationHeaderClickableForExpand); } @@ -96,108 +96,6 @@ public class NotificationHeaderView extends ViewGroup { setClipToPadding(false); } - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int givenWidth = MeasureSpec.getSize(widthMeasureSpec); - final int givenHeight = MeasureSpec.getSize(heightMeasureSpec); - int wrapContentWidthSpec = MeasureSpec.makeMeasureSpec(givenWidth, - MeasureSpec.AT_MOST); - int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight, - MeasureSpec.AT_MOST); - int totalWidth = getPaddingStart(); - int iconWidth = getPaddingEnd(); - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - if (child.getVisibility() == GONE) { - // We'll give it the rest of the space in the end - continue; - } - final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); - int childWidthSpec = getChildMeasureSpec(wrapContentWidthSpec, - lp.leftMargin + lp.rightMargin, lp.width); - int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec, - lp.topMargin + lp.bottomMargin, lp.height); - child.measure(childWidthSpec, childHeightSpec); - // Icons that should go at the end - if (child == mExpandButton) { - iconWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); - } else { - totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); - } - } - - // Ensure that there is at least enough space for the icons - int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth); - if (totalWidth > givenWidth - endMargin) { - int overFlow = totalWidth - givenWidth + endMargin; - // We are overflowing; shrink the top line - shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mTopLineView, - mChildMinWidth); - } - setMeasuredDimension(givenWidth, givenHeight); - } - - private int shrinkViewForOverflow(int heightSpec, int overFlow, View targetView, - int minimumWidth) { - final int oldWidth = targetView.getMeasuredWidth(); - if (overFlow > 0 && targetView.getVisibility() != GONE && oldWidth > minimumWidth) { - // we're still too big - int newSize = Math.max(minimumWidth, oldWidth - overFlow); - int childWidthSpec = MeasureSpec.makeMeasureSpec(newSize, MeasureSpec.AT_MOST); - targetView.measure(childWidthSpec, heightSpec); - overFlow -= oldWidth - newSize; - } - return overFlow; - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - int left = getPaddingStart(); - int end = getMeasuredWidth(); - int childCount = getChildCount(); - int ownHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); - for (int i = 0; i < childCount; i++) { - View child = getChildAt(i); - if (child.getVisibility() == GONE) { - continue; - } - int childHeight = child.getMeasuredHeight(); - MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams(); - int layoutLeft; - int layoutRight; - int top = (int) (getPaddingTop() + (ownHeight - childHeight) / 2.0f); - int bottom = top + childHeight; - // Icons that should go at the end - if (child == mExpandButton) { - if (end == getMeasuredWidth()) { - layoutRight = end - mContentEndMargin; - } else { - layoutRight = end - params.getMarginEnd(); - } - layoutLeft = layoutRight - child.getMeasuredWidth(); - end = layoutLeft - params.getMarginStart(); - } else { - left += params.getMarginStart(); - int right = left + child.getMeasuredWidth(); - layoutLeft = left; - layoutRight = right; - left = right + params.getMarginEnd(); - } - if (getLayoutDirection() == LAYOUT_DIRECTION_RTL) { - int ltrLeft = layoutLeft; - layoutLeft = getWidth() - layoutRight; - layoutRight = getWidth() - ltrLeft; - } - child.layout(layoutLeft, top, layoutRight, bottom); - } - updateTouchListener(); - } - - @Override - public LayoutParams generateLayoutParams(AttributeSet attrs) { - return new MarginLayoutParams(getContext(), attrs); - } - /** * Set a {@link Drawable} to be displayed as a background on the header. */ @@ -252,23 +150,34 @@ public class NotificationHeaderView extends ViewGroup { } /** - * Sets the margin end for the text portion of the header, excluding right-aligned elements - * @param headerTextMarginEnd margin size + * Sets the extra margin at the end of the top line of left-aligned text + icons. + * This value will have the margin required to accommodate the expand button added to it. + * + * @param extraMarginEnd extra margin */ @RemotableViewMethod - public void setHeaderTextMarginEnd(int headerTextMarginEnd) { - if (mHeaderTextMarginEnd != headerTextMarginEnd) { - mHeaderTextMarginEnd = headerTextMarginEnd; - requestLayout(); - } + public void setTopLineExtraMarginEnd(int extraMarginEnd) { + mTopLineView.setHeaderTextMarginEnd(extraMarginEnd + mHeadingEndMargin); + } + + /** + * Get the current margin end value for the header text. + * Add this to {@link #getTopLineBaseMarginEnd()} to get the total margin of the top line. + * + * @return extra margin + */ + public int getTopLineExtraMarginEnd() { + return mTopLineView.getHeaderTextMarginEnd() - mHeadingEndMargin; } /** - * Get the current margin end value for the header text - * @return margin size + * Get the base margin at the end of the top line view. + * Add this to {@link #getTopLineExtraMarginEnd()} to get the total margin of the top line. + * + * @return base margin */ - public int getHeaderTextMarginEnd() { - return mHeaderTextMarginEnd; + public int getTopLineBaseMarginEnd() { + return mHeadingEndMargin; } /** diff --git a/core/java/android/view/NotificationTopLineView.java b/core/java/android/view/NotificationTopLineView.java index 24748222b3af..a8eabe5a7967 100644 --- a/core/java/android/view/NotificationTopLineView.java +++ b/core/java/android/view/NotificationTopLineView.java @@ -26,9 +26,6 @@ import android.widget.RemoteViews; import com.android.internal.R; -import java.util.Arrays; -import java.util.List; - /** * The top line of content in a notification view. * This includes the text views and badges but excludes the icon and the expander. @@ -39,16 +36,14 @@ import java.util.List; public class NotificationTopLineView extends ViewGroup { private final int mGravityY; private final int mChildMinWidth; - private final int mContentEndMargin; - private View mAppName; + @Nullable private View mAppName; + @Nullable private View mTitle; private View mHeaderText; private View mSecondaryHeaderText; private OnClickListener mFeedbackListener; private HeaderTouchListener mTouchListener = new HeaderTouchListener(); - private View mProfileBadge; private View mFeedbackIcon; private int mHeaderTextMarginEnd; - private List<View> mIconsAtEnd; private int mMaxAscent; private int mMaxDescent; @@ -71,7 +66,6 @@ public class NotificationTopLineView extends ViewGroup { super(context, attrs, defStyleAttr, defStyleRes); Resources res = getResources(); mChildMinWidth = res.getDimensionPixelSize(R.dimen.notification_header_shrink_min_width); - mContentEndMargin = res.getDimensionPixelSize(R.dimen.notification_content_margin_end); // NOTE: Implementation only supports TOP, BOTTOM, and CENTER_VERTICAL gravities, // with CENTER_VERTICAL being the default. @@ -92,11 +86,10 @@ public class NotificationTopLineView extends ViewGroup { protected void onFinishInflate() { super.onFinishInflate(); mAppName = findViewById(R.id.app_name_text); + mTitle = findViewById(R.id.title); mHeaderText = findViewById(R.id.header_text); mSecondaryHeaderText = findViewById(R.id.header_text_secondary); - mProfileBadge = findViewById(R.id.profile_badge); mFeedbackIcon = findViewById(R.id.feedback); - mIconsAtEnd = Arrays.asList(mProfileBadge, mFeedbackIcon); } @Override @@ -109,7 +102,6 @@ public class NotificationTopLineView extends ViewGroup { int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight, MeasureSpec.AT_MOST); int totalWidth = getPaddingStart(); - int iconWidth = getPaddingEnd(); int maxChildHeight = -1; mMaxAscent = -1; mMaxDescent = -1; @@ -125,12 +117,7 @@ public class NotificationTopLineView extends ViewGroup { int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec, lp.topMargin + lp.bottomMargin, lp.height); child.measure(childWidthSpec, childHeightSpec); - // Icons that should go at the end - if (mIconsAtEnd.contains(child)) { - iconWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); - } else { - totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); - } + totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth(); int childBaseline = child.getBaseline(); int childHeight = child.getMeasuredHeight(); if (childBaseline != -1) { @@ -141,12 +128,20 @@ public class NotificationTopLineView extends ViewGroup { } // Ensure that there is at least enough space for the icons - int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth); + int endMargin = Math.max(mHeaderTextMarginEnd, getPaddingEnd()); if (totalWidth > givenWidth - endMargin) { int overFlow = totalWidth - givenWidth + endMargin; - // We are overflowing, lets shrink the app name first - overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mAppName, - mChildMinWidth); + if (mAppName != null) { + // We are overflowing, lets shrink the app name first + overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mAppName, + mChildMinWidth); + } + + if (mTitle != null) { + // still overflowing, we shrink the title text + overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mTitle, + mChildMinWidth); + } // still overflowing, we shrink the header text overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mHeaderText, 0); @@ -174,7 +169,6 @@ public class NotificationTopLineView extends ViewGroup { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int left = getPaddingStart(); - int end = getMeasuredWidth(); int childCount = getChildCount(); int ownHeight = b - t; int childSpace = ownHeight - mPaddingTop - mPaddingBottom; @@ -228,22 +222,12 @@ public class NotificationTopLineView extends ViewGroup { childTop = mPaddingTop; } - // Icons that should go at the end - if (mIconsAtEnd.contains(child)) { - if (end == getMeasuredWidth()) { - layoutRight = end - mContentEndMargin; - } else { - layoutRight = end - params.getMarginEnd(); - } - layoutLeft = layoutRight - child.getMeasuredWidth(); - end = layoutLeft - params.getMarginStart(); - } else { - left += params.getMarginStart(); - int right = left + child.getMeasuredWidth(); - layoutLeft = left; - layoutRight = right; - left = right + params.getMarginEnd(); - } + left += params.getMarginStart(); + int right = left + child.getMeasuredWidth(); + layoutLeft = left; + layoutRight = right; + left = right + params.getMarginEnd(); + if (getLayoutDirection() == LAYOUT_DIRECTION_RTL) { int ltrLeft = layoutLeft; layoutLeft = getWidth() - layoutRight; @@ -298,6 +282,13 @@ public class NotificationTopLineView extends ViewGroup { return mHeaderTextMarginEnd; } + /** + * Set padding at the start of the view. + */ + public void setPaddingStart(int paddingStart) { + setPaddingRelative(paddingStart, getPaddingTop(), getPaddingEnd(), getPaddingBottom()); + } + private class HeaderTouchListener implements OnTouchListener { private Rect mFeedbackRect; diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 5b79174a6cd8..a2777fe985d5 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -97,7 +97,7 @@ public class Surface implements Parcelable { private static native int nativeSetAutoRefreshEnabled(long nativeObject, boolean enabled); private static native int nativeSetFrameRate( - long nativeObject, float frameRate, int compatibility); + long nativeObject, float frameRate, int compatibility, boolean shouldBeSeamless); public static final @android.annotation.NonNull Parcelable.Creator<Surface> CREATOR = new Parcelable.Creator<Surface>() { @@ -915,13 +915,20 @@ public class Surface implements Parcelable { * compatibility value may influence the system's choice of display frame rate. See * the FRAME_RATE_COMPATIBILITY_* values for more info. * + * @param shouldBeSeamless Whether display refresh rate transitions should be seamless. A + * seamless transition is one that doesn't have any visual interruptions, such as a black + * screen for a second or two. True indicates that any frame rate changes caused by this + * request should be seamless. False indicates that non-seamless refresh rates are also + * acceptable. + * * @throws IllegalArgumentException If frameRate or compatibility are invalid. */ - public void setFrameRate( - @FloatRange(from = 0.0) float frameRate, @FrameRateCompatibility int compatibility) { + public void setFrameRate(@FloatRange(from = 0.0) float frameRate, + @FrameRateCompatibility int compatibility, boolean shouldBeSeamless) { synchronized (mLock) { checkNotReleasedLocked(); - int error = nativeSetFrameRate(mNativeObject, frameRate, compatibility); + int error = nativeSetFrameRate(mNativeObject, frameRate, compatibility, + shouldBeSeamless); if (error == -EINVAL) { throw new IllegalArgumentException("Invalid argument to Surface.setFrameRate()"); } else if (error != 0) { @@ -931,6 +938,17 @@ public class Surface implements Parcelable { } /** + * Sets the intended frame rate for this surface. Any switching of refresh rates is + * most probably going to be seamless. + * + * @see #setFrameRate(float, int, boolean) + */ + public void setFrameRate( + @FloatRange(from = 0.0) float frameRate, @FrameRateCompatibility int compatibility) { + setFrameRate(frameRate, compatibility, /* shouldBeSeamless = */ true); + } + + /** * Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or * when a SurfaceTexture could not successfully be allocated. */ diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index af31b817d520..d7ee6ad15166 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -212,8 +212,8 @@ public final class SurfaceControl implements Parcelable { private static native void nativeSetGlobalShadowSettings(@Size(4) float[] ambientColor, @Size(4) float[] spotColor, float lightPosY, float lightPosZ, float lightRadius); - private static native void nativeSetFrameRate( - long transactionObj, long nativeObject, float frameRate, int compatibility); + private static native void nativeSetFrameRate(long transactionObj, long nativeObject, + float frameRate, int compatibility, boolean shouldBeSeamless); private static native long nativeGetHandle(long nativeObject); private static native long nativeAcquireFrameRateFlexibilityToken(); @@ -3256,6 +3256,19 @@ public final class SurfaceControl implements Parcelable { } /** + * Sets the intended frame rate for this surface. Any switching of refresh rates is + * most probably going to be seamless. + * + * @see #setFrameRate(SurfaceControl, float, int, boolean) + */ + @NonNull + public Transaction setFrameRate(@NonNull SurfaceControl sc, + @FloatRange(from = 0.0) float frameRate, + @Surface.FrameRateCompatibility int compatibility) { + return setFrameRate(sc, frameRate, compatibility, /*shouldBeSeamless*/ true); + } + + /** * Sets the intended frame rate for the surface {@link SurfaceControl}. * <p> * On devices that are capable of running the display at different refresh rates, the system @@ -3275,14 +3288,22 @@ public final class SurfaceControl implements Parcelable { * @param compatibility The frame rate compatibility of this surface. The compatibility * value may influence the system's choice of display frame rate. See * the Surface.FRAME_RATE_COMPATIBILITY_* values for more info. + * @param shouldBeSeamless Whether display refresh rate transitions should be seamless. A + * seamless transition is one that doesn't have any visual + * interruptions, such as a black screen for a second or two. True + * indicates that any frame rate changes caused by this request + * should be seamless. False indicates that non-seamless refresh + * rates are also acceptable. * @return This transaction object. */ @NonNull public Transaction setFrameRate(@NonNull SurfaceControl sc, @FloatRange(from = 0.0) float frameRate, - @Surface.FrameRateCompatibility int compatibility) { + @Surface.FrameRateCompatibility int compatibility, + boolean shouldBeSeamless) { checkPreconditions(sc); - nativeSetFrameRate(mNativeObject, sc.mNativeObject, frameRate, compatibility); + nativeSetFrameRate(mNativeObject, sc.mNativeObject, frameRate, compatibility, + shouldBeSeamless); return this; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index c0770063beea..33a1f228e2ad 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -79,8 +79,8 @@ import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY; import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.IME_FOCUS_CONTROLLER; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.INSETS_CONTROLLER; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_FOCUS_CONTROLLER; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INSETS_CONTROLLER; import android.Manifest; import android.animation.LayoutTransition; @@ -9221,10 +9221,11 @@ public final class ViewRootImpl implements ViewParent, @Override public void showInsets(@InsetsType int types, boolean fromIme) { + final ViewRootImpl viewAncestor = mViewAncestor.get(); if (fromIme) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("ViewRootImpl.W#showInsets", + viewAncestor.getInsetsController().getHost().getInputMethodManager()); } - final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { viewAncestor.showInsets(types, fromIme); } @@ -9232,10 +9233,12 @@ public final class ViewRootImpl implements ViewParent, @Override public void hideInsets(@InsetsType int types, boolean fromIme) { + + final ViewRootImpl viewAncestor = mViewAncestor.get(); if (fromIme) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("ViewRootImpl.W#hideInsets", + viewAncestor.getInsetsController().getHost().getInputMethodManager()); } - final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { viewAncestor.hideInsets(types, fromIme); } diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index f1cbd2533a5a..3c89a4bfad59 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -19,12 +19,11 @@ package android.view.inputmethod; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; import static android.Manifest.permission.WRITE_SECURE_SETTINGS; import static android.util.imetracing.ImeTracing.PROTO_ARG; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.DISPLAY_ID; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.EDITOR_INFO; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.IME_INSETS_SOURCE_CONSUMER; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.INPUT_METHOD_MANAGER; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientSideProto.VIEW_ROOT_IMPL; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ClientsProto.CLIENT; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.DISPLAY_ID; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.EDITOR_INFO; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.IME_INSETS_SOURCE_CONSUMER; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.INPUT_METHOD_MANAGER; +import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto.ClientSideProto.VIEW_ROOT_IMPL; import static android.view.inputmethod.InputMethodManagerProto.ACTIVE; import static android.view.inputmethod.InputMethodManagerProto.CUR_ID; import static android.view.inputmethod.InputMethodManagerProto.FULLSCREEN_MODE; @@ -576,7 +575,8 @@ public final class InputMethodManager { @StartInputFlags int startInputFlags, @SoftInputModeFlags int softInputMode, int windowFlags) { final View servedView; - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump( + "InputMethodManager.DelegateImpl#startInput", InputMethodManager.this); synchronized (mH) { mCurrentTextBoxAttribute = null; mCompletions = null; @@ -1662,7 +1662,7 @@ public final class InputMethodManager { * {@link #RESULT_HIDDEN}. */ public boolean showSoftInput(View view, int flags, ResultReceiver resultReceiver) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InputMethodManager#showSoftInput", this); // Re-dispatch if there is a context mismatch. final InputMethodManager fallbackImm = getFallbackInputMethodManagerIfNecessary(view); if (fallbackImm != null) { @@ -1770,7 +1770,8 @@ public final class InputMethodManager { */ public boolean hideSoftInputFromWindow(IBinder windowToken, int flags, ResultReceiver resultReceiver) { - ImeTracing.getInstance().triggerDump(); + ImeTracing.getInstance().triggerClientDump("InputMethodManager#hideSoftInputFromWindow", + this); checkFocus(); synchronized (mH) { final View servedView = getServedViewLocked(); @@ -3240,7 +3241,7 @@ public final class InputMethodManager { for (String arg : args) { if (arg.equals(PROTO_ARG)) { final ProtoOutputStream proto = new ProtoOutputStream(fd); - dumpProto(proto); + dumpDebug(proto); proto.flush(); return true; } @@ -3249,19 +3250,6 @@ public final class InputMethodManager { } /** - * Write the proto dump for all displays associated with this client. - * - * @param proto The proto stream to which the dumps are written. - * @hide - */ - public static void dumpProto(ProtoOutputStream proto) { - for (int i = sInstanceMap.size() - 1; i >= 0; i--) { - InputMethodManager imm = sInstanceMap.valueAt(i); - imm.dumpDebug(proto); - } - } - - /** * Write the proto dump of various client side components to the provided * {@link ProtoOutputStream}. * @@ -3274,7 +3262,6 @@ public final class InputMethodManager { return; } - final long clientDumpToken = proto.start(CLIENT); proto.write(DISPLAY_ID, mDisplayId); final long token = proto.start(INPUT_METHOD_MANAGER); synchronized (mH) { @@ -3293,6 +3280,5 @@ public final class InputMethodManager { mImeInsetsConsumer.dumpDebug(proto, IME_INSETS_SOURCE_CONSUMER); } } - proto.end(clientDumpToken); } } diff --git a/core/java/android/window/DisplayAreaOrganizer.java b/core/java/android/window/DisplayAreaOrganizer.java index 6cc3cd398703..6e20452ad061 100644 --- a/core/java/android/window/DisplayAreaOrganizer.java +++ b/core/java/android/window/DisplayAreaOrganizer.java @@ -84,6 +84,13 @@ public class DisplayAreaOrganizer extends WindowOrganizer { public static final int FEATURE_HIDE_DISPLAY_CUTOUT = FEATURE_SYSTEM_FIRST + 6; /** + * Display area that the IME container can be placed in. Should be enabled on every root + * hierarchy if IME container may be reparented to that hierarchy when the IME target changed. + * @hide + */ + public static final int FEATURE_IME_PLACEHOLDER = FEATURE_SYSTEM_FIRST + 7; + + /** * The last boundary of display area for system features */ public static final int FEATURE_SYSTEM_LAST = 10_000; diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index 0bafb2f6ff57..4ad779551060 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -1,12 +1,15 @@ package com.android.internal.util; +import static android.content.Intent.ACTION_USER_SWITCHED; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_OTHER; import android.annotation.NonNull; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.graphics.Insets; import android.graphics.Rect; @@ -161,8 +164,21 @@ public class ScreenshotHelper { private ServiceConnection mScreenshotConnection = null; private final Context mContext; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + synchronized (mScreenshotLock) { + if (ACTION_USER_SWITCHED.equals(intent.getAction())) { + resetConnection(); + } + } + } + }; + public ScreenshotHelper(Context context) { mContext = context; + IntentFilter filter = new IntentFilter(ACTION_USER_SWITCHED); + mContext.registerReceiver(mBroadcastReceiver, filter); } /** @@ -280,9 +296,7 @@ public class ScreenshotHelper { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { Log.e(TAG, "Timed out before getting screenshot capture response"); - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); notifyScreenshotError(); } } @@ -305,11 +319,7 @@ public class ScreenshotHelper { break; case SCREENSHOT_MSG_PROCESS_COMPLETE: synchronized (mScreenshotLock) { - if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; - } + resetConnection(); } break; } @@ -349,9 +359,7 @@ public class ScreenshotHelper { public void onServiceDisconnected(ComponentName name) { synchronized (mScreenshotLock) { if (mScreenshotConnection != null) { - mContext.unbindService(mScreenshotConnection); - mScreenshotConnection = null; - mScreenshotService = null; + resetConnection(); // only log an error if we're still within the timeout period if (handler.hasCallbacks(mScreenshotTimeout)) { Log.e(TAG, "Screenshot service disconnected"); @@ -385,6 +393,17 @@ public class ScreenshotHelper { } /** + * Unbinds the current screenshot connection (if any). + */ + private void resetConnection() { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + mScreenshotService = null; + } + } + + /** * Notifies the screenshot service to show an error. */ private void notifyScreenshotError() { diff --git a/core/java/com/android/internal/view/IInputMethodManager.aidl b/core/java/com/android/internal/view/IInputMethodManager.aidl index 5a06273bb173..844c56bd3529 100644 --- a/core/java/com/android/internal/view/IInputMethodManager.aidl +++ b/core/java/com/android/internal/view/IInputMethodManager.aidl @@ -77,6 +77,6 @@ interface IInputMethodManager { void removeImeSurface(); /** Remove the IME surface. Requires passing the currently focused window. */ void removeImeSurfaceFromWindow(in IBinder windowToken); - void startProtoDump(in byte[] clientProtoDump); + void startProtoDump(in byte[] protoDump, int source, String where); boolean isImeTraceEnabled(); } diff --git a/core/java/com/android/internal/widget/ConversationLayout.java b/core/java/com/android/internal/widget/ConversationLayout.java index 289a36f5380d..40e671ffd27c 100644 --- a/core/java/com/android/internal/widget/ConversationLayout.java +++ b/core/java/com/android/internal/widget/ConversationLayout.java @@ -134,7 +134,6 @@ public class ConversationLayout extends FrameLayout private CachingIconView mConversationIconBadgeBg; private Icon mLargeIcon; private View mExpandButtonContainer; - private View mExpandButtonInnerContainer; private ViewGroup mExpandButtonAndContentContainer; private NotificationExpandButton mExpandButton; private MessagingLinearLayout mImageMessageContainer; @@ -266,7 +265,6 @@ public class ConversationLayout extends FrameLayout mConversationHeader = findViewById(R.id.conversation_header); mContentContainer = findViewById(R.id.notification_action_list_margin_target); mExpandButtonAndContentContainer = findViewById(R.id.expand_button_and_content_container); - mExpandButtonInnerContainer = findViewById(R.id.expand_button_inner_container); mExpandButton = findViewById(R.id.expand_button); mExpandButtonExpandedTopMargin = getResources().getDimensionPixelSize( R.dimen.conversation_expand_button_top_margin_expanded); @@ -1217,25 +1215,18 @@ public class ConversationLayout extends FrameLayout } private void updateExpandButton() { - int drawableId; - int contentDescriptionId; int gravity; int topMargin = 0; ViewGroup newContainer; if (mIsCollapsed) { - drawableId = R.drawable.ic_expand_notification; - contentDescriptionId = R.string.expand_button_content_description_collapsed; gravity = Gravity.CENTER; newContainer = mExpandButtonAndContentContainer; } else { - drawableId = R.drawable.ic_collapse_notification; - contentDescriptionId = R.string.expand_button_content_description_expanded; gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP; topMargin = mExpandButtonExpandedTopMargin; newContainer = this; } - mExpandButton.setImageDrawable(getContext().getDrawable(drawableId)); - mExpandButton.setColorFilter(mExpandButton.getOriginalNotificationColor()); + mExpandButton.setExpanded(!mIsCollapsed); // We need to make sure that the expand button is in the linearlayout pushing over the // content when collapsed, but allows the content to flow under it when expanded. @@ -1250,8 +1241,6 @@ public class ConversationLayout extends FrameLayout layoutParams.gravity = gravity; layoutParams.topMargin = topMargin; mExpandButton.setLayoutParams(layoutParams); - - mExpandButtonInnerContainer.setContentDescription(mContext.getText(contentDescriptionId)); } private void updateContentEndPaddings() { @@ -1298,7 +1287,7 @@ public class ConversationLayout extends FrameLayout mExpandable = expandable; if (expandable) { mExpandButtonContainer.setVisibility(VISIBLE); - mExpandButtonInnerContainer.setOnClickListener(onClickListener); + mExpandButton.setOnClickListener(onClickListener); mConversationIconContainer.setOnClickListener(onClickListener); } else { mExpandButtonContainer.setVisibility(GONE); diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java index 9bb45012b61a..f42d5da30b19 100644 --- a/core/java/com/android/internal/widget/MediaNotificationView.java +++ b/core/java/com/android/internal/widget/MediaNotificationView.java @@ -98,12 +98,14 @@ public class MediaNotificationView extends FrameLayout { mMainColumn.setLayoutParams(params); reMeasure = true; } + // TODO(b/172652345): validate all this logic (especially positioning of expand button) // margin for the entire header line int headerMarginEnd = imageEndMargin; // margin for the header text (not including the expand button and other icons) - int headerTextMarginEnd = size + imageEndMargin; - if (headerTextMarginEnd != mHeader.getHeaderTextMarginEnd()) { - mHeader.setHeaderTextMarginEnd(headerTextMarginEnd); + int headerExtraMarginEnd = Math.max(0, + size + imageEndMargin - mHeader.getTopLineBaseMarginEnd()); + if (headerExtraMarginEnd != mHeader.getTopLineExtraMarginEnd()) { + mHeader.setTopLineExtraMarginEnd(headerExtraMarginEnd); reMeasure = true; } params = (MarginLayoutParams) mHeader.getLayoutParams(); diff --git a/core/java/com/android/internal/widget/NotificationExpandButton.java b/core/java/com/android/internal/widget/NotificationExpandButton.java index 986412d2ce5d..8add34f328bf 100644 --- a/core/java/com/android/internal/widget/NotificationExpandButton.java +++ b/core/java/com/android/internal/widget/NotificationExpandButton.java @@ -23,6 +23,7 @@ import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.RemotableViewMethod; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Button; import android.widget.ImageView; @@ -36,33 +37,58 @@ import com.android.internal.R; @RemoteViews.RemoteView public class NotificationExpandButton extends ImageView { + private final int mMinTouchTargetSize; private boolean mExpanded; private int mOriginalNotificationColor; public NotificationExpandButton(Context context) { - super(context); + this(context, null, 0, 0); } public NotificationExpandButton(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); + this(context, attrs, 0, 0); } public NotificationExpandButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); + this(context, attrs, defStyleAttr, 0); } public NotificationExpandButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); + mMinTouchTargetSize = (int) (getResources().getDisplayMetrics().density * 48 + 0.5); } + /** + * Show the touchable area of the view for a11y. + * If the parent is the touch container, then that view's bounds are the touchable area. + */ @Override public void getBoundsOnScreen(Rect outRect, boolean clipToParent) { - super.getBoundsOnScreen(outRect, clipToParent); + ViewGroup parent = (ViewGroup) getParent(); + if (parent != null && parent.getId() == R.id.expand_button_touch_container) { + parent.getBoundsOnScreen(outRect, clipToParent); + } else { + super.getBoundsOnScreen(outRect, clipToParent); + } extendRectToMinTouchSize(outRect); } + /** + * Determined if the given point should be touchable. + * If the parent is the touch container, then any point in that view should be touchable. + */ + @Override + public boolean pointInView(float localX, float localY, float slop) { + ViewGroup parent = (ViewGroup) getParent(); + if (parent != null && parent.getId() == R.id.expand_button_touch_container) { + // If our parent is checking with us, then the point must be within its bounds. + return true; + } + return super.pointInView(localX, localY, slop); + } + @RemotableViewMethod public void setOriginalNotificationColor(int color) { mOriginalNotificationColor = color; @@ -81,11 +107,14 @@ public class NotificationExpandButton extends ImageView { } private void extendRectToMinTouchSize(Rect rect) { - int touchTargetSize = (int) (getResources().getDisplayMetrics().density * 48); - rect.left = rect.centerX() - touchTargetSize / 2; - rect.right = rect.left + touchTargetSize; - rect.top = rect.centerY() - touchTargetSize / 2; - rect.bottom = rect.top + touchTargetSize; + if (rect.width() < mMinTouchTargetSize) { + rect.left = rect.centerX() - mMinTouchTargetSize / 2; + rect.right = rect.left + mMinTouchTargetSize; + } + if (rect.height() < mMinTouchTargetSize) { + rect.top = rect.centerY() - mMinTouchTargetSize / 2; + rect.bottom = rect.top + mMinTouchTargetSize; + } } @Override diff --git a/core/java/com/android/internal/widget/NotificationMaxHeightFrameLayout.java b/core/java/com/android/internal/widget/NotificationMaxHeightFrameLayout.java new file mode 100644 index 000000000000..6d5fb66b27ef --- /dev/null +++ b/core/java/com/android/internal/widget/NotificationMaxHeightFrameLayout.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.widget; + +import android.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; +import android.widget.RemoteViews; + +/** + * This custom subclass of FrameLayout enforces that its calculated height be no larger than the + * standard height of a notification. This is not required in the normal case, as the + * NotificationContentView gets this same value from the ExpandableNotificationRow, and enforces it + * as a maximum. It is required in the case of the HUN version of the headerless notification, + * because that style puts the actions below the headerless portion. If we don't cap this, then in + * certain situations (larger fonts, decorated custom views) the contents of the headerless + * notification push on the margins and increase the size of that view, which causes the actions to + * be cropped on the bottom by the HUN notification max height. + */ +@RemoteViews.RemoteView +public class NotificationMaxHeightFrameLayout extends FrameLayout { + private final int mNotificationMaxHeight; + + public NotificationMaxHeightFrameLayout(Context context) { + this(context, null, 0, 0); + } + + public NotificationMaxHeightFrameLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0, 0); + } + + public NotificationMaxHeightFrameLayout(Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public NotificationMaxHeightFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + // `notification_min_height` refers to "minimized" not "minimum"; it is a max height + mNotificationMaxHeight = getFontScaledHeight(mContext, + com.android.internal.R.dimen.notification_min_height); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (MeasureSpec.getSize(heightMeasureSpec) > mNotificationMaxHeight) { + final int mode = MeasureSpec.getMode(heightMeasureSpec); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mNotificationMaxHeight, mode); + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + /** + * NOTE: This is copied from com.android.systemui.statusbar.notification.NotificationUtils + * + * @param dimenId the dimen to look up + * @return the font scaled dimen as if it were in sp but doesn't shrink sizes below dp + */ + private static int getFontScaledHeight(Context context, int dimenId) { + final int dimensionPixelSize = context.getResources().getDimensionPixelSize(dimenId); + final float factor = Math.max(1.0f, context.getResources().getDisplayMetrics().scaledDensity + / context.getResources().getDisplayMetrics().density); + return (int) (dimensionPixelSize * factor); + } +} diff --git a/core/java/com/android/internal/widget/RecyclerView.java b/core/java/com/android/internal/widget/RecyclerView.java index fd9e43081d10..89a90e944bdf 100644 --- a/core/java/com/android/internal/widget/RecyclerView.java +++ b/core/java/com/android/internal/widget/RecyclerView.java @@ -2799,6 +2799,7 @@ public class RecyclerView extends ViewGroup implements ScrollingView, NestedScro if (index < 0) { Log.e(TAG, "Error processing scroll; pointer index for id " + mScrollPointerId + " not found. Did any MotionEvents get skipped?"); + vtev.recycle(); return false; } diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 3a1ccd9de79e..5b29f0bb8932 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -438,14 +438,15 @@ static jint nativeSetAutoRefreshEnabled(JNIEnv* env, jclass clazz, jlong nativeO } static jint nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong nativeObject, jfloat frameRate, - jint compatibility) { + jint compatibility, jboolean shouldBeSeamless) { Surface* surface = reinterpret_cast<Surface*>(nativeObject); ANativeWindow* anw = static_cast<ANativeWindow*>(surface); // Our compatibility is a Surface.FRAME_RATE_COMPATIBILITY_* value, and // NATIVE_WINDOW_SET_FRAME_RATE takes an // ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_* value. The values are identical // though, so no need to explicitly convert. - return anw->perform(surface, NATIVE_WINDOW_SET_FRAME_RATE, float(frameRate), compatibility); + return anw->perform(surface, NATIVE_WINDOW_SET_FRAME_RATE, double(frameRate), compatibility, + int(shouldBeSeamless)); } // ---------------------------------------------------------------------------- @@ -474,7 +475,7 @@ static const JNINativeMethod gSurfaceMethods[] = { (void*)nativeAttachAndQueueBufferWithColorSpace}, {"nativeSetSharedBufferModeEnabled", "(JZ)I", (void*)nativeSetSharedBufferModeEnabled}, {"nativeSetAutoRefreshEnabled", "(JZ)I", (void*)nativeSetAutoRefreshEnabled}, - {"nativeSetFrameRate", "(JFI)I", (void*)nativeSetFrameRate}, + {"nativeSetFrameRate", "(JFIZ)I", (void*)nativeSetFrameRate}, {"nativeGetFromBlastBufferQueue", "(JJ)J", (void*)nativeGetFromBlastBufferQueue}, }; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index f1ec85a8570f..6ec656c16790 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -738,14 +738,15 @@ static void nativeSetShadowRadius(JNIEnv* env, jclass clazz, jlong transactionOb } static void nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, - jfloat frameRate, jint compatibility) { + jfloat frameRate, jint compatibility, jboolean shouldBeSeamless) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); const auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject); // Our compatibility is a Surface.FRAME_RATE_COMPATIBILITY_* value, and // Transaction::setFrameRate() takes an ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_* value. The // values are identical though, so no need to convert anything. - transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility)); + transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility), + bool(shouldBeSeamless)); } static jlong nativeAcquireFrameRateFlexibilityToken(JNIEnv* env, jclass clazz) { @@ -1668,7 +1669,7 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetBlurRegions }, {"nativeSetShadowRadius", "(JJF)V", (void*)nativeSetShadowRadius }, - {"nativeSetFrameRate", "(JJFI)V", + {"nativeSetFrameRate", "(JJFIZ)V", (void*)nativeSetFrameRate }, {"nativeAcquireFrameRateFlexibilityToken", "()J", (void*)nativeAcquireFrameRateFlexibilityToken }, diff --git a/core/proto/android/view/inputmethod/inputmethodeditortrace.proto b/core/proto/android/view/inputmethod/inputmethodeditortrace.proto index 856d8da1a1ea..5c0f341cb9e4 100644 --- a/core/proto/android/view/inputmethod/inputmethodeditortrace.proto +++ b/core/proto/android/view/inputmethod/inputmethodeditortrace.proto @@ -30,40 +30,36 @@ import "frameworks/base/core/proto/android/server/inputmethod/inputmethodmanager import "frameworks/base/core/proto/android/inputmethodservice/inputmethodservice.proto"; /** - * Represents a file full of input method editor trace entries. - * Encoded, it should start with 0x9 0x49 0x4d 0x45 0x54 0x52 0x41 0x43 0x45 (.IMETRACE), such + * Represents a file full of trace entries for clients that use InputMethod. + * Encoded, it should start with 0x9 0x49 0x4d 0x43 0x54 0x52 0x41 0x43 0x45 (.IMCTRACE), such * that they can be easily identified. */ -message InputMethodEditorTraceFileProto { +message InputMethodClientsTraceFileProto { /* constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 | MagicNumber.MAGIC_NUMBER_L (this is needed because enums have to be 32 bits and there's no nice way to put 64bit constants into .proto files.) */ enum MagicNumber { INVALID = 0; - MAGIC_NUMBER_L = 0x54454d49; /* IMET (little-endian ASCII) */ + MAGIC_NUMBER_L = 0x54434d49; /* IMCT (little-endian ASCII) */ MAGIC_NUMBER_H = 0x45434152; /* RACE (little-endian ASCII) */ } /* Must be the first field to allow winscope to auto-detect the dump type. Set to value in MagicNumber */ optional fixed64 magic_number = 1; - repeated InputMethodEditorProto entry = 2; + repeated InputMethodClientsTraceProto entry = 2; } -/* one input method editor dump entry. */ -message InputMethodEditorProto { - +/* One dump entry for clients that use InputMethod. */ +message InputMethodClientsTraceProto { /* required: elapsed realtime in nanos since boot of when this entry was logged */ optional fixed64 elapsed_realtime_nanos = 1; - optional ClientsProto clients = 2; - optional .android.inputmethodservice.InputMethodServiceProto input_method_service = 3; - optional .android.server.inputmethod.InputMethodManagerServiceProto input_method_manager_service = 4; - // this wrapper helps to simplify the dumping logic - message ClientsProto { - repeated ClientSideProto client = 1; - } + /* where the trace originated */ + optional string where = 2; + + optional ClientSideProto client = 3; /* groups together the dump from ime related client side classes */ message ClientSideProto { @@ -75,4 +71,70 @@ message InputMethodEditorProto { optional EditorInfoProto editor_info = 6; optional ImeFocusControllerProto ime_focus_controller = 7; } +} + +/** + * Represents a file full of InputMethodService trace entries. + * Encoded, it should start with 0x9 0x49 0x4d 0x53 0x54 0x52 0x41 0x43 0x45 (.IMSTRACE), such + * that they can be easily identified. + */ +message InputMethodServiceTraceFileProto { + + /* constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 | MagicNumber.MAGIC_NUMBER_L + (this is needed because enums have to be 32 bits and there's no nice way to put 64bit + constants into .proto files.) */ + enum MagicNumber { + INVALID = 0; + MAGIC_NUMBER_L = 0x54534d49; /* IMST (little-endian ASCII) */ + MAGIC_NUMBER_H = 0x45434152; /* RACE (little-endian ASCII) */ + } + + /* Must be the first field to allow winscope to auto-detect the dump type. Set to value + in MagicNumber */ + optional fixed64 magic_number = 1; + repeated InputMethodServiceTraceProto entry = 2; +} + +/* One dump entry for InputMethodService. */ +message InputMethodServiceTraceProto { + /* required: elapsed realtime in nanos since boot of when this entry was logged */ + optional fixed64 elapsed_realtime_nanos = 1; + + /* where the trace originated */ + optional string where = 2; + + optional .android.inputmethodservice.InputMethodServiceProto input_method_service = 3; +} + +/** + * Represents a file full of InputMethodManagerService trace entries. + * Encoded, it should start with 0x9 0x49 0x4d 0x4d 0x54 0x52 0x41 0x43 0x45 (.IMMTRACE), such + * that they can be easily identified. + */ +message InputMethodManagerServiceTraceFileProto { + + /* constant; MAGIC_NUMBER = (long) MAGIC_NUMBER_H << 32 | MagicNumber.MAGIC_NUMBER_L + (this is needed because enums have to be 32 bits and there's no nice way to put 64bit + constants into .proto files.) */ + enum MagicNumber { + INVALID = 0; + MAGIC_NUMBER_L = 0x544d4d49; /* IMMT (little-endian ASCII) */ + MAGIC_NUMBER_H = 0x45434152; /* RACE (little-endian ASCII) */ + } + + /* Must be the first field to allow winscope to auto-detect the dump type. Set to value + in MagicNumber */ + optional fixed64 magic_number = 1; + repeated InputMethodManagerServiceTraceProto entry = 2; +} + +/* One dump entry for InputMethodManagerService. */ +message InputMethodManagerServiceTraceProto { + /* required: elapsed realtime in nanos since boot of when this entry was logged */ + optional fixed64 elapsed_realtime_nanos = 1; + + /* where the trace originated */ + optional string where = 2; + + optional .android.server.inputmethod.InputMethodManagerServiceProto input_method_manager_service = 3; }
\ No newline at end of file diff --git a/core/res/res/drawable/ic_reply_notification.xml b/core/res/res/drawable/ic_reply_notification.xml deleted file mode 100644 index a9864b09207a..000000000000 --- a/core/res/res/drawable/ic_reply_notification.xml +++ /dev/null @@ -1,32 +0,0 @@ -<!-- - ~ Copyright (C) 2017 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> -<inset xmlns:android="http://schemas.android.com/apk/res/android" - android:inset="@dimen/notification_reply_inset"> - <vector android:width="24dp" - android:height="24dp" - android:viewportWidth="24" - android:viewportHeight="24"> - - <path - android:fillColor="#000000" - android:strokeWidth="1" - android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" /> - <path - android:fillColor="#000000" - android:strokeWidth="1" - android:pathData="M16,10 L6.83,10 L9,7.83 L10.41,6.42 L9,5 L3,11 L9,17 L10.41,15.59 L9,14.17 L6.83,12 L16,12 C17.65,12 19,13.35 19,15 L19,19 L21,19 L21,15 C21,12.24 18.76,10 16,10 Z" /> - </vector> -</inset> diff --git a/core/res/res/drawable/notification_big_picture_outline.xml b/core/res/res/drawable/notification_big_picture_outline.xml new file mode 100644 index 000000000000..4c4fa50c43c3 --- /dev/null +++ b/core/res/res/drawable/notification_big_picture_outline.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <corners android:radius="16dp" /> + <solid android:color="#00000000" /> +</shape> diff --git a/core/res/res/drawable/notification_icon_circle.xml b/core/res/res/drawable/notification_icon_circle.xml new file mode 100644 index 000000000000..b10a52d41b6a --- /dev/null +++ b/core/res/res/drawable/notification_icon_circle.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> + <solid android:color="#333" /> +</shape> diff --git a/core/res/res/drawable/notification_large_icon_outline.xml b/core/res/res/drawable/notification_large_icon_outline.xml new file mode 100644 index 000000000000..bac03d2fe1c4 --- /dev/null +++ b/core/res/res/drawable/notification_large_icon_outline.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <corners android:radius="5dp" /> + <solid android:color="#00000000" /> +</shape> diff --git a/core/res/res/layout/notification_material_action_list.xml b/core/res/res/layout/notification_material_action_list.xml index bf66e69b52d3..552a1bd6aa2e 100644 --- a/core/res/res/layout/notification_material_action_list.xml +++ b/core/res/res/layout/notification_material_action_list.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -14,50 +13,54 @@ limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/actions_container" +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/actions_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/notification_action_list_margin_top" + android:layout_gravity="bottom" + > + + <LinearLayout + android:id="@+id/actions_container_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/notification_action_list_margin_top" - android:layout_gravity="bottom"> - - <LinearLayout - android:id="@+id/actions_container_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="end" + android:gravity="end" + android:orientation="horizontal" + android:paddingEnd="@dimen/bubble_gone_padding_end" + android:background="@color/notification_action_list_background_color" + > + + <com.android.internal.widget.NotificationActionListLayout + android:id="@+id/actions" + android:layout_width="0dp" + android:layout_weight="1" + android:layout_height="@dimen/notification_action_list_height" android:orientation="horizontal" - android:paddingEnd="@dimen/bubble_gone_padding_end" - android:background="@color/notification_action_list_background_color" + android:gravity="center_vertical" + android:paddingStart="@dimen/notification_actions_padding_start" + android:visibility="gone" > + <!-- actions will be added here --> + </com.android.internal.widget.NotificationActionListLayout> + + <ImageView + android:id="@+id/snooze_button" + android:layout_width="@dimen/notification_actions_icon_size" + android:layout_height="@dimen/notification_actions_icon_size" + android:layout_gravity="center_vertical|end" + android:visibility="gone" + android:scaleType="centerInside" + /> - <com.android.internal.widget.NotificationActionListLayout - android:id="@+id/actions" - android:layout_width="0dp" - android:layout_weight="1" - android:layout_height="@dimen/notification_action_list_height" - android:orientation="horizontal" - android:gravity="center_vertical" - android:visibility="gone" - > - <!-- actions will be added here --> - </com.android.internal.widget.NotificationActionListLayout> - - <ImageView - android:id="@+id/snooze_button" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_gravity="center_vertical|end" - android:visibility="gone" - android:scaleType="centerInside" - /> - <ImageView - android:id="@+id/bubble_button" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_gravity="center_vertical|end" - android:visibility="gone" - android:scaleType="centerInside" - /> + <ImageView + android:id="@+id/bubble_button" + android:layout_width="@dimen/notification_actions_icon_size" + android:layout_height="@dimen/notification_actions_icon_size" + android:layout_gravity="center_vertical|end" + android:visibility="gone" + android:scaleType="centerInside" + /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml index d11875e0f890..a26473ad6010 100644 --- a/core/res/res/layout/notification_template_header.xml +++ b/core/res/res/layout/notification_template_header.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2015 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,40 +13,66 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<!-- extends ViewGroup --> +<!-- extends FrameLayout --> <NotificationHeaderView xmlns:android="http://schemas.android.com/apk/res/android" - android:theme="@style/Theme.DeviceDefault.Notification" android:id="@+id/notification_header" - android:orientation="horizontal" android:layout_width="wrap_content" - android:layout_height="@dimen/notification_header_height" + android:layout_height="@dimen/notification_header_solo_height" + android:layout_marginBottom="@dimen/notification_header_margin_bottom" android:clipChildren="false" - style="?attr/notificationHeaderStyle"> - <!-- Wrapper used to expand the width of the "space" containing the icon programmatically --> - <FrameLayout - android:id="@+id/header_icon_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content"> + android:gravity="center_vertical" + android:orientation="horizontal" + android:theme="@style/Theme.DeviceDefault.Notification" + > - <com.android.internal.widget.CachingIconView - android:id="@+id/icon" - android:layout_width="?attr/notificationHeaderIconSize" - android:layout_height="?attr/notificationHeaderIconSize" - android:layout_marginEnd="@dimen/notification_header_icon_margin_end" - android:layout_gravity="center" + <com.android.internal.widget.CachingIconView + android:id="@+id/icon" + android:layout_width="@dimen/notification_icon_circle_size" + android:layout_height="@dimen/notification_icon_circle_size" + android:layout_gravity="center_vertical|start" + android:layout_marginStart="@dimen/notification_icon_circle_start" + android:background="@drawable/notification_icon_circle" + android:padding="@dimen/notification_icon_circle_padding" /> - </FrameLayout> - <include layout="@layout/notification_template_top_line" /> + + <!-- extends ViewGroup --> + <NotificationTopLineView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/notification_top_line" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:clipChildren="false" + android:gravity="center_vertical" + android:paddingEnd="@dimen/notification_heading_margin_end" + android:paddingStart="@dimen/notification_content_margin_start" + android:theme="@style/Theme.DeviceDefault.Notification" + > + + <TextView + android:id="@+id/app_name_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/notification_header_separating_margin" + android:singleLine="true" + android:textAppearance="?attr/notificationHeaderTextAppearance" + android:visibility="?attr/notificationHeaderAppNameVisibility" + /> + + <include layout="@layout/notification_top_line_views" /> + + </NotificationTopLineView> + <com.android.internal.widget.NotificationExpandButton android:id="@+id/expand_button" - android:background="@null" android:layout_width="@dimen/notification_header_expand_icon_size" android:layout_height="@dimen/notification_header_expand_icon_size" - android:layout_marginStart="4dp" + android:layout_gravity="center_vertical|end" + android:contentDescription="@string/expand_button_content_description_collapsed" android:paddingTop="@dimen/notification_expand_button_padding_top" + android:scaleType="center" android:visibility="gone" - android:contentDescription="@string/expand_button_content_description_collapsed" /> -</NotificationHeaderView> +</NotificationHeaderView> diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml index 34c7fa734f21..ded16b7edf87 100644 --- a/core/res/res/layout/notification_template_material_base.xml +++ b/core/res/res/layout/notification_template_material_base.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2014 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,30 +14,145 @@ ~ limitations under the License --> -<FrameLayout +<com.android.internal.widget.NotificationMaxHeightFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/status_bar_latest_event_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:tag="base" > - <include layout="@layout/notification_template_header" /> + android:minHeight="@dimen/notification_headerless_min_height" + android:tag="base" + > + + <com.android.internal.widget.CachingIconView + android:id="@+id/icon" + android:layout_width="@dimen/notification_icon_circle_size" + android:layout_height="@dimen/notification_icon_circle_size" + android:layout_gravity="center_vertical|start" + android:layout_marginStart="@dimen/notification_icon_circle_start" + android:background="@drawable/notification_icon_circle" + android:padding="@dimen/notification_icon_circle_padding" + /> + <LinearLayout - android:id="@+id/notification_main_column" + android:id="@+id/notification_standard_view_column" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="top" - android:layout_marginStart="@dimen/notification_content_margin_start" - android:layout_marginEnd="@dimen/notification_content_margin_end" - android:layout_marginTop="@dimen/notification_content_margin_top" - android:layout_marginBottom="@dimen/notification_content_margin" - android:orientation="vertical" > - <include layout="@layout/notification_template_part_line1" /> - <include layout="@layout/notification_template_text" /> - <include + android:layout_gravity="center_vertical" + android:layout_marginBottom="@dimen/notification_headerless_margin_minimum" + android:layout_marginTop="@dimen/notification_headerless_margin_minimum" + android:orientation="vertical" + > + + <!-- + This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is + what causes this view (and it's counterpart at the opposite end) to collapse before the + actual content views do. + This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support + headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line + variant is 56dp and the 2- and 3-line variants are both 76dp. + --> + <FrameLayout + android:layout_width="match_parent" + android:layout_height="@dimen/notification_headerless_margin_extra" + android:layout_weight="1" + /> + + <!-- extends ViewGroup --> + <NotificationTopLineView + android:id="@+id/notification_top_line" + android:layout_width="wrap_content" + android:layout_height="@dimen/notification_headerless_line_height" + android:layout_marginEnd="@dimen/notification_heading_margin_end" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:clipChildren="false" + android:theme="@style/Theme.DeviceDefault.Notification" + > + + <TextView + android:id="@+id/title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/notification_header_separating_margin" + android:ellipsize="marquee" + android:fadingEdge="horizontal" + android:singleLine="true" + android:textAlignment="viewStart" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title" + /> + + <include layout="@layout/notification_top_line_views" /> + + </NotificationTopLineView> + + <LinearLayout + android:id="@+id/notification_main_column" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/notification_heading_margin_end" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:orientation="vertical" + > + + <include + layout="@layout/notification_template_text" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_headerless_line_height" + android:layout_marginTop="0dp" + /> + + <include + layout="@layout/notification_template_progress" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_headerless_line_height" + /> + + </LinearLayout> + + <!-- + This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is + what causes this view (and it's counterpart at the opposite end) to collapse before the + actual content views do. + This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support + headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line + variant is 56dp and the 2- and 3-line variants are both 76dp. + --> + <FrameLayout android:layout_width="match_parent" - android:layout_height="@dimen/notification_progress_bar_height" - android:layout_marginTop="@dimen/notification_progress_margin_top" - layout="@layout/notification_template_progress" /> + android:layout_height="@dimen/notification_headerless_margin_extra" + android:layout_weight="1" + /> + </LinearLayout> - <include layout="@layout/notification_template_right_icon" /> -</FrameLayout> + + <ImageView + android:id="@+id/right_icon" + android:layout_width="@dimen/notification_right_icon_size" + android:layout_height="@dimen/notification_right_icon_size" + android:layout_gravity="center_vertical|end" + android:layout_marginTop="@dimen/notification_right_icon_headerless_margin" + android:layout_marginBottom="@dimen/notification_right_icon_headerless_margin" + android:layout_marginEnd="@dimen/notification_header_expand_icon_size" + android:background="@drawable/notification_large_icon_outline" + android:importantForAccessibility="no" + android:scaleType="centerCrop" + /> + + <FrameLayout + android:id="@+id/expand_button_touch_container" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="end"> + + <com.android.internal.widget.NotificationExpandButton + android:id="@+id/expand_button" + android:layout_width="@dimen/notification_header_expand_icon_size" + android:layout_height="@dimen/notification_header_expand_icon_size" + android:layout_gravity="center_vertical|end" + android:contentDescription="@string/expand_button_content_description_collapsed" + android:paddingTop="@dimen/notification_expand_button_padding_top" + android:scaleType="center" + /> + + </FrameLayout> + +</com.android.internal.widget.NotificationMaxHeightFrameLayout> diff --git a/core/res/res/layout/notification_template_material_big_base.xml b/core/res/res/layout/notification_template_material_big_base.xml index 21068908ffe8..36903fffb26c 100644 --- a/core/res/res/layout/notification_template_material_big_base.xml +++ b/core/res/res/layout/notification_template_material_big_base.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2014 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,19 +20,30 @@ android:layout_height="wrap_content" android:orientation="vertical" android:clipChildren="false" - android:tag="big" > + android:tag="big" + > + <LinearLayout - android:id="@+id/notification_action_list_margin_target" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/notification_action_list_height" - android:orientation="vertical" > + android:id="@+id/notification_action_list_margin_target" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginBottom="@dimen/notification_action_list_height" + android:orientation="vertical" + > + <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:layout_gravity="top" > - <include layout="@layout/notification_template_header" /> + android:layout_gravity="top" + > + + <include + layout="@layout/notification_template_header" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_header_big_height" + /> + <LinearLayout android:id="@+id/notification_main_column" android:layout_width="match_parent" @@ -41,28 +51,40 @@ android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" android:layout_marginTop="@dimen/notification_content_margin_top" - android:orientation="vertical" > + android:orientation="vertical" + > + <include layout="@layout/notification_template_part_line1" /> + <include layout="@layout/notification_template_text" /> + <include android:layout_width="match_parent" android:layout_height="@dimen/notification_progress_bar_height" android:layout_marginTop="@dimen/notification_progress_margin_top" - layout="@layout/notification_template_progress" /> + layout="@layout/notification_template_progress" + /> </LinearLayout> + <include layout="@layout/notification_template_right_icon" /> </FrameLayout> + <ViewStub android:layout="@layout/notification_material_reply_text" android:id="@+id/notification_material_reply_container" android:layout_width="match_parent" - android:layout_height="wrap_content" /> - <include layout="@layout/notification_template_smart_reply_container" + android:layout_height="wrap_content" + /> + + <include + layout="@layout/notification_template_smart_reply_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:layout_marginTop="@dimen/notification_content_margin" /> + android:layout_marginTop="@dimen/notification_content_margin" + /> + <include layout="@layout/notification_material_action_list" /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_material_big_media.xml b/core/res/res/layout/notification_template_material_big_media.xml index 6c47c2c51601..4cf323b24f0a 100644 --- a/core/res/res/layout/notification_template_material_big_media.xml +++ b/core/res/res/layout/notification_template_material_big_media.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2014 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -25,22 +24,28 @@ android:tag="bigMediaNarrow" > <!-- The size will actually be determined at runtime --> - <ImageView android:id="@+id/right_icon" + <ImageView + android:id="@+id/right_icon" android:layout_width="0dp" android:layout_height="0dp" android:layout_gravity="top|end" android:scaleType="centerCrop" - /> - <include layout="@layout/notification_template_header" + /> + + <include + layout="@layout/notification_template_header" android:layout_width="match_parent" android:layout_height="@dimen/media_notification_header_height" - android:layout_gravity="start"/> + android:layout_gravity="start" + /> + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:id="@+id/notification_media_content" > + <LinearLayout android:id="@+id/notification_main_column" android:layout_width="match_parent" @@ -49,41 +54,51 @@ android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginBottom="@dimen/notification_content_margin" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:minHeight="@dimen/notification_min_content_height" android:orientation="vertical" > + <include layout="@layout/notification_template_part_line1" /> + <include layout="@layout/notification_template_text" /> </LinearLayout> + <LinearLayout android:id="@+id/media_actions" android:orientation="horizontal" android:layoutDirection="ltr" - style="@style/NotificationMediaActionContainer" > + style="@style/NotificationMediaActionContainer" + > + <include layout="@layout/notification_material_media_action" android:id="@+id/action0" - /> + /> + <include layout="@layout/notification_material_media_action" android:id="@+id/action1" - /> + /> + <include layout="@layout/notification_material_media_action" android:id="@+id/action2" - /> + /> + <include layout="@layout/notification_material_media_action" android:id="@+id/action3" - /> + /> + <include layout="@layout/notification_material_media_action" android:id="@+id/action4" - /> + /> </LinearLayout> - <ViewStub android:id="@+id/notification_media_seekbar_container" + + <ViewStub + android:id="@+id/notification_media_seekbar_container" android:layout_width="match_parent" android:layout_height="wrap_content" - /> + /> </LinearLayout> </com.android.internal.widget.MediaNotificationView> diff --git a/core/res/res/layout/notification_template_material_big_picture.xml b/core/res/res/layout/notification_template_material_big_picture.xml index 7a1cc1eff167..38853c64a3c8 100644 --- a/core/res/res/layout/notification_template_material_big_picture.xml +++ b/core/res/res/layout/notification_template_material_big_picture.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2014 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,61 +14,83 @@ ~ limitations under the License --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/status_bar_latest_event_content" android:layout_width="match_parent" android:layout_height="match_parent" android:tag="bigPicture" android:clipChildren="false" > - <include layout="@layout/notification_template_header" /> + + <include + layout="@layout/notification_template_header" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_header_big_height" + /> + <include layout="@layout/notification_template_right_icon" /> + <LinearLayout - android:id="@+id/notification_action_list_margin_target" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="top" - android:layout_marginTop="@dimen/notification_content_margin_top" - android:clipToPadding="false" - android:orientation="vertical" - > + android:id="@+id/notification_action_list_margin_target" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="top" + android:layout_marginTop="@dimen/notification_content_margin_top" + android:clipToPadding="false" + android:orientation="vertical" + > + <LinearLayout android:id="@+id/notification_main_column" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:orientation="vertical"> - <include layout="@layout/notification_template_part_line1"/> - <include layout="@layout/notification_template_progress" - android:layout_width="match_parent" - android:layout_height="@dimen/notification_progress_bar_height" - android:layout_marginTop="@dimen/notification_progress_margin_top"/> - <include layout="@layout/notification_template_text"/> - </LinearLayout> - <ImageView - android:id="@+id/big_picture" - android:layout_width="match_parent" - android:layout_height="0dp" - android:adjustViewBounds="true" - android:layout_weight="1" - android:layout_marginTop="13dp" - android:layout_marginStart="@dimen/notification_content_margin_start" - android:layout_marginEnd="@dimen/notification_content_margin_end" - android:scaleType="centerCrop" - /> + android:orientation="vertical" + > - <ViewStub android:layout="@layout/notification_material_reply_text" - android:id="@+id/notification_material_reply_container" + <include layout="@layout/notification_template_part_line1" /> + + <include + layout="@layout/notification_template_progress" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="@dimen/notification_progress_bar_height" + android:layout_marginTop="@dimen/notification_progress_margin_top" /> - <include layout="@layout/notification_template_smart_reply_container" + + <include layout="@layout/notification_template_text" /> + </LinearLayout> + + <ImageView + android:id="@+id/big_picture" + android:layout_width="match_parent" + android:layout_height="0dp" + android:adjustViewBounds="true" + android:layout_weight="1" + android:layout_marginTop="13dp" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginEnd="@dimen/notification_content_margin_end" + android:background="@drawable/notification_big_picture_outline" + android:scaleType="centerCrop" + /> + + <ViewStub + android:layout="@layout/notification_material_reply_text" + android:id="@+id/notification_material_reply_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + /> + + <include + layout="@layout/notification_template_smart_reply_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:layout_marginTop="@dimen/notification_content_margin" /> + android:layout_marginTop="@dimen/notification_content_margin" + /> + <include layout="@layout/notification_material_action_list" /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_material_big_text.xml b/core/res/res/layout/notification_template_material_big_text.xml index d5ea96f6bc16..2452a32b21eb 100644 --- a/core/res/res/layout/notification_template_material_big_text.xml +++ b/core/res/res/layout/notification_template_material_big_text.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2014 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,24 +14,31 @@ ~ limitations under the License --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/status_bar_latest_event_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="false" android:tag="bigText" > - <include layout="@layout/notification_template_header" /> + + <include + layout="@layout/notification_template_header" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_header_big_height" + /> <com.android.internal.widget.RemeasuringLinearLayout - android:id="@+id/notification_action_list_margin_target" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="top" - android:layout_marginTop="@dimen/notification_content_margin_top" - android:layout_marginBottom="@dimen/notification_action_list_height" - android:clipToPadding="false" - android:orientation="vertical"> + android:id="@+id/notification_action_list_margin_target" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="top" + android:layout_marginTop="@dimen/notification_content_margin_top" + android:layout_marginBottom="@dimen/notification_action_list_height" + android:clipToPadding="false" + android:orientation="vertical" + > <com.android.internal.widget.RemeasuringLinearLayout android:id="@+id/notification_main_column" @@ -42,17 +48,22 @@ android:paddingStart="@dimen/notification_content_margin_start" android:paddingEnd="@dimen/notification_content_margin_end" android:clipToPadding="false" - android:minHeight="@dimen/notification_min_content_height" android:orientation="vertical" android:layout_weight="1" > + <include layout="@layout/notification_template_part_line1" /> - <include layout="@layout/notification_template_progress" + + <include + layout="@layout/notification_template_progress" android:layout_width="match_parent" android:layout_height="@dimen/notification_progress_bar_height" android:layout_marginTop="@dimen/notification_progress_margin_top" - android:layout_marginBottom="6dp"/> - <com.android.internal.widget.ImageFloatingTextView android:id="@+id/big_text" + android:layout_marginBottom="6dp" + /> + + <com.android.internal.widget.ImageFloatingTextView + android:id="@+id/big_text" style="@style/Widget.DeviceDefault.Notification.Text" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -64,17 +75,24 @@ /> </com.android.internal.widget.RemeasuringLinearLayout> - <ViewStub android:layout="@layout/notification_material_reply_text" - android:id="@+id/notification_material_reply_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" /> - <include layout="@layout/notification_template_smart_reply_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/notification_content_margin_start" - android:layout_marginEnd="@dimen/notification_content_margin_end" - android:layout_marginTop="@dimen/notification_content_margin" /> + <ViewStub + android:layout="@layout/notification_material_reply_text" + android:id="@+id/notification_material_reply_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + /> + + <include + layout="@layout/notification_template_smart_reply_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginEnd="@dimen/notification_content_margin_end" + android:layout_marginTop="@dimen/notification_content_margin" + /> + <include layout="@layout/notification_material_action_list" /> </com.android.internal.widget.RemeasuringLinearLayout> + <include layout="@layout/notification_template_right_icon" /> </FrameLayout> diff --git a/core/res/res/layout/notification_template_material_conversation.xml b/core/res/res/layout/notification_template_material_conversation.xml index 48cfa073d08b..520ae282b942 100644 --- a/core/res/res/layout/notification_template_material_conversation.xml +++ b/core/res/res/layout/notification_template_material_conversation.xml @@ -33,6 +33,7 @@ android:clipToPadding="false" android:paddingTop="12dp" android:paddingBottom="12dp" + android:importantForAccessibility="no" > <FrameLayout @@ -206,17 +207,19 @@ android:visibility="gone" /> - <ImageView - android:id="@+id/alerted_icon" - android:layout_width="@dimen/notification_alerted_size" - android:layout_height="@dimen/notification_alerted_size" + <ImageButton + android:id="@+id/feedback" + android:layout_width="@dimen/notification_feedback_size" + android:layout_height="@dimen/notification_feedback_size" android:layout_gravity="center" - android:layout_marginStart="4dp" + android:layout_marginStart="@dimen/notification_header_separating_margin" + android:background="?android:selectableItemBackgroundBorderless" + android:contentDescription="@string/notification_feedback_indicator" android:paddingTop="2dp" android:scaleType="fitCenter" + android:src="@drawable/ic_feedback_indicator" android:visibility="gone" - android:contentDescription="@string/notification_alerted_content_description" - android:src="@drawable/ic_notifications_alerted"/> + /> <ImageView android:id="@+id/profile_badge" @@ -228,7 +231,21 @@ android:scaleType="fitCenter" android:visibility="gone" android:contentDescription="@string/notification_work_profile_content_description" - /> + /> + + <ImageView + android:id="@+id/alerted_icon" + android:layout_width="@dimen/notification_alerted_size" + android:layout_height="@dimen/notification_alerted_size" + android:layout_gravity="center" + android:layout_marginStart="4dp" + android:contentDescription="@string/notification_alerted_content_description" + android:paddingTop="2dp" + android:scaleType="fitCenter" + android:src="@drawable/ic_notifications_alerted" + android:visibility="gone" + /> + <LinearLayout android:id="@+id/app_ops" android:layout_height="wrap_content" @@ -268,19 +285,6 @@ android:contentDescription="@string/notification_appops_overlay_active" /> </LinearLayout> - <ImageButton - android:id="@+id/feedback" - android:layout_width="@dimen/notification_feedback_size" - android:layout_height="@dimen/notification_feedback_size" - android:layout_marginStart="@dimen/notification_header_separating_margin" - android:paddingTop="2dp" - android:layout_gravity="center" - android:scaleType="fitCenter" - android:src="@drawable/ic_feedback_indicator" - android:background="?android:selectableItemBackgroundBorderless" - android:visibility="gone" - android:contentDescription="@string/notification_feedback_indicator" - /> </LinearLayout> <!-- Messages --> @@ -320,7 +324,7 @@ collapsed layout while the parent makes sure that we're never laid out bigger than the messaging content.--> <LinearLayout - android:id="@+id/expand_button_inner_container" + android:id="@+id/expand_button_touch_container" android:layout_width="wrap_content" android:layout_height="@dimen/conversation_expand_button_size" android:paddingStart="16dp" @@ -359,12 +363,11 @@ /> <com.android.internal.widget.NotificationExpandButton android:id="@+id/expand_button" - android:layout_width="@dimen/notification_header_expand_icon_size" - android:layout_height="@dimen/notification_header_expand_icon_size" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_gravity="center" android:drawable="@drawable/ic_expand_notification" - android:clickable="false" - android:importantForAccessibility="no" + android:contentDescription="@string/expand_button_content_description_collapsed" /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_material_heads_up_base.xml b/core/res/res/layout/notification_template_material_heads_up_base.xml new file mode 100644 index 000000000000..d55499130dcc --- /dev/null +++ b/core/res/res/layout/notification_template_material_heads_up_base.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?><!-- + ~ Copyright (C) 2014 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License + --> +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/status_bar_latest_event_content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:clipChildren="false" + android:tag="headsUp" + > + + <com.android.internal.widget.RemeasuringLinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:clipChildren="false" + android:orientation="vertical" + > + + <include + layout="@layout/notification_template_material_base" + android:id="@null" + /> + + <com.android.internal.widget.RemeasuringLinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="-12dp" + android:clipChildren="false" + android:orientation="vertical" + > + + <ViewStub + android:layout="@layout/notification_material_reply_text" + android:id="@+id/notification_material_reply_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + /> + + <include + layout="@layout/notification_template_smart_reply_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/notification_content_margin_start" + android:layout_marginEnd="@dimen/notification_content_margin_end" + android:layout_marginTop="@dimen/notification_content_margin" + /> + + <include layout="@layout/notification_material_action_list" /> + </com.android.internal.widget.RemeasuringLinearLayout> + </com.android.internal.widget.RemeasuringLinearLayout> +</FrameLayout> diff --git a/core/res/res/layout/notification_template_material_inbox.xml b/core/res/res/layout/notification_template_material_inbox.xml index eb8925819cd3..e6fa50336e00 100644 --- a/core/res/res/layout/notification_template_material_inbox.xml +++ b/core/res/res/layout/notification_template_material_inbox.xml @@ -39,7 +39,6 @@ android:layout_gravity="top" android:paddingStart="@dimen/notification_content_margin_start" android:paddingEnd="@dimen/notification_content_margin_end" - android:minHeight="@dimen/notification_min_content_height" android:layout_weight="1" android:clipToPadding="false" android:orientation="vertical" diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml index 575295b1be45..52053dcdf800 100644 --- a/core/res/res/layout/notification_template_material_media.xml +++ b/core/res/res/layout/notification_template_material_media.xml @@ -55,7 +55,6 @@ android:layout_height="wrap_content" android:layout_gravity="fill_vertical" android:layout_weight="1" - android:minHeight="@dimen/notification_min_content_height" android:paddingBottom="@dimen/notification_content_margin" android:orientation="vertical" > diff --git a/core/res/res/layout/notification_template_material_messaging.xml b/core/res/res/layout/notification_template_material_messaging.xml index 10c750972961..c3fd249d3ad5 100644 --- a/core/res/res/layout/notification_template_material_messaging.xml +++ b/core/res/res/layout/notification_template_material_messaging.xml @@ -40,7 +40,6 @@ android:layout_weight="1" android:layout_marginStart="@dimen/notification_content_margin_start" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:minHeight="@dimen/notification_min_content_height" android:orientation="vertical" > <com.android.internal.widget.MessagingLinearLayout @@ -57,5 +56,5 @@ android:layout_marginEnd="@dimen/notification_content_margin_end" /> <include layout="@layout/notification_material_action_list" /> </com.android.internal.widget.RemeasuringLinearLayout> - <include layout="@layout/notification_template_right_icon"/> + <include layout="@layout/notification_template_right_icon" /> </com.android.internal.widget.MessagingLayout> diff --git a/core/res/res/layout/notification_template_part_line1.xml b/core/res/res/layout/notification_template_part_line1.xml index 622f080653a4..fc5bd9cc6c0b 100644 --- a/core/res/res/layout/notification_template_part_line1.xml +++ b/core/res/res/layout/notification_template_part_line1.xml @@ -22,7 +22,7 @@ android:orientation="horizontal" > <TextView android:id="@+id/title" - android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Title" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.BigTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" diff --git a/core/res/res/layout/notification_template_right_icon.xml b/core/res/res/layout/notification_template_right_icon.xml index ee416ad36b8a..d22d4c20dad2 100644 --- a/core/res/res/layout/notification_template_right_icon.xml +++ b/core/res/res/layout/notification_template_right_icon.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2015 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,29 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<!-- The view only has 8dp padding at the end instead of notification_content_margin_end, - since the reply icon has an inset of 8dp and we want it to visually start at the start of the - icon. --> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/right_icon_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/notification_content_margin_top" - android:layout_marginEnd="8dp" - android:layout_gravity="top|end"> - <ImageView android:id="@+id/right_icon" - android:layout_width="@dimen/notification_right_icon_size" - android:layout_height="@dimen/notification_right_icon_size" - android:layout_gravity="top|end" - android:layout_marginEnd="8dp" - android:scaleType="centerCrop" - android:importantForAccessibility="no" /> - <ImageView android:id="@+id/reply_icon_action" - android:layout_width="@dimen/notification_right_icon_size" - android:layout_height="@dimen/notification_right_icon_size" - android:layout_gravity="top|end" - android:contentDescription="@string/notification_reply_button_accessibility" - android:scaleType="centerCrop" - android:src="@drawable/ic_reply_notification"/> -</LinearLayout> - +<ImageView + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/right_icon" + android:layout_width="@dimen/notification_right_icon_size" + android:layout_height="@dimen/notification_right_icon_size" + android:layout_gravity="top|end" + android:layout_marginEnd="@dimen/notification_header_expand_icon_size" + android:layout_marginTop="@dimen/notification_right_icon_big_margin_top" + android:background="@drawable/notification_large_icon_outline" + android:importantForAccessibility="no" + android:scaleType="centerCrop" + /> diff --git a/core/res/res/layout/notification_template_text.xml b/core/res/res/layout/notification_template_text.xml index 01b14ae0592d..4920c7953d65 100644 --- a/core/res/res/layout/notification_template_text.xml +++ b/core/res/res/layout/notification_template_text.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2016 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,11 +13,12 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<com.android.internal.widget.ImageFloatingTextView xmlns:android="http://schemas.android.com/apk/res/android" +<com.android.internal.widget.ImageFloatingTextView + xmlns:android="http://schemas.android.com/apk/res/android" style="@style/Widget.DeviceDefault.Notification.Text" android:id="@+id/text" android:layout_width="match_parent" - android:layout_height="wrap_content" + android:layout_height="@dimen/notification_text_height" android:layout_gravity="top" android:layout_marginTop="@dimen/notification_text_margin_top" android:ellipsize="marquee" diff --git a/core/res/res/layout/notification_template_top_line.xml b/core/res/res/layout/notification_top_line_views.xml index 0786e138559f..51974ac7dcf3 100644 --- a/core/res/res/layout/notification_template_top_line.xml +++ b/core/res/res/layout/notification_top_line_views.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- +<?xml version="1.0" encoding="utf-8"?><!-- ~ Copyright (C) 2015 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,25 +13,13 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<!-- extends ViewGroup --> -<NotificationTopLineView - xmlns:android="http://schemas.android.com/apk/res/android" - android:theme="@style/Theme.DeviceDefault.Notification" - android:id="@+id/notification_top_line" - android:layout_width="wrap_content" - android:layout_height="@dimen/notification_header_height" - android:clipChildren="false" - > - <TextView - android:id="@+id/app_name_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?attr/notificationHeaderTextAppearance" - android:layout_marginStart="@dimen/notification_header_app_name_margin_start" - android:layout_marginEnd="@dimen/notification_header_separating_margin" - android:visibility="?attr/notificationHeaderAppNameVisibility" - android:singleLine="true" - /> +<!-- + This layout file should be included inside a NotificationTopLineView, usually after either a + <TextView android:id="@+id/app_name_text"/> or <TextView android:id="@+id/title"/> +--> +<merge + xmlns:android="http://schemas.android.com/apk/res/android"> + <TextView android:id="@+id/header_text_secondary_divider" android:layout_width="wrap_content" @@ -41,7 +28,9 @@ android:layout_marginStart="@dimen/notification_header_separating_margin" android:layout_marginEnd="@dimen/notification_header_separating_margin" android:text="@string/notification_header_divider_symbol" - android:visibility="gone"/> + android:visibility="gone" + /> + <TextView android:id="@+id/header_text_secondary" android:layout_width="wrap_content" @@ -50,7 +39,9 @@ android:layout_marginStart="@dimen/notification_header_separating_margin" android:layout_marginEnd="@dimen/notification_header_separating_margin" android:visibility="gone" - android:singleLine="true"/> + android:singleLine="true" + /> + <TextView android:id="@+id/header_text_divider" android:layout_width="wrap_content" @@ -59,7 +50,9 @@ android:layout_marginStart="@dimen/notification_header_separating_margin" android:layout_marginEnd="@dimen/notification_header_separating_margin" android:text="@string/notification_header_divider_symbol" - android:visibility="gone"/> + android:visibility="gone" + /> + <TextView android:id="@+id/header_text" android:layout_width="wrap_content" @@ -68,7 +61,9 @@ android:layout_marginStart="@dimen/notification_header_separating_margin" android:layout_marginEnd="@dimen/notification_header_separating_margin" android:visibility="gone" - android:singleLine="true"/> + android:singleLine="true" + /> + <TextView android:id="@+id/time_divider" android:layout_width="wrap_content" @@ -78,7 +73,9 @@ android:layout_marginEnd="@dimen/notification_header_separating_margin" android:text="@string/notification_header_divider_symbol" android:singleLine="true" - android:visibility="gone"/> + android:visibility="gone" + /> + <DateTimeView android:id="@+id/time" android:textAppearance="@style/TextAppearance.Material.Notification.Time" @@ -88,7 +85,9 @@ android:layout_marginEnd="@dimen/notification_header_separating_margin" android:showRelative="true" android:singleLine="true" - android:visibility="gone" /> + android:visibility="gone" + /> + <ViewStub android:id="@+id/chronometer" android:layout_width="wrap_content" @@ -98,17 +97,7 @@ android:layout="@layout/notification_template_part_chronometer" android:visibility="gone" /> - <ImageView - android:id="@+id/alerted_icon" - android:layout_width="@dimen/notification_alerted_size" - android:layout_height="@dimen/notification_alerted_size" - android:layout_marginStart="4dp" - android:baseline="10dp" - android:scaleType="fitCenter" - android:visibility="gone" - android:contentDescription="@string/notification_alerted_content_description" - android:src="@drawable/ic_notifications_alerted" - /> + <ImageButton android:id="@+id/feedback" android:layout_width="@dimen/notification_feedback_size" @@ -121,7 +110,8 @@ android:background="?android:selectableItemBackgroundBorderless" android:visibility="gone" android:contentDescription="@string/notification_feedback_indicator" - /> + /> + <ImageView android:id="@+id/profile_badge" android:layout_width="@dimen/notification_badge_size" @@ -132,5 +122,17 @@ android:visibility="gone" android:contentDescription="@string/notification_work_profile_content_description" /> -</NotificationTopLineView> + + <ImageView + android:id="@+id/alerted_icon" + android:layout_width="@dimen/notification_alerted_size" + android:layout_height="@dimen/notification_alerted_size" + android:layout_marginStart="4dp" + android:baseline="10dp" + android:contentDescription="@string/notification_alerted_content_description" + android:scaleType="fitCenter" + android:src="@drawable/ic_notifications_alerted" + android:visibility="gone" + /> +</merge> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 393f229b75bb..0d8fc2b6ca69 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1635,7 +1635,7 @@ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Al mantener pulsadas ambas teclas de volumen durante unos segundos se activa <xliff:g id="SERVICE">%1$s</xliff:g>, una función de accesibilidad. Esta función puede modificar el funcionamiento del dispositivo.\n\nPuedes asignar este acceso directo a otra función en Ajustes > Accesibilidad."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"No activar"</string> - <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"SÍ"</string> + <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ACTIVADO"</string> <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"NO"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"¿Permitir que <xliff:g id="SERVICE">%1$s</xliff:g> pueda controlar totalmente tu dispositivo?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Si activas <xliff:g id="SERVICE">%1$s</xliff:g>, el dispositivo no utilizará el bloqueo de pantalla para mejorar el cifrado de datos."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 95e64bbbe89a..c09c71e9244c 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -52,6 +52,7 @@ <string name="enablePin" msgid="2543771964137091212">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IIEM"</string> @@ -179,6 +180,7 @@ <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029"> <item quantity="one">Autorité de certification installée</item> + <item quantity="many">Certificate authorities installed</item> <item quantity="other">Autorités de certification installées</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> @@ -253,6 +255,7 @@ <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string> <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206"> <item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item> + <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item> <item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item> </plurals> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string> @@ -1001,6 +1004,7 @@ <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> <plurals name="last_num_days" formatted="false" msgid="687443109145393632"> <item quantity="one">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> @@ -1023,66 +1027,82 @@ <string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019"> <item quantity="one">il y a<xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item> <item quantity="other">il y a<xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> @@ -1455,6 +1475,7 @@ <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> <plurals name="matches_found" formatted="false" msgid="1101758718194295554"> <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> + <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> </plurals> <string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string> @@ -1588,6 +1609,7 @@ <string name="kg_wrong_pin" msgid="3680925703673166482">"NIP incorrect."</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568"> <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item> + <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item> <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item> </plurals> <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string> @@ -1774,6 +1796,7 @@ <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153"> <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item> + <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item> <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item> </plurals> <string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string> @@ -1805,34 +1828,42 @@ <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312"> <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758"> <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642"> <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998"> <item quantity="one">Pendant %d minute</item> + <item quantity="many">For %d minutes</item> <item quantity="other">Pendant %d minutes</item> </plurals> <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859"> <item quantity="one">Pendant %d min</item> + <item quantity="many">For %d min</item> <item quantity="other">Pendant %d min</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022"> <item quantity="one">Pendant %d heure</item> + <item quantity="many">For %d hours</item> <item quantity="other">Pendant %d heures</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640"> <item quantity="one">Pendant %d h</item> + <item quantity="many">For %d hr</item> <item quantity="other">Pendant %d h</item> </plurals> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> @@ -1874,6 +1905,7 @@ <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> </plurals> <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string> @@ -1941,6 +1973,7 @@ <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string> <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978"> <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de remplissage automatique</item> + <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item> <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de remplissage automatique</item> </plurals> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> @@ -2035,6 +2068,7 @@ <string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string> <plurals name="file_count" formatted="false" msgid="7063513834724389247"> <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item> + <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 4c2984973594..9c9cdd112bc6 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -52,6 +52,7 @@ <string name="enablePin" msgid="2543771964137091212">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IMEI"</string> @@ -179,6 +180,7 @@ <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029"> <item quantity="one">Autorité de certification installée</item> + <item quantity="many">Certificate authorities installed</item> <item quantity="other">Autorités de certification installées</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> @@ -253,6 +255,7 @@ <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string> <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206"> <item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item> + <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item> <item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item> </plurals> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string> @@ -1001,6 +1004,7 @@ <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> <plurals name="last_num_days" formatted="false" msgid="687443109145393632"> <item quantity="one">Le dernier jour (<xliff:g id="COUNT_1">%d</xliff:g>)</item> + <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">Les <xliff:g id="COUNT_1">%d</xliff:g> derniers jours</item> </plurals> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> @@ -1023,66 +1027,82 @@ <string name="now_string_shortest" msgid="3684914126941650330">"mainten."</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> @@ -1240,7 +1260,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume des notifications"</string> <string name="ringtone_default" msgid="9118299121288174597">"Sonnerie par défaut"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Sonnerie par défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"Aucun(e)"</string> + <string name="ringtone_silent" msgid="397111123930141876">"Aucun"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"Sonneries"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Sons de l\'alarme"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Sons de notification"</string> @@ -1455,6 +1475,7 @@ <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> <plurals name="matches_found" formatted="false" msgid="1101758718194295554"> <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> + <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> </plurals> <string name="action_mode_done" msgid="2536182504764803222">"OK"</string> @@ -1588,6 +1609,7 @@ <string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568"> <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item> + <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item> <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item> </plurals> <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string> @@ -1774,6 +1796,7 @@ <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153"> <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item> + <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item> <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item> </plurals> <string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string> @@ -1805,34 +1828,42 @@ <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312"> <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758"> <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642"> <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998"> <item quantity="one">Pendant %d minute</item> + <item quantity="many">For %d minutes</item> <item quantity="other">Pendant %d minutes</item> </plurals> <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859"> <item quantity="one">Pendant %d min</item> + <item quantity="many">For %d min</item> <item quantity="other">Pendant %d min</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022"> <item quantity="one">Pendant %d heure</item> + <item quantity="many">For %d hours</item> <item quantity="other">Pendant %d heures</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640"> <item quantity="one">Pendant %d h</item> + <item quantity="many">For %d hr</item> <item quantity="other">Pendant %d h</item> </plurals> <string name="zen_mode_until_next_day" msgid="1403042784161725038">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> @@ -1874,6 +1905,7 @@ <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> </plurals> <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string> @@ -1941,6 +1973,7 @@ <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string> <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978"> <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de saisie automatique</item> + <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item> <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de saisie automatique</item> </plurals> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string> @@ -2035,6 +2068,7 @@ <string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string> <plurals name="file_count" formatted="false" msgid="7063513834724389247"> <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item> + <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index a537e7ed38ac..bf26d99b7e19 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1240,7 +1240,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume notifiche"</string> <string name="ringtone_default" msgid="9118299121288174597">"Suoneria predefinita"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Predefinita (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"Nessuna"</string> + <string name="ringtone_silent" msgid="397111123930141876">"Nessuno"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"Suonerie"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Suoni delle sveglie"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Suoni di notifica"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 9e2e0a29544c..af980235650a 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1798,8 +1798,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Администраторуңуз жаңыртып койгон"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Администраторуңуз жок кылып салган"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ЖАРАЙТ"</string> - <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Батареянын мөөнөтүн узартуу үчүн, Батареяны үнөмдөгүч режими төмөнкүлөрдү аткарат:\n\n• Караңгы теманы күйгүзөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string> - <string name="battery_saver_description" msgid="6794188153647295212">"Батареянын мөөнөтүн узартуу үчүн, Батареяны үнөмдөгүч режими:\n\n• Караңгы теманы күйгүзөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string> + <string name="battery_saver_description_with_learn_more" msgid="4424488535318105801">"Батареянын мөөнөтүн узартуу үчүн Батареяны үнөмдөгүч режими төмөнкүлөрдү аткарат:\n\n• Караңгы теманы күйгүзөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string> + <string name="battery_saver_description" msgid="6794188153647295212">"Батареянын мөөнөтүн узартуу үчүн Батареяны үнөмдөгүч режими:\n\n• Караңгы теманы күйгүзөт\n• Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string> <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайын-даректерди фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайын-даректерди жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Күйгүзүү"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 4db2bec7cad1..c2972f13e372 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1316,7 +1316,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB பிழைதிருத்தம் இணைக்கப்பட்டது"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB பிழைதிருத்தத்தை ஆஃப் செய்ய தட்டவும்"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB பிழைதிருத்தத்தை ஆஃப் செய்யத் தட்டவும்"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB பிழைதிருத்தத்தை முடக்க, தேர்ந்தெடுக்கவும்."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"வைஃபை பிழைதிருத்தம் இணைக்கப்பட்டது"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"வைஃபை பிழைதிருத்தத்தை ஆஃப் செய்ய தட்டவும்"</string> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 544be54eb785..79eae67e5fba 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -207,14 +207,14 @@ <!-- Default padding for dialogs. --> <dimen name="dialog_padding">16dp</dimen> - <!-- The margin on the start of the content view --> - <dimen name="notification_content_margin_start">16dp</dimen> + <!-- The margin on the start of the content view (accommodates the icon) --> + <dimen name="notification_content_margin_start">52dp</dimen> - <!-- The margin on the end of the content view. --> + <!-- The margin on the end of most content views (ignores the expander) --> <dimen name="notification_content_margin_end">16dp</dimen> - <!-- The inset of the reply icon. --> - <dimen name="notification_reply_inset">8dp</dimen> + <!-- The margin on the end of the top-line content views (accommodates the expander) --> + <dimen name="notification_heading_margin_end">48dp</dimen> <!-- The margin for text at the end of the image view for media notifications --> <dimen name="notification_media_image_margin_end">72dp</dimen> @@ -228,11 +228,18 @@ <!-- The height of the notification action list --> <dimen name="notification_action_emphasized_height">48dp</dimen> + <!-- The padding of the actions in non-conversation layout. For conversations, the analogous + value is calculated in ConversationLayout#updateActionListPadding() --> + <dimen name="notification_actions_padding_start">36dp</dimen> + + <!-- The size of icons for visual actions in the notification_material_action_list --> + <dimen name="notification_actions_icon_size">48dp</dimen> + <!-- Size of the stroke with for the emphasized notification button style --> <dimen name="emphasized_button_stroke_width">1dp</dimen> <!-- height of the content margin to accomodate for the header --> - <dimen name="notification_content_margin_top">46dp</dimen> + <dimen name="notification_content_margin_top">50dp</dimen> <!-- height of the content margin that is applied at the end of the notification content --> <dimen name="notification_content_margin">20dp</dimen> @@ -243,8 +250,11 @@ <!-- The top margin before the notification progress bar. --> <dimen name="notification_progress_margin_top">8dp</dimen> - <!-- height of the notification header (for icon and package name) --> - <dimen name="notification_header_height">50dp</dimen> + <!-- height of the notification header when the notification is alone (minimized / groups) --> + <dimen name="notification_header_solo_height">48dp</dimen> + + <!-- height of the notification header when in a "big" layout --> + <dimen name="notification_header_big_height">56dp</dimen> <!-- The height of the background for a notification header on a group --> <dimen name="notification_header_background_height">49.5dp</dimen> @@ -258,12 +268,18 @@ <!-- The margin at the bottom of the notification header. --> <dimen name="notification_header_margin_bottom">0dp</dimen> - <!-- The end margin after the application icon in the notification header --> - <dimen name="notification_header_icon_margin_end">3dp</dimen> - <!-- size (width and height) of the icon in the notification header --> <dimen name="notification_header_icon_size">18dp</dimen> + <!-- size (width and height) of the circle around the icon in the notification header --> + <dimen name="notification_icon_circle_size">24dp</dimen> + + <!-- padding between the notification icon and the circle containing it --> + <dimen name="notification_icon_circle_padding">4dp</dimen> + + <!-- start margin of the icon circle in the notification view --> + <dimen name="notification_icon_circle_start">16dp</dimen> + <!-- size (width and height) of the icon in the notification header --> <dimen name="notification_header_icon_size_ambient">18dp</dimen> @@ -276,14 +292,26 @@ <!-- The margin before and after each of the items in the conversation header. --> <dimen name="notification_conversation_header_separating_margin">4dp</dimen> - <!-- The absolute size of the notification expand icon. -2 for wrap_content. --> - <dimen name="notification_header_expand_icon_size">-2px</dimen> + <!-- The absolute size of the notification expand icon. --> + <dimen name="notification_header_expand_icon_size">48dp</dimen> <!-- The top padding for the notification expand button. --> <dimen name="notification_expand_button_padding_top">1dp</dimen> + <!-- minimum vertical margin for the headerless notification content --> + <dimen name="notification_headerless_margin_minimum">8dp</dimen> + + <!-- extra vertical margin for the headerless notification content --> + <dimen name="notification_headerless_margin_extra">10dp</dimen> + + <!-- The height of each of the 1 or 2 lines in the headerless notification template --> + <dimen name="notification_headerless_line_height">20sp</dimen> + + <!-- vertical margin for the headerless notification content --> + <dimen name="notification_headerless_min_height">56dp</dimen> + <!-- Height of a small notification in the status bar --> - <dimen name="notification_min_height">106dp</dimen> + <dimen name="notification_min_height">76dp</dimen> <!-- The width of the big icons in notifications. --> <dimen name="notification_large_icon_width">64dp</dimen> @@ -294,9 +322,6 @@ <!-- The minimum width of the app name in the header if it shrinks --> <dimen name="notification_header_shrink_min_width">72dp</dimen> - <!-- The minimum height of the content if there are at least two lines or a picture--> - <dimen name="notification_min_content_height">39dp</dimen> - <!-- The size of the media actions in the media notification. --> <dimen name="media_notification_action_button_size">48dp</dimen> @@ -310,7 +335,7 @@ <dimen name="media_notification_expanded_image_margin_bottom">20dp</dimen> <!-- The absolute height for the header in a media notification. --> - <dimen name="media_notification_header_height">@dimen/notification_header_height</dimen> + <dimen name="media_notification_header_height">@dimen/notification_header_big_height</dimen> <!-- The margin of the content to an image--> <dimen name="notification_content_image_margin_end">8dp</dimen> @@ -426,6 +451,8 @@ <dimen name="notification_text_size">14sp</dimen> <!-- Size of notification text titles (see TextAppearance.StatusBar.EventContent.Title) --> <dimen name="notification_title_text_size">14sp</dimen> + <!-- Size of big notification text titles (see TextAppearance.StatusBar.EventContent.BigTitle) --> + <dimen name="notification_big_title_text_size">16sp</dimen> <!-- Size of smaller notification text (see TextAppearance.StatusBar.EventContent.Line2, Info, Time) --> <dimen name="notification_subtext_size">12sp</dimen> <!-- Top padding for notifications in the standard layout. --> @@ -444,7 +471,10 @@ <dimen name="notification_large_icon_circle_padding">11dp</dimen> <!-- The margin on top of the text of the notification --> - <dimen name="notification_text_margin_top">0.5dp</dimen> + <dimen name="notification_text_margin_top">6dp</dimen> + + <!-- Height of a single line text view in a notification --> + <dimen name="notification_text_height">20sp</dimen> <!-- The padding on top of inbox style elements --> <dimen name="notification_inbox_item_top_padding">5dp</dimen> @@ -679,7 +709,11 @@ <!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.--> <dimen name="notification_media_image_max_width">280dp</dimen> <!-- The size of the right icon --> - <dimen name="notification_right_icon_size">36dp</dimen> + <dimen name="notification_right_icon_size">52dp</dimen> + <!-- The top and bottom margin of the right icon in the normal notification states --> + <dimen name="notification_right_icon_headerless_margin">12dp</dimen> + <!-- The top margin of the right icon in the "big" notification states --> + <dimen name="notification_right_icon_big_margin_top">16dp</dimen> <!-- The alpha of a disabled notification button --> <item type="dimen" format="float" name="notification_action_disabled_alpha">0.5</item> @@ -700,8 +734,10 @@ <!-- The maximum size of the grayscale icon --> <dimen name="notification_grayscale_icon_max_size">256dp</dimen> - <dimen name="messaging_avatar_size">@dimen/notification_right_icon_size</dimen> + <dimen name="messaging_avatar_size">36dp</dimen> <dimen name="conversation_avatar_size">52dp</dimen> + <!-- start margin of the icon circle in the conversation's skin of the header --> + <dimen name="conversation_icon_circle_start">28dp</dimen> <!-- Start of the content in the conversation template --> <dimen name="conversation_content_start">80dp</dimen> <!-- Size of the expand button in the conversation layout --> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index ef019ba92769..439ae48ebc54 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -290,6 +290,9 @@ easier. <style name="TextAppearance.DeviceDefault.Notification.Title" parent="TextAppearance.Material.Notification.Title"> <item name="fontFamily">@string/config_headlineFontFamilyMedium</item> </style> + <style name="TextAppearance.DeviceDefault.Notification.BigTitle" parent="TextAppearance.Material.Notification.BigTitle"> + <item name="fontFamily">@string/config_headlineFontFamilyMedium</item> + </style> <style name="TextAppearance.DeviceDefault.Notification.Reply" parent="TextAppearance.Material.Notification.Reply"> <item name="fontFamily">@string/config_bodyFontFamily</item> </style> diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml index 67536fde9b0b..158289a39d5c 100644 --- a/core/res/res/values/styles_material.xml +++ b/core/res/res/values/styles_material.xml @@ -477,6 +477,11 @@ please see styles_device_defaults.xml. <item name="textSize">@dimen/notification_title_text_size</item> </style> + <style name="TextAppearance.Material.Notification.BigTitle"> + <item name="fontFamily">sans-serif-medium</item> + <item name="textSize">@dimen/notification_big_title_text_size</item> + </style> + <style name="TextAppearance.Material.Notification.Line2"> <item name="textSize">@dimen/notification_subtext_size</item> </style> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 966cb3790fdc..23733af4455e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -218,6 +218,7 @@ <java-symbol type="id" name="inbox_text6" /> <java-symbol type="id" name="status_bar_latest_event_content" /> <java-symbol type="id" name="notification_main_column" /> + <java-symbol type="id" name="notification_standard_view_column" /> <java-symbol type="id" name="sms_short_code_confirm_message" /> <java-symbol type="id" name="sms_short_code_detail_layout" /> <java-symbol type="id" name="sms_short_code_detail_message" /> @@ -2184,6 +2185,7 @@ <java-symbol type="layout" name="notification_material_action_list" /> <java-symbol type="layout" name="notification_material_action_tombstone" /> <java-symbol type="layout" name="notification_template_material_base" /> + <java-symbol type="layout" name="notification_template_material_heads_up_base" /> <java-symbol type="layout" name="notification_template_material_big_base" /> <java-symbol type="layout" name="notification_template_material_big_picture" /> <java-symbol type="layout" name="notification_template_material_inbox" /> @@ -2869,18 +2871,15 @@ <java-symbol type="drawable" name="ic_collapse_notification" /> <java-symbol type="drawable" name="ic_expand_bundle" /> <java-symbol type="drawable" name="ic_collapse_bundle" /> - <java-symbol type="dimen" name="notification_min_content_height" /> <java-symbol type="dimen" name="notification_header_shrink_min_width" /> <java-symbol type="dimen" name="notification_content_margin_start" /> <java-symbol type="dimen" name="notification_content_margin_end" /> - <java-symbol type="dimen" name="notification_reply_inset" /> + <java-symbol type="dimen" name="notification_heading_margin_end" /> <java-symbol type="dimen" name="notification_content_margin_top" /> <java-symbol type="dimen" name="notification_content_margin" /> <java-symbol type="dimen" name="notification_header_background_height" /> - <java-symbol type="dimen" name="notification_header_height" /> <java-symbol type="dimen" name="notification_header_expand_icon_size" /> <java-symbol type="dimen" name="notification_expand_button_padding_top" /> - <java-symbol type="dimen" name="notification_header_icon_margin_end" /> <java-symbol type="dimen" name="notification_header_icon_size" /> <java-symbol type="dimen" name="notification_header_app_name_margin_start" /> <java-symbol type="dimen" name="notification_header_separating_margin" /> @@ -3401,9 +3400,6 @@ <java-symbol type="bool" name="config_allowEscrowTokenForTrustAgent"/> <java-symbol type="string" name="config_defaultTrustAgent" /> - <!-- Time picker --> - <java-symbol type="id" name="right_icon_container"/> - <java-symbol type="id" name="reply_icon_action"/> <java-symbol type="id" name="toggle_mode"/> <java-symbol type="id" name="input_mode"/> <java-symbol type="id" name="input_header"/> @@ -3937,8 +3933,9 @@ <java-symbol type="dimen" name="importance_ring_anim_max_stroke_width" /> <java-symbol type="dimen" name="importance_ring_size" /> <java-symbol type="dimen" name="conversation_icon_size_badged" /> + <java-symbol type="dimen" name="conversation_icon_circle_start" /> + <java-symbol type="dimen" name="notification_icon_circle_start" /> - <java-symbol type="id" name="header_icon_container" /> <java-symbol type="attr" name="notificationHeaderTextAppearance" /> <java-symbol type="string" name="conversation_single_line_name_display" /> <java-symbol type="string" name="conversation_single_line_image_placeholder" /> @@ -3949,7 +3946,7 @@ <java-symbol type="id" name="conversation_icon_badge_ring" /> <java-symbol type="id" name="conversation_icon_badge_bg" /> <java-symbol type="id" name="expand_button_container" /> - <java-symbol type="id" name="expand_button_inner_container" /> + <java-symbol type="id" name="expand_button_touch_container" /> <java-symbol type="id" name="messaging_group_content_container" /> <java-symbol type="id" name="expand_button_and_content_container" /> <java-symbol type="id" name="conversation_header" /> diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 42e6ab9c830c..81aeec07db9e 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -550,8 +550,7 @@ public class Canvas extends BaseCanvas { @Saveflags int saveFlags) { checkValidSaveFlags(saveFlags); return nSaveLayer(mNativeCanvasWrapper, left, top, right, bottom, - paint != null ? paint.getNativeInstance() : 0, - ALL_SAVE_FLAG); + paint != null ? paint.getNativeInstance() : 0); } /** @@ -626,8 +625,7 @@ public class Canvas extends BaseCanvas { @Saveflags int saveFlags) { checkValidSaveFlags(saveFlags); alpha = Math.min(255, Math.max(0, alpha)); - return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom, - alpha, ALL_SAVE_FLAG); + return nSaveLayerAlpha(mNativeCanvasWrapper, left, top, right, bottom, alpha); } /** @@ -1420,10 +1418,10 @@ public class Canvas extends BaseCanvas { private static native int nSave(long canvasHandle, int saveFlags); @CriticalNative private static native int nSaveLayer(long nativeCanvas, float l, float t, float r, float b, - long nativePaint, int layerFlags); + long nativePaint); @CriticalNative private static native int nSaveLayerAlpha(long nativeCanvas, float l, float t, float r, float b, - int alpha, int layerFlags); + int alpha); @CriticalNative private static native int nSaveUnclippedLayer(long nativeCanvas, int l, int t, int r, int b); @CriticalNative diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 3e812551265c..6c7faded7dad 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"التخطي إلى التالي"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"التخطي إلى السابق"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"تغيير الحجم"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"يمكن ألا يعمل التطبيق مع وضع تقسيم الشاشة."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"التطبيق لا يتيح تقسيم الشاشة."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"قد لا يعمل التطبيق على شاشة عرض ثانوية."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"لا يمكن تشغيل التطبيق على شاشات عرض ثانوية."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ضبط حجم النافذة العلوية ليكون ٥٠%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ضبط حجم النافذة العلوية ليكون ٣٠%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"عرض النافذة السفلية بملء الشاشة"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"استخدام وضع \"التصفح بيد واحدة\""</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"للخروج، مرِّر سريعًا من أسفل الشاشة إلى أعلاها أو انقر في أي مكان فوق التطبيق."</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"تفعيل وضع \"التصفح بيد واحدة\""</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"الخروج من وضع \"التصفح بيد واحدة\""</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"إعدادات فقاعات المحادثات على <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"القائمة الكاملة"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"إضافة دعم إلى الحزم"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"تظهر المحادثات الجديدة كرموز عائمة أو كفقاعات. انقر لفتح فقاعة المحادثة، واسحبها لتحريكها."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"التحكّم في فقاعات المحادثات في أي وقت"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"انقر على \"إدارة\" لإيقاف فقاعات المحادثات من هذا التطبيق."</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"حسنًا"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ليس هناك فقاعات محادثات"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ستظهر هنا أحدث فقاعات المحادثات وفقاعات المحادثات التي تم إغلاقها."</string> <string name="notification_bubble_title" msgid="6082910224488253378">"فقاعة"</string> diff --git a/libs/WindowManager/Shell/res/values-ar/strings_tv.xml b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml index 61588a0101aa..4eef29e2ed12 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"نافذة ضمن النافذة"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ليس هناك عنوان للبرنامج)"</string> <string name="pip_close" msgid="9135220303720555525">"إغلاق PIP"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ملء الشاشة"</string> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 81cdc7fb699d..47294c438729 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"পৰৱৰ্তী মিডিয়ালৈ যাওক"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"আগৰটো মিডিয়ালৈ যাওক"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"আকাৰ সলনি কৰক"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"এপ্টোৱে বিভাজিত স্ক্ৰীনৰ সৈতে কাম নকৰিব পাৰে।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"এপটোৱে বিভাজিত স্ক্ৰীণ সমৰ্থন নকৰে।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"গৌণ ডিছপ্লেত এপে সঠিকভাৱে কাম নকৰিব পাৰে।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"গৌণ ডিছপ্লেত এপ্ লঞ্চ কৰিব নোৱাৰি।"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ স্ক্ৰীণখন ৫০% কৰক"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ স্ক্ৰীণখন ৩০% কৰক"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"তলৰ স্ক্ৰীণখন সম্পূৰ্ণ স্ক্ৰীণ কৰক"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"এখন হাতেৰে ব্যৱহাৰ কৰা ম’ড ব্যৱহাৰ কৰা"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"বাহিৰ হ’বলৈ স্ক্ৰীনখনৰ একেবাৰে তলৰ পৰা ওপৰলৈ ছোৱাইপ কৰক অথবা এপ্টোৰ ওপৰত যিকোনো ঠাইত টিপক"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"এখন হাতেৰে ব্যৱহাৰ কৰা ম\'ডটো আৰম্ভ কৰক"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"এখন হাতেৰে ব্যৱহাৰ কৰা ম\'ডটোৰ পৰা বাহিৰ হওক"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g>ৰ bubblesৰ ছেটিংসমূহ"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"অভাৰফ্ল’"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ষ্টেকত পুনৰ যোগ দিয়ক"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন বাৰ্তালাপ উপঙি থকা চিহ্নসমূহ অথবা bubbles হিচাপে প্ৰদর্শিত হয়। Bubbles খুলিবলৈ টিপক। এইটো স্থানান্তৰ কৰিবলৈ টানি নিয়ক।"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"যিকোনো সময়তে bubbles নিয়ন্ত্ৰণ কৰক"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"এই এপ্টোৰ পৰা bubbles অফ কৰিবলৈ পৰিচালনা কৰকত টিপক"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"বুজি পালোঁ"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"কোনো শেহতীয়া bubbles নাই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"শেহতীয়া bubbles আৰু অগ্ৰাহ্য কৰা bubbles ইয়াত প্ৰদর্শিত হ\'ব"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string> diff --git a/libs/WindowManager/Shell/res/values-as/strings_tv.xml b/libs/WindowManager/Shell/res/values-as/strings_tv.xml index c4e3f3833052..6c223f45d9b3 100644 --- a/libs/WindowManager/Shell/res/values-as/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-as/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"চিত্ৰৰ ভিতৰত চিত্ৰ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিৰোনামবিহীন কাৰ্যক্ৰম)"</string> <string name="pip_close" msgid="9135220303720555525">"পিপ বন্ধ কৰক"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"সম্পূৰ্ণ স্ক্ৰীণ"</string> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index e92f8c9464de..84bcaf907d91 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"এগিয়ে যাওয়ার জন্য এড়িয়ে যান"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"পিছনে যাওয়ার জন্য এড়িয়ে যান"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"রিসাইজ করুন"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"অ্যাপটি স্প্লিট স্ক্রিনে কাজ নাও করতে পারে।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"অ্যাপ্লিকেশান বিভক্ত-স্ক্রিন সমর্থন করে না৷"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"সেকেন্ডারি ডিসপ্লেতে অ্যাপটি কাজ নাও করতে পারে।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"সেকেন্ডারি ডিসপ্লেতে অ্যাপ লঞ্চ করা যাবে না।"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"শীর্ষ ৫০%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"শীর্ষ ৩০%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"নীচের অংশ নিয়ে পূর্ণ স্ক্রিন"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"\'এক হাতে ব্যবহার করার মোড\'-এর ব্যবহার"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"বেরিয়ে আসার জন্য, স্ক্রিনের নিচ থেকে উপরের দিকে সোয়াইপ করুন অথবা অ্যাপ আইকনের উপরে যেকোনও জায়গায় ট্যাপ করুন"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"\'এক হাতে ব্যবহার করার মোড\' শুরু করুন"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"\'এক হাতে ব্যবহার করার মোড\' থেকে বেরিয়ে আসুন"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> বাবলের জন্য সেটিংস"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ওভারফ্লো"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"স্ট্যাকে আবার যোগ করুন"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"নতুন কথোপকথন ভেসে থাকা আইকন বা বাবল হিসেবে দেখানো হয়। বাবল খুলতে ট্যাপ করুন। সেটি সরাতে ধরে টেনে আনুন।"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"যেকোনও সময় বাবল নিয়ন্ত্রণ করুন"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"এই অ্যাপ থেকে বাবল বন্ধ করতে \'ম্যানেজ করুন\' বিকল্প ট্যাপ করুন"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"বুঝেছি"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"কোনও সাম্প্রতিক বাবল নেই"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"সাম্প্রতিক ও বাতিল করা বাবল এখানে দেখা যাবে"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"বাবল"</string> diff --git a/libs/WindowManager/Shell/res/values-bn/strings_tv.xml b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml index 783cb9275d5b..0eb83a0276e6 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ছবির-মধ্যে-ছবি"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(শিরোনামহীন প্রোগ্রাম)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP বন্ধ করুন"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"পূর্ণ স্ক্রিন"</string> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index e509e5c24509..85e08d7ca555 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -28,7 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Preskoči na sljedeći"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Preskoči na prethodni"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Promjena veličine"</string> - <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće funkcionirati s podijeljenim zaslonom."</string> + <string name="dock_forced_resizable" msgid="1749750436092293116">"Aplikacija možda neće raditi na podijeljenom ekranu."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Aplikacija ne podržava dijeljenje ekrana."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Aplikacija možda neće raditi na sekundarnom ekranu."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Aplikacija ne podržava pokretanje na sekundarnim ekranima."</string> @@ -44,8 +44,8 @@ <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Gore 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Donji ekran kao cijeli ekran"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Korištenje načina rada jednom rukom"</string> - <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Za izlaz prijeđite prstom od dna zaslona prema gore ili dodirnite bio gdje iznad aplikacije"</string> - <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Pokretanje načina rada jednom rukom"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Da izađete, prevucite s dna ekrana prema gore ili dodirnite bilo gdje iznad aplikacije"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Započinjanje načina rada jednom rukom"</string> <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Izlaz iz načina rada jednom rukom"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Postavke za oblačiće aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Preklapanje"</string> @@ -63,7 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"Novi razgovori se prikazuju kao plutajuće ikone ili oblačići. Dodirnite da otvorite oblačić. Prevucite da ga premjestite."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Upravljajte oblačićima u svakom trenutku"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Dodirnite Upravljaj da isključite oblačiće iz ove aplikacije"</string> - <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Shvaćam"</string> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Razumijem"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"Oblačić"</string> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index 360542ee7969..65e75bde573d 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -43,10 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Superior 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Superior 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla inferior completa"</string> - <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utilizar modo una mano"</string> - <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para salir, desliza dos dedos hacia arriba desde la parte inferior de la pantalla o toca cualquier zona que haya encima de la aplicación"</string> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Utilizar el modo una mano"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para salir, desliza el dedo hacia arriba desde la parte inferior de la pantalla o toca cualquier zona que haya encima de la aplicación"</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar modo una mano"</string> - <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Abandonar modo una mano"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Salir del modo una mano"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Ajustes de las burbujas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Menú adicional"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Volver a añadir a la pila"</string> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 057881be0be3..529825e68151 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Ir ao seguinte"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Ir ao anterior"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Cambiar tamaño"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"Pode que a aplicación non funcione coa pantalla dividida."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"A aplicación non é compatible coa función de pantalla dividida."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"É posible que a aplicación non funcione nunha pantalla secundaria."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"A aplicación non se pode iniciar en pantallas secundarias."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50 % arriba"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30 % arriba"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pantalla completa abaixo"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Como se usa o modo dunha soa man?"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Para saír, pasa o dedo cara arriba desde a parte inferior da pantalla ou toca calquera lugar da zona situada encima da aplicación"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Iniciar modo dunha soa man"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Saír do modo dunha soa man"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"Configuración das burbullas de <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Mostrar menú adicional"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Engadir de novo á pilla"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"As conversas novas aparecen como iconas flotantes ou burbullas. Toca para abrir a burbulla e arrastra para movela."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Controla as burbullas"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Para desactivar as burbullas nesta aplicación, toca Xestionar"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Entendido"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Non hai burbullas recentes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"As burbullas recentes e ignoradas aparecerán aquí."</string> <string name="notification_bubble_title" msgid="6082910224488253378">"Burbulla"</string> diff --git a/libs/WindowManager/Shell/res/values-gl/strings_tv.xml b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml index a896d88ee8e5..df96f6cb794d 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Pantalla superposta"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Programa sen título)"</string> <string name="pip_close" msgid="9135220303720555525">"Pechar PIP"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Pantalla completa"</string> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index d9950aa651b2..ee23e1e967ec 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"આગલા પર જાઓ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"પહેલાંના પર જાઓ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"કદ બદલો"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"વિભાજિત-સ્ક્રીન સાથે ઍપ કદાચ કામ ન કરે."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ઍપ્લિકેશન સ્ક્રીન-વિભાજનનું સમર્થન કરતી નથી."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર કદાચ કામ ન કરે."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ઍપ્લિકેશન ગૌણ ડિસ્પ્લે પર લૉન્ચનું સમર્થન કરતી નથી."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"શીર્ષ 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"શીર્ષ 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"તળિયાની પૂર્ણ સ્ક્રીન"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"એક-હાથે વાપરો મોડનો ઉપયોગ કરી રહ્યાં છીએ"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"બહાર નીકળવા માટે, સ્ક્રીનની નીચેના ભાગથી ઉપરની તરફ સ્વાઇપ કરો અથવા ઍપના આઇકન પર ગમે ત્યાં ટૅપ કરો"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"એક-હાથે વાપરો મોડ શરૂ કરો"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"એક-હાથે વાપરો મોડમાંથી બહાર નીકળો"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> બબલ માટેનાં સેટિંગ"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ઓવરફ્લો"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"સ્ટૅકમાં ફરી ઉમેરો"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"નવી વાતચીત ફ્લોટિંગ આઇકન અથવા બબલ જેવી દેખાશે. બબલને ખોલવા માટે ટૅપ કરો. તેને ખસેડવા માટે ખેંચો."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"બબલને કોઈપણ સમયે નિયંત્રિત કરો"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"આ ઍપમાંથી બબલને બંધ કરવા માટે મેનેજ કરો પર ટૅપ કરો"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"સમજાઈ ગયું"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"તાજેતરના કોઈ બબલ નથી"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"એકદમ નવા બબલ અને છોડી દીધેલા બબલ અહીં દેખાશે"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"બબલ"</string> diff --git a/libs/WindowManager/Shell/res/values-gu/strings_tv.xml b/libs/WindowManager/Shell/res/values-gu/strings_tv.xml index a5c0c311a16b..3608f1d530c0 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ચિત્રમાં-ચિત્ર"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(કોઈ ટાઇટલ પ્રોગ્રામ નથી)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP બંધ કરો"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"પૂર્ણ સ્ક્રીન"</string> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 0cda01ecade4..2d27fafcc98b 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Келесіге өту"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Алдыңғысына оралу"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Өлшемін өзгерту"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"Қолданба экранды бөлу режимінде жұмыс істемеуі мүмкін."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Қодланба бөлінген экранды қолдамайды."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Қолданба қосымша дисплейде жұмыс істемеуі мүмкін."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Қолданба қосымша дисплейлерде іске қосуды қолдамайды."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% жоғарғы жақта"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% жоғарғы жақта"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Төменгісін толық экранға шығару"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Бір қолмен енгізу режимін пайдалану"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Шығу үшін экранның төменгі жағынан жоғары қарай сырғытыңыз немесе қолданбаның үстінен кез келген жерден түртіңіз."</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Бір қолмен енгізу режимін іске қосу"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Бір қолмен енгізу режимінен шығу"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> қалқыма хабарларының параметрлері"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"Қосымша мәзір"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"Стекке қайта енгізу"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"Жаңа әңгімелер қалқыма белгішелер немесе хабарлар түрінде көрсетіледі. Қалқыма хабарды ашу үшін түртіңіз. Жылжыту үшін сүйреңіз."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"Қалқыма хабарларды реттеу"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"Бұл қолданбадан қалқыма хабарларды өшіру үшін \"Басқару\" түймесін түртіңіз."</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"Түсінікті"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"Жақындағы қалқыма хабарлар жоқ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"Соңғы және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string> <string name="notification_bubble_title" msgid="6082910224488253378">"Көпіршік"</string> diff --git a/libs/WindowManager/Shell/res/values-kk/strings_tv.xml b/libs/WindowManager/Shell/res/values-kk/strings_tv.xml index 9b12cff76bfd..8f1e725e79e2 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Суреттегі сурет"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Атаусыз бағдарлама)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP жабу"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Толық экран"</string> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 456dc06b02cd..3d61d84f4810 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ಮುಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ಹಿಂದಕ್ಕೆ ಸ್ಕಿಪ್ ಮಾಡಿ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ಮರುಗಾತ್ರಗೊಳಿಸಿ"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"ವಿಭಜಿಸಿದ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"50% ಮೇಲಕ್ಕೆ"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"30% ಮೇಲಕ್ಕೆ"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ಕೆಳಗಿನ ಪೂರ್ಣ ಪರದೆ"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ಒಂದು ಕೈ ಮೋಡ್ ಬಳಸುವುದರ ಬಗ್ಗೆ"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ನಿರ್ಗಮಿಸಲು, ಸ್ಕ್ರೀನ್ನ ಕೆಳಗಿನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಅಥವಾ ಆ್ಯಪ್ನ ಮೇಲೆ ಎಲ್ಲಿಯಾದರೂ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ಒಂದು ಕೈ ಮೋಡ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ಒಂದು ಕೈ ಮೋಡ್ನಿಂದ ನಿರ್ಗಮಿಸಿ"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ಬಬಲ್ಸ್ಗಾಗಿ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ಓವರ್ಫ್ಲೋ"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ಸ್ಟ್ಯಾಕ್ಗೆ ಪುನಃ ಸೇರಿಸಿ"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"ಹೊಸ ಸಂಭಾಷಣೆಗಳು ತೇಲುವ ಐಕಾನ್ಗಳು ಅಥವಾ ಬಬಲ್ಸ್ ಆಗಿ ಗೋಚರಿಸುತ್ತವೆ. ಬಬಲ್ ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಅದನ್ನು ಡ್ರ್ಯಾಗ್ ಮಾಡಲು ಎಳೆಯಿರಿ."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬಬಲ್ಸ್ ಅನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ಈ ಆ್ಯಪ್ನಿಂದ ಬಬಲ್ಸ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿರ್ವಹಿಸಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ಅರ್ಥವಾಯಿತು"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಇಲ್ಲ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ಇತ್ತೀಚಿನ ಬಬಲ್ಸ್ ಮತ್ತು ವಜಾಗೊಳಿಸಿದ ಬಬಲ್ಸ್ ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"ಬಬಲ್"</string> diff --git a/libs/WindowManager/Shell/res/values-kn/strings_tv.xml b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml index 699824aa724f..9d3942fa4dd3 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ಚಿತ್ರದಲ್ಲಿ ಚಿತ್ರ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ಶೀರ್ಷಿಕೆ ರಹಿತ ಕಾರ್ಯಕ್ರಮ)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP ಮುಚ್ಚಿ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ಪೂರ್ಣ ಪರದೆ"</string> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index bd28756e49b8..e838cf59331e 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"डावलून पुढे जा"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"डावलून मागे जा"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"आकार बदला"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"अॅप कदाचित स्प्लिट स्क्रीनसह काम करू शकत नाही."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"अॅप स्क्रीन-विभाजनास समर्थन देत नाही."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"दुसऱ्या डिस्प्लेवर अॅप कदाचित चालणार नाही."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"दुसऱ्या डिस्प्लेवर अॅप लाँच होणार नाही."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"शीर्ष 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"शीर्ष 10"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"तळाशी फुल स्क्रीन"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"एकहाती मोड वापरणे"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"बाहेर पडण्यासाठी स्क्रीनच्या खालून वरच्या दिशेने स्वाइप करा किंवा ॲपवर कोठेही टॅप करा"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"एकहाती मोड सुरू करा"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"एकहाती मोडमधून बाहेर पडा"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> बबलसाठी सेटिंग्ज"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ओव्हरफ्लो"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"स्टॅकमध्ये परत जोडा"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"नवीन संभाषणे फ्लोटिंग आयकन किंवा बबल म्हणून दिसतात. बबल उघडण्यासाठी टॅप करा. हे हलवण्यासाठी ड्रॅग करा."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"बबल कधीही नियंत्रित करा"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"या अॅपमधून बबल बंद करण्यासाठी व्यवस्थापित करा वर टॅप करा"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"समजले"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"अलीकडील कोणतेही बबल नाहीत"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"बबल"</string> diff --git a/libs/WindowManager/Shell/res/values-mr/strings_tv.xml b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml index d9fc3b1793c2..ad2cfc6035c2 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"चित्रात-चित्र"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(शीर्षक नसलेला कार्यक्रम)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP बंद करा"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"फुल स्क्रीन"</string> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index b913a6b503ff..9681d14a6a88 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"နောက်တစ်ခုသို့ ကျော်ရန်"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ယခင်တစ်ခုသို့ ပြန်သွားရန်"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"အရွယ်အစားပြောင်းရန်"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းဖြင့် အက်ပ်သည် အလုပ်မလုပ်ပါ။"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"အက်ပ်သည် မျက်နှာပြင်ခွဲပြရန် ပံ့ပိုးထားခြင်းမရှိပါ။"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ဤအက်ပ်အနေဖြင့် ဒုတိယဖန်သားပြင်ပေါ်တွင် အလုပ်လုပ်မည် မဟုတ်ပါ။"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ဤအက်ပ်အနေဖြင့် ဖွင့်ရန်စနစ်ကို ဒုတိယဖန်သားပြင်မှ အသုံးပြုရန် ပံ့ပိုးမထားပါ။"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"အပေါ်ဘက် မျက်နှာပြင် ၅၀%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"အပေါ်ဘက် မျက်နှာပြင် ၃၀%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"အောက်ခြေ မျက်နှာပြင်အပြည့်"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"လက်တစ်ဖက်သုံးမုဒ် အသုံးပြုခြင်း"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ထွက်ရန် ဖန်သားပြင်၏အောက်ခြေမှ အပေါ်သို့ပွတ်ဆွဲပါ သို့မဟုတ် အက်ပ်အပေါ်ဘက် မည်သည့်နေရာတွင်မဆို တို့ပါ"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"လက်တစ်ဖက်သုံးမုဒ်ကို စတင်လိုက်သည်"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"လက်တစ်ဖက်သုံးမုဒ်မှ ထွက်လိုက်သည်"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပူဖောင်းကွက်အတွက် ဆက်တင်များ"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"အပိုများပြရန်"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ပူဖေါင်းတန်းသို့ ပြန်ထည့်ရန်"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"စကားဝိုင်းအသစ်များကို မျောနေသည့် သင်္ကေတများ သို့မဟုတ် ပူဖောင်းကွက်များအဖြစ် မြင်ရပါမည်။ ပူဖောင်းကွက်ကိုဖွင့်ရန် တို့ပါ။ ရွှေ့ရန် ၎င်းကို ဖိဆွဲပါ။"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ပူဖောင်းကွက်ကို အချိန်မရွေး ထိန်းချုပ်ရန်"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ဤအက်ပ်မှနေ၍ ပူဖောင်းများကို ပိတ်ရန်အတွက် \'စီမံရန်\' ကို တို့ပါ"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ရပြီ"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"လတ်တလော ပူဖောင်းကွက်များ မရှိပါ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"လတ်တလော ပူဖောင်းကွက်များနှင့် ပိတ်လိုက်သော ပူဖောင်းကွက်များကို ဤနေရာတွင် မြင်ရပါမည်"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"ပူဖောင်းဖောက်သံ"</string> diff --git a/libs/WindowManager/Shell/res/values-my/strings_tv.xml b/libs/WindowManager/Shell/res/values-my/strings_tv.xml index 6d4d6f04b8f4..9569dc4cbeea 100644 --- a/libs/WindowManager/Shell/res/values-my/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-my/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"တစ်ခုပေါ်တစ်ခုထပ်၍ ဖွင့်ခြင်း"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ခေါင်းစဉ်မဲ့ အစီအစဉ်)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP ကိုပိတ်ပါ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"မျက်နှာပြင် အပြည့်"</string> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 2b27c9900130..27f16226a421 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ପରବର୍ତ୍ତୀକୁ ଯାଆନ୍ତୁ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ପୂର୍ବବର୍ତ୍ତୀକୁ ଛାଡ଼ନ୍ତୁ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ରିସାଇଜ୍ କରନ୍ତୁ"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରିନରେ ଆପ୍ କାମ କରିନପାରେ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ଆପ୍ ସ୍ପ୍ଲିଟ୍-ସ୍କ୍ରୀନକୁ ସପୋର୍ଟ କରେ ନାହିଁ।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ କାମ ନକରିପାରେ।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ସେକେଣ୍ଡାରୀ ଡିସପ୍ଲେରେ ଆପ୍ ଲଞ୍ଚ ସପୋର୍ଟ କରେ ନାହିଁ।"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ଉପର ଆଡ଼କୁ 50% କରନ୍ତୁ"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ଉପର ଆଡ଼କୁ 30% କରନ୍ତୁ"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ତଳ ଅଂଶର ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ଏକ-ହାତ ମୋଡ୍ ବ୍ୟବହାର କରି"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ବାହାରି ଯିବା ପାଇଁ, ସ୍କ୍ରିନର ତଳୁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ କିମ୍ବା ଆପରେ ଯେ କୌଣସି ସ୍ଥାନରେ ଟାପ୍ କରନ୍ତୁ"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ଏକ-ହାତ ମୋଡ୍ ଆରମ୍ଭ କରନ୍ତୁ"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ଏକ-ହାତ ମୋଡରୁ ବାହାରି ଯାଆନ୍ତୁ"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବବଲ୍ଗୁଡ଼ିକ ପାଇଁ ସେଟିଂସ୍"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ଓଭରଫ୍ଲୋ"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ଷ୍ଟାକରେ ପୁଣି ଯୋଗ କରନ୍ତୁ"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"ନୂଆ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଫ୍ଲୋଟିଂ ଆଇକନ୍ କିମ୍ବା ବବଲ୍ ଭାବେ ଦେଖାଯିବ। ବବଲ୍ ଖୋଲିବାକୁ ଟାପ୍ କରନ୍ତୁ। ଏହାକୁ ମୁଭ୍ କରିବାକୁ ଟାଣନ୍ତୁ।"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ଯେ କୌଣସି ସମୟରେ ବବଲଗୁଡ଼ିକ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ଏହି ଆପର ବବଲଗୁଡ଼ିକ ବନ୍ଦ କରିବା ପାଇଁ \'ପରିଚାଳନା କରନ୍ତୁ\' ବଟନରେ ଟାପ୍ କରନ୍ତୁ"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ବୁଝିଗଲି"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ବର୍ତ୍ତମାନ କୌଣସି ବବଲ୍ ନାହିଁ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ବର୍ତ୍ତମାନର ଏବଂ ଖାରଜ କରାଯାଇଥିବା ବବଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"ବବଲ୍"</string> diff --git a/libs/WindowManager/Shell/res/values-or/strings_tv.xml b/libs/WindowManager/Shell/res/values-or/strings_tv.xml index b57dd934fc7d..295a5c4ee1ce 100644 --- a/libs/WindowManager/Shell/res/values-or/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-or/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ପିକଚର୍-ଇନ୍-ପିକଚର୍"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(କୌଣସି ଟାଇଟଲ୍ ପ୍ରୋଗ୍ରାମ୍ ନାହିଁ)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP ବନ୍ଦ କରନ୍ତୁ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ପୂର୍ଣ୍ଣ ସ୍କ୍ରୀନ୍"</string> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index b9cb65edc1aa..96688b952d66 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ਅਗਲੇ \'ਤੇ ਜਾਓ"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ਪਿਛਲੇ \'ਤੇ ਜਾਓ"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ਆਕਾਰ ਬਦਲੋ"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨਾਲ ਕੰਮ ਨਾ ਕਰੇ।"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"ਐਪ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਨੂੰ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ।"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇ \'ਤੇ ਕੰਮ ਨਾ ਕਰੇ।"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ਐਪ ਸੈਕੰਡਰੀ ਡਿਸਪਲੇਆਂ \'ਤੇ ਲਾਂਚ ਕਰਨ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੀ"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ਉੱਪਰ 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ਉੱਪਰ 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"ਹੇਠਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"ਇੱਕ ਹੱਥ ਮੋਡ ਵਰਤਣਾ"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"ਬਾਹਰ ਜਾਣ ਲਈ, ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਾਂ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ ਜਾਂ ਐਪ \'ਤੇ ਕਿਤੇ ਵੀ ਟੈਪ ਕਰੋ"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"ਇੱਕ ਹੱਥ ਮੋਡ ਸ਼ੁਰੂ ਕਰੋ"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ਇੱਕ ਹੱਥ ਮੋਡ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਬਬਲ ਲਈ ਸੈਟਿੰਗਾਂ"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ਓਵਰਫ਼ਲੋ"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"ਸਟੈਕ ਵਿੱਚ ਵਾਪਸ ਸ਼ਾਮਲ ਕਰੋ"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"ਨਵੀਆਂ ਗੱਲਾਂਬਾਤਾਂ ਫਲੋਟਿੰਗ ਪ੍ਰਤੀਕਾਂ ਜਾਂ ਬਬਲ ਦੇ ਰੂਪ ਵਿੱਚ ਦਿਸਦੀਆਂ ਹਨ। ਬਬਲ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ। ਇਸਨੂੰ ਲਿਜਾਣ ਲਈ ਘਸੀਟੋ।"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ਬਬਲ ਨੂੰ ਕਿਸੇ ਵੇਲੇ ਵੀ ਕੰਟਰੋਲ ਕਰੋ"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ਇਸ ਐਪ \'ਤੇ ਬਬਲ ਬੰਦ ਕਰਨ ਲਈ \'ਪ੍ਰਬੰਧਨ ਕਰੋ\' \'ਤੇ ਟੈਪ ਕਰੋ"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"ਸਮਝ ਲਿਆ"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ਕੋਈ ਹਾਲੀਆ ਬਬਲ ਨਹੀਂ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ਹਾਲੀਆ ਬਬਲ ਅਤੇ ਖਾਰਜ ਕੀਤੇ ਬਬਲ ਇੱਥੇ ਦਿਸਣਗੇ"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"ਬੁਲਬੁਲਾ"</string> diff --git a/libs/WindowManager/Shell/res/values-pa/strings_tv.xml b/libs/WindowManager/Shell/res/values-pa/strings_tv.xml index 028a0a0b4708..e32895a9a239 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"ਤਸਵੀਰ-ਵਿੱਚ-ਤਸਵੀਰ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ਸਿਰਲੇਖ-ਰਹਿਤ ਪ੍ਰੋਗਰਾਮ)"</string> <string name="pip_close" msgid="9135220303720555525">"PIP ਬੰਦ ਕਰੋ"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"ਪੂਰੀ ਸਕ੍ਰੀਨ"</string> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 0d166d87f5c4..4e85b4371220 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"దాటవేసి తర్వాత దానికి వెళ్లు"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"దాటవేసి మునుపటి దానికి వెళ్లు"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"పరిమాణం మార్చు"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"స్క్రీన్ విభజనతో యాప్ పని చేయకపోవచ్చు."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"అనువర్తనంలో స్క్రీన్ విభజనకు మద్దతు లేదు."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ప్రత్యామ్నాయ డిస్ప్లేలో యాప్ పని చేయకపోవచ్చు."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ప్రత్యామ్నాయ డిస్ప్లేల్లో ప్రారంభానికి యాప్ మద్దతు లేదు."</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ఎగువ 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ఎగువ 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"దిగువ పూర్తి స్క్రీన్"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"వన్-హ్యాండెడ్ మోడ్ను ఉపయోగించడం"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"నిష్క్రమించడానికి, స్క్రీన్ కింది భాగం నుండి పైకి స్వైప్ చేయండి లేదా యాప్ పైన ఎక్కడైనా ట్యాప్ చేయండి"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"వన్-హ్యాండెడ్ మోడ్ను ప్రారంభిస్తుంది"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"వన్-హ్యాండెడ్ మోడ్ నుండి నిష్క్రమింపజేస్తుంది"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"<xliff:g id="APP_NAME">%1$s</xliff:g> బబుల్స్ సెట్టింగ్లు"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"ఓవర్ఫ్లో"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"స్ట్యాక్కు తిరిగి జోడించండి"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"కొత్త సంభాషణలు తేలియాడే చిహ్నాలుగా లేదా బబుల్స్ లాగా కనిపిస్తాయి. బబుల్ని తెరవడానికి నొక్కండి. తరలించడానికి లాగండి."</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"బబుల్స్ను ఎప్పుడైనా నియంత్రించండి"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"ఈ యాప్ నుండి వచ్చే బబుల్స్ను ఆఫ్ చేయడానికి మేనేజ్ బటన్ను ట్యాప్ చేయండి"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"అర్థమైంది"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ఇటీవలి బబుల్స్ ఏవీ లేవు"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"ఇటీవలి బబుల్స్ మరియు తీసివేసిన బబుల్స్ ఇక్కడ కనిపిస్తాయి"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"బబుల్"</string> diff --git a/libs/WindowManager/Shell/res/values-te/strings_tv.xml b/libs/WindowManager/Shell/res/values-te/strings_tv.xml index f3019945010c..47489efbc4c2 100644 --- a/libs/WindowManager/Shell/res/values-te/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-te/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"పిక్చర్-ఇన్-పిక్చర్"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(శీర్షిక లేని ప్రోగ్రామ్)"</string> <string name="pip_close" msgid="9135220303720555525">"PIPని మూసివేయి"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"పూర్తి స్క్రీన్"</string> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 442c3ca58af0..66c701812ce8 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -28,8 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"ข้ามไปรายการถัดไป"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"ข้ามไปรายการก่อนหน้า"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"ปรับขนาด"</string> - <!-- no translation found for dock_forced_resizable (1749750436092293116) --> - <skip /> + <string name="dock_forced_resizable" msgid="1749750436092293116">"แอปอาจใช้ไม่ได้กับโหมดแบ่งหน้าจอ"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"แอปไม่สนับสนุนการแยกหน้าจอ"</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"แอปอาจไม่ทำงานในจอแสดงผลรอง"</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"แอปไม่รองรับการเรียกใช้ในจอแสดงผลรอง"</string> @@ -44,14 +43,10 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"ด้านบน 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"ด้านบน 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"เต็มหน้าจอด้านล่าง"</string> - <!-- no translation found for one_handed_tutorial_title (4583241688067426350) --> - <skip /> - <!-- no translation found for one_handed_tutorial_description (3486582858591353067) --> - <skip /> - <!-- no translation found for accessibility_action_start_one_handed (5070337354072861426) --> - <skip /> - <!-- no translation found for accessibility_action_stop_one_handed (1369940261782179442) --> - <skip /> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"การใช้โหมดมือเดียว"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"หากต้องการออก ให้เลื่อนขึ้นจากด้านล่างของหน้าจอหรือแตะที่ใดก็ได้เหนือแอป"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"เริ่มโหมดมือเดียว"</string> + <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"ออกจากโหมดมือเดียว"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"การตั้งค่าบับเบิล <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"รายการเพิ่มเติม"</string> <string name="bubble_accessibility_action_add_back" msgid="1830101076853540953">"เพิ่มกลับไปที่สแต็ก"</string> @@ -68,8 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"การสนทนาใหม่ๆ จะปรากฏเป็นไอคอนแบบลอยหรือบับเบิล แตะเพื่อเปิดบับเบิล ลากเพื่อย้ายที่"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"ควบคุมบับเบิลได้ทุกเมื่อ"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"แตะ \"จัดการ\" เพื่อปิดบับเบิลจากแอปนี้"</string> - <!-- no translation found for bubbles_user_education_got_it (3382046149225428296) --> - <skip /> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"รับทราบ"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"ไม่มีบับเบิลเมื่อเร็วๆ นี้"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"บับเบิลที่แสดงและที่ปิดไปเมื่อเร็วๆ นี้จะปรากฏที่นี่"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"บับเบิล"</string> diff --git a/libs/WindowManager/Shell/res/values-th/strings_tv.xml b/libs/WindowManager/Shell/res/values-th/strings_tv.xml index cd1b6120d541..d3797e7c3cde 100644 --- a/libs/WindowManager/Shell/res/values-th/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-th/strings_tv.xml @@ -17,8 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- no translation found for notification_channel_tv_pip (2576686079160402435) --> - <skip /> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"การแสดงภาพซ้อนภาพ"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(ไม่มีชื่อรายการ)"</string> <string name="pip_close" msgid="9135220303720555525">"ปิด PIP"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"เต็มหน้าจอ"</string> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 24052c316288..795eff8d2e07 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -28,7 +28,7 @@ <string name="pip_skip_to_next" msgid="8403429188794867653">"Keyingisiga o‘tish"</string> <string name="pip_skip_to_prev" msgid="7172158111196394092">"Avvalgisiga qaytish"</string> <string name="accessibility_action_pip_resize" msgid="4623966104749543182">"Oʻlchamini oʻzgartirish"</string> - <string name="dock_forced_resizable" msgid="1749750436092293116">"Ilova ekranni ikkiga bo‘lish rejimini qo‘llab-quvvatlamaydi."</string> + <string name="dock_forced_resizable" msgid="1749750436092293116">"Bu ilova ekranni ikkiga ajratish rejimini dastaklamaydi."</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="7408396418008948957">"Bu ilova ekranni bo‘lish xususiyatini qo‘llab-quvvatlamaydi."</string> <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"Bu ilova qo‘shimcha ekranda ishlamasligi mumkin."</string> <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"Bu ilova qo‘shimcha ekranlarda ishga tushmaydi."</string> @@ -43,7 +43,7 @@ <string name="accessibility_action_divider_top_50" msgid="8649582798829048946">"Tepada 50%"</string> <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"Tepada 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"Pastda to‘liq ekran"</string> - <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ixcham rejimdan foydalaning"</string> + <string name="one_handed_tutorial_title" msgid="4583241688067426350">"Ixcham rejimdan foydalanish"</string> <string name="one_handed_tutorial_description" msgid="3486582858591353067">"Chiqish uchun ekran pastidan tepaga suring yoki ilovaning tepasidagi istalgan joyga bosing."</string> <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"Ixcham rejimni ishga tushirish"</string> <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"Ixcham rejimdan chiqish"</string> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index b62d2182caed..4f8bfe016f6f 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -44,8 +44,8 @@ <string name="accessibility_action_divider_top_30" msgid="3572788224908570257">"頂部 30%"</string> <string name="accessibility_action_divider_bottom_full" msgid="2831868345092314060">"底部全螢幕"</string> <string name="one_handed_tutorial_title" msgid="4583241688067426350">"使用單手模式"</string> - <string name="one_handed_tutorial_description" msgid="3486582858591353067">"如要退出,請從螢幕底部向上滑動,或輕觸應用程式上的任何位置"</string> - <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"啟動單手模式"</string> + <string name="one_handed_tutorial_description" msgid="3486582858591353067">"如要退出,請從螢幕底部向上滑動,或輕按應用程式上方的任何位置"</string> + <string name="accessibility_action_start_one_handed" msgid="5070337354072861426">"開始單手模式"</string> <string name="accessibility_action_stop_one_handed" msgid="1369940261782179442">"結束單手模式"</string> <string name="bubbles_settings_button_description" msgid="1301286017420516912">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」小視窗設定"</string> <string name="bubble_overflow_button_content_description" msgid="8160974472718594382">"顯示更多"</string> @@ -63,7 +63,7 @@ <string name="bubbles_user_education_description" msgid="4215862563054175407">"新對話會以浮動圖示 (小視窗) 顯示。輕按即可開啟小視窗。拖曳即可移動小視窗。"</string> <string name="bubbles_user_education_manage_title" msgid="7042699946735628035">"隨時控制小視窗設定"</string> <string name="bubbles_user_education_manage" msgid="3460756219946517198">"輕按「管理」即可關閉此應用程式的小視窗"</string> - <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"我知道了"</string> + <string name="bubbles_user_education_got_it" msgid="3382046149225428296">"知道了"</string> <string name="bubble_overflow_empty_title" msgid="2397251267073294968">"沒有最近曾使用的小視窗"</string> <string name="bubble_overflow_empty_subtitle" msgid="2627417924958633713">"最近使用和關閉的小視窗會在這裡顯示"</string> <string name="notification_bubble_title" msgid="6082910224488253378">"氣泡"</string> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml index a9ca855d0342..956243ed6e6d 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings_tv.xml @@ -17,7 +17,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="2576686079160402435">"子母畫面"</string> + <string name="notification_channel_tv_pip" msgid="2576686079160402435">"畫中畫"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(沒有標題的節目)"</string> <string name="pip_close" msgid="9135220303720555525">"關閉 PIP"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"全螢幕"</string> diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt index 680c7fab0e9b..871732cf7460 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/tv/TvPipMenuTests.kt @@ -16,6 +16,7 @@ package com.android.wm.shell.flicker.pip.tv +import android.graphics.Rect import androidx.test.filters.RequiresDevice import androidx.test.uiautomator.UiObject2 import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME @@ -33,6 +34,10 @@ class TvPipMenuTests : TvPipTestBase() { private val systemUiResources = packageManager.getResourcesForApplication(SYSTEM_UI_PACKAGE_NAME) + private val pipBoundsWhileInMenu: Rect = systemUiResources.run { + val bounds = getString(getIdentifier("pip_menu_bounds", "string", SYSTEM_UI_PACKAGE_NAME)) + Rect.unflattenFromString(bounds) ?: error("Could not retrieve PiP menu bounds") + } private val playButtonDescription = systemUiResources.run { getString(getIdentifier("pip_play", "string", SYSTEM_UI_PACKAGE_NAME)) } @@ -48,12 +53,18 @@ class TvPipMenuTests : TvPipTestBase() { } @Test - fun pipMenu_open() { + fun pipMenu_correctPosition() { val pipMenu = enterPip_openMenu_assertShown() // Make sure it's fullscreen assertTrue("Pip menu should be shown fullscreen", pipMenu.isFullscreen(uiDevice)) + // Make sure the PiP task is positioned where it should be. + val activityBounds: Rect = testApp.ui?.visibleBounds + ?: error("Could not retrieve PiP Activity bounds") + assertTrue("Pip Activity is positioned correctly while Pip menu is shown", + pipBoundsWhileInMenu == activityBounds) + testApp.closePipWindow() } diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index 1dbce58fb7c9..9a4ed8166de6 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -160,32 +160,20 @@ void SkiaCanvas::restoreToCount(int restoreCount) { } } -static inline SkCanvas::SaveLayerFlags layerFlags(SaveFlags::Flags flags) { - SkCanvas::SaveLayerFlags layerFlags = 0; - - if (!(flags & SaveFlags::ClipToLayer)) { - layerFlags |= SkCanvasPriv::kDontClipToLayer_SaveLayerFlag; - } - - return layerFlags; -} - -int SkiaCanvas::saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, - SaveFlags::Flags flags) { +int SkiaCanvas::saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) { const SkRect bounds = SkRect::MakeLTRB(left, top, right, bottom); - const SkCanvas::SaveLayerRec rec(&bounds, paint, layerFlags(flags)); + const SkCanvas::SaveLayerRec rec(&bounds, paint); return mCanvas->saveLayer(rec); } -int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, int alpha, - SaveFlags::Flags flags) { +int SkiaCanvas::saveLayerAlpha(float left, float top, float right, float bottom, int alpha) { if (static_cast<unsigned>(alpha) < 0xFF) { SkPaint alphaPaint; alphaPaint.setAlpha(alpha); - return this->saveLayer(left, top, right, bottom, &alphaPaint, flags); + return this->saveLayer(left, top, right, bottom, &alphaPaint); } - return this->saveLayer(left, top, right, bottom, nullptr, flags); + return this->saveLayer(left, top, right, bottom, nullptr); } int SkiaCanvas::saveUnclippedLayer(int left, int top, int right, int bottom) { diff --git a/libs/hwui/SkiaCanvas.h b/libs/hwui/SkiaCanvas.h index 2cb850c83934..591ae5c44227 100644 --- a/libs/hwui/SkiaCanvas.h +++ b/libs/hwui/SkiaCanvas.h @@ -73,10 +73,8 @@ public: virtual void restoreToCount(int saveCount) override; virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) override; - virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, - SaveFlags::Flags flags) override; - virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, - SaveFlags::Flags flags) override; + virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) override; + virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) override; virtual int saveUnclippedLayer(int left, int top, int right, int bottom) override; virtual void getMatrix(SkMatrix* outMatrix) const override; diff --git a/libs/hwui/hwui/Canvas.h b/libs/hwui/hwui/Canvas.h index 772b7a28ef04..f94bae2746d9 100644 --- a/libs/hwui/hwui/Canvas.h +++ b/libs/hwui/hwui/Canvas.h @@ -178,10 +178,8 @@ public: virtual void restoreToCount(int saveCount) = 0; virtual void restoreUnclippedLayer(int saveCount, const SkPaint& paint) = 0; - virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint, - SaveFlags::Flags flags) = 0; - virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha, - SaveFlags::Flags flags) = 0; + virtual int saveLayer(float left, float top, float right, float bottom, const SkPaint* paint) = 0; + virtual int saveLayerAlpha(float left, float top, float right, float bottom, int alpha) = 0; virtual int saveUnclippedLayer(int, int, int, int) = 0; // Matrix diff --git a/libs/hwui/jni/android_graphics_Canvas.cpp b/libs/hwui/jni/android_graphics_Canvas.cpp index c04340c36511..89fb8bb2a2a0 100644 --- a/libs/hwui/jni/android_graphics_Canvas.cpp +++ b/libs/hwui/jni/android_graphics_Canvas.cpp @@ -93,16 +93,14 @@ static jint save(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jint flagsHandle) } static jint saveLayer(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jfloat l, jfloat t, - jfloat r, jfloat b, jlong paintHandle, jint flagsHandle) { + jfloat r, jfloat b, jlong paintHandle) { Paint* paint = reinterpret_cast<Paint*>(paintHandle); - SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle); - return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint, flags)); + return static_cast<jint>(get_canvas(canvasHandle)->saveLayer(l, t, r, b, paint)); } static jint saveLayerAlpha(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jfloat l, jfloat t, - jfloat r, jfloat b, jint alpha, jint flagsHandle) { - SaveFlags::Flags flags = static_cast<SaveFlags::Flags>(flagsHandle); - return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags)); + jfloat r, jfloat b, jint alpha) { + return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha)); } static jint saveUnclippedLayer(CRITICAL_JNI_PARAMS_COMMA jlong canvasHandle, jint l, jint t, jint r, jint b) { @@ -688,8 +686,8 @@ static const JNINativeMethod gMethods[] = { {"nGetWidth","(J)I", (void*) CanvasJNI::getWidth}, {"nGetHeight","(J)I", (void*) CanvasJNI::getHeight}, {"nSave","(JI)I", (void*) CanvasJNI::save}, - {"nSaveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer}, - {"nSaveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha}, + {"nSaveLayer","(JFFFFJ)I", (void*) CanvasJNI::saveLayer}, + {"nSaveLayerAlpha","(JFFFFI)I", (void*) CanvasJNI::saveLayerAlpha}, {"nSaveUnclippedLayer","(JIIII)I", (void*) CanvasJNI::saveUnclippedLayer}, {"nRestoreUnclippedLayer","(JIJ)V", (void*) CanvasJNI::restoreUnclippedLayer}, {"nGetSaveCount","(J)I", (void*) CanvasJNI::getSaveCount}, diff --git a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp index a9449b62a1f8..5eaf1853233a 100644 --- a/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp +++ b/libs/hwui/tests/common/scenes/ListOfFadedTextAnimation.cpp @@ -32,7 +32,7 @@ class ListOfFadedTextAnimation : public TestListViewSceneBase { int itemHeight) override { canvas.drawColor(Color::White, SkBlendMode::kSrcOver); int length = dp(100); - canvas.saveLayer(0, 0, length, itemHeight, nullptr, SaveFlags::HasAlphaLayer); + canvas.saveLayer(0, 0, length, itemHeight, nullptr); Paint textPaint; textPaint.getSkFont().setSize(dp(20)); textPaint.setAntiAlias(true); diff --git a/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp b/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp index 8630be87c09c..252f539ffca9 100644 --- a/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayer2Animation.cpp @@ -47,8 +47,7 @@ public: // interleave drawText and drawRect with saveLayer ops for (int i = 0; i < regions; i++, top += smallRectHeight) { - canvas.saveLayer(bounds.fLeft, top, bounds.fRight, top + padding, &mBluePaint, - SaveFlags::ClipToLayer | SaveFlags::MatrixClip); + canvas.saveLayer(bounds.fLeft, top, bounds.fRight, top + padding, &mBluePaint); canvas.drawColor(SkColorSetARGB(255, 255, 255, 0), SkBlendMode::kSrcOver); std::string stri = std::to_string(i); std::string offscreen = "offscreen line " + stri; diff --git a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp index 97bfba34c790..10ba07905c45 100644 --- a/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp +++ b/libs/hwui/tests/common/scenes/SaveLayerAnimation.cpp @@ -33,10 +33,10 @@ public: card = TestUtils::createNode(0, 0, 400, 800, [](RenderProperties& props, Canvas& canvas) { // nested clipped saveLayers - canvas.saveLayerAlpha(0, 0, 400, 400, 200, SaveFlags::ClipToLayer); + canvas.saveLayerAlpha(0, 0, 400, 400, 200); canvas.drawColor(Color::Green_700, SkBlendMode::kSrcOver); canvas.clipRect(50, 50, 350, 350, SkClipOp::kIntersect); - canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::ClipToLayer); + canvas.saveLayerAlpha(100, 100, 300, 300, 128); canvas.drawColor(Color::Blue_500, SkBlendMode::kSrcOver); canvas.restore(); canvas.restore(); @@ -44,12 +44,14 @@ public: // single unclipped saveLayer canvas.save(SaveFlags::MatrixClip); canvas.translate(0, 400); - canvas.saveLayerAlpha(100, 100, 300, 300, 128, SaveFlags::Flags(0)); // unclipped + int unclippedSaveLayer = canvas.saveUnclippedLayer(100, 100, 300, 300); Paint paint; paint.setAntiAlias(true); paint.setColor(Color::Green_700); canvas.drawCircle(200, 200, 200, paint); - canvas.restore(); + SkPaint alphaPaint; + alphaPaint.setAlpha(128); + canvas.restoreUnclippedLayer(unclippedSaveLayer, alphaPaint); canvas.restore(); }); diff --git a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp index 7aa6be8722cf..abdf9d587189 100644 --- a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp +++ b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp @@ -198,7 +198,7 @@ TEST(RenderNodeDrawable, saveLayerClipAndMatrixRestore) { EXPECT_TRUE(getRecorderMatrix(recorder).isIdentity()); // note we don't pass SaveFlags::MatrixClip, but matrix and clip will be saved - recorder.saveLayer(0, 0, 400, 400, &layerPaint, SaveFlags::ClipToLayer); + recorder.saveLayer(0, 0, 400, 400, &layerPaint); ASSERT_EQ(SkRect::MakeLTRB(0, 0, 400, 400), getRecorderClipBounds(recorder)); EXPECT_TRUE(getRecorderMatrix(recorder).isIdentity()); diff --git a/native/android/libandroid.map.txt b/native/android/libandroid.map.txt index 3027eac3a224..d134b37c6b70 100644 --- a/native/android/libandroid.map.txt +++ b/native/android/libandroid.map.txt @@ -247,6 +247,7 @@ LIBANDROID { ASurfaceTransaction_setDamageRegion; # introduced=29 ASurfaceTransaction_setDesiredPresentTime; # introduced=29 ASurfaceTransaction_setFrameRate; # introduced=30 + ASurfaceTransaction_setFrameRateWithSeamlessness; # introduced=31 ASurfaceTransaction_setGeometry; # introduced=29 ASurfaceTransaction_setHdrMetadata_cta861_3; # introduced=29 ASurfaceTransaction_setHdrMetadata_smpte2086; # introduced=29 diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index c503721319fb..189be800e018 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -560,9 +560,18 @@ void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction, void ASurfaceTransaction_setFrameRate(ASurfaceTransaction* aSurfaceTransaction, ASurfaceControl* aSurfaceControl, float frameRate, int8_t compatibility) { + ASurfaceTransaction_setFrameRateWithSeamlessness(aSurfaceTransaction, aSurfaceControl, + frameRate, compatibility, + /*shouldBeSeamless*/ true); +} + +void ASurfaceTransaction_setFrameRateWithSeamlessness(ASurfaceTransaction* aSurfaceTransaction, + ASurfaceControl* aSurfaceControl, + float frameRate, int8_t compatibility, + bool shouldBeSeamless) { CHECK_NOT_NULL(aSurfaceTransaction); CHECK_NOT_NULL(aSurfaceControl); Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); - transaction->setFrameRate(surfaceControl, frameRate, compatibility); + transaction->setFrameRate(surfaceControl, frameRate, compatibility, shouldBeSeamless); } diff --git a/packages/PackageInstaller/res/values-mk/strings.xml b/packages/PackageInstaller/res/values-mk/strings.xml index c6256747c4c5..000e5d88553a 100644 --- a/packages/PackageInstaller/res/values-mk/strings.xml +++ b/packages/PackageInstaller/res/values-mk/strings.xml @@ -33,9 +33,9 @@ <string name="install_failed_incompatible" product="tv" msgid="2890001324362291683">"Оваа апликација не е компатибилна со вашиот телевизор."</string> <string name="install_failed_incompatible" product="default" msgid="7254630419511645826">"Апликација што не е инсталирана како апликација не е компатибилна со вашиот телефон."</string> <string name="install_failed_invalid_apk" msgid="8581007676422623930">"Апликација што не е инсталирана како пакет се чини дека е неважечка."</string> - <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можеше да се инсталира на вашиот таблет."</string> - <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можеше да се инсталира на вашиот телевизор."</string> - <string name="install_failed_msg" product="default" msgid="6484461562647915707">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можеше да се инсталира на вашиот телефон."</string> + <string name="install_failed_msg" product="tablet" msgid="6298387264270562442">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира на вашиот таблет."</string> + <string name="install_failed_msg" product="tv" msgid="1920009940048975221">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира на вашиот телевизор."</string> + <string name="install_failed_msg" product="default" msgid="6484461562647915707">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира на вашиот телефон."</string> <string name="launch" msgid="3952550563999890101">"Отвори"</string> <string name="unknown_apps_admin_dlg_text" msgid="4456572224020176095">"Вашиот администратор не дозволува инсталација на апликации добиени од непознати извори"</string> <string name="unknown_apps_user_restriction_dlg_text" msgid="151020786933988344">"Корисников не може да инсталира непознати апликации"</string> @@ -43,13 +43,13 @@ <string name="ok" msgid="7871959885003339302">"Во ред"</string> <string name="manage_applications" msgid="5400164782453975580">"Управување со апликациите"</string> <string name="out_of_space_dlg_title" msgid="4156690013884649502">"Нема простор"</string> - <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не можеше да се инсталира. Ослободете простор и обидете се повторно."</string> + <string name="out_of_space_dlg_text" msgid="8727714096031856231">"<xliff:g id="APP_NAME">%1$s</xliff:g> не може да се инсталира. Ослободете простор и обидете се повторно."</string> <string name="app_not_found_dlg_title" msgid="5107924008597470285">"Апликацијата не е најдена"</string> <string name="app_not_found_dlg_text" msgid="5219983779377811611">"Апликацијата не е пронајдена во списокот инсталирани апликации."</string> <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"Не е дозволено"</string> <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"Тековниот корисник нема дозвола да ја изведе деинсталацијава."</string> <string name="generic_error_dlg_title" msgid="5863195085927067752">"Грешка"</string> - <string name="generic_error_dlg_text" msgid="5287861443265795232">"Не можеше да се деинсталира апликацијата."</string> + <string name="generic_error_dlg_text" msgid="5287861443265795232">"Не може да се деинсталира апликацијата."</string> <string name="uninstall_application_title" msgid="4045420072401428123">"Деинсталирај ја апликацијата"</string> <string name="uninstall_update_title" msgid="824411791011583031">"Деинсталирајте ажурирање"</string> <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> е дел од следната апликација:"</string> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index 3b7775a97dde..082c148746a3 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvées</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index f6e901de8393..560c5dcfe924 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -57,6 +57,7 @@ <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string> <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item> <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes trouvées</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> @@ -77,6 +78,7 @@ <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string> <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138"> <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item> + <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item> <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item> </plurals> <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string> diff --git a/packages/PrintSpooler/res/values-mk/strings.xml b/packages/PrintSpooler/res/values-mk/strings.xml index 11d78679631d..504c956981e6 100644 --- a/packages/PrintSpooler/res/values-mk/strings.xml +++ b/packages/PrintSpooler/res/values-mk/strings.xml @@ -63,7 +63,7 @@ <string name="printer_info_desc" msgid="7181988788991581654">"Повеќе информации за овој печатач"</string> <string name="notification_channel_progress" msgid="872788690775721436">"Тековни работи за печатење"</string> <string name="notification_channel_failure" msgid="9042250774797916414">"Неуспешни работи за печатење"</string> - <string name="could_not_create_file" msgid="3425025039427448443">"Не можеше да се создаде датотека"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"Не може да се создаде датотека"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"Некои услуги за печатење се оневозможени"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"Пребарување печатачи"</string> <string name="print_no_print_services" msgid="8561247706423327966">"Нема овозможени услуги за печатење"</string> @@ -102,7 +102,7 @@ <item msgid="4061931020926489228">"Портрет"</item> <item msgid="3199660090246166812">"Пејзаж"</item> </string-array> - <string name="print_write_error_message" msgid="5787642615179572543">"Не можеше да се напише во датотеката"</string> + <string name="print_write_error_message" msgid="5787642615179572543">"Не може да се напише во датотеката"</string> <string name="print_error_default_message" msgid="8602678405502922346">"За жал, тоа не успеа. Обидете се повторно."</string> <string name="print_error_retry" msgid="1426421728784259538">"Обиди се повторно"</string> <string name="print_error_printer_unavailable" msgid="8985614415253203381">"Овој печатач не е достапен во моментов."</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index fd7a0a360041..a1432bf1e7f1 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -85,7 +85,7 @@ <string name="bluetooth_profile_headset" msgid="5395952236133499331">"المكالمات الهاتفية"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"نقل الملف"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"جهاز الإرسال"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"الدخول إلى الإنترنت"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"استخدام الإنترنت"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"مشاركة جهة الاتصال"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"استخدام مع مشاركة جهة الاتصال"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"مشاركة اتصال الإنترنت"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"غير نشط، انقر للتبديل."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"نشط، انقر للتبديل."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"حالة تطبيق وضع الاستعداد:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"إعدادات تحويل ترميز الوسائط"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"تفعيل تحويل الترميز لكل التطبيقات"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"إيقاف تحويل الترميز للتطبيقات"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"الخدمات قيد التشغيل"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"تطبيق WebView"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index eecdbc0610f3..c7000dd8d23f 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"নিষ্ক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"সক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"এপ্ ষ্টেণ্ডবাই অৱস্থাত আছে:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"মিডিয়া ট্ৰান্সক\'ডৰ ছেটিং"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"আটাইবোৰ এপৰ বাবে ট্ৰান্সক\'ডিং সক্ষম কৰক"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"এপৰ বাবে ট্ৰান্সক\'ডিং অক্ষম কৰক"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"চলিত সেৱা"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ৱেবভিউ প্ৰয়োগ"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 197cc886c63d..c30b7b5a31a4 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Deaktivdir. Keçid etmək üçün basın."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivdir. Keçid etmək üçün basın."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Tətbiqin gözləmə rejimi:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Media yenidən kodlaşdırma ayarları"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Bütün tətbiqlər üçün yenidən kodlaşdırmanı aktiv edin"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Tətbiqlər üçün yenidən kodlaşdırmanı deaktiv edin"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"İşləyən xidmətlər"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Hazırda prosesdə olan xidmətləri görüntüləyin və onlara nəzarət edin"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView icrası"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 1dfae0b590b1..04f6ef00a355 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Уключана"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аўдыё медыяпрылады"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аўдыя медыяфайлаў"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Тэлефонныя выклікі"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Перадача файлаў"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Прылада ўводу"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактыўная. Краніце, каб пераключыць."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Актыўная. Краніце, каб пераключыць."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Стан праграмы ў рэжыме чакання: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Налады перакадзіравання мультымедыя"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Дазволіць перакадзіраванне для ўсіх праграм"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Адключыць перакадзіраванне для праграм"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Запушчаныя службы"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Прагляд запушчаных службаў i кіраванне iмi"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Рэалізацыя WebView"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 2f34acc60902..e1f18a172194 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивно. Докоснете, за да превключите."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активно. Докоснете, за да превключите."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Състояние на готовност на приложението: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Настройки за прекодирането на мултимедийно съдържание"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Активиране на прекодирането за всички приложения"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Деактивиране на прекодирането за приложения"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Изпълнявани услуги"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Внедряване на WebView"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index ff7ebb4e67d4..b27d29c60d07 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"নিষ্ক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"সক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"অ্যাপ স্ট্যান্ডবাই-এর অবস্থা:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"মিডিয়া ট্রান্সকোড সেটিংস"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"সব অ্যাপের জন্য ট্রান্সকোডিং চালু করুন"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"অ্যাপের ট্রান্সকোডিং বন্ধ করুন"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"এখন চলছে যে পরিষেবাগুলি"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ওয়েবভিউ প্রয়োগ"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index fee91af2bb3a..8d467587f3d6 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -399,9 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivno. Dodirnite za promjenu opcije."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivno. Dodirnite za promjenu opcije."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje mirovanja aplikacije:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <string name="transcode_settings_title" msgid="6700974145733932357">"Postavke konvertiranja medija"</string> - <string name="transcode_enable_all" msgid="4719796495995795404">"Omogućavanje konvertiranja za sve aplikacije"</string> - <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogućivanje konvertiranja za aplikacije"</string> + <string name="transcode_settings_title" msgid="6700974145733932357">"Postavke transkodiranja medijskih fajlova"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Omogućite transkodiranje za sve aplikacije"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogućite transkodiranje za aplikacije"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Postavljanje WebViewa"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 01f9488d5ae6..be0bd47edb3e 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivní. Klepnutím možnost přepnete."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivní. Klepnutím možnost přepnete."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Stav pohotovostního režimu aplikace: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Nastavení překódování médií"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Povolit překódování u všech aplikací"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Zakázat překódování aplikací"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Spuštěné služby"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementace WebView"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 0d9ef0d47d4f..2725598a0b57 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktiv. Tryk for at skifte."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Tryk for at skifte."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Standbystatus for appen:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Indstillinger for omkodning af medier"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Aktivér omkodning for alle apps"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Deaktiver omkodning for apps"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Kørende tjenester"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vis og administrer kørende tjenester"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 5cd4fc995e43..f876b957b62d 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Passiivne. Puudutage vahetamiseks."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiivne. Puudutage vahetamiseks."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Rakenduse ootelolek:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Meedia transkodeerimise seaded"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Luba transkodeerimine kõikide rakenduste puhul"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Keela rakenduste puhul transkodeerimine"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Käitatud teenused"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Praegu käitatud teenuste vaatamine ja juhtimine"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView\' rakendamine"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index ae675ecef9c4..0a7bc3eb8b06 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inaktibo. Aldatzeko, sakatu hau."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktibo. Aldatzeko, sakatu hau."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Egonean moduko aplikazioaren egoera: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Multimedia-edukia transkodetzeko ezarpenak"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Gaitu transkodetzeko aukera aplikazio guztietan"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Desgaitu aplikazioak transkodetzeko aukera"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Abian diren zerbitzuak"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ikusi eta kontrolatu une honetan abian diren zerbitzuak"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView inplementazioa"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 1d7597c7d23f..e0f328065d99 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"غیرفعال. برای تغییر حالت ضربه بزنید."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"فعال. برای تغییر حالت ضربه بزنید."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"وضعیت حالت آماده بهکار برنامه:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"تنظیمات تراتبدیل رسانه"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"فعال کردن تراتبدیل برای همه برنامهها"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"غیرفعال کردن تراتبدیل برای برنامهها"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"سرویسهای در حال اجرا"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"اجرای وبنما"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 082c488e5515..651faa54614c 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ei päällä. Ota käyttöön koskettamalla."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiivinen. Vaihda koskettamalla."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Sovelluksen valmiusluokka: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Median transkoodausasetukset"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Ota transkoodaus käyttöön kaikissa sovelluksissa"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Poista sovellusten transkoodaus käytöstä"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita."</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-käyttöönotto"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index bdeca0ef6932..c37d6cc59f1d 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Application inactive. Touchez ici pour l\'activer."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Application active. Touchez ici pour la désactiver."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"État de l\'application en veille :<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Paramètres de transcodage pour les éléments multimédias"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Activer le transcodage pour toutes les applications"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Désactiver le transcodage pour toutes les applications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string> @@ -494,6 +491,7 @@ <string name="wifi_status_mac_randomized" msgid="466382542497832189">"Les adresses MAC sont randomisées"</string> <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139"> <item quantity="one">%1$d appareil connecté</item> + <item quantity="many">%1$d devices connected</item> <item quantity="other">%1$d appareils connectés</item> </plurals> <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 42ff0b1f258e..ef52ec562b89 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -491,6 +491,7 @@ <string name="wifi_status_mac_randomized" msgid="466382542497832189">"La sélection des adresses MAC est aléatoire"</string> <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139"> <item quantity="one">%1$d appareil connecté</item> + <item quantity="many">%1$d devices connected</item> <item quantity="other">%1$d appareils connectés</item> </plurals> <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 036eccfc6c4f..16777aae2bb8 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Aplicación inactiva. Toca para alternar a configuración."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aplicación activa. Toca para alternar a configuración."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Estado en espera da aplicación: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Configuración de transcodificación de contido multimedia"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Activar transcodificación para todas as aplicacións"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Desactivar transcodificación para determinadas aplicacións"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizos en uso"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Comproba e controla os servizos actualmente en uso"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index e133115367bf..ef88ab13c2f0 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"મીડિયા ઑડિઓ"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"મીડિયા ઑડિયો"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ફોન કૉલ"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ફાઇલ સ્થાનાંતરણ"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ઇનપુટ ઉપકરણ"</string> @@ -113,7 +113,7 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ઇનપુટ માટે ઉપયોગ કરો"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"શ્રવણ યંત્રો માટે ઉપયોગ કરો"</string> <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"જોડી"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"જોડાણ બનાવો"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"જોડી કરો"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"રદ કરો"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"એ કનેક્ટ કરેલ હોય ત્યારે જોડાણ બનાવવાથી તમારા સંપર્કો અને કૉલ ઇતિહાસનો અૅક્સેસ મળે છે."</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડી કરી શક્યાં નહીં."</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"નિષ્ક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"સક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ઍપ સ્ટૅન્ડબાયની સ્થિતિ:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"મીડિયાનું ફૉર્મેટ બદલવાની પ્રક્રિયાના સેટિંગ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"બધી ઍપ માટે ફૉર્મેટ બદલવાની પ્રક્રિયા ચાલુ કરો"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ઍપ માટે ફૉર્મેટ બદલવાની પ્રક્રિયા બંધ કરો"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ચાલુ સેવાઓ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView અમલીકરણ"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 773256928f15..3aa413b3452a 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -399,7 +399,7 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"बंद है. टॉगल करने के लिए टैप करें."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय. टॉगल करने के लिए टैप करें."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ऐप्लिकेशन स्टैंडबाय की स्थिति:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <string name="transcode_settings_title" msgid="6700974145733932357">"मीडिया फ़ाइलों को ट्रांसकोड करने से जुड़ी सेटिंग"</string> + <string name="transcode_settings_title" msgid="6700974145733932357">"मीडिया ऐप्लिकेशन को ट्रांसकोड करने से जुड़ी सेटिंग"</string> <string name="transcode_enable_all" msgid="4719796495995795404">"सभी ऐप्लिकेशन के लिए ट्रांसकोडिंग चालू करें"</string> <string name="transcode_skip_apps" msgid="5680997722349545778">"ऐप्लिकेशन के लिए ट्रांसकोडिंग बंद करें"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"चल रही सेवाएं"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 0ae403e5f743..f2744b26a4ea 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ակտիվ չէ: Հպեք՝ փոխելու համար:"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Հավելվածի սպասման կարգավիճակ՝ <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Մեդիա բովանդակության վերակոդավորման կարգավորումներ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Միացնել վերակոդավորումը բոլոր հավելվածների համար"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Անջատել վերակոդավորումը հավելվածների համար"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Աշխատող ծառայություններ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ծառայություն"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 6328c2702e6b..e1298271d464 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Tidak aktif. Ketuk untuk beralih."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktif. Ketuk untuk beralih."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Status standby aplikasi:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Setelan transcoding media"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Mengaktifkan transcoding untuk semua aplikasi"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Menonaktifkan transcoding untuk aplikasi"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Layanan yang sedang berjalan"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Melihat dan mengontrol layanan yang sedang berjalan"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Penerapan WebView"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index ede5f6a112dd..6c916d9ab399 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"אפליקציה לא פעילה. הקש כדי להחליף מצב."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"אפליקציה פעילה. הקש כדי להחליף מצב."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"אפליקציה במצב המתנה:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"הגדרות המרת קידוד במדיה"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"הפעלת המרת קידוד בכל האפליקציות"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"השבתת המרת קידוד באפליקציות"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"שירותים פועלים"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"הצגת השירותים הפועלים כעת ושליטה בהם"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"יישום WebView"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index d71348138ed5..69392ce1de7a 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"無効です。タップすると切り替わります。"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"有効です。タップすると切り替わります。"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"アプリ スタンバイ状態: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"メディアのコード変換設定"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"すべてのアプリに対しコード変換を有効にする"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"アプリに対しコード変換を無効にする"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"実行中のサービス"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"現在実行中のサービスを表示して制御する"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView の実装"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index fc5a84aa087c..c75c722f5b1c 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Белсенді емес. Ауыстырып қосу үшін түртіңіз."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Белсенді. Ауыстырып қосу үшін түртіңіз."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Қолданбаның күту режимі: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Медиамазмұнды қайта кодтау параметрлері"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Барлық қолданба үшін қайта кодтауға рұқсат ету"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Қолданбалар үшін қайта кодтауды өшіру"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Қосылып тұрған қызметтер"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Қазір істеп тұрған қызметтерді көру және басқару"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView қызметі"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index c0dbeb398af2..2590a9fe46d7 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -85,7 +85,7 @@ <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ការហៅទូរសព្ទ"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ផ្ទេរឯកសារ"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ឧបករណ៍បញ្ចូល"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ចូលអ៊ីនធឺណិត"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ការចូលប្រើអ៊ីនធឺណិត"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"ការចែករំលែកទំនាក់ទំនង"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"ប្រើសម្រាប់ការចែករំលែកទំនាក់ទំនង"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ចែករំលែកការតភ្ជាប់អ៊ីនធឺណិត"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ស្ថានភាពមុខងារផ្អាកដំណើរការកម្មវិធី៖<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"ការកំណត់ការបំប្លែងកូដមេឌៀ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"បើកការបំប្លែងកូដសម្រាប់កម្មវិធីទាំងអស់"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"បិទការបំប្លែងកូដសម្រាប់កម្មវិធី"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"សេវាកម្មកំពុងដំណើរការ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ការអនុវត្ត WebView"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 09e82e5e78fe..dad3e03e94c7 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ನಿಷ್ಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟ್ಯಾಂಡ್ಬೈ ಸ್ಥಿತಿ:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"ಮಾಧ್ಯಮ ಟ್ರಾನ್ಸ್ಕೋಡ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳಿಗಾಗಿ ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ಆ್ಯಪ್ಗಳಿಗಾಗಿ ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index aad302c148b2..d41e7dbc1e5d 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"비활성화 상태입니다. 전환하려면 탭하세요."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"활성화되었습니다. 전환하려면 탭하세요."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"앱 대기 상태:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"미디어 트랜스코딩 설정"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"모든 앱에서 트랜스코딩 사용 설정"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"모든 앱에서 트랜스코딩 사용 중지"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"실행 중인 서비스"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"현재 실행 중인 서비스 보기 및 제어"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 구현"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 39e76bd92793..c07f334abdf2 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Файл өткөрүү үчүн колдонулсун"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Киргизүү үчүн колдонулсун"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Угуу аппараттары үчүн колдонуу"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Жупташтыруу"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Байланыштыруу"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ЖУПТАШТЫРУУ"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Жок"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Жупташканда байланыштарыңыз менен чалуу таржымалыңызды пайдалана аласыз."</string> @@ -223,7 +223,7 @@ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Байланышкан жок"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> туура тармакка туташып турганын текшериңиз"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Түзмөктү жупташтыруу"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi жупташтыруучу коду"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi аркылуу байланыштыруу коду"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Туташкан жок"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Түзмөк бир тармакка туташып турушу керек."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR кодун скандап, түзмөктү Wi‑Fi аркылуу жупташтырыңыз"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Иштеген жок. Күйгүзүү үчүн басып коюңуз."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Иштеп турат. Өчүрүү үчүн басып коюңуз."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Көшүү режиминдеги колдонмонун абалы:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Медианы транскоддоо жөндөөлөрү"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Бардык колдонмолор үчүн транскоддоону иштетүү"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Бардык колдонмолор үчүн транскоддоону өчүрүү"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Иштеп жаткан кызматтар"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Учурда иштеп жаткан кызматтарды көрүп, көзөмөлдөп турасыз"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView кызматы"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index f54c94c9426c..5aa27bf2a67a 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ບໍ່ໄດ້ນຳໃຊ້. ແຕະບໍ່ສັບປ່ຽນ."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ນຳໃຊ້ຢູ່. ແຕະເພື່ອສັບປ່ຽນ."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ສະຖານະສະແຕນບາຍແອັບ:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"ການຕັ້ງຄ່າການປ່ຽນຮູບແບບລະຫັດມີເດຍ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"ເປີດການນຳໃຊ້ການປ່ຽນຮູບແບບລະຫັດສຳລັບທຸກແອັບ"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ປິດການນຳໃຊ້ການປ່ຽນຮູບແບບລະຫັດສຳລັບແອັບ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ເບິ່ງ ແລະຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 0ff5d9af0ef2..3507ae723f2a 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активен"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аудио на медиуми"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук на аудио/видео"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонски повици"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Пренос на датотека"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Влезен уред"</string> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index d3314f2062a4..6a33b48abcaf 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -171,11 +171,11 @@ </string-array> <string-array name="select_logd_size_summaries"> <item msgid="409235464399258501">"Идэвхгүй"</item> - <item msgid="4195153527464162486">"лог буфер бүрт 64K"</item> - <item msgid="7464037639415220106">"лог буфер бүрт 256K"</item> - <item msgid="8539423820514360724">"лог буфер бүрт 1M"</item> - <item msgid="1984761927103140651">"лог буфер бүрт 4M"</item> - <item msgid="7892098981256010498">"лог буфер бүрт 16M"</item> + <item msgid="4195153527464162486">"лог буфер бүрд 64K"</item> + <item msgid="7464037639415220106">"лог буфер бүрд 256K"</item> + <item msgid="8539423820514360724">"лог буфер бүрд 1M"</item> + <item msgid="1984761927103140651">"лог буфер бүрд 4M"</item> + <item msgid="7892098981256010498">"лог буфер бүрд 16M"</item> </string-array> <string-array name="select_logpersist_titles"> <item msgid="704720725704372366">"Идэвхгүй"</item> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index fcf8183fcfd9..9cdf5bf98ede 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -287,7 +287,7 @@ <string name="wifi_metered_label" msgid="8737187690304098638">"Хязгаартай"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Хязгааргүй"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Логгерын буферын хэмжээ"</string> - <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Лог буфер бүрт ногдох логгерын хэмжээг сонгоно уу"</string> + <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Лог буфер бүрд ногдох логгерын хэмжээг сонгоно уу"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Нэвтрэгчийн тогтмол санг устгах уу?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Бид байнгын логоор хянаагүй үед таны төхөөрөмжтэй холбоотой нэвтрэгч өгөгдлийг устгах шаардлагатай."</string> <string name="select_logpersist_title" msgid="447071974007104196">"Төхөөрөмжид тогтмол нэвтрэгчийн өгөгдлийн сан"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Идэвхгүй байна. Унтраах/асаахын тулд дарна уу."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Идэвхтэй байна. Унтраах/асаахын тулд дарна уу."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Апп зогсолтын горимын төлөв:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Медиагийн хөрвүүлгийн тохиргоо"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Бүх аппад хөрвүүлгийг идэвхжүүлэх"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Аппуудад хөрвүүлгийг идэвхгүй болгох"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Ажиллаж байгаа үйлчилгээнүүд"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView хэрэгжилт"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 8760bf2ee195..8bb717a57789 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ပွင့်မနေပါ။ ပြောင်းရန်တို့ပါ။"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ပွင့်နေသည်။ ပြောင်းရန်တို့ပါ။"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"အက်ပ်ကို အရန်သင့်ထားရှိခြင်း အခြေအနေ-<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"မီဒီယာအမျိုးအစားပြောင်းခြင်း ဆက်တင်များ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"အက်ပ်အားလုံးအတွက် အမျိုးအစားပြောင်းခြင်းကို ဖွင့်ရန်"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"အက်ပ်များအတွက် အမျိုးအစားပြောင်းခြင်းကို ပိတ်ရန်"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"လက်ရှိ ဝန်ဆောင်မှုများကို ကြည့်ရှု ထိန်းသိမ်းသည်"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView အကောင်အထည်ဖော်မှု"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 88eac30fc31b..6a3aa29e0561 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Ikke aktiv. Trykk for å slå av/på."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Trykk for å slå av/på."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Hvilemodus:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Innstillinger for omkoding av medier"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Aktiver omkoding for alle apper"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Deaktiver omkoding for apper"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive tjenester"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Se og kontrollér tjenester som kjører"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 417072e8d4aa..5bc98c1b26cf 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"फाइल ट्रान्सफरका लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"इनपुटको लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"श्रवण यन्त्रहरूका लागि प्रयोग गर्नुहोस्"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"जोडी"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"जोडा बनाउनुहोस्"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"जोडी"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"रद्द गर्नुहोस्"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"जब जडान हुन्छ जोडी अनुदानले तपाईँको सम्पर्कहरू पहुँच गर्छ र इतिहास सम्झाउँछ।"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"निष्क्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"सक्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"एपको स्ट्यान्डबाई अवस्था:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"मिडिया फाइल ट्रान्सकोड गर्नेसम्बन्धी सेटिङ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"सबै एपमा ट्रान्सकोडिङ अन गर्नुहोस्"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"एपमा ट्रान्सकोडिङ अफ गर्नुहोस्"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"चलिरहेका सेवाहरू"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView कार्यान्वयन"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 8c5edab59dd3..a65a7d80eb7b 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ନିଷ୍କ୍ରିୟ। ଟୋଗଲ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ସକ୍ରିୟ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ଆପ୍ ଷ୍ଟାଣ୍ଡବାଏ ଅବସ୍ଥା:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"ମିଡିଆ ଟ୍ରାନ୍ସକୋଡିଂ ସେଟିଂସ୍"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"ସମସ୍ତ ଆପ୍ ପାଇଁ ଟ୍ରାନ୍ସକୋଡିଂ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ଆପଗୁଡ଼ିକ ପାଇଁ ଟ୍ରାନ୍ସକୋଡିଂ ଅକ୍ଷମ କରନ୍ତୁ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ୱେବ୍ଭ୍ୟୁ ପ୍ରୟୋଗ"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 8d7fa696102a..5a009bea08af 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ਅਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"ਐਪ ਸਟੈਂਡਬਾਈ ਸਥਿਤੀ:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"ਮੀਡੀਆ ਦੀਆਂ ਟ੍ਰਾਂਸਕੋਡ ਸੈਟਿੰਗਾਂ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਚਾਲੂ ਕਰੋ"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ਸਾਰੀਆਂ ਐਪਾਂ ਲਈ ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਬੰਦ ਕਰੋ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 798292370c3f..294e628ef567 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Nieaktywna. Dotknij, by zmienić."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktywna. Dotknij, by zmienić."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Stan aplikacji w trybie czuwania: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Ustawienia transkodowania multimediów"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Włącz transkodowanie dla wszystkich aplikacji"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Wyłącz transkodowanie dla aplikacji"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Uruchomione usługi"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Wyświetl obecnie uruchomione usługi i nimi zarządzaj"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacja WebView"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index b0e99acc8589..8f6ddeb11fe3 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Inactivă. Atingeți pentru a comuta."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Activă. Atingeți pentru a comuta."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Stare Standby aplicații: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Setări pentru transcodarea conținutului media"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Activați transcodarea pentru toate aplicațiile"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Dezactivați transcodarea pentru aplicații"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicii în curs de funcționare"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vedeți și controlați serviciile care funcționează în prezent"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementare WebView"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index fd1bec1ad9f9..cfea2aac17cb 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"අක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"සක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"යෙදුම් පොරොත්තු තත්ත්වය:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"මාධ්ය ට්රාන්ස්කෝඩ් සැකසීම්"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"සියලු යෙදුම් සඳහා ට්රාන්ස්කෝඩින් සබල කරන්න"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"සියලු යෙදුම් සඳහා ට්රාන්ස්කෝඩින් අබල කරන්න"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ධාවනය වන සේවා"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ක්රියාත්මක කිරීම"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 020815d4a66d..56fc8116ad8a 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktívne"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medií"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk médií"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonické hovory"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos súborov"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Vstupné zariadenie"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index f56009a183e5..22a65702b3c2 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Neaktivno. Dotaknite se za preklop."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktivno. Dotaknite se za preklop."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Stanje pripravljenosti aplikacije: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Nastavitve prekodiranja predstavnosti"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Omogočanje prekodiranja za vse aplikacije"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Onemogočanje prekodiranja za aplikacije"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Zagnane storitve"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Preglejte in nadzorujte storitve, ki so trenutno zagnane"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Izvedba spletnega pogleda"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 2ef438c65411..2d846c8ae178 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Joaktiv. Trokit për ta ndryshuar."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktiv. Trokit për ta ndryshuar."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Gjendja e gatishmërisë e aplikacionit:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Cilësimet e transkodimit të medias"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Aktivizo transkodimin për të gjitha aplikacionet"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Çaktivizo transkodimin për aplikacionet"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Shërbimet në ekzekutim"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Zbatimi i WebView"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 2c6bb292d802..05e455a8e5e3 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Använd för filöverföring"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Använd för inmatning"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Använd med hörapparater"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Parkoppling"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Parkoppla"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"PARKOPPLA"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Avbryt"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Om du kopplar enheten får du tillgång till dina kontakter och din samtalshistorik när du är ansluten."</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index d4efd4a877e0..365b0fd85835 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -81,11 +81,11 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Kimeunganishwa"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media ya sauti"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Sauti ya maudhui"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Simu"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Uhamishaji wa faili"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Kifaa cha kuingiza"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ufikiaji wa mtandao"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ufikiaji wa intaneti"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Kushiriki anwani"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Tumia kwa kushiriki anwani"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Kushiriki muunganisho wa tovuti"</string> @@ -107,7 +107,7 @@ <string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Tumia kuunganisha kwenye intaneti"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Tumia kwa ramani"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Tumia kwa ufikiaji wa SIM"</string> - <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Tumia kwa sauti ya media"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Tumia kwa sauti ya maudhui"</string> <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Tumia kwa sauti ya simu"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Tumia kwa hali faili"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Tumia kwa kuingiza"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Haitumika. Gusa ili ugeuze."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Inatumika. Gusa ili ugeuze."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Hali ya kisitisha programu:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Mipangilio ya kubadilisha muundo wa faili ya maudhui"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Washa ubadilishaji muundo wa faili kwenye programu zote"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Zima ubadilishaji muundo wa faili kwenye programu"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Huduma zinazoendeshwa"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Onyesha na udhibiti huduma zinazoendeshwa kwa sasa"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Utekelezaji wa WebView"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 929aed66d1ab..c09d2e142487 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"నిష్క్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"సక్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"యాప్ స్టాండ్బై స్థితి:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"మీడియా ట్రాన్స్కోడింగ్ సెట్టింగ్లు"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"అన్ని యాప్ల కోసం ట్రాన్స్కోడింగ్ని ఎనేబుల్ చేయండి"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"యాప్ల కోసం ట్రాన్స్కోడింగ్ని డిజేబుల్ చేయండి"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"అమలులో ఉన్న సేవలు"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ప్రస్తుతం అమలులో ఉన్న సేవలను వీక్షించండి మరియు నియంత్రించండి"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"వెబ్ వీక్షణ అమలు"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 8fdbf45794f0..fcfc11eff28e 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"ไม่ได้ใช้งาน แตะเพื่อสลับ"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"ใช้งานอยู่ แตะเพื่อสลับ"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"สถานะการสแตนด์บายของแอป:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"การตั้งค่าการแปลงสื่อ"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"เปิดใช้การแปลงสำหรับแอปทั้งหมด"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"ปิดใช้การแปลงสำหรับแอป"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"บริการที่ทำงานอยู่"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ดูและควบคุมบริการที่ทำงานอยู่"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"การใช้งาน WebView"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 97e835e0e385..cdd1d621da2c 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Hindi aktibo. I-tap upang i-toggle."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Aktibo. I-tap upang i-toggle."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Status ng app standby:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Mga setting ng pagta-transcode ng media"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"I-enable ang pagta-transcode para sa lahat ng app"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"I-disable ang pagta-transcode para sa mga app"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Mga tumatakbong serbisyo"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Pagpapatupad sa WebView"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index a6d89eafe9d5..0916d8963b80 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Etkin değil. Geçiş yapmak için dokunun."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Etkin. Geçiş yapmak için dokunun."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Uygulamayı beklemeye alma durumu: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Medya kod dönüştürme ayarları"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Tüm uygulamalar için kod dönüştürmeyi etkinleştirir"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Seçili uygulamalar için kod dönüştürmeyi devre dışı bırakır"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Çalışan hizmetler"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Web Görünümü kullanımı"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 366411875a84..1558ce52cda9 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Неактивний додаток. Торкніться, щоб активувати."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Активний додаток. Торкніться, щоб дезактивувати."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Режим очікування: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Налаштування перекодування медіаконтенту"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Увімкнути перекодування для всіх додатків"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Вимкнути перекодування для додатків"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Запущені сервіси"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Переглянути й налаштувати запущені сервіси"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Застосування WebView"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 47c7154d0e5c..84207bf99c9f 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="wifi_fail_to_scan" msgid="2333336097603822490">"Tarmoqlarni tekshirib chiqishni iloji bo‘lmadi"</string> <string name="wifi_security_none" msgid="7392696451280611452">"Hech qanday"</string> - <string name="wifi_remembered" msgid="3266709779723179188">"Saqlandi"</string> + <string name="wifi_remembered" msgid="3266709779723179188">"Saqlangan"</string> <string name="wifi_disconnected" msgid="7054450256284661757">"Ulanmagan"</string> <string name="wifi_disabled_generic" msgid="2651916945380294607">"Yoqilmagan"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP manzilini sozlab bo‘lmadi"</string> @@ -81,11 +81,11 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Faol"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"A2DP profili"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefon chaqiruvlari"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fayl uzatish"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Kiritish qurilmasi"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetga kirish"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetga ulanish"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Kontaktlarni ulashish"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Kontaktlarni ulashish uchun ishlatilsin"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Internet aloqasi ulashmasi"</string> @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Fayl almashinish uchun foydalanish"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Kiritish qurilmasi sifatida foydalanish"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Eshitish apparatlari uchun foydalanish"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Biriktirish"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"OK"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ULANISH"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Bekor qilish"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Agar ulanishga ruxsat bersangiz, ulangan vaqtda kontakt va qo‘ng‘iroqlaringiz tarixiga kirishi mumkin."</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Nofaol. O‘zgartirish uchun bu yerga bosing."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Faol. O‘zgartirish uchun bu yerga bosing."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Kutish rejimi holati: <xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Media transkripsiya sozlamalari"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Barcha ilovalar transkripsiyasini yoqish"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Barcha ilovalar transkripsiyasini faolsizlantirish"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Ishlab turgan ilovalar"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ta’minotchisi"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index a434184dc233..14a97f3c8f05 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Đang hoạt động"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Âm thanh của phương tiện"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Cuộc gọi điện thoại"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Chuyển tệp"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Thiết bị đầu vào"</string> @@ -95,7 +95,7 @@ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"Âm thanh HD"</string> <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Thiết bị trợ thính"</string> <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Đã kết nối với Thiết bị trợ thính"</string> - <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Đã kết nối với âm thanh phương tiện"</string> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Đã kết nối với âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Đã kết nối với âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"Đã kết nối với máy chủ chuyển tệp"</string> <string name="bluetooth_map_profile_summary_connected" msgid="4141725591784669181">"Đã kết nối với bản đồ"</string> @@ -107,7 +107,7 @@ <string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Sử dụng để truy cập Internet"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Sử dụng cho bản đồ"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Sử dụng để truy cập SIM"</string> - <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Sử dụng cho âm thanh phương tiện"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Sử dụng cho âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Sử dụng cho âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Sử dụng để chuyển tệp"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Sử dụng để nhập"</string> @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"Không hoạt động. Nhấn để chuyển đổi."</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"Hiện hoạt. Nhấn để chuyển đổi."</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"Trạng thái chờ ứng dụng:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"Tùy chọn chuyển mã ứng dụng"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"Bật tùy chọn chuyển mã cho tất cả ứng dụng"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"Tắt tùy chọn chuyển mã cho ứng dụng"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Các dịch vụ đang chạy"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Xem và kiểm soát các dịch vụ đang chạy"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Triển khai WebView"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index c02420373d92..9d312b61e75c 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未启用。点按即可切换。"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"已启用。点按即可切换。"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"应用待机状态:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"媒体转码设置"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"为所有应用启用转码"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"为应用停用转码"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"正在运行的服务"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看和控制当前正在运行的服务"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 实现"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index b2d11b8c5758..a8eb24624946 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未啟用。輕按即可切換。"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"已啟用。輕按即可切換。"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"備用應用程式狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"媒體轉碼設定"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"為所有應用程式啟用轉碼功能"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"為所有應用程式停用轉碼功能"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"執行中的服務"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並控制目前正在執行中的服務"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 設置"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index f02d06705dad..73692e46605d 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -399,12 +399,9 @@ <string name="inactive_app_inactive_summary" msgid="3161222402614236260">"未啟用。輕觸即可切換。"</string> <string name="inactive_app_active_summary" msgid="8047630990208722344">"已啟用。輕觸即可切換。"</string> <string name="standby_bucket_summary" msgid="5128193447550429600">"應用程式待命狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string> - <!-- no translation found for transcode_settings_title (6700974145733932357) --> - <skip /> - <!-- no translation found for transcode_enable_all (4719796495995795404) --> - <skip /> - <!-- no translation found for transcode_skip_apps (5680997722349545778) --> - <skip /> + <string name="transcode_settings_title" msgid="6700974145733932357">"媒體轉碼設定"</string> + <string name="transcode_enable_all" msgid="4719796495995795404">"替所有應用程式啟用轉碼功能"</string> + <string name="transcode_skip_apps" msgid="5680997722349545778">"替應用程式停用轉碼功能"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"正在運作的服務"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並管理目前正在執行的服務"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 實作"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 4d054ecc9914..cea7903b8726 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -992,14 +992,14 @@ <string name="standby_bucket_summary">App standby state:<xliff:g id="bucket"> %s</xliff:g></string> - <!-- Settings item title for transcode settings for apps. [CHAR LIMIT=85] --> - <string name="transcode_settings_title">Media transcode settings</string> + <!-- Settings item title for media transcoding settings. [CHAR LIMIT=85] --> + <string name="transcode_settings_title">Media transcoding settings</string> - <!-- Settings item title to enable or disable transcoding for all apps. [CHAR LIMIT=85] --> - <string name="transcode_enable_all">Enable transcoding for all apps</string> + <!-- Settings item title to disable transcoding globally. [CHAR LIMIT=85] --> + <string name="transcode_enable_all">Disable transcoding</string> - <!-- Settings category title for selecting apps to be skipped from transcoding. [CHAR LIMIT=85] --> - <string name="transcode_skip_apps">Disable transcoding for apps</string> + <!-- Settings category title for selecting apps to be enabled for transcoding. [CHAR LIMIT=85] --> + <string name="transcode_skip_apps">Enable transcoding for apps</string> <!-- Services settings screen, setting option name for the user to go to the screen to view running services --> <string name="runningservices_settings_title">Running services</string> diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml index 939c5f9f7ecb..7816d6252267 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_clock_switch.xml @@ -67,20 +67,18 @@ android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentTop="true" - android:layout_marginBottom="24dp" android:visibility="gone"> - <com.android.keyguard.GradientTextClock - android:id="@+id/gradient_clock_view" + <com.android.keyguard.AnimatableClockView + android:id="@+id/animatable_clock_view" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="right" android:textSize="80dp" android:letterSpacing="0.02" android:lineSpacingMultiplier=".8" android:includeFontPadding="false" android:fontFamily="@font/clock" android:typeface="monospace" - android:format12Hour="hh\nmm" - android:format24Hour="HH\nmm" android:elegantTextHeight="false" /> </FrameLayout> diff --git a/packages/SystemUI/res/drawable/people_space_tile_view_card.xml b/packages/SystemUI/res/drawable/people_space_tile_view_card.xml index 6b81703bd343..4772ae76179e 100644 --- a/packages/SystemUI/res/drawable/people_space_tile_view_card.xml +++ b/packages/SystemUI/res/drawable/people_space_tile_view_card.xml @@ -15,14 +15,5 @@ --> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/white" /> - <padding - android:left="1dp" - android:top="1dp" - android:right="1dp" - android:bottom="1dp" /> - <corners - android:bottomRightRadius="7dp" - android:bottomLeftRadius="7dp" - android:topRightRadius="7dp" - android:topLeftRadius="7dp" /> + <corners android:radius="@dimen/people_space_widget_radius" /> </shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/people_space_widget_background.xml b/packages/SystemUI/res/drawable/people_space_widget_background.xml new file mode 100644 index 000000000000..b9293598bd00 --- /dev/null +++ b/packages/SystemUI/res/drawable/people_space_widget_background.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2020 The Android Open Source Project + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + --> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle" > + <solid + android:color="?android:attr/colorControlNormal" /> + <corners android:radius="@dimen/people_space_widget_radius" /> + <padding + android:left="@dimen/people_space_widget_background_padding" + android:top="@dimen/people_space_widget_background_padding" + android:right="@dimen/people_space_widget_background_padding" + android:bottom="@dimen/people_space_widget_background_padding"/> +</shape> diff --git a/packages/SystemUI/res/layout/people_space_widget.xml b/packages/SystemUI/res/layout/people_space_widget.xml index 60200993e3bf..b417fcf6424d 100644 --- a/packages/SystemUI/res/layout/people_space_widget.xml +++ b/packages/SystemUI/res/layout/people_space_widget.xml @@ -19,7 +19,7 @@ android:id="@+id/widget_list_view" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@android:color/holo_blue_light" + android:background="@drawable/people_space_widget_background" android:clipChildren="false" android:clipToPadding="false" android:padding="5dp" diff --git a/packages/SystemUI/res/values-night/dimens.xml b/packages/SystemUI/res/values-night/dimens.xml index 23e323112845..d2d4198b7728 100644 --- a/packages/SystemUI/res/values-night/dimens.xml +++ b/packages/SystemUI/res/values-night/dimens.xml @@ -16,8 +16,6 @@ --> <resources> - <!-- The height of the divider between the individual notifications. --> - <dimen name="notification_divider_height">1dp</dimen> <!-- Height of the background gradient behind the screenshot UI (taller in dark mode) --> <dimen name="screenshot_bg_protection_height">375dp</dimen> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index d946f7cb11c1..57e1d43bc6ef 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -133,17 +133,23 @@ <!-- Height of a small notification in the status bar which was used before android P --> <dimen name="notification_min_height_before_p">92dp</dimen> + <!-- Height of a small notification in the status bar which was used before android S --> + <dimen name="notification_min_height_before_s">106dp</dimen> + <!-- Height of a large notification in the status bar --> <dimen name="notification_max_height">294dp</dimen> <!-- Height of a heads up notification in the status bar for legacy custom views --> <dimen name="notification_max_heads_up_height_legacy">128dp</dimen> - <!-- Height of a heads up notification in the status bar for custom views before andoid P --> + <!-- Height of a heads up notification in the status bar for custom views before android P --> <dimen name="notification_max_heads_up_height_before_p">148dp</dimen> + <!-- Height of a heads up notification in the status bar for custom views before android S --> + <dimen name="notification_max_heads_up_height_before_s">162dp</dimen> + <!-- Height of a heads up notification in the status bar --> - <dimen name="notification_max_heads_up_height">162dp</dimen> + <dimen name="notification_max_heads_up_height">132dp</dimen> <!-- Height of a heads up notification in the status bar --> <dimen name="notification_max_heads_up_height_increased">188dp</dimen> @@ -1296,4 +1302,7 @@ <dimen name="media_output_dialog_header_icon_padding">16dp</dimen> <dimen name="media_output_dialog_icon_corner_radius">16dp</dimen> <dimen name="media_output_dialog_title_anim_y_delta">12.5dp</dimen> + + <dimen name="people_space_widget_radius">10dp</dimen> + <dimen name="people_space_widget_background_padding">6dp</dimen> </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java new file mode 100644 index 000000000000..3157a5a8fc5b --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockController.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard; + +import android.graphics.Color; +import android.graphics.Paint; +import android.util.MathUtils; + +import com.android.settingslib.Utils; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.util.ViewController; + +/** + * Controls the color of a GradientTextClock. + */ +public class AnimatableClockController extends ViewController<AnimatableClockView> { + + private final StatusBarStateController mStatusBarStateController; + private final int[] mDozingColors = new int[] {Color.WHITE, Color.WHITE}; + private int[] mLockScreenColors = new int[2]; + + private boolean mIsDozing; + + public AnimatableClockController( + AnimatableClockView view, + StatusBarStateController statusBarStateController) { + super(view); + mStatusBarStateController = statusBarStateController; + mIsDozing = mStatusBarStateController.isDozing(); + } + + @Override + protected void onViewAttached() { + mStatusBarStateController.addCallback(mStatusBarStateListener); + mIsDozing = mStatusBarStateController.isDozing(); + refreshTime(); + initColors(); + } + + @Override + protected void onViewDetached() { + mStatusBarStateController.removeCallback(mStatusBarStateListener); + } + + float getClockTextTopPadding() { + Paint.FontMetrics fm = mView.getPaint().getFontMetrics(); + return MathUtils.abs(fm.ascent - fm.top); + } + + /** + * Updates the time for this view. + */ + public void refreshTime() { + mView.refreshTime(); + } + + private void initColors() { + mLockScreenColors[0] = Utils.getColorAttrDefaultColor(getContext(), + com.android.systemui.R.attr.wallpaperTextColor); + mLockScreenColors[1] = Utils.getColorAttrDefaultColor(getContext(), + com.android.systemui.R.attr.wallpaperTextColorSecondary); + mView.setColors(mDozingColors, mLockScreenColors); + mView.animateDoze(mIsDozing, false); + } + + private final StatusBarStateController.StateListener mStatusBarStateListener = + new StatusBarStateController.StateListener() { + @Override + public void onDozingChanged(boolean isDozing) { + mIsDozing = isDozing; + mView.animateDoze(mIsDozing, true); + } + }; +} diff --git a/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java new file mode 100644 index 000000000000..6d1d42e2988b --- /dev/null +++ b/packages/SystemUI/src/com/android/keyguard/AnimatableClockView.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.keyguard; + +import android.annotation.FloatRange; +import android.annotation.IntRange; +import android.content.Context; +import android.graphics.Canvas; +import android.icu.text.DateTimePatternGenerator; +import android.text.format.DateFormat; +import android.util.AttributeSet; +import android.widget.TextView; + +import java.util.Calendar; + +import kotlin.Unit; + +/** + * Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30) + * The time's text color is a gradient that changes its colors based on its controller. + */ +public class AnimatableClockView extends TextView { + private static final CharSequence FORMAT_12_HOUR = "hh\nmm"; + private static final CharSequence FORMAT_24_HOUR = "HH\nmm"; + private static final long ANIM_DURATION = 300; + + private CharSequence mFormat; + private CharSequence mDescFormat; + private Calendar mTime = Calendar.getInstance(); + private int[] mDozingColors; + private int[] mLockScreenColors; + + private TextAnimator mTextAnimator = null; + private Runnable mOnTextAnimatorInitialized; + + public AnimatableClockView(Context context) { + this(context, null, 0, 0); + } + + public AnimatableClockView(Context context, AttributeSet attrs) { + this(context, attrs, 0, 0); + } + + public AnimatableClockView(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public AnimatableClockView(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + updateTimeFormat(); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + updateTimeFormat(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + void refreshTime() { + mTime.setTimeInMillis(System.currentTimeMillis()); + setText(DateFormat.format(mFormat, mTime)); + setContentDescription(DateFormat.format(mDescFormat, mTime)); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (mTextAnimator == null) { + mTextAnimator = new TextAnimator( + getLayout(), + () -> { + invalidate(); + return Unit.INSTANCE; + }, + 2 /* number of lines (each can have a unique Paint) */); + if (mOnTextAnimatorInitialized != null) { + mOnTextAnimatorInitialized.run(); + mOnTextAnimatorInitialized = null; + } + } else { + mTextAnimator.updateLayout(getLayout()); + } + } + + @Override + protected void onDraw(Canvas canvas) { + mTextAnimator.draw(canvas); + } + + void setColors(int[] dozingColors, int[] lockScreenColors) { + mDozingColors = dozingColors; + mLockScreenColors = lockScreenColors; + } + + void animateDoze(boolean isDozing, boolean animate) { + setTextStyle(isDozing ? 100 : 300 /* weight */, + -1, + isDozing ? mDozingColors : mLockScreenColors, + animate); + } + + /** + * Set text style with an optional animation. + * + * By passing -1 to weight, the view preserves its current weight. + * By passing -1 to textSize, the view preserves its current text size. + * + * @param weight text weight. + * @param textSize font size. + * @param animate true to animate the text style change, otherwise false. + */ + private void setTextStyle( + @IntRange(from = 0, to = 1000) int weight, + @FloatRange(from = 0) float textSize, + int[] colors, + boolean animate) { + if (mTextAnimator != null) { + mTextAnimator.setTextStyle(weight, textSize, colors, animate, ANIM_DURATION, null); + } else { + // when the text animator is set, update its start values + mOnTextAnimatorInitialized = + () -> mTextAnimator.setTextStyle( + weight, textSize, colors, false, ANIM_DURATION, null); + } + } + + private void updateTimeFormat() { + final boolean use24HourFormat = DateFormat.is24HourFormat(getContext()); + mFormat = use24HourFormat ? FORMAT_24_HOUR : FORMAT_12_HOUR; + mDescFormat = getBestDateTimePattern(getContext(), use24HourFormat ? "Hm" : "hm"); + } + + private static String getBestDateTimePattern(Context context, String skeleton) { + DateTimePatternGenerator dtpg = DateTimePatternGenerator.getInstance( + context.getResources().getConfiguration().locale); + return dtpg.getBestPattern(skeleton); + } +} diff --git a/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java b/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java deleted file mode 100644 index 3942c60a58e9..000000000000 --- a/packages/SystemUI/src/com/android/keyguard/GradientTextClock.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.keyguard; - -import android.annotation.FloatRange; -import android.annotation.IntRange; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.LinearGradient; -import android.graphics.Shader; -import android.util.AttributeSet; -import android.widget.TextClock; - -import kotlin.Unit; - -/** - * Displays the time with the hour positioned above the minutes. (ie: 09 above 30 is 9:30) - * The time's text color is a gradient that changes its colors based on its controller. - */ -public class GradientTextClock extends TextClock { - private int[] mGradientColors; - private float[] mPositions; - - private TextAnimator mTextAnimator = null; - - public GradientTextClock(Context context) { - this(context, null, 0, 0); - } - - public GradientTextClock(Context context, AttributeSet attrs) { - this(context, attrs, 0, 0); - } - - public GradientTextClock(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public GradientTextClock(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - addOnLayoutChangeListener(mOnLayoutChangeListener); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - removeOnLayoutChangeListener(mOnLayoutChangeListener); - } - - @Override - public void refreshTime() { - super.refreshTime(); - } - - @Override - public void setFormat12Hour(CharSequence format) { - super.setFormat12Hour(FORMAT_12); - } - - @Override - public void setFormat24Hour(CharSequence format) { - super.setFormat24Hour(FORMAT_24); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mTextAnimator == null) { - mTextAnimator = new TextAnimator(getLayout(), () -> { - invalidate(); - return Unit.INSTANCE; - }); - } else { - mTextAnimator.updateLayout(getLayout()); - } - } - - @Override - protected void onDraw(Canvas canvas) { - mTextAnimator.draw(canvas); - } - - public void setGradientColors(int[] colors) { - mGradientColors = colors; - updatePaint(); - } - - public void setColorPositions(float[] positions) { - mPositions = positions; - } - - /** - * Set text style with animation. - * - * By passing -1 to weight, the view preserve the current weight. - * By passing -1 to textSize, the view preserve the current text size. - * - * @param weight text weight. - * @param textSize font size. - * @param animate true for changing text style with animation, otherwise false. - */ - public void setTextStyle( - @IntRange(from = 0, to = 1000) int weight, - @FloatRange(from = 0) float textSize, - boolean animate) { - if (mTextAnimator != null) { - mTextAnimator.setTextStyle(weight, textSize, animate, -1, null); - } - } - - private void updatePaint() { - Shader shader = new LinearGradient( - getX(), getY(), getX(), getMeasuredHeight() + getY(), mGradientColors, mPositions, - Shader.TileMode.REPEAT); - getPaint().setShader(shader); - if (mTextAnimator != null) { - mTextAnimator.setShader(shader); - } - } - - private final OnLayoutChangeListener mOnLayoutChangeListener = - (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { - if (bottom != oldBottom || top != oldTop) { - updatePaint(); - } - }; - - public static final CharSequence FORMAT_12 = "hh\nmm"; - public static final CharSequence FORMAT_24 = "HH\nmm"; -} diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index c6ee15fcf4e3..d731840c38ae 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -73,11 +73,6 @@ public class KeyguardClockSwitch extends RelativeLayout { private TextClock mClockViewBold; /** - * Gradient clock for usage when mode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL. - */ - private TimeBasedColorsClockController mNewLockscreenClockViewController; - - /** * Frame for clock when mode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL. */ private FrameLayout mNewLockscreenClockFrame; @@ -157,7 +152,6 @@ public class KeyguardClockSwitch extends RelativeLayout { setPaddingRelative(startEndPadding, 0, startEndPadding, 0); mSmallClockFrame.setVisibility(GONE); mNewLockscreenClockFrame.setVisibility(VISIBLE); - mNewLockscreenClockViewController.init(); statusAreaLP.removeRule(RelativeLayout.BELOW); statusAreaLP.addRule(RelativeLayout.LEFT_OF, R.id.new_lockscreen_clock_view); @@ -181,8 +175,6 @@ public class KeyguardClockSwitch extends RelativeLayout { mClockView = findViewById(R.id.default_clock_view); mClockViewBold = findViewById(R.id.default_clock_view_bold); mNewLockscreenClockFrame = findViewById(R.id.new_lockscreen_clock_view); - mNewLockscreenClockViewController = - new TimeBasedColorsClockController(findViewById(R.id.gradient_clock_view)); mSmallClockFrame = findViewById(R.id.clock_view); mKeyguardStatusArea = findViewById(R.id.keyguard_status_area); } @@ -240,6 +232,11 @@ public class KeyguardClockSwitch extends RelativeLayout { } } + float getClockTextTopPadding() { + Paint.FontMetrics fm = mClockView.getPaint().getFontMetrics(); + return fm.ascent - fm.top; + } + /** * Set container for big clock face appearing behind NSSL and KeyguardStatusView. */ @@ -305,7 +302,6 @@ public class KeyguardClockSwitch extends RelativeLayout { if (mClockPlugin != null) { mClockPlugin.setDarkAmount(darkAmount); } - mNewLockscreenClockViewController.setDarkAmount(darkAmount); updateBigClockAlpha(); } @@ -356,7 +352,6 @@ public class KeyguardClockSwitch extends RelativeLayout { * Refresh the time of the clock, due to either time tick broadcast or doze time tick alarm. */ public void refresh() { - mNewLockscreenClockViewController.refreshTime(System.currentTimeMillis()); mClockView.refreshTime(); mClockViewBold.refreshTime(); if (mClockPlugin != null) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 5b89f7f46772..6c695341680f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -55,7 +55,12 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private final ClockManager mClockManager; private final KeyguardSliceViewController mKeyguardSliceViewController; private final NotificationIconAreaController mNotificationIconAreaController; - private FrameLayout mNewLockscreenClockFrame; + + /** + * Gradient clock for usage when mode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL. + */ + private AnimatableClockController mNewLockScreenClockViewController; + private FrameLayout mNewLockScreenClockFrame; private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL; @@ -119,7 +124,7 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mColorExtractor.addOnColorsChangedListener(mColorsListener); mView.updateColors(getGradientColors()); updateAodIcons(); - mNewLockscreenClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view); + mNewLockScreenClockFrame = mView.findViewById(R.id.new_lockscreen_clock_view); } @Override @@ -182,6 +187,10 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS * Refresh clock. Called in response to TIME_TICK broadcasts. */ void refresh() { + if (mNewLockScreenClockViewController != null) { + mNewLockScreenClockViewController.refreshTime(); + } + mView.refresh(); } @@ -192,8 +201,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS */ void updatePosition(int x, AnimationProperties props, boolean animate) { x = Math.abs(x); - if (mNewLockscreenClockFrame != null) { - PropertyAnimator.setProperty(mNewLockscreenClockFrame, AnimatableProperty.TRANSLATION_X, + if (mNewLockScreenClockFrame != null) { + PropertyAnimator.setProperty(mNewLockScreenClockFrame, AnimatableProperty.TRANSLATION_X, -x, props, animate); } mKeyguardSliceViewController.updatePosition(x, props, animate); @@ -205,6 +214,17 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS */ void updateLockScreenMode(int mode) { mLockScreenMode = mode; + if (mode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) { + if (mNewLockScreenClockViewController == null) { + mNewLockScreenClockViewController = + new AnimatableClockController( + mView.findViewById(R.id.animatable_clock_view), + mStatusBarStateController); + mNewLockScreenClockViewController.init(); + } + } else { + mNewLockScreenClockViewController = null; + } mView.updateLockScreenMode(mLockScreenMode); updateAodIcons(); } @@ -219,6 +239,15 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS mView.setFormat24Hour(Patterns.sClockView24); } + float getClockTextTopPadding() { + if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1 + && mNewLockScreenClockViewController != null) { + return mNewLockScreenClockViewController.getClockTextTopPadding(); + } + + return mView.getClockTextTopPadding(); + } + private void updateAodIcons() { NotificationIconContainer nic = (NotificationIconContainer) mView.findViewById( diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index a9c06edf46cc..a32cd1420fdc 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -154,12 +154,7 @@ public class KeyguardSliceView extends LinearLayout { public void updateLockScreenMode(int mode) { mLockScreenMode = mode; if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) { - // add top padding to better align with top of clock - final int topPadding = (int) TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, - 20, - getResources().getDisplayMetrics()); - mTitle.setPaddingRelative(0, topPadding, 0, 0); + mTitle.setPaddingRelative(0, 0, 0, 0); mTitle.setGravity(Gravity.START); setGravity(Gravity.START); RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams(); @@ -524,9 +519,9 @@ public class KeyguardSliceView extends LinearLayout { .getDimension(R.dimen.widget_horizontal_padding) / 2; if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) { // orientation is vertical, so add padding to top & bottom - setPadding(0, padding, 0, padding * (hasText ? 1 : -1)); + setPadding(0, padding, 0, hasText ? padding : 0); } else { - // oreintation is horizontal, so add padding to left & right + // orientation is horizontal, so add padding to left & right setPadding(padding, 0, padding * (hasText ? 1 : -1), 0); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java index 02b18b28a5ea..1b0a7faeddab 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceViewController.java @@ -26,6 +26,7 @@ import android.provider.Settings; import android.util.Log; import android.view.Display; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -148,6 +149,12 @@ public class KeyguardSliceViewController extends ViewController<KeyguardSliceVie KeyguardSliceViewController.this.hashCode())); } + void updateTopMargin(float clockTopTextPadding) { + ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mView.getLayoutParams(); + lp.topMargin = (int) clockTopTextPadding; + mView.setLayoutParams(lp); + } + /** * Updates the lockscreen mode which may change the layout of the keyguard slice view. */ diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index cc7b8322d190..dcb306e6110a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -297,6 +297,15 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV mLockScreenMode = mode; mKeyguardClockSwitchController.updateLockScreenMode(mode); mKeyguardSliceViewController.updateLockScreenMode(mode); + if (mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1) { + // align the top of keyguard_status_area with the top of the clock text instead + // of the top of the view + mKeyguardSliceViewController.updateTopMargin( + mKeyguardClockSwitchController.getClockTextTopPadding()); + } else { + // reset margin + mKeyguardSliceViewController.updateTopMargin(0); + } updateAodIcons(); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 42680e663849..767afa78b935 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2141,7 +2141,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab userId); } else { mFpm.authenticate(null /* crypto */, mFingerprintCancelSignal, - mFingerprintAuthenticationCallback, null /* handler */, userId); + mFingerprintAuthenticationCallback, null /* handler */, + FingerprintManager.SENSOR_ID_ANY, userId); } setFingerprintRunningState(BIOMETRIC_STATE_RUNNING); } diff --git a/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt index e4c3dcde3bd4..f2d36d19afcf 100644 --- a/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt +++ b/packages/SystemUI/src/com/android/keyguard/TextAnimator.kt @@ -21,11 +21,10 @@ import android.animation.AnimatorListenerAdapter import android.animation.TimeInterpolator import android.animation.ValueAnimator import android.graphics.Canvas -import android.graphics.Shader import android.text.Layout private const val TAG_WGHT = "wght" -private const val DEFAULT_ANIMATION_DURATION: Long = 1000 +private const val DEFAULT_ANIMATION_DURATION: Long = 300 /** * This class provides text animation between two styles. @@ -53,9 +52,13 @@ private const val DEFAULT_ANIMATION_DURATION: Long = 1000 * </code> * </pre> */ -class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { +class TextAnimator( + layout: Layout, + private val invalidateCallback: () -> Unit, + private val numLines: Int = 1 +) { // Following two members are for mutable for testing purposes. - internal var textInterpolator: TextInterpolator = TextInterpolator(layout) + internal var textInterpolator: TextInterpolator = TextInterpolator(layout, numLines) internal var animator: ValueAnimator = ValueAnimator.ofFloat(1f).apply { duration = DEFAULT_ANIMATION_DURATION addUpdateListener { @@ -72,19 +75,6 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { textInterpolator.layout = layout } - var shader: Shader - get() = textInterpolator.basePaint.shader.also { - require(it === textInterpolator.targetPaint.shader) { - "base and target paint has different shader. Usually shader is not interpolatable." - } - } - set(value) { - textInterpolator.basePaint.shader = value - textInterpolator.targetPaint.shader = value - // Shader doesn't change the text layout, so no need to call onTargetPaintModified or - // onBasePaintModified - } - fun draw(c: Canvas) = textInterpolator.draw(c) /** @@ -97,6 +87,8 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { * * @param weight an optional text weight. * @param textSize an optional font size. + * @param colors an optional colors array that must be the same size as numLines passed to + * the TextInterpolator * @param animate an optional boolean indicating true for showing style transition as animation, * false for immediate style transition. True by default. * @param duration an optional animation duration in milliseconds. This is ignored if animate is @@ -107,6 +99,7 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { fun setTextStyle( weight: Int = -1, textSize: Float = -1f, + colors: IntArray? = null, animate: Boolean = true, duration: Long = -1L, interpolator: TimeInterpolator? = null @@ -117,10 +110,21 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { } if (textSize >= 0) { - textInterpolator.targetPaint.textSize = textSize + for (targetPaint in textInterpolator.targetPaint) + targetPaint.textSize = textSize } if (weight >= 0) { - textInterpolator.targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight" + for (targetPaint in textInterpolator.targetPaint) + targetPaint.fontVariationSettings = "'$TAG_WGHT' $weight" + } + if (colors != null) { + require(colors.size == textInterpolator.targetPaint.size) { + "colors size (${colors.size}) must be the same size as" + + " targetPaints size (${textInterpolator.targetPaint.size})," + + " which was initialized as numLines ($numLines)" + } + for ((index, targetPaint) in textInterpolator.targetPaint.withIndex()) + targetPaint.color = colors[index] } textInterpolator.onTargetPaintModified() @@ -138,4 +142,4 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { textInterpolator.rebase() } } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt b/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt index 51148f3c93af..f5e01dedfe3e 100644 --- a/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt +++ b/packages/SystemUI/src/com/android/keyguard/TextInterpolator.kt @@ -22,21 +22,28 @@ import android.graphics.text.PositionedGlyphs import android.graphics.text.TextRunShaper import android.text.Layout import android.util.MathUtils +import com.android.internal.graphics.ColorUtils import java.lang.Math.max /** * Provide text style linear interpolation for plain text. */ -class TextInterpolator(layout: Layout) { +class TextInterpolator( + layout: Layout, + lines: Int = 1 +) { + /** * Returns base paint used for interpolation. * * Once you modified the style parameters, you have to call reshapeText to recalculate base text * layout. * - * @return a paint object. + * @return an array list of paint objects representing one paint per line of text. If this + * list has a smaller size than the number of lines, all extra lines will use the Paint an + * index 0. */ - val basePaint = Paint(layout.paint) + val basePaint = createDefaultPaint(layout.paint, lines) /** * Returns target paint used for interpolation. @@ -44,9 +51,18 @@ class TextInterpolator(layout: Layout) { * Once you modified the style parameters, you have to call reshapeText to recalculate target * text layout. * - * @return a paint object + * @return an array list of paint objects representing one paint per line of text. If this + * list has a smaller size than the number of lines, all extra lines will use the Paint an + * index 0. */ - val targetPaint = Paint(layout.paint) + val targetPaint = createDefaultPaint(layout.paint, lines) + + private fun createDefaultPaint(paint: Paint, lines: Int): ArrayList<Paint> { + val paintList = ArrayList<Paint>() + for (i in 0 until lines) + paintList.add(Paint(paint)) + return paintList + } /** * A class represents a single font run. @@ -78,7 +94,7 @@ class TextInterpolator(layout: Layout) { private val fontInterpolator = FontInterpolator() // Recycling object for glyph drawing. Will be extended for the longest font run if needed. - private val tmpDrawPaint = Paint() + private val tmpDrawPaints = ArrayList<Paint>() private var tmpPositionArray = FloatArray(20) /** @@ -115,8 +131,8 @@ class TextInterpolator(layout: Layout) { /** * Recalculate internal text layout for interpolation. * - * Whenever you modifies target paint, you have to call this method to recalculate internal text - * layout used for interpolation. + * Whenever the target paint is modified, call this method to recalculate internal + * text layout used for interpolation. */ fun onTargetPaintModified() { updatePositionsAndFonts(shapeText(layout, targetPaint), updateBase = false) @@ -125,8 +141,8 @@ class TextInterpolator(layout: Layout) { /** * Recalculate internal text layout for interpolation. * - * Whenever you modifies base paint, you have to call this method to recalculate internal text - * layout used for interpolation. + * Whenever the base paint is modified, call this method to recalculate internal + * text layout used for interpolation. */ fun onBasePaintModified() { updatePositionsAndFonts(shapeText(layout, basePaint), updateBase = true) @@ -192,10 +208,10 @@ class TextInterpolator(layout: Layout) { if (progress == 0f) { return } else if (progress == 1f) { - basePaint.set(targetPaint) + updatePaint(basePaint, targetPaint) } else { - lerp(basePaint, targetPaint, progress, tmpDrawPaint) - basePaint.set(tmpDrawPaint) + lerp(basePaint, targetPaint, progress, tmpDrawPaints) + updatePaint(basePaint, tmpDrawPaints) } lines.forEach { line -> @@ -211,13 +227,21 @@ class TextInterpolator(layout: Layout) { progress = 0f } + companion object { + fun updatePaint(toUpdate: ArrayList<Paint>, newValues: ArrayList<Paint>) { + toUpdate.clear() + for (paint in newValues) + toUpdate.add(Paint(paint)) + } + } + /** * Draws interpolated text at the given progress. * * @param canvas a canvas. */ fun draw(canvas: Canvas) { - lerp(basePaint, targetPaint, progress, tmpDrawPaint) + lerp(basePaint, targetPaint, progress, tmpDrawPaints) lines.forEachIndexed { lineNo, line -> canvas.save() try { @@ -226,7 +250,10 @@ class TextInterpolator(layout: Layout) { canvas.translate(origin, layout.getLineBaseline(lineNo).toFloat()) line.fontRuns.forEach { run -> - drawFontRun(canvas, line, run, tmpDrawPaint) + if (lineNo >= tmpDrawPaints.size) + drawFontRun(canvas, line, run, tmpDrawPaints[0]) + else + drawFontRun(canvas, line, run, tmpDrawPaints[lineNo]) } } finally { canvas.restore() @@ -384,15 +411,25 @@ class TextInterpolator(layout: Layout) { } // Linear interpolate the paint. - private fun lerp(from: Paint, to: Paint, t: Float, out: Paint) { - // Currently only font size is interpolated. + private fun lerp( + from: ArrayList<Paint>, + to: ArrayList<Paint>, + progress: Float, + out: ArrayList<Paint> + ) { + out.clear() + // Currently only font size & colors are interpolated. // TODO(172943390): Add other interpolation or support custom interpolator. - out.set(from) - out.textSize = MathUtils.lerp(from.textSize, to.textSize, t) + for (index in from.indices) { + val paint = Paint(from[index]) + paint.textSize = MathUtils.lerp(from[index].textSize, to[index].textSize, progress) + paint.color = ColorUtils.blendARGB(from[index].color, to[index].color, progress) + out.add(paint) + } } // Shape the text and stores the result to out argument. - private fun shapeText(layout: Layout, paint: Paint): List<PositionedGlyphs> { + private fun shapeText(layout: Layout, paints: ArrayList<Paint>): List<PositionedGlyphs> { val out = mutableListOf<PositionedGlyphs>() for (lineNo in 0 until layout.lineCount) { // Shape all lines. val lineStart = layout.getLineStart(lineNo) @@ -403,7 +440,7 @@ class TextInterpolator(layout: Layout) { lineStart, count, // shape context = shape range. 0f, 0f, // the layout offset. Not changed. layout.getParagraphDirection(lineNo) == Layout.DIR_RIGHT_TO_LEFT, - paint)) // Use given paint instead of layout's paint for style interpolation. + paints[lineNo])) // Use given paint instead of layout's for style interpolation. } return out } @@ -414,4 +451,4 @@ private fun Layout.getDrawOrigin(lineNo: Int) = getLineLeft(lineNo) } else { getLineRight(lineNo) - }
\ No newline at end of file + } diff --git a/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java b/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java deleted file mode 100644 index 933d338c0736..000000000000 --- a/packages/SystemUI/src/com/android/keyguard/TimeBasedColorsClockController.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.keyguard; - -import android.util.MathUtils; - -import com.android.internal.graphics.ColorUtils; -import com.android.settingslib.Utils; -import com.android.systemui.R; -import com.android.systemui.util.ViewController; - -import java.util.Calendar; -import java.util.GregorianCalendar; - -/** - * Changes the color of the text clock based on the time of day. - */ -public class TimeBasedColorsClockController extends ViewController<GradientTextClock> { - private final int[] mGradientColors = new int[3]; - private final float[] mPositions = new float[3]; - - /** - * 0 = fully awake - * between 0 and 1 = transitioning between awake and doze - * 1 = fully in doze - */ - private float mDarkAmount = 0f; - - public TimeBasedColorsClockController(GradientTextClock view) { - super(view); - } - - @Override - protected void onViewAttached() { - refreshTime(System.currentTimeMillis()); - } - - @Override - protected void onViewDetached() { - - } - - /** - * Updates the time for this view. Also updates any color changes. - */ - public void refreshTime(long timeInMillis) { - updateColors(timeInMillis); - updatePositions(timeInMillis); - mView.refreshTime(); - } - - /** - * Set the amount (ratio) that the device has transitioned to doze. - * - * @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake. - */ - public void setDarkAmount(float darkAmount) { - mDarkAmount = darkAmount; - - refreshTime(System.currentTimeMillis()); - - int weight = (int) MathUtils.lerp(200, 400, 1f - darkAmount); - mView.setTextStyle(weight, -1 /* unchange text size */, true); - } - - private int getTimeIndex(long timeInMillis) { - Calendar now = getCalendar(timeInMillis); - int hour = now.get(Calendar.HOUR_OF_DAY); // 0 - 23 - if (hour < mTimes[0]) { - return mTimes.length - 1; - } - - for (int i = 1; i < mTimes.length; i++) { - if (hour < mTimes[i]) { - return i - 1; - } - } - - return mTimes.length - 1; - } - - private void updateColors(long timeInMillis) { - final int index = getTimeIndex(timeInMillis); - final int wallpaperTextColor = - Utils.getColorAttrDefaultColor(mView.getContext(), R.attr.wallpaperTextColor); - for (int i = 0; i < mGradientColors.length; i++) { - // wallpaperTextColor on LS when mDarkAmount = 0f - // full color on AOD when mDarkAmount = 1f - mGradientColors[i] = - ColorUtils.blendARGB(wallpaperTextColor, COLORS[index][i], mDarkAmount); - } - mView.setGradientColors(mGradientColors); - } - - private void updatePositions(long timeInMillis) { - Calendar now = getCalendar(timeInMillis); - final int index = getTimeIndex(timeInMillis); - - final Calendar startTime = new GregorianCalendar(); - startTime.setTimeInMillis(now.getTimeInMillis()); - startTime.set(Calendar.HOUR_OF_DAY, mTimes[index]); - if (startTime.getTimeInMillis() > now.getTimeInMillis()) { - // start should be earlier than 'now' - startTime.add(Calendar.DATE, -1); - } - - final Calendar endTime = new GregorianCalendar(); - endTime.setTimeInMillis(now.getTimeInMillis()); - if (index == mTimes.length - 1) { - endTime.set(Calendar.HOUR_OF_DAY, mTimes[0]); - endTime.add(Calendar.DATE, 1); // end time is tomorrow - } else { - endTime.set(Calendar.HOUR_OF_DAY, mTimes[index + 1]); - } - - long totalTimeInThisColorGradient = endTime.getTimeInMillis() - startTime.getTimeInMillis(); - long timeIntoThisColorGradient = now.getTimeInMillis() - startTime.getTimeInMillis(); - float percentageWithinGradient = - (float) timeIntoThisColorGradient / (float) totalTimeInThisColorGradient; - - for (int i = 0; i < mPositions.length; i++) { - // currently hard-coded .3 movement of gradient - mPositions[i] = POSITIONS[index][i] - (.3f * percentageWithinGradient); - } - mView.setColorPositions(mPositions); - } - - private Calendar getCalendar(long timeInMillis) { - Calendar now = new GregorianCalendar(); - now.setTimeInMillis(timeInMillis); - return now; - } - - private static final int[] SUNRISE = new int[] {0xFF6F75AA, 0xFFAFF0FF, 0xFFFFDEBF}; - private static final int[] DAY = new int[] {0xFF9BD8FB, 0xFFD7F5FF, 0xFFFFF278}; - private static final int[] NIGHT = new int[] {0xFF333D5E, 0xFFC5A1D6, 0xFF907359}; - - private static final float[] SUNRISE_START_POSITIONS = new float[] {.3f, .5f, .8f}; - private static final float[] DAY_START_POSITIONS = new float[] {.4f, .8f, 1f}; - private static final float[] NIGHT_START_POSITIONS = new float[] {.25f, .5f, .8f}; - - // TODO (b/170228350): use TwilightManager to set sunrise/sunset times - private final int mSunriseTime = 6; // 6am - private final int mDaytime = 9; // 9 am - private final int mNightTime = 19; // 7pm - - private int[] mTimes = new int[] { - mSunriseTime, - mDaytime, - mNightTime - }; - private static final int[][] COLORS = new int[][] { - SUNRISE, - DAY, - NIGHT - }; - private static final float[][] POSITIONS = new float[][] { - SUNRISE_START_POSITIONS, - DAY_START_POSITIONS, - NIGHT_START_POSITIONS - }; -} diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java index c2ba6d5e9b06..3295595955eb 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java @@ -25,20 +25,20 @@ import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.Bundle; import android.os.ServiceManager; -import android.os.UserHandle; import android.util.Log; import android.view.ViewGroup; import com.android.systemui.R; import java.util.List; +import java.util.Map; /** * Shows the user their tiles for their priority People (go/live-status). */ public class PeopleSpaceActivity extends Activity { - private static String sTAG = "PeopleSpaceActivity"; + private static final String TAG = "PeopleSpaceActivity"; private ViewGroup mPeopleSpaceLayout; private IPeopleManager mPeopleManager; @@ -53,9 +53,8 @@ public class PeopleSpaceActivity extends Activity { setContentView(R.layout.people_space_activity); mPeopleSpaceLayout = findViewById(R.id.people_space_layout); mContext = getApplicationContext(); - mNotificationManager = - INotificationManager.Stub.asInterface( - ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + mNotificationManager = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); mPackageManager = getPackageManager(); mPeopleManager = IPeopleManager.Stub.asInterface( ServiceManager.getService(Context.PEOPLE_SERVICE)); @@ -69,27 +68,26 @@ public class PeopleSpaceActivity extends Activity { */ private void setTileViewsWithPriorityConversations() { try { - List<ShortcutInfo> shortcutInfos = PeopleSpaceUtils.getShortcutInfos(mContext, - mNotificationManager, mPeopleManager); - for (ShortcutInfo conversation : shortcutInfos) { + List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = PeopleSpaceUtils.getShortcutInfos( + mContext, mNotificationManager, mPeopleManager); + for (Map.Entry<Long, ShortcutInfo> entry : shortcutInfos) { + ShortcutInfo shortcutInfo = entry.getValue(); PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout, - conversation.getId()); - setTileView(tileView, conversation); + shortcutInfo.getId()); + setTileView(tileView, shortcutInfo, entry.getKey()); } } catch (Exception e) { - Log.e(sTAG, "Couldn't retrieve conversations", e); + Log.e(TAG, "Couldn't retrieve conversations", e); } } /** Sets {@code tileView} with the data in {@code conversation}. */ - private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo) { + private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo, + long lastInteraction) { try { - int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); - String pkg = shortcutInfo.getPackage(); - long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId, - shortcutInfo.getId()); - String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); + String status = + PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); tileView.setStatus(status); tileView.setName(shortcutInfo.getLabel().toString()); @@ -97,7 +95,7 @@ public class PeopleSpaceActivity extends Activity { tileView.setPersonIcon(mLauncherApps.getShortcutIconDrawable(shortcutInfo, 0)); tileView.setOnClickListener(mLauncherApps, shortcutInfo); } catch (Exception e) { - Log.e(sTAG, "Couldn't retrieve shortcut information", e); + Log.e(TAG, "Couldn't retrieve shortcut information", e); } } diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java index c983147961bf..35e445b968ba 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java @@ -28,15 +28,19 @@ import android.graphics.drawable.Drawable; import android.icu.text.MeasureFormat; import android.icu.util.Measure; import android.icu.util.MeasureUnit; +import android.os.UserHandle; import android.provider.Settings; import android.service.notification.ConversationChannelWrapper; +import android.util.Log; import com.android.systemui.R; import java.time.Duration; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; /** Utils class for People Space. */ public class PeopleSpaceUtils { @@ -47,27 +51,50 @@ public class PeopleSpaceUtils { private static final int MIN_HOUR = 1; private static final int ONE_DAY = 1; - /** Returns a list of {@link ShortcutInfo} corresponding to user's conversations. */ - public static List<ShortcutInfo> getShortcutInfos(Context context, + + /** Returns a list of map entries corresponding to user's conversations. */ + public static List<Map.Entry<Long, ShortcutInfo>> getShortcutInfos(Context context, INotificationManager notificationManager, IPeopleManager peopleManager) throws Exception { boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(), Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0; List<ConversationChannelWrapper> conversations = notificationManager.getConversations( - !showAllConversations /* priority only */).getList(); - List<ShortcutInfo> shortcutInfos = conversations.stream().filter( - c -> shouldKeepConversation(c)).map(c -> c.getShortcutInfo()).collect( - Collectors.toList()); + true).getList(); + List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = getSortedShortcutInfos(peopleManager, + conversations.stream().map(c -> c.getShortcutInfo())); if (showAllConversations) { List<ConversationChannel> recentConversations = peopleManager.getRecentConversations().getList(); - List<ShortcutInfo> recentShortcuts = recentConversations.stream().map( - c -> c.getShortcutInfo()).collect(Collectors.toList()); - shortcutInfos.addAll(recentShortcuts); + List<Map.Entry<Long, ShortcutInfo>> recentShortcutInfos = getSortedShortcutInfos( + peopleManager, recentConversations.stream().map(c -> c.getShortcutInfo())); + shortcutInfos.addAll(recentShortcutInfos); } return shortcutInfos; } + /** Returns a list sorted by ascending last interaction time from {@code stream}. */ + private static List<Map.Entry<Long, ShortcutInfo>> getSortedShortcutInfos( + IPeopleManager peopleManager, Stream<ShortcutInfo> stream) { + return stream + .filter(c -> shouldKeepConversation(c)) + .map(c -> Map.entry(getLastInteraction(peopleManager, c), c)) + .sorted((c1, c2) -> (c2.getKey().compareTo(c1.getKey()))) + .collect(Collectors.toList()); + } + + /** Returns the last interaction time with the user specified by {@code shortcutInfo}. */ + private static Long getLastInteraction(IPeopleManager peopleManager, + ShortcutInfo shortcutInfo) { + try { + int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); + String pkg = shortcutInfo.getPackage(); + return peopleManager.getLastInteraction(pkg, userId, shortcutInfo.getId()); + } catch (Exception e) { + Log.e(TAG, "Couldn't retrieve last interaction time", e); + return 0L; + } + } + /** Converts {@code drawable} to a {@link Bitmap}. */ public static Bitmap convertDrawableToBitmap(Drawable drawable) { if (drawable == null) { @@ -99,6 +126,7 @@ public class PeopleSpaceUtils { /** Returns a readable status describing the {@code lastInteraction}. */ public static String getLastInteractionString(Context context, long lastInteraction) { if (lastInteraction == 0L) { + Log.e(TAG, "Could not get valid last interaction"); return context.getString(R.string.basic_status); } long now = System.currentTimeMillis(); @@ -134,8 +162,7 @@ public class PeopleSpaceUtils { * </ul> * </li> */ - public static boolean shouldKeepConversation(ConversationChannelWrapper conversation) { - ShortcutInfo shortcutInfo = conversation.getShortcutInfo(); + public static boolean shouldKeepConversation(ShortcutInfo shortcutInfo) { return shortcutInfo != null && shortcutInfo.getLabel().length() != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java index d86998604559..a4527c3ef86f 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java @@ -24,7 +24,6 @@ import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.ServiceManager; -import android.os.UserHandle; import android.util.Log; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -35,6 +34,7 @@ import com.android.systemui.people.PeopleSpaceUtils; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** People Space Widget RemoteViewsFactory class. */ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { @@ -45,8 +45,8 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R private INotificationManager mNotificationManager; private PackageManager mPackageManager; private LauncherApps mLauncherApps; - private List<ShortcutInfo> mShortcutInfos = new ArrayList<>(); - private final Context mContext; + private List<Map.Entry<Long, ShortcutInfo>> mShortcutInfos = new ArrayList<>(); + private Context mContext; public PeopleSpaceWidgetRemoteViewsFactory(Context context, Intent intent) { this.mContext = context; @@ -100,11 +100,9 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R RemoteViews personView = new RemoteViews(mContext.getPackageName(), R.layout.people_space_widget_item); try { - ShortcutInfo shortcutInfo = mShortcutInfos.get(i); - int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); - String pkg = shortcutInfo.getPackage(); - long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId, - shortcutInfo.getId()); + Map.Entry<Long, ShortcutInfo> entry = mShortcutInfos.get(i); + ShortcutInfo shortcutInfo = entry.getValue(); + long lastInteraction = entry.getKey(); String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); @@ -114,7 +112,7 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R personView.setImageViewBitmap( R.id.package_icon, PeopleSpaceUtils.convertDrawableToBitmap( - mPackageManager.getApplicationIcon(pkg) + mPackageManager.getApplicationIcon(shortcutInfo.getPackage()) ) ); personView.setImageViewBitmap( diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 3291aa0e2099..dce081f21581 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -214,6 +214,7 @@ public class QSCustomizer extends LinearLayout { @Override public void onAnimationCancel(Animator animation) { mOpening = false; + mQs.notifyCustomizeChanged(); mNotifQsContainer.setCustomizerAnimating(false); } } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java index 5f35e60ad142..672f82c2a583 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotService.java @@ -125,9 +125,9 @@ public class TakeScreenshotService extends Service { }; @Inject - public TakeScreenshotService(ScreenshotController globalScreenshot, UserManager userManager, + public TakeScreenshotService(ScreenshotController screenshotController, UserManager userManager, UiEventLogger uiEventLogger) { - mScreenshot = globalScreenshot; + mScreenshot = screenshotController; mUserManager = userManager; mUiEventLogger = uiEventLogger; } diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessControllerSettings.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessControllerSettings.java index a151fd0b48ff..11ee94c97d7c 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessControllerSettings.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessControllerSettings.java @@ -27,7 +27,7 @@ import javax.inject.Inject; @SysUISingleton public class BrightnessControllerSettings { - private static final String THICK_BRIGHTNESS_SLIDER = "sysui_thick_brighthness"; + private static final String THICK_BRIGHTNESS_SLIDER = "sysui_thick_brightness"; private final boolean mUseThickSlider; private final boolean mUseMirrorOnThickSlider; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java index 25c8e7feb9b2..216b83f2b4d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationHeaderUtil.java @@ -33,6 +33,7 @@ import com.android.systemui.statusbar.notification.row.NotificationContentView; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Objects; /** * A Util to manage {@link android.view.NotificationHeaderView} objects and their redundancies. @@ -324,13 +325,15 @@ public class NotificationHeaderUtil { @Override public boolean compare(View parent, View child, Object parentData, Object childData) { TextView parentView = (TextView) parent; + CharSequence parentText = parentView == null ? "" : parentView.getText(); TextView childView = (TextView) child; - return parentView.getText().equals(childView.getText()); + CharSequence childText = childView == null ? "" : childView.getText(); + return Objects.equals(parentText, childText); } @Override public boolean isEmpty(View view) { - return TextUtils.isEmpty(((TextView) view).getText()); + return view == null || TextUtils.isEmpty(((TextView) view).getText()); } } @@ -369,7 +372,9 @@ public class NotificationHeaderUtil { @Override public void apply(View parent, View view, boolean apply, boolean reset) { - view.setVisibility(apply ? View.GONE : View.VISIBLE); + if (view != null) { + view.setVisibility(apply ? View.GONE : View.VISIBLE); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TransformableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TransformableView.java index 063252f08f36..e932bfee8430 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/TransformableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TransformableView.java @@ -28,6 +28,7 @@ public interface TransformableView { int TRANSFORMING_VIEW_IMAGE = 3; int TRANSFORMING_VIEW_PROGRESS = 4; int TRANSFORMING_VIEW_ACTIONS = 5; + int TRANSFORMING_VIEW_EXPANDER = 6; /** * Get the current state of a view in a transform animation diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java index 9a8cff0f8dc1..20d10d3e0a6c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java @@ -456,9 +456,6 @@ public class TransformState { if (view instanceof ImageView) { ImageTransformState result = ImageTransformState.obtain(); result.initFrom(view, transformInfo); - if (view.getId() == com.android.internal.R.id.reply_icon_action) { - ((TransformState) result).setIsSameAsAnyView(true); - } return result; } if (view instanceof ProgressBar) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 3e23a939630c..ea3906418032 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -35,7 +35,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.Path; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; @@ -71,6 +70,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.util.ContrastColorUtil; import com.android.internal.widget.CachingIconView; +import com.android.internal.widget.MessagingLayout; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; import com.android.systemui.R; @@ -154,14 +154,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private int mIconTransformContentShift; private int mMaxHeadsUpHeightBeforeN; private int mMaxHeadsUpHeightBeforeP; + private int mMaxHeadsUpHeightBeforeS; private int mMaxHeadsUpHeight; private int mMaxHeadsUpHeightIncreased; - private int mNotificationMinHeightBeforeN; - private int mNotificationMinHeightBeforeP; - private int mNotificationMinHeight; - private int mNotificationMinHeightLarge; - private int mNotificationMinHeightMedia; - private int mNotificationMaxHeight; + private int mMaxSmallHeightBeforeN; + private int mMaxSmallHeightBeforeP; + private int mMaxSmallHeightBeforeS; + private int mMaxSmallHeight; + private int mMaxSmallHeightLarge; + private int mMaxSmallHeightMedia; + private int mMaxExpandedHeight; private int mIncreasedPaddingBetweenElements; private int mNotificationLaunchHeight; private boolean mMustStayOnScreen; @@ -647,28 +649,48 @@ public class ExpandableNotificationRow extends ActivatableNotificationView != com.android.internal.R.id.status_bar_latest_event_content; boolean beforeN = mEntry.targetSdk < Build.VERSION_CODES.N; boolean beforeP = mEntry.targetSdk < Build.VERSION_CODES.P; - int minHeight; + boolean beforeS = mEntry.targetSdk < Build.VERSION_CODES.S; + int smallHeight; View expandedView = layout.getExpandedChild(); boolean isMediaLayout = expandedView != null && expandedView.findViewById(com.android.internal.R.id.media_actions) != null; + boolean isMessagingLayout = layout.getContractedChild() instanceof MessagingLayout; boolean showCompactMediaSeekbar = mMediaManager.getShowCompactMediaSeekbar(); - if (customView && beforeP && !mIsSummaryWithChildren) { - minHeight = beforeN ? mNotificationMinHeightBeforeN : mNotificationMinHeightBeforeP; + if (customView && beforeS && !mIsSummaryWithChildren) { + if (beforeN) { + smallHeight = mMaxSmallHeightBeforeN; + } else if (beforeP) { + smallHeight = mMaxSmallHeightBeforeP; + } else { + smallHeight = mMaxSmallHeightBeforeS; + } } else if (isMediaLayout && showCompactMediaSeekbar) { - minHeight = mNotificationMinHeightMedia; + smallHeight = mMaxSmallHeightMedia; + } else if (isMessagingLayout) { + // TODO(b/173204301): MessagingStyle notifications currently look broken when we enforce + // the standard notification height, so we have to afford them more vertical space to + // make sure we don't crop them terribly. We actually need to revisit this and give + // them a headerless design, then remove this hack. + smallHeight = mMaxSmallHeightLarge; } else if (mUseIncreasedCollapsedHeight && layout == mPrivateLayout) { - minHeight = mNotificationMinHeightLarge; + smallHeight = mMaxSmallHeightLarge; } else { - minHeight = mNotificationMinHeight; + smallHeight = mMaxSmallHeight; } boolean headsUpCustom = layout.getHeadsUpChild() != null && layout.getHeadsUpChild().getId() != com.android.internal.R.id.status_bar_latest_event_content; int headsUpHeight; - if (headsUpCustom && beforeP) { - headsUpHeight = beforeN ? mMaxHeadsUpHeightBeforeN : mMaxHeadsUpHeightBeforeP; + if (headsUpCustom && beforeS) { + if (beforeN) { + headsUpHeight = mMaxHeadsUpHeightBeforeN; + } else if (beforeP) { + headsUpHeight = mMaxHeadsUpHeightBeforeP; + } else { + headsUpHeight = mMaxHeadsUpHeightBeforeS; + } } else if (mUseIncreasedHeadsUpHeight && layout == mPrivateLayout) { headsUpHeight = mMaxHeadsUpHeightIncreased; } else { @@ -679,7 +701,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (headsUpWrapper != null) { headsUpHeight = Math.max(headsUpHeight, headsUpWrapper.getMinLayoutHeight()); } - layout.setHeights(minHeight, headsUpHeight, mNotificationMaxHeight); + layout.setHeights(smallHeight, headsUpHeight, mMaxExpandedHeight); } @NonNull @@ -1598,22 +1620,26 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } private void initDimens() { - mNotificationMinHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, + mMaxSmallHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_legacy); - mNotificationMinHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext, + mMaxSmallHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_before_p); - mNotificationMinHeight = NotificationUtils.getFontScaledHeight(mContext, + mMaxSmallHeightBeforeS = NotificationUtils.getFontScaledHeight(mContext, + R.dimen.notification_min_height_before_s); + mMaxSmallHeight = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height); - mNotificationMinHeightLarge = NotificationUtils.getFontScaledHeight(mContext, + mMaxSmallHeightLarge = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_increased); - mNotificationMinHeightMedia = NotificationUtils.getFontScaledHeight(mContext, + mMaxSmallHeightMedia = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_min_height_media); - mNotificationMaxHeight = NotificationUtils.getFontScaledHeight(mContext, + mMaxExpandedHeight = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_height); mMaxHeadsUpHeightBeforeN = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_heads_up_height_legacy); mMaxHeadsUpHeightBeforeP = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_heads_up_height_before_p); + mMaxHeadsUpHeightBeforeS = NotificationUtils.getFontScaledHeight(mContext, + R.dimen.notification_max_heads_up_height_before_s); mMaxHeadsUpHeight = NotificationUtils.getFontScaledHeight(mContext, R.dimen.notification_max_heads_up_height); mMaxHeadsUpHeightIncreased = NotificationUtils.getFontScaledHeight(mContext, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 79c300782ad9..328774550f24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -318,30 +318,13 @@ public class NotificationContentView extends FrameLayout { // We need to update the expanded and the collapsed header to have exactly the same with to // have the expand buttons laid out at the same location. NotificationHeaderView contractedHeader = mContractedWrapper.getNotificationHeader(); - if (contractedHeader != null) { - if (mExpandedChild != null - && mExpandedWrapper.getNotificationHeader() != null) { - NotificationHeaderView expandedHeader = mExpandedWrapper.getNotificationHeader(); - - int headerTextMargin = expandedHeader.getHeaderTextMarginEnd(); - if (headerTextMargin != contractedHeader.getHeaderTextMarginEnd()) { - contractedHeader.setHeaderTextMarginEnd(headerTextMargin); - return true; - } - } else { - int paddingEnd = mNotificationContentMarginEnd; - if (contractedHeader.getPaddingEnd() != paddingEnd) { - contractedHeader.setPadding( - contractedHeader.isLayoutRtl() - ? paddingEnd - : contractedHeader.getPaddingLeft(), - contractedHeader.getPaddingTop(), - contractedHeader.isLayoutRtl() - ? contractedHeader.getPaddingLeft() - : paddingEnd, - contractedHeader.getPaddingBottom()); - return true; - } + if (contractedHeader != null && mExpandedWrapper != null + && mExpandedWrapper.getNotificationHeader() != null) { + NotificationHeaderView expandedHeader = mExpandedWrapper.getNotificationHeader(); + int headerTextMargin = expandedHeader.getTopLineExtraMarginEnd(); + if (headerTextMargin != contractedHeader.getTopLineExtraMarginEnd()) { + contractedHeader.setTopLineExtraMarginEnd(headerTextMargin); + return true; } } return false; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java index 7248bcef621c..1d36ad3f13d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationBigPictureTemplateViewWrapper.java @@ -40,6 +40,8 @@ public class NotificationBigPictureTemplateViewWrapper extends NotificationTempl public void onContentUpdated(ExpandableNotificationRow row) { super.onContentUpdated(row); updateImageTag(row.getEntry().getSbn()); + // Round the corners of the big picture content + mView.findViewById(com.android.internal.R.id.big_picture).setClipToOutline(true); } private void updateImageTag(StatusBarNotification notification) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt index 17f326b69848..c49f6cbda8ac 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt @@ -50,7 +50,6 @@ class NotificationConversationTemplateViewWrapper constructor( private lateinit var conversationBadgeBg: View private lateinit var expandButton: View private lateinit var expandButtonContainer: View - private lateinit var expandButtonInnerContainer: View private lateinit var imageMessageContainer: ViewGroup private lateinit var messagingLinearLayout: MessagingLinearLayout private lateinit var conversationTitleView: View @@ -70,8 +69,6 @@ class NotificationConversationTemplateViewWrapper constructor( expandButton = requireViewById(com.android.internal.R.id.expand_button) expandButtonContainer = requireViewById(com.android.internal.R.id.expand_button_container) - expandButtonInnerContainer = - requireViewById(com.android.internal.R.id.expand_button_inner_container) importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring) appName = requireViewById(com.android.internal.R.id.app_name_text) conversationTitleView = requireViewById(com.android.internal.R.id.conversation_text) @@ -137,7 +134,7 @@ class NotificationConversationTemplateViewWrapper constructor( ) } - override fun getExpandButton() = expandButtonInnerContainer + override fun getExpandButton() = super.getExpandButton() override fun setShelfIconVisible(visible: Boolean) { if (conversationLayout.isImportantConversation) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java index 5aeacaba6f64..d228ce159d48 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationHeaderViewWrapper.java @@ -28,7 +28,6 @@ import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -63,8 +62,8 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { private TextView mAppNameText; private ImageView mWorkProfileImage; private View mAudiblyAlertedIcon; - private FrameLayout mIconContainer; private View mFeedbackIcon; + private View mRightIcon; private boolean mIsLowPriority; private boolean mTransformLowPriorityTitle; @@ -103,11 +102,11 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { } protected void resolveHeaderViews() { - mIconContainer = mView.findViewById(com.android.internal.R.id.header_icon_container); mIcon = mView.findViewById(com.android.internal.R.id.icon); mHeaderText = mView.findViewById(com.android.internal.R.id.header_text); mAppNameText = mView.findViewById(com.android.internal.R.id.app_name_text); mExpandButton = mView.findViewById(com.android.internal.R.id.expand_button); + mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon); mWorkProfileImage = mView.findViewById(com.android.internal.R.id.profile_badge); mNotificationHeader = mView.findViewById(com.android.internal.R.id.notification_header); mNotificationTopLine = mView.findViewById(com.android.internal.R.id.notification_top_line); @@ -145,6 +144,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { updateCropToPaddingForImageViews(); Notification notification = row.getEntry().getSbn().getNotification(); mIcon.setTag(ImageTransformState.ICON_TAG, notification.getSmallIcon()); + if (mRightIcon != null) { + mRightIcon.setClipToOutline(true); + } // We need to reset all views that are no longer transforming in case a view was previously // transformed, but now we decided to transform its container instead. @@ -165,19 +167,16 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams(); layoutParams.setMarginStart(0); } - if (mIconContainer != null) { - MarginLayoutParams layoutParams = (MarginLayoutParams) mIconContainer.getLayoutParams(); - layoutParams.width = - mIconContainer.getContext().getResources().getDimensionPixelSize( - com.android.internal.R.dimen.conversation_content_start); - final int marginStart = - mIconContainer.getContext().getResources().getDimensionPixelSize( - com.android.internal.R.dimen.notification_content_margin_start); - layoutParams.setMarginStart(marginStart * -1); + if (mNotificationTopLine != null) { + int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.conversation_content_start); + mNotificationTopLine.setPaddingStart(paddingStart); } if (mIcon != null) { MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams(); - layoutParams.setMarginEnd(0); + int marginStart = mIcon.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.conversation_icon_circle_start); + layoutParams.setMarginStart(marginStart); } } @@ -189,20 +188,20 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { com.android.internal.R.style.TextAppearance_DeviceDefault_Notification_Info); mAppNameText.setTextAppearance(textAppearance); MarginLayoutParams layoutParams = (MarginLayoutParams) mAppNameText.getLayoutParams(); - final int marginStart = mAppNameText.getContext().getResources().getDimensionPixelSize( + final int marginStart = mAppNameText.getResources().getDimensionPixelSize( com.android.internal.R.dimen.notification_header_app_name_margin_start); layoutParams.setMarginStart(marginStart); } - if (mIconContainer != null) { - MarginLayoutParams layoutParams = (MarginLayoutParams) mIconContainer.getLayoutParams(); - layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT; - layoutParams.setMarginStart(0); + if (mNotificationTopLine != null) { + int paddingStart = mNotificationTopLine.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin_start); + mNotificationTopLine.setPaddingStart(paddingStart); } if (mIcon != null) { MarginLayoutParams layoutParams = (MarginLayoutParams) mIcon.getLayoutParams(); - final int marginEnd = mIcon.getContext().getResources().getDimensionPixelSize( - com.android.internal.R.dimen.notification_header_icon_margin_end); - layoutParams.setMarginEnd(marginEnd); + int marginStart = mIcon.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_icon_circle_start); + layoutParams.setMarginStart(marginStart); } } @@ -241,8 +240,9 @@ public class NotificationHeaderViewWrapper extends NotificationViewWrapper { protected void updateTransformedTypes() { mTransformationHelper.reset(); - mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_ICON, - mIcon); + mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_ICON, mIcon); + mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_EXPANDER, + mExpandButton); mTransformationHelper.addViewTransformingToSimilar(mWorkProfileImage); if (mIsLowPriority && mHeaderText != null) { mTransformationHelper.addTransformedView(TransformableView.TRANSFORMING_VIEW_TITLE, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java index 76ec59e0ec28..e9934c0053b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java @@ -16,14 +16,14 @@ package com.android.systemui.statusbar.notification.row.wrapper; +import static android.view.View.VISIBLE; + import static com.android.systemui.statusbar.notification.row.ExpandableNotificationRow.DEFAULT_HEADER_VISIBLE_AMOUNT; import android.app.PendingIntent; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; -import android.graphics.PorterDuffColorFilter; -import android.graphics.drawable.Drawable; import android.service.notification.StatusBarNotification; import android.util.ArraySet; import android.view.View; @@ -56,7 +56,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp private TextView mTitle; private TextView mText; protected View mActionsContainer; - private ImageView mReplyAction; private int mContentHeight; private int mMinHeightHint; @@ -64,6 +63,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp private ArraySet<PendingIntent> mCancelledPendingIntents = new ArraySet<>(); private UiOffloadThread mUiOffloadThread; private View mRemoteInputHistory; + private boolean mCanHideHeader; private float mHeaderTranslation; protected NotificationTemplateViewWrapper(Context ctx, View view, @@ -156,7 +156,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp } mActionsContainer = mView.findViewById(com.android.internal.R.id.actions_container); mActions = mView.findViewById(com.android.internal.R.id.actions); - mReplyAction = mView.findViewById(com.android.internal.R.id.reply_icon_action); mRemoteInputHistory = mView.findViewById( com.android.internal.R.id.notification_material_reply_container); updatePendingIntentCancellations(); @@ -190,31 +189,6 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp }); } } - if (mReplyAction != null) { - // Let's reset the view on update, assuming the new pending intent isn't cancelled - // anymore. The color filter automatically resets when it's updated. - mReplyAction.setEnabled(true); - performOnPendingIntentCancellation(mReplyAction, () -> { - if (mReplyAction != null && mReplyAction.isEnabled()) { - mReplyAction.setEnabled(false); - // The visual appearance doesn't look disabled enough yet, let's add the - // alpha as well. Since Alpha doesn't play nicely right now with the - // transformation, we rather blend it manually with the background color. - Drawable drawable = mReplyAction.getDrawable().mutate(); - PorterDuffColorFilter colorFilter = - (PorterDuffColorFilter) drawable.getColorFilter(); - float disabledAlpha = mView.getResources().getFloat( - com.android.internal.R.dimen.notification_action_disabled_alpha); - if (colorFilter != null) { - int color = colorFilter.getColor(); - color = blendColorWithBackground(color, disabledAlpha); - drawable.mutate().setColorFilter(color, colorFilter.getMode()); - } else { - mReplyAction.setAlpha(disabledAlpha); - } - } - }); - } } private int blendColorWithBackground(int color, float alpha) { @@ -260,21 +234,15 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp } @Override - public boolean disallowSingleClick(float x, float y) { - if (mReplyAction != null && mReplyAction.getVisibility() == View.VISIBLE) { - if (isOnView(mReplyAction, x, y) || isOnView(mPicture, x, y)) { - return true; - } - } - return super.disallowSingleClick(x, y); - } - - @Override public void onContentUpdated(ExpandableNotificationRow row) { // Reinspect the notification. Before the super call, because the super call also updates // the transformation types and we need to have our values set by then. resolveTemplateViews(row.getEntry().getSbn()); super.onContentUpdated(row); + // With the modern templates, a large icon visually overlaps the header, so we can't + // simply hide the header -- just show the + mCanHideHeader = mNotificationHeader != null + && (mPicture == null || mPicture.getVisibility() != VISIBLE); if (row.getHeaderVisibleAmount() != DEFAULT_HEADER_VISIBLE_AMOUNT) { setHeaderVisibleAmount(row.getHeaderVisibleAmount()); } @@ -333,14 +301,14 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp @Override public int getHeaderTranslation(boolean forceNoHeader) { - return forceNoHeader ? mFullHeaderTranslation : (int) mHeaderTranslation; + return forceNoHeader && mCanHideHeader ? mFullHeaderTranslation : (int) mHeaderTranslation; } @Override public void setHeaderVisibleAmount(float headerVisibleAmount) { super.setHeaderVisibleAmount(headerVisibleAmount); float headerTranslation = 0f; - if (mNotificationHeader != null) { + if (mCanHideHeader && mNotificationHeader != null) { mNotificationHeader.setAlpha(headerVisibleAmount); headerTranslation = (1.0f - headerVisibleAmount) * mFullHeaderTranslation; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 5c225e5a3529..7508dcb487ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -256,10 +256,9 @@ public class KeyguardClockPositionAlgorithm { // TODO(b/12836565) - prototyping only adjustment if (mLockScreenMode != KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL) { - // This will keep the clock at the top for AOD - return (int) (clockY + burnInPreventionOffsetY() + mEmptyDragAmount); + // This will keep the clock at the top + clockYDark = (int) (clockY + burnInPreventionOffsetY()); } - return (int) (MathUtils.lerp(clockY, clockYDark, darkAmount) + mEmptyDragAmount); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 193c96373f68..c936e82c2a16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -221,6 +221,7 @@ public class NotificationPanelViewController extends PanelViewController { @Override public void onLockScreenModeChanged(int mode) { + mLockScreenMode = mode; mClockPositionAlgorithm.onLockScreenModeChanged(mode); } @@ -472,6 +473,8 @@ public class NotificationPanelViewController extends PanelViewController { private int mOldLayoutDirection; private NotificationShelfController mNotificationShelfController; + private int mLockScreenMode = KeyguardUpdateMonitor.LOCK_SCREEN_MODE_NORMAL; + private View.AccessibilityDelegate mAccessibilityDelegate = new View.AccessibilityDelegate() { @Override public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { @@ -872,8 +875,10 @@ public class NotificationPanelViewController extends PanelViewController { mNotificationStackScrollLayoutController.getIntrinsicContentHeight(), getExpandedFraction(), totalHeight, - (int) (mKeyguardStatusViewController.getHeight() - - mShelfHeight / 2.0f - mDarkIconSize / 2.0f), + mLockScreenMode == KeyguardUpdateMonitor.LOCK_SCREEN_MODE_LAYOUT_1 + ? mKeyguardStatusViewController.getHeight() + : (int) (mKeyguardStatusViewController.getHeight() + - mShelfHeight / 2.0f - mDarkIconSize / 2.0f), clockPreferredY, hasCustomClock(), hasVisibleNotifications, mInterpolatedDarkAmount, mEmptyDragAmount, bypassEnabled, getUnlockedStackScrollerPadding(), diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 51cbff8f309b..36baf68d8af6 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -448,7 +448,7 @@ public class KeyguardUpdateMonitorTest extends SysuiTestCase { mKeyguardUpdateMonitor.dispatchStartedGoingToSleep(0 /* why */); mTestableLooper.processAllMessages(); - verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt()); + verify(mFingerprintManager).authenticate(any(), any(), any(), any(), anyInt(), anyInt()); verify(mFingerprintManager, never()).detectFingerprint(any(), any(), anyInt()); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt index 516d015c0c1c..2e8eb0014f30 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/TextAnimatorTest.kt @@ -35,9 +35,9 @@ import org.mockito.Mockito.verify import kotlin.math.ceil -private val PAINT = TextPaint().apply { +private val PAINT = arrayListOf(TextPaint().apply { textSize = 32f -} +}) @RunWith(AndroidTestingRunner::class) @SmallTest @@ -50,10 +50,10 @@ class TextAnimatorTest : SysuiTestCase() { @Test fun testAnimationStarted() { - val layout = makeLayout("Hello, World", PAINT) + val layout = makeLayout("Hello, World", PAINT[0]) val valueAnimator = mock(ValueAnimator::class.java) val textInterpolator = mock(TextInterpolator::class.java) - val paint = mock(Paint::class.java) + val paint = arrayListOf(mock(Paint::class.java)) `when`(textInterpolator.targetPaint).thenReturn(paint) val textAnimator = TextAnimator(layout, {}).apply { @@ -82,10 +82,10 @@ class TextAnimatorTest : SysuiTestCase() { @Test fun testAnimationNotStarted() { - val layout = makeLayout("Hello, World", PAINT) + val layout = makeLayout("Hello, World", PAINT[0]) val valueAnimator = mock(ValueAnimator::class.java) val textInterpolator = mock(TextInterpolator::class.java) - val paint = mock(Paint::class.java) + val paint = arrayListOf(mock(Paint::class.java)) `when`(textInterpolator.targetPaint).thenReturn(paint) val textAnimator = TextAnimator(layout, {}).apply { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt index 65ffcfc47380..002ba364e9d4 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/TextInterpolatorTest.kt @@ -18,6 +18,7 @@ package com.android.keyguard import android.graphics.Bitmap import android.graphics.Canvas +import android.graphics.Paint import android.testing.AndroidTestingRunner import android.text.Layout import android.text.StaticLayout @@ -37,13 +38,13 @@ private val PAINT = TextPaint().apply { textSize = 32f } -private val START_PAINT = TextPaint(PAINT).apply { +private val START_PAINT = arrayListOf<Paint>(TextPaint(PAINT).apply { fontVariationSettings = "'wght' 400" -} +}) -private val END_PAINT = TextPaint(PAINT).apply { +private val END_PAINT = arrayListOf<Paint>(TextPaint(PAINT).apply { fontVariationSettings = "'wght' 700" -} +}) @RunWith(AndroidTestingRunner::class) @SmallTest @@ -59,16 +60,16 @@ class TextInterpolatorTest : SysuiTestCase() { val layout = makeLayout(TEXT, PAINT) val interp = TextInterpolator(layout) - interp.basePaint.set(START_PAINT) + TextInterpolator.updatePaint(interp.basePaint, START_PAINT) interp.onBasePaintModified() - interp.targetPaint.set(END_PAINT) + TextInterpolator.updatePaint(interp.targetPaint, END_PAINT) interp.onTargetPaintModified() // Just after created TextInterpolator, it should have 0 progress. assertThat(interp.progress).isEqualTo(0f) val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT) - val expected = makeLayout(TEXT, START_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT) + val expected = makeLayout(TEXT, START_PAINT[0] as TextPaint).toBitmap(BMP_WIDTH, BMP_HEIGHT) assertThat(expected.sameAs(actual)).isTrue() } @@ -78,15 +79,15 @@ class TextInterpolatorTest : SysuiTestCase() { val layout = makeLayout(TEXT, PAINT) val interp = TextInterpolator(layout) - interp.basePaint.set(START_PAINT) + TextInterpolator.updatePaint(interp.basePaint, START_PAINT) interp.onBasePaintModified() - interp.targetPaint.set(END_PAINT) + TextInterpolator.updatePaint(interp.targetPaint, END_PAINT) interp.onTargetPaintModified() interp.progress = 1f val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT) - val expected = makeLayout(TEXT, END_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT) + val expected = makeLayout(TEXT, END_PAINT[0] as TextPaint).toBitmap(BMP_WIDTH, BMP_HEIGHT) assertThat(expected.sameAs(actual)).isTrue() } @@ -96,10 +97,10 @@ class TextInterpolatorTest : SysuiTestCase() { val layout = makeLayout(TEXT, PAINT) val interp = TextInterpolator(layout) - interp.basePaint.set(START_PAINT) + TextInterpolator.updatePaint(interp.basePaint, START_PAINT) interp.onBasePaintModified() - interp.targetPaint.set(END_PAINT) + TextInterpolator.updatePaint(interp.targetPaint, END_PAINT) interp.onTargetPaintModified() // We cannot expect exact text layout of the middle position since we don't use text shaping @@ -107,10 +108,10 @@ class TextInterpolatorTest : SysuiTestCase() { // end state. interp.progress = 0.5f val actual = interp.toBitmap(BMP_WIDTH, BMP_HEIGHT) - assertThat(actual.sameAs(makeLayout(TEXT, START_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT))) - .isFalse() - assertThat(actual.sameAs(makeLayout(TEXT, END_PAINT).toBitmap(BMP_WIDTH, BMP_HEIGHT))) - .isFalse() + assertThat(actual.sameAs(makeLayout(TEXT, START_PAINT[0] as TextPaint) + .toBitmap(BMP_WIDTH, BMP_HEIGHT))).isFalse() + assertThat(actual.sameAs(makeLayout(TEXT, END_PAINT[0] as TextPaint) + .toBitmap(BMP_WIDTH, BMP_HEIGHT))).isFalse() } @Test @@ -118,10 +119,10 @@ class TextInterpolatorTest : SysuiTestCase() { val layout = makeLayout(TEXT, PAINT) val interp = TextInterpolator(layout) - interp.basePaint.set(START_PAINT) + TextInterpolator.updatePaint(interp.basePaint, START_PAINT) interp.onBasePaintModified() - interp.targetPaint.set(END_PAINT) + TextInterpolator.updatePaint(interp.targetPaint, END_PAINT) interp.onTargetPaintModified() interp.progress = 0.5f diff --git a/packages/SystemUI/tools/lint/baseline.xml b/packages/SystemUI/tools/lint/baseline.xml index 096a63901b9d..3e494032b8e2 100644 --- a/packages/SystemUI/tools/lint/baseline.xml +++ b/packages/SystemUI/tools/lint/baseline.xml @@ -2909,17 +2909,6 @@ <issue id="UnusedResources" - message="The resource `R.dimen.notification_header_height` appears to be unused" - errorLine1=" <dimen name="notification_header_height">53dp</dimen>" - errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> - <location - file="res/values/dimens.xml" - line="473" - column="12"/> - </issue> - - <issue - id="UnusedResources" message="The resource `R.dimen.speed_bump_height` appears to be unused" errorLine1=" <dimen name="speed_bump_height">16dp</dimen>" errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> diff --git a/services/core/Android.bp b/services/core/Android.bp index b409bca0f90d..4bde31fc2f05 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -83,6 +83,7 @@ java_library_static { libs: [ "services.net", "android.hardware.light-V2.0-java", + "android.hardware.gnss-java", "android.hardware.power-java", "android.hardware.power-V1.0-java", "android.hardware.vibrator-java", diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index af0935fa799a..6e91c9a61d42 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -40,6 +40,7 @@ import android.hardware.biometrics.ITestSession; import android.hardware.biometrics.fingerprint.IFingerprint; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.fingerprint.Fingerprint; +import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintClientActiveCallback; import android.hardware.fingerprint.IFingerprintService; @@ -215,8 +216,10 @@ public class FingerprintService extends SystemService implements BiometricServic provider.second.cancelEnrollment(provider.first, token); } + @SuppressWarnings("deprecation") @Override // Binder call - public void authenticate(final IBinder token, final long operationId, final int userId, + public void authenticate(final IBinder token, final long operationId, + @FingerprintManager.SensorId final int sensorId, final int userId, final IFingerprintServiceReceiver receiver, final String opPackageName) { final int callingUid = Binder.getCallingUid(); final int callingPid = Binder.getCallingPid(); @@ -251,7 +254,13 @@ public class FingerprintService extends SystemService implements BiometricServic final int statsClient = isKeyguard ? BiometricsProtoEnums.CLIENT_KEYGUARD : BiometricsProtoEnums.CLIENT_FINGERPRINT_MANAGER; - final Pair<Integer, ServiceProvider> provider = getSingleProvider(); + final Pair<Integer, ServiceProvider> provider; + if (sensorId == FingerprintManager.SENSOR_ID_ANY) { + provider = getSingleProvider(); + } else { + Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); + provider = new Pair<>(sensorId, getProviderForSensor(sensorId)); + } if (provider == null) { Slog.w(TAG, "Null provider for authenticate"); return; diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index aefe8f8c8d70..4d959d08d3ef 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -2407,7 +2407,14 @@ public class Vpn { .addTransportType(NetworkCapabilities.TRANSPORT_TEST) .build(); } else { - req = cm.getDefaultRequest(); + // Basically, the request here is referring to the default request which is defined + // in ConnectivityService. Ideally, ConnectivityManager should provide an new API + // which can provide the status of physical network even though there is a virtual + // network. b/147280869 is used for tracking the new API. + // TODO: Use the new API to register default physical network. + req = new NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .build(); } cm.requestNetwork(req, mNetworkCallback); diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 6dd91e533a87..2d7f62d90914 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -15,6 +15,8 @@ package com.android.server.inputmethod; +import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_CRITICAL; +import static android.os.IServiceManager.DUMP_FLAG_PROTO; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.server.inputmethod.InputMethodManagerServiceProto.ACCESSIBILITY_REQUESTING_NO_SOFT_KEYBOARD; import static android.server.inputmethod.InputMethodManagerServiceProto.BACK_DISPOSITION; @@ -40,13 +42,9 @@ import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_FOR import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_IME_WITH_HARD_KEYBOARD; import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_REQUESTED; import static android.server.inputmethod.InputMethodManagerServiceProto.SYSTEM_READY; +import static android.util.imetracing.ImeTracing.IME_TRACING_FROM_IMMS; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.CLIENTS; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.ELAPSED_REALTIME_NANOS; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.INPUT_METHOD_MANAGER_SERVICE; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorProto.INPUT_METHOD_SERVICE; -import static android.view.inputmethod.InputMethodEditorTraceProto.InputMethodEditorTraceFileProto.ENTRY; import static java.lang.annotation.RetentionPolicy.SOURCE; @@ -97,7 +95,6 @@ import android.os.Binder; import android.os.Bundle; import android.os.Debug; import android.os.Handler; -import android.os.HandlerThread; import android.os.IBinder; import android.os.IInterface; import android.os.LocaleList; @@ -145,6 +142,12 @@ import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputConnectionInspector; import android.view.inputmethod.InputConnectionInspector.MissingMethodFlags; import android.view.inputmethod.InputMethod; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceFileProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodClientsTraceProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodManagerServiceTraceFileProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodManagerServiceTraceProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodServiceTraceFileProto; +import android.view.inputmethod.InputMethodEditorTraceProto.InputMethodServiceTraceProto; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; @@ -160,6 +163,7 @@ import com.android.internal.inputmethod.StartInputReason; import com.android.internal.inputmethod.UnbindReason; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; +import com.android.internal.os.BackgroundThread; import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; import com.android.internal.os.TransferPipe; @@ -207,6 +211,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub implements ServiceConnection, Handler.Callback { static final boolean DEBUG = false; static final String TAG = "InputMethodManagerService"; + public static final String PROTO_ARG = "--proto"; @Retention(SOURCE) @IntDef({ShellCommandResult.SUCCESS, ShellCommandResult.FAILURE}) @@ -734,8 +739,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub private final IPackageManager mIPackageManager; private final String mSlotIme; - private HandlerThread mTracingThread; - /** * Registered {@link InputMethodListListener}. * This variable can be accessed from both of MainThread and BinderThread. @@ -1575,7 +1578,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub public void onStart() { LocalServices.addService(InputMethodManagerInternal.class, new LocalServiceImpl(mService)); - publishBinderService(Context.INPUT_METHOD_SERVICE, mService); + publishBinderService(Context.INPUT_METHOD_SERVICE, mService, false /*allowIsolated*/, + DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO); } @Override @@ -1707,9 +1711,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mSwitchingController = InputMethodSubtypeSwitchingController.createInstanceLocked( mSettings, context); mMenuController = new InputMethodMenuController(this); - - mTracingThread = new HandlerThread("android.tracing", Process.THREAD_PRIORITY_FOREGROUND); - mTracingThread.start(); } private void resetDefaultImeLocked(Context context) { @@ -3110,6 +3111,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub ResultReceiver resultReceiver) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.showSoftInput"); int uid = Binder.getCallingUid(); + ImeTracing.getInstance().triggerManagerServiceDump( + "InputMethodManagerService#showSoftInput"); synchronized (mMethodMap) { if (!calledFromValidUserLocked()) { return false; @@ -3223,6 +3226,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub public boolean hideSoftInput(IInputMethodClient client, IBinder windowToken, int flags, ResultReceiver resultReceiver) { int uid = Binder.getCallingUid(); + ImeTracing.getInstance().triggerManagerServiceDump( + "InputMethodManagerService#hideSoftInput"); synchronized (mMethodMap) { if (!calledFromValidUserLocked()) { return false; @@ -3319,6 +3324,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub try { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMMS.startInputOrWindowGainedFocus"); + ImeTracing.getInstance().triggerManagerServiceDump( + "InputMethodManagerService#startInputOrWindowGainedFocus"); final int callingUserId = UserHandle.getCallingUserId(); final int userId; if (attribute != null && attribute.targetInputMethodUser != null @@ -4019,58 +4026,48 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @BinderThread @Override @GuardedBy("mMethodMap") - public void startProtoDump(byte[] clientProtoDump) { - mTracingThread.getThreadHandler().post(() -> { - if (!ImeTracing.getInstance().isAvailable() || !ImeTracing.getInstance().isEnabled()) { - return; - } - if (clientProtoDump == null && mCurClient == null) { - return; - } - - ProtoOutputStream proto = new ProtoOutputStream(); - final long token = proto.start(ENTRY); - proto.write(ELAPSED_REALTIME_NANOS, SystemClock.elapsedRealtimeNanos()); - dumpDebug(proto, INPUT_METHOD_MANAGER_SERVICE); - - IBinder service = null; - synchronized (mMethodMap) { - if (mCurMethod != null) { - service = mCurMethod.asBinder(); - } - } - - if (service != null) { - try { - proto.write(INPUT_METHOD_SERVICE, - TransferPipe.dumpAsync(service, ImeTracing.PROTO_ARG)); - } catch (IOException | RemoteException e) { - Log.e(TAG, "Exception while collecting ime process dump", e); - } - } - - if (clientProtoDump != null) { - proto.write(CLIENTS, clientProtoDump); - } else { - IBinder client = null; - synchronized (mMethodMap) { - if (mCurClient != null && mCurClient.client != null) { - client = mCurClient.client.asBinder(); - } - } + public void startProtoDump(byte[] protoDump, int source, String where) { + if (protoDump == null && source != IME_TRACING_FROM_IMMS) { + // Dump not triggered from IMMS, but no proto information provided. + return; + } + ImeTracing tracingInstance = ImeTracing.getInstance(); + if (!tracingInstance.isAvailable() || !tracingInstance.isEnabled()) { + return; + } - if (client != null) { - try { - proto.write(CLIENTS, - TransferPipe.dumpAsync(client, ImeTracing.PROTO_ARG)); - } catch (IOException | RemoteException e) { - Log.e(TAG, "Exception while collecting client side ime dump", e); - } - } - } - proto.end(token); - ImeTracing.getInstance().addToBuffer(proto); - }); + ProtoOutputStream proto = new ProtoOutputStream(); + switch (source) { + case ImeTracing.IME_TRACING_FROM_CLIENT: + final long client_token = proto.start(InputMethodClientsTraceFileProto.ENTRY); + proto.write(InputMethodClientsTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodClientsTraceProto.WHERE, where); + proto.write(InputMethodClientsTraceProto.CLIENT, protoDump); + proto.end(client_token); + break; + case ImeTracing.IME_TRACING_FROM_IMS: + final long service_token = proto.start(InputMethodServiceTraceFileProto.ENTRY); + proto.write(InputMethodServiceTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodServiceTraceProto.WHERE, where); + proto.write(InputMethodServiceTraceProto.INPUT_METHOD_SERVICE, protoDump); + proto.end(service_token); + break; + case IME_TRACING_FROM_IMMS: + final long managerservice_token = + proto.start(InputMethodManagerServiceTraceFileProto.ENTRY); + proto.write(InputMethodManagerServiceTraceProto.ELAPSED_REALTIME_NANOS, + SystemClock.elapsedRealtimeNanos()); + proto.write(InputMethodManagerServiceTraceProto.WHERE, where); + dumpDebug(proto, InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE); + proto.end(managerservice_token); + break; + default: + // Dump triggered by a source not recognised. + return; + } + tracingInstance.addToBuffer(proto, source); } @BinderThread @@ -5102,8 +5099,37 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + boolean asProto = false; + for (int argIndex = 0; argIndex < args.length; argIndex++) { + if (args[argIndex].equals(PROTO_ARG)) { + asProto = true; + break; + } + } + + if (asProto) { + final ImeTracing imeTracing = ImeTracing.getInstance(); + if (imeTracing.isEnabled()) { + imeTracing.stopTrace(null, false /* writeToFile */); + BackgroundThread.getHandler().post(() -> { + imeTracing.writeTracesToFiles(); + imeTracing.startTrace(null); + }); + } + } + doDump(fd, pw, args, asProto); + } + + private void doDump(FileDescriptor fd, PrintWriter pw, String[] args, boolean useProto) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; + if (useProto) { + final ProtoOutputStream proto = new ProtoOutputStream(fd); + dumpDebug(proto, InputMethodManagerServiceTraceProto.INPUT_METHOD_MANAGER_SERVICE); + proto.flush(); + return; + } + IInputMethod method; ClientState client; ClientState focusedWindowClient; diff --git a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java index a6ca25b0e6c1..7af27ca46f68 100644 --- a/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/MultiClientInputMethodManagerService.java @@ -1808,12 +1808,12 @@ public final class MultiClientInputMethodManagerService { @BinderThread @Override - public void startProtoDump(byte[] clientProtoDump) throws RemoteException { + public void startProtoDump(byte[] clientProtoDump, int source, String where) { } @BinderThread @Override - public boolean isImeTraceEnabled() throws RemoteException { + public boolean isImeTraceEnabled() { return false; } } diff --git a/services/core/java/com/android/server/location/LocationShellCommand.java b/services/core/java/com/android/server/location/LocationShellCommand.java index 909873f07993..8c1afab00b9a 100644 --- a/services/core/java/com/android/server/location/LocationShellCommand.java +++ b/services/core/java/com/android/server/location/LocationShellCommand.java @@ -88,5 +88,6 @@ class LocationShellCommand extends BasicShellCommandHandler { pw.println(" force_time_injection - requests NTP time injection to chipset"); pw.println(" force_psds_injection - " + "requests predictive aiding data injection to chipset"); + pw.println(" request_power_stats - requests GNSS power stats update from chipset"); } } diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index e9ffb47275dc..ceac10d717e4 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -363,6 +363,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private final GnssMeasurementCorrectionsProvider mGnssMeasurementCorrectionsProvider; private final GnssAntennaInfoProvider mGnssAntennaInfoProvider; private final GnssNavigationMessageProvider mGnssNavigationMessageProvider; + private final GnssPowerIndicationProvider mGnssPowerIndicationProvider; private final NtpTimeHelper mNtpTimeHelper; private final GnssGeofenceProvider mGnssGeofenceProvider; private final GnssCapabilitiesProvider mGnssCapabilitiesProvider; @@ -534,6 +535,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mGnssMeasurementCorrectionsProvider = new GnssMeasurementCorrectionsProvider(mHandler); mGnssAntennaInfoProvider = new GnssAntennaInfoProvider(injector); mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(injector); + mGnssPowerIndicationProvider = new GnssPowerIndicationProvider(); mGnssMetrics = new GnssMetrics(mContext, mBatteryStats); mNtpTimeHelper = new NtpTimeHelper(mContext, mHandler.getLooper(), this); @@ -1128,6 +1130,8 @@ public class GnssLocationProvider extends AbstractLocationProvider implements downloadPsdsData(/* psdsType= */ GnssPsdsDownloader.LONG_TERM_PSDS_SERVER_INDEX); } + } else if ("request_power_stats".equals(command)) { + GnssPowerIndicationProvider.requestPowerStats(); } else { Log.w(TAG, "sendExtraCommand: unknown command " + command); } @@ -1455,6 +1459,10 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } } + void reportGnssPowerStats(GnssPowerStats powerStats) { + mHandler.post(() -> mGnssPowerIndicationProvider.onGnssPowerStatsAvailable(powerStats)); + } + void setTopHalCapabilities(int topHalCapabilities) { mHandler.post(() -> { mTopHalCapabilities = topHalCapabilities; @@ -1481,6 +1489,15 @@ public class GnssLocationProvider extends AbstractLocationProvider implements }); } + /** + * Sets the capabilities bits for IGnssPowerIndication HAL. + * + * These capabilities are defined in IGnssPowerIndicationCallback.aidl. + */ + void setSubHalPowerIndicationCapabilities(int subHalCapabilities) { + mHandler.post(() -> mGnssPowerIndicationProvider.onCapabilitiesUpdated(subHalCapabilities)); + } + private void restartRequests() { Log.i(TAG, "restartRequests"); @@ -1965,44 +1982,40 @@ public class GnssLocationProvider extends AbstractLocationProvider implements } } - StringBuilder s = new StringBuilder(); - s.append("mStarted=").append(mStarted).append(" (changed "); + pw.print("mStarted=" + mStarted + " (changed "); TimeUtils.formatDuration(SystemClock.elapsedRealtime() - - mStartedChangedElapsedRealtime, s); - s.append(" ago)").append('\n'); - s.append("mBatchingEnabled=").append(mBatchingEnabled).append('\n'); - s.append("mBatchingStarted=").append(mBatchingStarted).append('\n'); - s.append("mBatchSize=").append(getBatchSize()).append('\n'); - s.append("mFixInterval=").append(mFixInterval).append('\n'); - s.append("mTopHalCapabilities=0x").append(Integer.toHexString(mTopHalCapabilities)); - s.append(" ( "); - if (hasCapability(GPS_CAPABILITY_SCHEDULING)) s.append("SCHEDULING "); - if (hasCapability(GPS_CAPABILITY_MSB)) s.append("MSB "); - if (hasCapability(GPS_CAPABILITY_MSA)) s.append("MSA "); - if (hasCapability(GPS_CAPABILITY_SINGLE_SHOT)) s.append("SINGLE_SHOT "); - if (hasCapability(GPS_CAPABILITY_ON_DEMAND_TIME)) s.append("ON_DEMAND_TIME "); - if (hasCapability(GPS_CAPABILITY_GEOFENCING)) s.append("GEOFENCING "); - if (hasCapability(GPS_CAPABILITY_MEASUREMENTS)) s.append("MEASUREMENTS "); - if (hasCapability(GPS_CAPABILITY_NAV_MESSAGES)) s.append("NAV_MESSAGES "); - if (hasCapability(GPS_CAPABILITY_LOW_POWER_MODE)) s.append("LOW_POWER_MODE "); - if (hasCapability(GPS_CAPABILITY_SATELLITE_BLOCKLIST)) s.append("SATELLITE_BLOCKLIST "); + - mStartedChangedElapsedRealtime, pw); + pw.println(" ago)"); + pw.println("mBatchingEnabled=" + mBatchingEnabled); + pw.println("mBatchingStarted=" + mBatchingStarted); + pw.println("mBatchSize=" + getBatchSize()); + pw.println("mFixInterval=" + mFixInterval); + mGnssPowerIndicationProvider.dump(fd, pw, args); + pw.print("mTopHalCapabilities=0x" + Integer.toHexString(mTopHalCapabilities) + " ( "); + if (hasCapability(GPS_CAPABILITY_SCHEDULING)) pw.print("SCHEDULING "); + if (hasCapability(GPS_CAPABILITY_MSB)) pw.print("MSB "); + if (hasCapability(GPS_CAPABILITY_MSA)) pw.print("MSA "); + if (hasCapability(GPS_CAPABILITY_SINGLE_SHOT)) pw.print("SINGLE_SHOT "); + if (hasCapability(GPS_CAPABILITY_ON_DEMAND_TIME)) pw.print("ON_DEMAND_TIME "); + if (hasCapability(GPS_CAPABILITY_GEOFENCING)) pw.print("GEOFENCING "); + if (hasCapability(GPS_CAPABILITY_MEASUREMENTS)) pw.print("MEASUREMENTS "); + if (hasCapability(GPS_CAPABILITY_NAV_MESSAGES)) pw.print("NAV_MESSAGES "); + if (hasCapability(GPS_CAPABILITY_LOW_POWER_MODE)) pw.print("LOW_POWER_MODE "); + if (hasCapability(GPS_CAPABILITY_SATELLITE_BLOCKLIST)) pw.print("SATELLITE_BLOCKLIST "); if (hasCapability(GPS_CAPABILITY_MEASUREMENT_CORRECTIONS)) { - s.append("MEASUREMENT_CORRECTIONS "); + pw.print("MEASUREMENT_CORRECTIONS "); } - if (hasCapability(GPS_CAPABILITY_ANTENNA_INFO)) s.append("ANTENNA_INFO "); - s.append(")\n"); + if (hasCapability(GPS_CAPABILITY_ANTENNA_INFO)) pw.print("ANTENNA_INFO "); + pw.println(")"); if (hasCapability(GPS_CAPABILITY_MEASUREMENT_CORRECTIONS)) { - s.append("SubHal=MEASUREMENT_CORRECTIONS["); - s.append(mGnssMeasurementCorrectionsProvider.toStringCapabilities()); - s.append("]\n"); + pw.println("SubHal=MEASUREMENT_CORRECTIONS[" + + mGnssMeasurementCorrectionsProvider.toStringCapabilities() + "]"); } - s.append(mGnssMetrics.dumpGnssMetricsAsText()); + pw.print(mGnssMetrics.dumpGnssMetricsAsText()); if (dumpAll) { - s.append("native internal state: \n"); - s.append(" ").append(native_get_internal_state()); - s.append("\n"); + pw.println("native internal state: "); + pw.println(" " + native_get_internal_state()); } - pw.append(s); } // preallocated to avoid memory allocation in reportNmea() diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java index 26804f3f39cf..326265f4f87d 100644 --- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java +++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java @@ -334,6 +334,11 @@ public class GnssManagerService implements GnssNative.Callbacks { } @Override + public void reportGnssPowerStats(GnssPowerStats powerStats) { + mGnssLocationProvider.reportGnssPowerStats(powerStats); + } + + @Override public void setTopHalCapabilities(int topHalCapabilities) { mGnssLocationProvider.setTopHalCapabilities(topHalCapabilities); } @@ -344,6 +349,11 @@ public class GnssManagerService implements GnssNative.Callbacks { } @Override + public void setSubHalPowerIndicationCapabilities(int subHalCapabilities) { + mGnssLocationProvider.setSubHalPowerIndicationCapabilities(subHalCapabilities); + } + + @Override public void setGnssYearOfHardware(int yearOfHardware) { mGnssLocationProvider.setGnssYearOfHardware(yearOfHardware); } diff --git a/services/core/java/com/android/server/location/gnss/GnssNative.java b/services/core/java/com/android/server/location/gnss/GnssNative.java index 3933f9a6cbd0..4494c191a16b 100644 --- a/services/core/java/com/android/server/location/gnss/GnssNative.java +++ b/services/core/java/com/android/server/location/gnss/GnssNative.java @@ -48,8 +48,10 @@ class GnssNative { void reportMeasurementData(GnssMeasurementsEvent event); void reportAntennaInfo(List<GnssAntennaInfo> antennaInfos); void reportNavigationMessage(GnssNavigationMessage event); + void reportGnssPowerStats(GnssPowerStats powerStats); void setTopHalCapabilities(int topHalCapabilities); void setSubHalMeasurementCorrectionsCapabilities(int subHalCapabilities); + void setSubHalPowerIndicationCapabilities(int subHalCapabilities); void setGnssYearOfHardware(int yearOfHardware); void setGnssHardwareModelName(String modelName); void reportGnssServiceRestarted(); @@ -179,6 +181,11 @@ class GnssNative { } @NativeEntryPoint + private void reportGnssPowerStats(GnssPowerStats powerStats) { + mCallbacks.reportGnssPowerStats(powerStats); + } + + @NativeEntryPoint private void setTopHalCapabilities(int topHalCapabilities) { mCallbacks.setTopHalCapabilities(topHalCapabilities); } @@ -189,6 +196,11 @@ class GnssNative { } @NativeEntryPoint + private void setSubHalPowerIndicationCapabilities(int subHalCapabilities) { + mCallbacks.setSubHalPowerIndicationCapabilities(subHalCapabilities); + } + + @NativeEntryPoint private void setGnssYearOfHardware(int yearOfHardware) { mCallbacks.setGnssYearOfHardware(yearOfHardware); } diff --git a/services/core/java/com/android/server/location/gnss/GnssPowerIndicationProvider.java b/services/core/java/com/android/server/location/gnss/GnssPowerIndicationProvider.java new file mode 100644 index 000000000000..5941a33298dd --- /dev/null +++ b/services/core/java/com/android/server/location/gnss/GnssPowerIndicationProvider.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.location.gnss; + +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_MULTIBAND_ACQUISITION; +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_MULTIBAND_TRACKING; +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_OTHER_MODES; +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_SINGLEBAND_ACQUISITION; +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_SINGLEBAND_TRACKING; +import static android.hardware.gnss.IGnssPowerIndicationCallback.CAPABILITY_TOTAL; + +import android.util.Log; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +/** + * Manages GNSS Power Indication operations. + */ +class GnssPowerIndicationProvider { + private static final String TAG = "GnssPowerIndPdr"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private volatile int mCapabilities; + private GnssPowerStats mGnssPowerStats; + + /** + * Handles GNSS Power Indication capabilities update from the GNSS HAL callback. + */ + public void onCapabilitiesUpdated(int capabilities) { + mCapabilities = capabilities; + } + + public void onGnssPowerStatsAvailable(GnssPowerStats powerStats) { + if (DEBUG) { + Log.d(TAG, "onGnssPowerStatsAvailable: " + powerStats.toString()); + } + powerStats.validate(); + mGnssPowerStats = powerStats; + } + + /** + * Returns the GNSS Power Indication specific capabilities. + */ + public int getCapabilities() { + return mCapabilities; + } + + /** + * Requests the GNSS HAL to report {@link GnssPowerStats}. + */ + public static void requestPowerStats() { + native_request_power_stats(); + } + + private boolean hasCapability(int capability) { + return (mCapabilities & capability) != 0; + } + + /** + * Dump info for debugging. + */ + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mGnssPowerStats == null) { + return; + } + pw.print("GnssPowerStats["); + if (mGnssPowerStats.hasElapsedRealtimeNanos()) { + pw.print("ElapsedRealtime=" + mGnssPowerStats.getElapsedRealtimeNanos()); + } + if (mGnssPowerStats.hasElapsedRealtimeUncertaintyNanos()) { + pw.print(", ElapsedRealtimeUncertaintyNanos=" + + mGnssPowerStats.getElapsedRealtimeUncertaintyNanos()); + } + if (hasCapability(CAPABILITY_TOTAL)) { + pw.print(", TotalEnergyMilliJoule=" + mGnssPowerStats.getTotalEnergyMilliJoule()); + } + if (hasCapability(CAPABILITY_SINGLEBAND_TRACKING)) { + pw.print(", SinglebandTrackingModeEnergyMilliJoule=" + + mGnssPowerStats.getSinglebandTrackingModeEnergyMilliJoule()); + } + if (hasCapability(CAPABILITY_MULTIBAND_TRACKING)) { + pw.print(", MultibandTrackingModeEnergyMilliJoule=" + + mGnssPowerStats.getMultibandTrackingModeEnergyMilliJoule()); + } + if (hasCapability(CAPABILITY_SINGLEBAND_ACQUISITION)) { + pw.print(", SinglebandAcquisitionModeEnergyMilliJoule=" + + mGnssPowerStats.getSinglebandAcquisitionModeEnergyMilliJoule()); + } + if (hasCapability(CAPABILITY_MULTIBAND_ACQUISITION)) { + pw.print(", MultibandAcquisitionModeEnergyMilliJoule=" + + mGnssPowerStats.getMultibandAcquisitionModeEnergyMilliJoule()); + } + if (hasCapability(CAPABILITY_OTHER_MODES)) { + pw.print(", OtherModesEnergyMilliJoule=["); + double[] otherModes = mGnssPowerStats.getOtherModesEnergyMilliJoule(); + for (int i = 0; i < otherModes.length; i++) { + pw.print(otherModes[i]); + if (i < otherModes.length - 1) { + pw.print(", "); + } + } + pw.print("] "); + } + pw.println(']'); + } + + private static native void native_request_power_stats(); +} diff --git a/services/core/java/com/android/server/location/gnss/GnssPowerStats.java b/services/core/java/com/android/server/location/gnss/GnssPowerStats.java new file mode 100644 index 000000000000..70ab3c647a97 --- /dev/null +++ b/services/core/java/com/android/server/location/gnss/GnssPowerStats.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.location.gnss; + +import static android.hardware.gnss.IGnss.ELAPSED_REALTIME_HAS_TIMESTAMP_NS; +import static android.hardware.gnss.IGnss.ELAPSED_REALTIME_HAS_TIME_UNCERTAINTY_NS; + +import com.android.internal.util.Preconditions; + +/** + * Represents Cumulative GNSS power statistics since boot. + */ +class GnssPowerStats { + private final int mElapsedRealtimeFlags; + private final long mElapsedRealtimeNanos; + private final double mElapsedRealtimeUncertaintyNanos; + private final double mTotalEnergyMilliJoule; + private final double mSinglebandTrackingModeEnergyMilliJoule; + private final double mMultibandTrackingModeEnergyMilliJoule; + private final double mSinglebandAcquisitionModeEnergyMilliJoule; + private final double mMultibandAcquisitionModeEnergyMilliJoule; + private final double[] mOtherModesEnergyMilliJoule; + + GnssPowerStats(int elapsedRealtimeFlags, + long elapsedRealtimeNanos, + double elapsedRealtimeUncertaintyNanos, + double totalEnergyMilliJoule, + double singlebandTrackingModeEnergyMilliJoule, + double multibandTrackingModeEnergyMilliJoule, + double singlebandAcquisitionModeEnergyMilliJoule, + double multibandAcquisitionModeEnergyMilliJoule, + double[] otherModesEnergyMilliJoule) { + mElapsedRealtimeFlags = elapsedRealtimeFlags; + mElapsedRealtimeNanos = elapsedRealtimeNanos; + mElapsedRealtimeUncertaintyNanos = elapsedRealtimeUncertaintyNanos; + mTotalEnergyMilliJoule = totalEnergyMilliJoule; + mSinglebandTrackingModeEnergyMilliJoule = singlebandTrackingModeEnergyMilliJoule; + mMultibandTrackingModeEnergyMilliJoule = multibandTrackingModeEnergyMilliJoule; + mSinglebandAcquisitionModeEnergyMilliJoule = singlebandAcquisitionModeEnergyMilliJoule; + mMultibandAcquisitionModeEnergyMilliJoule = multibandAcquisitionModeEnergyMilliJoule; + mOtherModesEnergyMilliJoule = otherModesEnergyMilliJoule; + } + + /** Returns true if {@link #getElapsedRealtimeNanos()} is available. */ + public boolean hasElapsedRealtimeNanos() { + return (mElapsedRealtimeFlags & ELAPSED_REALTIME_HAS_TIMESTAMP_NS) != 0; + } + + /** Returns true if {@link #getElapsedRealtimeUncertaintyNanos()} is available. */ + public boolean hasElapsedRealtimeUncertaintyNanos() { + return (mElapsedRealtimeFlags & ELAPSED_REALTIME_HAS_TIME_UNCERTAINTY_NS) != 0; + } + + /** + * Gets the elapsed realtime of the GnssPowerStats since boot in nanoseconds. + */ + public long getElapsedRealtimeNanos() { + return mElapsedRealtimeNanos; + } + + /** + * Gets the estimate of the relative precision of the alignment of the + * {@link #getElapsedRealtimeNanos()} timestamp, with the reported measurements in + * nanoseconds (68% confidence). + */ + public double getElapsedRealtimeUncertaintyNanos() { + return mElapsedRealtimeUncertaintyNanos; + } + + /** + * Total GNSS energy consumption in milli-joules (or mWatt-seconds). + */ + public double getTotalEnergyMilliJoule() { + return mTotalEnergyMilliJoule; + } + + /** + * Total energy consumption in milli-joules (or mWatt-seconds) for which the GNSS engine is + * tracking signals of a single frequency band. + */ + public double getSinglebandTrackingModeEnergyMilliJoule() { + return mSinglebandTrackingModeEnergyMilliJoule; + } + + /** + * Total energy consumption in milli-joules (or mWatt-seconds) for which the GNSS engine is + * tracking signals of multiple frequency bands. + */ + public double getMultibandTrackingModeEnergyMilliJoule() { + return mMultibandTrackingModeEnergyMilliJoule; + } + + /** + * Total energy consumption in milli-joules (or mWatt-seconds) for which the GNSS engine is + * acquiring signals of a single frequency band. + */ + public double getSinglebandAcquisitionModeEnergyMilliJoule() { + return mSinglebandAcquisitionModeEnergyMilliJoule; + } + + /** + * Total energy consumption in milli-joules (or mWatt-seconds) for which the GNSS engine is + * acquiring signals of multiple frequency bands. + */ + public double getMultibandAcquisitionModeEnergyMilliJoule() { + return mMultibandAcquisitionModeEnergyMilliJoule; + } + + /** + * Total energy consumption in milli-joules (or mWatt-seconds) for which the GNSS engine is + * operating in each of the vendor-specific power modes, in addition to other generic modes. + */ + public double[] getOtherModesEnergyMilliJoule() { + return mOtherModesEnergyMilliJoule; + } + + public void validate() { + Preconditions.checkArgument(hasElapsedRealtimeNanos()); + } +} diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index c42c84f75051..ad96e7633283 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -156,6 +156,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.concurrent.CountDownLatch; @@ -261,7 +262,13 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void onStart() { - AndroidKeyStoreProvider.install(); + Optional<Boolean> keystore2_enabled = + android.sysprop.Keystore2Properties.keystore2_enabled(); + if (keystore2_enabled.isPresent() && keystore2_enabled.get()) { + android.security.keystore2.AndroidKeyStoreProvider.install(); + } else { + AndroidKeyStoreProvider.install(); + } mLockSettingsService = new LockSettingsService(getContext()); publishBinderService("lock_settings", mLockSettingsService); } @@ -533,7 +540,8 @@ public class LockSettingsService extends ILockSettings.Stub { public @NonNull ManagedProfilePasswordCache getManagedProfilePasswordCache() { try { - java.security.KeyStore ks = java.security.KeyStore.getInstance("AndroidKeyStore"); + java.security.KeyStore ks = java.security.KeyStore.getInstance( + SyntheticPasswordCrypto.androidKeystoreProviderName()); ks.load(null); return new ManagedProfilePasswordCache(ks, getUserManager()); } catch (Exception e) { @@ -1281,7 +1289,8 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] encryptedPassword = Arrays.copyOfRange(storedData, PROFILE_KEY_IV_SIZE, storedData.length); byte[] decryptionResult; - java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore"); + java.security.KeyStore keyStore = java.security.KeyStore.getInstance( + SyntheticPasswordCrypto.androidKeystoreProviderName()); keyStore.load(null); SecretKey decryptionKey = (SecretKey) keyStore.getKey( LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + userId, null); @@ -1717,7 +1726,8 @@ public class LockSettingsService extends ILockSettings.Stub { KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES); keyGenerator.init(new SecureRandom()); SecretKey secretKey = keyGenerator.generateKey(); - java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore"); + java.security.KeyStore keyStore = java.security.KeyStore.getInstance( + SyntheticPasswordCrypto.androidKeystoreProviderName()); keyStore.load(null); try { keyStore.setEntry( @@ -2291,7 +2301,8 @@ public class LockSettingsService extends ILockSettings.Stub { private void removeKeystoreProfileKey(int targetUserId) { Slog.i(TAG, "Remove keystore profile key for user: " + targetUserId); try { - java.security.KeyStore keyStore = java.security.KeyStore.getInstance("AndroidKeyStore"); + java.security.KeyStore keyStore = java.security.KeyStore.getInstance( + SyntheticPasswordCrypto.androidKeystoreProviderName()); keyStore.load(null); keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_ENCRYPT + targetUserId); keyStore.deleteEntry(LockPatternUtils.PROFILE_KEY_NAME_DECRYPT + targetUserId); diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java index 9246311fcdc7..6d420a95e26c 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordCrypto.java @@ -18,6 +18,7 @@ package com.android.server.locksettings; import android.security.keystore.KeyProperties; import android.security.keystore.KeyProtection; +import android.security.keystore2.AndroidKeyStoreProvider; import android.util.Slog; import java.io.ByteArrayOutputStream; @@ -125,7 +126,7 @@ public class SyntheticPasswordCrypto { public static byte[] decryptBlobV1(String keyAlias, byte[] blob, byte[] applicationId) { try { - KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName()); keyStore.load(null); SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null); @@ -140,9 +141,24 @@ public class SyntheticPasswordCrypto { } } + /** + * TODO This function redirects keystore access to the legacy keystore during a transitional + * phase during which not all calling code has been adjusted to use Keystore 2.0. + * This can be reverted to a constant of "AndroidKeyStore" when b/171305684 is complete. + * The specific bug for this component is b/171305115. + */ + static String androidKeystoreProviderName() { + if (AndroidKeyStoreProvider.isInstalled()) { + return "AndroidKeyStoreLegacy"; + } else { + return "AndroidKeystore"; + } + + } + public static byte[] decryptBlob(String keyAlias, byte[] blob, byte[] applicationId) { try { - KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName()); keyStore.load(null); SecretKey decryptionKey = (SecretKey) keyStore.getKey(keyAlias, null); @@ -166,7 +182,7 @@ public class SyntheticPasswordCrypto { KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES); keyGenerator.init(AES_KEY_LENGTH * 8, new SecureRandom()); SecretKey secretKey = keyGenerator.generateKey(); - KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + KeyStore keyStore = KeyStore.getInstance(androidKeystoreProviderName()); keyStore.load(null); KeyProtection.Builder builder = new KeyProtection.Builder(KeyProperties.PURPOSE_DECRYPT) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) @@ -196,7 +212,7 @@ public class SyntheticPasswordCrypto { public static void destroyBlobKey(String keyAlias) { KeyStore keyStore; try { - keyStore = KeyStore.getInstance("AndroidKeyStore"); + keyStore = KeyStore.getInstance(androidKeystoreProviderName()); keyStore.load(null); keyStore.deleteEntry(keyAlias); Slog.i(TAG, "SP key deleted: " + keyAlias); diff --git a/services/core/java/com/android/server/net/LockdownVpnTracker.java b/services/core/java/com/android/server/net/LockdownVpnTracker.java index 0b774df3fe2f..64c3c289163e 100644 --- a/services/core/java/com/android/server/net/LockdownVpnTracker.java +++ b/services/core/java/com/android/server/net/LockdownVpnTracker.java @@ -16,6 +16,7 @@ package com.android.server.net; +import static android.net.ConnectivityManager.TYPE_NONE; import static android.provider.Settings.ACTION_VPN_SETTINGS; import static com.android.server.connectivity.NetworkNotificationManager.NOTIFICATION_CHANNEL_VPN; @@ -27,7 +28,6 @@ import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.net.ConnectivityManager; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkInfo; @@ -125,12 +125,11 @@ public class LockdownVpnTracker { final boolean egressChanged = egressProp == null || !TextUtils.equals(mAcceptedEgressIface, egressProp.getInterfaceName()); - final String egressTypeName = (egressInfo == null) ? - null : ConnectivityManager.getNetworkTypeName(egressInfo.getType()); + final int egressType = (egressInfo == null) ? TYPE_NONE : egressInfo.getType(); final String egressIface = (egressProp == null) ? null : egressProp.getInterfaceName(); - Slog.d(TAG, "handleStateChanged: egress=" + egressTypeName + - " " + mAcceptedEgressIface + "->" + egressIface); + Slog.d(TAG, "handleStateChanged: egress=" + egressType + + " " + mAcceptedEgressIface + "->" + egressIface); if (egressDisconnected || egressChanged) { mAcceptedEgressIface = null; @@ -141,7 +140,6 @@ public class LockdownVpnTracker { return; } - final int egressType = egressInfo.getType(); if (vpnInfo.getDetailedState() == DetailedState.FAILED) { EventLogTags.writeLockdownVpnError(egressType); } diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java index f743bbd14caf..b31cc6a9b765 100644 --- a/services/core/java/com/android/server/pm/PreferredComponent.java +++ b/services/core/java/com/android/server/pm/PreferredComponent.java @@ -256,6 +256,43 @@ public class PreferredComponent { return numMatch == NS; } + public boolean sameSet(PreferredComponent pc) { + if (mSetPackages == null || pc == null || pc.mSetPackages == null + || !sameComponent(pc.mComponent)) { + return false; + } + final int otherPackageCount = pc.mSetPackages.length; + final int packageCount = mSetPackages.length; + int numMatch = 0; + for (int i = 0; i < otherPackageCount; i++) { + boolean good = false; + for (int j = 0; j < packageCount; j++) { + if (mSetPackages[j].equals(pc.mSetPackages[j]) + && mSetClasses[j].equals(pc.mSetClasses[j])) { + numMatch++; + good = true; + break; + } + } + if (!good) { + return false; + } + } + return numMatch == packageCount; + } + + /** Returns true if the preferred component represents the provided ComponentName. */ + private boolean sameComponent(ComponentName comp) { + if (mComponent == null || comp == null) { + return false; + } + if (mComponent.getPackageName().equals(comp.getPackageName()) + && mComponent.getClassName().equals(comp.getClassName())) { + return true; + } + return false; + } + public boolean isSuperset(List<ResolveInfo> query, boolean excludeSetupWizardPackage) { if (mSetPackages == null) { return query == null; diff --git a/services/core/java/com/android/server/pm/PreferredIntentResolver.java b/services/core/java/com/android/server/pm/PreferredIntentResolver.java index a261e29b05a7..ff3df130a3cc 100644 --- a/services/core/java/com/android/server/pm/PreferredIntentResolver.java +++ b/services/core/java/com/android/server/pm/PreferredIntentResolver.java @@ -22,6 +22,7 @@ import android.content.IntentFilter; import java.io.PrintWriter; import com.android.server.IntentResolver; +import java.util.ArrayList; public class PreferredIntentResolver extends IntentResolver<PreferredActivity, PreferredActivity> { @@ -45,4 +46,24 @@ public class PreferredIntentResolver protected IntentFilter getIntentFilter(@NonNull PreferredActivity input) { return input; } + + public boolean shouldAddPreferredActivity(PreferredActivity pa) { + ArrayList<PreferredActivity> pal = findFilters(pa); + if (pal == null || pal.isEmpty()) { + return true; + } + if (!pa.mPref.mAlways) { + return false; + } + final int activityCount = pal.size(); + for (int i = 0; i < activityCount; i++) { + PreferredActivity cur = pal.get(i); + if (cur.mPref.mAlways + && cur.mPref.mMatch == (pa.mPref.mMatch & IntentFilter.MATCH_CATEGORY_MASK) + && cur.mPref.sameSet(pa.mPref)) { + return false; + } + } + return true; + } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 35fa7fc8ee56..7621aeb4aabf 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1312,8 +1312,7 @@ public final class Settings { PreferredActivity pa = new PreferredActivity(parser); if (pa.mPref.getParseError() == null) { final PreferredIntentResolver resolver = editPreferredActivitiesLPw(userId); - ArrayList<PreferredActivity> pal = resolver.findFilters(pa); - if (pal == null || pal.size() == 0 || pa.mPref.mAlways) { + if (resolver.shouldAddPreferredActivity(pa)) { resolver.addFilter(pa); } } else { diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 1c347384bf81..bccbae64f241 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -2761,19 +2761,33 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // than destroy immediately. final boolean isNextNotYetVisible = next != null && (!next.nowVisible || !next.mVisibleRequested); - if (isCurrentVisible && isNextNotYetVisible) { - // Add this activity to the list of stopping activities. It will be processed and - // destroyed when the next activity reports idle. - addToStopping(false /* scheduleIdle */, false /* idleDelayed */, - "completeFinishing"); - setState(STOPPING, "completeFinishing"); - } else if (addToFinishingAndWaitForIdle()) { - // We added this activity to the finishing list and something else is becoming resumed. - // The activity will complete finishing when the next activity reports idle. No need to - // do anything else here. + + // Clear last paused activity to ensure top activity can be resumed during sleeping. + if (isNextNotYetVisible && mDisplayContent.isSleeping() + && next == next.getRootTask().mLastPausedActivity) { + next.getRootTask().mLastPausedActivity = null; + } + + if (isCurrentVisible) { + if (isNextNotYetVisible) { + // Add this activity to the list of stopping activities. It will be processed and + // destroyed when the next activity reports idle. + addToStopping(false /* scheduleIdle */, false /* idleDelayed */, + "completeFinishing"); + setState(STOPPING, "completeFinishing"); + } else if (addToFinishingAndWaitForIdle()) { + // We added this activity to the finishing list and something else is becoming + // resumed. The activity will complete finishing when the next activity reports + // idle. No need to do anything else here. + } else { + // Not waiting for the next one to become visible, and nothing else will be + // resumed in place of this activity - requesting destruction right away. + activityRemoved = destroyIfPossible(reason); + } } else { - // Not waiting for the next one to become visible, and nothing else will be resumed in - // place of this activity - requesting destruction right away. + // Just need to make sure the next activities can be resumed (if needed) and is free + // to destroy this activity since it is currently not visible. + addToFinishingAndWaitForIdle(); activityRemoved = destroyIfPossible(reason); } diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java index 76a5cda9299e..211bd5d9eb77 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicy.java @@ -27,6 +27,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; import static android.window.DisplayAreaOrganizer.FEATURE_FULLSCREEN_MAGNIFICATION; import static android.window.DisplayAreaOrganizer.FEATURE_HIDE_DISPLAY_CUTOUT; +import static android.window.DisplayAreaOrganizer.FEATURE_IME_PLACEHOLDER; import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED; import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION; @@ -94,6 +95,8 @@ public abstract class DisplayAreaPolicy { // Define the features that will be supported under the root of the whole logical // display. The policy will build the DisplayArea hierarchy based on this. HierarchyBuilder rootHierarchy = new HierarchyBuilder(root) + // WindowedMagnification should be on the top so that there is only one surface + // to be magnified. .addFeature(new Feature.Builder(wmService.mPolicy, "WindowedMagnification", FEATURE_WINDOWED_MAGNIFICATION) .upTo(TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY) @@ -120,6 +123,10 @@ public abstract class DisplayAreaPolicy { TYPE_INPUT_METHOD_DIALOG, TYPE_MAGNIFICATION_OVERLAY, TYPE_NAVIGATION_BAR, TYPE_NAVIGATION_BAR_PANEL) .build()) + .addFeature(new Feature.Builder(wmService.mPolicy, "ImePlaceholder", + FEATURE_IME_PLACEHOLDER) + .and(TYPE_INPUT_METHOD, TYPE_INPUT_METHOD_DIALOG) + .build()) .setImeContainer(imeContainer) .setTaskDisplayAreas(tdaList); diff --git a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java index b6cff625da5d..80ec722bc274 100644 --- a/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java +++ b/services/core/java/com/android/server/wm/DisplayAreaPolicyBuilder.java @@ -283,7 +283,7 @@ class DisplayAreaPolicyBuilder { final int maxWindowLayerCount = policy.getMaxWindowLayer(); final DisplayArea.Tokens[] displayAreaForLayer = new DisplayArea.Tokens[maxWindowLayerCount]; - final Map<Feature, List<DisplayArea<? extends WindowContainer>>> featureAreas = + final Map<Feature, List<DisplayArea<WindowContainer>>> featureAreas = new ArrayMap<>(mFeatures.size()); for (int i = 0; i < mFeatures.size(); i++) { featureAreas.put(mFeatures.get(i), new ArrayList<>()); @@ -678,7 +678,7 @@ class DisplayAreaPolicyBuilder { } void instantiateChildren(DisplayArea<DisplayArea> parent, DisplayArea.Tokens[] areaForLayer, - int level, Map<Feature, List<DisplayArea<? extends WindowContainer>>> areas) { + int level, Map<Feature, List<DisplayArea<WindowContainer>>> areas) { mChildren.sort(Comparator.comparingInt(pendingArea -> pendingArea.mMinLayer)); for (int i = 0; i < mChildren.size(); i++) { final PendingArea child = mChildren.get(i); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 07c61d3dcea5..6d5ff22e56f6 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -3573,7 +3573,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mWmService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay && !isPrivate(); } - private void setInputMethodTarget(WindowState target, boolean targetWaitingAnim) { + /** + * Sets the window the IME is on top of. + * @param target window to place the IME surface on top of. If {@code null}, the IME will be + * placed at its parent's surface. + * @param targetWaitingAnim if {@code true}, hold off on modifying the animation layer of + * the target. + */ + private void setInputMethodTarget(@Nullable WindowState target, boolean targetWaitingAnim) { if (target == mInputMethodTarget && mInputMethodTargetWaitingAnim == targetWaitingAnim) { return; } @@ -3581,6 +3588,14 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp mInputMethodTarget = target; mInputMethodTargetWaitingAnim = targetWaitingAnim; assignWindowLayers(true /* setLayoutNeeded */); + if (target != null) { + RootDisplayArea targetRoot = target.getRootDisplayArea(); + if (targetRoot != null) { + // Reposition the IME container to the target root to get the correct bounds and + // config. + targetRoot.placeImeContainer(mImeWindowsContainers); + } + } updateImeParent(); updateImeControlTarget(); } @@ -4699,7 +4714,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } @VisibleForTesting - WindowContainer<?> getImeContainer() { + DisplayArea.Tokens getImeContainer() { return mImeWindowsContainers; } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 61cc4306409d..fc3fc4731e7d 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -499,11 +499,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture - || mNavigationBarPosition == NAV_BAR_RIGHT; - if (mNavigationBar != null && sideAllowed - && !mSystemGestures.currentGestureStartedInRegion( - excludedRegion)) { + final boolean excluded = + mSystemGestures.currentGestureStartedInRegion(excludedRegion); + if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT + || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT); @@ -517,11 +516,10 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean sideAllowed = mNavigationBarAlwaysShowOnSideGesture - || mNavigationBarPosition == NAV_BAR_LEFT; - if (mNavigationBar != null && sideAllowed - && !mSystemGestures.currentGestureStartedInRegion( - excludedRegion)) { + final boolean excluded = + mSystemGestures.currentGestureStartedInRegion(excludedRegion); + if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT + || !excluded && mNavigationBarAlwaysShowOnSideGesture)) { requestTransientBars(mNavigationBar); } checkAltBarSwipeForTransientBars(ALT_BAR_LEFT); diff --git a/services/core/java/com/android/server/wm/RootDisplayArea.java b/services/core/java/com/android/server/wm/RootDisplayArea.java index d9a87734e9e7..1e5d045e8680 100644 --- a/services/core/java/com/android/server/wm/RootDisplayArea.java +++ b/services/core/java/com/android/server/wm/RootDisplayArea.java @@ -17,6 +17,7 @@ package com.android.server.wm; import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER; +import static android.window.DisplayAreaOrganizer.FEATURE_IME_PLACEHOLDER; import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature; @@ -39,7 +40,7 @@ class RootDisplayArea extends DisplayArea<DisplayArea> { * Mapping from policy supported {@link Feature} to list of {@link DisplayArea} created to cover * all the window types that the {@link Feature} will be applied to. */ - Map<Feature, List<DisplayArea<? extends WindowContainer>>> mFeatureToDisplayAreas; + Map<Feature, List<DisplayArea<WindowContainer>>> mFeatureToDisplayAreas; /** Mapping from window layer to {@link DisplayArea.Tokens} that holds windows on that layer. */ private DisplayArea.Tokens[] mAreaForLayer; @@ -61,6 +62,35 @@ class RootDisplayArea extends DisplayArea<DisplayArea> { return false; } + /** + * Places the IME container below this root, so that it's bounds and config will be updated to + * match the root. + */ + void placeImeContainer(DisplayArea.Tokens imeContainer) { + if (imeContainer.getRootDisplayArea() == this) { + // No need to reparent if IME container is below the same root. + return; + } + + List<Feature> features = mFeatures; + for (int i = 0; i < features.size(); i++) { + Feature feature = features.get(i); + if (feature.getId() == FEATURE_IME_PLACEHOLDER) { + List<DisplayArea<WindowContainer>> imeDisplayAreas = + mFeatureToDisplayAreas.get(feature); + if (imeDisplayAreas.size() != 1) { + throw new IllegalStateException("There must be exactly one DisplayArea for the " + + "FEATURE_IME_PLACEHOLDER"); + } + + imeContainer.reparent(imeDisplayAreas.get(0), POSITION_TOP); + return; + } + } + throw new IllegalStateException( + "There is no FEATURE_IME_PLACEHOLDER in this root to place the IME container"); + } + /** Finds the {@link DisplayArea.Tokens} that this type of window should be attached to. */ DisplayArea.Tokens findAreaForToken(WindowToken token) { int windowLayerFromType = token.getWindowLayerFromType(); @@ -75,7 +105,7 @@ class RootDisplayArea extends DisplayArea<DisplayArea> { /** Callback after {@link DisplayArea} hierarchy has been built. */ void onHierarchyBuilt(ArrayList<Feature> features, DisplayArea.Tokens[] areaForLayer, - Map<Feature, List<DisplayArea<? extends WindowContainer>>> featureToDisplayAreas) { + Map<Feature, List<DisplayArea<WindowContainer>>> featureToDisplayAreas) { if (mHasBuiltHierarchy) { throw new IllegalStateException("Root should only build the hierarchy once"); } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 3200bbc90de1..e8400af3d9a5 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2379,6 +2379,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } return resumed; }, false /* initValue */); + result |= resumedOnDisplay; if (!resumedOnDisplay) { // In cases when there are no valid activities (e.g. device just booted or launcher // crashed) it's possible that nothing was resumed on a display. Requesting resume diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 802c8f9f1ec9..50b24e225916 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -1189,6 +1189,12 @@ final class TaskDisplayArea extends DisplayArea<Task> { return; } + // Clear last paused activity if focused root task changed while sleeping, so that the + // top activity of current focused task can be resumed. + if (mDisplayContent.isSleeping()) { + currentFocusedTask.mLastPausedActivity = null; + } + mLastFocusedStack = prevFocusedTask; EventLogTags.writeWmFocusedStack(mRootWindowContainer.mCurrentUser, mDisplayContent.mDisplayId, diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index aeb5be717e0f..22dca2611302 100644 --- a/services/core/java/com/android/server/wm/WindowContainer.java +++ b/services/core/java/com/android/server/wm/WindowContainer.java @@ -825,14 +825,14 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer< return mDisplayContent; } - /** Get the first node of type {@link DisplayArea} above or at this node. */ + /** Returns the first node of type {@link DisplayArea} above or at this node. */ @Nullable DisplayArea getDisplayArea() { WindowContainer parent = getParent(); return parent != null ? parent.getDisplayArea() : null; } - /** Get the first node of type {@link RootDisplayArea} above or at this node. */ + /** Returns the first node of type {@link RootDisplayArea} above or at this node. */ @Nullable RootDisplayArea getRootDisplayArea() { WindowContainer parent = getParent(); diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp index 3bff4404754a..1a6128fa92ba 100644 --- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp +++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp @@ -31,6 +31,7 @@ #include <android/hardware/gnss/2.1/IGnssMeasurement.h> #include <android/hardware/gnss/3.0/IGnssPsds.h> #include <android/hardware/gnss/BnGnss.h> +#include <android/hardware/gnss/BnGnssPowerIndicationCallback.h> #include <android/hardware/gnss/BnGnssPsdsCallback.h> #include <android/hardware/gnss/measurement_corrections/1.0/IMeasurementCorrections.h> #include <android/hardware/gnss/measurement_corrections/1.1/IMeasurementCorrections.h> @@ -61,6 +62,7 @@ static jclass class_location; static jclass class_gnssNavigationMessage; static jclass class_gnssClock; static jclass class_gnssAntennaInfoBuilder; +static jclass class_gnssPowerStats; static jclass class_phaseCenterOffset; static jclass class_sphericalCorrections; static jclass class_arrayList; @@ -93,6 +95,7 @@ static jmethodID method_reportAntennaInfo; static jmethodID method_reportNavigationMessages; static jmethodID method_reportLocationBatch; static jmethodID method_reportGnssServiceDied; +static jmethodID method_reportGnssPowerStats; static jmethodID method_setSubHalMeasurementCorrectionsCapabilities; static jmethodID method_correctionsGetLatitudeDegrees; static jmethodID method_correctionsGetLongitudeDegrees; @@ -126,6 +129,7 @@ static jmethodID method_gnssNavigationMessageCtor; static jmethodID method_gnssClockCtor; static jmethodID method_gnssMeasurementCtor; static jmethodID method_gnssAntennaInfoBuilderCtor; +static jmethodID method_gnssPowerStatsCtor; static jmethodID method_phaseCenterOffsetCtor; static jmethodID method_sphericalCorrectionsCtor; static jmethodID method_arrayListCtor; @@ -135,6 +139,7 @@ static jmethodID method_gnssAntennaInfoBuilderSetPhaseCenterOffset; static jmethodID method_gnssAntennaInfoBuilderSetPhaseCenterVariationCorrections; static jmethodID method_gnssAntennaInfoBuilderSetSignalGainCorrections; static jmethodID method_gnssAntennaInfoBuilderBuild; +static jmethodID method_setSubHalPowerIndicationCapabilities; /* * Save a pointer to JavaVm to attach/detach threads executing @@ -225,6 +230,9 @@ using android::hardware::gnss::visibility_control::V1_0::IGnssVisibilityControlC using android::hardware::gnss::BlocklistedSource; using android::hardware::gnss::GnssConstellationType; +using android::hardware::gnss::GnssPowerStats; +using android::hardware::gnss::IGnssPowerIndication; +using android::hardware::gnss::IGnssPowerIndicationCallback; using android::hardware::gnss::PsdsType; using IGnssAidl = android::hardware::gnss::IGnss; using IGnssPsdsAidl = android::hardware::gnss::IGnssPsds; @@ -271,6 +279,7 @@ sp<IGnssMeasurement_V1_1> gnssMeasurementIface_V1_1 = nullptr; sp<IGnssMeasurement_V2_0> gnssMeasurementIface_V2_0 = nullptr; sp<IGnssMeasurement_V2_1> gnssMeasurementIface_V2_1 = nullptr; sp<IGnssNavigationMessage> gnssNavigationMessageIface = nullptr; +sp<IGnssPowerIndication> gnssPowerIndicationIface = nullptr; sp<IMeasurementCorrections_V1_0> gnssCorrectionsIface_V1_0 = nullptr; sp<IMeasurementCorrections_V1_1> gnssCorrectionsIface_V1_1 = nullptr; sp<IGnssVisibilityControl> gnssVisibilityControlIface = nullptr; @@ -410,6 +419,8 @@ template<> const char *const JavaMethodHelper<bool>::signature_ = "(Z)V"; template<> const char *const JavaMethodHelper<jstring>::signature_ = "(Ljava/lang/String;)V"; +template <> +const char* const JavaMethodHelper<jdoubleArray>::signature_ = "([D)V"; #define SET(setter, value) object.callSetter("set" # setter, (value)) @@ -934,6 +945,50 @@ Return<void> GnssCallback::gnssSetSystemInfoCb(const IGnssCallback_V2_0::GnssSys } /* + * GnssPowerIndicationCallback class implements the callback methods for the IGnssPowerIndication + * interface. + */ +struct GnssPowerIndicationCallback : public android::hardware::gnss::BnGnssPowerIndicationCallback { +public: + Status setCapabilitiesCb(const int capabilities) override; + Status gnssPowerStatsCb(const GnssPowerStats& data) override; +}; + +Status GnssPowerIndicationCallback::setCapabilitiesCb(const int capabilities) { + ALOGD("GnssPowerIndicationCallback::%s: %du\n", __func__, capabilities); + JNIEnv* env = getJniEnv(); + env->CallVoidMethod(mCallbacksObj, method_setSubHalPowerIndicationCapabilities, capabilities); + checkAndClearExceptionFromCallback(env, __FUNCTION__); + return Status::ok(); +} + +Status GnssPowerIndicationCallback::gnssPowerStatsCb(const GnssPowerStats& data) { + JNIEnv* env = getJniEnv(); + + int size = data.otherModesEnergyMilliJoule.size(); + jdoubleArray otherModesEnergy = env->NewDoubleArray(size); + if (size > 0) { + env->SetDoubleArrayRegion(otherModesEnergy, (jsize)0, size, + &(data.otherModesEnergyMilliJoule[0])); + } + jobject gnssPowerStats = + env->NewObject(class_gnssPowerStats, method_gnssPowerStatsCtor, + data.elapsedRealtime.flags, data.elapsedRealtime.timestampNs, + data.elapsedRealtime.timeUncertaintyNs, data.totalEnergyMilliJoule, + data.singlebandTrackingModeEnergyMilliJoule, + data.multibandTrackingModeEnergyMilliJoule, + data.singlebandAcquisitionModeEnergyMilliJoule, + data.multibandAcquisitionModeEnergyMilliJoule, otherModesEnergy); + + env->CallVoidMethod(mCallbacksObj, method_reportGnssPowerStats, gnssPowerStats); + + checkAndClearExceptionFromCallback(env, __FUNCTION__); + env->DeleteLocalRef(gnssPowerStats); + env->DeleteLocalRef(otherModesEnergy); + return Status::ok(); +} + +/* * GnssPsdsCallback class implements the callback methods for the IGnssPsds * interface. */ @@ -2033,10 +2088,15 @@ static void android_location_GnssNative_class_init_once(JNIEnv* env, jclass claz method_reportGnssServiceDied = env->GetMethodID(clazz, "reportGnssServiceDied", "()V"); method_reportNfwNotification = env->GetMethodID(clazz, "reportNfwNotification", "(Ljava/lang/String;BLjava/lang/String;BLjava/lang/String;BZZ)V"); + method_reportGnssPowerStats = + env->GetMethodID(clazz, "reportGnssPowerStats", + "(Lcom/android/server/location/gnss/GnssPowerStats;)V"); method_isInEmergencySession = env->GetMethodID(clazz, "isInEmergencySession", "()Z"); method_setSubHalMeasurementCorrectionsCapabilities = env->GetMethodID(clazz, "setSubHalMeasurementCorrectionsCapabilities", "(I)V"); + method_setSubHalPowerIndicationCapabilities = + env->GetMethodID(clazz, "setSubHalPowerIndicationCapabilities", "(I)V"); jclass measCorrClass = env->FindClass("android/location/GnssMeasurementCorrections"); method_correctionsGetLatitudeDegrees = env->GetMethodID( @@ -2134,6 +2194,10 @@ static void android_location_GnssNative_class_init_once(JNIEnv* env, jclass claz method_sphericalCorrectionsCtor = env->GetMethodID(class_sphericalCorrections, "<init>", "([[D[[D)V"); + jclass gnssPowerStatsClass = env->FindClass("com/android/server/location/gnss/GnssPowerStats"); + class_gnssPowerStats = (jclass)env->NewGlobalRef(gnssPowerStatsClass); + method_gnssPowerStatsCtor = env->GetMethodID(class_gnssPowerStats, "<init>", "(IJDDDDDD[D)V"); + jclass locationClass = env->FindClass("android/location/Location"); class_location = (jclass) env->NewGlobalRef(locationClass); method_locationCtor = env->GetMethodID(class_location, "<init>", "(Ljava/lang/String;)V"); @@ -2424,6 +2488,14 @@ static void android_location_GnssNative_init_once(JNIEnv* env, jobject obj, } } + if (gnssHalAidl != nullptr) { + sp<IGnssPowerIndication> gnssPowerIndication; + auto status = gnssHalAidl->getExtensionGnssPowerIndication(&gnssPowerIndication); + if (checkAidlStatus(status, "Unable to get a handle to GnssPowerIndication interface.")) { + gnssPowerIndicationIface = gnssPowerIndication; + } + } + if (mCallbacksObj) { ALOGE("Callbacks already initialized"); } else { @@ -2571,6 +2643,16 @@ static jboolean android_location_GnssLocationProvider_init(JNIEnv* /* env */, jo ALOGI("Unable to find IMeasurementCorrections."); } + // Set IGnssPowerIndication.hal callback. + if (gnssPowerIndicationIface != nullptr) { + sp<IGnssPowerIndicationCallback> gnssPowerIndicationCallback = + new GnssPowerIndicationCallback(); + auto status = gnssPowerIndicationIface->setCallback(gnssPowerIndicationCallback); + if (!checkAidlStatus(status, "IGnssPowerIndication setCallback() failed.")) { + gnssPowerIndicationIface = nullptr; + } + } + return JNI_TRUE; } @@ -3024,6 +3106,15 @@ static jstring android_location_GnssLocationProvider_get_internal_state(JNIEnv* return internalStateStr; } +static void android_location_GnssLocationProvider_request_power_stats(JNIEnv* env, + jobject /* obj */) { + if (gnssPowerIndicationIface == nullptr) { + return; + } + auto status = gnssPowerIndicationIface->requestGnssPowerStats(); + checkAidlStatus(status, "IGnssPowerIndication requestGnssPowerStats() failed."); +} + static jboolean android_location_GnssLocationProvider_is_gnss_visibility_control_supported( JNIEnv* /* env */, jclass /* clazz */) { return (gnssVisibilityControlIface != nullptr) ? JNI_TRUE : JNI_FALSE; @@ -3810,6 +3901,12 @@ static const JNINativeMethod sVisibilityControlMethods[] = { android_location_GnssVisibilityControl_enable_nfw_location_access)}, }; +static const JNINativeMethod sPowerIndicationMethods[] = { + /* name, signature, funcPtr */ + {"native_request_power_stats", "()V", + reinterpret_cast<void*>(android_location_GnssLocationProvider_request_power_stats)}, +}; + int register_android_server_location_GnssLocationProvider(JNIEnv* env) { jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssAntennaInfoProvider", sAntennaInfoMethods, NELEM(sAntennaInfoMethods)); @@ -3830,6 +3927,8 @@ int register_android_server_location_GnssLocationProvider(JNIEnv* env) { sConfigurationMethods, NELEM(sConfigurationMethods)); jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssVisibilityControl", sVisibilityControlMethods, NELEM(sVisibilityControlMethods)); + jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssPowerIndicationProvider", + sPowerIndicationMethods, NELEM(sPowerIndicationMethods)); jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssLocationProvider", sLocationProviderMethods, NELEM(sLocationProviderMethods)); return jniRegisterNativeMethods(env, "com/android/server/location/gnss/GnssNative", diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index e8861c4dda8e..20b6b6d135d5 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -4152,14 +4152,18 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { public PasswordMetrics getPasswordMinimumMetrics(@UserIdInt int userHandle) { final CallerIdentity caller = getCallerIdentity(); Preconditions.checkCallAuthorization(hasFullCrossUsersPermission(caller, userHandle)); + return getPasswordMinimumMetricsUnchecked(userHandle); + } + + private PasswordMetrics getPasswordMinimumMetricsUnchecked(@UserIdInt int userId) { if (!mHasFeature) { new PasswordMetrics(CREDENTIAL_TYPE_NONE); } - Preconditions.checkArgumentNonnegative(userHandle, "Invalid userId"); + Preconditions.checkArgumentNonnegative(userId, "Invalid userId"); ArrayList<PasswordMetrics> adminMetrics = new ArrayList<>(); synchronized (getLockObject()) { - List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle); + List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userId); for (ActiveAdmin admin : admins) { adminMetrics.add(admin.mPasswordPolicy.getMinMetrics()); } @@ -4293,7 +4297,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private boolean isPasswordSufficientForUserWithoutCheckpointLocked( @NonNull PasswordMetrics metrics, @UserIdInt int userId) { final int complexity = getEffectivePasswordComplexityRequirementLocked(userId); - PasswordMetrics minMetrics = getPasswordMinimumMetrics(userId); + PasswordMetrics minMetrics = getPasswordMinimumMetricsUnchecked(userId); final List<PasswordValidationError> passwordValidationErrors = PasswordMetrics.validatePasswordMetrics( minMetrics, complexity, false, metrics); @@ -4583,7 +4587,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final int callingUid = caller.getUid(); final int userHandle = UserHandle.getUserId(callingUid); synchronized (getLockObject()) { - final PasswordMetrics minMetrics = getPasswordMinimumMetrics(userHandle); + final PasswordMetrics minMetrics = getPasswordMinimumMetricsUnchecked(userHandle); final List<PasswordValidationError> validationErrors; final int complexity = getEffectivePasswordComplexityRequirementLocked(userHandle); // TODO: Consider changing validation API to take LockscreenCredential. diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 7b9ccae794f3..54ec382c3865 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -1020,6 +1020,32 @@ public class ActivityRecordTests extends WindowTestsBase { } /** + * Verify that complete finish request for top invisible activity must not be delayed while + * sleeping, but next invisible activity must be resumed (and paused/stopped) + */ + @Test + public void testCompleteFinishing_noWaitForNextVisible_sleeping() { + // Create a top activity on a new task + final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build(); + mDisplayContent.setIsSleeping(true); + doReturn(true).when(mActivity).shouldBeVisible(); + topActivity.mVisibleRequested = false; + topActivity.nowVisible = false; + topActivity.finishing = true; + topActivity.setState(STOPPED, "true"); + + // Mark the activity behind (on a separate task) as not visible + mActivity.mVisibleRequested = false; + mActivity.nowVisible = false; + mActivity.setState(STOPPED, "test"); + + clearInvocations(mActivity); + topActivity.completeFinishing("test"); + verify(mActivity).setState(eq(RESUMED), any()); + verify(topActivity).destroyIfPossible(anyString()); + } + + /** * Verify that complete finish request for invisible activity must not be delayed. */ @Test @@ -1232,12 +1258,13 @@ public class ActivityRecordTests extends WindowTestsBase { */ @Test public void testCompleteFinishing_lastActivityAboveEmptyHomeStack() { - // Empty the home stack. - final Task homeStack = mActivity.getDisplayArea().getRootHomeTask(); - homeStack.forAllLeafTasks((t) -> { - homeStack.removeChild(t, "test"); + // Empty the home root task. + final Task homeRootTask = mActivity.getDisplayArea().getRootHomeTask(); + homeRootTask.forAllLeafTasks((t) -> { + homeRootTask.removeChild(t, "test"); }, true /* traverseTopToBottom */); mActivity.finishing = true; + mActivity.mVisibleRequested = true; spyOn(mStack); // Try to finish the last activity above the home stack. diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java index 4abb6059cc59..8e6b6fab19eb 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayAreaPolicyBuilderTest.java @@ -27,6 +27,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER; import static android.window.DisplayAreaOrganizer.FEATURE_DEFAULT_TASK_CONTAINER; import static android.window.DisplayAreaOrganizer.FEATURE_FULLSCREEN_MAGNIFICATION; +import static android.window.DisplayAreaOrganizer.FEATURE_IME_PLACEHOLDER; import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED; import static android.window.DisplayAreaOrganizer.FEATURE_ROOT; import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST; @@ -213,6 +214,22 @@ public class DisplayAreaPolicyBuilderTest { } @Test + public void testBuilder_defaultPolicy_hasImePlaceholderFeature() { + final DisplayAreaPolicy.Provider defaultProvider = DisplayAreaPolicy.Provider.fromResources( + resourcesWithProvider("")); + final DisplayAreaPolicyBuilder.Result defaultPolicy = + (DisplayAreaPolicyBuilder.Result) defaultProvider.instantiate(mWms, mDisplayContent, + mRoot, mImeContainer); + final List<Feature> features = defaultPolicy.getFeatures(); + boolean hasImePlaceholderFeature = false; + for (Feature feature : features) { + hasImePlaceholderFeature |= feature.getId() == FEATURE_IME_PLACEHOLDER; + } + + assertThat(hasImePlaceholderFeature).isTrue(); + } + + @Test public void testBuilder_createCustomizedDisplayAreaForFeature() { final Feature dimmable; final Feature other; diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index dc33b75ec57a..c81f2715eb87 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -311,6 +311,21 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(childWin, imeTarget); } + @UseTestDisplay(addAllCommonWindows = true) + @Test + public void testComputeImeTarget_placeImeToTheTargetRoot() { + ActivityRecord activity = createActivityRecord(mDisplayContent); + + final WindowState startingWin = createWindow(null, TYPE_APPLICATION_STARTING, activity, + "startingWin"); + startingWin.setHasSurface(true); + assertTrue(startingWin.canBeImeTarget()); + DisplayArea.Tokens imeContainer = mDisplayContent.getImeContainer(); + + WindowState imeTarget = mDisplayContent.computeImeTarget(true /* updateImeTarget */); + verify(imeTarget.getRootDisplayArea()).placeImeContainer(imeContainer); + } + /** * This tests stack movement between displays and proper stack's, task's and app token's display * container references updates. diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java index 074aefe2e800..885ff9be550c 100644 --- a/telephony/java/android/telephony/ims/ImsRcsManager.java +++ b/telephony/java/android/telephony/ims/ImsRcsManager.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.provider.Settings; import android.telephony.AccessNetworkConstants; import android.telephony.BinderCacheManager; @@ -198,6 +199,8 @@ public class ImsRcsManager { c.setExecutor(executor); try { imsRcsController.registerImsRegistrationCallback(mSubId, c.getBinder()); + } catch (ServiceSpecificException e) { + throw new ImsException(e.toString(), e.errorCode); } catch (RemoteException | IllegalStateException e) { throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE); } @@ -333,6 +336,9 @@ public class ImsRcsManager { c.setExecutor(executor); try { imsRcsController.registerRcsAvailabilityCallback(mSubId, c.getBinder()); + + } catch (ServiceSpecificException e) { + throw new ImsException(e.toString(), e.errorCode); } catch (RemoteException e) { Log.e(TAG, "Error calling IImsRcsController#registerRcsAvailabilityCallback", e); throw new ImsException("Remote IMS Service is not available", diff --git a/telephony/java/android/telephony/ims/RcsUceAdapter.java b/telephony/java/android/telephony/ims/RcsUceAdapter.java index 0aeaecc2af5e..ada069666547 100644 --- a/telephony/java/android/telephony/ims/RcsUceAdapter.java +++ b/telephony/java/android/telephony/ims/RcsUceAdapter.java @@ -27,6 +27,7 @@ import android.net.Uri; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; +import android.os.ServiceSpecificException; import android.telephony.TelephonyFrameworkInitializer; import android.telephony.ims.aidl.IImsRcsController; import android.telephony.ims.aidl.IRcsUceControllerCallback; @@ -463,6 +464,8 @@ public class RcsUceAdapter { try { imsRcsController.requestCapabilities(mSubId, mContext.getOpPackageName(), mContext.getAttributionTag(), contactNumbers, internalCallback); + } catch (ServiceSpecificException e) { + throw new ImsException(e.toString(), e.errorCode); } catch (RemoteException e) { Log.e(TAG, "Error calling IImsRcsController#requestCapabilities", e); throw new ImsException("Remote IMS Service is not available", @@ -545,6 +548,8 @@ public class RcsUceAdapter { try { imsRcsController.requestNetworkAvailability(mSubId, mContext.getOpPackageName(), mContext.getAttributionTag(), contactNumber, internalCallback); + } catch (ServiceSpecificException e) { + throw new ImsException(e.toString(), e.errorCode); } catch (RemoteException e) { Log.e(TAG, "Error calling IImsRcsController#requestNetworkAvailability", e); throw new ImsException("Remote IMS Service is not available", @@ -574,7 +579,7 @@ public class RcsUceAdapter { try { return imsRcsController.getUcePublishState(mSubId); - } catch (android.os.ServiceSpecificException e) { + } catch (ServiceSpecificException e) { throw new ImsException(e.getMessage(), e.errorCode); } catch (RemoteException e) { Log.e(TAG, "Error calling IImsRcsController#getUcePublishState", e); @@ -621,7 +626,7 @@ public class RcsUceAdapter { c.setExecutor(executor); try { imsRcsController.registerUcePublishStateCallback(mSubId, c.getBinder()); - } catch (android.os.ServiceSpecificException e) { + } catch (ServiceSpecificException e) { throw new ImsException(e.getMessage(), e.errorCode); } catch (RemoteException e) { Log.e(TAG, "Error calling IImsRcsController#registerUcePublishStateCallback", e); diff --git a/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt index a50f0461fae6..a67156a74d18 100644 --- a/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt +++ b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt @@ -19,13 +19,19 @@ package android.net import android.net.wifi.aware.DiscoverySession import android.net.wifi.aware.PeerHandle import android.net.wifi.aware.WifiAwareNetworkSpecifier +import android.os.Build import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.android.testutils.assertParcelSane +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import java.lang.IllegalStateException +import org.junit.Assert.assertFalse +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito @@ -33,18 +39,32 @@ import org.mockito.Mockito @RunWith(AndroidJUnit4::class) @SmallTest class MatchAllNetworkSpecifierTest { + @Rule @JvmField + val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule() + + private val specifier = MatchAllNetworkSpecifier() + private val discoverySession = Mockito.mock(DiscoverySession::class.java) + private val peerHandle = Mockito.mock(PeerHandle::class.java) + private val wifiAwareNetworkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, + peerHandle).build() + @Test fun testParcel() { assertParcelSane(MatchAllNetworkSpecifier(), 0) } + @Test @IgnoreAfter(Build.VERSION_CODES.R) + fun testCanBeSatisfiedBy_BeforeS() { + // MatchAllNetworkSpecifier didn't follow its parent class to change the satisfiedBy() to + // canBeSatisfiedBy(), so if a caller calls MatchAllNetworkSpecifier#canBeSatisfiedBy(), the + // NetworkSpecifier#canBeSatisfiedBy() will be called actually, and false will be returned. + // Although it's not meeting the expectation, the behavior still needs to be verified. + assertFalse(specifier.canBeSatisfiedBy(wifiAwareNetworkSpecifier)) + } + @Test(expected = IllegalStateException::class) + @IgnoreUpTo(Build.VERSION_CODES.R) fun testCanBeSatisfiedBy() { - val specifier = MatchAllNetworkSpecifier() - val discoverySession = Mockito.mock(DiscoverySession::class.java) - val peerHandle = Mockito.mock(PeerHandle::class.java) - val wifiAwareNetworkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, - peerHandle).build() specifier.canBeSatisfiedBy(wifiAwareNetworkSpecifier) } } |