diff options
56 files changed, 1111 insertions, 402 deletions
diff --git a/api/current.txt b/api/current.txt index f47a47860d17..8c6df728d1b6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -8056,7 +8056,6 @@ package android.bluetooth.le { public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); - method public boolean getEnable(); method public boolean getIncludeTxPower(); method public int getInterval(); method public void writeToParcel(android.os.Parcel, int); @@ -8066,7 +8065,6 @@ package android.bluetooth.le { public static final class PeriodicAdvertisingParameters.Builder { ctor public PeriodicAdvertisingParameters.Builder(); method public android.bluetooth.le.PeriodicAdvertisingParameters build(); - method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setEnable(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setIncludeTxPower(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } @@ -36975,6 +36973,7 @@ package android.service.autofill { public abstract class AutofillService extends android.app.Service { ctor public AutofillService(); + method public final deprecated void disableSelf(); method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); @@ -39327,6 +39326,7 @@ package android.telecom { method public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(java.lang.String); method public java.lang.String getLine1Number(android.telecom.PhoneAccountHandle); method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle); + method public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts(); method public android.telecom.PhoneAccountHandle getSimCallManager(); method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle); method public boolean handleMmi(java.lang.String); diff --git a/api/system-current.txt b/api/system-current.txt index 1a40d6a9ec5b..c4361ac1d738 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -8527,7 +8527,6 @@ package android.bluetooth.le { public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); - method public boolean getEnable(); method public boolean getIncludeTxPower(); method public int getInterval(); method public void writeToParcel(android.os.Parcel, int); @@ -8537,7 +8536,6 @@ package android.bluetooth.le { public static final class PeriodicAdvertisingParameters.Builder { ctor public PeriodicAdvertisingParameters.Builder(); method public android.bluetooth.le.PeriodicAdvertisingParameters build(); - method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setEnable(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setIncludeTxPower(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } @@ -40071,6 +40069,7 @@ package android.service.autofill { public abstract class AutofillService extends android.app.Service { ctor public AutofillService(); + method public final deprecated void disableSelf(); method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); @@ -42765,6 +42764,7 @@ package android.telecom { method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle); method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsForPackage(); method public java.util.List<android.telecom.PhoneAccountHandle> getPhoneAccountsSupportingScheme(java.lang.String); + method public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts(); method public android.telecom.PhoneAccountHandle getSimCallManager(); method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle); method public boolean handleMmi(java.lang.String); diff --git a/api/test-current.txt b/api/test-current.txt index 42e3bd613850..3470d2cdd641 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -8086,7 +8086,6 @@ package android.bluetooth.le { public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); - method public boolean getEnable(); method public boolean getIncludeTxPower(); method public int getInterval(); method public void writeToParcel(android.os.Parcel, int); @@ -8096,7 +8095,6 @@ package android.bluetooth.le { public static final class PeriodicAdvertisingParameters.Builder { ctor public PeriodicAdvertisingParameters.Builder(); method public android.bluetooth.le.PeriodicAdvertisingParameters build(); - method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setEnable(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setIncludeTxPower(boolean); method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } @@ -31848,6 +31846,7 @@ package android.os { ctor public UserHandle(android.os.Parcel); method public int describeContents(); method public static int getAppId(int); + method public int getIdentifier(); method public static android.os.UserHandle getUserHandleForUid(int); method public static android.os.UserHandle readFromParcel(android.os.Parcel); method public void writeToParcel(android.os.Parcel, int); @@ -37133,6 +37132,7 @@ package android.service.autofill { public abstract class AutofillService extends android.app.Service { ctor public AutofillService(); + method public final deprecated void disableSelf(); method public final android.os.IBinder onBind(android.content.Intent); method public void onConnected(); method public void onDisconnected(); @@ -39526,6 +39526,7 @@ package android.telecom { method public android.telecom.PhoneAccountHandle getDefaultOutgoingPhoneAccount(java.lang.String); method public java.lang.String getLine1Number(android.telecom.PhoneAccountHandle); method public android.telecom.PhoneAccount getPhoneAccount(android.telecom.PhoneAccountHandle); + method public java.util.List<android.telecom.PhoneAccountHandle> getSelfManagedPhoneAccounts(); method public android.telecom.PhoneAccountHandle getSimCallManager(); method public java.lang.String getVoiceMailNumber(android.telecom.PhoneAccountHandle); method public boolean handleMmi(java.lang.String); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 95549d68e480..06291abb69d4 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4235,14 +4235,25 @@ public class Activity extends ContextThemeWrapper mTaskDescription.setPrimaryColor(colorPrimary); } } - // For dev-preview only. - if (mTaskDescription.getBackgroundColor() == 0) { - int colorBackground = a.getColor( - com.android.internal.R.styleable.ActivityTaskDescription_colorBackground, 0); - if (colorBackground != 0 && Color.alpha(colorBackground) == 0xFF) { - mTaskDescription.setBackgroundColor(colorBackground); - } + + int colorBackground = a.getColor( + com.android.internal.R.styleable.ActivityTaskDescription_colorBackground, 0); + if (colorBackground != 0 && Color.alpha(colorBackground) == 0xFF) { + mTaskDescription.setBackgroundColor(colorBackground); + } + + final int statusBarColor = a.getColor( + com.android.internal.R.styleable.ActivityTaskDescription_statusBarColor, 0); + if (statusBarColor != 0) { + mTaskDescription.setStatusBarColor(statusBarColor); } + + final int navigationBarColor = a.getColor( + com.android.internal.R.styleable.ActivityTaskDescription_navigationBarColor, 0); + if (navigationBarColor != 0) { + mTaskDescription.setNavigationBarColor(navigationBarColor); + } + a.recycle(); setTaskDescription(mTaskDescription); } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 4004bd6686b1..aede1bb67f80 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -1145,6 +1145,8 @@ public class ActivityManager { private String mIconFilename; private int mColorPrimary; private int mColorBackground; + private int mStatusBarColor; + private int mNavigationBarColor; /** * Creates the TaskDescription to the specified values. @@ -1155,7 +1157,7 @@ public class ActivityManager { * opaque. */ public TaskDescription(String label, Bitmap icon, int colorPrimary) { - this(label, icon, null, colorPrimary, 0); + this(label, icon, null, colorPrimary, 0, 0, 0); if ((colorPrimary != 0) && (Color.alpha(colorPrimary) != 255)) { throw new RuntimeException("A TaskDescription's primary color should be opaque"); } @@ -1168,7 +1170,7 @@ public class ActivityManager { * @param icon An icon that represents the current state of this activity. */ public TaskDescription(String label, Bitmap icon) { - this(label, icon, null, 0, 0); + this(label, icon, null, 0, 0, 0, 0); } /** @@ -1177,24 +1179,26 @@ public class ActivityManager { * @param label A label and description of the current state of this activity. */ public TaskDescription(String label) { - this(label, null, null, 0, 0); + this(label, null, null, 0, 0, 0, 0); } /** * Creates an empty TaskDescription. */ public TaskDescription() { - this(null, null, null, 0, 0); + this(null, null, null, 0, 0, 0, 0); } /** @hide */ public TaskDescription(String label, Bitmap icon, String iconFilename, int colorPrimary, - int colorBackground) { + int colorBackground, int statusBarColor, int navigationBarColor) { mLabel = label; mIcon = icon; mIconFilename = iconFilename; mColorPrimary = colorPrimary; mColorBackground = colorBackground; + mStatusBarColor = statusBarColor; + mNavigationBarColor = navigationBarColor; } /** @@ -1214,6 +1218,8 @@ public class ActivityManager { mIconFilename = other.mIconFilename; mColorPrimary = other.mColorPrimary; mColorBackground = other.mColorBackground; + mStatusBarColor = other.mStatusBarColor; + mNavigationBarColor = other.mNavigationBarColor; } private TaskDescription(Parcel source) { @@ -1253,6 +1259,20 @@ public class ActivityManager { } /** + * @hide + */ + public void setStatusBarColor(int statusBarColor) { + mStatusBarColor = statusBarColor; + } + + /** + * @hide + */ + public void setNavigationBarColor(int navigationBarColor) { + mNavigationBarColor = navigationBarColor; + } + + /** * Sets the icon for this task description. * @hide */ @@ -1325,6 +1345,20 @@ public class ActivityManager { return mColorBackground; } + /** + * @hide + */ + public int getStatusBarColor() { + return mStatusBarColor; + } + + /** + * @hide + */ + public int getNavigationBarColor() { + return mNavigationBarColor; + } + /** @hide */ public void saveToXml(XmlSerializer out) throws IOException { if (mLabel != null) { @@ -1377,6 +1411,8 @@ public class ActivityManager { } dest.writeInt(mColorPrimary); dest.writeInt(mColorBackground); + dest.writeInt(mStatusBarColor); + dest.writeInt(mNavigationBarColor); if (mIconFilename == null) { dest.writeInt(0); } else { @@ -1390,6 +1426,8 @@ public class ActivityManager { mIcon = source.readInt() > 0 ? Bitmap.CREATOR.createFromParcel(source) : null; mColorPrimary = source.readInt(); mColorBackground = source.readInt(); + mStatusBarColor = source.readInt(); + mNavigationBarColor = source.readInt(); mIconFilename = source.readInt() > 0 ? source.readString() : null; } @@ -1407,7 +1445,9 @@ public class ActivityManager { public String toString() { return "TaskDescription Label: " + mLabel + " Icon: " + mIcon + " IconFilename: " + mIconFilename + " colorPrimary: " + mColorPrimary + - " colorBackground: " + mColorBackground; + " colorBackground: " + mColorBackground + + " statusBarColor: " + mColorBackground + + " navigationBarColor: " + mNavigationBarColor; } } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 3167ba7fe331..5022d7d9622b 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2199,7 +2199,7 @@ public final class ActivityThread { public ContextImpl getSystemUiContext() { synchronized (this) { if (mSystemUiContext == null) { - mSystemUiContext = ContextImpl.createSystemUiContext(this); + mSystemUiContext = ContextImpl.createSystemUiContext(getSystemContext()); } return mSystemUiContext; } diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 75f9d671fbad..6cc8a14ea2f9 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2220,11 +2220,12 @@ class ContextImpl extends Context { /** * System Context to be used for UI. This Context has resources that can be themed. + * Make sure that the created system UI context shares the same LoadedApk as the system context. */ - static ContextImpl createSystemUiContext(ActivityThread mainThread) { - LoadedApk packageInfo = new LoadedApk(mainThread); - ContextImpl context = new ContextImpl(null, mainThread, packageInfo, null, null, null, 0, - null); + static ContextImpl createSystemUiContext(ContextImpl systemContext) { + final LoadedApk packageInfo = systemContext.mPackageInfo; + ContextImpl context = new ContextImpl(null, systemContext.mMainThread, packageInfo, null, + null, null, 0, null); context.setResources(createResources(null, packageInfo, null, Display.DEFAULT_DISPLAY, null, packageInfo.getCompatibilityInfo())); return context; diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java index f5c1f08562f6..4e9fac3ee22b 100644 --- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java +++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java @@ -241,8 +241,8 @@ public final class AdvertisingSetParameters implements Parcelable { */ public static final class Builder { - private boolean connectable = true; - private boolean scannable = true; + private boolean connectable = false; + private boolean scannable = false; private boolean isLegacy = false; private boolean isAnonymous = false; private boolean includeTxPower = false; @@ -254,8 +254,8 @@ public final class AdvertisingSetParameters implements Parcelable { /** * Set whether the advertisement type should be connectable or * non-connectable. - * Legacy advertisements can be both connectable and scannable. Other - * advertisements can be connectable only if not scannable. + * Legacy advertisements can be both connectable and scannable. Non-legacy + * advertisements can be only scannable or only connectable. * @param connectable Controls whether the advertisment type will be * connectable (true) or non-connectable (false). */ @@ -265,9 +265,9 @@ public final class AdvertisingSetParameters implements Parcelable { } /** - * Set whether the advertisement type should be scannable - * Legacy advertisements can be both connectable and scannable. Other - * advertisements can be scannable only if not connectable. + * Set whether the advertisement type should be scannable. + * Legacy advertisements can be both connectable and scannable. Non-legacy + * advertisements can be only scannable or only connectable. * @param scannable Controls whether the advertisment type will be * scannable (true) or non-scannable (false). */ diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java index a9deb752e081..73fc1339afa6 100644 --- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java +++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java @@ -386,7 +386,7 @@ public final class BluetoothLeAdvertiser { } boolean supportPeriodic = mBluetoothAdapter.isLePeriodicAdvertisingSupported(); - if (periodicParameters != null && periodicParameters.getEnable() && !supportPeriodic) { + if (periodicParameters != null && !supportPeriodic) { throw new IllegalArgumentException( "Controller does not support LE Periodic Advertising"); } diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java b/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java index 149540ce0dab..8891d2e842d6 100644 --- a/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java +++ b/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java @@ -29,28 +29,20 @@ public final class PeriodicAdvertisingParameters implements Parcelable { private static final int INTERVAL_MAX = 80; private static final int INTERVAL_MIN = 65519; - private final boolean enable; private final boolean includeTxPower; private final int interval; - private PeriodicAdvertisingParameters(boolean enable, boolean includeTxPower, int interval) { - this.enable = enable; + private PeriodicAdvertisingParameters(boolean includeTxPower, int interval) { this.includeTxPower = includeTxPower; this.interval = interval; } private PeriodicAdvertisingParameters(Parcel in) { - enable = in.readInt() != 0 ? true : false; includeTxPower = in.readInt() != 0 ? true : false; interval = in.readInt(); } /** - * Returns whether the periodic advertising shall be enabled. - */ - public boolean getEnable() { return enable; } - - /** * Returns whether the TX Power will be included. */ public boolean getIncludeTxPower() { return includeTxPower; } @@ -68,7 +60,6 @@ public final class PeriodicAdvertisingParameters implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(enable ? 1 : 0); dest.writeInt(includeTxPower ? 1 : 0); dest.writeInt(interval); } @@ -89,18 +80,9 @@ public final class PeriodicAdvertisingParameters implements Parcelable { public static final class Builder { private boolean includeTxPower = false; - private boolean enable = false; private int interval = INTERVAL_MAX; /** - * Set whether the Periodic Advertising should be enabled for this set. - */ - public Builder setEnable(boolean enable) { - this.enable = enable; - return this; - } - - /** * Whether the transmission power level should be included in the periodic * packet. */ @@ -128,7 +110,7 @@ public final class PeriodicAdvertisingParameters implements Parcelable { * Build the {@link AdvertisingSetParameters} object. */ public PeriodicAdvertisingParameters build() { - return new PeriodicAdvertisingParameters(enable, includeTxPower, interval); + return new PeriodicAdvertisingParameters(includeTxPower, interval); } } } diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index 4aec8aea24c5..6a4fef2b67e8 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -344,6 +344,7 @@ public final class UserHandle implements Parcelable { * @hide */ @SystemApi + @TestApi public @UserIdInt int getIdentifier() { return mHandle; } diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java index d86dd5b42bb9..a4d3fb299734 100644 --- a/core/java/android/service/autofill/AutofillService.java +++ b/core/java/android/service/autofill/AutofillService.java @@ -242,7 +242,7 @@ public abstract class AutofillService extends Service { public void onDisconnected() { } - /** @hide */ + @Deprecated public final void disableSelf() { // TODO(b/33197203): Remove when GCore has migrated off this API getSystemService(AutofillManager.class).disableOwnedAutofillServices(); diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 1abb59b006dd..a70209c705c0 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -74,6 +74,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame private final Rect mOldStableInsets = new Rect(); private final Rect mSystemInsets = new Rect(); private final Rect mStableInsets = new Rect(); + private final Rect mTmpRect = new Rect(); public BackdropFrameRenderer(DecorView decorView, ThreadedRenderer renderer, Rect initialBounds, Drawable resizingBackgroundDrawable, Drawable captionBackgroundDrawable, @@ -370,12 +371,6 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame DisplayListCanvas canvas = mSystemBarBackgroundNode.start(width, height); mSystemBarBackgroundNode.setLeftTopRightBottom(left, top, left + width, top + height); final int topInset = DecorView.getColorViewTopInset(mStableInsets.top, mSystemInsets.top); - final int bottomInset = DecorView.getColorViewBottomInset(stableInsets.bottom, - systemInsets.bottom); - final int rightInset = DecorView.getColorViewRightInset(stableInsets.right, - systemInsets.right); - final int leftInset = DecorView.getColorViewLeftInset(stableInsets.left, - systemInsets.left); if (mStatusBarColor != null) { mStatusBarColor.setBounds(0, 0, left + width, topInset); mStatusBarColor.draw(canvas); @@ -385,14 +380,8 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame // don't want the navigation bar background be moving around when resizing in docked mode. // However, we need it for the transitions into/out of docked mode. if (mNavigationBarColor != null && fullscreen) { - final int size = DecorView.getNavBarSize(bottomInset, rightInset, leftInset); - if (DecorView.isNavBarToRightEdge(bottomInset, rightInset)) { - mNavigationBarColor.setBounds(width - size, 0, width, height); - } else if (DecorView.isNavBarToLeftEdge(bottomInset, leftInset)) { - mNavigationBarColor.setBounds(0, 0, size, height); - } else { - mNavigationBarColor.setBounds(0, height - size, width, height); - } + DecorView.getNavigationBarRect(width, height, stableInsets, systemInsets, mTmpRect); + mNavigationBarColor.setBounds(mTmpRect); mNavigationBarColor.draw(canvas); } mSystemBarBackgroundNode.end(canvas); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 7282492a4ccc..8e6e63b0e238 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -119,6 +119,21 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // The height of a window which has not in DIP. private final static int DECOR_SHADOW_UNFOCUSED_HEIGHT_IN_DIP = 5; + public static final ColorViewAttributes STATUS_BAR_COLOR_VIEW_ATTRIBUTES = + new ColorViewAttributes(SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS, + Gravity.TOP, Gravity.LEFT, Gravity.RIGHT, + Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME, + com.android.internal.R.id.statusBarBackground, + FLAG_FULLSCREEN); + + public static final ColorViewAttributes NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES = + new ColorViewAttributes( + SYSTEM_UI_FLAG_HIDE_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION, + Gravity.BOTTOM, Gravity.RIGHT, Gravity.LEFT, + Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME, + com.android.internal.R.id.navigationBarBackground, + 0 /* hideWindowFlag */); + // Cludge to address b/22668382: Set the shadow size to the maximum so that the layer // size calculation takes the shadow size into account. We set the elevation currently // to max until the first layout command has been executed. @@ -162,18 +177,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // View added at runtime to draw under the navigation bar area private View mNavigationGuard; - private final ColorViewState mStatusColorViewState = new ColorViewState( - SYSTEM_UI_FLAG_FULLSCREEN, FLAG_TRANSLUCENT_STATUS, - Gravity.TOP, Gravity.LEFT, Gravity.RIGHT, - Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME, - com.android.internal.R.id.statusBarBackground, - FLAG_FULLSCREEN); - private final ColorViewState mNavigationColorViewState = new ColorViewState( - SYSTEM_UI_FLAG_HIDE_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION, - Gravity.BOTTOM, Gravity.RIGHT, Gravity.LEFT, - Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME, - com.android.internal.R.id.navigationBarBackground, - 0 /* hideWindowFlag */); + private final ColorViewState mStatusColorViewState = + new ColorViewState(STATUS_BAR_COLOR_VIEW_ATTRIBUTES); + private final ColorViewState mNavigationColorViewState = + new ColorViewState(NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES); private final Interpolator mShowInterpolator; private final Interpolator mHideInterpolator; @@ -983,35 +990,50 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind return false; } - static int getColorViewTopInset(int stableTop, int systemTop) { + public static int getColorViewTopInset(int stableTop, int systemTop) { return Math.min(stableTop, systemTop); } - static int getColorViewBottomInset(int stableBottom, int systemBottom) { + public static int getColorViewBottomInset(int stableBottom, int systemBottom) { return Math.min(stableBottom, systemBottom); } - static int getColorViewRightInset(int stableRight, int systemRight) { + public static int getColorViewRightInset(int stableRight, int systemRight) { return Math.min(stableRight, systemRight); } - static int getColorViewLeftInset(int stableLeft, int systemLeft) { + public static int getColorViewLeftInset(int stableLeft, int systemLeft) { return Math.min(stableLeft, systemLeft); } - static boolean isNavBarToRightEdge(int bottomInset, int rightInset) { + public static boolean isNavBarToRightEdge(int bottomInset, int rightInset) { return bottomInset == 0 && rightInset > 0; } - static boolean isNavBarToLeftEdge(int bottomInset, int leftInset) { + public static boolean isNavBarToLeftEdge(int bottomInset, int leftInset) { return bottomInset == 0 && leftInset > 0; } - static int getNavBarSize(int bottomInset, int rightInset, int leftInset) { + public static int getNavBarSize(int bottomInset, int rightInset, int leftInset) { return isNavBarToRightEdge(bottomInset, rightInset) ? rightInset : isNavBarToLeftEdge(bottomInset, leftInset) ? leftInset : bottomInset; } + public static void getNavigationBarRect(int canvasWidth, int canvasHeight, Rect stableInsets, + Rect contentInsets, Rect outRect) { + final int bottomInset = getColorViewBottomInset(stableInsets.bottom, contentInsets.bottom); + final int leftInset = getColorViewLeftInset(stableInsets.left, contentInsets.left); + final int rightInset = getColorViewLeftInset(stableInsets.right, contentInsets.right); + final int size = getNavBarSize(bottomInset, rightInset, leftInset); + if (isNavBarToRightEdge(bottomInset, rightInset)) { + outRect.set(canvasWidth - size, 0, canvasWidth, canvasHeight); + } else if (isNavBarToLeftEdge(bottomInset, leftInset)) { + outRect.set(0, 0, size, canvasHeight); + } else { + outRect.set(0, canvasHeight - size, canvasWidth, canvasHeight); + } + } + WindowInsets updateColorViews(WindowInsets insets, boolean animate) { WindowManager.LayoutParams attrs = mWindow.getAttributes(); int sysUiVisibility = attrs.systemUiVisibility | getWindowSystemUiVisibility(); @@ -1131,9 +1153,14 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } private int calculateStatusBarColor() { - int flags = mWindow.getAttributes().flags; - return (flags & FLAG_TRANSLUCENT_STATUS) != 0 ? mSemiTransparentStatusBarColor - : (flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 ? mWindow.mStatusBarColor + return calculateStatusBarColor(mWindow.getAttributes().flags, + mSemiTransparentStatusBarColor, mWindow.mStatusBarColor); + } + + public static int calculateStatusBarColor(int flags, int semiTransparentStatusBarColor, + int statusBarColor) { + return (flags & FLAG_TRANSLUCENT_STATUS) != 0 ? semiTransparentStatusBarColor + : (flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 ? statusBarColor : Color.BLACK; } @@ -1160,13 +1187,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color, int size, boolean verticalBar, boolean seascape, int sideMargin, boolean animate, boolean force) { - state.present = (sysUiVis & state.systemUiHideFlag) == 0 - && (mWindow.getAttributes().flags & state.hideWindowFlag) == 0 - && ((mWindow.getAttributes().flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 - || force); - boolean show = state.present - && (color & Color.BLACK) != 0 - && ((mWindow.getAttributes().flags & state.translucentFlag) == 0 || force); + state.present = state.attributes.isPresent(sysUiVis, mWindow.getAttributes().flags, force); + boolean show = state.attributes.isVisible(state.present, color, + mWindow.getAttributes().flags, force); boolean showView = show && !isResizing() && size > 0; boolean visibilityChanged = false; @@ -1175,15 +1198,15 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind int resolvedHeight = verticalBar ? LayoutParams.MATCH_PARENT : size; int resolvedWidth = verticalBar ? size : LayoutParams.MATCH_PARENT; int resolvedGravity = verticalBar - ? (seascape ? state.seascapeGravity : state.horizontalGravity) - : state.verticalGravity; + ? (seascape ? state.attributes.seascapeGravity : state.attributes.horizontalGravity) + : state.attributes.verticalGravity; if (view == null) { if (showView) { state.view = view = new View(mContext); view.setBackgroundColor(color); - view.setTransitionName(state.transitionName); - view.setId(state.id); + view.setTransitionName(state.attributes.transitionName); + view.setId(state.attributes.id); visibilityChanged = true; view.setVisibility(INVISIBLE); state.targetVisibility = VISIBLE; @@ -2271,6 +2294,15 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind boolean visible; int color; + final ColorViewAttributes attributes; + + ColorViewState(ColorViewAttributes attributes) { + this.attributes = attributes; + } + } + + public static class ColorViewAttributes { + final int id; final int systemUiHideFlag; final int translucentFlag; @@ -2280,9 +2312,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind final String transitionName; final int hideWindowFlag; - ColorViewState(int systemUiHideFlag, - int translucentFlag, int verticalGravity, int horizontalGravity, - int seascapeGravity, String transitionName, int id, int hideWindowFlag) { + private ColorViewAttributes(int systemUiHideFlag, int translucentFlag, int verticalGravity, + int horizontalGravity, int seascapeGravity, String transitionName, int id, + int hideWindowFlag) { this.id = id; this.systemUiHideFlag = systemUiHideFlag; this.translucentFlag = translucentFlag; @@ -2292,6 +2324,24 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind this.transitionName = transitionName; this.hideWindowFlag = hideWindowFlag; } + + public boolean isPresent(int sysUiVis, int windowFlags, boolean force) { + return (sysUiVis & systemUiHideFlag) == 0 + && (windowFlags & hideWindowFlag) == 0 + && ((windowFlags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 + || force); + } + + public boolean isVisible(boolean present, int color, int windowFlags, boolean force) { + return present + && (color & Color.BLACK) != 0 + && ((windowFlags & translucentFlag) == 0 || force); + } + + public boolean isVisible(int sysUiVis, int color, int windowFlags, boolean force) { + final boolean present = isPresent(sysUiVis, windowFlags, force); + return isVisible(present, color, windowFlags, force); + } } /** diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 69c6fa4a3a62..d26d952224f1 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -8559,6 +8559,11 @@ <!-- @hide From Theme.colorBackground, used for the TaskDescription background color. --> <attr name="colorBackground" /> + <!-- @hide From Theme.statusBarColor, used for the TaskDescription status bar color. --> + <attr name="statusBarColor"/> + <!-- @hide From Theme.navigationBarColor, used for the TaskDescription navigation bar + color. --> + <attr name="navigationBarColor"/> </declare-styleable> <declare-styleable name="Shortcut"> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml index 7d098761c545..1eeed3c69632 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml @@ -58,12 +58,16 @@ <item msgid="3878793616631049349">"Koristi HDCP proveru samo za DRM sadržaj"</item> <item msgid="45075631231212732">"Uvek koristi HDCP proveru"</item> </string-array> - <!-- no translation found for bluetooth_avrcp_versions:0 (5347678900838034763) --> - <!-- no translation found for bluetooth_avrcp_versions:1 (2089555299377409443) --> - <!-- no translation found for bluetooth_avrcp_versions:2 (2895327394279434278) --> - <!-- no translation found for bluetooth_avrcp_version_values:0 (2838624067805073303) --> - <!-- no translation found for bluetooth_avrcp_version_values:1 (1913619118958233129) --> - <!-- no translation found for bluetooth_avrcp_version_values:2 (7142710449249088270) --> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP 1.4 (podrazumevano)"</item> + <item msgid="2089555299377409443">"AVRCP 1.5"</item> + <item msgid="2895327394279434278">"AVRCP 1.6"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="1913619118958233129">"avrcp15"</item> + <item msgid="7142710449249088270">"avrcp16"</item> + </string-array> <string-array name="bluetooth_a2dp_codec_titles"> <item msgid="7065842274271279580">"Koristi izbor sistema (podrazumevano)"</item> <item msgid="7539690996561263909">"SBC"</item> @@ -71,6 +75,8 @@ <item msgid="8910200421843557332">"aptX"</item> <item msgid="8434403964359457768">"aptX HD"</item> <item msgid="6751080638867012696">"LDAC"</item> + <item msgid="723675059572222462">"Omogući opcionalne kodeke"</item> + <item msgid="3304843301758635896">"Onemogući opcionalne kodeke"</item> </string-array> <string-array name="bluetooth_a2dp_codec_summaries"> <item msgid="5062108632402595000">"Koristi izbor sistema (podrazumevano)"</item> @@ -79,6 +85,8 @@ <item msgid="2279916056363477395">"aptX"</item> <item msgid="6641171061200063516">"aptX HD"</item> <item msgid="7950781694447359344">"LDAC"</item> + <item msgid="2209680154067241740">"Omogući opcionalne kodeke"</item> + <item msgid="741805482892725657">"Onemogući opcionalne kodeke"</item> </string-array> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Koristi izbor sistema (podrazumevano)"</item> @@ -120,11 +128,13 @@ <item msgid="7158319962230727476">"Optimizovano za kvalitet zvuka (990 kb/s/909 kb/s)"</item> <item msgid="2921767058740704969">"Ujednačen kvalitet zvuka i veze (660 kb/s/606 kb/s)"</item> <item msgid="8860982705384396512">"Optimizovano za kvalitet veze (330 kb/s/303 kb/s)"</item> + <item msgid="4414060457677684127">"Najbolje moguće (prilagodljiva brzina prenosa)"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> <item msgid="6398189564246596868">"Optimizovano za kvalitet zvuka"</item> <item msgid="4327143584633311908">"Ujednačen kvalitet zvuka i veze"</item> <item msgid="4681409244565426925">"Optimizovano za kvalitet veze"</item> + <item msgid="364670732877872677">"Najbolje moguće (prilagodljiva brzina prenosa)"</item> </string-array> <string-array name="select_logd_size_titles"> <item msgid="8665206199209698501">"Isključeno"</item> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 24b2a13854c3..94c3907ce784 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -32,10 +32,8 @@ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Automatsko povezivanje nije uspelo"</string> <string name="wifi_no_internet" msgid="3880396223819116454">"Nema pristupa internetu"</string> <string name="saved_network" msgid="4352716707126620811">"Sačuvao/la je <xliff:g id="NAME">%1$s</xliff:g>"</string> - <!-- no translation found for connected_via_network_scorer (5713793306870815341) --> - <skip /> - <!-- no translation found for connected_via_network_scorer_default (8430960324014668989) --> - <skip /> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano preko %1$s"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano preko dobavljača ocene mreže"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Veza je uspostavljena preko pristupne tačke %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupna je preko pristupne tačke %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Veza je uspostavljena, nema interneta"</string> @@ -141,7 +139,7 @@ <item msgid="5194774745031751806">"Veoma ubrzano"</item> <item msgid="9085102246155045744">"Najbrže"</item> </string-array> - <string name="choose_profile" msgid="8229363046053568878">"Izaberite profil"</string> + <string name="choose_profile" msgid="6921016979430278661">"Izaberite profil"</string> <string name="category_personal" msgid="1299663247844969448">"Lično"</string> <string name="category_work" msgid="8699184680584175622">"Posao"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcije za programera"</string> @@ -170,16 +168,12 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Umrežavanje"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Sertifikacija bežičnog ekrana"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Omogući detaljniju evidenciju za Wi‑Fi"</string> - <!-- no translation found for wifi_aggressive_handover (5309131983693661320) --> - <skip /> + <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Agresivan prelaz sa Wi‑Fi mreže na mobilnu"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvek dozvoli skeniranje Wi‑Fi-ja u romingu"</string> - <!-- no translation found for mobile_data_always_on (8774857027458200434) --> - <skip /> + <string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilni podaci su uvek aktivni"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogući glavno podešavanje jačine zvuka"</string> - <!-- no translation found for bluetooth_select_avrcp_version_string (3750059931120293633) --> - <skip /> - <!-- no translation found for bluetooth_select_avrcp_version_dialog_title (7277329668298705702) --> - <skip /> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Verzija Bluetooth AVRCP-a"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Izaberite verziju Bluetooth AVRCP-a"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth audio kodek"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Izaberite Bluetooth audio kodek"</string> <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorkovanja za Bluetooth audio"</string> @@ -193,8 +187,7 @@ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Strimovanje: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Prikaz opcija za sertifikaciju bežičnog ekrana"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećava nivo evidentiranja za Wi‑Fi. Prikaz po SSID RSSI-u u biraču Wi‑Fi mreže"</string> - <!-- no translation found for wifi_aggressive_handover_summary (7266329646559808827) --> - <skip /> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"Kad se omogući, Wi‑Fi će biti agresivniji pri prebacivanju mreže za prenos podataka na mobilnu ako je Wi‑Fi signal slab"</string> <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"Dozvoli/zabrani skeniranje Wi-Fi-ja u romingu na osnovu prisutnog protoka podataka na interfejsu"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"Veličine bafera podataka u programu za evidentiranje"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Izaberite veličine po baferu evidencije"</string> @@ -323,38 +316,23 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekcija boja"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može da utiče na performanse."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamenjuje ga <xliff:g id="TITLE">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only" msgid="4400068916452346544">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"Još oko <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> do potpunog punjenja"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Preostalo vreme: <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_discharging_duration (2843747179907396142) --> - <skip /> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – ostalo je oko <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"Preostalo je <xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration (4676999980973411875) --> - <skip /> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do potpunog punjenja"</string> <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_ac (7341243578143555689) --> - <skip /> - <string name="power_charging_duration_ac_short" msgid="7895864687218765582">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_usb (3720632890882121805) --> - <skip /> - <string name="power_charging_duration_usb_short" msgid="941854728040426399">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_wireless (5768338238751562058) --> - <skip /> - <string name="power_charging_duration_wireless_short" msgid="1642664799869599476">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string> - <string name="battery_info_status_charging_ac" msgid="2909861890674399949">"Punjenje preko punjača"</string> - <string name="battery_info_status_charging_ac_short" msgid="7431401092096415502">"Puni se"</string> - <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"Punjenje preko USB-a"</string> - <string name="battery_info_status_charging_usb_short" msgid="6733371990319101366">"Puni se"</string> - <string name="battery_info_status_charging_wireless" msgid="3574032603735446573">"Bežično punjenje"</string> - <string name="battery_info_status_charging_wireless_short" msgid="752569941028903610">"Puni se"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"puni se"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ne puni se"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ne puni se"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puno"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Kontroliše administrator"</string> - <string name="enabled_by_admin" msgid="2386503803463071894">"Omogućio je administrator"</string> - <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogućio je administrator"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"Omogućio je administrator"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"Administrator je onemogućio"</string> <string name="home" msgid="3256884684164448244">"Početna za Podešavanja"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> @@ -377,4 +355,7 @@ <string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string> <string name="active_input_method_subtypes" msgid="3596398805424733238">"Metode aktivnog unosa"</string> <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Koristi jezike sistema"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Otvaranje podešavanja za aplikaciju <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> nije uspelo"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"Ovaj metod unosa možda može da prikuplja sav tekst koji unosite, uključujući lične podatke, kao što su lozinke i brojevi kreditnih kartica. Potiče od aplikacije <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Želite li da koristite ovaj metod unosa?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"Napomena: Posle restartovanja ova aplikacija ne može da se pokrene dok ne otključate telefon"</string> </resources> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index 6c883e3e0c54..8ea31e58943e 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -58,12 +58,16 @@ <item msgid="3878793616631049349">"Выкарыстанне праверкі HDCP только для змесціва, абароненага DRM"</item> <item msgid="45075631231212732">"Заўсёды выкарыстоўваць праверку HDCP"</item> </string-array> - <!-- no translation found for bluetooth_avrcp_versions:0 (5347678900838034763) --> - <!-- no translation found for bluetooth_avrcp_versions:1 (2089555299377409443) --> - <!-- no translation found for bluetooth_avrcp_versions:2 (2895327394279434278) --> - <!-- no translation found for bluetooth_avrcp_version_values:0 (2838624067805073303) --> - <!-- no translation found for bluetooth_avrcp_version_values:1 (1913619118958233129) --> - <!-- no translation found for bluetooth_avrcp_version_values:2 (7142710449249088270) --> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP 1.4 (стандартная)"</item> + <item msgid="2089555299377409443">"AVRCP 1.5"</item> + <item msgid="2895327394279434278">"AVRCP 1.6"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="1913619118958233129">"avrcp15"</item> + <item msgid="7142710449249088270">"avrcp16"</item> + </string-array> <string-array name="bluetooth_a2dp_codec_titles"> <item msgid="7065842274271279580">"Выбар сістэмы (стандартны)"</item> <item msgid="7539690996561263909">"SBC"</item> @@ -71,6 +75,8 @@ <item msgid="8910200421843557332">"aptX"</item> <item msgid="8434403964359457768">"aptX HD"</item> <item msgid="6751080638867012696">"LDAC"</item> + <item msgid="723675059572222462">"Уключыць дадатковыя кодэкі"</item> + <item msgid="3304843301758635896">"Адключыць дадатковыя кодэкі"</item> </string-array> <string-array name="bluetooth_a2dp_codec_summaries"> <item msgid="5062108632402595000">"Выбар сістэмы (стандартны)"</item> @@ -79,6 +85,8 @@ <item msgid="2279916056363477395">"aptX"</item> <item msgid="6641171061200063516">"aptX HD"</item> <item msgid="7950781694447359344">"LDAC"</item> + <item msgid="2209680154067241740">"Уключыць дадатковыя кодэкі"</item> + <item msgid="741805482892725657">"Адключыць дадатковыя кодэкі"</item> </string-array> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Выбар сістэмы (стандартны)"</item> @@ -120,11 +128,13 @@ <item msgid="7158319962230727476">"Аптымізавана якасць гуку (990 кбіт/c / 909 кбіт/c)"</item> <item msgid="2921767058740704969">"Збалансаваная якасць аўдыя і падключэння (660кбіт/c / 606 кбіт/c)"</item> <item msgid="8860982705384396512">"Аптымізавана якасць падключэння (330 кбіт/c / 303 кбіт/c)"</item> + <item msgid="4414060457677684127">"Best Effort (адаптыўны бітрэйт)"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> <item msgid="6398189564246596868">"Аптымізавана якасць гуку"</item> <item msgid="4327143584633311908">"Збалансаваная якасць аўдыя і падключэння"</item> <item msgid="4681409244565426925">"Аптымізавана якасць падключэння"</item> + <item msgid="364670732877872677">"Best Effort (адаптыўны бітрэйт)"</item> </string-array> <string-array name="select_logd_size_titles"> <item msgid="8665206199209698501">"Выкл."</item> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 36ebaa309636..f3402325b152 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -32,10 +32,8 @@ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Не будзе аўтаматычна падключацца"</string> <string name="wifi_no_internet" msgid="3880396223819116454">"Няма доступу да інтэрнэту"</string> <string name="saved_network" msgid="4352716707126620811">"Хто захаваў: <xliff:g id="NAME">%1$s</xliff:g>"</string> - <!-- no translation found for connected_via_network_scorer (5713793306870815341) --> - <skip /> - <!-- no translation found for connected_via_network_scorer_default (8430960324014668989) --> - <skip /> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"Аўтаматычна падключана праз %1$s"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Аўтаматычна падключана праз пастаўшчыка паслугі ацэнкі сеткі"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Падлучана праз %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Даступна праз %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Падлучана, няма інтэрнэту"</string> @@ -141,7 +139,7 @@ <item msgid="5194774745031751806">"Вельмі шпарка"</item> <item msgid="9085102246155045744">"Максімальна хутка"</item> </string-array> - <string name="choose_profile" msgid="8229363046053568878">"Выбраць профіль"</string> + <string name="choose_profile" msgid="6921016979430278661">"Выбраць профіль"</string> <string name="category_personal" msgid="1299663247844969448">"Асабісты"</string> <string name="category_work" msgid="8699184680584175622">"Рабочы"</string> <string name="development_settings_title" msgid="215179176067683667">"Параметры распрацоўшчыка"</string> @@ -170,16 +168,12 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Сеткі"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Сертыфікацыя бесправаднога дысплея"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Уключыць падрабязны журнал Wi‑Fi"</string> - <!-- no translation found for wifi_aggressive_handover (5309131983693661320) --> - <skip /> + <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Інтэнсіўны пераход з Wi‑Fi на маб. сетку"</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Заўсёды дазваляць роўмінгавае сканіраванне Wi‑Fi"</string> - <!-- no translation found for mobile_data_always_on (8774857027458200434) --> - <skip /> + <string name="mobile_data_always_on" msgid="8774857027458200434">"Мабільная перадача даных заўсёды актыўная"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Адключыць абсалютны гук"</string> - <!-- no translation found for bluetooth_select_avrcp_version_string (3750059931120293633) --> - <skip /> - <!-- no translation found for bluetooth_select_avrcp_version_dialog_title (7277329668298705702) --> - <skip /> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Версія Bluetooth AVRCP"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Выбраць версію Bluetooth AVRCP"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Кодэк Bluetooth Audio"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Выбраць аўдыякодэк Bluetooth"</string> <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Частата дыскрэтызацыі Bluetooth Audio"</string> @@ -193,8 +187,7 @@ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Перадача плынню: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Паказаць опцыі сертыфікацыі бесправаднога дысплея"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Падвыс. узровень дэтал-цыі журнала Wi‑Fi у залежн. ад SSID RSSI у Wi‑Fi Picker"</string> - <!-- no translation found for wifi_aggressive_handover_summary (7266329646559808827) --> - <skip /> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"Калі гэта функцыя ўключана, Wi-Fi будзе больш інтэнсіўна імкнуцца перайсці на падключ. маб. перад. даных пры слабым сігнале Wi‑Fi"</string> <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"Дазволіць/забараніць роўмінгавае сканіраванне Wi‑Fi ў залежнасці ад аб\'ёму трафіку даных у інтэрфейсе"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"Памеры буфера для сродку вядзення журнала"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Выберыце памеры сродку вядзення журнала для буфераў журнала"</string> @@ -323,38 +316,23 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Карэкцыя колеру"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Гэтая функцыя з\'яўляецца эксперыментальнай і можа паўплываць на прадукцыйнасць."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Перавызначаны <xliff:g id="TITLE">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only" msgid="4400068916452346544">"Засталося прыблізна <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"Засталося каля <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Да поўнай зарадкі засталося <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Засталося <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_discharging_duration (2843747179907396142) --> - <skip /> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося каля <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration (4676999980973411875) --> - <skip /> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> да поўнай зарадкі"</string> <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_ac (7341243578143555689) --> - <skip /> - <string name="power_charging_duration_ac_short" msgid="7895864687218765582">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_usb (3720632890882121805) --> - <skip /> - <string name="power_charging_duration_usb_short" msgid="941854728040426399">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_wireless (5768338238751562058) --> - <skip /> - <string name="power_charging_duration_wireless_short" msgid="1642664799869599476">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Невядома"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Зарадка"</string> - <string name="battery_info_status_charging_ac" msgid="2909861890674399949">"Зар. ад сеткі пер. току"</string> - <string name="battery_info_status_charging_ac_short" msgid="7431401092096415502">"Зарадка"</string> - <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"Зарадка па USB"</string> - <string name="battery_info_status_charging_usb_short" msgid="6733371990319101366">"Зарадка"</string> - <string name="battery_info_status_charging_wireless" msgid="3574032603735446573">"Бесправадная зарадка"</string> - <string name="battery_info_status_charging_wireless_short" msgid="752569941028903610">"Зарадка"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ідзе зарадка"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Не зараджаецца"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Не зараджаецца"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Поўная"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Кантралюецца адміністратарам"</string> - <string name="enabled_by_admin" msgid="2386503803463071894">"Уключана адміністратарам"</string> - <string name="disabled_by_admin" msgid="3669999613095206948">"Адключана адміністратарам"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"Уключана адміністратарам"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"Адключана адміністратарам"</string> <string name="home" msgid="3256884684164448244">"Галоўная старонка налад"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0 %"</item> @@ -377,4 +355,7 @@ <string name="retail_demo_reset_title" msgid="696589204029930100">"Патрабуецца пароль"</string> <string name="active_input_method_subtypes" msgid="3596398805424733238">"Актыўныя метады ўводу"</string> <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Выкарыстоўваць мовы сістэмы"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Не атрымалася адкрыць параметры <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"Гэты метад уводу можа збіраць увесь тэкст, які ўводзіцца, у тым лiку такiя персанальныя дадзеныя, як паролі і нумары крэдытных карт. Ён выкарыстоўваецца прыкладаннем <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Выкарыстоўваць гэты метад уводу?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"Заўвага. Пасля перазагрузкі гэта праграма не зможа запусціцца, пакуль вы не разблакіруеце тэлефон"</string> </resources> diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml index 58b3a47d0030..e0b3e3612d83 100644 --- a/packages/SettingsLib/res/values-bs/arrays.xml +++ b/packages/SettingsLib/res/values-bs/arrays.xml @@ -58,12 +58,16 @@ <item msgid="3878793616631049349">"Koristi HDCP provjeru samo za DRM sadržaj"</item> <item msgid="45075631231212732">"Uvijek koristi HDCP provjeru"</item> </string-array> - <!-- no translation found for bluetooth_avrcp_versions:0 (5347678900838034763) --> - <!-- no translation found for bluetooth_avrcp_versions:1 (2089555299377409443) --> - <!-- no translation found for bluetooth_avrcp_versions:2 (2895327394279434278) --> - <!-- no translation found for bluetooth_avrcp_version_values:0 (2838624067805073303) --> - <!-- no translation found for bluetooth_avrcp_version_values:1 (1913619118958233129) --> - <!-- no translation found for bluetooth_avrcp_version_values:2 (7142710449249088270) --> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP 1.4 (Zadano)"</item> + <item msgid="2089555299377409443">"AVRCP 1.5"</item> + <item msgid="2895327394279434278">"AVRCP 1.6"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="1913619118958233129">"avrcp15"</item> + <item msgid="7142710449249088270">"avrcp16"</item> + </string-array> <string-array name="bluetooth_a2dp_codec_titles"> <item msgid="7065842274271279580">"Koristi odabir sistema (Zadano)"</item> <item msgid="7539690996561263909">"SBC"</item> @@ -71,6 +75,8 @@ <item msgid="8910200421843557332">"aptX"</item> <item msgid="8434403964359457768">"aptX HD"</item> <item msgid="6751080638867012696">"LDAC"</item> + <item msgid="723675059572222462">"Omogućite opcionalne kodeke"</item> + <item msgid="3304843301758635896">"Onemogućite opcionalne kodeke"</item> </string-array> <string-array name="bluetooth_a2dp_codec_summaries"> <item msgid="5062108632402595000">"Koristi odabir sistema (Zadano)"</item> @@ -79,6 +85,8 @@ <item msgid="2279916056363477395">"aptX"</item> <item msgid="6641171061200063516">"aptX HD"</item> <item msgid="7950781694447359344">"LDAC"</item> + <item msgid="2209680154067241740">"Omogućite opcionalne kodeke"</item> + <item msgid="741805482892725657">"Onemogućite opcionalne kodeke"</item> </string-array> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> <item msgid="3093023430402746802">"Koristi odabir sistema (Zadano)"</item> @@ -120,11 +128,13 @@ <item msgid="7158319962230727476">"Optimizirano za kvalitet zvuka (990 kbps/909 kbps)"</item> <item msgid="2921767058740704969">"Uravnotežen kvalitet zvuka i veze (660kbps/606kbps)"</item> <item msgid="8860982705384396512">"Optimizirano za kvalitet veze (330 kbps/303 kbps)"</item> + <item msgid="4414060457677684127">"Maksimalan napor (Prilagodljiva brzina prijenosa)"</item> </string-array> <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> <item msgid="6398189564246596868">"Optimizirano za kvalitet zvuka"</item> <item msgid="4327143584633311908">"Uravnotežen kvalitet zvuka i veze"</item> <item msgid="4681409244565426925">"Optimizirano za kvalitet veze"</item> + <item msgid="364670732877872677">"Maksimalan napor (Prilagodljiva brzina prijenosa)"</item> </string-array> <string-array name="select_logd_size_titles"> <item msgid="8665206199209698501">"Isključeno"</item> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index ce40282174fd..6a41f74f3510 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -32,10 +32,8 @@ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"Neće se automatski povezati"</string> <string name="wifi_no_internet" msgid="3880396223819116454">"Nema pristupa internetu"</string> <string name="saved_network" msgid="4352716707126620811">"Sačuvao <xliff:g id="NAME">%1$s</xliff:g>"</string> - <!-- no translation found for connected_via_network_scorer (5713793306870815341) --> - <skip /> - <!-- no translation found for connected_via_network_scorer_default (8430960324014668989) --> - <skip /> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"Automatski povezano koristeći %1$s"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"Automatski povezano putem ocjenjivača mreže"</string> <string name="connected_via_passpoint" msgid="2826205693803088747">"Povezani preko %1$s"</string> <string name="available_via_passpoint" msgid="1617440946846329613">"Dostupan preko %1$s"</string> <string name="wifi_connected_no_internet" msgid="3149853966840874992">"Povezano. Nema interneta"</string> @@ -141,7 +139,7 @@ <item msgid="5194774745031751806">"Veoma ubrzano"</item> <item msgid="9085102246155045744">"Najbrže"</item> </string-array> - <string name="choose_profile" msgid="8229363046053568878">"Odaberite profil"</string> + <string name="choose_profile" msgid="6921016979430278661">"Odaberite profil"</string> <string name="category_personal" msgid="1299663247844969448">"Lično"</string> <string name="category_work" msgid="8699184680584175622">"Posao"</string> <string name="development_settings_title" msgid="215179176067683667">"Opcije za programere"</string> @@ -170,16 +168,12 @@ <string name="debug_networking_category" msgid="7044075693643009662">"Umrežavanje"</string> <string name="wifi_display_certification" msgid="8611569543791307533">"Certifikacija bežičnog prikaza"</string> <string name="wifi_verbose_logging" msgid="4203729756047242344">"Omogućiti Wi-Fi Verbose zapisivanje"</string> - <!-- no translation found for wifi_aggressive_handover (5309131983693661320) --> - <skip /> + <string name="wifi_aggressive_handover" msgid="5309131983693661320">"Agresivni prijenos s Wi-Fi mreže na mob."</string> <string name="wifi_allow_scan_with_traffic" msgid="3601853081178265786">"Uvijek dopustiti Wi-Fi lutajuće skeniranje"</string> - <!-- no translation found for mobile_data_always_on (8774857027458200434) --> - <skip /> + <string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilna mreža za prijenos podataka je uvijek aktivna"</string> <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"Onemogućite apsolutnu jačinu zvuka"</string> - <!-- no translation found for bluetooth_select_avrcp_version_string (3750059931120293633) --> - <skip /> - <!-- no translation found for bluetooth_select_avrcp_version_dialog_title (7277329668298705702) --> - <skip /> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"Bluetooth AVRCP verzija"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"Odaberite Bluetooth AVRCP verziju"</string> <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"Bluetooth Audio kodek"</string> <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"Odaberite Bluetooth Audio kodek"</string> <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"Brzina uzorkovanja za Bluetooth audio"</string> @@ -193,8 +187,7 @@ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"Prijenos: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> <string name="wifi_display_certification_summary" msgid="1155182309166746973">"Pokaži opcije za certifikaciju Bežičnog prikaza"</string> <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"Povećajte nivo Wi-Fi zapisivanja, pokazati po SSID RSSI Wi-Fi Picker"</string> - <!-- no translation found for wifi_aggressive_handover_summary (7266329646559808827) --> - <skip /> + <string name="wifi_aggressive_handover_summary" msgid="7266329646559808827">"Kada je omogućeno, Wi-Fi veza će u slučaju slabog signala agresivnije predavati vezu za prijenos podataka na mobilnu vezu"</string> <string name="wifi_allow_scan_with_traffic_summary" msgid="2575101424972686310">"Dozvoli/Zabrani Wi-Fi lutajuće skeniranje na osnovu količine podatkovnog prometa prisutnog na sučelju"</string> <string name="select_logd_size_title" msgid="7433137108348553508">"Veličine bafera za zapisnik"</string> <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"Izaberite veličine za Logger prema međumemoriji evidencije"</string> @@ -323,38 +316,23 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Ispravka boje"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna te može utjecati na performanse."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string> - <string name="power_remaining_duration_only" msgid="4400068916452346544">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"Preostalo je otprilike još <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Do potpune napunjenosti preostalo je <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Imate još <xliff:g id="TIME">%1$s</xliff:g>"</string> - <!-- no translation found for power_discharging_duration (2843747179907396142) --> - <skip /> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - imate još <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - imate još <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration (4676999980973411875) --> - <skip /> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> do potpune napunjenosti"</string> <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_ac (7341243578143555689) --> - <skip /> - <string name="power_charging_duration_ac_short" msgid="7895864687218765582">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_usb (3720632890882121805) --> - <skip /> - <string name="power_charging_duration_usb_short" msgid="941854728040426399">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> - <!-- no translation found for power_charging_duration_wireless (5768338238751562058) --> - <skip /> - <string name="power_charging_duration_wireless_short" msgid="1642664799869599476">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Puni se"</string> - <string name="battery_info_status_charging_ac" msgid="2909861890674399949">"Puni se na punjaču"</string> - <string name="battery_info_status_charging_ac_short" msgid="7431401092096415502">"Punjenje"</string> - <string name="battery_info_status_charging_usb" msgid="2207489369680923929">"Punjenje preko USB-a"</string> - <string name="battery_info_status_charging_usb_short" msgid="6733371990319101366">"Punjenje"</string> - <string name="battery_info_status_charging_wireless" msgid="3574032603735446573">"Bežično punjenje"</string> - <string name="battery_info_status_charging_wireless_short" msgid="752569941028903610">"Punjenje"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"punjenje"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Ne puni se"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Ne puni se"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Puna"</string> <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"Pod kontrolom administratora"</string> - <string name="enabled_by_admin" msgid="2386503803463071894">"Omogućio administrator"</string> - <string name="disabled_by_admin" msgid="3669999613095206948">"Onemogućio je administrator"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"Omogućio administrator"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"Onemogućio administrator"</string> <string name="home" msgid="3256884684164448244">"Postavke početne stranice"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> @@ -377,4 +355,7 @@ <string name="retail_demo_reset_title" msgid="696589204029930100">"Potrebna je lozinka"</string> <string name="active_input_method_subtypes" msgid="3596398805424733238">"Aktivne metode unosa"</string> <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"Koristi jezik sistema"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"Nije uspjelo otvaranje postavki za <xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"Ovaj način unosa može prikupiti sav tekst koji otkucate, uključujući lične podatke kao što su lozinke i brojevi kreditnih kartica. Način omogućava aplikacija <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g>. Da li želite koristiti ovaj način unosa?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"Napomena: Nakon ponovnog pokretanja, ova aplikacija se neće moći pokrenuti dok ne otključate telefon"</string> </resources> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index dfd2a82b991a..2f92ecdc0163 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -113,7 +113,7 @@ <string name="tts_play_example_title" msgid="7094780383253097230">"Entzun adibide bat"</string> <string name="tts_play_example_summary" msgid="8029071615047894486">"Erreproduzitu hizketa-sintesiaren demostrazio laburra"</string> <string name="tts_install_data_title" msgid="4264378440508149986">"Instalatu ahotsaren datuak"</string> - <string name="tts_install_data_summary" msgid="5742135732511822589">"Instalatu hizketaren sintesirako behar diren ahots-datuak"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"Instalatu hizketaren sintesirako behar diren ahotsaren datuak"</string> <string name="tts_engine_security_warning" msgid="8786238102020223650">"Hizketaren sintesi-motorrak idazten duzun testu guztia bil dezake, pasahitzak eta kreditu-txarteleko zenbakiak bezalako datu pertsonalak barne. <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> motorrak egin du eskaera. Hizketaren sintesi-motor hori erabili nahi duzu?"</string> <string name="tts_engine_network_required" msgid="1190837151485314743">"Testua ahots bihurtzeko eginbidea erabiltzeko, hizkuntza honek sareko konexioa behar du."</string> <string name="tts_default_sample_string" msgid="4040835213373086322">"Hizketa-sintesiaren adibide bat da hau"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index e623180454c3..2f4ac522fc7b 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"રંગ સુધારણા"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"આ સુવિધા પ્રાયોગિક છે અને કામગીરી પર અસર કરી શકે છે."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> દ્વારા ઓવરરાઇડ થયું"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"અંદાજે <xliff:g id="TIME">%1$s</xliff:g> બાકી"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"સંપૂર્ણપણે ચાર્જ થવામાં <xliff:g id="TIME">%1$s</xliff:g> બાકી"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> બાકી"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - લગભગ <xliff:g id="TIME">%2$s</xliff:g> બાકી"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> બાકી"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"અજાણ્યું"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ચાર્જ થઈ રહ્યું છે"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ચાર્જ થઈ રહ્યું છે"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ચાર્જ થઈ રહ્યું નથી"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ચાર્જ થઈ રહ્યું નથી"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"પૂર્ણ"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index b7dbd415ad98..e7364dba7267 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"תיקון צבע"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"תכונה זו היא ניסיונית ועשויה להשפיע על הביצועים."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"נעקף על ידי <xliff:g id="TITLE">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"עוד <xliff:g id="TIME">%1$s</xliff:g> בקירוב"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> עד לטעינה מלאה"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"נותרו <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - הזמן הנותר: בערך <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - נותרו <xliff:g id="TIME">%2$s</xliff:g>"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"לא ידוע"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"טוען"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"בטעינה"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"לא בטעינה"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"לא טוען"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"מלא"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index f063a7bd7ac3..ba098e565445 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -316,7 +316,7 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Түсүн тууралоо"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Бул сынамык мүмкүнчүлүк болгондуктан, иштин майнаптуулугуна таасир этиши мүмкүн."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> менен алмаштырылган"</string> - <string name="power_remaining_duration_only" msgid="845431008899029842">"Батарея толгонго чейин болж. убакыт: <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"Батарея түгөнгөнгө чейин калган убакыт: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Батарея толгонго чейин калган убакыт: <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> калды"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – болжол менен <xliff:g id="TIME">%2$s</xliff:g> калды"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index eb55e0dd3825..89bbc715ad95 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"रंग सुधारणा"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"हे वैशिष्ट्य प्रायोगिक आहे आणि कदाचित कार्यप्रदर्शन प्रभावित करू शकते."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारे अधिलिखित"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णपणे चार्ज होण्यास <xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> शिल्लक"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज होत आहे"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज होत आहे"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"चार्ज होत नाही"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"चार्ज होत नाही"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूर्ण"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 3a696f66ba2d..2e574dc9bbe0 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Fargekorrigering"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Denne funksjonen er eksperimentell og kan påvirke ytelsen."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overstyres av <xliff:g id="TITLE">%1$s</xliff:g>"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> til det er fulladet"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – omtrent <xliff:g id="TIME">%2$s</xliff:g> gjenstår"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> gjenstår"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"Ukjent"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"Lader"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"lader"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"Lader ikke"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"Lader ikke"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"Fullt"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 0015f79bffeb..35d8363eba39 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"रङ्ग सुधार"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"यो सुविधा प्रयोगात्मक छ र प्रदर्शनमा असर गर्न सक्छ।"</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारा अधिरोहित"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"लगभग <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"बाँकी समय <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - करिब <xliff:g id="TIME">%2$s</xliff:g> बाँकी"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"बाँकी समय <xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज हुँदै"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज हुँदै"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"चार्ज भइरहेको छैन"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"चार्ज हुँदै छैन"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"पूर्ण"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 2eb611f898a6..dc949c35ff19 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ਰੰਗ ਸੰਸ਼ੋਧਨ"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਪ੍ਰਯੋਗਾਤਮਿਕ ਹੈ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਤੇ ਅਸਰ ਪਾ ਸਕਦੀ ਹੈ।"</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ਦੁਆਰਾ ਓਵਰਰਾਈਡ ਕੀਤਾ"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਲਈ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਲਗਭਗ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"ਅਗਿਆਤ"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜਿੰਗ"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ਚਾਰਜ ਨਹੀਂ ਹੋ ਰਿਹਾ"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"ਪੂਰੀ"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 75501d75c593..a8fd5bda6924 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"වර්ණ නිවැරදි කිරීම"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"මෙම විශේෂාංගය පරීක්ෂණාත්මක සහ ඇතැම් විට ක්රියාකාරිත්වයට බලපෑ හැක."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> මගින් ඉක්මවන ලදී"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> පමණ ඉතිරියි"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"පූර්ණව ආරෝපණය වන තෙක් <xliff:g id="TIME">%1$s</xliff:g> ඉතිරියි"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ඉතිරි <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>ක් පමණ ඇත"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - ඉතිරි <xliff:g id="TIME">%2$s</xliff:g>"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"නොදනී"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ආරෝපණය වෙමින්"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ආරෝපණය වේ"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ආරෝපණය නොවේ"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ආරෝපණය නොවෙමින්"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"පූර්ණ"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 46458157a698..e38a5c672738 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -317,7 +317,7 @@ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Kipengele hiki ni cha majaribio na huenda kikaathiri utendaji wa kifaa chako."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"Imetanguliwa na <xliff:g id="TITLE">%1$s</xliff:g>"</string> <string name="power_remaining_duration_only" msgid="845431008899029842">"Zimesalia takribani <xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Imebaki <xliff:g id="TIME">%1$s</xliff:g> hadi chaji ijae"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Imebaki <xliff:g id="TIME">%1$s</xliff:g> chaji ijae"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zimesalia <xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - imesalia takribani <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"Imechaji <xliff:g id="LEVEL">%1$s</xliff:g> - Zimesalia <xliff:g id="TIME">%2$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index ab38cce19ab5..1c937ed4d55f 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"రంగు సవరణ"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ఈ లక్షణం ప్రయోగాత్మకమైనది మరియు పనితీరుపై ప్రభావం చూపవచ్చు."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ద్వారా భర్తీ చేయబడింది"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"మిగిలి ఉన్న సమయం, <xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"పూర్తిగా ఛార్జ్ కావడానికి <xliff:g id="TIME">%1$s</xliff:g> పడుతుంది"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> మిగిలి ఉంది"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> పని చేస్తుంది"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> మిగిలి ఉంది"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"తెలియదు"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"ఛార్జ్ అవుతోంది"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ఛార్జ్ అవుతోంది"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"ఛార్జ్ కావడం లేదు"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"ఛార్జ్ కావడం లేదు"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"నిండింది"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 11ae5f3d9068..8c1d8f449145 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -316,10 +316,8 @@ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"رنگ کی اصلاح"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"یہ خصوصیت تجرباتی ہے اور اس کی وجہ سے کاکردگی متاثر ہو سکتی ہے۔"</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> کے ذریعہ منسوخ کردیا گیا"</string> - <!-- no translation found for power_remaining_duration_only (845431008899029842) --> - <skip /> - <!-- no translation found for power_remaining_charging_duration_only (1421102457410268886) --> - <skip /> + <string name="power_remaining_duration_only" msgid="845431008899029842">"تقریبًا <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"پوری طرح چارج ہونے میں <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string> @@ -328,8 +326,7 @@ <string name="power_charging_duration_short" msgid="1098603958472207920">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="battery_info_status_unknown" msgid="196130600938058547">"نامعلوم"</string> <string name="battery_info_status_charging" msgid="1705179948350365604">"چارج ہو رہا ہے"</string> - <!-- no translation found for battery_info_status_charging_lower (8689770213898117994) --> - <skip /> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"چارج ہو رہا ہے"</string> <string name="battery_info_status_discharging" msgid="310932812698268588">"چارج نہیں ہو رہا ہے"</string> <string name="battery_info_status_not_charging" msgid="2820070506621483576">"چارج نہیں ہو رہا ہے"</string> <string name="battery_info_status_full" msgid="2824614753861462808">"مکمل"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 9d5c9cc0a096..588ea1a9c2ff 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -317,7 +317,7 @@ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Bu funksiya tajribaviy bo‘lib, u qurilma unumdorligiga ta’sir qilishi mumkin."</string> <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> bilan almashtirildi"</string> <string name="power_remaining_duration_only" msgid="845431008899029842">"Taxminan <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string> - <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"To‘liq quvvat olishiga <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"To‘lishiga <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string> <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> qoldi"</string> <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – taxminan <xliff:g id="TIME">%2$s</xliff:g> qoldi"</string> <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> qoldi"</string> diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml new file mode 100644 index 000000000000..f3a6d44f5ec7 --- /dev/null +++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml @@ -0,0 +1,143 @@ +<?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. + */ +--> +<!-- Note all width/height dimensions are switched here to handle landspace + rather than duplicating them all. + This layout matches the structure of navigation_bar.xml (rot90) and + will need to be kept up to sync with changes there. +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/screen_pinning_buttons" + android:layout_height="match_parent" + android:layout_width="@dimen/screen_pinning_request_button_height" + android:background="?android:attr/colorAccent" + android:orientation="vertical"> + + <View + android:layout_height="@dimen/screen_pinning_request_side_width" + android:layout_width="match_parent" + android:layout_weight="0" + android:visibility="invisible" /> + + <FrameLayout + android:id="@+id/screen_pinning_back_group" + android:layout_height="@dimen/screen_pinning_request_button_width" + android:layout_width="@dimen/screen_pinning_request_button_height" + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + <ImageView + android:id="@+id/screen_pinning_back_bg_light" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_padding_negative" + android:src="@drawable/screen_pinning_light_bg_circ" /> + + <ImageView + android:id="@+id/screen_pinning_back_bg" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_button_offset" + android:paddingRight="@dimen/screen_pinning_request_inner_padding" + android:paddingTop="@dimen/screen_pinning_request_inner_padding" + android:paddingBottom="@dimen/screen_pinning_request_inner_padding" + android:src="@drawable/screen_pinning_bg_circ" /> + + <ImageView + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="center" + android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding" + android:paddingTop="@dimen/screen_pinning_request_nav_side_padding" + android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding" + android:src="@drawable/ic_sysbar_back" /> + </FrameLayout> + + <View + android:layout_height="match_parent" + android:layout_width="match_parent" + android:layout_weight="1" + android:visibility="invisible" /> + + <FrameLayout + android:id="@+id/screen_pinning_home_group" + android:layout_height="@dimen/screen_pinning_request_button_width" + android:layout_width="@dimen/screen_pinning_request_button_height" + android:layout_weight="0" > + + <ImageView + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="center" + android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding" + android:paddingTop="@dimen/screen_pinning_request_nav_side_padding" + android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding" + android:src="@drawable/ic_sysbar_home" /> + </FrameLayout> + + <View + android:layout_height="match_parent" + android:layout_width="match_parent" + android:layout_weight="1" + android:visibility="invisible" /> + + <FrameLayout + android:id="@+id/screen_pinning_recents_group" + android:layout_height="@dimen/screen_pinning_request_button_width" + android:layout_width="@dimen/screen_pinning_request_button_height" + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + <ImageView + android:id="@+id/screen_pinning_recents_bg_light" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_padding_negative" + android:src="@drawable/screen_pinning_light_bg_circ" /> + + <ImageView + android:id="@+id/screen_pinning_recents_bg" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="matrix" + android:layout_marginLeft="@dimen/screen_pinning_request_seascape_button_offset" + android:paddingRight="@dimen/screen_pinning_request_inner_padding" + android:paddingTop="@dimen/screen_pinning_request_inner_padding" + android:paddingBottom="@dimen/screen_pinning_request_inner_padding" + android:src="@drawable/screen_pinning_bg_circ" /> + + <ImageView + android:layout_height="match_parent" + android:layout_width="match_parent" + android:scaleType="center" + android:paddingRight="@dimen/screen_pinning_request_nav_icon_padding" + android:paddingTop="@dimen/screen_pinning_request_nav_side_padding" + android:paddingBottom="@dimen/screen_pinning_request_nav_side_padding" + android:src="@drawable/ic_sysbar_recent" /> + </FrameLayout> + + <View + android:layout_height="@dimen/screen_pinning_request_side_width" + android:layout_width="match_parent" + android:layout_weight="0" + android:visibility="invisible" /> + +</LinearLayout> diff --git a/packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml b/packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml new file mode 100644 index 000000000000..770cead87ac0 --- /dev/null +++ b/packages/SystemUI/res/layout/screen_pinning_request_sea_phone.xml @@ -0,0 +1,36 @@ +<?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. + */ +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_height="@dimen/screen_pinning_request_width" + android:layout_width="wrap_content" + android:gravity="left|center_vertical" + android:orientation="horizontal" + android:theme="@android:style/Theme.DeviceDefault.Light"> + + <include + android:layout_width="wrap_content" + android:layout_height="@dimen/screen_pinning_request_width" + layout="@layout/screen_pinning_request_buttons_sea" /> + + <include + android:layout_width="360dp" + android:layout_height="@dimen/screen_pinning_request_width" + layout="@layout/screen_pinning_request_text_area" /> + +</LinearLayout> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index ac4bdfc113f1..809648aba65b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -563,6 +563,10 @@ <dimen name="screen_pinning_request_button_width">84dp</dimen> <!-- Screen pinning request padding on top of inner circle --> <dimen name="screen_pinning_request_inner_padding">14dp</dimen> + <!-- Screen pinning request seascape negative padding --> + <dimen name="screen_pinning_request_seascape_padding_negative">-18dp</dimen> + <!-- Screen pinning request seascape button offset --> + <dimen name="screen_pinning_request_seascape_button_offset">-4dp</dimen> <!-- Screen pinning request padding on top of icons --> <dimen name="screen_pinning_request_nav_icon_padding">18dp</dimen> <!-- Screen pinning request padding on side of icons diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java index 0336905cd855..521157dc5991 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -31,6 +31,7 @@ import android.os.Binder; import android.os.RemoteException; import android.util.DisplayMetrics; import android.view.Gravity; +import android.view.Surface; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -46,6 +47,11 @@ import com.android.systemui.R; import java.util.ArrayList; public class ScreenPinningRequest implements View.OnClickListener { + + private static final int ROTATION_NONE = 0; + private static final int ROTATION_LANDSCAPE = 1; + private static final int ROTATION_SEASCAPE = 2; + private final Context mContext; private final AccessibilityManager mAccessibilityService; @@ -124,11 +130,12 @@ public class ScreenPinningRequest implements View.OnClickListener { clearPrompt(); } - public FrameLayout.LayoutParams getRequestLayoutParams(boolean isLandscape) { + public FrameLayout.LayoutParams getRequestLayoutParams(int rotation) { return new FrameLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, - isLandscape ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT) + rotation == ROTATION_SEASCAPE ? (Gravity.CENTER_VERTICAL | Gravity.LEFT) : + rotation == ROTATION_LANDSCAPE ? (Gravity.CENTER_VERTICAL | Gravity.RIGHT) : (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM)); } @@ -153,14 +160,16 @@ public class ScreenPinningRequest implements View.OnClickListener { DisplayMetrics metrics = new DisplayMetrics(); mWindowManager.getDefaultDisplay().getMetrics(metrics); float density = metrics.density; - boolean isLandscape = isLandscapePhone(mContext); + int rotation = getRotation(mContext); - inflateView(isLandscape); + inflateView(rotation); int bgColor = mContext.getColor( R.color.screen_pinning_request_window_bg); if (ActivityManager.isHighEndGfx()) { mLayout.setAlpha(0f); - if (isLandscape) { + if (rotation == ROTATION_SEASCAPE) { + mLayout.setTranslationX(-OFFSET_DP * density); + } else if (rotation == ROTATION_LANDSCAPE) { mLayout.setTranslationX(OFFSET_DP * density); } else { mLayout.setTranslationY(OFFSET_DP * density); @@ -193,18 +202,27 @@ public class ScreenPinningRequest implements View.OnClickListener { mContext.registerReceiver(mReceiver, filter); } - private boolean isLandscapePhone(Context context) { + private int getRotation(Context context) { Configuration config = mContext.getResources().getConfiguration(); - return config.orientation == Configuration.ORIENTATION_LANDSCAPE - && config.smallestScreenWidthDp < 600; + int rot = context.getDisplay().getRotation(); + if (config.smallestScreenWidthDp < 600) { + if (rot == Surface.ROTATION_90) { + return ROTATION_LANDSCAPE; + } else if (rot == Surface.ROTATION_270) { + return ROTATION_SEASCAPE; + } + } + return ROTATION_NONE; } - private void inflateView(boolean isLandscape) { + private void inflateView(int rotation) { // We only want this landscape orientation on <600dp, so rather than handle // resource overlay for -land and -sw600dp-land, just inflate this // other view for this single case. - mLayout = (ViewGroup) View.inflate(getContext(), isLandscape - ? R.layout.screen_pinning_request_land_phone : R.layout.screen_pinning_request, + mLayout = (ViewGroup) View.inflate(getContext(), + rotation == ROTATION_SEASCAPE ? R.layout.screen_pinning_request_sea_phone : + rotation == ROTATION_LANDSCAPE ? R.layout.screen_pinning_request_land_phone + : R.layout.screen_pinning_request, null); // Catch touches so they don't trigger cancel/activate, like outside does. mLayout.setClickable(true); @@ -240,7 +258,7 @@ public class ScreenPinningRequest implements View.OnClickListener { mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility); mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility); - addView(mLayout, getRequestLayoutParams(isLandscape)); + addView(mLayout, getRequestLayoutParams(rotation)); } private void swapChildrenIfRtlAndVertical(View group) { @@ -269,14 +287,14 @@ public class ScreenPinningRequest implements View.OnClickListener { protected void onConfigurationChanged() { removeAllViews(); - inflateView(isLandscapePhone(mContext)); + inflateView(getRotation(mContext)); } private final Runnable mUpdateLayoutRunnable = new Runnable() { @Override public void run() { if (mLayout != null && mLayout.getParent() != null) { - mLayout.setLayoutParams(getRequestLayoutParams(isLandscapePhone(mContext))); + mLayout.setLayoutParams(getRequestLayoutParams(getRotation(mContext))); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 1c71da007fd0..3a43d304b1ca 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -355,9 +355,10 @@ public class SystemServicesProxy { rti.firstActiveTime = rti.lastActiveTime = i; if (i % 2 == 0) { rti.taskDescription = new ActivityManager.TaskDescription(description, - Bitmap.createBitmap(mDummyIcon), null, - 0xFF000000 | (0xFFFFFF & new Random().nextInt()), - 0xFF000000 | (0xFFFFFF & new Random().nextInt())); + Bitmap.createBitmap(mDummyIcon), null, + 0xFF000000 | (0xFFFFFF & new Random().nextInt()), + 0xFF000000 | (0xFFFFFF & new Random().nextInt()), + 0, 0); } else { rti.taskDescription = new ActivityManager.TaskDescription(); } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 85a74b2197f3..95d715860e4e 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -421,8 +421,14 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo pw.print(" iconFilename="); pw.print(taskDescription.getIconFilename()); pw.print(" label=\""); pw.print(taskDescription.getLabel()); pw.print("\""); - pw.print(" color="); + pw.print(" primaryColor="); pw.println(Integer.toHexString(taskDescription.getPrimaryColor())); + pw.print(" backgroundColor="); + pw.println(Integer.toHexString(taskDescription.getBackgroundColor())); + pw.print(" statusBarColor="); + pw.println(Integer.toHexString(taskDescription.getStatusBarColor())); + pw.print(" navigationBarColor="); + pw.println(Integer.toHexString(taskDescription.getNavigationBarColor())); } if (iconFilename == null && taskDescription.getIcon() != null) { pw.print(prefix); pw.println("taskDescription contains Bitmap"); diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 0c2c2043fb15..c7f20b9ff904 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -1613,6 +1613,9 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta String iconFilename = null; int colorPrimary = 0; int colorBackground = 0; + int statusBarColor = 0; + int navigationBarColor = 0; + boolean topActivity = true; for (--activityNdx; activityNdx >= 0; --activityNdx) { final ActivityRecord r = mActivities.get(activityNdx); if (r.taskDescription != null) { @@ -1625,13 +1628,16 @@ final class TaskRecord extends ConfigurationContainer implements TaskWindowConta if (colorPrimary == 0) { colorPrimary = r.taskDescription.getPrimaryColor(); } - if (colorBackground == 0) { + if (topActivity) { colorBackground = r.taskDescription.getBackgroundColor(); + statusBarColor = r.taskDescription.getStatusBarColor(); + navigationBarColor = r.taskDescription.getNavigationBarColor(); } } + topActivity = false; } lastTaskDescription = new TaskDescription(label, null, iconFilename, colorPrimary, - colorBackground); + colorBackground, statusBarColor, navigationBarColor); if (mWindowContainerController != null) { mWindowContainerController.setTaskDescription(lastTaskDescription); } diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index c4cc4fbf3cf0..e472928e4ab4 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -32,6 +32,7 @@ import android.os.IRemoteCallback; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; +import android.util.Slog; import android.util.TimedRemoteCaller; import com.android.internal.os.TransferPipe; @@ -49,9 +50,11 @@ import java.util.concurrent.TimeoutException; * @hide */ final class EphemeralResolverConnection implements DeathRecipient { + private static final String TAG = "PackageManager"; // This is running in a critical section and the timeout must be sufficiently low private static final long BIND_SERVICE_TIMEOUT_MS = ("eng".equals(Build.TYPE)) ? 300 : 200; + private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE; private final Object mLock = new Object(); private final GetEphemeralResolveInfoCaller mGetEphemeralResolveInfoCaller = @@ -143,6 +146,9 @@ final class EphemeralResolverConnection implements DeathRecipient { if (!mBindRequested) { mBindRequested = true; + if (DEBUG_EPHEMERAL) { + Slog.d(TAG, "Binding to resolver service"); + } mContext.bindServiceAsUser(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE, UserHandle.SYSTEM); } @@ -175,6 +181,9 @@ final class EphemeralResolverConnection implements DeathRecipient { @Override public void binderDied() { + if (DEBUG_EPHEMERAL) { + Slog.d(TAG, "Binder died"); + } if (mRemoteInstance != null) { mRemoteInstance.asBinder().unlinkToDeath(this, 0 /*flags*/); } @@ -193,6 +202,9 @@ final class EphemeralResolverConnection implements DeathRecipient { private final class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { + if (DEBUG_EPHEMERAL) { + Slog.d(TAG, "Service connected"); + } synchronized (mLock) { try { service.linkToDeath(EphemeralResolverConnection.this, 0 /*flags*/); @@ -205,6 +217,9 @@ final class EphemeralResolverConnection implements DeathRecipient { @Override public void onServiceDisconnected(ComponentName name) { + if (DEBUG_EPHEMERAL) { + Slog.d(TAG, "Service disconnected"); + } synchronized (mLock) { mRemoteInstance = null; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 6633efdc4141..95fb5af37b60 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5255,11 +5255,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - // Don't allow snapshots to influence SystemUI visibility flags. - // TODO: Revisit this once SystemUI flags for snapshots are handled correctly boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW - && attrs.type < FIRST_SYSTEM_WINDOW - && (attrs.privateFlags & PRIVATE_FLAG_TASK_SNAPSHOT) == 0; + && attrs.type < FIRST_SYSTEM_WINDOW; final int stackId = win.getStackId(); if (mTopFullscreenOpaqueWindowState == null && visible) { if ((fl & FLAG_FORCE_NOT_FULLSCREEN) != 0) { diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index a39131cbaf03..e26914e5293d 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -566,7 +566,7 @@ public class AppWindowContainerController return false; } - mContainer.startingData = new SnapshotStartingData(mService, snapshot.getSnapshot()); + mContainer.startingData = new SnapshotStartingData(mService, snapshot); scheduleAddStartingWindow(); return true; } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 23058bd6a9b6..2f64cd42e668 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2921,7 +2921,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (stack != null) { stack.getBounds(frame); } - } else if (!mutableIncludeFullDisplay.value && !w.mIsWallpaper) { + + // We want to screenshot with the exact bounds of the surface of the app. Thus, + // intersect it with the frame. + frame.intersect(w.mFrame); + }else if (!mutableIncludeFullDisplay.value && !w.mIsWallpaper) { final Rect wf = w.mFrame; final Rect cr = w.mContentInsets; int left = wf.left + cr.left; diff --git a/services/core/java/com/android/server/wm/SnapshotStartingData.java b/services/core/java/com/android/server/wm/SnapshotStartingData.java index e73d4d2559fb..35f35db5ada3 100644 --- a/services/core/java/com/android/server/wm/SnapshotStartingData.java +++ b/services/core/java/com/android/server/wm/SnapshotStartingData.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import android.app.ActivityManager.TaskSnapshot; import android.graphics.GraphicBuffer; import android.view.WindowManagerPolicy.StartingSurface; @@ -25,9 +26,9 @@ import android.view.WindowManagerPolicy.StartingSurface; class SnapshotStartingData extends StartingData { private final WindowManagerService mService; - private final GraphicBuffer mSnapshot; + private final TaskSnapshot mSnapshot; - SnapshotStartingData(WindowManagerService service, GraphicBuffer snapshot) { + SnapshotStartingData(WindowManagerService service, TaskSnapshot snapshot) { super(service); mService = service; mSnapshot = snapshot; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 3ffb093ba386..b816d8199aa6 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -17,15 +17,14 @@ package com.android.server.wm; import static android.app.ActivityManager.RESIZE_MODE_SYSTEM_SCREEN_ROTATION; -import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID; +import static android.app.ActivityManager.StackId.PINNED_STACK_ID; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_LANDSCAPE_ONLY; -import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PORTRAIT_ONLY; +import static android.content.pm.ActivityInfo.RESIZE_MODE_FORCE_RESIZABLE_PRESERVE_ORIENTATION; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static com.android.server.EventLogTags.WM_TASK_REMOVED; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STACK; -import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TASK_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -40,7 +39,6 @@ import android.view.DisplayInfo; import android.view.Surface; import com.android.internal.annotations.VisibleForTesting; -import com.android.server.EventLogTags; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index b8d0b8c096fe..48b01f40fc65 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -28,6 +28,7 @@ import android.app.ActivityManager.StackId; import android.app.ActivityManager.TaskSnapshot; import android.graphics.Canvas; import android.graphics.GraphicBuffer; +import android.graphics.Rect; import android.os.Environment; import android.util.ArraySet; import android.view.WindowManagerPolicy.StartingSurface; @@ -152,7 +153,7 @@ class TaskSnapshotController { * MANAGER LOCK WHEN CALLING THIS METHOD! */ StartingSurface createStartingSurface(AppWindowToken token, - GraphicBuffer snapshot) { + TaskSnapshot snapshot) { return TaskSnapshotSurface.create(mService, token, snapshot); } @@ -166,8 +167,17 @@ class TaskSnapshotController { if (buffer == null) { return null; } + final WindowState mainWindow = top.findMainWindow(); return new TaskSnapshot(buffer, top.getConfiguration().orientation, - top.findMainWindow().mStableInsets, false /* reduced */, 1f /* scale */); + minRect(mainWindow.mContentInsets, mainWindow.mStableInsets), false /* reduced */, + 1f /* scale */); + } + + private Rect minRect(Rect rect1, Rect rect2) { + return new Rect(Math.min(rect1.left, rect2.left), + Math.min(rect1.top, rect2.top), + Math.min(rect1.right, rect2.right), + Math.min(rect1.bottom, rect2.bottom)); } /** diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 04403e2712c1..c816ba3fa796 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -16,20 +16,35 @@ package com.android.server.wm; -import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; -import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; -import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; +import static android.graphics.Color.WHITE; +import static android.graphics.Color.alpha; +import static android.view.SurfaceControl.HIDDEN; +import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; +import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; +import static android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES; +import static android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; +import static android.view.WindowManager.LayoutParams.FLAG_SCALED; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; +import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; +import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; +import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; +import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES; +import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES; +import static com.android.internal.policy.DecorView.getColorViewLeftInset; +import static com.android.internal.policy.DecorView.getColorViewTopInset; +import static com.android.internal.policy.DecorView.getNavigationBarRect; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import android.app.ActivityManager.TaskDescription; -import android.graphics.Bitmap; +import android.app.ActivityManager.TaskSnapshot; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.GraphicBuffer; import android.graphics.Paint; import android.graphics.Rect; @@ -37,17 +52,22 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; +import android.os.SystemClock; import android.util.MergedConfiguration; import android.util.Slog; import android.view.IWindowSession; import android.view.Surface; +import android.view.SurfaceControl; +import android.view.SurfaceSession; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.view.WindowManagerGlobal; import android.view.WindowManagerPolicy.StartingSurface; +import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.policy.DecorView; import com.android.internal.view.BaseIWindow; /** @@ -57,19 +77,57 @@ import com.android.internal.view.BaseIWindow; */ class TaskSnapshotSurface implements StartingSurface { + private static final long SIZE_MISMATCH_MINIMUM_TIME_MS = 450; + + /** + * When creating the starting window, we use the exact same layout flags such that we end up + * with a window with the exact same dimensions etc. However, these flags are not used in layout + * and might cause other side effects so we exclude them. + */ + private static final int FLAG_INHERIT_EXCLUDES = FLAG_NOT_FOCUSABLE + | FLAG_NOT_TOUCHABLE + | FLAG_NOT_TOUCH_MODAL + | FLAG_ALT_FOCUSABLE_IM + | FLAG_NOT_FOCUSABLE + | FLAG_HARDWARE_ACCELERATED + | FLAG_IGNORE_CHEEK_PRESSES + | FLAG_LOCAL_FOCUS_MODE + | FLAG_SLIPPERY + | FLAG_WATCH_OUTSIDE_TOUCH + | FLAG_SPLIT_TOUCH + | FLAG_SCALED + | FLAG_SECURE; + private static final String TAG = TAG_WITH_CLASS_NAME ? "SnapshotStartingWindow" : TAG_WM; private static final int MSG_REPORT_DRAW = 0; private static final String TITLE_FORMAT = "SnapshotStartingWindow for taskId=%s"; private final Window mWindow; private final Surface mSurface; + private SurfaceControl mChildSurfaceControl; private final IWindowSession mSession; private final WindowManagerService mService; + private final Rect mTaskBounds; + private final Rect mStableInsets = new Rect(); + private final Rect mContentInsets = new Rect(); + private final Rect mFrame = new Rect(); + private final TaskSnapshot mSnapshot; + private final CharSequence mTitle; private boolean mHasDrawn; private boolean mReportNextDraw; - private Paint mFillBackgroundPaint = new Paint(); + private long mShownTime; + private final Handler mHandler; + private boolean mSizeMismatch; + private final Paint mBackgroundPaint = new Paint(); + private final Paint mStatusBarPaint = new Paint(); + private final Paint mNavigationBarPaint = new Paint(); + private final int mStatusBarColor; + private final int mNavigationBarColor; + private final int mSysUiVis; + private final int mWindowFlags; + private final int mWindowPrivateFlags; static TaskSnapshotSurface create(WindowManagerService service, AppWindowToken token, - GraphicBuffer snapshot) { + TaskSnapshot snapshot) { final WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); final Window window = new Window(); @@ -78,32 +136,51 @@ class TaskSnapshotSurface implements StartingSurface { final Surface surface = new Surface(); final Rect tmpRect = new Rect(); final Rect tmpFrame = new Rect(); + final Rect taskBounds; + final Rect tmpContentInsets = new Rect(); + final Rect tmpStableInsets = new Rect(); final MergedConfiguration tmpMergedConfiguration = new MergedConfiguration(); - int fillBackgroundColor = Color.WHITE; + int backgroundColor = WHITE; + int statusBarColor = 0; + int navigationBarColor = 0; + final int sysUiVis; + final int windowFlags; + final int windowPrivateFlags; synchronized (service.mWindowMap) { + final WindowState mainWindow = token.findMainWindow(); + if (mainWindow == null) { + Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find main window for token=" + + token); + return null; + } + sysUiVis = mainWindow.getSystemUiVisibility(); + windowFlags = mainWindow.getAttrs().flags; + windowPrivateFlags = mainWindow.getAttrs().privateFlags; + layoutParams.type = TYPE_APPLICATION_STARTING; - layoutParams.format = snapshot.getFormat(); - layoutParams.flags = FLAG_LAYOUT_INSET_DECOR - | FLAG_LAYOUT_IN_SCREEN + layoutParams.format = snapshot.getSnapshot().getFormat(); + layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES) | FLAG_NOT_FOCUSABLE - | FLAG_NOT_TOUCHABLE - | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; + | FLAG_NOT_TOUCHABLE; layoutParams.privateFlags = PRIVATE_FLAG_TASK_SNAPSHOT; layoutParams.token = token.token; layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT; - - // TODO: Inherit behavior whether to draw behind status bar/nav bar. - layoutParams.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; + layoutParams.systemUiVisibility = sysUiVis; final Task task = token.getTask(); if (task != null) { - layoutParams.setTitle(String.format(TITLE_FORMAT,task.mTaskId)); + layoutParams.setTitle(String.format(TITLE_FORMAT, task.mTaskId)); final TaskDescription taskDescription = task.getTaskDescription(); if (taskDescription != null) { - fillBackgroundColor = taskDescription.getBackgroundColor(); + backgroundColor = taskDescription.getBackgroundColor(); + statusBarColor = taskDescription.getStatusBarColor(); + navigationBarColor = taskDescription.getNavigationBarColor(); } + taskBounds = new Rect(); + task.getBounds(taskBounds); + } else { + taskBounds = null; } } try { @@ -118,31 +195,55 @@ class TaskSnapshotSurface implements StartingSurface { // Local call. } final TaskSnapshotSurface snapshotSurface = new TaskSnapshotSurface(service, window, - surface, fillBackgroundColor); + surface, snapshot, layoutParams.getTitle(), backgroundColor, statusBarColor, + navigationBarColor, sysUiVis, windowFlags, windowPrivateFlags, taskBounds); window.setOuter(snapshotSurface); try { session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, tmpFrame, - tmpRect, tmpRect, tmpRect, tmpRect, tmpRect, tmpRect, tmpMergedConfiguration, - surface); + tmpRect, tmpContentInsets, tmpRect, tmpStableInsets, tmpRect, tmpRect, + tmpMergedConfiguration, surface); } catch (RemoteException e) { // Local call. } - snapshotSurface.drawSnapshot(snapshot); + snapshotSurface.setFrames(tmpFrame, tmpContentInsets, tmpStableInsets); + snapshotSurface.drawSnapshot(); return snapshotSurface; } @VisibleForTesting TaskSnapshotSurface(WindowManagerService service, Window window, Surface surface, - int fillBackgroundColor) { + TaskSnapshot snapshot, CharSequence title, int backgroundColor, int statusBarColor, + int navigationBarColor, int sysUiVis, int windowFlags, int windowPrivateFlags, + Rect taskBounds) { mService = service; + mHandler = new Handler(mService.mH.getLooper()); mSession = WindowManagerGlobal.getWindowSession(); mWindow = window; mSurface = surface; - mFillBackgroundPaint.setColor(fillBackgroundColor); + mSnapshot = snapshot; + mTitle = title; + mBackgroundPaint.setColor(backgroundColor != 0 ? backgroundColor : WHITE); + mTaskBounds = taskBounds; + mSysUiVis = sysUiVis; + mWindowFlags = windowFlags; + mWindowPrivateFlags = windowPrivateFlags; + mStatusBarColor = DecorView.calculateStatusBarColor(windowFlags, + service.mContext.getColor(R.color.system_bar_background_semi_transparent), + statusBarColor); + mNavigationBarColor = navigationBarColor; + mStatusBarPaint.setColor(mStatusBarColor); + mNavigationBarPaint.setColor(navigationBarColor); } @Override public void remove() { + synchronized (mService.mWindowMap) { + final long now = SystemClock.uptimeMillis(); + if (mSizeMismatch && now - mShownTime < SIZE_MISMATCH_MINIMUM_TIME_MS) { + mHandler.postAtTime(this::remove, mShownTime + SIZE_MISMATCH_MINIMUM_TIME_MS); + return; + } + } try { mSession.remove(mWindow); } catch (RemoteException e) { @@ -150,31 +251,151 @@ class TaskSnapshotSurface implements StartingSurface { } } - private void drawSnapshot(GraphicBuffer snapshot) { - mSurface.attachAndQueueBuffer(snapshot); + @VisibleForTesting + void setFrames(Rect frame, Rect contentInsets, Rect stableInsets) { + mFrame.set(frame); + mContentInsets.set(contentInsets); + mStableInsets.set(stableInsets); + mSizeMismatch = (mFrame.width() != mSnapshot.getSnapshot().getWidth() + || mFrame.height() != mSnapshot.getSnapshot().getHeight()); + } + + private void drawSnapshot() { + final GraphicBuffer buffer = mSnapshot.getSnapshot(); + if (mSizeMismatch) { + // The dimensions of the buffer and the window don't match, so attaching the buffer + // will fail. Better create a child window with the exact dimensions and fill the parent + // window with the background color! + drawSizeMismatchSnapshot(buffer); + } else { + drawSizeMatchSnapshot(buffer); + } final boolean reportNextDraw; synchronized (mService.mWindowMap) { + mShownTime = SystemClock.uptimeMillis(); mHasDrawn = true; reportNextDraw = mReportNextDraw; } if (reportNextDraw) { reportDrawn(); } + } + + private void drawSizeMatchSnapshot(GraphicBuffer buffer) { + mSurface.attachAndQueueBuffer(buffer); + mSurface.release(); + } + + private void drawSizeMismatchSnapshot(GraphicBuffer buffer) { + final SurfaceSession session = new SurfaceSession(mSurface); + + // Keep a reference to it such that it doesn't get destroyed when finalized. + mChildSurfaceControl = new SurfaceControl(session, + mTitle + " - task-snapshot-surface", + buffer.getWidth(), buffer.getHeight(), buffer.getFormat(), HIDDEN); + Surface surface = new Surface(); + surface.copyFrom(mChildSurfaceControl); + + // Clip off ugly navigation bar. + final Rect crop = calculateSnapshotCrop(); + final Rect frame = calculateSnapshotFrame(crop); + SurfaceControl.openTransaction(); + try { + // We can just show the surface here as it will still be hidden as the parent is + // still hidden. + mChildSurfaceControl.show(); + mChildSurfaceControl.setWindowCrop(crop); + mChildSurfaceControl.setPosition(frame.left, frame.top); + } finally { + SurfaceControl.closeTransaction(); + } + surface.attachAndQueueBuffer(buffer); + surface.release(); + + final Canvas c = mSurface.lockCanvas(null); + drawBackgroundAndBars(c, frame); + mSurface.unlockCanvasAndPost(c); mSurface.release(); } @VisibleForTesting - void fillEmptyBackground(Canvas c, Bitmap b) { - final boolean fillHorizontally = c.getWidth() > b.getWidth(); - final boolean fillVertically = c.getHeight() > b.getHeight(); + Rect calculateSnapshotCrop() { + final Rect rect = new Rect(); + rect.set(0, 0, mSnapshot.getSnapshot().getWidth(), mSnapshot.getSnapshot().getHeight()); + final Rect insets = mSnapshot.getContentInsets(); + + // Let's remove all system decorations except the status bar, but only if the task is at the + // very top of the screen. + rect.inset(insets.left, mTaskBounds.top != 0 ? insets.top : 0, insets.right, insets.bottom); + return rect; + } + + @VisibleForTesting + Rect calculateSnapshotFrame(Rect crop) { + final Rect frame = new Rect(crop); + + // By default, offset it to to top/left corner + frame.offsetTo(-crop.left, -crop.top); + + // However, we also need to make space for the navigation bar on the left side. + final int colorViewLeftInset = getColorViewLeftInset(mStableInsets.left, + mContentInsets.left); + frame.offset(colorViewLeftInset, 0); + return frame; + } + + @VisibleForTesting + void drawBackgroundAndBars(Canvas c, Rect frame) { + final int statusBarHeight = getStatusBarColorViewHeight(); + final boolean fillHorizontally = c.getWidth() > frame.right; + final boolean fillVertically = c.getHeight() > frame.bottom; if (fillHorizontally) { - c.drawRect(b.getWidth(), 0, c.getWidth(), fillVertically - ? b.getHeight() - : c.getHeight(), - mFillBackgroundPaint); + c.drawRect(frame.right, alpha(mStatusBarColor) == 0xFF ? statusBarHeight : 0, + c.getWidth(), fillVertically + ? frame.bottom + : c.getHeight(), + mBackgroundPaint); } if (fillVertically) { - c.drawRect(0, b.getHeight(), c.getWidth(), c.getHeight(), mFillBackgroundPaint); + c.drawRect(0, frame.bottom, c.getWidth(), c.getHeight(), mBackgroundPaint); + } + drawStatusBarBackground(c, frame, statusBarHeight); + drawNavigationBarBackground(c); + } + + private int getStatusBarColorViewHeight() { + final boolean forceStatusBarBackground = + (mWindowPrivateFlags & PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND) != 0; + if (STATUS_BAR_COLOR_VIEW_ATTRIBUTES.isVisible( + mSysUiVis, mStatusBarColor, mWindowFlags, forceStatusBarBackground)) { + return getColorViewTopInset(mStableInsets.top, mContentInsets.top); + } else { + return 0; + } + } + + private boolean isNavigationBarColorViewVisible() { + return NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES.isVisible( + mSysUiVis, mNavigationBarColor, mWindowFlags, false /* force */); + } + + @VisibleForTesting + void drawStatusBarBackground(Canvas c, Rect frame, int statusBarHeight) { + if (statusBarHeight > 0 && c.getWidth() > frame.right) { + final int rightInset = DecorView.getColorViewRightInset(mStableInsets.right, + mContentInsets.right); + c.drawRect(frame.right, 0, c.getWidth() - rightInset, statusBarHeight, mStatusBarPaint); + } + } + + @VisibleForTesting + void drawNavigationBarBackground(Canvas c) { + final Rect navigationBarRect = new Rect(); + getNavigationBarRect(c.getWidth(), c.getHeight(), mStableInsets, mContentInsets, + navigationBarRect); + final boolean visible = isNavigationBarColorViewVisible(); + if (visible && !navigationBarRect.isEmpty()) { + c.drawRect(navigationBarRect, mNavigationBarPaint); } } @@ -211,10 +432,10 @@ class TaskSnapshotSurface implements StartingSurface { } }; - private static class Window extends BaseIWindow { + @VisibleForTesting + static class Window extends BaseIWindow { private TaskSnapshotSurface mOuter; - public void setOuter(TaskSnapshotSurface outer) { mOuter = outer; } diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java index aab75ee1699b..717ddf26eb2f 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotSurfaceTest.java @@ -16,6 +16,9 @@ package com.android.server.wm; +import static android.content.res.Configuration.ORIENTATION_PORTRAIT; +import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; +import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; @@ -24,15 +27,19 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.graphics.Bitmap; -import android.graphics.Bitmap.Config; +import android.app.ActivityManager.TaskSnapshot; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.GraphicBuffer; +import android.graphics.PixelFormat; +import android.graphics.Rect; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import android.view.Surface; + +import com.android.server.wm.TaskSnapshotSurface.Window; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,59 +55,174 @@ public class TaskSnapshotSurfaceTest extends WindowTestsBase { private TaskSnapshotSurface mSurface; - @Before - public void setUp() { - mSurface = new TaskSnapshotSurface(null, null, null, Color.WHITE); + private void setupSurface(int width, int height, Rect contentInsets, int sysuiVis, + int windowFlags, Rect taskBounds) { + final GraphicBuffer buffer = GraphicBuffer.create(width, height, PixelFormat.RGBA_8888, + GraphicBuffer.USAGE_SW_READ_NEVER | GraphicBuffer.USAGE_SW_WRITE_NEVER); + final TaskSnapshot snapshot = new TaskSnapshot(buffer, + ORIENTATION_PORTRAIT, contentInsets, false, 1.0f); + mSurface = new TaskSnapshotSurface(sWm, new Window(), new Surface(), snapshot, "Test", + Color.WHITE, Color.RED, Color.BLUE, sysuiVis, windowFlags, 0, taskBounds); + } + + private void setupSurface(int width, int height) { + setupSurface(width, height, new Rect(), 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + new Rect(0, 0, width, height)); } @Test public void fillEmptyBackground_fillHorizontally() throws Exception { + setupSurface(200, 100); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(200); when(mockCanvas.getHeight()).thenReturn(100); - final Bitmap b = Bitmap.createBitmap(100, 200, Config.ARGB_8888); - mSurface.fillEmptyBackground(mockCanvas, b); + mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 200)); verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any()); } @Test public void fillEmptyBackground_fillVertically() throws Exception { + setupSurface(100, 200); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(200); - final Bitmap b = Bitmap.createBitmap(200, 100, Config.ARGB_8888); - mSurface.fillEmptyBackground(mockCanvas, b); + mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 100)); verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(100.0f), eq(200.0f), any()); } @Test public void fillEmptyBackground_fillBoth() throws Exception { + setupSurface(200, 200); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(200); when(mockCanvas.getHeight()).thenReturn(200); - final Bitmap b = Bitmap.createBitmap(100, 100, Config.ARGB_8888); - mSurface.fillEmptyBackground(mockCanvas, b); + mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100)); verify(mockCanvas).drawRect(eq(100.0f), eq(0.0f), eq(200.0f), eq(100.0f), any()); verify(mockCanvas).drawRect(eq(0.0f), eq(100.0f), eq(200.0f), eq(200.0f), any()); } @Test public void fillEmptyBackground_dontFill_sameSize() throws Exception { + setupSurface(100, 100); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - final Bitmap b = Bitmap.createBitmap(100, 100, Config.ARGB_8888); - mSurface.fillEmptyBackground(mockCanvas, b); + mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 100, 100)); verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); } @Test public void fillEmptyBackground_dontFill_bitmapLarger() throws Exception { + setupSurface(100, 100); + final Canvas mockCanvas = mock(Canvas.class); + when(mockCanvas.getWidth()).thenReturn(100); + when(mockCanvas.getHeight()).thenReturn(100); + mSurface.drawBackgroundAndBars(mockCanvas, new Rect(0, 0, 200, 200)); + verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); + } + + @Test + public void testCalculateSnapshotCrop() { + setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 0, 100, 100)); + assertEquals(new Rect(0, 0, 100, 90), mSurface.calculateSnapshotCrop()); + } + + @Test + public void testCalculateSnapshotCrop_taskNotOnTop() { + setupSurface(100, 100, new Rect(0, 10, 0, 10), 0, 0, new Rect(0, 50, 100, 100)); + assertEquals(new Rect(0, 10, 100, 90), mSurface.calculateSnapshotCrop()); + } + + @Test + public void testCalculateSnapshotCrop_navBarLeft() { + setupSurface(100, 100, new Rect(10, 10, 0, 0), 0, 0, new Rect(0, 0, 100, 100)); + assertEquals(new Rect(10, 0, 100, 100), mSurface.calculateSnapshotCrop()); + } + + @Test + public void testCalculateSnapshotCrop_navBarRight() { + setupSurface(100, 100, new Rect(0, 10, 10, 0), 0, 0, new Rect(0, 0, 100, 100)); + assertEquals(new Rect(0, 0, 90, 100), mSurface.calculateSnapshotCrop()); + } + + @Test + public void testCalculateSnapshotFrame() { + setupSurface(100, 100); + final Rect insets = new Rect(0, 10, 0, 10); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + assertEquals(new Rect(0, -10, 100, 70), + mSurface.calculateSnapshotFrame(new Rect(0, 10, 100, 90))); + } + + @Test + public void testCalculateSnapshotFrame_navBarLeft() { + setupSurface(100, 100); + final Rect insets = new Rect(10, 10, 0, 0); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + assertEquals(new Rect(0, -10, 90, 80), + mSurface.calculateSnapshotFrame(new Rect(10, 10, 100, 100))); + } + + @Test + public void testDrawStatusBarBackground() { + setupSurface(100, 100); + final Rect insets = new Rect(0, 10, 10, 0); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); final Canvas mockCanvas = mock(Canvas.class); when(mockCanvas.getWidth()).thenReturn(100); when(mockCanvas.getHeight()).thenReturn(100); - final Bitmap b = Bitmap.createBitmap(200, 200, Config.ARGB_8888); - mSurface.fillEmptyBackground(mockCanvas, b); + mSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 50, 100), 10); + verify(mockCanvas).drawRect(eq(50.0f), eq(0.0f), eq(90.0f), eq(10.0f), any()); + } + + @Test + public void testDrawStatusBarBackground_nope() { + setupSurface(100, 100); + final Rect insets = new Rect(0, 10, 10, 0); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + final Canvas mockCanvas = mock(Canvas.class); + when(mockCanvas.getWidth()).thenReturn(100); + when(mockCanvas.getHeight()).thenReturn(100); + mSurface.drawStatusBarBackground(mockCanvas, new Rect(0, 0, 100, 100), 10); verify(mockCanvas, never()).drawRect(anyInt(), anyInt(), anyInt(), anyInt(), any()); } + + @Test + public void testDrawNavigationBarBackground() { + final Rect insets = new Rect(0, 10, 0, 10); + setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + new Rect(0, 0, 100, 100)); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + final Canvas mockCanvas = mock(Canvas.class); + when(mockCanvas.getWidth()).thenReturn(100); + when(mockCanvas.getHeight()).thenReturn(100); + mSurface.drawNavigationBarBackground(mockCanvas); + verify(mockCanvas).drawRect(eq(new Rect(0, 90, 100, 100)), any()); + } + + @Test + public void testDrawNavigationBarBackground_left() { + final Rect insets = new Rect(10, 10, 0, 0); + setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + new Rect(0, 0, 100, 100)); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + final Canvas mockCanvas = mock(Canvas.class); + when(mockCanvas.getWidth()).thenReturn(100); + when(mockCanvas.getHeight()).thenReturn(100); + mSurface.drawNavigationBarBackground(mockCanvas); + verify(mockCanvas).drawRect(eq(new Rect(0, 0, 10, 100)), any()); + } + + @Test + public void testDrawNavigationBarBackground_right() { + final Rect insets = new Rect(0, 10, 10, 0); + setupSurface(100, 100, insets, 0, FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, + new Rect(0, 0, 100, 100)); + mSurface.setFrames(new Rect(0, 0, 100, 100), insets, insets); + final Canvas mockCanvas = mock(Canvas.class); + when(mockCanvas.getWidth()).thenReturn(100); + when(mockCanvas.getHeight()).thenReturn(100); + mSurface.drawNavigationBarBackground(mockCanvas); + verify(mockCanvas).drawRect(eq(new Rect(90, 0, 100, 100)), any()); + } } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 8bfe4131d7cb..1874d8d04723 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -755,6 +755,32 @@ public class TelecomManager { } /** + * Returns a list of {@link PhoneAccountHandle}s for self-managed {@link ConnectionService}s. + * <p> + * Self-Managed {@link ConnectionService}s have a {@link PhoneAccount} with + * {@link PhoneAccount#CAPABILITY_SELF_MANAGED}. + * <p> + * Requires permission {@link android.Manifest.permission#READ_PHONE_STATE}, or that the caller + * is the default dialer app. + * <p> + * A {@link SecurityException} will be thrown if a called is not the default dialer, or lacks + * the {@link android.Manifest.permission#READ_PHONE_STATE} permission. + * + * @return A list of {@code PhoneAccountHandle} objects. + */ + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + public List<PhoneAccountHandle> getSelfManagedPhoneAccounts() { + try { + if (isServiceConnected()) { + return getTelecomService().getSelfManagedPhoneAccounts(mContext.getOpPackageName()); + } + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelecomService#getSelfManagedPhoneAccounts()", e); + } + return new ArrayList<>(); + } + + /** * Returns a list of {@link PhoneAccountHandle}s including those which have not been enabled * by the user. * diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index 87402243a452..8ebac2c6273a 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -59,6 +59,11 @@ interface ITelecomService { boolean includeDisabledAccounts, String callingPackage); /** + * @see TelecomServiceImpl#getSelfManagedPhoneAccounts + */ + List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage); + + /** * @see TelecomManager#getPhoneAccountsSupportingScheme */ List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(in String uriScheme, diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 1fd1929dbe01..3f079bbe7d54 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -628,8 +628,14 @@ public class TelephonyManager { * @see #EXTRA_DATA_IFACE * @see #EXTRA_DATA_FAILURE_CAUSE * @hide + * + * @deprecated If the app is running in the background, it won't be able to receive this + * broadcast. Apps should use ConnectivityManager {@link #registerNetworkCallback( + * android.net.NetworkRequest, ConnectivityManager.NetworkCallback)} to listen for network + * changes. */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + @Deprecated public static final String ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED = "android.intent.action.PRECISE_DATA_CONNECTION_STATE_CHANGED"; diff --git a/tools/aapt2/jni/aapt2_jni.cpp b/tools/aapt2/jni/aapt2_jni.cpp index b029b20bcf15..ce3d282e6f9b 100644 --- a/tools/aapt2/jni/aapt2_jni.cpp +++ b/tools/aapt2/jni/aapt2_jni.cpp @@ -77,20 +77,20 @@ static std::vector<StringPiece> extract_pieces(const std::vector<ScopedUtfChars> return pieces; } -JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile( +JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile( JNIEnv *env, jclass aapt_obj, jobject arguments_obj) { std::vector<ScopedUtfChars> compile_args_jni = list_to_utfchars(env, arguments_obj); std::vector<StringPiece> compile_args = extract_pieces(compile_args_jni); - aapt::Compile(compile_args); + return aapt::Compile(compile_args); } -JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink( +JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink( JNIEnv *env, jclass aapt_obj, jobject arguments_obj) { std::vector<ScopedUtfChars> link_args_jni = list_to_utfchars(env, arguments_obj); std::vector<StringPiece> link_args = extract_pieces(link_args_jni); - aapt::Link(link_args); + return aapt::Link(link_args); } JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_ping( diff --git a/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h b/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h index 56c3c18e3a1e..90150b4d731e 100644 --- a/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h +++ b/tools/aapt2/jni/com_android_tools_aapt2_Aapt2Jni.h @@ -18,17 +18,17 @@ JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_ping /* * Class: com_android_tools_aapt2_Aapt2Jni * Method: nativeCompile - * Signature: (Ljava/util/List;)V + * Signature: (Ljava/util/List;)I */ -JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile +JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeCompile (JNIEnv *, jclass, jobject); /* * Class: com_android_tools_aapt2_Aapt2Jni * Method: nativeLink - * Signature: (Ljava/util/List;)V + * Signature: (Ljava/util/List;)I */ -JNIEXPORT void JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink +JNIEXPORT jint JNICALL Java_com_android_tools_aapt2_Aapt2Jni_nativeLink (JNIEnv *, jclass, jobject); #ifdef __cplusplus diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py index baee21c315d6..f5b904220f76 100755 --- a/tools/fonts/fontchain_lint.py +++ b/tools/fonts/fontchain_lint.py @@ -126,7 +126,10 @@ def get_emoji_map(font): # Add GSUB rules ttfont = open_font(font) for lookup in ttfont['GSUB'].table.LookupList.Lookup: - assert lookup.LookupType == 4, 'We only understand type 4 lookups' + if lookup.LookupType != 4: + # Other lookups are used in the emoji font for fallback. + # We ignore them for now. + continue for subtable in lookup.SubTable: ligatures = subtable.ligatures for first_glyph in ligatures: @@ -385,7 +388,7 @@ def parse_unicode_datafile(file_path, reverse=False): return output_dict -def parse_standardized_variants(file_path): +def parse_emoji_variants(file_path): emoji_set = set() text_set = set() with open(file_path) as datafile: @@ -420,8 +423,8 @@ def parse_ucd(ucd_path): _chars_by_age = parse_unicode_datafile( path.join(ucd_path, 'DerivedAge.txt'), reverse=True) - sequences = parse_standardized_variants( - path.join(ucd_path, 'StandardizedVariants.txt')) + sequences = parse_emoji_variants( + path.join(ucd_path, 'emoji-variation-sequences.txt')) _text_variation_sequences, _emoji_variation_sequences = sequences _emoji_sequences = parse_unicode_datafile( path.join(ucd_path, 'emoji-sequences.txt')) @@ -442,8 +445,7 @@ UNSUPPORTED_FLAGS = frozenset({ flag_sequence('GF'), flag_sequence('GP'), flag_sequence('GS'), flag_sequence('MF'), flag_sequence('MQ'), flag_sequence('NC'), flag_sequence('PM'), flag_sequence('RE'), flag_sequence('TF'), - flag_sequence('UN'), flag_sequence('WF'), flag_sequence('XK'), - flag_sequence('YT'), + flag_sequence('WF'), flag_sequence('XK'), flag_sequence('YT'), }) EQUIVALENT_FLAGS = { @@ -489,6 +491,55 @@ ZWJ_IDENTICALS = { (0x1F468, 0x200D, 0x1F469, 0x200D, 0x1F466): 0x1F46A, } +ZWJ = 0x200D +FEMALE_SIGN = 0x2640 +MALE_SIGN = 0x2642 + +GENDER_DEFAULTS = [ + (0x26F9, MALE_SIGN), # PERSON WITH BALL + (0x1F3C3, MALE_SIGN), # RUNNER + (0x1F3C4, MALE_SIGN), # SURFER + (0x1F3CA, MALE_SIGN), # SWIMMER + (0x1F3CB, MALE_SIGN), # WEIGHT LIFTER + (0x1F3CC, MALE_SIGN), # GOLFER + (0x1F46E, MALE_SIGN), # POLICE OFFICER + (0x1F46F, FEMALE_SIGN), # WOMAN WITH BUNNY EARS + (0x1F471, MALE_SIGN), # PERSON WITH BLOND HAIR + (0x1F473, MALE_SIGN), # MAN WITH TURBAN + (0x1F477, MALE_SIGN), # CONSTRUCTION WORKER + (0x1F481, FEMALE_SIGN), # INFORMATION DESK PERSON + (0x1F482, MALE_SIGN), # GUARDSMAN + (0x1F486, FEMALE_SIGN), # FACE MASSAGE + (0x1F487, FEMALE_SIGN), # HAIRCUT + (0x1F575, MALE_SIGN), # SLEUTH OR SPY + (0x1F645, FEMALE_SIGN), # FACE WITH NO GOOD GESTURE + (0x1F646, FEMALE_SIGN), # FACE WITH OK GESTURE + (0x1F647, MALE_SIGN), # PERSON BOWING DEEPLY + (0x1F64B, FEMALE_SIGN), # HAPPY PERSON RAISING ONE HAND + (0x1F64D, FEMALE_SIGN), # PERSON FROWNING + (0x1F64E, FEMALE_SIGN), # PERSON WITH POUTING FACE + (0x1F6A3, MALE_SIGN), # ROWBOAT + (0x1F6B4, MALE_SIGN), # BICYCLIST + (0x1F6B5, MALE_SIGN), # MOUNTAIN BICYCLIST + (0x1F6B6, MALE_SIGN), # PEDESTRIAN + (0x1F926, FEMALE_SIGN), # FACE PALM + (0x1F937, FEMALE_SIGN), # SHRUG + (0x1F938, MALE_SIGN), # PERSON DOING CARTWHEEL + (0x1F939, MALE_SIGN), # JUGGLING + (0x1F93C, MALE_SIGN), # WRESTLERS + (0x1F93D, MALE_SIGN), # WATER POLO + (0x1F93E, MALE_SIGN), # HANDBALL + (0x1F9D6, FEMALE_SIGN), # PERSON IN STEAMY ROOM + (0x1F9D7, FEMALE_SIGN), # PERSON CLIMBING + (0x1F9D8, FEMALE_SIGN), # PERSON IN LOTUS POSITION + (0x1F9D9, FEMALE_SIGN), # MAGE + (0x1F9DA, FEMALE_SIGN), # FAIRY + (0x1F9DB, FEMALE_SIGN), # VAMPIRE + (0x1F9DC, FEMALE_SIGN), # MERPERSON + (0x1F9DD, FEMALE_SIGN), # ELF + (0x1F9DE, FEMALE_SIGN), # GENIE + (0x1F9DF, FEMALE_SIGN), # ZOMBIE +] def is_fitzpatrick_modifier(cp): return 0x1F3FB <= cp <= 0x1F3FF @@ -514,10 +565,20 @@ def compute_expected_emoji(): adjusted_emoji_zwj_sequences = dict(_emoji_zwj_sequences) adjusted_emoji_zwj_sequences.update(_emoji_zwj_sequences) + # Add empty flag tag sequence that is supported as fallback + _emoji_sequences[(0x1F3F4, 0xE007F)] = 'Emoji_Tag_Sequence' + for sequence in _emoji_sequences.keys(): sequence = tuple(ch for ch in sequence if ch != EMOJI_VS) all_sequences.add(sequence) sequence_pieces.update(sequence) + if _emoji_sequences.get(sequence, None) == 'Emoji_Tag_Sequence': + # Add reverse of all emoji ZWJ sequences, which are added to the fonts + # as a workaround to get the sequences work in RTL text. + # TODO: test if these are actually needed by Minikin/HarfBuzz. + reversed_seq = reverse_emoji(sequence) + all_sequences.add(reversed_seq) + equivalent_emoji[reversed_seq] = sequence for sequence in adjusted_emoji_zwj_sequences.keys(): sequence = tuple(ch for ch in sequence if ch != EMOJI_VS) @@ -529,13 +590,12 @@ def compute_expected_emoji(): all_sequences.add(reversed_seq) equivalent_emoji[reversed_seq] = sequence - # Add all two-letter flag sequences, as even the unsupported ones should - # resolve to a flag tofu. - all_letters = [chr(code) for code in range(ord('A'), ord('Z')+1)] - all_two_letter_codes = itertools.product(all_letters, repeat=2) - all_flags = {flag_sequence(code) for code in all_two_letter_codes} - all_sequences.update(all_flags) - tofu_flags = UNSUPPORTED_FLAGS | (all_flags - set(_emoji_sequences.keys())) + # Remove unsupported flags + all_sequences.difference_update(UNSUPPORTED_FLAGS) + + # Add all tag characters used in flags + sequence_pieces.update(range(0xE0030, 0xE0039 + 1)) + sequence_pieces.update(range(0xE0061, 0xE007A + 1)) all_emoji = ( _emoji_properties['Emoji'] | @@ -547,13 +607,17 @@ def compute_expected_emoji(): all_sequences | set(LEGACY_ANDROID_EMOJI.keys())) - first_tofu_flag = sorted(tofu_flags)[0] - for flag in tofu_flags: - if flag != first_tofu_flag: - equivalent_emoji[flag] = first_tofu_flag equivalent_emoji.update(EQUIVALENT_FLAGS) equivalent_emoji.update(LEGACY_ANDROID_EMOJI) equivalent_emoji.update(ZWJ_IDENTICALS) + + for ch, gender in GENDER_DEFAULTS: + equivalent_emoji[(ch, ZWJ, gender)] = ch + for skin_tone in range(0x1F3FB, 0x1F3FF+1): + skin_toned = (ch, skin_tone, ZWJ, gender) + if skin_toned in all_emoji: + equivalent_emoji[skin_toned] = (ch, skin_tone) + for seq in _emoji_variation_sequences: equivalent_emoji[seq] = seq[0] |