diff options
578 files changed, 9649 insertions, 2766 deletions
diff --git a/Android.mk b/Android.mk index 4ca3e229d87b..2d5285438392 100644 --- a/Android.mk +++ b/Android.mk @@ -63,6 +63,7 @@ LOCAL_SRC_FILES += \ core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \ core/java/android/accounts/IAccountManager.aidl \ core/java/android/accounts/IAccountManagerResponse.aidl \ + core/java/android/accounts/IAccountAccessTracker.aidl \ core/java/android/accounts/IAccountAuthenticator.aidl \ core/java/android/accounts/IAccountAuthenticatorResponse.aidl \ core/java/android/app/IActivityContainer.aidl \ diff --git a/api/test-current.txt b/api/test-current.txt index 3b5c2231ccf2..74e65d9a3ee9 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3255,6 +3255,7 @@ package android.animation { method public java.lang.Object getAnimatedValue(java.lang.String); method public long getCurrentPlayTime(); method public long getDuration(); + method public static float getDurationScale(); method public static long getFrameDelay(); method public int getRepeatCount(); method public int getRepeatMode(); @@ -3272,6 +3273,7 @@ package android.animation { method public void setCurrentFraction(float); method public void setCurrentPlayTime(long); method public android.animation.ValueAnimator setDuration(long); + method public static void setDurationScale(float); method public void setEvaluator(android.animation.TypeEvaluator); method public void setFloatValues(float...); method public static void setFrameDelay(long); diff --git a/cmds/bootanimation/audioplay.cpp b/cmds/bootanimation/audioplay.cpp index 4983b9ac4236..c546072e733a 100644 --- a/cmds/bootanimation/audioplay.cpp +++ b/cmds/bootanimation/audioplay.cpp @@ -141,13 +141,27 @@ bool createBufferQueueAudioPlayer(const ChunkFormat* chunkFormat) { // configure audio source SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, 1}; + // Determine channelMask from num_channels + SLuint32 channelMask; + switch (chunkFormat->num_channels) { + case 1: + channelMask = SL_SPEAKER_FRONT_CENTER; + break; + case 2: + channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; + break; + default: + // Default of 0 will derive mask from num_channels and log a warning. + channelMask = 0; + } + SLDataFormat_PCM format_pcm = { SL_DATAFORMAT_PCM, chunkFormat->num_channels, chunkFormat->sample_rate * 1000, // convert to milliHz chunkFormat->bits_per_sample, 16, - SL_SPEAKER_FRONT_CENTER, + channelMask, SL_BYTEORDER_LITTLEENDIAN }; SLDataSource audioSrc = {&loc_bufq, &format_pcm}; diff --git a/cmds/wm/src/com/android/commands/wm/Wm.java b/cmds/wm/src/com/android/commands/wm/Wm.java index f7f7c887aeb0..383cd01ddcd6 100644 --- a/cmds/wm/src/com/android/commands/wm/Wm.java +++ b/cmds/wm/src/com/android/commands/wm/Wm.java @@ -23,6 +23,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.AndroidException; import android.util.DisplayMetrics; import android.view.Display; @@ -201,9 +202,11 @@ public class Wm extends BaseCommand { try { if (density > 0) { // TODO(multidisplay): For now Configuration only applies to main screen. - mWm.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, density); + mWm.setForcedDisplayDensityForUser(Display.DEFAULT_DISPLAY, density, + UserHandle.USER_CURRENT); } else { - mWm.clearForcedDisplayDensity(Display.DEFAULT_DISPLAY); + mWm.clearForcedDisplayDensityForUser(Display.DEFAULT_DISPLAY, + UserHandle.USER_CURRENT); } } catch (RemoteException e) { } diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index c4eaccc1b406..163e7d2661b9 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -53,7 +53,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.List; /** - * Accessibility services are intended to assist users with disabilities in using + * Accessibility services should only be used to assist users with disabilities in using * Android devices and apps. They run in the background and receive callbacks by the system * when {@link AccessibilityEvent}s are fired. Such events denote some state transition * in the user interface, for example, the focus has changed, a button has been clicked, diff --git a/core/java/android/accounts/Account.java b/core/java/android/accounts/Account.java index 7b83a3076db3..6c16e322e978 100644 --- a/core/java/android/accounts/Account.java +++ b/core/java/android/accounts/Account.java @@ -16,9 +16,17 @@ package android.accounts; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.os.Parcelable; import android.os.Parcel; +import android.os.RemoteException; import android.text.TextUtils; +import android.util.ArraySet; +import android.util.Log; +import com.android.internal.annotations.GuardedBy; + +import java.util.Set; /** * Value type that represents an Account in the {@link AccountManager}. This object is @@ -26,8 +34,14 @@ import android.text.TextUtils; * suitable for use as the key of a {@link java.util.Map} */ public class Account implements Parcelable { + private static final String TAG = "Account"; + + @GuardedBy("sAccessedAccounts") + private static final Set<Account> sAccessedAccounts = new ArraySet<>(); + public final String name; public final String type; + private final @Nullable IAccountAccessTracker mAccessTracker; public boolean equals(Object o) { if (o == this) return true; @@ -44,6 +58,20 @@ public class Account implements Parcelable { } public Account(String name, String type) { + this(name, type, null); + } + + /** + * @hide + */ + public Account(@NonNull Account other, @Nullable IAccountAccessTracker accessTracker) { + this(other.name, other.type, accessTracker); + } + + /** + * @hide + */ + public Account(String name, String type, IAccountAccessTracker accessTracker) { if (TextUtils.isEmpty(name)) { throw new IllegalArgumentException("the name must not be empty: " + name); } @@ -52,11 +80,29 @@ public class Account implements Parcelable { } this.name = name; this.type = type; + this.mAccessTracker = accessTracker; } public Account(Parcel in) { this.name = in.readString(); this.type = in.readString(); + this.mAccessTracker = IAccountAccessTracker.Stub.asInterface(in.readStrongBinder()); + if (mAccessTracker != null) { + synchronized (sAccessedAccounts) { + if (sAccessedAccounts.add(this)) { + try { + mAccessTracker.onAccountAccessed(); + } catch (RemoteException e) { + Log.e(TAG, "Error noting account access", e); + } + } + } + } + } + + /** @hide */ + public IAccountAccessTracker getAccessTracker() { + return mAccessTracker; } public int describeContents() { @@ -66,6 +112,7 @@ public class Account implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(type); + dest.writeStrongInterface(mAccessTracker); } public static final Creator<Account> CREATOR = new Creator<Account>() { diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index d3551b73cf3f..0a9dc3a18375 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -28,6 +28,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.IntentSender; import android.content.res.Resources; import android.database.SQLException; import android.os.Build; @@ -178,6 +179,14 @@ public class AccountManager { public static final String KEY_ACCOUNT_TYPE = "accountType"; /** + * Bundle key used for the {@link IAccountAccessTracker} account access tracker + * used for noting the account was accessed when unmarshalled from a parcel. + * + * @hide + */ + public static final String KEY_ACCOUNT_ACCESS_TRACKER = "accountAccessTracker"; + + /** * Bundle key used for the auth token value in results * from {@link #getAuthToken} and friends. */ @@ -265,6 +274,15 @@ public class AccountManager { "android.accounts.AccountAuthenticator"; public static final String AUTHENTICATOR_ATTRIBUTES_NAME = "account-authenticator"; + /** + * Token type for the special case where a UID has access only to an account + * but no authenticator specific auth token types. + * + * @hide + */ + public static final String ACCOUNT_ACCESS_TOKEN_TYPE = + "com.android.AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE"; + private final Context mContext; private final IAccountManager mService; private final Handler mMainHandler; @@ -803,7 +821,9 @@ public class AccountManager { public Account bundleToResult(Bundle bundle) throws AuthenticatorException { String name = bundle.getString(KEY_ACCOUNT_NAME); String type = bundle.getString(KEY_ACCOUNT_TYPE); - return new Account(name, type); + IAccountAccessTracker tracker = IAccountAccessTracker.Stub.asInterface( + bundle.getBinder(KEY_ACCOUNT_ACCESS_TRACKER)); + return new Account(name, type, tracker); } }.start(); } @@ -2259,6 +2279,7 @@ public class AccountManager { result.putString(KEY_ACCOUNT_NAME, null); result.putString(KEY_ACCOUNT_TYPE, null); result.putString(KEY_AUTHTOKEN, null); + result.putBinder(KEY_ACCOUNT_ACCESS_TRACKER, null); try { mResponse.onResult(result); } catch (RemoteException e) { @@ -2284,9 +2305,13 @@ public class AccountManager { public void onResult(Bundle value) throws RemoteException { Account account = new Account( value.getString(KEY_ACCOUNT_NAME), - value.getString(KEY_ACCOUNT_TYPE)); - mFuture = getAuthToken(account, mAuthTokenType, mLoginOptions, - mActivity, mMyCallback, mHandler); + value.getString(KEY_ACCOUNT_TYPE), + IAccountAccessTracker.Stub.asInterface( + value.getBinder( + KEY_ACCOUNT_ACCESS_TRACKER))); + mFuture = getAuthToken(account, mAuthTokenType, + mLoginOptions, mActivity, mMyCallback, + mHandler); } @Override @@ -2333,7 +2358,9 @@ public class AccountManager { setException(new AuthenticatorException("account not in result")); return; } - final Account account = new Account(accountName, accountType); + final IAccountAccessTracker tracker = IAccountAccessTracker.Stub.asInterface( + result.getBinder(KEY_ACCOUNT_ACCESS_TRACKER)); + final Account account = new Account(accountName, accountType, tracker); mNumAccounts = 1; getAuthToken(account, mAuthTokenType, null /* options */, mActivity, mMyCallback, mHandler); @@ -2956,4 +2983,49 @@ public class AccountManager { } }.start(); } + + /** + * Gets whether a given package under a user has access to an account. + * Can be called only from the system UID. + * + * @param account The account for which to check. + * @param packageName The package for which to check. + * @param userHandle The user for which to check. + * @return True if the package can access the account. + * + * @hide + */ + public boolean hasAccountAccess(@NonNull Account account, @NonNull String packageName, + @NonNull UserHandle userHandle) { + try { + return mService.hasAccountAccess(account, packageName, userHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Creates an intent to request access to a given account for a UID. + * The returned intent should be stated for a result where {@link + * Activity#RESULT_OK} result means access was granted whereas {@link + * Activity#RESULT_CANCELED} result means access wasn't granted. Can + * be called only from the system UID. + * + * @param account The account for which to request. + * @param packageName The package name which to request. + * @param userHandle The user for which to request. + * @return The intent to request account access or null if the package + * doesn't exist. + * + * @hide + */ + public IntentSender createRequestAccountAccessIntentSenderAsUser(@NonNull Account account, + @NonNull String packageName, @NonNull UserHandle userHandle) { + try { + return mService.createRequestAccountAccessIntentSenderAsUser(account, packageName, + userHandle); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/accounts/AccountManagerInternal.java b/core/java/android/accounts/AccountManagerInternal.java new file mode 100644 index 000000000000..68c17c32fdc3 --- /dev/null +++ b/core/java/android/accounts/AccountManagerInternal.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.accounts; + +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.os.RemoteCallback; + +/** + * Account manager local system service interface. + * + * @hide Only for use within the system server. + */ +public abstract class AccountManagerInternal { + + /** + * Listener for explicit UID account access grant changes. + */ + public interface OnAppPermissionChangeListener { + + /** + * Called when the explicit grant state for a given UID to + * access an account changes. + * + * @param account The account + * @param uid The UID for which the grant changed + */ + public void onAppPermissionChanged(Account account, int uid); + } + + /** + * Requests that a given package is given access to an account. + * The provided callback will be invoked with a {@link android.os.Bundle} + * containing the result which will be a boolean value mapped to the + * {@link AccountManager#KEY_BOOLEAN_RESULT} key. + * + * @param account The account for which to request. + * @param packageName The package name for which to request. + * @param userId Concrete user id for which to request. + * @param callback A callback for receiving the result. + */ + public abstract void requestAccountAccess(@NonNull Account account, + @NonNull String packageName, @IntRange(from = 0) int userId, + @NonNull RemoteCallback callback); + + /** + * Check whether the given UID has access to the account. + * + * @param account The account + * @param uid The UID + * @return Whether the UID can access the account + */ + public abstract boolean hasAccountAccess(@NonNull Account account, @IntRange(from = 0) int uid); + + /** + * Adds a listener for explicit UID account access grant changes. + * + * @param listener The listener + */ + public abstract void addOnAppPermissionChangeListener( + @NonNull OnAppPermissionChangeListener listener); + + /** + * Backups the account access permissions. + * @param userId The user for which to backup. + * @return The backup data. + */ + public abstract byte[] backupAccountAccessPermissions(int userId); + + /** + * Restores the account access permissions. + * @param data The restore data. + * @param userId The user for which to restore. + */ + public abstract void restoreAccountAccessPermissions(byte[] data, int userId); +} diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java index 12b2b9ccf148..38eab2905022 100644 --- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java +++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java @@ -35,12 +35,10 @@ import java.io.IOException; */ public class GrantCredentialsPermissionActivity extends Activity implements View.OnClickListener { public static final String EXTRAS_ACCOUNT = "account"; - public static final String EXTRAS_AUTH_TOKEN_LABEL = "authTokenLabel"; public static final String EXTRAS_AUTH_TOKEN_TYPE = "authTokenType"; public static final String EXTRAS_RESPONSE = "response"; - public static final String EXTRAS_ACCOUNT_TYPE_LABEL = "accountTypeLabel"; - public static final String EXTRAS_PACKAGES = "application"; public static final String EXTRAS_REQUESTING_UID = "uid"; + private Account mAccount; private String mAuthTokenType; private int mUid; @@ -109,7 +107,11 @@ public class GrantCredentialsPermissionActivity extends Activity implements View } } }; - AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null); + + if (!AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE.equals(mAuthTokenType)) { + AccountManager.get(this).getAuthTokenLabel(mAccount.type, + mAuthTokenType, callback, null); + } findViewById(R.id.allow_button).setOnClickListener(this); findViewById(R.id.deny_button).setOnClickListener(this); diff --git a/core/java/android/accounts/IAccountAccessTracker.aidl b/core/java/android/accounts/IAccountAccessTracker.aidl new file mode 100644 index 000000000000..e12b3d1e21c7 --- /dev/null +++ b/core/java/android/accounts/IAccountAccessTracker.aidl @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.accounts; + +/** + * Interface to track which apps accessed an account + * + * @hide + */ +oneway interface IAccountAccessTracker { + void onAccountAccessed(); +} diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl index 7199288426f2..56a6488088b5 100644 --- a/core/java/android/accounts/IAccountManager.aidl +++ b/core/java/android/accounts/IAccountManager.aidl @@ -19,8 +19,10 @@ package android.accounts; import android.accounts.IAccountManagerResponse; import android.accounts.Account; import android.accounts.AuthenticatorDescription; +import android.content.IntentSender; import android.os.Bundle; - +import android.os.RemoteCallback; +import android.os.UserHandle; /** * Central application service that provides account management. @@ -102,4 +104,10 @@ interface IAccountManager { /* Check if credentials update is suggested */ void isCredentialsUpdateSuggested(in IAccountManagerResponse response, in Account account, String statusToken); + + /* Check if the package in a user can access an account */ + boolean hasAccountAccess(in Account account, String packageName, in UserHandle userHandle); + /* Crate an intent to request account access for package and a given user id */ + IntentSender createRequestAccountAccessIntentSenderAsUser(in Account account, + String packageName, in UserHandle userHandle); } diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index e3f8fa49f9dd..7e16e3ece549 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -18,6 +18,7 @@ package android.animation; import android.annotation.CallSuper; import android.annotation.IntDef; +import android.annotation.TestApi; import android.os.Looper; import android.os.Trace; import android.util.AndroidRuntimeException; @@ -261,6 +262,7 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio /** * @hide */ + @TestApi public static void setDurationScale(float durationScale) { sDurationScale = durationScale; } @@ -268,6 +270,7 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio /** * @hide */ + @TestApi public static float getDurationScale() { return sDurationScale; } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index aacd5da58640..50479c8e951b 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -3017,6 +3017,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM reply.writeNoException(); return true; } + case CAN_BYPASS_WORK_CHALLENGE: { + data.enforceInterface(IActivityManager.descriptor); + final PendingIntent intent = PendingIntent.CREATOR.createFromParcel(data); + final boolean result = canBypassWorkChallenge(intent); + reply.writeNoException(); + reply.writeInt(result ? 1 : 0); + return true; + } } return super.onTransact(code, data, reply, flags); @@ -7091,6 +7099,20 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); return; } + @Override + public boolean canBypassWorkChallenge(PendingIntent intent) + throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + intent.writeToParcel(data, 0); + mRemote.transact(CAN_BYPASS_WORK_CHALLENGE, data, reply, 0); + reply.readException(); + final int result = reply.readInt(); + data.recycle(); + reply.recycle(); + return result != 0; + } private IBinder mRemote; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2c5f881321c0..18677dda3b88 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -433,8 +433,10 @@ public final class ActivityThread { static final class NewIntentData { List<ReferrerIntent> intents; IBinder token; + boolean andPause; public String toString() { - return "NewIntentData{intents=" + intents + " token=" + token + "}"; + return "NewIntentData{intents=" + intents + " token=" + token + + " andPause=" + andPause +"}"; } } @@ -751,10 +753,12 @@ public final class ActivityThread { configChanges, notResumed, config, overrideConfig, true, preserveWindow); } - public final void scheduleNewIntent(List<ReferrerIntent> intents, IBinder token) { + public final void scheduleNewIntent( + List<ReferrerIntent> intents, IBinder token, boolean andPause) { NewIntentData data = new NewIntentData(); data.intents = intents; data.token = token; + data.andPause = andPause; sendMessage(H.NEW_INTENT, data); } @@ -2787,24 +2791,34 @@ public final class ActivityThread { } } - public final void performNewIntents(IBinder token, List<ReferrerIntent> intents) { - ActivityClientRecord r = mActivities.get(token); - if (r != null) { - final boolean resumed = !r.paused; - if (resumed) { - r.activity.mTemporaryPause = true; - mInstrumentation.callActivityOnPause(r.activity); - } - deliverNewIntents(r, intents); - if (resumed) { - r.activity.performResume(); - r.activity.mTemporaryPause = false; - } + void performNewIntents(IBinder token, List<ReferrerIntent> intents, boolean andPause) { + final ActivityClientRecord r = mActivities.get(token); + if (r == null) { + return; + } + + final boolean resumed = !r.paused; + if (resumed) { + r.activity.mTemporaryPause = true; + mInstrumentation.callActivityOnPause(r.activity); + } + deliverNewIntents(r, intents); + if (resumed) { + r.activity.performResume(); + r.activity.mTemporaryPause = false; + } + + if (r.paused && andPause) { + // In this case the activity was in the paused state when we delivered the intent, + // to guarantee onResume gets called after onNewIntent we temporarily resume the + // activity and pause again as the caller wanted. + performResumeActivity(token, false, "performNewIntents"); + performPauseActivityIfNeeded(r, "performNewIntents"); } } private void handleNewIntent(NewIntentData data) { - performNewIntents(data.token, data.intents); + performNewIntents(data.token, data.intents, data.andPause); } public void handleRequestAssistContextExtras(RequestAssistContextExtras cmd) { diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index d6da3f44f4a0..05d9d7e412f0 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -190,7 +190,8 @@ public abstract class ApplicationThreadNative extends Binder data.enforceInterface(IApplicationThread.descriptor); List<ReferrerIntent> pi = data.createTypedArrayList(ReferrerIntent.CREATOR); IBinder b = data.readStrongBinder(); - scheduleNewIntent(pi, b); + final boolean andPause = data.readInt() == 1; + scheduleNewIntent(pi, b, andPause); return true; } @@ -909,12 +910,13 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } - public void scheduleNewIntent(List<ReferrerIntent> intents, IBinder token) + public void scheduleNewIntent(List<ReferrerIntent> intents, IBinder token, boolean andPause) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeTypedList(intents); data.writeStrongBinder(token); + data.writeInt(andPause ? 1 : 0); mRemote.transact(SCHEDULE_NEW_INTENT_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index e411e03a8a94..5a4470b2ecdb 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -671,6 +671,18 @@ public interface IActivityManager extends IInterface { */ public void setHasTopUi(boolean hasTopUi) throws RemoteException; + /** + * Returns if the target of the PendingIntent can be fired directly, without triggering + * a work profile challenge. This can happen if the PendingIntent is to start direct-boot + * aware activities, and the target user is in RUNNING_LOCKED state, i.e. we should allow + * direct-boot aware activity to bypass work challenge when the user hasn't unlocked yet. + * @param intent the {@link PendingIntent} to be tested. + * @return {@code true} if the intent should not trigger a work challenge, {@code false} + * otherwise. + * @throws RemoteException + */ + public boolean canBypassWorkChallenge(PendingIntent intent) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -1062,4 +1074,5 @@ public interface IActivityManager extends IInterface { int SET_VR_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 377; int SET_RENDER_THREAD_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 378; int SET_HAS_TOP_UI = IBinder.FIRST_CALL_TRANSACTION + 379; + int CAN_BYPASS_WORK_CHALLENGE = IBinder.FIRST_CALL_TRANSACTION + 380; } diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index 559f69fc2aec..3fa88ae674a4 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -67,7 +67,8 @@ public interface IApplicationThread extends IInterface { List<ReferrerIntent> pendingNewIntents, int configChanges, boolean notResumed, Configuration config, Configuration overrideConfig, boolean preserveWindow) throws RemoteException; - void scheduleNewIntent(List<ReferrerIntent> intent, IBinder token) throws RemoteException; + void scheduleNewIntent( + List<ReferrerIntent> intent, IBinder token, boolean andPause) throws RemoteException; void scheduleDestroyActivity(IBinder token, boolean finished, int configChanges) throws RemoteException; void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, diff --git a/core/java/android/app/ITransientNotification.aidl b/core/java/android/app/ITransientNotification.aidl index 35b53a48e6e1..d5b3ed0a44d8 100644 --- a/core/java/android/app/ITransientNotification.aidl +++ b/core/java/android/app/ITransientNotification.aidl @@ -19,7 +19,7 @@ package android.app; /** @hide */ oneway interface ITransientNotification { - void show(); + void show(IBinder windowToken); void hide(); } diff --git a/core/java/android/app/LocalActivityManager.java b/core/java/android/app/LocalActivityManager.java index 2a1e3c250a00..3b273bc1c4b6 100644 --- a/core/java/android/app/LocalActivityManager.java +++ b/core/java/android/app/LocalActivityManager.java @@ -314,7 +314,7 @@ public class LocalActivityManager { ArrayList<ReferrerIntent> intents = new ArrayList<>(1); intents.add(new ReferrerIntent(intent, mParent.getPackageName())); if (localLOGV) Log.v(TAG, r.id + ": new intent"); - mActivityThread.performNewIntents(r, intents); + mActivityThread.performNewIntents(r, intents, false /* andPause */); r.intent = intent; moveToState(r, mCurState); if (mSingleMode) { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 2a12ac8f0567..688876cb3891 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1276,6 +1276,33 @@ public class DevicePolicyManager { public static final int PASSWORD_QUALITY_MANAGED = 0x80000; /** + * @hide + * + * adb shell dpm set-{device,profile}-owner will normally not allow installing an owner to + * a user with accounts. {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} + * and {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} are the account features + * used by authenticator to exempt their accounts from this: + * + * <ul> + * <li>Non-test-only DO/PO still can't be installed when there are accounts. + * <p>In order to make an apk test-only, add android:testOnly="true" to the + * <application> tag in the manifest. + * + * <li>Test-only DO/PO can be installed even when there are accounts, as long as all the + * accounts have the {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} feature. + * Some authenticators claim to have any features, so to detect it, we also check + * {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED} and disallow installing + * if any of the accounts have it. + * </ul> + */ + public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = + "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; + + /** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */ + public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = + "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; + + /** * Called by an application that is administering the device to set the password restrictions it * is imposing. After setting this, the user will not be able to enter a new password that is * not at least as restrictive as what has been set. Note that the current password will remain @@ -2219,6 +2246,7 @@ public class DevicePolicyManager { * @throws SecurityException if the calling application does not own an active administrator * that uses {@link DeviceAdminInfo#USES_POLICY_RESET_PASSWORD} * @throws IllegalStateException if the calling user is locked or has a managed profile. + * @throws IllegalArgumentException if the password does not meet system requirements. */ public boolean resetPassword(String password, int flags) { throwIfParentInstance("resetPassword"); diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index b3320d6f6976..daa1b93889cc 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -1877,6 +1877,7 @@ public abstract class ContentResolver { if (extras != null) { String accountName = extras.getString(SYNC_EXTRAS_ACCOUNT); if (!TextUtils.isEmpty(accountName)) { + // TODO: No references to Google in AOSP account = new Account(accountName, "com.google"); } extras.remove(SYNC_EXTRAS_ACCOUNT); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 3f18ea91c99a..f908abcc7ebd 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -2761,8 +2761,10 @@ public abstract class Context { * <dd> A {@link android.net.ConnectivityManager ConnectivityManager} for * handling management of network connections. * <dt> {@link #WIFI_SERVICE} ("wifi") - * <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of - * Wi-Fi connectivity. + * <dd> A {@link android.net.wifi.WifiManager WifiManager} for management of Wi-Fi + * connectivity. On releases before NYC, it should only be obtained from an application + * context, and not from any other derived context to avoid memory leaks within the calling + * process. * <dt> {@link #WIFI_P2P_SERVICE} ("wifip2p") * <dd> A {@link android.net.wifi.p2p.WifiP2pManager WifiP2pManager} for management of * Wi-Fi Direct connectivity. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 4d9db98587ce..1cf23ae8d040 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4314,6 +4314,14 @@ public class Intent implements Parcelable, Cloneable { public static final int FLAG_DEBUG_TRIAGED_MISSING = 0x00000100; /** + * Internal flag used to indicate ephemeral applications should not be + * considered when resolving the intent. + * + * @hide + */ + public static final int FLAG_IGNORE_EPHEMERAL = 0x00000200; + + /** * If set, the new activity is not kept in the history stack. As soon as * the user navigates away from it, the activity is finished. This may also * be set with the {@link android.R.styleable#AndroidManifestActivity_noHistory diff --git a/core/java/android/content/IntentFilter.java b/core/java/android/content/IntentFilter.java index 22ab43bbb429..d07b54573547 100644 --- a/core/java/android/content/IntentFilter.java +++ b/core/java/android/content/IntentFilter.java @@ -265,6 +265,7 @@ public class IntentFilter implements Parcelable { public static final String SCHEME_HTTPS = "https"; private int mPriority; + private int mOrder; private final ArrayList<String> mActions; private ArrayList<String> mCategories = null; private ArrayList<String> mDataSchemes = null; @@ -425,6 +426,7 @@ public class IntentFilter implements Parcelable { */ public IntentFilter(IntentFilter o) { mPriority = o.mPriority; + mOrder = o.mOrder; mActions = new ArrayList<String>(o.mActions); if (o.mCategories != null) { mCategories = new ArrayList<String>(o.mCategories); @@ -477,6 +479,16 @@ public class IntentFilter implements Parcelable { return mPriority; } + /** @hide */ + public final void setOrder(int order) { + mOrder = order; + } + + /** @hide */ + public final int getOrder() { + return mOrder; + } + /** * Set whether this filter will needs to be automatically verified against its data URIs or not. * The default is false. diff --git a/core/java/android/content/SyncAdapterType.java b/core/java/android/content/SyncAdapterType.java index 8a16ac94522e..6ef7fd214069 100644 --- a/core/java/android/content/SyncAdapterType.java +++ b/core/java/android/content/SyncAdapterType.java @@ -16,6 +16,7 @@ package android.content; +import android.annotation.Nullable; import android.text.TextUtils; import android.os.Parcelable; import android.os.Parcel; @@ -33,6 +34,7 @@ public class SyncAdapterType implements Parcelable { private final boolean isAlwaysSyncable; private final boolean allowParallelSyncs; private final String settingsActivity; + private final String packageName; public SyncAdapterType(String authority, String accountType, boolean userVisible, boolean supportsUploading) { @@ -50,6 +52,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = false; this.settingsActivity = null; this.isKey = false; + this.packageName = null; } /** @hide */ @@ -57,7 +60,8 @@ public class SyncAdapterType implements Parcelable { boolean supportsUploading, boolean isAlwaysSyncable, boolean allowParallelSyncs, - String settingsActivity) { + String settingsActivity, + String packageName) { if (TextUtils.isEmpty(authority)) { throw new IllegalArgumentException("the authority must not be empty: " + authority); } @@ -72,6 +76,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = allowParallelSyncs; this.settingsActivity = settingsActivity; this.isKey = false; + this.packageName = packageName; } private SyncAdapterType(String authority, String accountType) { @@ -89,6 +94,7 @@ public class SyncAdapterType implements Parcelable { this.allowParallelSyncs = false; this.settingsActivity = null; this.isKey = true; + this.packageName = null; } public boolean supportsUploading() { @@ -148,6 +154,16 @@ public class SyncAdapterType implements Parcelable { return settingsActivity; } + /** + * The package hosting the sync adapter. + * @return The package name. + * + * @hide + */ + public @Nullable String getPackageName() { + return packageName; + } + public static SyncAdapterType newKey(String authority, String accountType) { return new SyncAdapterType(authority, accountType); } @@ -181,6 +197,7 @@ public class SyncAdapterType implements Parcelable { + ", isAlwaysSyncable=" + isAlwaysSyncable + ", allowParallelSyncs=" + allowParallelSyncs + ", settingsActivity=" + settingsActivity + + ", packageName=" + packageName + "}"; } } @@ -201,6 +218,7 @@ public class SyncAdapterType implements Parcelable { dest.writeInt(isAlwaysSyncable ? 1 : 0); dest.writeInt(allowParallelSyncs ? 1 : 0); dest.writeString(settingsActivity); + dest.writeString(packageName); } public SyncAdapterType(Parcel source) { @@ -211,6 +229,7 @@ public class SyncAdapterType implements Parcelable { source.readInt() != 0, source.readInt() != 0, source.readInt() != 0, + source.readString(), source.readString()); } diff --git a/core/java/android/content/SyncAdaptersCache.java b/core/java/android/content/SyncAdaptersCache.java index 6704b75dff7f..ddbdb8a7a559 100644 --- a/core/java/android/content/SyncAdaptersCache.java +++ b/core/java/android/content/SyncAdaptersCache.java @@ -81,7 +81,7 @@ public class SyncAdaptersCache extends RegisteredServicesCache<SyncAdapterType> sa.getString(com.android.internal.R.styleable .SyncAdapter_settingsActivity); return new SyncAdapterType(authority, accountType, userVisible, supportsUploading, - isAlwaysSyncable, allowParallelSyncs, settingsActivity); + isAlwaysSyncable, allowParallelSyncs, settingsActivity, packageName); } finally { sa.recycle(); } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index d208fe7c10ca..f5bcf64417a6 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -160,4 +160,12 @@ public abstract class PackageManagerInternal { * Returns {@code true} if a given package can't be wiped. Otherwise, returns {@code false}. */ public abstract boolean isPackageDataProtected(int userId, String packageName); + + /** + * Gets whether the package was ever launched. + * @param packageName The package name. + * @param userId The user for which to check. + * @return Whether was launched. + */ + public abstract boolean wasPackageEverLaunched(String packageName, int userId); } diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index c9be6edab424..b5df4d75a238 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -68,12 +68,6 @@ public class ResolveInfo implements Parcelable { public EphemeralResolveInfo ephemeralResolveInfo; /** - * A ResolveInfo that points at the ephemeral installer. - * @hide - */ - public ResolveInfo ephemeralInstaller; - - /** * The IntentFilter that was matched for this ResolveInfo. */ public IntentFilter filter; diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java index 0c3d4b3d7be6..d4dcacceb761 100644 --- a/core/java/android/hardware/location/ContextHubManager.java +++ b/core/java/android/hardware/location/ContextHubManager.java @@ -123,10 +123,18 @@ public final class ContextHubManager { /** * Load a nano app on a specified context hub. * + * Note that loading is asynchronous. When we return from this method, + * the nano app (probably) hasn't loaded yet. Assuming a return of 0 + * from this method, then the final success/failure for the load, along + * with the "handle" for the nanoapp, is all delivered in a byte + * string via a call to Callback.onMessageReceipt. + * + * TODO(b/30784270): Provide a better success/failure and "handle" delivery. + * * @param hubHandle handle of context hub to load the app on. * @param app the nanoApp to load on the hub * - * @return int nanoAppInstance of the loaded nanoApp on success, + * @return 0 if the command for loading was sent to the context hub; * -1 otherwise * * @see NanoApp @@ -150,9 +158,17 @@ public final class ContextHubManager { /** * Unload a specified nanoApp * - * @param nanoAppHandle handle of the nanoApp to load + * Note that unloading is asynchronous. When we return from this method, + * the nano app (probably) hasn't unloaded yet. Assuming a return of 0 + * from this method, then the final success/failure for the unload is + * delivered in a byte string via a call to Callback.onMessageReceipt. + * + * TODO(b/30784270): Provide a better success/failure delivery. * - * @return int 0 on success, -1 otherwise + * @param nanoAppHandle handle of the nanoApp to unload + * + * @return 0 if the command for unloading was sent to the context hub; + * -1 otherwise */ public int unloadNanoApp(int nanoAppHandle) { int retVal = -1; @@ -169,6 +185,24 @@ public final class ContextHubManager { /** * get information about the nano app instance * + * NOTE: The returned NanoAppInstanceInfo does _not_ contain correct + * information for several fields, specifically: + * - getName() + * - getPublisher() + * - getNeededExecMemBytes() + * - getNeededReadMemBytes() + * - getNeededWriteMemBytes() + * + * For example, say you call loadNanoApp() with a NanoApp that has + * getName() returning "My Name". Later, if you call getNanoAppInstanceInfo + * for that nanoapp, the returned NanoAppInstanceInfo's getName() + * method will claim "Preloaded app, unknown", even though you would + * have expected "My Name". For now, as the user, you'll need to + * separately track the above fields if they are of interest to you. + * + * TODO(b/30943489): Have the returned NanoAppInstanceInfo contain the + * correct information. + * * @param nanoAppHandle handle of the nanoAppInstance * @return NanoAppInstanceInfo Information about the nano app instance. * @@ -209,6 +243,14 @@ public final class ContextHubManager { /** * Send a message to a specific nano app instance on a context hub. * + * Note that the return value of this method only speaks of success + * up to the point of sending this to the Context Hub. It is not + * an assurance that the Context Hub successfully sent this message + * on to the nanoapp. If assurance is desired, a protocol should be + * established between your code and the nanoapp, with the nanoapp + * sending a confirmation message (which will be reported via + * Callback.onMessageReceipt). + * * @param hubHandle handle of the hub to send the message to * @param nanoAppHandle handle of the nano app to send to * @param message Message to be sent diff --git a/core/java/android/hardware/location/ContextHubService.java b/core/java/android/hardware/location/ContextHubService.java index 062c9580c1e4..eea2387d7dea 100644 --- a/core/java/android/hardware/location/ContextHubService.java +++ b/core/java/android/hardware/location/ContextHubService.java @@ -162,6 +162,28 @@ public class ContextHubService extends IContextHubService.Stub { msgHeader[HEADER_FIELD_MSG_TYPE] = MSG_LOAD_NANO_APP; long appId = app.getAppId(); + // TODO(b/30808791): Remove this hack when the NanoApp API is fixed. + // Due to a bug in the NanoApp API, only the least significant four + // bytes of the app ID can be stored. The most significant five + // bytes of a normal app ID are the "vendor", and thus the most + // significant of the bytes we have is the least significant byte + // of the vendor. In the case that byte is the ASCII value for + // lower-case 'L', we assume the vendor is supposed to be "Googl" + // and fill in the four most significant bytes accordingly. + if ((appId >> 32) != 0) { + // We're unlikely to notice this warning, but at least + // we can avoid running our hack logic. + Log.w(TAG, "Code has not been updated since API fix."); + } else { + // Note: Lower-case 'L', not the number 1. + if (((appId >> 24) & 0xFF) == (long)'l') { + // Assume we're a Google nanoapp. + appId |= ((long)'G') << 56; + appId |= ((long)'o') << 48; + appId |= ((long)'o') << 40; + appId |= ((long)'g') << 32; + } + } msgHeader[HEADER_FIELD_LOAD_APP_ID_LO] = (int)(appId & 0xFFFFFFFF); msgHeader[HEADER_FIELD_LOAD_APP_ID_HI] = (int)((appId >> 32) & 0xFFFFFFFF); @@ -322,9 +344,16 @@ public class ContextHubService extends IContextHubService.Stub { appInfo.setNeededReadMemBytes(PRE_LOADED_APP_MEM_REQ); appInfo.setNeededWriteMemBytes(PRE_LOADED_APP_MEM_REQ); + String action; + if (mNanoAppHash.containsKey(appInstanceHandle)) { + action = "Updated"; + } else { + action = "Added"; + } + mNanoAppHash.put(appInstanceHandle, appInfo); - Log.d(TAG, "Added app instance " + appInstanceHandle + " with id " + appId - + " version " + appVersion); + Log.d(TAG, action + " app instance " + appInstanceHandle + " with id " + + appId + " version " + appVersion); return 0; } diff --git a/core/java/android/hardware/location/NanoAppFilter.java b/core/java/android/hardware/location/NanoAppFilter.java index 8db70e9c53f1..bf35a3d6fbd6 100644 --- a/core/java/android/hardware/location/NanoAppFilter.java +++ b/core/java/android/hardware/location/NanoAppFilter.java @@ -43,7 +43,8 @@ public class NanoAppFilter { private long mAppIdVendorMask; // Id of the context hub this instance is expected on - private int mContextHubId; + // TODO: Provide an API which will let us change this HubId. + private int mContextHubId = HUB_ANY; /** * Flag indicating any version. With this flag set, all versions shall match provided version. diff --git a/core/java/android/hardware/location/NanoAppInstanceInfo.java b/core/java/android/hardware/location/NanoAppInstanceInfo.java index 71a5a8816f58..ac6d83f622b2 100644 --- a/core/java/android/hardware/location/NanoAppInstanceInfo.java +++ b/core/java/android/hardware/location/NanoAppInstanceInfo.java @@ -113,7 +113,12 @@ public class NanoAppInstanceInfo { } /** - * Set the application version + * Get the application version + * + * NOTE: There is a race condition where shortly after loading, this + * may return -1 instead of the correct version. + * + * TODO(b/30970527): Fix this race condition. * * @return int - version of the app */ diff --git a/core/java/android/net/LocalSocketImpl.java b/core/java/android/net/LocalSocketImpl.java index b83fb260d6f1..0f0e9c49a0b0 100644 --- a/core/java/android/net/LocalSocketImpl.java +++ b/core/java/android/net/LocalSocketImpl.java @@ -516,13 +516,11 @@ class LocalSocketImpl Os.setsockoptLinger(fd, OsConstants.SOL_SOCKET, OsConstants.SO_LINGER, linger); break; case SocketOptions.SO_TIMEOUT: - /* - * SO_TIMEOUT from the core library gets converted to - * SO_SNDTIMEO, but the option is supposed to set both - * send and receive timeouts. Note: The incoming timeout - * value is in milliseconds. - */ + // The option must set both send and receive timeouts. + // Note: The incoming timeout value is in milliseconds. StructTimeval timeval = StructTimeval.fromMillis(intValue); + Os.setsockoptTimeval(fd, OsConstants.SOL_SOCKET, OsConstants.SO_RCVTIMEO, + timeval); Os.setsockoptTimeval(fd, OsConstants.SOL_SOCKET, OsConstants.SO_SNDTIMEO, timeval); break; diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 6243f467016a..56eba4f0e3ef 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -182,8 +182,15 @@ public final class NetworkCapabilities implements Parcelable { */ public static final int NET_CAPABILITY_CAPTIVE_PORTAL = 17; + /** + * Indicates that this network is available for use by apps, and not a network that is being + * kept up in the background to facilitate fast network switching. + * @hide + */ + public static final int NET_CAPABILITY_FOREGROUND = 18; + private static final int MIN_NET_CAPABILITY = NET_CAPABILITY_MMS; - private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_CAPTIVE_PORTAL; + private static final int MAX_NET_CAPABILITY = NET_CAPABILITY_FOREGROUND; /** * Network capabilities that are expected to be mutable, i.e., can change while a particular @@ -194,7 +201,8 @@ public final class NetworkCapabilities implements Parcelable { // http://b/18206275 (1 << NET_CAPABILITY_TRUSTED) | (1 << NET_CAPABILITY_VALIDATED) | - (1 << NET_CAPABILITY_CAPTIVE_PORTAL); + (1 << NET_CAPABILITY_CAPTIVE_PORTAL) | + (1 << NET_CAPABILITY_FOREGROUND); /** * Network specifier for factories which want to match any network specifier @@ -217,8 +225,7 @@ public final class NetworkCapabilities implements Parcelable { * get immediately torn down because they do not have the requested capability. */ private static final long NON_REQUESTABLE_CAPABILITIES = - (1 << NET_CAPABILITY_VALIDATED) | - (1 << NET_CAPABILITY_CAPTIVE_PORTAL); + MUTABLE_CAPABILITIES & ~(1 << NET_CAPABILITY_TRUSTED); /** * Capabilities that are set by default when the object is constructed. @@ -325,6 +332,7 @@ public final class NetworkCapabilities implements Parcelable { public String describeFirstNonRequestableCapability() { if (hasCapability(NET_CAPABILITY_VALIDATED)) return "NET_CAPABILITY_VALIDATED"; if (hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL)) return "NET_CAPABILITY_CAPTIVE_PORTAL"; + if (hasCapability(NET_CAPABILITY_FOREGROUND)) return "NET_CAPABILITY_FOREGROUND"; // This cannot happen unless the preceding checks are incomplete. if ((mNetworkCapabilities & NON_REQUESTABLE_CAPABILITIES) != 0) { return "unknown non-requestable capabilities " + Long.toHexString(mNetworkCapabilities); @@ -352,6 +360,11 @@ public final class NetworkCapabilities implements Parcelable { (that.mNetworkCapabilities & ~MUTABLE_CAPABILITIES)); } + private boolean equalsNetCapabilitiesRequestable(NetworkCapabilities that) { + return ((this.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES) == + (that.mNetworkCapabilities & ~NON_REQUESTABLE_CAPABILITIES)); + } + /** * Removes the NET_CAPABILITY_NOT_RESTRICTED capability if all the capabilities it provides are * typically provided by restricted networks. @@ -749,6 +762,19 @@ public final class NetworkCapabilities implements Parcelable { equalsSpecifier(nc)); } + /** + * Checks that our requestable capabilities are the same as those of the given + * {@code NetworkCapabilities}. + * + * @hide + */ + public boolean equalRequestableCapabilities(NetworkCapabilities nc) { + if (nc == null) return false; + return (equalsNetCapabilitiesRequestable(nc) && + equalsTransportTypes(nc) && + equalsSpecifier(nc)); + } + @Override public boolean equals(Object obj) { if (obj == null || (obj instanceof NetworkCapabilities == false)) return false; @@ -833,6 +859,7 @@ public final class NetworkCapabilities implements Parcelable { case NET_CAPABILITY_NOT_VPN: capabilities += "NOT_VPN"; break; case NET_CAPABILITY_VALIDATED: capabilities += "VALIDATED"; break; case NET_CAPABILITY_CAPTIVE_PORTAL: capabilities += "CAPTIVE_PORTAL"; break; + case NET_CAPABILITY_FOREGROUND: capabilities += "FOREGROUND"; break; } if (++i < types.length) capabilities += "&"; } diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index 9cd563e87c4a..d570e66a2435 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -175,7 +175,11 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { if (isNetworkTypeMobile(type)) { if (state.subscriberId == null) { - Slog.w(TAG, "Active mobile network without subscriber!"); + if (state.networkInfo.getState() != NetworkInfo.State.DISCONNECTED && + state.networkInfo.getState() != NetworkInfo.State.UNKNOWN) { + Slog.w(TAG, "Active mobile network without subscriber! ni = " + + state.networkInfo); + } } subscriberId = state.subscriberId; diff --git a/core/java/android/net/NetworkRequest.java b/core/java/android/net/NetworkRequest.java index 4501f7b089b9..ae724709c6c6 100644 --- a/core/java/android/net/NetworkRequest.java +++ b/core/java/android/net/NetworkRequest.java @@ -49,7 +49,7 @@ public class NetworkRequest implements Parcelable { public final int legacyType; /** - * A NetworkRequest as used by the system can be one of three types: + * A NetworkRequest as used by the system can be one of the following types: * * - LISTEN, for which the framework will issue callbacks about any * and all networks that match the specified NetworkCapabilities, @@ -64,7 +64,20 @@ public class NetworkRequest implements Parcelable { * current network (if any) that matches the capabilities of the * default Internet request (mDefaultRequest), but which cannot cause * the framework to either create or retain the existence of any - * specific network. + * specific network. Note that from the point of view of the request + * matching code, TRACK_DEFAULT is identical to REQUEST: its special + * behaviour is not due to different semantics, but to the fact that + * the system will only ever create a TRACK_DEFAULT with capabilities + * that are identical to the default request's capabilities, thus + * causing it to share fate in every way with the default request. + * + * - BACKGROUND_REQUEST, like REQUEST but does not cause any networks + * to retain the NET_CAPABILITY_FOREGROUND capability. A network with + * no foreground requests is in the background. A network that has + * one or more background requests and loses its last foreground + * request to a higher-scoring network will not go into the + * background immediately, but will linger and go into the background + * after the linger timeout. * * - The value NONE is used only by applications. When an application * creates a NetworkRequest, it does not have a type; the type is set @@ -77,7 +90,8 @@ public class NetworkRequest implements Parcelable { NONE, LISTEN, TRACK_DEFAULT, - REQUEST + REQUEST, + BACKGROUND_REQUEST, }; /** @@ -140,7 +154,7 @@ public class NetworkRequest implements Parcelable { * Add the given capability requirement to this builder. These represent * the requested network's required capabilities. Note that when searching * for a network to satisfy a request, all capabilities requested must be - * satisfied. See {@link NetworkCapabilities} for {@code NET_CAPABILITIY_*} + * satisfied. See {@link NetworkCapabilities} for {@code NET_CAPABILITY_*} * definitions. * * @param capability The {@code NetworkCapabilities.NET_CAPABILITY_*} to add. @@ -284,7 +298,7 @@ public class NetworkRequest implements Parcelable { }; /** - * Returns true iff. the contained NetworkRequest is of type LISTEN. + * Returns true iff. this NetworkRequest is of type LISTEN. * * @hide */ @@ -298,8 +312,9 @@ public class NetworkRequest implements Parcelable { * - should be associated with at most one satisfying network * at a time; * - * - should cause a network to be kept up if it is the best network - * which can satisfy the NetworkRequest. + * - should cause a network to be kept up, but not necessarily in + * the foreground, if it is the best network which can satisfy the + * NetworkRequest. * * For full detail of how isRequest() is used for pairing Networks with * NetworkRequests read rematchNetworkAndRequests(). @@ -307,9 +322,36 @@ public class NetworkRequest implements Parcelable { * @hide */ public boolean isRequest() { + return isForegroundRequest() || isBackgroundRequest(); + } + + /** + * Returns true iff. the contained NetworkRequest is one that: + * + * - should be associated with at most one satisfying network + * at a time; + * + * - should cause a network to be kept up and in the foreground if + * it is the best network which can satisfy the NetworkRequest. + * + * For full detail of how isRequest() is used for pairing Networks with + * NetworkRequests read rematchNetworkAndRequests(). + * + * @hide + */ + public boolean isForegroundRequest() { return type == Type.TRACK_DEFAULT || type == Type.REQUEST; } + /** + * Returns true iff. this NetworkRequest is of type BACKGROUND_REQUEST. + * + * @hide + */ + public boolean isBackgroundRequest() { + return type == Type.BACKGROUND_REQUEST; + } + public String toString() { return "NetworkRequest [ " + type + " id=" + requestId + (legacyType != ConnectivityManager.TYPE_NONE ? ", legacyType=" + legacyType : "") + diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java index 4f4e7223acb9..9a4b599f0e9b 100644 --- a/core/java/android/os/AsyncTask.java +++ b/core/java/android/os/AsyncTask.java @@ -298,12 +298,16 @@ public abstract class AsyncTask<Params, Progress, Result> { mWorker = new WorkerRunnable<Params, Result>() { public Result call() throws Exception { mTaskInvoked.set(true); - - Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - //noinspection unchecked - Result result = doInBackground(mParams); - Binder.flushPendingCommands(); - return postResult(result); + Result result = null; + try { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + //noinspection unchecked + result = doInBackground(mParams); + Binder.flushPendingCommands(); + } finally { + postResult(result); + } + return result; } }; diff --git a/core/java/android/os/FileObserver.java b/core/java/android/os/FileObserver.java index 4e705e04b447..dd85e1584f0e 100644 --- a/core/java/android/os/FileObserver.java +++ b/core/java/android/os/FileObserver.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.Nullable; import android.util.Log; import java.lang.ref.WeakReference; @@ -204,7 +205,8 @@ public abstract class FileObserver { * * @param event The type of event which happened * @param path The path, relative to the main monitored file or directory, - * of the file or directory which triggered the event + * of the file or directory which triggered the event. This value can + * be {@code null} for certain events, such as {@link #MOVE_SELF}. */ - public abstract void onEvent(int event, String path); + public abstract void onEvent(int event, @Nullable String path); } diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index 9e8103ae3c0c..3ae28fd13f73 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -81,6 +81,8 @@ public final class Trace { public static final long TRACE_TAG_SYSTEM_SERVER = 1L << 19; /** @hide */ public static final long TRACE_TAG_DATABASE = 1L << 20; + /** @hide */ + public static final long TRACE_TAG_NETWORK = 1L << 21; private static final long TRACE_TAG_NOT_READY = 1L << 63; private static final int MAX_SECTION_NAME_LEN = 127; diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index fbd61cf3f412..c7c6ceb5c16d 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -284,8 +284,10 @@ public class CallLog { /** * The cached name associated with the phone number, if it exists. - * This value is not guaranteed to be current, if the contact information - * associated with this number has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_NAME = "name"; @@ -293,8 +295,10 @@ public class CallLog { /** * The cached number type (Home, Work, etc) associated with the * phone number, if it exists. - * This value is not guaranteed to be current, if the contact information - * associated with this number has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: INTEGER</P> */ public static final String CACHED_NUMBER_TYPE = "numbertype"; @@ -302,8 +306,10 @@ public class CallLog { /** * The cached number label, for a custom number type, associated with the * phone number, if it exists. - * This value is not guaranteed to be current, if the contact information - * associated with this number has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_NUMBER_LABEL = "numberlabel"; @@ -339,40 +345,50 @@ public class CallLog { /** * The cached URI to look up the contact associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_LOOKUP_URI = "lookup_uri"; /** * The cached phone number of the contact which matches this entry, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_MATCHED_NUMBER = "matched_number"; /** * The cached normalized(E164) version of the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_NORMALIZED_NUMBER = "normalized_number"; /** * The cached photo id of the picture associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: INTEGER (long)</P> */ public static final String CACHED_PHOTO_ID = "photo_id"; /** * The cached photo URI of the picture associated with the phone number, if it exists. - * This value may not be current if the contact information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT (URI)</P> */ public static final String CACHED_PHOTO_URI = "photo_uri"; @@ -380,9 +396,10 @@ public class CallLog { /** * The cached phone number, formatted with formatting rules based on the country the * user was in when the call was made or received. - * This value is not guaranteed to be present, and may not be current if the contact - * information associated with this number - * has changed. + * + * <p>This value is typically filled in by the dialer app for the caching purpose, + * so it's not guaranteed to be present, and may not be current if the contact + * information associated with this number has changed. * <P>Type: TEXT</P> */ public static final String CACHED_FORMATTED_NUMBER = "formatted_number"; diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index c70304e140cf..c495e6c163ac 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -35,6 +35,7 @@ import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.database.Cursor; +import android.database.CursorWrapper; import android.database.DatabaseUtils; import android.graphics.Rect; import android.net.Uri; @@ -138,8 +139,20 @@ public final class ContactsContract { public static final String DIRECTORY_PARAM_KEY = "directory"; /** - * A query parameter that limits the number of results returned. The + * A query parameter that limits the number of results returned for supported URIs. The * parameter value should be an integer. + * + * <p>This parameter is not supported by all URIs. Supported URIs include, but not limited to, + * {@link Contacts#CONTENT_URI}, + * {@link RawContacts#CONTENT_URI}, + * {@link Data#CONTENT_URI}, + * {@link CommonDataKinds.Phone#CONTENT_URI}, + * {@link CommonDataKinds.Callable#CONTENT_URI}, + * {@link CommonDataKinds.Email#CONTENT_URI}, + * {@link CommonDataKinds.Contactables#CONTENT_URI}, + * + * <p>In order to limit the number of rows returned by a non-supported URI, you can implement a + * {@link CursorWrapper} and override the {@link CursorWrapper#getCount()} methods. */ public static final String LIMIT_PARAM_KEY = "limit"; @@ -437,6 +450,9 @@ public final class ContactsContract { /** * _ID of the default directory, which represents locally stored contacts. + * <b>This is only supported by {@link ContactsContract.Contacts#CONTENT_URI} and + * {@link ContactsContract.Contacts#CONTENT_FILTER_URI}. + * Other URLs do not support the concept of "visible" or "invisible" contacts. */ public static final long DEFAULT = 0; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 6949e43d9991..1e66c55ada5d 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5839,6 +5839,8 @@ public final class Settings { /** * If nonzero, ANRs in invisible background processes bring up a dialog. * Otherwise, the process will be silently killed. + * + * Also prevents ANRs and crash dialogs from being suppressed. * @hide */ public static final String ANR_SHOW_BACKGROUND = "anr_show_background"; @@ -6324,6 +6326,13 @@ public final class Settings { = "demo_user_setup_complete"; /** + * Specifies whether the web action API is enabled. + * + * @hide + */ + public static final String WEB_ACTION_ENABLED = "web_action_enabled"; + + /** * This are the settings to be backed up. * * NOTE: Settings are backed up and restored in the order they appear @@ -8749,6 +8758,16 @@ public final class Settings { public static final String RETAIL_DEMO_MODE_CONSTANTS = "retail_demo_mode_constants"; /** + * The reason for the settings database being downgraded. This is only for + * troubleshooting purposes and its value should not be interpreted in any way. + * + * Type: string + * + * @hide + */ + public static final String DATABASE_DOWNGRADE_REASON = "database_downgrade_reason"; + + /** * Settings to backup. This is here so that it's in the same place as the settings * keys and easy to update. * diff --git a/core/java/android/security/net/config/DirectoryCertificateSource.java b/core/java/android/security/net/config/DirectoryCertificateSource.java index e3c9d659c91b..119f5d0de0a0 100644 --- a/core/java/android/security/net/config/DirectoryCertificateSource.java +++ b/core/java/android/security/net/config/DirectoryCertificateSource.java @@ -19,6 +19,7 @@ package android.security.net.config; import android.os.Environment; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Pair; import java.io.BufferedInputStream; import java.io.File; @@ -44,6 +45,7 @@ import javax.security.auth.x500.X500Principal; * @hide */ abstract class DirectoryCertificateSource implements CertificateSource { + private static final String LOG_TAG = "DirectoryCertificateSrc"; private final File mDir; private final Object mLock = new Object(); private final CertificateFactory mCertFactory; @@ -149,6 +151,9 @@ abstract class DirectoryCertificateSource implements CertificateSource { continue; } X509Certificate cert = readCertificate(fileName); + if (cert == null) { + continue; + } if (!subj.equals(cert.getSubjectX500Principal())) { continue; } @@ -173,6 +178,9 @@ abstract class DirectoryCertificateSource implements CertificateSource { continue; } X509Certificate cert = readCertificate(fileName); + if (cert == null) { + continue; + } if (!subj.equals(cert.getSubjectX500Principal())) { continue; } @@ -194,6 +202,7 @@ abstract class DirectoryCertificateSource implements CertificateSource { is = new BufferedInputStream(new FileInputStream(new File(mDir, file))); return (X509Certificate) mCertFactory.generateCertificate(is); } catch (CertificateException | IOException e) { + Log.e(LOG_TAG, "Failed to read certificate from " + file, e); return null; } finally { IoUtils.closeQuietly(is); diff --git a/core/java/android/util/PackageUtils.java b/core/java/android/util/PackageUtils.java new file mode 100644 index 000000000000..6531aef9a50c --- /dev/null +++ b/core/java/android/util/PackageUtils.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.util; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.Signature; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Helper functions applicable to packages. + * @hide + */ +public final class PackageUtils { + private final static char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + + private PackageUtils() { + /* hide constructor */ + } + + /** + * Computes the SHA256 digest of the signing cert for a package. + * @param packageManager The package manager. + * @param packageName The package for which to generate the digest. + * @param userId The user for which to generate the digest. + * @return The digest or null if the package does not exist for this user. + */ + public static @Nullable String computePackageCertSha256Digest( + @NonNull PackageManager packageManager, + @NonNull String packageName, int userId) { + final PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNATURES, userId); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + return computeCertSha256Digest(packageInfo.signatures[0]); + } + + /** + * Computes the SHA256 digest of a cert. + * @param signature The signature. + * @return The digest or null if an error occurs. + */ + public static @Nullable String computeCertSha256Digest(@NonNull Signature signature) { + return computeSha256Digest(signature.toByteArray()); + } + + /** + * Computes the SHA256 digest of some data. + * @param data The data. + * @return The digest or null if an error occurs. + */ + public static @Nullable String computeSha256Digest(@NonNull byte[] data) { + MessageDigest messageDigest; + try { + messageDigest = MessageDigest.getInstance("SHA256"); + } catch (NoSuchAlgorithmException e) { + /* can't happen */ + return null; + } + + messageDigest.update(data); + + final byte[] digest = messageDigest.digest(); + final int digestLength = digest.length; + final int charCount = 2 * digestLength; + + final char[] chars = new char[charCount]; + for (int i = 0; i < digestLength; i++) { + final int byteHex = digest[i] & 0xFF; + chars[i * 2] = HEX_ARRAY[byteHex >>> 4]; + chars[i * 2 + 1] = HEX_ARRAY[byteHex & 0x0F]; + } + return new String(chars); + } +} diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 81469c86810c..83feb88fa55d 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -73,8 +73,8 @@ interface IWindowManager void clearForcedDisplaySize(int displayId); int getInitialDisplayDensity(int displayId); int getBaseDisplayDensity(int displayId); - void setForcedDisplayDensity(int displayId, int density); - void clearForcedDisplayDensity(int displayId); + void setForcedDisplayDensityForUser(int displayId, int density, int userId); + void clearForcedDisplayDensityForUser(int displayId, int userId); void setForcedDisplayScalingMode(int displayId, int mode); // 0 = auto, 1 = disable void setOverscan(int displayId, int left, int top, int right, int bottom); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 286e0979d12b..f92d83af93a0 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -96,6 +96,8 @@ public class Surface implements Parcelable { private HwuiContext mHwuiContext; + private boolean mIsSingleBuffered; + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({SCALING_MODE_FREEZE, SCALING_MODE_SCALE_TO_WINDOW, @@ -158,7 +160,7 @@ public class Surface implements Parcelable { if (surfaceTexture == null) { throw new IllegalArgumentException("surfaceTexture must not be null"); } - + mIsSingleBuffered = surfaceTexture.isSingleBuffered(); synchronized (mLock) { mName = surfaceTexture.toString(); setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture)); @@ -457,7 +459,10 @@ public class Surface implements Parcelable { // create a new native Surface and return it after reducing // the reference count on mNativeObject. Either way, it is // not necessary to call nativeRelease() here. + // NOTE: This must be kept synchronized with the native parceling code + // in frameworks/native/libs/Surface.cpp mName = source.readString(); + mIsSingleBuffered = source.readInt() != 0; setNativeObjectLocked(nativeReadFromParcel(mNativeObject, source)); } } @@ -468,7 +473,10 @@ public class Surface implements Parcelable { throw new IllegalArgumentException("dest must not be null"); } synchronized (mLock) { + // NOTE: This must be kept synchronized with the native parceling code + // in frameworks/native/libs/Surface.cpp dest.writeString(mName); + dest.writeInt(mIsSingleBuffered ? 1 : 0); nativeWriteToParcel(mNativeObject, dest); } if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) { @@ -531,6 +539,14 @@ public class Surface implements Parcelable { } /** + * Returns whether or not this Surface is backed by a single-buffered SurfaceTexture + * @hide + */ + public boolean isSingleBuffered() { + return mIsSingleBuffered; + } + + /** * Exception thrown when a Canvas couldn't be locked with {@link Surface#lockCanvas}, or * when a SurfaceTexture could not successfully be allocated. */ diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 48189106f2c4..8a16d63fa511 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -115,6 +115,7 @@ public class SurfaceView extends View { final Rect mStableInsets = new Rect(); final Rect mOutsets = new Rect(); final Rect mBackdropFrame = new Rect(); + final Rect mTmpRect = new Rect(); final Configuration mConfiguration = new Configuration(); static final int KEEP_SCREEN_ON_MSG = 1; @@ -193,26 +194,20 @@ public class SurfaceView extends View { private boolean mGlobalListenersAdded; public SurfaceView(Context context) { - super(context); - init(); + this(context, null); } public SurfaceView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); + this(context, attrs, 0); } public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); + this(context, attrs, defStyleAttr, 0); } public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - init(); - } - private void init() { setWillNotDraw(true); } @@ -233,6 +228,7 @@ public class SurfaceView extends View { mSession = getWindowSession(); mLayout.token = getWindowToken(); mLayout.setTitle("SurfaceView - " + getViewRootImpl().getTitle()); + mLayout.packageName = mContext.getOpPackageName(); mViewVisibility = getVisibility() == VISIBLE; if (!mGlobalListenersAdded) { @@ -666,21 +662,21 @@ public class SurfaceView extends View { transformFromViewToWindowSpace(mLocation); - mWinFrame.set(mWindowSpaceLeft, mWindowSpaceTop, + mTmpRect.set(mWindowSpaceLeft, mWindowSpaceTop, mLocation[0], mLocation[1]); if (mTranslator != null) { - mTranslator.translateRectInAppWindowToScreen(mWinFrame); + mTranslator.translateRectInAppWindowToScreen(mTmpRect); } if (!isHardwareAccelerated() || !mRtHandlingPositionUpdates) { try { if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition UI, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom)); - mSession.repositionChild(mWindow, mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom, -1, mWinFrame); + mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom)); + mSession.repositionChild(mWindow, mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom, -1, mTmpRect); } catch (RemoteException ex) { Log.e(TAG, "Exception from relayout", ex); } @@ -692,10 +688,10 @@ public class SurfaceView extends View { private Rect mRTLastReportedPosition = new Rect(); /** - * Called by native on RenderThread to update the window position + * Called by native by a Rendering Worker thread to update the window position * @hide */ - public final void updateWindowPositionRT(long frameNumber, + public final void updateWindowPosition_renderWorker(long frameNumber, int left, int top, int right, int bottom) { IWindowSession session = mSession; MyWindow window = mWindow; @@ -720,7 +716,7 @@ public class SurfaceView extends View { } try { if (DEBUG) { - Log.d(TAG, String.format("%d updateWindowPosition RT, frameNr = %d, " + + Log.d(TAG, String.format("%d updateWindowPosition RenderWorker, frameNr = %d, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), frameNumber, left, top, right, bottom)); } @@ -737,12 +733,12 @@ public class SurfaceView extends View { /** * Called by native on RenderThread to notify that the window is no longer in the - * draw tree + * draw tree. UI thread is blocked at this point. * @hide */ - public final void windowPositionLostRT(long frameNumber) { + public final void windowPositionLost_uiRtSync(long frameNumber) { if (DEBUG) { - Log.d(TAG, String.format("%d windowPositionLostRT RT, frameNr = %d", + Log.d(TAG, String.format("%d windowPositionLost, frameNr = %d", System.identityHashCode(this), frameNumber)); } IWindowSession session = mSession; @@ -757,14 +753,18 @@ public class SurfaceView extends View { // safely access other member variables at this time. // So do what the UI thread would have done if RT wasn't handling position // updates. - if (!mWinFrame.isEmpty() && !mWinFrame.equals(mRTLastReportedPosition)) { + mTmpRect.set(mLayout.x, mLayout.y, + mLayout.x + mLayout.width, + mLayout.y + mLayout.height); + + if (!mTmpRect.isEmpty() && !mTmpRect.equals(mRTLastReportedPosition)) { try { if (DEBUG) Log.d(TAG, String.format("%d updateWindowPosition, " + "postion = [%d, %d, %d, %d]", System.identityHashCode(this), - mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom)); - session.repositionChild(window, mWinFrame.left, mWinFrame.top, - mWinFrame.right, mWinFrame.bottom, frameNumber, mWinFrame); + mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom)); + session.repositionChild(window, mTmpRect.left, mTmpRect.top, + mTmpRect.right, mTmpRect.bottom, frameNumber, mWinFrame); } catch (RemoteException ex) { Log.e(TAG, "Exception from relayout", ex); } diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index 9461beaf66ae..645ab5cdd3fa 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -228,6 +228,7 @@ public class TextureView extends View { */ @Override protected void destroyHardwareResources() { + super.destroyHardwareResources(); destroyHardwareLayer(); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 4d32da2e6fb1..a0afeba27fc5 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -20280,8 +20280,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // remove it from the transparent region. final int[] location = attachInfo.mTransparentLocation; getLocationInWindow(location); - region.op(location[0], location[1], location[0] + mRight - mLeft, - location[1] + mBottom - mTop, Region.Op.DIFFERENCE); + // When a view has Z value, then it will be better to leave some area below the view + // for drawing shadow. The shadow outset is proportional to the Z value. Note that + // the bottom part needs more offset than the left, top and right parts due to the + // spot light effects. + int shadowOffset = getZ() > 0 ? (int) getZ() : 0; + region.op(location[0] - shadowOffset, location[1] - shadowOffset, + location[0] + mRight - mLeft + shadowOffset, + location[1] + mBottom - mTop + (shadowOffset * 3), Region.Op.DIFFERENCE); } else { if (mBackground != null && mBackground.getOpacity() != PixelFormat.TRANSPARENT) { // The SKIP_DRAW flag IS set and the background drawable exists, we remove diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 3ff8d4f2e2b1..6933efc15b68 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -6406,16 +6406,28 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return true; } super.gatherTransparentRegion(region); - final View[] children = mChildren; - final int count = mChildrenCount; + // Instead of naively traversing the view tree, we have to traverse according to the Z + // order here. We need to go with the same order as dispatchDraw(). + // One example is that after surfaceView punch a hole, we will still allow other views drawn + // on top of that hole. In this case, those other views should be able to cut the + // transparent region into smaller area. + final int childrenCount = mChildrenCount; boolean noneOfTheChildrenAreTransparent = true; - for (int i = 0; i < count; i++) { - final View child = children[i]; - if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { - if (!child.gatherTransparentRegion(region)) { - noneOfTheChildrenAreTransparent = false; + if (childrenCount > 0) { + final ArrayList<View> preorderedList = buildOrderedChildList(); + final boolean customOrder = preorderedList == null + && isChildrenDrawingOrderEnabled(); + final View[] children = mChildren; + for (int i = 0; i < childrenCount; i++) { + final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); + final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); + if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { + if (!child.gatherTransparentRegion(region)) { + noneOfTheChildrenAreTransparent = false; + } } } + if (preorderedList != null) preorderedList.clear(); } return meOpaque || noneOfTheChildrenAreTransparent; } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1bb4c08bdf09..1d541f6c0c4c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2167,7 +2167,12 @@ public final class ViewRootImpl implements ViewParent, } if (changedVisibility || regainedFocus) { - host.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + // Toasts are presented as notifications - don't present them as windows as well + boolean isToast = (mWindowAttributes == null) ? false + : (mWindowAttributes.type == WindowManager.LayoutParams.TYPE_TOAST); + if (!isToast) { + host.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } } mFirst = false; diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 0dbf00dd75aa..395f73844b07 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1752,14 +1752,18 @@ public interface WindowManager extends ViewManager { public CharSequence accessibilityTitle; /** - * Sets a timeout in milliseconds before which the window will be removed + * Sets a timeout in milliseconds before which the window will be hidden * by the window manager. Useful for transient notifications like toasts * so we don't have to rely on client cooperation to ensure the window - * is removed. Must be specified at window creation time. + * is hidden. Must be specified at window creation time. Note that apps + * are not prepared to handle their windows being removed without their + * explicit request and may try to interact with the removed window + * resulting in undefined behavior and crashes. Therefore, we do hide + * such windows to prevent them from overlaying other apps. * * @hide */ - public long removeTimeoutMilliseconds = -1; + public long hideTimeoutMilliseconds = -1; public LayoutParams() { super(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); @@ -1895,7 +1899,7 @@ public interface WindowManager extends ViewManager { out.writeInt(needsMenuKey); out.writeInt(accessibilityIdOfAnchor); TextUtils.writeToParcel(accessibilityTitle, out, parcelableFlags); - out.writeLong(removeTimeoutMilliseconds); + out.writeLong(hideTimeoutMilliseconds); } public static final Parcelable.Creator<LayoutParams> CREATOR @@ -1949,7 +1953,7 @@ public interface WindowManager extends ViewManager { needsMenuKey = in.readInt(); accessibilityIdOfAnchor = in.readInt(); accessibilityTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); - removeTimeoutMilliseconds = in.readLong(); + hideTimeoutMilliseconds = in.readLong(); } @SuppressWarnings({"PointlessBitwiseExpression"}) @@ -2171,7 +2175,7 @@ public interface WindowManager extends ViewManager { } // This can't change, it's only set at window creation time. - removeTimeoutMilliseconds = o.removeTimeoutMilliseconds; + hideTimeoutMilliseconds = o.hideTimeoutMilliseconds; return changes; } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index b52e4b019f8f..2b3d6436dd4e 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -507,6 +507,11 @@ public interface WindowManagerPolicy { * Retrieves the {@param outBounds} from the stack with id {@param stackId}. */ void getStackBounds(int stackId, Rect outBounds); + + /** + * Overrides all currently playing app animations with {@param a}. + */ + void overridePlayingAppAnimationsLw(Animation a); } public interface PointerEventListener { diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index 07910b60df3f..8023201bc284 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -43,12 +43,14 @@ import android.view.KeyEvent; * in {@link android.os.Build.VERSION_CODES#HONEYCOMB}.</li> * <li>{@link #requestCursorUpdates(int)}, which was introduced in * {@link android.os.Build.VERSION_CODES#LOLLIPOP}.</li> - * <li>{@link #deleteSurroundingTextInCodePoints(int, int)}}, which + * <li>{@link #deleteSurroundingTextInCodePoints(int, int)}, which * was introduced in {@link android.os.Build.VERSION_CODES#N}.</li> - * <li>{@link #getHandler()}}, which was introduced in + * <li>{@link #getHandler()}, which was introduced in * {@link android.os.Build.VERSION_CODES#N}.</li> - * <li>{@link #closeConnection()}}, which was introduced in + * <li>{@link #closeConnection()}, which was introduced in * {@link android.os.Build.VERSION_CODES#N}.</li> + * <li>{@link #commitContent(InputContentInfo, int, Bundle)}, which was + * introduced in {@link android.os.Build.VERSION_CODES#N_MR1}.</li> * </ul> * * <h3>Implementing an IME or an editor</h3> diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index c3ddec787bfa..25580fd2496e 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -16,6 +16,8 @@ package android.widget; +import com.android.internal.R; + import android.annotation.CallSuper; import android.annotation.IntDef; import android.annotation.Widget; @@ -29,10 +31,12 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.Spanned; import android.text.TextUtils; +import android.text.TextWatcher; import android.text.method.NumberKeyListener; import android.util.AttributeSet; import android.util.SparseArray; @@ -52,9 +56,6 @@ import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; -import com.android.internal.R; -import libcore.icu.LocaleData; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -62,6 +63,8 @@ import java.util.Collections; import java.util.List; import java.util.Locale; +import libcore.icu.LocaleData; + /** * A widget that enables the user to select a number from a predefined range. * There are two flavors of this widget and which one is presented to the user @@ -1991,7 +1994,7 @@ public class NumberPicker extends LinearLayout { removeCallbacks(mChangeCurrentByOneFromLongPressCommand); } if (mSetSelectionCommand != null) { - removeCallbacks(mSetSelectionCommand); + mSetSelectionCommand.cancel(); } if (mBeginSoftInputOnLongPressCommand != null) { removeCallbacks(mBeginSoftInputOnLongPressCommand); @@ -2033,18 +2036,14 @@ public class NumberPicker extends LinearLayout { } /** - * Posts an {@link SetSelectionCommand} from the given <code>selectionStart - * </code> to <code>selectionEnd</code>. + * Posts a {@link SetSelectionCommand} from the given + * {@code selectionStart} to {@code selectionEnd}. */ private void postSetSelectionCommand(int selectionStart, int selectionEnd) { if (mSetSelectionCommand == null) { - mSetSelectionCommand = new SetSelectionCommand(); - } else { - removeCallbacks(mSetSelectionCommand); + mSetSelectionCommand = new SetSelectionCommand(mInputText); } - mSetSelectionCommand.mSelectionStart = selectionStart; - mSetSelectionCommand.mSelectionEnd = selectionEnd; - post(mSetSelectionCommand); + mSetSelectionCommand.post(selectionStart, selectionEnd); } /** @@ -2090,6 +2089,12 @@ public class NumberPicker extends LinearLayout { @Override public CharSequence filter( CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + // We don't know what the output will be, so always cancel any + // pending set selection command. + if (mSetSelectionCommand != null) { + mSetSelectionCommand.cancel(); + } + if (mDisplayedValues == null) { CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); if (filtered == null) { @@ -2237,12 +2242,39 @@ public class NumberPicker extends LinearLayout { /** * Command for setting the input text selection. */ - class SetSelectionCommand implements Runnable { - private int mSelectionStart; + private static class SetSelectionCommand implements Runnable { + private final EditText mInputText; + private int mSelectionStart; private int mSelectionEnd; + /** Whether this runnable is currently posted. */ + private boolean mPosted; + + public SetSelectionCommand(EditText inputText) { + mInputText = inputText; + } + + public void post(int selectionStart, int selectionEnd) { + mSelectionStart = selectionStart; + mSelectionEnd = selectionEnd; + + if (!mPosted) { + mInputText.post(this); + mPosted = true; + } + } + + public void cancel() { + if (mPosted) { + mInputText.removeCallbacks(this); + mPosted = false; + } + } + + @Override public void run() { + mPosted = false; mInputText.setSelection(mSelectionStart, mSelectionEnd); } } diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 6432f703f2ba..9b89491ce408 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -193,6 +193,8 @@ public class PopupWindow { private int mAnimationStyle = ANIMATION_STYLE_DEFAULT; + private int mGravity = Gravity.NO_GRAVITY; + private static final int[] ABOVE_ANCHOR_STATE_SET = new int[] { com.android.internal.R.attr.state_above_anchor }; @@ -1141,15 +1143,11 @@ public class PopupWindow { mIsShowing = true; mIsDropdown = false; + mGravity = gravity; final WindowManager.LayoutParams p = createPopupLayoutParams(token); preparePopup(p); - // Only override the default if some gravity was specified. - if (gravity != Gravity.NO_GRAVITY) { - p.gravity = gravity; - } - p.x = x; p.y = y; @@ -1394,8 +1392,8 @@ public class PopupWindow { } private int computeGravity() { - int gravity = Gravity.START | Gravity.TOP; - if (mClipToScreen || mClippingEnabled) { + int gravity = mGravity == Gravity.NO_GRAVITY ? Gravity.START | Gravity.TOP : mGravity; + if (mIsDropdown && (mClipToScreen || mClippingEnabled)) { gravity |= Gravity.DISPLAY_CLIP_VERTICAL; } return gravity; @@ -1547,7 +1545,7 @@ public class PopupWindow { } // Let the window manager know to align the top to y. - outParams.gravity = Gravity.LEFT | Gravity.TOP; + outParams.gravity = computeGravity(); outParams.width = width; outParams.height = height; @@ -1760,11 +1758,22 @@ public class PopupWindow { */ public int getMaxAvailableHeight( @NonNull View anchor, int yOffset, boolean ignoreBottomDecorations) { - final Rect displayFrame = new Rect(); + Rect displayFrame = null; + final Rect visibleDisplayFrame = new Rect(); + + anchor.getWindowVisibleDisplayFrame(visibleDisplayFrame); if (ignoreBottomDecorations) { + // In the ignore bottom decorations case we want to + // still respect all other decorations so we use the inset visible + // frame on the top right and left and take the bottom + // value from the full frame. + displayFrame = new Rect(); anchor.getWindowDisplayFrame(displayFrame); + displayFrame.top = visibleDisplayFrame.top; + displayFrame.right = visibleDisplayFrame.right; + displayFrame.left = visibleDisplayFrame.left; } else { - anchor.getWindowVisibleDisplayFrame(displayFrame); + displayFrame = visibleDisplayFrame; } final int[] anchorPos = mTmpDrawingLocation; diff --git a/core/java/android/widget/SearchView.java b/core/java/android/widget/SearchView.java index 5878cad2f9a3..9139361eda7c 100644 --- a/core/java/android/widget/SearchView.java +++ b/core/java/android/widget/SearchView.java @@ -816,9 +816,11 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { switch (heightMode) { case MeasureSpec.AT_MOST: - case MeasureSpec.UNSPECIFIED: height = Math.min(getPreferredHeight(), height); break; + case MeasureSpec.UNSPECIFIED: + height = getPreferredHeight(); + break; } heightMode = MeasureSpec.EXACTLY; diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index f2fc617ccc33..10959780683a 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -16,19 +16,19 @@ package android.widget; +import com.android.internal.R; + +import android.annotation.IntRange; import android.annotation.NonNull; -import android.annotation.Nullable; import android.annotation.Widget; import android.content.Context; -import android.content.res.Configuration; import android.content.res.TypedArray; import android.os.Parcel; import android.os.Parcelable; -import android.os.Parcelable.Creator; import android.util.AttributeSet; +import android.util.MathUtils; import android.view.View; import android.view.accessibility.AccessibilityEvent; -import com.android.internal.R; import java.util.Locale; @@ -102,8 +102,8 @@ public class TimePicker extends FrameLayout { * @param hour the hour to set, in the range (0-23) * @see #getHour() */ - public void setHour(int hour) { - mDelegate.setHour(hour); + public void setHour(@IntRange(from = 0, to = 23) int hour) { + mDelegate.setHour(MathUtils.constrain(hour, 0, 23)); } /** @@ -117,13 +117,13 @@ public class TimePicker extends FrameLayout { } /** - * Sets the currently selected minute.. + * Sets the currently selected minute. * * @param minute the minute to set, in the range (0-59) * @see #getMinute() */ - public void setMinute(int minute) { - mDelegate.setMinute(minute); + public void setMinute(@IntRange(from = 0, to = 59) int minute) { + mDelegate.setMinute(MathUtils.constrain(minute, 0, 59)); } /** @@ -137,8 +137,9 @@ public class TimePicker extends FrameLayout { } /** - * Sets the current hour. + * Sets the currently selected hour using 24-hour time. * + * @param currentHour the hour to set, in the range (0-23) * @deprecated Use {@link #setHour(int)} */ @Deprecated @@ -147,33 +148,34 @@ public class TimePicker extends FrameLayout { } /** - * @return the current hour in the range (0-23) + * @return the currently selected hour, in the range (0-23) * @deprecated Use {@link #getHour()} */ @NonNull @Deprecated public Integer getCurrentHour() { - return mDelegate.getHour(); + return getHour(); } /** - * Set the current minute (0-59). + * Sets the currently selected minute. * + * @param currentMinute the minute to set, in the range (0-59) * @deprecated Use {@link #setMinute(int)} */ @Deprecated public void setCurrentMinute(@NonNull Integer currentMinute) { - mDelegate.setMinute(currentMinute); + setMinute(currentMinute); } /** - * @return the current minute + * @return the currently selected minute, in the range (0-59) * @deprecated Use {@link #getMinute()} */ @NonNull @Deprecated public Integer getCurrentMinute() { - return mDelegate.getMinute(); + return getMinute(); } /** @@ -256,10 +258,10 @@ public class TimePicker extends FrameLayout { * for the real behavior. */ interface TimePickerDelegate { - void setHour(int hour); + void setHour(@IntRange(from = 0, to = 23) int hour); int getHour(); - void setMinute(int minute); + void setMinute(@IntRange(from = 0, to = 59) int minute); int getMinute(); void setIs24Hour(boolean is24Hour); diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index 77626754264f..a400d90c64c5 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -25,6 +25,8 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.PixelFormat; import android.os.Handler; +import android.os.IBinder; +import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; @@ -326,13 +328,6 @@ public class Toast { } private static class TN extends ITransientNotification.Stub { - final Runnable mShow = new Runnable() { - @Override - public void run() { - handleShow(); - } - }; - final Runnable mHide = new Runnable() { @Override public void run() { @@ -343,7 +338,13 @@ public class Toast { }; private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); - final Handler mHandler = new Handler(); + final Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + IBinder token = (IBinder) msg.obj; + handleShow(token); + } + }; int mGravity; int mX, mY; @@ -379,9 +380,9 @@ public class Toast { * schedule handleShow into the right thread */ @Override - public void show() { + public void show(IBinder windowToken) { if (localLOGV) Log.v(TAG, "SHOW: " + this); - mHandler.post(mShow); + mHandler.obtainMessage(0, windowToken).sendToTarget(); } /** @@ -393,7 +394,7 @@ public class Toast { mHandler.post(mHide); } - public void handleShow() { + public void handleShow(IBinder windowToken) { if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView + " mNextView=" + mNextView); if (mView != mNextView) { @@ -422,8 +423,9 @@ public class Toast { mParams.verticalMargin = mVerticalMargin; mParams.horizontalMargin = mHorizontalMargin; mParams.packageName = packageName; - mParams.removeTimeoutMilliseconds = mDuration == + mParams.hideTimeoutMilliseconds = mDuration == Toast.LENGTH_LONG ? LONG_DURATION_TIMEOUT : SHORT_DURATION_TIMEOUT; + mParams.token = windowToken; if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); mWM.removeView(mView); @@ -458,7 +460,7 @@ public class Toast { // the view isn't yet added, so let's try not to crash. if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); - mWM.removeView(mView); + mWM.removeViewImmediate(mView); } mView = null; diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java index f084db2d1589..b973324dee8c 100644 --- a/core/java/android/widget/VideoView.java +++ b/core/java/android/widget/VideoView.java @@ -70,46 +70,49 @@ import java.util.Vector; */ public class VideoView extends SurfaceView implements MediaPlayerControl, SubtitleController.Anchor { - private String TAG = "VideoView"; - // settable by the client - private Uri mUri; - private Map<String, String> mHeaders; + private static final String TAG = "VideoView"; // all possible internal states - private static final int STATE_ERROR = -1; - private static final int STATE_IDLE = 0; - private static final int STATE_PREPARING = 1; - private static final int STATE_PREPARED = 2; - private static final int STATE_PLAYING = 3; - private static final int STATE_PAUSED = 4; + private static final int STATE_ERROR = -1; + private static final int STATE_IDLE = 0; + private static final int STATE_PREPARING = 1; + private static final int STATE_PREPARED = 2; + private static final int STATE_PLAYING = 3; + private static final int STATE_PAUSED = 4; private static final int STATE_PLAYBACK_COMPLETED = 5; + private final Vector<Pair<InputStream, MediaFormat>> mPendingSubtitleTracks = new Vector<>(); + + // settable by the client + private Uri mUri; + private Map<String, String> mHeaders; + // mCurrentState is a VideoView object's current state. // mTargetState is the state that a method caller intends to reach. // For instance, regardless the VideoView object's current state, // calling pause() intends to bring the object to a target state // of STATE_PAUSED. private int mCurrentState = STATE_IDLE; - private int mTargetState = STATE_IDLE; + private int mTargetState = STATE_IDLE; // All the stuff we need for playing and showing a video private SurfaceHolder mSurfaceHolder = null; private MediaPlayer mMediaPlayer = null; - private int mAudioSession; - private int mVideoWidth; - private int mVideoHeight; - private int mSurfaceWidth; - private int mSurfaceHeight; + private int mAudioSession; + private int mVideoWidth; + private int mVideoHeight; + private int mSurfaceWidth; + private int mSurfaceHeight; private MediaController mMediaController; private OnCompletionListener mOnCompletionListener; private MediaPlayer.OnPreparedListener mOnPreparedListener; - private int mCurrentBufferPercentage; + private int mCurrentBufferPercentage; private OnErrorListener mOnErrorListener; - private OnInfoListener mOnInfoListener; - private int mSeekWhenPrepared; // recording the seek position while preparing - private boolean mCanPause; - private boolean mCanSeekBack; - private boolean mCanSeekForward; + private OnInfoListener mOnInfoListener; + private int mSeekWhenPrepared; // recording the seek position while preparing + private boolean mCanPause; + private boolean mCanSeekBack; + private boolean mCanSeekForward; /** Subtitle rendering widget overlaid on top of the video. */ private RenderingWidget mSubtitleWidget; @@ -118,13 +121,11 @@ public class VideoView extends SurfaceView private RenderingWidget.OnChangedListener mSubtitlesChangedListener; public VideoView(Context context) { - super(context); - initVideoView(); + this(context, null); } public VideoView(Context context, AttributeSet attrs) { this(context, attrs, 0); - initVideoView(); } public VideoView(Context context, AttributeSet attrs, int defStyleAttr) { @@ -133,7 +134,19 @@ public class VideoView extends SurfaceView public VideoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); - initVideoView(); + + mVideoWidth = 0; + mVideoHeight = 0; + + getHolder().addCallback(mSHCallback); + getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + + setFocusable(true); + setFocusableInTouchMode(true); + requestFocus(); + + mCurrentState = STATE_IDLE; + mTargetState = STATE_IDLE; } @Override @@ -209,19 +222,6 @@ public class VideoView extends SurfaceView return getDefaultSize(desiredSize, measureSpec); } - private void initVideoView() { - mVideoWidth = 0; - mVideoHeight = 0; - getHolder().addCallback(mSHCallback); - getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); - setFocusable(true); - setFocusableInTouchMode(true); - requestFocus(); - mPendingSubtitleTracks = new Vector<Pair<InputStream, MediaFormat>>(); - mCurrentState = STATE_IDLE; - mTargetState = STATE_IDLE; - } - /** * Sets video path. * @@ -294,8 +294,6 @@ public class VideoView extends SurfaceView } } - private Vector<Pair<InputStream, MediaFormat>> mPendingSubtitleTracks; - public void stopPlayback() { if (mMediaPlayer != null) { mMediaPlayer.stop(); diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 0a4ac0d44db4..1e26c92dd764 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -1469,7 +1469,7 @@ public class ResolverActivity extends Activity { boolean found = false; // Only loop to the end of into as it was before we started; no dupes in from. for (int j = 0; j < intoCount; j++) { - final ResolvedComponentInfo rci = into.get(i); + final ResolvedComponentInfo rci = into.get(j); if (isSameResolvedComponent(newInfo, rci)) { found = true; rci.add(intent, newInfo); diff --git a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java index a4b5a8e6595c..cb2b0191b883 100644 --- a/core/java/com/android/internal/app/SuggestedLocaleAdapter.java +++ b/core/java/com/android/internal/app/SuggestedLocaleAdapter.java @@ -145,7 +145,11 @@ public class SuggestedLocaleAdapter extends BaseAdapter implements Filterable { if (itemType == TYPE_HEADER_SUGGESTED) { textView.setText(R.string.language_picker_section_suggested); } else { - textView.setText(R.string.language_picker_section_all); + if (mCountryMode) { + textView.setText(R.string.region_picker_section_all); + } else { + textView.setText(R.string.language_picker_section_all); + } } textView.setTextLocale(Locale.getDefault()); break; diff --git a/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java new file mode 100644 index 000000000000..62f18eac4aa4 --- /dev/null +++ b/core/java/com/android/internal/graphics/drawable/AnimationScaleListDrawable.java @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.graphics.drawable; + +import android.animation.ValueAnimator; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.res.Resources; +import android.content.res.Resources.Theme; +import android.content.res.TypedArray; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.DrawableContainer; +import android.util.AttributeSet; + +import com.android.internal.R; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + +import java.io.IOException; + +/** + * An internal DrawableContainer class, used to draw different things depending on animation scale. + * i.e: animation scale can be 0 in battery saver mode. + * This class contains 2 drawable, one is animatable, the other is static. When animation scale is + * not 0, the animatable drawable will the drawn. Otherwise, the static drawable will be drawn. + * <p>This class implements Animatable since ProgressBar can pick this up similarly as an + * AnimatedVectorDrawable. + * <p>It can be defined in an XML file with the {@code <AnimationScaleListDrawable>} + * element. + */ +public class AnimationScaleListDrawable extends DrawableContainer implements Animatable { + private static final String TAG = "AnimationScaleListDrawable"; + private AnimationScaleListState mAnimationScaleListState; + private boolean mMutated; + + public AnimationScaleListDrawable() { + this(null, null); + } + + private AnimationScaleListDrawable(@Nullable AnimationScaleListState state, + @Nullable Resources res) { + // Every scale list drawable has its own constant state. + final AnimationScaleListState newState = new AnimationScaleListState(state, this, res); + setConstantState(newState); + onStateChange(getState()); + } + + /** + * Set the current drawable according to the animation scale. If scale is 0, then pick the + * static drawable, otherwise, pick the animatable drawable. + */ + @Override + protected boolean onStateChange(int[] stateSet) { + final boolean changed = super.onStateChange(stateSet); + int idx = mAnimationScaleListState.getCurrentDrawableIndexBasedOnScale(); + return selectDrawable(idx) || changed; + } + + + @Override + public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser, + @NonNull AttributeSet attrs, @Nullable Theme theme) + throws XmlPullParserException, IOException { + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimationScaleListDrawable); + updateDensity(r); + a.recycle(); + + inflateChildElements(r, parser, attrs, theme); + + onStateChange(getState()); + } + + /** + * Inflates child elements from XML. + */ + private void inflateChildElements(@NonNull Resources r, @NonNull XmlPullParser parser, + @NonNull AttributeSet attrs, @Nullable Theme theme) + throws XmlPullParserException, IOException { + final AnimationScaleListState state = mAnimationScaleListState; + final int innerDepth = parser.getDepth() + 1; + int type; + int depth; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && ((depth = parser.getDepth()) >= innerDepth + || type != XmlPullParser.END_TAG)) { + if (type != XmlPullParser.START_TAG) { + continue; + } + + if (depth > innerDepth || !parser.getName().equals("item")) { + continue; + } + + // Either pick up the android:drawable attribute. + final TypedArray a = obtainAttributes(r, theme, attrs, + R.styleable.AnimationScaleListDrawableItem); + Drawable dr = a.getDrawable(R.styleable.AnimationScaleListDrawableItem_drawable); + a.recycle(); + + // Or parse the child element under <item>. + if (dr == null) { + while ((type = parser.next()) == XmlPullParser.TEXT) { + } + if (type != XmlPullParser.START_TAG) { + throw new XmlPullParserException( + parser.getPositionDescription() + + ": <item> tag requires a 'drawable' attribute or " + + "child tag defining a drawable"); + } + dr = Drawable.createFromXmlInner(r, parser, attrs, theme); + } + + state.addDrawable(dr); + } + } + + @Override + public Drawable mutate() { + if (!mMutated && super.mutate() == this) { + mAnimationScaleListState.mutate(); + mMutated = true; + } + return this; + } + + @Override + public void clearMutated() { + super.clearMutated(); + mMutated = false; + } + + @Override + public void start() { + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + ((Animatable) dr).start(); + } + } + + @Override + public void stop() { + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + ((Animatable) dr).stop(); + } + } + + @Override + public boolean isRunning() { + boolean result = false; + Drawable dr = getCurrent(); + if (dr != null && dr instanceof Animatable) { + result = ((Animatable) dr).isRunning(); + } + return result; + } + + static class AnimationScaleListState extends DrawableContainerState { + int[] mThemeAttrs = null; + // The index of the last static drawable. + int mStaticDrawableIndex = -1; + // The index of the last animatable drawable. + int mAnimatableDrawableIndex = -1; + + AnimationScaleListState(AnimationScaleListState orig, AnimationScaleListDrawable owner, + Resources res) { + super(orig, owner, res); + + if (orig != null) { + // Perform a shallow copy and rely on mutate() to deep-copy. + mThemeAttrs = orig.mThemeAttrs; + + mStaticDrawableIndex = orig.mStaticDrawableIndex; + mAnimatableDrawableIndex = orig.mAnimatableDrawableIndex; + } + + } + + void mutate() { + mThemeAttrs = mThemeAttrs != null ? mThemeAttrs.clone() : null; + } + + /** + * Add the drawable into the container. + * This class only keep track one animatable drawable, and one static. If there are multiple + * defined in the XML, then pick the last one. + */ + int addDrawable(Drawable drawable) { + final int pos = addChild(drawable); + if (drawable instanceof Animatable) { + mAnimatableDrawableIndex = pos; + } else { + mStaticDrawableIndex = pos; + } + return pos; + } + + @Override + public Drawable newDrawable() { + return new AnimationScaleListDrawable(this, null); + } + + @Override + public Drawable newDrawable(Resources res) { + return new AnimationScaleListDrawable(this, res); + } + + @Override + public boolean canApplyTheme() { + return mThemeAttrs != null || super.canApplyTheme(); + } + + public int getCurrentDrawableIndexBasedOnScale() { + if (ValueAnimator.getDurationScale() == 0) { + return mStaticDrawableIndex; + } + return mAnimatableDrawableIndex; + } + } + + @Override + public void applyTheme(@NonNull Theme theme) { + super.applyTheme(theme); + + onStateChange(getState()); + } + + @Override + protected void setConstantState(@NonNull DrawableContainerState state) { + super.setConstantState(state); + + if (state instanceof AnimationScaleListState) { + mAnimationScaleListState = (AnimationScaleListState) state; + } + } +} + diff --git a/core/java/com/android/internal/os/ProcessCpuTracker.java b/core/java/com/android/internal/os/ProcessCpuTracker.java index b7e571871086..e46dfc4e0cb6 100644 --- a/core/java/com/android/internal/os/ProcessCpuTracker.java +++ b/core/java/com/android/internal/os/ProcessCpuTracker.java @@ -39,6 +39,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; +import java.util.List; import java.util.StringTokenizer; public class ProcessCpuTracker { @@ -177,6 +178,11 @@ public class ProcessCpuTracker { private byte[] mBuffer = new byte[4096]; + public interface FilterStats { + /** Which stats to pick when filtering */ + boolean needed(Stats stats); + } + public static class Stats { public final int pid; public final int uid; @@ -695,6 +701,18 @@ public class ProcessCpuTracker { return mProcStats.get(index); } + final public List<Stats> getStats(FilterStats filter) { + final ArrayList<Stats> statses = new ArrayList<>(mProcStats.size()); + final int N = mProcStats.size(); + for (int p = 0; p < N; p++) { + Stats stats = mProcStats.get(p); + if (filter.needed(stats)) { + statses.add(stats); + } + } + return statses; + } + final public int countWorkingStats() { buildWorkingProcs(); return mWorkingProcs.size(); diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 83d75fba80f9..e51ad3f737b8 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -28,8 +28,9 @@ oneway interface IKeyguardService { * FLAG_SHOW_ON_LOCK_SCREEN. * * @param isOccluded Whether the Keyguard is occluded by another window. + * @param animate Whether to play an animation for the state change. */ - void setOccluded(boolean isOccluded); + void setOccluded(boolean isOccluded, boolean animate); void addStateMonitorCallback(IKeyguardStateCallback callback); void verifyUnlock(IKeyguardExitCallback callback); diff --git a/core/java/com/android/internal/util/WakeupMessage.java b/core/java/com/android/internal/util/WakeupMessage.java index 7d222c74ac3b..46098c58108f 100644 --- a/core/java/com/android/internal/util/WakeupMessage.java +++ b/core/java/com/android/internal/util/WakeupMessage.java @@ -108,7 +108,7 @@ public class WakeupMessage implements AlarmManager.OnAlarmListener { } if (stillScheduled) { Message msg = mHandler.obtainMessage(mCmd, mArg1, mArg2, mObj); - mHandler.handleMessage(msg); + mHandler.dispatchMessage(msg); msg.recycle(); } } diff --git a/core/java/com/android/internal/widget/AlertDialogLayout.java b/core/java/com/android/internal/widget/AlertDialogLayout.java index 891c920af336..9bf094891f3b 100644 --- a/core/java/com/android/internal/widget/AlertDialogLayout.java +++ b/core/java/com/android/internal/widget/AlertDialogLayout.java @@ -20,7 +20,9 @@ import android.annotation.AttrRes; import android.annotation.Nullable; import android.annotation.StyleRes; import android.content.Context; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -265,4 +267,92 @@ public class AlertDialogLayout extends LinearLayout { return 0; } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + final int paddingLeft = mPaddingLeft; + + // Where right end of child should go + final int width = right - left; + final int childRight = width - mPaddingRight; + + // Space available for child + final int childSpace = width - paddingLeft - mPaddingRight; + + final int totalLength = getMeasuredHeight(); + final int count = getChildCount(); + final int gravity = getGravity(); + final int majorGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; + final int minorGravity = gravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; + + int childTop; + switch (majorGravity) { + case Gravity.BOTTOM: + // totalLength contains the padding already + childTop = mPaddingTop + bottom - top - totalLength; + break; + + // totalLength contains the padding already + case Gravity.CENTER_VERTICAL: + childTop = mPaddingTop + (bottom - top - totalLength) / 2; + break; + + case Gravity.TOP: + default: + childTop = mPaddingTop; + break; + } + + final Drawable dividerDrawable = getDividerDrawable(); + final int dividerHeight = dividerDrawable == null ? + 0 : dividerDrawable.getIntrinsicHeight(); + + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child != null && child.getVisibility() != GONE) { + final int childWidth = child.getMeasuredWidth(); + final int childHeight = child.getMeasuredHeight(); + + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + + int layoutGravity = lp.gravity; + if (layoutGravity < 0) { + layoutGravity = minorGravity; + } + final int layoutDirection = getLayoutDirection(); + final int absoluteGravity = Gravity.getAbsoluteGravity( + layoutGravity, layoutDirection); + + final int childLeft; + switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { + case Gravity.CENTER_HORIZONTAL: + childLeft = paddingLeft + ((childSpace - childWidth) / 2) + + lp.leftMargin - lp.rightMargin; + break; + + case Gravity.RIGHT: + childLeft = childRight - childWidth - lp.rightMargin; + break; + + case Gravity.LEFT: + default: + childLeft = paddingLeft + lp.leftMargin; + break; + } + + if (hasDividerBeforeChildAt(i)) { + childTop += dividerHeight; + } + + childTop += lp.topMargin; + setChildFrame(child, childLeft, childTop, childWidth, childHeight); + childTop += childHeight + lp.bottomMargin; + } + } + } + + private void setChildFrame(View child, int left, int top, int width, int height) { + child.layout(left, top, left + width, top + height); + } } diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index fbc51cdca6c2..5a50fbfd5277 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -79,6 +79,9 @@ public class BootReceiver extends BroadcastReceiver { private static final String LOG_FILES_FILE = "log-files.xml"; private static final AtomicFile sFile = new AtomicFile(new File( Environment.getDataSystemDirectory(), LOG_FILES_FILE)); + private static final String LAST_HEADER_FILE = "last-header.txt"; + private static final File lastHeaderFile = new File( + Environment.getDataSystemDirectory(), LAST_HEADER_FILE); @Override public void onReceive(final Context context, Intent intent) { @@ -113,9 +116,17 @@ public class BootReceiver extends BroadcastReceiver { Downloads.removeAllDownloadsByPackage(context, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS); } - private void logBootEvents(Context ctx) throws IOException { - final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); - final String headers = new StringBuilder(512) + private String getPreviousBootHeaders() { + try { + return FileUtils.readTextFile(lastHeaderFile, 0, null); + } catch (IOException e) { + Slog.e(TAG, "Error reading " + lastHeaderFile, e); + return null; + } + } + + private String getCurrentBootHeaders() throws IOException { + return new StringBuilder(512) .append("Build: ").append(Build.FINGERPRINT).append("\n") .append("Hardware: ").append(Build.BOARD).append("\n") .append("Revision: ") @@ -125,6 +136,31 @@ public class BootReceiver extends BroadcastReceiver { .append("Kernel: ") .append(FileUtils.readTextFile(new File("/proc/version"), 1024, "...\n")) .append("\n").toString(); + } + + + private String getBootHeadersToLogAndUpdate() throws IOException { + final String oldHeaders = getPreviousBootHeaders(); + final String newHeaders = getCurrentBootHeaders(); + + try { + FileUtils.stringToFile(lastHeaderFile, newHeaders); + } catch (IOException e) { + Slog.e(TAG, "Error writing " + lastHeaderFile, e); + } + + if (oldHeaders == null) { + // If we failed to read the old headers, use the current headers + // but note this in the headers so we know + return "isPrevious: false\n" + newHeaders; + } + + return "isPrevious: true\n" + oldHeaders; + } + + private void logBootEvents(Context ctx) throws IOException { + final DropBoxManager db = (DropBoxManager) ctx.getSystemService(Context.DROPBOX_SERVICE); + final String headers = getBootHeadersToLogAndUpdate(); final String bootReason = SystemProperties.get("ro.boot.bootreason", null); String recovery = RecoverySystem.handleAftermath(ctx); diff --git a/core/java/com/android/server/backup/AccountManagerBackupHelper.java b/core/java/com/android/server/backup/AccountManagerBackupHelper.java new file mode 100644 index 000000000000..39b18c0f2c16 --- /dev/null +++ b/core/java/com/android/server/backup/AccountManagerBackupHelper.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.backup; + +import android.accounts.AccountManagerInternal; +import android.app.backup.BlobBackupHelper; +import android.os.UserHandle; +import android.util.Slog; +import com.android.server.LocalServices; + +/** + * Helper for handling backup of account manager specific state. + */ +public class AccountManagerBackupHelper extends BlobBackupHelper { + private static final String TAG = "AccountsBackup"; + private static final boolean DEBUG = false; + + // current schema of the backup state blob + private static final int STATE_VERSION = 1; + + // key under which the account access grant state blob is committed to backup + private static final String KEY_ACCOUNT_ACCESS_GRANTS = "account_access_grants"; + + public AccountManagerBackupHelper() { + super(STATE_VERSION, KEY_ACCOUNT_ACCESS_GRANTS); + } + + @Override + protected byte[] getBackupPayload(String key) { + AccountManagerInternal am = LocalServices.getService(AccountManagerInternal.class); + if (DEBUG) { + Slog.d(TAG, "Handling backup of " + key); + } + try { + switch (key) { + case KEY_ACCOUNT_ACCESS_GRANTS: { + return am.backupAccountAccessPermissions(UserHandle.USER_SYSTEM); + } + + default: { + Slog.w(TAG, "Unexpected backup key " + key); + } + } + } catch (Exception e) { + Slog.e(TAG, "Unable to store payload " + key); + } + + return new byte[0]; + } + + @Override + protected void applyRestoredPayload(String key, byte[] payload) { + AccountManagerInternal am = LocalServices.getService(AccountManagerInternal.class); + if (DEBUG) { + Slog.d(TAG, "Handling restore of " + key); + } + try { + switch (key) { + case KEY_ACCOUNT_ACCESS_GRANTS: { + am.restoreAccountAccessPermissions(payload, UserHandle.USER_SYSTEM); + } break; + + default: { + Slog.w(TAG, "Unexpected restore key " + key); + } + } + } catch (Exception e) { + Slog.w(TAG, "Unable to restore key " + key); + } + } +} diff --git a/core/java/com/android/server/backup/SystemBackupAgent.java b/core/java/com/android/server/backup/SystemBackupAgent.java index 9d296fa19400..537565185d9b 100644 --- a/core/java/com/android/server/backup/SystemBackupAgent.java +++ b/core/java/com/android/server/backup/SystemBackupAgent.java @@ -49,6 +49,7 @@ public class SystemBackupAgent extends BackupAgentHelper { private static final String PERMISSION_HELPER = "permissions"; private static final String USAGE_STATS_HELPER = "usage_stats"; private static final String SHORTCUT_MANAGER_HELPER = "shortcut_manager"; + private static final String ACCOUNT_MANAGER_HELPER = "account_manager"; // These paths must match what the WallpaperManagerService uses. The leaf *_FILENAME // are also used in the full-backup file format, so must not change unless steps are @@ -82,6 +83,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(PERMISSION_HELPER, new PermissionBackupHelper()); addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); + addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); super.onBackup(oldState, data, newState); } @@ -111,6 +113,7 @@ public class SystemBackupAgent extends BackupAgentHelper { addHelper(PERMISSION_HELPER, new PermissionBackupHelper()); addHelper(USAGE_STATS_HELPER, new UsageStatsBackupHelper(this)); addHelper(SHORTCUT_MANAGER_HELPER, new ShortcutBackupHelper()); + addHelper(ACCOUNT_MANAGER_HELPER, new AccountManagerBackupHelper()); try { super.onRestore(data, appVersionCode, newState); diff --git a/core/jni/android/graphics/pdf/PdfEditor.cpp b/core/jni/android/graphics/pdf/PdfEditor.cpp index d2d39cd0b286..0468b644862d 100644 --- a/core/jni/android/graphics/pdf/PdfEditor.cpp +++ b/core/jni/android/graphics/pdf/PdfEditor.cpp @@ -52,11 +52,9 @@ static struct { } gRectClassInfo; // Also used in PdfRenderer.cpp -Mutex sPdfiumLock; int sUnmatchedPdfiumInitRequestCount = 0; static void initializeLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_InitLibrary(); } @@ -64,7 +62,6 @@ static void initializeLibraryIfNeeded() { } static void destroyLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); sUnmatchedPdfiumInitRequestCount--; if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_DestroyLibrary(); diff --git a/core/jni/android/graphics/pdf/PdfRenderer.cpp b/core/jni/android/graphics/pdf/PdfRenderer.cpp index 71bec7845fd7..43550ac9ed72 100644 --- a/core/jni/android/graphics/pdf/PdfRenderer.cpp +++ b/core/jni/android/graphics/pdf/PdfRenderer.cpp @@ -44,11 +44,9 @@ static struct { } gPointClassInfo; // See PdfEditor.cpp -extern Mutex sPdfiumLock; extern int sUnmatchedPdfiumInitRequestCount; static void initializeLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_InitLibrary(); } @@ -56,7 +54,6 @@ static void initializeLibraryIfNeeded() { } static void destroyLibraryIfNeeded() { - Mutex::Autolock _l(sPdfiumLock); sUnmatchedPdfiumInitRequestCount--; if (sUnmatchedPdfiumInitRequestCount == 0) { FPDF_DestroyLibrary(); diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp index bb09d001037d..e96613b7d45b 100644 --- a/core/jni/android_database_CursorWindow.cpp +++ b/core/jni/android_database_CursorWindow.cpp @@ -16,6 +16,7 @@ #undef LOG_TAG #define LOG_TAG "CursorWindow" +#define LOG_NDEBUG 0 #include <inttypes.h> #include <jni.h> @@ -30,6 +31,11 @@ #include <stdio.h> #include <string.h> #include <unistd.h> +#include <sys/types.h> +#include <dirent.h> + +#undef LOG_NDEBUG +#define LOG_NDEBUG 1 #include <androidfw/CursorWindow.h> #include "android_os_Parcel.h" @@ -61,6 +67,22 @@ static void throwUnknownTypeException(JNIEnv * env, jint type) { jniThrowException(env, "java/lang/IllegalStateException", msg.string()); } +static int getFdCount() { + char fdpath[PATH_MAX]; + int count = 0; + snprintf(fdpath, PATH_MAX, "/proc/%d/fd", getpid()); + DIR *dir = opendir(fdpath); + if (dir != NULL) { + struct dirent *dirent; + while ((dirent = readdir(dir))) { + count++; + } + count -= 2; // discount "." and ".." + closedir(dir); + } + return count; +} + static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint cursorWindowSize) { String8 name; const char* nameStr = env->GetStringUTFChars(nameObj, NULL); @@ -85,7 +107,8 @@ static jlong nativeCreateFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj CursorWindow* window; status_t status = CursorWindow::createFromParcel(parcel, &window); if (status || !window) { - ALOGE("Could not create CursorWindow from Parcel due to error %d.", status); + ALOGE("Could not create CursorWindow from Parcel due to error %d, process fd count=%d", + status, getFdCount()); return 0; } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 94592573e61a..b92627010059 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -350,9 +350,16 @@ void JNICameraContext::postDataTimestamp(nsecs_t timestamp, int32_t msgType, con postData(msgType, dataPtr, NULL); } -void JNICameraContext::postRecordingFrameHandleTimestamp(nsecs_t, native_handle_t*) { - // This is not needed at app layer. This should not be called because JNICameraContext cannot - // start video recording. +void JNICameraContext::postRecordingFrameHandleTimestamp(nsecs_t, native_handle_t* handle) { + // Video buffers are not needed at app layer so just return the video buffers here. + // This may be called when stagefright just releases camera but there are still outstanding + // video buffers. + if (mCamera != nullptr) { + mCamera->releaseRecordingFrameHandle(handle); + } else { + native_handle_close(handle); + native_handle_delete(handle); + } } void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_metadata_t *metadata) diff --git a/core/jni/android_hardware_location_ContextHubService.cpp b/core/jni/android_hardware_location_ContextHubService.cpp index 9515a0e336aa..8eb39e1aac58 100644 --- a/core/jni/android_hardware_location_ContextHubService.cpp +++ b/core/jni/android_hardware_location_ContextHubService.cpp @@ -26,6 +26,10 @@ #include <stdint.h> #include <stdio.h> #include <stdlib.h> + +// TOOD: On master, alphabetize these and move <mutex> into this +// grouping. +#include <chrono> #include <unordered_map> #include <queue> @@ -34,11 +38,12 @@ #include "JNIHelp.h" #include "core_jni_helpers.h" -static constexpr int OS_APP_ID = -1; +static constexpr jint OS_APP_ID = -1; +static constexpr jint INVALID_APP_ID = -2; static constexpr uint64_t ALL_APPS = UINT64_C(0xFFFFFFFFFFFFFFFF); -static constexpr int MIN_APP_ID = 1; -static constexpr int MAX_APP_ID = 128; +static constexpr jint MIN_APP_ID = 1; +static constexpr jint MAX_APP_ID = 128; static constexpr size_t MSG_HEADER_SIZE = 4; static constexpr size_t HEADER_FIELD_MSG_TYPE = 0; @@ -50,6 +55,10 @@ static constexpr size_t HEADER_FIELD_LOAD_APP_ID_LO = MSG_HEADER_SIZE; static constexpr size_t HEADER_FIELD_LOAD_APP_ID_HI = MSG_HEADER_SIZE + 1; static constexpr size_t MSG_HEADER_SIZE_LOAD_APP = MSG_HEADER_SIZE + 2; +// Monotonically increasing clock we use to determine if we can cancel +// a transaction. +using std::chrono::steady_clock; + namespace android { namespace { @@ -102,10 +111,21 @@ struct context_hub_info_s { struct app_instance_info_s { uint64_t truncName; // Possibly truncated name for logging uint32_t hubHandle; // Id of the hub this app is on - int instanceId; // system wide unique instance id - assigned + jint instanceId; // system wide unique instance id - assigned struct hub_app_info appInfo; // returned from the HAL }; + +// If a transaction takes longer than this, we'll allow it to be +// canceled by a new transaction. Note we do _not_ automatically +// cancel a transaction after this much time. We can have a +// legal transaction which takes longer than this amount of time, +// as long as no other new transactions are attempted after this +// time has expired. +// TODO(b/31105001): Establish a clean timing approach for all +// of our HAL interactions. +constexpr auto kMinTransactionCancelTime = std::chrono::seconds(29); + /* * TODO(ashutoshj): From original code review: * @@ -147,14 +167,15 @@ struct txnManager_s { std::mutex m; // mutex for manager hub_messages_e txnIdentifier; // What are we doing void *txnData; // Details + steady_clock::time_point firstTimeTxnCanBeCanceled; }; struct contextHubServiceDb_s { int initialized; context_hub_info_s hubInfo; jniInfo_s jniInfo; - std::queue<int> freeIds; - std::unordered_map<int, app_instance_info_s> appInstances; + std::queue<jint> freeIds; + std::unordered_map<jint, app_instance_info_s> appInstances; txnManager_s txnManager; }; @@ -176,25 +197,40 @@ static int addTxn(hub_messages_e txnIdentifier, void *txnData) { std::lock_guard<std::mutex>lock(mgr->m); mgr->txnPending = true; + mgr->firstTimeTxnCanBeCanceled = steady_clock::now() + + kMinTransactionCancelTime; mgr->txnData = txnData; mgr->txnIdentifier = txnIdentifier; return 0; } -static int closeTxn() { +// Only call this if you hold the db.txnManager.m lock. +static void closeTxnUnlocked() { txnManager_s *mgr = &db.txnManager; - std::lock_guard<std::mutex>lock(mgr->m); mgr->txnPending = false; free(mgr->txnData); mgr->txnData = nullptr; +} +static int closeTxn() { + std::lock_guard<std::mutex>lock(db.txnManager.m); + closeTxnUnlocked(); return 0; } +// If a transaction has been pending for longer than +// kMinTransactionCancelTime, this call will "cancel" that +// transaction and return that there are none pending. static bool isTxnPending() { txnManager_s *mgr = &db.txnManager; std::lock_guard<std::mutex>lock(mgr->m); + if (mgr->txnPending) { + if (steady_clock::now() >= mgr->firstTimeTxnCanBeCanceled) { + ALOGW("Transaction canceled"); + closeTxnUnlocked(); + } + } return mgr->txnPending; } @@ -259,16 +295,17 @@ static int get_hub_id_for_hub_handle(int hubHandle) { } } -static int get_hub_handle_for_app_instance(int id) { +static int get_hub_handle_for_app_instance(jint id) { if (!db.appInstances.count(id)) { - ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id); + ALOGD("%s: Cannot find app for app instance %" PRId32, + __FUNCTION__, id); return -1; } return db.appInstances[id].hubHandle; } -static int get_hub_id_for_app_instance(int id) { +static int get_hub_id_for_app_instance(jint id) { int hubHandle = get_hub_handle_for_app_instance(id); if (hubHandle < 0) { @@ -278,7 +315,7 @@ static int get_hub_id_for_app_instance(int id) { return db.hubInfo.hubs[hubHandle].hub_id; } -static int get_app_instance_for_app_id(uint64_t app_id) { +static jint get_app_instance_for_app_id(uint64_t app_id) { auto end = db.appInstances.end(); for (auto current = db.appInstances.begin(); current != end; ++current) { if (current->second.appInfo.app_name.id == app_id) { @@ -289,9 +326,10 @@ static int get_app_instance_for_app_id(uint64_t app_id) { return -1; } -static int set_dest_app(hub_message_t *msg, int id) { +static int set_dest_app(hub_message_t *msg, jint id) { if (!db.appInstances.count(id)) { - ALOGD("%s: Cannot find app for app instance %d", __FUNCTION__, id); + ALOGD("%s: Cannot find app for app instance %" PRId32, + __FUNCTION__, id); return -1; } @@ -299,11 +337,15 @@ static int set_dest_app(hub_message_t *msg, int id) { return 0; } -static void query_hub_for_apps(uint64_t appId, uint32_t hubHandle) { +static void query_hub_for_apps(uint32_t hubHandle) { hub_message_t msg; query_apps_request_t queryMsg; - queryMsg.app_name.id = NANOAPP_VENDOR_ALL_APPS; + // TODO(b/30835598): When we're able to tell which request our + // response matches, then we should allow this to be more + // targetted, instead of always being every app in the + // system. + queryMsg.app_name.id = ALL_APPS; msg.message_type = CONTEXT_HUB_QUERY_APPS; msg.message_len = sizeof(queryMsg); @@ -316,13 +358,13 @@ static void query_hub_for_apps(uint64_t appId, uint32_t hubHandle) { } } -static void sendQueryForApps(uint64_t appId) { +static void sendQueryForApps() { for (int i = 0; i < db.hubInfo.numHubs; i++ ) { - query_hub_for_apps(appId, i); + query_hub_for_apps(i); } } -static int return_id(int id) { +static int return_id(jint id) { // Note : This method is not thread safe. // id returned is guaranteed to be in use if (id >= 0) { @@ -333,9 +375,9 @@ static int return_id(int id) { return -1; } -static int generate_id() { +static jint generate_id() { // Note : This method is not thread safe. - int retVal = -1; + jint retVal = -1; if (!db.freeIds.empty()) { retVal = db.freeIds.front(); @@ -346,23 +388,14 @@ static int generate_id() { } -static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, - int appInstanceHandle, JNIEnv *env) { - - ALOGI("Loading App"); - +static jint add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, + jint appInstanceHandle, JNIEnv *env) { // Not checking if the apps are indeed distinct app_instance_info_s entry; assert(appInfo); - if (db.appInstances.count(appInstanceHandle) == 0) { - appInstanceHandle = generate_id(); - if (appInstanceHandle < 0) { - ALOGE("Cannot find resources to add app instance %d", - appInstanceHandle); - return -1; - } - } + const char *action = + (db.appInstances.count(appInstanceHandle) == 0) ? "Added" : "Updated"; entry.appInfo = *appInfo; @@ -372,42 +405,49 @@ static int add_app_instance(const hub_app_info *appInfo, uint32_t hubHandle, db.appInstances[appInstanceHandle] = entry; - // Finally - let the service know of this app instance + // Finally - let the service know of this app instance, to populate + // the Java cache. env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceAddAppInstance, hubHandle, entry.instanceId, entry.truncName, entry.appInfo.version); - ALOGW("Added App 0x%" PRIx64 " on hub Handle %" PRId32 - " as appInstance %d", entry.truncName, + ALOGI("%s App 0x%" PRIx64 " on hub Handle %" PRId32 + " as appInstance %" PRId32, action, entry.truncName, entry.hubHandle, appInstanceHandle); return appInstanceHandle; } -int delete_app_instance(int id, JNIEnv *env) { - if (!db.appInstances.count(id)) { - ALOGW("Cannot find App id : %d", id); - return -1; - } +int delete_app_instance(jint id, JNIEnv *env) { + bool fullyDeleted = true; + if (db.appInstances.count(id)) { + db.appInstances.erase(id); + } else { + ALOGW("Cannot delete App id (%" PRId32 ") from the JNI C++ cache", id); + fullyDeleted = false; + } return_id(id); - db.appInstances.erase(id); - if (env->CallIntMethod(db.jniInfo.jContextHubService, + + if ((env == nullptr) || + (env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceDeleteAppInstance, - id) != 0) { - ALOGW("Could not delete App id : %d", id); - return -1; + id) != 0)) { + ALOGW("Cannot delete App id (%" PRId32 ") from Java cache", id); + fullyDeleted = false; } - ALOGI("Deleted App id : %d", id); - - return 0; + if (fullyDeleted) { + ALOGI("Deleted App id : %" PRId32, id); + return 0; + } + return -1; } static int startLoadAppTxn(uint64_t appId, int hubHandle) { app_instance_info_s *txnInfo = (app_instance_info_s *)malloc(sizeof(app_instance_info_s)); - int instanceId = generate_id(); + jint instanceId = generate_id(); if (!txnInfo || instanceId < 0) { return_id(instanceId); @@ -432,8 +472,8 @@ static int startLoadAppTxn(uint64_t appId, int hubHandle) { return 0; } -static int startUnloadAppTxn(uint32_t appInstanceHandle) { - uint32_t *txnData = (uint32_t *) malloc(sizeof(uint32_t)); +static int startUnloadAppTxn(jint appInstanceHandle) { + jint *txnData = (jint *) malloc(sizeof(jint)); if (!txnData) { ALOGW("Cannot allocate memory to start unload transaction"); return -1; @@ -454,7 +494,6 @@ static void initContextHubService() { int err = 0; db.hubInfo.hubs = nullptr; db.hubInfo.numHubs = 0; - int i; err = hw_get_module(CONTEXT_HUB_MODULE_ID, (hw_module_t const**)(&db.hubInfo.contextHubModule)); @@ -465,7 +504,7 @@ static void initContextHubService() { } // Prep for storing app info - for(i = MIN_APP_ID; i <= MAX_APP_ID; i++) { + for (jint i = MIN_APP_ID; i <= MAX_APP_ID; i++) { db.freeIds.push(i); } @@ -485,7 +524,7 @@ static void initContextHubService() { return; } - for (i = 0; i < db.hubInfo.numHubs; i++) { + for (int i = 0; i < db.hubInfo.numHubs; i++) { db.hubInfo.cookies[i] = db.hubInfo.hubs[i].hub_id; ALOGI("Subscribing to hubHandle %d with OS App name %" PRIu64, i, db.hubInfo.hubs[i].os_app_name.id); if (db.hubInfo.contextHubModule->subscribe_messages(db.hubInfo.hubs[i].hub_id, @@ -495,7 +534,7 @@ static void initContextHubService() { } } - sendQueryForApps(ALL_APPS); + sendQueryForApps(); } else { ALOGW("No Context Hub Module present"); } @@ -539,21 +578,70 @@ int handle_query_apps_response(const uint8_t *msg, int msgLen, return -1; } - int numApps = msgLen/sizeof(hub_app_info); - hub_app_info info; + int numApps = msgLen / sizeof(hub_app_info); const hub_app_info *unalignedInfoAddr = (const hub_app_info*)msg; - for (int i = 0; i < numApps; i++, unalignedInfoAddr++) { - memcpy(&info, unalignedInfoAddr, sizeof(info)); + // We use this information to sync our JNI and Java caches of nanoapp info. + // We want to accomplish two things here: + // 1) Remove entries from our caches which are stale, and pertained to + // apps no longer running on Context Hub. + // 2) Populate our caches with the latest information of all these apps. + + // We make a couple of assumptions here: + // A) The JNI and Java caches are in sync with each other (this isn't + // necessarily true; any failure of a single call into Java land to + // update its cache will leave that cache in a bad state. For NYC, + // we're willing to tolerate this for now). + // B) The total number of apps is relatively small, so horribly inefficent + // algorithms aren't too painful. + // C) We're going to call this relatively infrequently, so its inefficency + // isn't a big impact. + + + // (1). Looking for stale cache entries. Yes, this is O(N^2). See + // assumption (B). Per assumption (A), it is sufficient to iterate + // over just the JNI cache. + auto end = db.appInstances.end(); + for (auto current = db.appInstances.begin(); current != end; ) { + app_instance_info_s cache_entry = current->second; + // We perform our iteration here because if we call + // delete_app_instance() below, it will erase() this entry. + current++; + bool entryIsStale = true; + for (int i = 0; i < numApps; i++) { + // We use memcmp since this could be unaligned. + if (memcmp(&unalignedInfoAddr[i].app_name.id, + &cache_entry.appInfo.app_name.id, + sizeof(cache_entry.appInfo.app_name.id)) == 0) { + // We found a match; this entry is current. + entryIsStale = false; + break; + } + } + if (entryIsStale) { + delete_app_instance(cache_entry.instanceId, env); + } + } + + // (2). Update our caches with the latest. + for (int i = 0; i < numApps; i++) { + hub_app_info query_info; + memcpy(&query_info, &unalignedInfoAddr[i], sizeof(query_info)); // We will only have one instance of the app // TODO : Change this logic once we support multiple instances of the same app - int appInstance = get_app_instance_for_app_id(info.app_name.id); - add_app_instance(&info, hubHandle, appInstance, env); + jint appInstance = get_app_instance_for_app_id(query_info.app_name.id); + if (appInstance == -1) { + // This is a previously unknown app, let's allocate an "id" for it. + appInstance = generate_id(); + } + add_app_instance(&query_info, hubHandle, appInstance, env); } return 0; } +// TODO(b/30807327): Do not use raw bytes for additional data. Use the +// JNI interfaces for the appropriate types. static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, status_response_t *rsp, int8_t *additionalData, size_t additionalDataLen) { @@ -584,7 +672,32 @@ static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, header[HEADER_FIELD_HUB_HANDLE] = hubHandle; header[HEADER_FIELD_APP_INSTANCE] = OS_APP_ID; - msg[0] = rsp->result; + // Due to API constraints, at the moment we can't change the fact that + // we're changing our 4-byte response to a 1-byte value. But we can prevent + // the possible change in sign (and thus meaning) that would happen from + // a naive cast. Further, we can log when we're losing part of the value. + // TODO(b/30918279): Don't truncate this result. + int8_t truncatedResult; + bool neededToTruncate; + if (rsp->result < INT8_MIN) { + neededToTruncate = true; + truncatedResult = INT8_MIN; + } else if (rsp->result > INT8_MAX) { + neededToTruncate = true; + truncatedResult = INT8_MAX; + } else { + neededToTruncate = false; + // Since this value fits within an int8_t, this is a safe cast which + // won't change the value or sign. + truncatedResult = static_cast<int8_t>(rsp->result); + } + if (neededToTruncate) { + ALOGW("Response from Context Hub truncated. Value was %" PRId32 + ", but giving Java layer %" PRId8, + rsp->result, (int)truncatedResult); + } + + msg[0] = truncatedResult; if (additionalData) { memcpy(&msg[1], additionalData, additionalDataLen); @@ -603,6 +716,8 @@ static void passOnOsResponse(uint32_t hubHandle, uint32_t msgType, env->CallIntMethod(db.jniInfo.jContextHubService, db.jniInfo.contextHubServiceMsgReceiptCallback, jheader, jmsg); + env->DeleteLocalRef(jmsg); + env->DeleteLocalRef(jheader); delete[] msg; } @@ -613,7 +728,13 @@ void closeUnloadTxn(bool success) { if (success && fetchTxnData(&txnId, &txnData) == 0 && txnId == CONTEXT_HUB_UNLOAD_APP) { - db.appInstances.erase(*(uint32_t *)txnData); + JNIEnv *env; + if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) { + ALOGW("Could not attach to JVM !"); + env = nullptr; + } + jint handle = *reinterpret_cast<jint *>(txnData); + delete_app_instance(handle, env); } else { ALOGW("Could not unload the app successfully ! success %d, txnData %p", success, txnData); } @@ -621,7 +742,7 @@ void closeUnloadTxn(bool success) { closeTxn(); } -void closeLoadTxn(bool success, int *appInstanceHandle) { +static bool closeLoadTxn(bool success, jint *appInstanceHandle) { void *txnData; hub_messages_e txnId; @@ -635,13 +756,22 @@ void closeLoadTxn(bool success, int *appInstanceHandle) { add_app_instance(&info->appInfo, info->hubHandle, info->instanceId, env); } else { ALOGW("Could not attach to JVM !"); + success = false; } - sendQueryForApps(info->appInfo.app_name.id); + // While we just called add_app_instance above, our info->appInfo was + // incomplete (for example, the 'version' is hardcoded to -1). So we + // trigger an additional query to the CHRE, so we'll be able to get + // all the app "info", and have our JNI and Java caches with the + // full information. + sendQueryForApps(); } else { ALOGW("Could not load the app successfully ! Unexpected failure"); + *appInstanceHandle = INVALID_APP_ID; + success = false; } closeTxn(); + return success; } static bool isValidOsStatus(const uint8_t *msg, size_t msgLen, @@ -663,23 +793,6 @@ static bool isValidOsStatus(const uint8_t *msg, size_t msgLen, return true; } -static void invalidateNanoApps(uint32_t hubHandle) { - JNIEnv *env; - - if ((db.jniInfo.vm)->AttachCurrentThread(&env, nullptr) != JNI_OK) { - ALOGW("Could not attach to JVM !"); - } - - auto end = db.appInstances.end(); - for (auto current = db.appInstances.begin(); current != end; ) { - app_instance_info_s info = current->second; - current++; - if (info.hubHandle == hubHandle) { - delete_app_instance(info.instanceId, env); - } - } -} - static int handle_os_message(uint32_t msgType, uint32_t hubHandle, const uint8_t *msg, int msgLen) { int retVal = -1; @@ -697,8 +810,27 @@ static int handle_os_message(uint32_t msgType, uint32_t hubHandle, case CONTEXT_HUB_UNLOAD_APP: if (isValidOsStatus(msg, msgLen, &rsp)) { if (msgType == CONTEXT_HUB_LOAD_APP) { - int appInstanceHandle; - closeLoadTxn(rsp.result == 0, &appInstanceHandle); + jint appInstanceHandle = INVALID_APP_ID; + bool appRunningOnHub = (rsp.result == 0); + if (!(closeLoadTxn(appRunningOnHub, &appInstanceHandle))) { + if (appRunningOnHub) { + // Now we're in an odd situation. Our nanoapp + // is up and running on the Context Hub. However, + // something went wrong in our Service code so that + // we're not able to properly track this nanoapp + // in our Service code. If we tell the Java layer + // things are good, it's a lie because the handle + // we give them will fail when used with the Service. + // If we tell the Java layer this failed, it's kind + // of a lie as well, since this nanoapp is running. + // + // We leave a more robust fix for later, and for + // now just tell the user things have failed. + // + // TODO(b/30835981): Make this situation better. + rsp.result = -1; + } + } passOnOsResponse(hubHandle, msgType, &rsp, (int8_t *)(&appInstanceHandle), sizeof(appInstanceHandle)); } else if (msgType == CONTEXT_HUB_UNLOAD_APP) { @@ -728,8 +860,7 @@ static int handle_os_message(uint32_t msgType, uint32_t hubHandle, ALOGW("Context Hub handle %d restarted", hubHandle); closeTxn(); passOnOsResponse(hubHandle, msgType, &rsp, nullptr, 0); - invalidateNanoApps(hubHandle); - query_hub_for_apps(ALL_APPS, hubHandle); + query_hub_for_apps(hubHandle); retVal = 0; } break; @@ -778,7 +909,7 @@ int context_hub_callback(uint32_t hubId, if (messageType < CONTEXT_HUB_TYPE_PRIVATE_MSG_BASE) { handle_os_message(messageType, hubHandle, (uint8_t*) msg->message, msg->message_len); } else { - int appHandle = get_app_instance_for_app_id(msg->app_name.id); + jint appHandle = get_app_instance_for_app_id(msg->app_name.id); if (appHandle < 0) { ALOGE("Filtering out message due to invalid App Instance."); } else { @@ -1051,7 +1182,8 @@ static jint nativeSendMessage(JNIEnv *env, jobject instance, jintArray header_, ALOGD("Asking HAL to remove app"); retVal = db.hubInfo.contextHubModule->send_message(hubId, &msg); } else { - ALOGD("Could not find app instance %d on hubHandle %d, setAddress %d", + ALOGD("Could not find app instance %" PRId32 " on hubHandle %" PRId32 + ", setAddress %d", header[HEADER_FIELD_APP_INSTANCE], header[HEADER_FIELD_HUB_HANDLE], (int)setAddressSuccess); @@ -1060,7 +1192,8 @@ static jint nativeSendMessage(JNIEnv *env, jobject instance, jintArray header_, if (retVal != 0) { ALOGD("Send Message failure - %d", retVal); if (msgType == CONTEXT_HUB_LOAD_APP) { - closeLoadTxn(false, nullptr); + jint ignored; + closeLoadTxn(false, &ignored); } else if (msgType == CONTEXT_HUB_UNLOAD_APP) { closeUnloadTxn(false); } diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp index b0028e1b6f5b..1bad5f8ce456 100644 --- a/core/jni/android_view_RenderNode.cpp +++ b/core/jni/android_view_RenderNode.cpp @@ -721,9 +721,9 @@ static const JNINativeMethod gMethods[] = { int register_android_view_RenderNode(JNIEnv* env) { jclass clazz = FindClassOrDie(env, "android/view/SurfaceView"); gSurfaceViewPositionUpdateMethod = GetMethodIDOrDie(env, clazz, - "updateWindowPositionRT", "(JIIII)V"); + "updateWindowPosition_renderWorker", "(JIIII)V"); gSurfaceViewPositionLostMethod = GetMethodIDOrDie(env, clazz, - "windowPositionLostRT", "(J)V"); + "windowPositionLost_uiRtSync", "(J)V"); clazz = FindClassOrDie(env, "android/view/RenderNode"); gOnRenderNodeDetached = GetMethodIDOrDie(env, clazz, "onRenderNodeDetached", "()V"); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 0d8a95c9bcd3..73b3f52f078b 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -371,7 +371,12 @@ static void nativeSetDisplaySurface(JNIEnv* env, jclass clazz, if (sur != NULL) { bufferProducer = sur->getIGraphicBufferProducer(); } - SurfaceComposerClient::setDisplaySurface(token, bufferProducer); + status_t err = SurfaceComposerClient::setDisplaySurface(token, + bufferProducer); + if (err != NO_ERROR) { + doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this" + " Surface created with singleBufferMode?"); + } } static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz, diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h index db56c320e4f2..c67662bd8a88 100644 --- a/core/jni/fd_utils-inl.h +++ b/core/jni/fd_utils-inl.h @@ -50,7 +50,6 @@ static const char* kPathWhitelist[] = { "/dev/null", "/dev/socket/zygote", "/dev/socket/zygote_secondary", - "/system/etc/event-log-tags", "/sys/kernel/debug/tracing/trace_marker", "/system/framework/framework-res.apk", "/dev/urandom", diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ed71fc2f4a8e..6c6fd9005083 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -183,6 +183,7 @@ <protected-broadcast android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" /> <protected-broadcast android:name="android.bluetooth.pbap.intent.action.PBAP_STATE_CHANGED" /> + <protected-broadcast android:name="android.bluetooth.sap.profile.action.CONNECTION_STATE_CHANGED" /> <protected-broadcast android:name="android.btopp.intent.action.INCOMING_FILE_NOTIFICATION" /> <protected-broadcast android:name="android.btopp.intent.action.USER_CONFIRMATION_TIMEOUT" /> <protected-broadcast android:name="android.btopp.intent.action.LIST" /> @@ -199,6 +200,8 @@ <protected-broadcast android:name="com.android.bluetooth.pbap.userconfirmtimeout" /> <protected-broadcast android:name="com.android.bluetooth.pbap.authresponse" /> <protected-broadcast android:name="com.android.bluetooth.pbap.authcancelled" /> + <protected-broadcast android:name="com.android.bluetooth.sap.USER_CONFIRM_TIMEOUT" /> + <protected-broadcast android:name="com.android.bluetooth.sap.action.DISCONNECT_ACTION" /> <protected-broadcast android:name="android.hardware.display.action.WIFI_DISPLAY_STATUS_CHANGED" /> @@ -394,6 +397,8 @@ <protected-broadcast android:name="android.bluetooth.adapter.action.BLE_STATE_CHANGED" /> <protected-broadcast android:name="com.android.bluetooth.map.USER_CONFIRM_TIMEOUT" /> + <protected-broadcast android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_SENT" /> + <protected-broadcast android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" /> <protected-broadcast android:name="android.content.jobscheduler.JOB_DELAY_EXPIRED" /> <protected-broadcast android:name="android.content.syncmanager.SYNC_ALARM" /> <protected-broadcast android:name="android.media.INTERNAL_RINGER_MODE_CHANGED_ACTION" /> @@ -1308,6 +1313,7 @@ android:protectionLevel="dangerous" android:description="@string/permdesc_getAccounts" android:label="@string/permlab_getAccounts" /> + <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <!-- @SystemApi Allows applications to call into AccountAuthenticators. <p>Not for use by third-party applications. --> @@ -1628,7 +1634,7 @@ <!-- @hide Allows an application to create, remove users and get the list of users on the device. Applications holding this permission can only create restricted, - guest, managed, and ephemeral users. For creating other kind of users, + guest, managed, demo, and ephemeral users. For creating other kind of users, {@link android.Manifest.permission#MANAGE_USERS} is needed. This permission is not available to third party applications. --> <permission android:name="android.permission.CREATE_USERS" diff --git a/core/res/res/anim/dock_bottom_exit_keyguard.xml b/core/res/res/anim/dock_bottom_exit_keyguard.xml new file mode 100644 index 000000000000..4de3ce5b8932 --- /dev/null +++ b/core/res/res/anim/dock_bottom_exit_keyguard.xml @@ -0,0 +1,22 @@ +<!-- + ~ Copyright (C) 2016 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 + --> + +<!-- Animation for when a dock window at the bottom of the screen is exiting while on Keyguard --> +<set xmlns:android="http://schemas.android.com/apk/res/android" + android:interpolator="@android:interpolator/fast_out_linear_in"> + <translate android:fromYDelta="0" android:toYDelta="100%" + android:duration="200"/> +</set>
\ No newline at end of file diff --git a/core/res/res/color/hint_foreground_material_dark.xml b/core/res/res/color/hint_foreground_material_dark.xml index 77883d975c75..5cc955952524 100644 --- a/core/res/res/color/hint_foreground_material_dark.xml +++ b/core/res/res/color/hint_foreground_material_dark.xml @@ -15,6 +15,10 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:state_pressed="true" + android:alpha="@dimen/hint_pressed_alpha_material_dark" + android:color="@color/foreground_material_dark" /> <item android:alpha="@dimen/hint_alpha_material_dark" android:color="@color/foreground_material_dark" /> </selector> diff --git a/core/res/res/color/hint_foreground_material_light.xml b/core/res/res/color/hint_foreground_material_light.xml index 99168fdc2962..f7465e0e5139 100644 --- a/core/res/res/color/hint_foreground_material_light.xml +++ b/core/res/res/color/hint_foreground_material_light.xml @@ -15,6 +15,10 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_enabled="true" + android:state_pressed="true" + android:alpha="@dimen/hint_pressed_alpha_material_light" + android:color="@color/foreground_material_light" /> <item android:alpha="@dimen/hint_alpha_material_light" android:color="@color/foreground_material_light" /> </selector> diff --git a/core/res/res/drawable-hdpi/vpn_connected.png b/core/res/res/drawable-hdpi/vpn_connected.png Binary files differindex c3547e855744..e05e76ffc275 100644 --- a/core/res/res/drawable-hdpi/vpn_connected.png +++ b/core/res/res/drawable-hdpi/vpn_connected.png diff --git a/core/res/res/drawable-hdpi/vpn_disconnected.png b/core/res/res/drawable-hdpi/vpn_disconnected.png Binary files differindex 10a9065cabdd..3508984b2099 100644 --- a/core/res/res/drawable-hdpi/vpn_disconnected.png +++ b/core/res/res/drawable-hdpi/vpn_disconnected.png diff --git a/core/res/res/drawable-mdpi/vpn_connected.png b/core/res/res/drawable-mdpi/vpn_connected.png Binary files differindex 7e167f84dfa4..f7ac2a184834 100644 --- a/core/res/res/drawable-mdpi/vpn_connected.png +++ b/core/res/res/drawable-mdpi/vpn_connected.png diff --git a/core/res/res/drawable-mdpi/vpn_disconnected.png b/core/res/res/drawable-mdpi/vpn_disconnected.png Binary files differindex a08c42a2702a..9db4199d0262 100644 --- a/core/res/res/drawable-mdpi/vpn_disconnected.png +++ b/core/res/res/drawable-mdpi/vpn_disconnected.png diff --git a/core/res/res/drawable-nodpi/vpn_connected.xml b/core/res/res/drawable-nodpi/vpn_connected.xml new file mode 100644 index 000000000000..22a4a6cb4c6b --- /dev/null +++ b/core/res/res/drawable-nodpi/vpn_connected.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2016 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48.0" + android:viewportHeight="48.0"> + <path + android:fillColor="#FF000000" + android:pathData="M25.3,20c-1.65,-4.66 -6.08,-8 -11.3,-8 -6.63,0 -12,5.37 -12,12s5.37,12 12,12c5.22,0 9.65,-3.34 11.3,-8H34v8h8v-8h4v-8H25.3zM14,28c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z"/> +</vector> diff --git a/core/res/res/drawable-nodpi/vpn_disconnected.xml b/core/res/res/drawable-nodpi/vpn_disconnected.xml new file mode 100644 index 000000000000..22a4a6cb4c6b --- /dev/null +++ b/core/res/res/drawable-nodpi/vpn_disconnected.xml @@ -0,0 +1,24 @@ +<!-- +Copyright (C) 2016 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="48dp" + android:height="48dp" + android:viewportWidth="48.0" + android:viewportHeight="48.0"> + <path + android:fillColor="#FF000000" + android:pathData="M25.3,20c-1.65,-4.66 -6.08,-8 -11.3,-8 -6.63,0 -12,5.37 -12,12s5.37,12 12,12c5.22,0 9.65,-3.34 11.3,-8H34v8h8v-8h4v-8H25.3zM14,28c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4 4,1.79 4,4 -1.79,4 -4,4z"/> +</vector> diff --git a/core/res/res/drawable-xhdpi/vpn_connected.png b/core/res/res/drawable-xhdpi/vpn_connected.png Binary files differindex 1f46be2cea5d..a8761c90af2d 100644 --- a/core/res/res/drawable-xhdpi/vpn_connected.png +++ b/core/res/res/drawable-xhdpi/vpn_connected.png diff --git a/core/res/res/drawable-xhdpi/vpn_disconnected.png b/core/res/res/drawable-xhdpi/vpn_disconnected.png Binary files differindex 847d3f52701f..7118918ec6d5 100644 --- a/core/res/res/drawable-xhdpi/vpn_disconnected.png +++ b/core/res/res/drawable-xhdpi/vpn_disconnected.png diff --git a/core/res/res/drawable-xxhdpi/vpn_connected.png b/core/res/res/drawable-xxhdpi/vpn_connected.png Binary files differindex ea4930c4f420..16b1e4e2467b 100644 --- a/core/res/res/drawable-xxhdpi/vpn_connected.png +++ b/core/res/res/drawable-xxhdpi/vpn_connected.png diff --git a/core/res/res/drawable-xxhdpi/vpn_disconnected.png b/core/res/res/drawable-xxhdpi/vpn_disconnected.png Binary files differindex 4cd0dd4a0226..a0258186067c 100644 --- a/core/res/res/drawable-xxhdpi/vpn_disconnected.png +++ b/core/res/res/drawable-xxhdpi/vpn_disconnected.png diff --git a/core/res/res/drawable/ic_check_circle_24px.xml b/core/res/res/drawable/ic_check_circle_24px.xml index 066a8a73644b..e9af9e49a5dd 100644 --- a/core/res/res/drawable/ic_check_circle_24px.xml +++ b/core/res/res/drawable/ic_check_circle_24px.xml @@ -19,9 +19,6 @@ Copyright (C) 2015 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> - <path android:fillColor="#FF000000" android:pathData="M12.0,2.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0zm-2.0,15.0l-5.0,-5.0 1.41,-1.41L10.0,14.17l7.59,-7.59L19.0,8.0l-9.0,9.0z"/> </vector> diff --git a/core/res/res/drawable/ic_collapse_notification.xml b/core/res/res/drawable/ic_collapse_notification.xml index 603c159c0abc..124e99e3a4bb 100644 --- a/core/res/res/drawable/ic_collapse_notification.xml +++ b/core/res/res/drawable/ic_collapse_notification.xml @@ -22,7 +22,4 @@ Copyright (C) 2015 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M12.0,8.0l-6.0,6.0l1.4,1.4l4.6,-4.6l4.6,4.6L18.0,14.0L12.0,8.0z"/> - <path - android:pathData="M0,0h24v24H0V0z" - android:fillColor="#00000000"/> </vector> diff --git a/core/res/res/drawable/ic_expand_more_48dp.xml b/core/res/res/drawable/ic_expand_more_48dp.xml index 11323e3b0f7c..5a71669428b5 100644 --- a/core/res/res/drawable/ic_expand_more_48dp.xml +++ b/core/res/res/drawable/ic_expand_more_48dp.xml @@ -21,7 +21,4 @@ Copyright (C) 2015 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M33.17,17.17L24.0,26.34l-9.17,-9.17L12.0,20.0l12.0,12.0 12.0,-12.0z"/> - <path - android:pathData="M0 0h48v48H0z" - android:fillColor="#00000000"/> </vector> diff --git a/core/res/res/drawable/ic_expand_notification.xml b/core/res/res/drawable/ic_expand_notification.xml index db7d3ebbbc21..847e3269398d 100644 --- a/core/res/res/drawable/ic_expand_notification.xml +++ b/core/res/res/drawable/ic_expand_notification.xml @@ -22,7 +22,4 @@ Copyright (C) 2015 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M16.6,8.6L12.0,13.2L7.4,8.6L6.0,10.0l6.0,6.0l6.0,-6.0L16.6,8.6z"/> - <path - android:pathData="M0,0h24v24H0V0z" - android:fillColor="#00000000"/> </vector> diff --git a/core/res/res/drawable/ic_feedback.xml b/core/res/res/drawable/ic_feedback.xml index b2d1cb80c9c1..365863da31e2 100644 --- a/core/res/res/drawable/ic_feedback.xml +++ b/core/res/res/drawable/ic_feedback.xml @@ -19,9 +19,6 @@ Copyright (C) 2016 The Android Open Source Project android:viewportWidth="24.0" android:viewportHeight="24.0"> <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> - <path android:fillColor="#FF000000" android:pathData="M20.0,2.0L4.0,2.0c-1.1,0.0 -1.9,0.9 -1.99,2.0L2.0,22.0l4.0,-4.0l14.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L22.0,4.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0zm-7.0,12.0l-2.0,0.0l0.0,-2.0l2.0,0.0l0.0,2.0zm0.0,-4.0l-2.0,0.0L11.0,6.0l2.0,0.0l0.0,4.0z"/> </vector> diff --git a/core/res/res/drawable/ic_more_items.xml b/core/res/res/drawable/ic_more_items.xml index 5fdcdcef7317..0ec754c5c7c9 100644 --- a/core/res/res/drawable/ic_more_items.xml +++ b/core/res/res/drawable/ic_more_items.xml @@ -24,6 +24,5 @@ android:fillColor="#000000" android:pathData="M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z" /> - <path - android:pathData="M0 0h24v24H0z" /> + </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/ic_refresh.xml b/core/res/res/drawable/ic_refresh.xml index 1f671684861f..1297407fbb8b 100644 --- a/core/res/res/drawable/ic_refresh.xml +++ b/core/res/res/drawable/ic_refresh.xml @@ -21,7 +21,4 @@ Copyright (C) 2016 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M17.65,6.35C16.2,4.9 14.21,4.0 12.0,4.0c-4.42,0.0 -7.99,3.58 -7.99,8.0s3.57,8.0 7.99,8.0c3.73,0.0 6.84,-2.55 7.73,-6.0l-2.08,0.0c-0.82,2.33 -3.04,4.0 -5.65,4.0 -3.31,0.0 -6.0,-2.69 -6.0,-6.0s2.69,-6.0 6.0,-6.0c1.66,0.0 3.1,0.69 4.22,1.78L13.0,11.0l7.0,0.0L20.0,4.0l-2.35,2.35z"/> - <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> </vector> diff --git a/core/res/res/drawable/ic_schedule.xml b/core/res/res/drawable/ic_schedule.xml index 899dc821844e..55d54b139ae0 100644 --- a/core/res/res/drawable/ic_schedule.xml +++ b/core/res/res/drawable/ic_schedule.xml @@ -22,9 +22,6 @@ Copyright (C) 2016 The Android Open Source Project android:fillColor="#FF000000" android:pathData="M11.99,2.0C6.47,2.0 2.0,6.48 2.0,12.0s4.47,10.0 9.99,10.0C17.52,22.0 22.0,17.52 22.0,12.0S17.52,2.0 11.99,2.0zM12.0,20.0c-4.42,0.0 -8.0,-3.58 -8.0,-8.0s3.58,-8.0 8.0,-8.0 8.0,3.58 8.0,8.0 -3.58,8.0 -8.0,8.0z"/> <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> - <path android:fillColor="#FF000000" android:pathData="M12.5,7.0L11.0,7.0l0.0,6.0l5.25,3.1 0.75,-1.23 -4.5,-2.67z"/> </vector> diff --git a/core/res/res/drawable/perm_group_calendar.xml b/core/res/res/drawable/perm_group_calendar.xml index 4dc7b37dbf25..85a783e49497 100644 --- a/core/res/res/drawable/perm_group_calendar.xml +++ b/core/res/res/drawable/perm_group_calendar.xml @@ -24,6 +24,5 @@ android:fillColor="#000000" android:pathData="M17 12h-5v5h5v-5zM16 1v2H8V1H6v2H5c-1.11 0-1.99 .9 -1.99 2L3 19c0 1.1 .89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-1V1h-2zm3 18H5V8h14v11z" /> - <path - android:pathData="M0 0h24v24H0z" /> + </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/perm_group_camera.xml b/core/res/res/drawable/perm_group_camera.xml index 741a40e2891d..61903a55361f 100644 --- a/core/res/res/drawable/perm_group_camera.xml +++ b/core/res/res/drawable/perm_group_camera.xml @@ -28,6 +28,4 @@ android:pathData="M9 2L7.17 4H4c-1.1 0-2 .9-2 2v12c0 1.1 .9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2h-3.17L15 2H9zm3 15c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/perm_group_contacts.xml b/core/res/res/drawable/perm_group_contacts.xml index d698fd1735de..8f9dc3e0d178 100644 --- a/core/res/res/drawable/perm_group_contacts.xml +++ b/core/res/res/drawable/perm_group_contacts.xml @@ -21,8 +21,6 @@ android:viewportHeight="24"> <path - android:pathData="M0 0h24v24H0zm0 0h24v24H0zm0 0h24v24H0z" /> - <path android:fillColor="#000000" android:pathData="M20 0H4v2h16V0zM4 24h16v-2H4v2zM20 4H4c-1.1 0-2 .9-2 2v12c0 1.1 .9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm-8 2.75c1.24 0 2.25 1.01 2.25 2.25s-1.01 2.25-2.25 diff --git a/core/res/res/drawable/perm_group_location.xml b/core/res/res/drawable/perm_group_location.xml index fbc6066b218e..cc1ec90eca4c 100644 --- a/core/res/res/drawable/perm_group_location.xml +++ b/core/res/res/drawable/perm_group_location.xml @@ -24,6 +24,4 @@ android:fillColor="#000000" android:pathData="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/perm_group_microphone.xml b/core/res/res/drawable/perm_group_microphone.xml index c565d203caa4..d494e67c63ad 100644 --- a/core/res/res/drawable/perm_group_microphone.xml +++ b/core/res/res/drawable/perm_group_microphone.xml @@ -25,6 +25,4 @@ android:pathData="M12 14c1.66 0 2.99-1.34 2.99-3L15 5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.3-3c0 3-2.54 5.1-5.3 5.1S6.7 14 6.7 11H5c0 3.41 2.72 6.23 6 6.72V21h2v-3.28c3.28-.48 6-3.3 6-6.72h-1.7z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/perm_group_phone_calls.xml b/core/res/res/drawable/perm_group_phone_calls.xml index a64789433608..324d86492703 100644 --- a/core/res/res/drawable/perm_group_phone_calls.xml +++ b/core/res/res/drawable/perm_group_phone_calls.xml @@ -19,9 +19,6 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - <path - android:pathData="M0 0h24v24H0z" /> <path android:fillColor="#000000" android:pathData="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27 .67 -.36 1.02-.24 1.12 diff --git a/core/res/res/drawable/perm_group_sms.xml b/core/res/res/drawable/perm_group_sms.xml index 9b32c60150aa..47bca19edcc5 100644 --- a/core/res/res/drawable/perm_group_sms.xml +++ b/core/res/res/drawable/perm_group_sms.xml @@ -24,6 +24,4 @@ android:fillColor="#000000" android:pathData="M20 2H4c-1.1 0-1.99 .9 -1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM9 11H7V9h2v2zm4 0h-2V9h2v2zm4 0h-2V9h2v2z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml index 477270d202e6..1ff169350d40 100644 --- a/core/res/res/drawable/perm_group_storage.xml +++ b/core/res/res/drawable/perm_group_storage.xml @@ -24,6 +24,4 @@ android:fillColor="#000000" android:pathData="M10 4H4c-1.1 0-1.99 .9 -1.99 2L2 18c0 1.1 .9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector>
\ No newline at end of file diff --git a/core/res/res/drawable/progress_indeterminate_anim_large_material.xml b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml new file mode 100644 index 000000000000..560ec5af508f --- /dev/null +++ b/core/res/res/drawable/progress_indeterminate_anim_large_material.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + 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. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/vector_drawable_progress_bar_large" > + <target + android:name="progressBar" + android:animation="@anim/progress_indeterminate_material" /> + + <target + android:name="root" + android:animation="@anim/progress_indeterminate_rotation_material" /> +</animated-vector> + diff --git a/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml new file mode 100644 index 000000000000..fbea22f443e1 --- /dev/null +++ b/core/res/res/drawable/progress_indeterminate_anim_medium_material.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + 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. +--> +<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" + android:drawable="@drawable/vector_drawable_progress_bar_medium" > + + <target + android:name="progressBar" + android:animation="@anim/progress_indeterminate_material" /> + + <target + android:name="root" + android:animation="@anim/progress_indeterminate_rotation_material" /> + +</animated-vector>
\ No newline at end of file diff --git a/core/res/res/drawable/progress_large_material.xml b/core/res/res/drawable/progress_large_material.xml index 526f9141d716..ee82e35d00f5 100644 --- a/core/res/res/drawable/progress_large_material.xml +++ b/core/res/res/drawable/progress_large_material.xml @@ -13,16 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> - -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/vector_drawable_progress_bar_large" > - - <target - android:name="progressBar" - android:animation="@anim/progress_indeterminate_material" /> - - <target - android:name="root" - android:animation="@anim/progress_indeterminate_rotation_material" /> - -</animated-vector> +<com.android.internal.graphics.drawable.AnimationScaleListDrawable + xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/progress_static_material" /> + <item android:drawable="@drawable/progress_indeterminate_anim_large_material" /> +</com.android.internal.graphics.drawable.AnimationScaleListDrawable> diff --git a/core/res/res/drawable/progress_medium_material.xml b/core/res/res/drawable/progress_medium_material.xml index cc35816c9c3c..5c9260069e5d 100644 --- a/core/res/res/drawable/progress_medium_material.xml +++ b/core/res/res/drawable/progress_medium_material.xml @@ -13,15 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/vector_drawable_progress_bar_medium" > - - <target - android:name="progressBar" - android:animation="@anim/progress_indeterminate_material" /> - - <target - android:name="root" - android:animation="@anim/progress_indeterminate_rotation_material" /> - -</animated-vector>
\ No newline at end of file +<com.android.internal.graphics.drawable.AnimationScaleListDrawable + xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/progress_static_material" /> + <item android:drawable="@drawable/progress_indeterminate_anim_medium_material" /> +</com.android.internal.graphics.drawable.AnimationScaleListDrawable> diff --git a/core/res/res/drawable/progress_small_material.xml b/core/res/res/drawable/progress_small_material.xml index c6e43801cdf7..cec9d9565183 100644 --- a/core/res/res/drawable/progress_small_material.xml +++ b/core/res/res/drawable/progress_small_material.xml @@ -13,16 +13,17 @@ See the License for the specific language governing permissions and limitations under the License. --> - -<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" - android:drawable="@drawable/vector_drawable_progress_bar_small" > - - <target - android:name="progressBar" - android:animation="@anim/progress_indeterminate_material" /> - - <target - android:name="root" - android:animation="@anim/progress_indeterminate_rotation_material" /> - -</animated-vector> +<com.android.internal.graphics.drawable.AnimationScaleListDrawable + xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/progress_static_material" /> + <item> + <animated-vector android:drawable="@drawable/vector_drawable_progress_bar_small" > + <target + android:name="progressBar" + android:animation="@anim/progress_indeterminate_material" /> + <target + android:name="root" + android:animation="@anim/progress_indeterminate_rotation_material" /> + </animated-vector> + </item> +</com.android.internal.graphics.drawable.AnimationScaleListDrawable> diff --git a/core/res/res/drawable/progress_static_material.xml b/core/res/res/drawable/progress_static_material.xml new file mode 100644 index 000000000000..b078fa93a155 --- /dev/null +++ b/core/res/res/drawable/progress_static_material.xml @@ -0,0 +1,25 @@ +<!-- +Copyright (C) 2016 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0" + > + <path + android:fillColor="?attr/colorControlActivated" + android:pathData="M17.65,6.35C16.2,4.9 14.21,4.0 12.0,4.0c-4.42,0.0 -7.99,3.58 -7.99,8.0s3.57,8.0 7.99,8.0c3.73,0.0 6.84,-2.55 7.73,-6.0l-2.08,0.0c-0.82,2.33 -3.04,4.0 -5.65,4.0 -3.31,0.0 -6.0,-2.69 -6.0,-6.0s2.69,-6.0 6.0,-6.0c1.66,0.0 3.1,0.69 4.22,1.78L13.0,11.0l7.0,0.0L20.0,4.0l-2.35,2.35z"/> +</vector> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index bd92ab6fee3f..aa3396a56b40 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi het geen internettoegang nie"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik vir opsies"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Het oorgeskakel na <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Toestel gebruik <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wanneer <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> geen internetverbinding het nie. Heffings kan geld."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Het oorgeskakel van <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"sellulêre data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"\'n onbekende netwerktipe"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kon nie aan Wi-Fikoppel nie"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" het \'n swak internetverbinding."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Laat verbinding toe?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om taal en uitleg te kies"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidate"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Berei tans <xliff:g id="NAME">%s</xliff:g> voor"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kyk tans vir foute"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuwe <xliff:g id="NAME">%s</xliff:g> bespeur"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Gekoppel aan <xliff:g id="SESSION">%s</xliff:g>. Tik om die netwerk te bestuur."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Altydaan-VPN koppel tans..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Altydaan-VPN gekoppel"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Altydaan-VPN is ontkoppel"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Altydaan-VPN-fout"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tik om op te stel"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tik om op te stel"</string> <string name="upload_file" msgid="2897957172366730416">"Kies lêer"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Geen lêer gekies nie"</string> <string name="reset" msgid="2448168080964209908">"Stel terug"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Voer taalnaam in"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Voorgestel"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle tale"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Soek"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Werkmodus is AF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Stel werkprofiel in staat om te werk, insluitend programme, agtergrondsinkronisering en verwante kenmerke."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 98fcebbeed16..81357942a2bd 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi በይነመረብ መዳረሻ የለውም"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ለአማራጮች መታ ያድርጉ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"ወደ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ተቀይሯል"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ምንም ዓይነት የበይነመረብ ግንኙነት በማይኖረው ጊዜ መሣሪያዎች <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ን ይጠቀማሉ። ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ።"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"ከ<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ወደ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ተቀይሯል"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"የተንቀሳቃሽ ስልክ ውሂብ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"ብሉቱዝ"</item> + <item msgid="5447331121797802871">"ኤተርኔት"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"አንድ ያልታወቀ አውታረ መረብ ዓይነት"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ወደ Wi-Fi ለማያያዝ አልተቻለም"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ደካማ የበይነመረብ ግንኙነት ኣለው።"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"ግንኙነት ይፈቀድ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ቋንቋ እና አቀማመጥን ለመምረጥ መታ ያድርጉ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ዕጩዎች"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ን በማዘጋጀት ላይ"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ስህተቶች ካሉ በመፈተሽ ላይ"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"አዲስ <xliff:g id="NAME">%s</xliff:g> ተገኝቷል"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"ለ<xliff:g id="SESSION">%s</xliff:g> የተገናኘ። አውታረመረቡን ለማደራጀት ሁለቴ ንካ።"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ሁልጊዜ የበራ VPN በመገናኘት ላይ…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ሁልጊዜ የበራ VPN ተገናኝቷል"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ሁልጊዜ የበራ የVPN ግንኙነት ተቋርጧል"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ሁልጊዜ የበራ VPN ስህተት"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ለማዋቀር መታ ያድርጉ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ለማዋቀር መታ ያድርጉ"</string> <string name="upload_file" msgid="2897957172366730416">"ፋይል ምረጥ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ምንም ፋይል አልተመረጠም"</string> <string name="reset" msgid="2448168080964209908">"ዳግም አስጀምር"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"የቋንቋ ስም ይተይቡ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"የተጠቆሙ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ሁሉም ቋንቋዎች"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"ፈልግ"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"የሥራ ሁነታ ጠፍቷል"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"መተግበሪያዎችን፣ የበስተጀርባ ሥምረት እና ተዛማጅ ባሕሪዎችን ጨምሮ የሥራ መገለጫ እንዲሰራ ይፍቀዱ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 32df247ef4aa..7308d54ba116 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1176,6 +1176,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"شبكة Wi-Fi غير متصلة بالإنترنت"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"انقر للحصول على الخيارات."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"تم التبديل إلى <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"يستخدم الجهاز <xliff:g id="NEW_NETWORK">%1$s</xliff:g> عندما لا يتوفر اتصال بالإنترنت في شبكة <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>، ويمكن أن يتم فرض رسوم مقابل ذلك."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"تم التبديل من <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> إلى <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"بيانات شبكة الجوّال"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"بلوتوث"</item> + <item msgid="5447331121797802871">"إيثرنت"</item> + <item msgid="8257233890381651999">"شبكة ظاهرية خاصة (VPN)"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"نوع شبكة غير معروف"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"تعذر الاتصال بـ Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" لديها اتصال إنترنت رديء."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"هل تريد السماح بالاتصال؟"</string> @@ -1253,7 +1264,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"انقر لاختيار لغة وتنسيق"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"العناصر المرشحة"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"جارٍ تحضير <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"جارٍ التحقق من الأخطاء"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"تم اكتشاف <xliff:g id="NAME">%s</xliff:g> جديدة"</string> @@ -1332,8 +1342,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"تم الاتصال بـ <xliff:g id="SESSION">%s</xliff:g>. انقر لإدارة الشبكة."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"جارٍ الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"تم الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"تم فصل الشبكة الظاهرية الخاصة (VPN) دائمة التشغيل"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطأ بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"انقر للتهيئة."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"انقر للإعداد."</string> <string name="upload_file" msgid="2897957172366730416">"اختيار ملف"</string> <string name="no_file_chosen" msgid="6363648562170759465">"لم يتم اختيار أي ملف"</string> <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string> @@ -1780,6 +1791,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"اكتب اسم اللغة"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"المقترحة"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"جميع اللغات"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"كل المناطق"</string> <string name="locale_search_menu" msgid="2560710726687249178">"البحث"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"وضع العمل معطَّل"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"السماح باستخدام الملف الشخصي للعمل، بما في ذلك التطبيقات ومزامنة الخلفية والميزات ذات الصلة."</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index b1ed7dd3a0d7..94b7d271df32 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi-ın İnternetə girişi yoxdur"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçimlər üçün tıklayın"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> şəbəkə növünə keçirildi"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> şəbəkəsinin İnternetə çıxışı olmadıqda, cihaz <xliff:g id="NEW_NETWORK">%1$s</xliff:g> şəbəkəsini istifadə edir. Ödəniş tətbiq oluna bilər."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> şəbəkəsindən <xliff:g id="NEW_NETWORK">%2$s</xliff:g> şəbəkəsinə keçirildi"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobil data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"naməlum şəbəkə növü"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi\'a qoşulmaq alınmadı"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" internet bağlantısı keyfiyyətsizdir."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Bağlantıya icazə verilsin?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dil və tərtibatı seçmək üçün tıklayın"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"namizədlər"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanır"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Səhvlər yoxlanılır"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> aşkarlandı"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> sessiyaya qoşulun. Şəbəkəni idarə etmək üçün tıklayın."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Həmişə aktiv VPN bağlanır..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN bağlantısı həmişə aktiv"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Həmişə aktiv VPN bağlantısı kəsildi"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Həmişə aktiv VPN xətası"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Konfiqurasiya üçün tıklayın"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Quraşdırmaq üçün tıklayın"</string> <string name="upload_file" msgid="2897957172366730416">"Fayl seçin"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Heç bir fayl seçilməyib"</string> <string name="reset" msgid="2448168080964209908">"Sıfırlayın"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Dil adını daxil edin"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Təklif edilmiş"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Bütün dillər"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Bütün bölgələr"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Axtarın"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"İş rejimi DEAKTİVDİR"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tətbiq, arxa fon sinxronizasiyası və digər əlaqədar xüsusiyyətlər daxil olmaqla iş profilinin fəaliyyətinə icazə verin."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index ad74e2e15286..c540c960e337 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1101,6 +1101,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nema pristup internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Prešli ste na tip mreže <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Uređaj koristi tip mreže <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kada tip mreže <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu. Možda će se naplaćivati troškovi."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Prešli ste sa tipa mreže <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na tip mreže <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilni podaci"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Eternet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nepoznat tip mreže"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nije moguće povezati sa Wi-Fi mrežom"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima lošu internet vezu."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Želite li da dozvolite povezivanje?"</string> @@ -1178,7 +1189,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste izabrali jezik i raspored"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> se priprema"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Proverava se da li postoje greške"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novi uređaj <xliff:g id="NAME">%s</xliff:g> je otkriven"</string> @@ -1257,8 +1267,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Povezano sa sesijom <xliff:g id="SESSION">%s</xliff:g>. Dodirnite da biste upravljali mrežom."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje stalno uključenog VPN-a..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Stalno uključeni VPN je povezan"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Veza sa stalno uključenim VPN-om je prekinuta"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Greška stalno uključenog VPN-a"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Dodirnite da biste konfigurisali"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Dodirnite da biste podesili"</string> <string name="upload_file" msgid="2897957172366730416">"Odaberi datoteku"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nije izabrana nijedna datoteka"</string> <string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string> @@ -1672,6 +1683,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Unesite naziv jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženi"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Režim za Work je ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Dozvoljava profilu za Work da funkcioniše, uključujući aplikacije, sinhronizaciju u pozadini i srodne funkcije."</string> diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml index 237820c69c21..49033b435509 100644 --- a/core/res/res/values-be-rBY/strings.xml +++ b/core/res/res/values-be-rBY/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"У Wi-Fi няма доступу да Інтэрнэту"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Дакраніцеся, каб убачыць параметры"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Выкананы пераход да <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Прылада выкарыстоўвае <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, калі ў <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> няма доступу да інтэрнэту. Можа спаганяцца дадатковая плата."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Выкананы пераход з <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> да <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"сотавая перадача даных"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"невядомы тып сеткі"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Немагчыма падключыцца да Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" дрэннае падключэнне да Інтэрнэту."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Дазволіць падключэнне?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Дакраніцеся, каб выбраць мову і раскладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"кандыдат."</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Падрыхтоўка <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Праверка на наяўнасць памылак"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Выяўлены новы носьбіт <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Падлучаны да <xliff:g id="SESSION">%s</xliff:g>. Націсніце, каб кiраваць сеткай."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Падключэнне заўсёды ўключанага VPN..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Заўсёды ўключаны i падключаны VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Заўсёды ўключаны VPN адключаны"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Памылка заўсёды ўключанага VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Дакраніцеся, каб сканфігураваць"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Дакраніцеся, каб наладзіць"</string> <string name="upload_file" msgid="2897957172366730416">"Выберыце файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Файл не выбраны"</string> <string name="reset" msgid="2448168080964209908">"Скінуць"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Увядзіце назву мовы"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Прапанаваныя"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Усе мовы"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Усе рэгіёны"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Шукаць"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Рэжым працы АДКЛЮЧАНЫ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Дазволіць функцыянаванне працоўнага профілю, у тым ліку праграм, фонавай сінхранізацыі і звязаных з імі функцый."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 098a1a5662a6..9d77598ba58f 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi мрежата няма достъп до интернет"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Докоснете за опции"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Превключи се към <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Устройството използва <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, когато <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> няма достъп до интернет. Възможно е да бъдете таксувани."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Превключи се от <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> към <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобилни данни"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"виртуална частна мрежа (VPN)"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"неизвестен тип мрежа"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не можа да се свърже с Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лоша връзка с интернет."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Да се разреши ли връзката?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Докоснете, за да изберете език и подредба"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>: Подготвя се"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверява се за грешки"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Открито е ново хранилище (<xliff:g id="NAME">%s</xliff:g>)"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Свързана с/ъс <xliff:g id="SESSION">%s</xliff:g>. Докоснете, за да управлявате мрежата."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Установява се връзка с винаги включената виртуална частна мрежа (VPN)…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Установена е връзка с винаги включената виртуална частна мрежа (VPN)"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Няма връзка с винаги включената виртуална частна мрежа (VPN)"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка във винаги включената виртуална частна мрежа (VPN)"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Докоснете, за да конфигурирате"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Докоснете, за да настроите"</string> <string name="upload_file" msgid="2897957172366730416">"Избор на файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Няма избран файл"</string> <string name="reset" msgid="2448168080964209908">"Повторно задаване"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Въведете име на език"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Всички езици"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Всички региони"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Търсене"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Работният режим е ИЗКЛЮЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Разрешаване на функционирането на служебния потребителски профил, включително приложенията, синхронизирането на заден план и свързаните функции."</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index c9e921a48195..206aef83d59a 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -215,7 +215,7 @@ <string name="global_action_lock" msgid="2844945191792119712">"স্ক্রীণ লক"</string> <string name="global_action_power_off" msgid="4471879440839879722">"পাওয়ার বন্ধ করুন"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string> - <string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির প্রতিবেদন করুন"</string> + <string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির অভিযোগ করুন"</string> <string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷"</string> <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইন্টারেক্টিভ প্রতিবেদন"</string> <string name="bugreport_option_interactive_summary" msgid="229299488536107968">"বেশিরভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয়, সমস্যাটির সম্পর্কে আরো অনেক কিছু লিখতে দেয় এবং স্ক্রীনশটগুলি নিতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমনকি কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string> @@ -1007,7 +1007,7 @@ <string name="anr_application_process" msgid="6417199034861140083">"<xliff:g id="APPLICATION">%1$s</xliff:g> সাড়া দিচ্ছে না"</string> <string name="anr_process" msgid="6156880875555921105">"<xliff:g id="PROCESS">%1$s</xliff:g> প্রক্রিয়া সাড়া দিচ্ছে না"</string> <string name="force_close" msgid="8346072094521265605">"ঠিক আছে"</string> - <string name="report" msgid="4060218260984795706">"প্রতিবেদন করুন"</string> + <string name="report" msgid="4060218260984795706">"অভিযোগ করুন"</string> <string name="wait" msgid="7147118217226317732">"অপেক্ষা করুন"</string> <string name="webpage_unresponsive" msgid="3272758351138122503">"পৃষ্ঠাটি কোনো পতিক্রিয়া করছে না৷\n\nআপনি কি এটিকে বন্ধ করতে চান?"</string> <string name="launch_warning_title" msgid="1547997780506713581">"অ্যাপ্লিকেশানকে পুনঃনির্দেশিত করা হয়েছে"</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"ওয়াই-ফাই -তে কোনো ইন্টারনেট অ্যাক্সেস নেই"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"বিকল্পগুলির জন্য আলতো চাপুন"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> এ পাল্টানো হয়েছে"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"যখন <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> এর কোনো ইন্টারনেট অ্যাক্সেস থাকে না তখন ডিভাইস <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ব্যবহার করে৷ চার্জ লাগতে পারে৷"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> থেকে <xliff:g id="NEW_NETWORK">%2$s</xliff:g> এ পাল্টানো হয়েছে"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"সেলুলার ডেটা"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"ইথারনেট"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"এই নেটওয়ার্কের প্রকার অজানা"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ওয়াই-ফাই এর সাথে সংযোগ করা যায়নি"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" একটি দুর্বল ইন্টারনেট সংযোগ রয়েছে৷"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"সংযোগের অনুমতি দেবেন?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"প্রার্থীরা"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> প্রস্তুত করা হচ্ছে"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ত্রুটি রয়েছে কিনা পরীক্ষা করা হচ্ছে"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"নতুন <xliff:g id="NAME">%s</xliff:g> সনাক্ত করা হয়েছে"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> তে সংযুক্ত হয়েছে৷ নেটওয়ার্ক পরিচালনা করতে আলতো চাপুন৷"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"সর্বদা-চালু VPN সংযুক্ত হচ্ছে..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"সর্বদা-চালু VPN সংযুক্ত হয়েছে"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"সর্বদা-চালু VPN এর সংযোগ বিচ্ছিন্ন হয়েছে"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"সর্বদা-চালু VPN ত্রুটি"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"কনফিগার করতে আলতো চাপুন"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"সেট আপ করতে আলতো চাপুন"</string> <string name="upload_file" msgid="2897957172366730416">"ফাইল বেছে নিন"</string> <string name="no_file_chosen" msgid="6363648562170759465">"কোনো ফাইল নির্বাচন করা হয়নি"</string> <string name="reset" msgid="2448168080964209908">"পুনরায় সেট করুন"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"ভাষার নাম লিখুন"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"প্রস্তাবিত"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"সকল ভাষা"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"সমস্ত অঞ্চল"</string> <string name="locale_search_menu" msgid="2560710726687249178">"অনুসন্ধান করুন"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"কাজের মোড বন্ধ আছে"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"অ্যাপ্লিকেশান, পটভূমি সিঙ্ক এবং সম্পর্কিত বৈশিষ্ট্যগুলি সহ কর্মস্থলের প্রোফাইলটিকে কাজ করার অনুমতি দিন।"</string> diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index 20104a6d900b..540348b0bbfd 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -1103,6 +1103,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nema pristup Internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Prebačeno na: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Kada na uređaju <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu, koristi se <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Moguća je naplata usluge."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Prebačeno iz mreže <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> u <xliff:g id="NEW_NETWORK">%2$s</xliff:g> mrežu"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilni podaci"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nepoznata vrsta mreže"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Problem prilikom spajanja na Wi-Fi mrežu"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima lošu internet vezu."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Želite li dozvoliti povezivanje?"</string> @@ -1180,7 +1191,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema se <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Provjera grešaka"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novi uređaj <xliff:g id="NAME">%s</xliff:g> je otkriven"</string> @@ -1259,8 +1269,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Povezano sa sesijom <xliff:g id="SESSION">%s</xliff:g>. Dodirnite da upravljate mrežom."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje na uvijek aktivni VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan na uvijek aktivni VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Uvijek aktivni VPN nije povezan"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Greška u povezivanju na uvijek aktivni VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Dodirnite za konfiguriranje"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Dodirnite za postavke"</string> <string name="upload_file" msgid="2897957172366730416">"Odabir fajla"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nije izabran nijedan fajl"</string> <string name="reset" msgid="2448168080964209908">"Ponovno pokretanje"</string> @@ -1674,6 +1685,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Ukucajte naziv jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Pretraga"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Radni način rada je ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Omogući radnom profilu da funkcionira, uključujući aplikacije, sinhronizaciju u pozadini i povezane funkcije."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index eeed89204aee..87832a7e2c29 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"La Wi-Fi no té accés a Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca per veure les opcions"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Actualment en ús: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'apliquin càrrecs."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Abans es feia servir la xarxa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>; ara s\'utilitza <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"dades mòbils"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"una tipus de xarxa desconegut"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No s\'ha pogut connectar a la Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" té una mala connexió a Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vols permetre la connexió?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca per seleccionar l\'idioma i el disseny"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"S\'està preparant <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"S\'està comprovant si hi ha errors"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"S\'ha detectat <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connectat a <xliff:g id="SESSION">%s</xliff:g>. Pica per gestionar la xarxa."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"T\'estàs connectant a la VPN sempre activada…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Estàs connectat a la VPN sempre activada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"La VPN sempre activada està desconnectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de la VPN sempre activada"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toca per configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Toca per configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Trieu un fitxer"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No s\'ha escollit cap fitxer"</string> <string name="reset" msgid="2448168080964209908">"Restableix"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Nom de l\'idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggerits"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Tots els idiomes"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Totes les regions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Mode de feina desactivat"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permet que el perfil professional funcioni, incloses les aplicacions, la sincronització en segon pla i les funcions relacionades."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index df8bffdc4aa8..9be00bbb5ddc 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -692,7 +692,7 @@ <string name="lockscreen_missing_sim_message" product="default" msgid="2186920585695169078">"V telefonu není žádná SIM karta."</string> <string name="lockscreen_missing_sim_instructions" msgid="5372787138023272615">"Vložte SIM kartu."</string> <string name="lockscreen_missing_sim_instructions_long" msgid="3526573099019319472">"SIM karta chybí nebo je nečitelná. Vložte SIM kartu."</string> - <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Nepoužitelná karta SIM."</string> + <string name="lockscreen_permanent_disabled_sim_message_short" msgid="5096149665138916184">"Nepoužitelná SIM karta."</string> <string name="lockscreen_permanent_disabled_sim_instructions" msgid="910904643433151371">"Vaše SIM karta byla natrvalo zablokována.\n Požádejte svého poskytovatele bezdrátových služeb o další SIM kartu."</string> <string name="lockscreen_transport_prev_description" msgid="6300840251218161534">"Předchozí skladba"</string> <string name="lockscreen_transport_next_description" msgid="573285210424377338">"Další skladba"</string> @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nemá přístup k internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím zobrazíte možnosti"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Přechod na síť <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Když síť <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nebude mít přístup k internetu, zařízení použije síť <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Mohou být účtovány poplatky."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Přechod ze sítě <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na síť <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilní data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"neznámý typ sítě"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Připojení k síti Wi-Fi se nezdařilo"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má pomalé připojení k internetu."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povolit připojení?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozvržení"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidáti"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Probíhá příprava úložiště <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrola chyb"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zjištěno nové úložiště <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Připojeno k relaci <xliff:g id="SESSION">%s</xliff:g>. Klepnutím můžete síť spravovat."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Připojování k trvalé síti VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Je připojena trvalá síť VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Trvalá síť VPN je odpojena"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba trvalé sítě VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Klepnutím zahájíte konfiguraci"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Klepnutím přejděte do Nastavení"</string> <string name="upload_file" msgid="2897957172366730416">"Zvolit soubor"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Není vybrán žádný soubor"</string> <string name="reset" msgid="2448168080964209908">"Resetovat"</string> @@ -1708,6 +1719,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Zadejte název jazyka"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Navrhované"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Všechny jazyky"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Vyhledávání"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Pracovní režim je VYPNUTÝ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Povolí fungování pracovního profilu, včetně aplikací, synchronizace na pozadí a souvisejících funkcí."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 731c84746c6a..b6539b188a7c 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi har ingen internetadgang"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryk for at se valgmuligheder"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Der blev skiftet til <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Enheden benytter <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, når <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ikke har adgang til internettet. Der opkræves muligvis gebyr."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Der blev skiftet fra <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> til <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobildata"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"en ukendt netværkstype"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kunne ikke oprette forbindelse til Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dårlig internetforbindelse."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vil du tillade denne forbindelse?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryk for at vælge sprog og layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Kontrollerer for fejl"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Der blev registreret et nyt <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Forbundet til <xliff:g id="SESSION">%s</xliff:g>. Tryk for at administrere netværket."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Opretter forbindelse til altid aktiveret VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN er forbundet"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Forbindelsen til altid aktiveret VPN er afbrudt"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fejl i altid aktiveret VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tryk for at konfigurere"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tryk for at konfigurere"</string> <string name="upload_file" msgid="2897957172366730416">"Vælg fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string> <string name="reset" msgid="2448168080964209908">"Nulstil"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Angiv sprogets navn"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Foreslået"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle sprog"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Søg"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Arbejdstilstand er slået FRA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tillad, at arbejdsprofilen aktiveres, bl.a. i forbindelse med apps, baggrundssynkronisering og relaterede funktioner."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index c478607cfca4..4a58c3dfdd31 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"WLAN hat keinen Internetzugriff"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Für Optionen tippen"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Zu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> gewechselt"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Auf dem Gerät wird \"<xliff:g id="NEW_NETWORK">%1$s</xliff:g>\" verwendet, wenn über \"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>\" kein Internet verfügbar ist. Eventuell fallen Gebühren an."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Von \"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>\" zu \"<xliff:g id="NEW_NETWORK">%2$s</xliff:g>\" gewechselt"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobile Datennutzung"</item> + <item msgid="75483255295529161">"WLAN"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ein unbekannter Netzwerktyp"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Es konnte keine WLAN-Verbindung hergestellt werden."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" hat eine schlechte Internetverbindung."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Verbindung zulassen?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"Kandidaten"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Neue <xliff:g id="NAME">%s</xliff:g> entdeckt"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Verbunden mit <xliff:g id="SESSION">%s</xliff:g>. Zum Verwalten des Netzwerks tippen"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Verbindung zu durchgehend aktivem VPN wird hergestellt…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Mit durchgehend aktivem VPN verbunden"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Verbindung zu durchgehend aktivem VPN getrennt"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Durchgehend aktives VPN – Verbindungsfehler"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Zum Konfigurieren tippen"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Zum Einrichten tippen"</string> <string name="upload_file" msgid="2897957172366730416">"Datei auswählen"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Keine ausgewählt"</string> <string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Sprache eingeben"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Vorschläge"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle Sprachen"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Alle Regionen"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Suche"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Arbeitsmodus ist AUS"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Arbeitsprofil aktivieren, einschließlich Apps, Synchronisierung im Hintergrund und verknüpfter Funktionen."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 3c6e83217e89..ee7b8b6b3462 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Το δίκτυο Wi-Fi δεν έχει πρόσβαση στο διαδίκτυο"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Πατήστε για να δείτε τις επιλογές"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Μετάβαση σε δίκτυο <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Η συσκευή χρησιμοποιεί το δίκτυο <xliff:g id="NEW_NETWORK">%1$s</xliff:g> όταν το δίκτυο <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> δεν έχει πρόσβαση στο διαδίκτυο. Ενδέχεται να ισχύουν χρεώσεις."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Μετάβαση από το δίκτυο <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> στο δίκτυο <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"δεδομένα κινητής τηλεφωνίας"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"άγνωστος τύπος δικτύου"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Δεν είναι δυνατή η σύνδεση στο Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" έχει κακή σύνδεση στο Διαδίκτυο."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Να επιτρέπεται η σύνδεση;"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Πατήστε για να επιλέξετε γλώσσα και διάταξη"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"υποψήφιοι"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Προετοιμασία <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Έλεγχος για σφάλματα"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Εντοπίστηκε νέο μέσο αποθήκευσης <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Συνδέθηκε με <xliff:g id="SESSION">%s</xliff:g>. Πατήστε για να διαχειριστείτε το δίκτυο."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Σύνδεση πάντα ενεργοποιημένου VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Έχει συνδεθεί πάντα ενεργοποιημένο VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Το πάντα ενεργοποιημένο VPN αποσυνδέθηκε"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Σφάλμα πάντα ενεργοποιημένου VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Πατήστε για διαμόρφωση"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Πατήστε για ρύθμιση"</string> <string name="upload_file" msgid="2897957172366730416">"Επιλογή αρχείου"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Δεν επιλέχθηκε κανένα αρχείο."</string> <string name="reset" msgid="2448168080964209908">"Επαναφορά"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Εισαγ. όνομα γλώσσας"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Προτεινόμενες"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Όλες οι γλώσσες"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Όλες οι περιοχές"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Αναζήτηση"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Λειτουργία εργασίας ΑΠΕΝΕΡΓ/ΝΗ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Να επιτρέπεται η λειτουργία του προφίλ εργασίας σας, συμπεριλαμβανομένων των εφαρμογών, του συγχρονισμού στο παρασκήνιο και των σχετικών λειτουργιών."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 12b7aa5f69e6..5926a88af894 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi has no Internet access"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobile data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"an unknown network type"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Couldn\'t connect to Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" has a poor Internet connection."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Allow connection?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connected to <xliff:g id="SESSION">%s</xliff:g>. Tap to manage the network."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Always-on VPN disconnected"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tap to configure"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tap to set up"</string> <string name="upload_file" msgid="2897957172366730416">"Choose file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string> <string name="reset" msgid="2448168080964209908">"Reset"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 12b7aa5f69e6..5926a88af894 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi has no Internet access"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobile data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"an unknown network type"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Couldn\'t connect to Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" has a poor Internet connection."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Allow connection?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connected to <xliff:g id="SESSION">%s</xliff:g>. Tap to manage the network."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Always-on VPN disconnected"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tap to configure"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tap to set up"</string> <string name="upload_file" msgid="2897957172366730416">"Choose file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string> <string name="reset" msgid="2448168080964209908">"Reset"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 12b7aa5f69e6..5926a88af894 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi has no Internet access"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tap for options"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Switched to <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Device uses <xliff:g id="NEW_NETWORK">%1$s</xliff:g> when <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> has no Internet access. Charges may apply."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Switched from <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> to <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobile data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"an unknown network type"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Couldn\'t connect to Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" has a poor Internet connection."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Allow connection?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidates"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparing <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Checking for errors"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"New <xliff:g id="NAME">%s</xliff:g> detected"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connected to <xliff:g id="SESSION">%s</xliff:g>. Tap to manage the network."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Always-on VPN disconnected"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tap to configure"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tap to set up"</string> <string name="upload_file" msgid="2897957172366730416">"Choose file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string> <string name="reset" msgid="2448168080964209908">"Reset"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"All regions"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Work mode is OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Allow work profile to function, including apps, background sync and related features."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 136902b57799..45c3f7c1acd0 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"La red Wi-Fi no tiene acceso a Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Presiona para ver opciones"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Se cambió a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cuando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tiene acceso a Internet. Es posible que se apliquen cargos."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Se cambió de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"datos móviles"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"un tipo de red desconocido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se pudo conectar a la red Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una mala conexión a Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Presiona para seleccionar el idioma y el diseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando el medio <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Verificando errores"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Se detectó un nuevo medio (<xliff:g id="NAME">%s</xliff:g>)."</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectado a <xliff:g id="SESSION">%s</xliff:g>. Pulsa para gestionar la red."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Estableciendo conexión con la VPN siempre activada..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Se estableció conexión con la VPN siempre activada."</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Se desconectó la VPN siempre activada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Se produjo un error al establecer conexión con la VPN siempre activada."</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Presiona para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Presiona para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Elegir archivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No se seleccionó un archivo."</string> <string name="reset" msgid="2448168080964209908">"Restablecer"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Nombre del idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Búsqueda"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabajo DESACTIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que se active el perfil de trabajo, incluidas las apps, la sincronización en segundo plano y las funciones relacionadas."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c4ebb02128fd..0b32a7fc6414 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi sin acceso a Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opciones"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Se ha cambiado a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cuando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tiene acceso a Internet. Es posible que se apliquen cargos."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Se ha cambiado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"datos móviles"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"tipo de red desconocido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"No se ha podido establecer conexión con la red Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tiene una conexión inestable a Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"¿Permitir la conexión?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando errores"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nueva <xliff:g id="NAME">%s</xliff:g> detectada"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectado a <xliff:g id="SESSION">%s</xliff:g>. Toca para administrar la red."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Conectando VPN siempre activada…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN siempre activada conectada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN siempre activada desconectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de VPN siempre activada"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toca para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Toca para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Seleccionar archivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Archivo no seleccionado"</string> <string name="reset" msgid="2448168080964209908">"Restablecer"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Nombre de idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Todas las regiones"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabajo desactivado"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que se utilice el perfil de trabajo, incluidas las aplicaciones, la sincronización en segundo plano y las funciones relacionadas."</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 89223795d2bd..e1516b7f2435 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"WiFi-l pole juurdepääsu Internetile"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Puudutage valikute nägemiseks"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Lülitati võrgule <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Seade kasutab võrku <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, kui võrgul <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> puudub Interneti-ühendus. Rakenduda võivad tasud."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Lülitati võrgult <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> võrgule <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobiilne andmeside"</item> + <item msgid="75483255295529161">"WiFi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"tundmatu võrgutüüp"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ei saanud WiFi-ga ühendust"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" on halb Interneti-ühendus."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Kas lubada ühendus?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Puudutage keele ja paigutuse valimiseks"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidaadid"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Üksuse <xliff:g id="NAME">%s</xliff:g> ettevalmistamine"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Vigade kontrollimine"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tuvastati uus üksus <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Ühendatud seansiga <xliff:g id="SESSION">%s</xliff:g>. Koputage võrgu haldamiseks"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ühendamine alati sees VPN-iga …"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ühendatud alati sees VPN-iga"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Alati sees VPN pole ühendatud"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alati sees VPN-i viga"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Puudutage seadistamiseks"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Puudutage seadistamiseks"</string> <string name="upload_file" msgid="2897957172366730416">"Valige fail"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ühtegi faili pole valitud"</string> <string name="reset" msgid="2448168080964209908">"Lähtesta"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Sisestage keele nimi"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Soovitatud"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Kõik keeled"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Kõik piirkonnad"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Otsing"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Töörežiim on VÄLJA LÜLITATUD"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Lubatakse tööprofiili toimingud, sh rakendused, taustal sünkroonimine ja seotud funktsioonid."</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 7dc0877cd580..a90df61e7813 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi konexioa ezin da Internetera konektatu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Sakatu aukerak ikusteko"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> erabiltzen ari zara orain"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> Internetera konektatzeko gauza ez denean, <xliff:g id="NEW_NETWORK">%1$s</xliff:g> erabiltzen du gailuak. Agian kostuak ordaindu beharko dituzu."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> erabiltzen ari zinen, baina <xliff:g id="NEW_NETWORK">%2$s</xliff:g> erabiltzen ari zara orain"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"datu-konexioa"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"sare mota ezezaguna"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ezin izan da Wi-Fi sarera konektatu"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Interneteko konexio txarra du."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Konektatzea baimendu nahi diozu?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Hizkuntza eta diseinua hautatzeko, sakatu hau"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"hautagaiak"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> prestatzen"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Errorerik dagoen egiaztatzen"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> berria hauteman da"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> saiora konektatuta. Sakatu sarea kudeatzeko."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Beti aktibatuta dagoen VPNa konektatzen…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Beti aktibatuta dagoen VPNa konektatu da"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Deskonektatu egin da beti aktibatuta dagoen VPN konexioa"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Beti aktibatuta dagoen VPN errorea"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Sakatu konfiguratzeko"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Konfiguratzeko, sakatu hau"</string> <string name="upload_file" msgid="2897957172366730416">"Aukeratu fitxategia"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ez da fitxategirik aukeratu"</string> <string name="reset" msgid="2448168080964209908">"Berrezarri"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Adierazi hizkuntza"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Iradokitakoak"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Hizkuntza guztiak"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Bilaketa"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Desaktibatuta dago laneko modua"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Baimendu laneko profilak funtzionatzea, besteak beste, aplikazioak, atzeko planoko sinkronizazioa eta erlazionatutako eginbideak."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5976ad134191..5332a3303763 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -924,9 +924,9 @@ <item quantity="one">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item> <item quantity="other">در <xliff:g id="COUNT_1">%d</xliff:g> سال</item> </plurals> - <string name="VideoView_error_title" msgid="3534509135438353077">"مشکل در ویدیو"</string> - <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"متأسفیم، این ویدیو برای پخش جریانی با این دستگاه معتبر نیست."</string> - <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"پخش این ویدیو ممکن نیست."</string> + <string name="VideoView_error_title" msgid="3534509135438353077">"مشکل در ویدئو"</string> + <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"متأسفیم، این ویدئو برای پخش جریانی با این دستگاه معتبر نیست."</string> + <string name="VideoView_error_text_unknown" msgid="3450439155187810085">"پخش این ویدئو ممکن نیست."</string> <string name="VideoView_error_button" msgid="2822238215100679592">"تأیید"</string> <string name="relative_time" msgid="1818557177829411417">"<xliff:g id="DATE">%1$s</xliff:g>، <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="noon" msgid="7245353528818587908">"ظهر"</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi به اینترنت دسترسی ندارد"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"برای گزینهها ضربه بزنید"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"به <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> تغییر کرد"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"وقتی <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> دسترسی به اینترنت نداشته باشد، دستگاه از <xliff:g id="NEW_NETWORK">%1$s</xliff:g> استفاده میکند. ممکن است هزینههایی اعمال شود."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"از <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> به <xliff:g id="NEW_NETWORK">%2$s</xliff:g> تغییر کرد"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"داده شبکه تلفن همراه"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"بلوتوث"</item> + <item msgid="5447331121797802871">"اترنت"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"نوع شبکه نامشخص"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"اتصال به Wi-Fi ممکن نیست"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اتصال اینترنتی ضعیفی دارد."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"اتصال مجاز است؟"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"برای انتخاب زبان و چیدمان ضربه بزنید"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"داوطلبین"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"در حال آمادهسازی <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"در حال بررسی برای خطاها"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> جدید شناسایی شد"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"به <xliff:g id="SESSION">%s</xliff:g> متصل شد. برای مدیریت شبکه ضربه بزنید."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه فعال…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN همیشه فعال متصل شد"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ارتباط VPN همیشه روشن قطع شد"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطای VPN همیشه فعال"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"جهت پیکربندی ضربه بزنید"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"برای راهاندازی ضربه بزنید"</string> <string name="upload_file" msgid="2897957172366730416">"انتخاب فایل"</string> <string name="no_file_chosen" msgid="6363648562170759465">"هیچ فایلی انتخاب نشد"</string> <string name="reset" msgid="2448168080964209908">"بازنشانی"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"نام زبان را تایپ کنید"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"پیشنهادشده"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"همه زبانها"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"همه منطقهها"</string> <string name="locale_search_menu" msgid="2560710726687249178">"جستجو"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"حالت کاری خاموش است"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"به نمایه کاری اجازه فعالیت ( شامل استفاده از برنامهها، همگامسازی در پسزمینه و قابلیتهای مرتبط) داده شود."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b22175040dd7..92de423e3b70 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ei ole yhteydessä internetiin."</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Näytä vaihtoehdot napauttamalla."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> otettiin käyttöön"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> otetaan käyttöön, kun <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ei voi muodostaa yhteyttä internetiin. Veloitukset ovat mahdollisia."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> poistettiin käytöstä ja <xliff:g id="NEW_NETWORK">%2$s</xliff:g> otettiin käyttöön."</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobiilidata"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"tuntematon verkon tyyppi"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-yhteyden muodostaminen epäonnistui"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" : huono internetyhteys."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Sallitaanko yhteys?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Valitse kieli ja asettelu koskettamalla."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidaatit"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Valmistellaan kohdetta <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tarkistetaan virheiden varalta."</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Uusi <xliff:g id="NAME">%s</xliff:g> on havaittu."</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Yhdistetty: <xliff:g id="SESSION">%s</xliff:g>. Hallinnoi verkkoa napauttamalla."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Yhdistetään aina käytössä olevaan VPN-verkkoon..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Yhdistetty aina käytössä olevaan VPN-verkkoon"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Aina käytössä olevan VPN:n yhteys on katkaistu"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Aina käytössä oleva VPN: virhe"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Määritä napauttamalla."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Määritä koskettamalla."</string> <string name="upload_file" msgid="2897957172366730416">"Valitse tiedosto"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ei valittua tiedostoa"</string> <string name="reset" msgid="2448168080964209908">"Palauta"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Anna kielen nimi"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ehdotukset"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Kaikki kielet"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Kaikki alueet"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Haku"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Työtila on pois käytöstä"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Sallii työprofiiliin toiminnan, esimerkiksi sovellukset ja taustasynkronoinnin."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index d9fbceb2ba5d..c3f2e9a612b7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Le réseau Wi-Fi ne dispose d\'aucun accès à Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Touchez pour afficher les options"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Passé au réseau <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"L\'appareil utilise <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quand <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> n\'a pas d\'accès à Internet. Des frais peuvent s\'appliquer."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Passé du réseau <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> au <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"données cellulaires"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"RPV"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"un type de réseau inconnu"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossible de se connecter au Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" dispose d\'une mauvaise connexion Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Touchez pour sélectionner la langue et la configuration du clavier"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation de « <xliff:g id="NAME">%s</xliff:g> » en cours"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs en cours..."</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire « <xliff:g id="NAME">%s</xliff:g> » a été détectée"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connecté à <xliff:g id="SESSION">%s</xliff:g>. Appuyez ici pour gérer le réseau."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"RPV permanent déconnecté"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du VPN permanent"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Touchez pour configurer"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Touchez pour configurer"</string> <string name="upload_file" msgid="2897957172366730416">"Choisir un fichier"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string> <string name="reset" msgid="2448168080964209908">"Réinitialiser"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Entrez la langue"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggestions"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Le mode Travail est désactivé"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 6600f0926c1a..bdb7196ea592 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Le réseau Wi-Fi ne dispose d\'aucun accès à Internet."</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Appuyez ici pour afficher des options."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Nouveau réseau : <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"L\'appareil utilise <xliff:g id="NEW_NETWORK">%1$s</xliff:g> lorsque <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> n\'a pas de connexion Internet. Des frais supplémentaires peuvent s\'appliquer."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Ancien réseau : <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>. Nouveau réseau : <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"données mobiles"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"type de réseau inconnu"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossible de se connecter au Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" dispose d\'une mauvaise connexion Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Autoriser la connexion ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidats"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Préparation mémoire \"<xliff:g id="NAME">%s</xliff:g>\" en cours"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Recherche d\'erreurs"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Une nouvelle mémoire de stockage \"<xliff:g id="NAME">%s</xliff:g>\" a été détectée."</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Connecté à <xliff:g id="SESSION">%s</xliff:g>. Appuyez ici pour gérer le réseau."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN permanent déconnecté"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du VPN permanent"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Appuyez ici pour configurer."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Appuyer pour configurer"</string> <string name="upload_file" msgid="2897957172366730416">"Sélectionner un fichier"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string> <string name="reset" msgid="2448168080964209908">"Réinitialiser"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Saisissez la langue"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Recommandations"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Mode professionnel DÉSACTIVÉ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Autoriser le fonctionnement du profil professionnel, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées."</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 8023edffdb47..ed8ad8c94a54 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -598,7 +598,7 @@ <string name="phoneTypeCallback" msgid="2712175203065678206">"Devolver chamada"</string> <string name="phoneTypeCar" msgid="8738360689616716982">"Coche"</string> <string name="phoneTypeCompanyMain" msgid="540434356461478916">"Empresa (ppal.)"</string> - <string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string> + <string name="phoneTypeIsdn" msgid="8022453193171370337">"RDSI"</string> <string name="phoneTypeMain" msgid="6766137010628326916">"Principal"</string> <string name="phoneTypeOtherFax" msgid="8587657145072446565">"Outro fax"</string> <string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"A wifi non ten acceso a Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca para ver opcións."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Cambiouse a: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"O dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> cando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> non ten acceso a Internet. Pódense aplicar cargos."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Cambiouse de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"datos móbiles"</item> + <item msgid="75483255295529161">"wifi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"un tipo de rede descoñecido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Non se puido conectar coa rede Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ten unha conexión a Internet deficiente."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Queres permitir a conexión?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar o idioma e o deseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando a <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Comprobando se hai erros"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Detectouse unha <xliff:g id="NAME">%s</xliff:g> nova"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectado a <xliff:g id="SESSION">%s</xliff:g>. Toca aquí para xestionar a rede."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre activada conectándose..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre activada conectada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Desconectouse a VPN sempre activada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre activada"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toca para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tocar para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Escoller un ficheiro"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Non se seleccionou ningún ficheiro"</string> <string name="reset" msgid="2448168080964209908">"Restablecer"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Nome do idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suxeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de traballo DESACTIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permite que funcione o perfil de traballo, incluídas as aplicacións, a sincronización en segundo plano e as funcións relacionadas."</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 5c3bf93b551a..c71391b5b171 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ને કોઈ ઇન્ટરનેટ ઍક્સેસ નથી"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"વિકલ્પો માટે ટૅપ કરો"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> પર સ્વિચ કર્યું"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"જ્યારે <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> પાસે કોઈ ઇન્ટરનેટ ઍક્સેસ ન હોય ત્યારે ઉપકરણ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> નો ઉપયોગ કરે છે. શુલ્ક લાગુ થઈ શકે છે."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> પરથી <xliff:g id="NEW_NETWORK">%2$s</xliff:g> પર સ્વિચ કર્યું"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"સેલ્યુલર ડેટા"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"ઇથરનેટ"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"અજાણ્યો નેટવર્ક પ્રકાર"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi સાથે કનેક્ટ કરી શકાયું નથી"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" નબળું ઇન્ટરનેટ કનેક્શન ધરાવે છે."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"કનેક્શનની મંજૂરી આપીએ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ઉમેદવારો"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ને તૈયાર કરી રહ્યું છે"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ભૂલો માટે તપાસી રહ્યું છે"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"નવું <xliff:g id="NAME">%s</xliff:g> મળ્યું"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> થી કનેક્ટ થયાં. નેટવર્કને સંચાલિત કરવા માટે ટૅપ કરો."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"હંમેશા-ચાલુ VPN કનેક્ટ થઈ રહ્યું છે…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"હંમેશા-ચાલુ VPN કનેક્ટ થયું"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"હંમેશાં-ચાલુ VPN ડિસ્કનેક્ટ થયું"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"હંમેશાં ચાલુ VPN ભૂલ"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ગોઠવવા માટે ટૅપ કરો"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"સેટ કરવા માટે ટૅપ કરો"</string> <string name="upload_file" msgid="2897957172366730416">"ફાઇલ પસંદ કરો"</string> <string name="no_file_chosen" msgid="6363648562170759465">"કોઈ ફાઇલ પસંદ કરેલી નથી"</string> <string name="reset" msgid="2448168080964209908">"ફરીથી સેટ કરો"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"ભાષાનું નામ ટાઇપ કરો"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"સૂચવેલા"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"બધી ભાષાઓ"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"તમામ પ્રદેશ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"શોધ"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"કાર્ય મોડ બંધ છે"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"કાર્ય પ્રોફાઇલને ઍપ્લિકેશનો, પૃષ્ઠભૂમિ સમન્વયન અને સંબંધિત સુવિધાઓ સહિતનું કાર્ય કરવાની મંજૂરી આપો."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index bea243b7e241..98b17d7986ae 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -295,9 +295,9 @@ <string name="permlab_sendSms" msgid="7544599214260982981">"SMS संदेश भेजें और देखें"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"ऐप्स को SMS संदेशों को भेजने देता है. इसके परिणामस्वरूप अप्रत्याशित शुल्क लागू हो सकते हैं. दुर्भावनापूर्ण ऐप्स आपकी पुष्टि के बिना संदेश भेजकर आपका धन व्यय कर सकते हैं."</string> <string name="permlab_readSms" msgid="8745086572213270480">"अपने लेख संदेश (SMS या MMS) पढ़ें"</string> - <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string> - <string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों को पढ़ने की अनुमति देती है. इससे ऐप को सामग्री या गोपनीयता पर ध्यान दिए बिना, सभी SMS संदेशों को पढ़ने की अनुमति मिल जाती है."</string> - <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या गोपनीयता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string> + <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"ऐप्स को आपके टेबलेट या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या निजता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string> + <string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"ऐप को आपके टीवी या सिम कार्ड पर संग्रहीत SMS संदेशों को पढ़ने की अनुमति देती है. इससे ऐप को सामग्री या निजता पर ध्यान दिए बिना, सभी SMS संदेशों को पढ़ने की अनुमति मिल जाती है."</string> + <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"ऐप्स को आपके फ़ोन या सिम कार्ड में संग्रहीत SMS संदेश पढ़ने देता है. इससे सामग्री या निजता पर ध्यान दिए बिना, ऐप्स सभी SMS संदेश पढ़ सकता है."</string> <string name="permlab_receiveWapPush" msgid="5991398711936590410">"लेख संदेश (WAP) प्राप्त करें"</string> <string name="permdesc_receiveWapPush" msgid="748232190220583385">"ऐप्स को WAP संदेशों को प्राप्त और संसाधित करने देता है. इस अनुमति में आपको भेजे गए संदेशों की निगरानी आपको दिखाए बिना करने और हटाने की क्षमता शामिल है."</string> <string name="permlab_getTasks" msgid="6466095396623933906">"चल रहे ऐप्स पुनर्प्राप्त करें"</string> @@ -347,9 +347,9 @@ <string name="permlab_bodySensors" msgid="4683341291818520277">"शरीर संवेदक एक्सेस करें (जैसे हृदय गति मॉनीटर)"</string> <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"ऐप को आपकी शारीरिक स्थिति, जैसे आपकी हृदय गति पर नज़र रखने वाले संवेदकों का डेटा एक्सेस करने देती है."</string> <string name="permlab_readCalendar" msgid="5972727560257612398">"केलैंडर ईवेंट के साथ-साथ गोपनीय जानकारी पढ़ें"</string> - <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके टेबलेट पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है."</string> - <string name="permdesc_readCalendar" product="tv" msgid="3191352452242394196">"ऐप को, मित्रों और सहकर्मियों के कैलेंडर ईवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर ईवेंट पढ़ने देती है. इससे ऐप को गोपनीयता या संवेदनशीलता पर ध्यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है."</string> - <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके फ़ोन पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे गोपनीयता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है."</string> + <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके टेबलेट पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है."</string> + <string name="permdesc_readCalendar" product="tv" msgid="3191352452242394196">"ऐप को, मित्रों और सहकर्मियों के कैलेंडर ईवेंट सहित, आपके टीवी पर संग्रहीत सभी कैलेंडर ईवेंट पढ़ने देती है. इससे ऐप को निजता या संवेदनशीलता पर ध्यान दिए बिना, आपका कैलेडर डेटा साझा करने या सहेजने की अनुमति मिल जाती है."</string> + <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"ऐप्स को मित्रों या सहकर्मियों के कैलेंडर इवेंट सहित, आपके फ़ोन पर संग्रहीत कैलेंडर इवेंट पढ़ने देता है. इससे निजता या संवेदनशीलता पर ध्यान दिए बिना, ऐप्स आपके कैलेंडर डेटा को साझा कर सकता है या सहेज सकता है."</string> <string name="permlab_writeCalendar" msgid="8438874755193825647">"अपनी जानकारी के बिना कैलेंडर ईवेंट जोड़ें या संशोधित करें और अतिथियों को ईमेल भेजें"</string> <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"ऐप्स को मित्रों या सहकर्मियों के ईवेंट के साथ ही वे ईवेंट जोड़ने, निकालने, बदलने देता है जिन्हें आप अपने टेबलेट पर संशोधित कर सकते हैं. इससे ऐप्स ,अपनी जानकारी के बिना उन संदेशों को भेज सकता है जो कैलेंडर स्वामियों की ओर से आते दिखाई देते हैं, या ईवेंट संशोधित कर सकता है."</string> <string name="permdesc_writeCalendar" product="tv" msgid="1273290605500902507">"ऐप को ऐसे ईवेंट जोड़ने, निकालने, बदलने देती है जिन्हें आप अपने डिवाइस पर बदल सकते हैं, जिनमें मित्रों या सहकर्मियों के ईवेंट शामिल हैं. इससे ऐप ऐसे संदेश भेज सकता है जो कैलेंडर स्वामी से आते हुए प्रतीत होते हैं या ऐप स्वामी की जानकारी के बिना ईवेंट बदल सकता है."</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"वाई-फ़ाई में कोई इंटरनेट ऐक्सेस नहीं है"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पों के लिए टैप करें"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> पर ले जाया गया"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> में कोई इंटरनेट एक्सेस नहीं होने पर डिवाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> का उपयोग करता है. शुल्क लिया जा सकता है."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> से <xliff:g id="NEW_NETWORK">%2$s</xliff:g> पर ले जाया गया"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"सेल्युलर डेटा"</item> + <item msgid="75483255295529161">"वाई-फ़ाई"</item> + <item msgid="6862614801537202646">"ब्लूटूथ"</item> + <item msgid="5447331121797802871">"ईथरनेट"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"अज्ञात नेटवर्क प्रकार"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाई-फ़ाई से कनेक्ट नहीं हो सका"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" के पास एक कमज़ोर इंटरनेट कनेक्शन है."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"कनेक्शन की अनुमति दें?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा और लेआउट चुनने के लिए टैप करें"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"उम्मीदवार"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> को तैयार किया जा रहा है"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटियों की जांच कर रहा है"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नए <xliff:g id="NAME">%s</xliff:g> का पता लगा"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> से कनेक्ट किया गया. नेटवर्क प्रबंधित करने के लिए टैप करें."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"हमेशा-चालू VPN कनेक्ट हो रहा है…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"हमेशा-चालू VPN कनेक्ट है"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"हमेशा-चालू VPN डिस्कनेक्ट है"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"हमेशा-चालू VPN त्रुटि"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"कॉन्फ़िगर करने के लिए टैप करें"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"सेट करने के लिए टैप करें"</string> <string name="upload_file" msgid="2897957172366730416">"फ़ाइल चुनें"</string> <string name="no_file_chosen" msgid="6363648562170759465">"कोई फ़ाइल चुनी नहीं गई"</string> <string name="reset" msgid="2448168080964209908">"रीसेट करें"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"भाषा का नाम लिखें"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"सुझाए गए"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"सभी भाषाएं"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"सभी क्षेत्र"</string> <string name="locale_search_menu" msgid="2560710726687249178">"खोजें"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बंद है"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ऐप्स, पृष्ठभूमि समन्वयन और संबंधित सुविधाओं सहित कार्य प्रोफ़ाइल को काम करने की अनुमति दें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b181f6d40e83..115a97ea55e2 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1101,6 +1101,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nema pristup internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dodirnite za opcije"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Prelazak na drugu mrežu: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Kada <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nema pristup internetu, na uređaju se upotrebljava <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Moguća je naplata naknade."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Mreža je promijenjena: <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> > <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilni podaci"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nepoznata vrsta mreže"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ne može se spojiti na Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima lošu internetsku vezu."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Dopustiti povezivanje?"</string> @@ -1178,7 +1189,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste odabrali jezik i raspored"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Priprema uređaja <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Traženje pogrešaka"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Otkriven je novi uređaj <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1257,8 +1267,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Povezan sa sesijom <xliff:g id="SESSION">%s</xliff:g>. Dotaknite za upravljanje mrežom."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje s uvijek uključenom VPN mrežom…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan s uvijek uključenom VPN mrežom"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Prekinuta je veza s uvijek uključenom VPN mrežom"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Pogreška uvijek uključene VPN mreže"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Dodirnite da biste konfigurirali"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Dodirnite za postavljanje"</string> <string name="upload_file" msgid="2897957172366730416">"Odaberite datoteku"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nema odabranih datoteka"</string> <string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string> @@ -1672,6 +1683,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Unesite naziv jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Radni je način ISKLJUČEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Omogućuje radnom profilu da funkcionira, uključujući aplikacije, sinkronizaciju u pozadini i povezane značajke."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index aea12a60f2ae..54980618f998 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"A Wi-Fi-hálózaton nincs internetkapcsolat"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Koppintson a beállítások megjelenítéséhez"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Átváltva erre: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> használata, ha nincs internetkapcsolat <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>-kapcsolaton keresztül. A szolgáltató díjat számíthat fel."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Átváltva <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>-hálózatról erre: <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobiladat"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ismeretlen hálózati típus"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nem sikerült csatlakozni a Wi-Fi hálózathoz"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" rossz internetkapcsolattal rendelkezik."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Engedélyezi a csatlakozást?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"jelöltek"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> előkészítése"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hibák keresése"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Új <xliff:g id="NAME">%s</xliff:g> észlelve"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Csatlakozva ide: <xliff:g id="SESSION">%s</xliff:g>. Érintse meg a hálózat kezeléséhez."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Csatlakozás a mindig bekapcsolt VPN-hez..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Csatlakozva a mindig bekapcsolt VPN-hez"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Kapcsolat bontva a mindig bekapcsolt VPN-nel"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Hiba a mindig bekapcsolt VPN-nel"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Koppintson a konfiguráláshoz"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Koppintson ide a beállításhoz"</string> <string name="upload_file" msgid="2897957172366730416">"Fájl kiválasztása"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nincs fájl kiválasztva"</string> <string name="reset" msgid="2448168080964209908">"Alaphelyzet"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Adja meg a nyelvet"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Javasolt"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Minden nyelv"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Minden régió"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Keresés"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"A munka mód KI van kapcsolva"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Munkaprofil használatának engedélyezése, beleértve az alkalmazásokat, a háttérben való szinkronizálást és a kapcsolódó funkciókat."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index ba97468da436..2b59f7e13210 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ցանցը համացանցի միացում չունի"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Հպեք՝ ընտրանքները տեսնելու համար"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Անցել է <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ցանցի"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Եթե <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ցանցն ինտերնետ կապ չունի, սարքն անցնում է <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ցանցի: Կարող են վճարներ գանձվել:"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ցանցից անցել է <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ցանցի"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"բջջային տվյալներ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ցանցի անհայտ տեսակ"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Չհաջողվեց միանալ Wi-Fi-ին"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ունի թույլ ինտերնետ կապ:"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Թույլատրե՞լ կապը:"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"թեկնածուները"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ի նախապատրաստում"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Սխալների ստուգում"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Հայտնաբերվել է նոր <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Կապակացված է <xliff:g id="SESSION">%s</xliff:g>-ին: Սեղմեք` ցանցը կառավարելու համար:"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Միշտ-միացված VPN-ը կապվում է..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Միշտ-առցանց VPN-ը կապակցված է"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"«Միշտ միացված VPN»-ն անջատված է"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN սխալը միշտ միացված"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Հպեք՝ կազմաձևելու համար"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Հպեք՝ կարգավորելու համար"</string> <string name="upload_file" msgid="2897957172366730416">"Ընտրել ֆայլը"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ոչ մի ֆայլ չի ընտրված"</string> <string name="reset" msgid="2448168080964209908">"Վերակայել"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Մուտքագրեք լեզուն"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Առաջարկներ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Բոլոր լեզուները"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Բոլոր տարածաշրջանները"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Որոնում"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Աշխատանքային ռեժիմն ԱՆՋԱՏՎԱԾ Է"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Միացնել աշխատանքային պրոֆիլը՝ հավելվածները, ֆոնային համաժամեցումը և առնչվող գործառույթները"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 132789b01598..a817b32a911a 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -116,7 +116,7 @@ <string name="roamingText5" msgid="7604063252850354350">"Roaming - Sistem Yang Dipilih"</string> <string name="roamingText6" msgid="2059440825782871513">"Roaming - Sistem Tersedia"</string> <string name="roamingText7" msgid="7112078724097233605">"Mitra Roaming - Alliance"</string> - <string name="roamingText8" msgid="5989569778604089291">"Roaming - Mitra Premium"</string> + <string name="roamingText8" msgid="5989569778604089291">"Roaming - Partner Premium"</string> <string name="roamingText9" msgid="7969296811355152491">"Fungsionalitas Layanan Roaming - Penuh"</string> <string name="roamingText10" msgid="3992906999815316417">"Fungsionalitas Layanan Roaming - Sebagian"</string> <string name="roamingText11" msgid="4154476854426920970">"Spanduk Roaming Hidup"</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi tidak memiliki akses internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketuk untuk melihat opsi"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Dialihkan ke <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Perangkat menggunakan <xliff:g id="NEW_NETWORK">%1$s</xliff:g> jika <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tidak memiliki akses internet. Tarif mungkin berlaku."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Dialihkan dari <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ke <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"data seluler"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"jenis jaringan yang tidak dikenal"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Tidak dapat tersambung ke Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" memiliki sambungan internet yang buruk."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Izinkan hubungan?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyiapkan <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Memeriksa kesalahan"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baru terdeteksi"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Tersambung ke <xliff:g id="SESSION">%s</xliff:g>. Ketuk untuk mengelola jaringan."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Menyambungkan VPN selalu aktif..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN selalu aktif tersambung"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN selalu aktif terputus"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kesalahan VPN selalu aktif"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Ketuk untuk mengonfigurasi"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Ketuk untuk menyiapkan"</string> <string name="upload_file" msgid="2897957172366730416">"Pilih file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Tidak ada file yang dipilih"</string> <string name="reset" msgid="2448168080964209908">"Setel ulang"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Ketik nama bahasa"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Disarankan"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Semua wilayah"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Telusuri"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Mode kerja NONAKTIF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Izinkan profil kerja berfungsi, termasuk aplikasi, sinkronisasi latar belakang, dan fitur terkait."</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index a897ba87cc27..339ee6aeba2d 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi netið er ekki með tengingu við internetið"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ýttu til að sjá valkosti"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Skipt yfir á <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Tækið notar <xliff:g id="NEW_NETWORK">%1$s</xliff:g> þegar <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> er ekki með internetaðgang. Gjöld geta átt við."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Skipt úr <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> yfir í <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"farsímagögn"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"óþekkt tegund netkerfis"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ekki var hægt að tengjast Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" er með lélegt netsamband."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Leyfa tengingu?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ýttu til að velja tungumál og útlit"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"möguleikar"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Undirbýr <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Leitar að villum"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nýtt <xliff:g id="NAME">%s</xliff:g> fannst"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Tengt við <xliff:g id="SESSION">%s</xliff:g>. Ýttu til að hafa umsjón með netinu."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Sívirkt VPN tengist…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Sívirkt VPN tengt"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Sívirkt VPN aftengt"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Villa í sívirku VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Ýttu til að stilla"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Ýttu til að setja upp"</string> <string name="upload_file" msgid="2897957172366730416">"Velja skrá"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Engin skrá valin"</string> <string name="reset" msgid="2448168080964209908">"Endurstilla"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Sláðu inn heiti tungumáls"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Tillögur"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Öll tungumál"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Öll svæði"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Leita"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Slökkt á vinnusniði"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Leyfa virkni vinnusniðs, m.a. forrita, samstillingar í bakgrunni og tengdra eiginleika."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 9cd74dc808e8..1c909b792d65 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Connessione Wi-Fi priva di accesso Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tocca per le opzioni"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Passato a <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Il dispositivo utilizza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> non ha accesso a Internet. Potrebbero essere applicati costi."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Passato da <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> a <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"rete dati"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"tipo di rete sconosciuto"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Impossibile connettersi alla rete Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ha una connessione Internet debole."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Consentire la connessione?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tocca per selezionare la lingua e il layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidati"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparazione della <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ricerca errori"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nuova <xliff:g id="NAME">%s</xliff:g> rilevata"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Collegata a <xliff:g id="SESSION">%s</xliff:g>. Tocca per gestire la rete."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Connessione a VPN sempre attiva…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre attiva connessa"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN sempre attiva disconnessa"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Errore VPN sempre attiva"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tocca per configurare"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tocca per configurare"</string> <string name="upload_file" msgid="2897957172366730416">"Scegli file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nessun file è stato scelto"</string> <string name="reset" msgid="2448168080964209908">"Reimposta"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Digita nome lingua"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggerite"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Tutte le lingue"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Tutte le aree geografiche"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modalità Lavoro DISATTIVATA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Attiva il profilo di lavoro, incluse app, sincronizzazione in background e funzioni correlate."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index bebe027cb67f..1f873ac0095a 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"אין ל-Wi-Fi גישה לאינטרנט"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"הקש לקבלת אפשרויות"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"מעבר אל <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"המכשיר משתמש ברשת <xliff:g id="NEW_NETWORK">%1$s</xliff:g> כשלרשת <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> אין גישה לאינטרנט. עשויים לחול חיובים."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"עבר מרשת <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> לרשת <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"נתונים סלולריים"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"סוג רשת לא מזוהה"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"אין אפשרות להתחבר ל-Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" אינו מחובר היטב לאינטרנט."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"האם להתיר את החיבור?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"הקש כדי לבחור שפה ופריסה"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"מועמדים"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"הכנת <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"בודק אם יש שגיאות"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"זוהה <xliff:g id="NAME">%s</xliff:g> חדש"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"מחובר אל <xliff:g id="SESSION">%s</xliff:g>. הקש כדי לנהל את הרשת."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ה-VPN שמופעל תמיד, מתחבר..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ה-VPN שפועל תמיד, מחובר"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"חיבור תמידי ל-VPN מנותק"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"שגיאת VPN שמופעל תמיד"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"הקש כדי להגדיר"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"הקש כדי להגדיר"</string> <string name="upload_file" msgid="2897957172366730416">"בחר קובץ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"לא נבחר קובץ"</string> <string name="reset" msgid="2448168080964209908">"איפוס"</string> @@ -1362,7 +1373,7 @@ <string name="action_menu_overflow_description" msgid="2295659037509008453">"אפשרויות נוספות"</string> <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> - <string name="storage_internal" msgid="3570990907910199483">"אחסון משותף פנימי"</string> + <string name="storage_internal" msgid="3570990907910199483">"אחסון שיתוף פנימי"</string> <string name="storage_sd_card" msgid="3282948861378286745">"כרטיס SD"</string> <string name="storage_sd_card_label" msgid="6347111320774379257">"כרטיס SD של <xliff:g id="MANUFACTURER">%s</xliff:g>"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"כונן USB"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"הקלד שם שפה"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"הצעות"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"כל השפות"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"כל האזורים"</string> <string name="locale_search_menu" msgid="2560710726687249178">"חיפוש"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"מצב העבודה כבוי"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"אפשר לפרופיל העבודה לפעול, כולל אפליקציות, סנכרון ברקע ותכונות קשורות."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b2a7bd27f243..682766bfbf42 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -374,7 +374,7 @@ <string name="permdesc_callPhone" msgid="3740797576113760827">"電話番号への自動発信をアプリに許可します。これにより、予期せぬ発信や料金が発生する可能性があります。なお、緊急通報番号への発信は許可されません。悪意のあるアプリが確認なしで発信し、料金が発生する恐れがあります。"</string> <string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS通話サービスへのアクセス"</string> <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"IMSサービスがユーザー操作なしで電話をかけることをアプリに許可します。"</string> - <string name="permlab_readPhoneState" msgid="9178228524507610486">"端末のステータスとIDの読み取り"</string> + <string name="permlab_readPhoneState" msgid="9178228524507610486">"端末情報と ID の読み取り"</string> <string name="permdesc_readPhoneState" msgid="1639212771826125528">"端末の電話機能へのアクセスをアプリに許可します。これにより、電話番号、端末ID、通話中かどうか、通話相手の電話番号をアプリから特定できるようになります。"</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"タブレットのスリープを無効化"</string> <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"テレビのスリープを無効化"</string> @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fiはインターネットに接続していません"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"タップしてその他のオプションを表示"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"「<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>」に切り替えました"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"端末で「<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>」によるインターネット接続ができない場合に「<xliff:g id="NEW_NETWORK">%1$s</xliff:g>」を使用します。通信料が発生することがあります。"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"「<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>」から「<xliff:g id="NEW_NETWORK">%2$s</xliff:g>」に切り替えました"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"モバイルデータ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"イーサネット"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"不明なネットワーク タイプ"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fiに接続できませんでした"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" はインターネット接続に問題があります。"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"接続を許可しますか?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"タップして言語とレイアウトを選択してください"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"候補"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"新しい<xliff:g id="NAME">%s</xliff:g>が検出されました"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>に接続しました。ネットワークを管理するにはタップしてください。"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPNに常時接続しています…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPNに常時接続しました"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"常時接続 VPN の接続を解除しました"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"常時接続VPNのエラー"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"タップして設定"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"設定するにはタップします"</string> <string name="upload_file" msgid="2897957172366730416">"ファイルを選択"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ファイルが選択されていません"</string> <string name="reset" msgid="2448168080964209908">"リセット"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"言語名を入力"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"言語の候補"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"すべての言語"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"すべての地域"</string> <string name="locale_search_menu" msgid="2560710726687249178">"検索"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Work モード OFF"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"仕事用プロファイルで、アプリ、バックグラウンド同期などの関連機能の使用を許可します。"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 0295ea50a8be..5cbf001c5296 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi-ს არ აქვს ინტერნეტზე წვდომა"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"შეეხეთ ვარიანტების სანახავად"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"ახლა გამოიყენება <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"თუ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ინტერნეტთან კავშირს დაკარგავს, მოწყობილობის მიერ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> იქნება გამოყენებული, რამაც შეიძლება დამატებითი ხარჯები გამოიწვიოს"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"ახლა გამოიყენება <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> (გამოიყენებოდა <xliff:g id="NEW_NETWORK">%2$s</xliff:g>)"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"მობილური ინტერნეტი"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"უცნობი ტიპის ქსელი"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-თან დაკავშირება ვერ მოხერხდა"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" აქვს ცუდი ინტერნეტ კავშირი."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"გსურთ კავშირის დაშვება?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"შეეხეთ ენისა და განლაგების ასარჩევად"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"კანდიდატები"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ის მომზადება"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"შეცდომების შემოწმება"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"აღმოჩენილია ახალი <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"მიერთებულია <xliff:g id="SESSION">%s</xliff:g>-ზე. შეეხეთ ქსელის სამართავად."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"მიმდინარეობს მუდმივად ჩართული VPN-ის მიერთება…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"მუდმივად ჩართული VPN-ის მიერთებულია"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"მუდმივად ჩართული VPN გათიშულია"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"შეცდომა მუდამ VPN-ზე"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"შეეხეთ პარამეტრების კონფიგურაციისთვის"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"შეეხეთ დასაყენებლად"</string> <string name="upload_file" msgid="2897957172366730416">"ფაილის არჩევა"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ფაილი არჩეული არ არის"</string> <string name="reset" msgid="2448168080964209908">"საწყისზე დაბრუნება"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"აკრიფეთ ენის სახელი"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"რეკომენდებული"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ყველა ენა"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"ყველა რეგიონი"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ძიება"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"სამსახურის რეჟიმი გამორთულია"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"სამსახურის პროფილის მუშაობის დაშვება, მათ შორის, აპების, ფონური სინქრონიზაციის და დაკავშირებული ფუნქციების."</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index b5931c1a1ea1..c7c91afe19d1 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi желісінде интернет байланысы жоқ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Опциялар үшін түртіңіз"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> желісіне ауысты"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Құрылғы <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> желісінде интернетпен байланыс жоғалған жағдайда <xliff:g id="NEW_NETWORK">%1$s</xliff:g> желісін пайдаланады. Деректер ақысы алынуы мүмкін."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> желісінен <xliff:g id="NEW_NETWORK">%2$s</xliff:g> желісіне ауысты"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ұялы дерек"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"желі түрі белгісіз"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi желісіне қосыла алмады"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет байланысы нашар."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Қосылуға рұқсат ету керек пе?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тіл мен пернетақта схемасын таңдау үшін түртіңіз"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"үміткерлер"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> дайындалуда"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Қателер тексерілуде"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңа <xliff:g id="NAME">%s</xliff:g> анықталды"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> жүйесіне жалғанған. Желіні басқару үшін түріңіз."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Әрқашан қосылған ВЖЖ жалғануда…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Әрқашан қосылған ВЖЖ жалғанған"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Әрқашан қосулы VPN желісі ажыратылды"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Әрқашан қосылған ВЖЖ қателігі"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Конфигурациялау үшін түртіңіз"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Реттеу үшін түртіңіз"</string> <string name="upload_file" msgid="2897957172366730416">"Файлды таңдау"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ешқандай файл таңдалмаған"</string> <string name="reset" msgid="2448168080964209908">"Қайта реттеу"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Тіл атауын теріңіз"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ұсынылған"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Барлық тілдер"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Барлық аймақтар"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Іздеу"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Жұмыс режимі ӨШІРУЛІ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Жұмыс профиліне, соның ішінде, қолданбаларға, фондық синхрондауға және қатысты мүмкіндіктерге жұмыс істеуге рұқсат ету."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 71f8cbabd880..54889fa8356e 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -1078,6 +1078,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi មិនមានអ៊ិនធឺណិតនោះទេ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ប៉ះសម្រាប់ជម្រើស"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"បានប្តូរទៅ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"ឧបករណ៍ប្រើ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> នៅពេលដែល <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> គ្មានការតភ្ជាប់អ៊ីនធឺណិត។ អាចគិតប្រាក់លើការប្រើប្រាស់ទិន្នន័យ។"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"បានប្តូរពី <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ទៅ <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ទិន្នន័យចល័ត"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"ប៊្លូធូស"</item> + <item msgid="5447331121797802871">"អ៊ីសឺរណិត"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ប្រភេទបណ្តាញមិនស្គាល់"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"មិនអាចតភ្ជាប់វ៉ាយហ្វាយ"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" មានការតភ្ជាប់អ៊ីនធឺណិតមិនល្អ។"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"អនុញ្ញាតភ្ជាប់?"</string> @@ -1155,7 +1166,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ប៉ះដើម្បីជ្រើសភាសា និងប្លង់"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"បេក្ខជន"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"កំពុងរៀបចំ <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"កំពុងពិនិត្យរកកំហុស"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"បានរកឃើញ <xliff:g id="NAME">%s</xliff:g> ថ្មី"</string> @@ -1234,8 +1244,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"បានភ្ជាប់ទៅ <xliff:g id="SESSION">%s</xliff:g> ។ ប៉ះ ដើម្បីគ្រប់គ្រងបណ្ដាញ។"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"បើកការតភ្ជាប់ VPN ជានិច្ច..។"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ភ្ជាប់ VPN ជានិច្ច"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"បានផ្តាច់ VPN ដែលបើកជានិច្ច"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"បើកកំហុស VPN ជានិច្ច"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ប៉ះដើម្បីកំណត់រចនាសម្ព័ន្ធ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ប៉ះដើម្បីដំឡើង"</string> <string name="upload_file" msgid="2897957172366730416">"ជ្រើសឯកសារ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"គ្មានឯកសារបានជ្រើស"</string> <string name="reset" msgid="2448168080964209908">"កំណត់ឡើងវិញ"</string> @@ -1638,6 +1649,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"វាយបញ្ចូលឈ្មោះភាសា"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"បានស្នើ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ភាសាទាំងអស់"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"ស្វែងរក"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"របៀបការងារបានបិទ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"អនុញ្ញាតឲ្យប្រវត្តិរូបការងារដំណើរការ ដោយរាប់បញ្ចូលទាំងកម្មវិធី ការធ្វើសមកាលកម្មផ្ទៃខាងក្រោយ និងលក្ខណៈពិសេសដែលពាក់ព័ន្ធ។"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 770af199d113..60d42b2414d3 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"ವೈ-ಫೈ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ಇಂಟರ್ನೆಟ್ ಪ್ರವೇಶ ಹೊಂದಿಲ್ಲದಿರುವಾಗ, ಸಾಧನವು <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ಬಳಸುತ್ತದೆ. ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ರಿಂದ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ಸೆಲ್ಯುಲರ್ ಡೇಟಾ"</item> + <item msgid="75483255295529161">"ವೈ-ಫೈ"</item> + <item msgid="6862614801537202646">"ಬ್ಲೂಟೂತ್"</item> + <item msgid="5447331121797802871">"ಇಥರ್ನೆಟ್"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ಅಪರಿಚಿತ ನೆಟ್ವರ್ಕ್ ಪ್ರಕಾರ"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ವೈ-ಫೈ ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ಕಳಪೆ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿದೆ."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"ಸಂಪರ್ಕವನ್ನು ಅನುಮತಿಸುವುದೇ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ಅಭ್ಯರ್ಥಿಗಳು"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ಅನ್ನು ಸಿದ್ಧಪಡಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ದೋಷಗಳನ್ನು ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ಹೊಸ <xliff:g id="NAME">%s</xliff:g> ಪತ್ತೆಯಾಗಿದೆ"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ. ನೆಟ್ವರ್ಕ್ ನಿರ್ವಹಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಳ್ಳುತ್ತಿದೆ…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ಯಾವಾಗಲೂ-ಆನ್ VPN ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ಯಾವಾಗಲೂ-ಆನ್ VPN ದೋಷ"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="upload_file" msgid="2897957172366730416">"ಫೈಲ್ ಆಯ್ಕೆಮಾಡು"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ಯಾವುದೇ ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿಲ್ಲ"</string> <string name="reset" msgid="2448168080964209908">"ಮರುಹೊಂದಿಸು"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"ಸೂಚಿತ ಭಾಷೆ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕು"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"ಕೆಲಸದ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಇತರ ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅನುಮತಿಸಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 5b446b445a0f..e661c65b6bf9 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi가 인터넷에 연결되어 있지 않습니다."</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"탭하여 옵션 보기"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>(으)로 전환"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>이(가) 인터넷에 연결되지 않는 경우 기기에서 <xliff:g id="NEW_NETWORK">%1$s</xliff:g>을(를) 사용합니다. 요금이 부과될 수 있습니다."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>에서 <xliff:g id="NEW_NETWORK">%2$s</xliff:g>(으)로 전환"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"모바일 데이터"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"블루투스"</item> + <item msgid="5447331121797802871">"이더넷"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"알 수 없는 네트워크 유형"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi에 연결할 수 없습니다"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 인터넷 연결 상태가 좋지 않습니다."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"연결을 허용하시겠습니까?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"탭하여 언어와 레이아웃을 선택하세요."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"가능한 원인"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> 준비 중"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"오류 확인 중"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"새로운 <xliff:g id="NAME">%s</xliff:g> 감지됨"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>에 연결되어 있습니다. 네트워크를 관리하려면 누르세요."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"연결 유지 VPN에 연결하는 중…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"연결 유지 VPN에 연결됨"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"연결 유지 VPN 연결 해제됨"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"연결 유지 VPN 오류"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"설정하려면 탭하세요."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"탭하여 설정"</string> <string name="upload_file" msgid="2897957172366730416">"파일 선택"</string> <string name="no_file_chosen" msgid="6363648562170759465">"파일을 선택하지 않았습니다."</string> <string name="reset" msgid="2448168080964209908">"초기화"</string> @@ -1310,7 +1321,7 @@ <string name="action_menu_overflow_description" msgid="2295659037509008453">"옵션 더보기"</string> <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> - <string name="storage_internal" msgid="3570990907910199483">"내부 공유 저장공간"</string> + <string name="storage_internal" msgid="3570990907910199483">"내부 공유 저장용량"</string> <string name="storage_sd_card" msgid="3282948861378286745">"SD 카드"</string> <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD 카드"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"USB 드라이브"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"언어 이름 입력"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"추천"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"모든 언어"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"검색"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"직장 모드가 사용 중지됨"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"앱, 백그라운드 동기화 및 관련 기능을 포함한 직장 프로필이 작동하도록 허용"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 0f82dcbdffcf..6a0089f57486 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi тармагы Интернетке туташпай турат"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Параметрлерди ачуу үчүн таптап коюңуз"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> тармагына которуштурулду"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> тармагы Интернетке туташпай турганда, түзмөгүңүз <xliff:g id="NEW_NETWORK">%1$s</xliff:g> тармагын колдонот. Акы алынышы мүмкүн."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> дегенден <xliff:g id="NEW_NETWORK">%2$s</xliff:g> тармагына которуштурулду"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобилдик дайындар"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"белгисиз тармак түрү"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi менен туташуу түзүлбөдү"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" хотспотунун интернет байланышы начар."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Туташууга уруксатпы?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тил жана калып тандоо үчүн таптап коюңуз"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"талапкерлер"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> даярдалууда"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Каталар текшерилүүдө"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Жаңы <xliff:g id="NAME">%s</xliff:g> аныкталды"</string> @@ -1197,8 +1207,7 @@ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"Колдонмого орнотуу сеанстарын окуу мүмкүнчүлүгүн берет. Ушуну менен, ал жигердүү топтом орнотууларынын чоо-жайын көрө алат."</string> <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"орнотуу топтомдорун суроо"</string> <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"Колдонмо топтомдорду орнотууга уруксат сурай алат."</string> - <!-- no translation found for tutorial_double_tap_to_zoom_message_short (1311810005957319690) --> - <skip /> + <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Масштабдын параметрлерин өзгөртүү үчүн бул жерди эки жолу басыңыз."</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Виджетти кошуу мүмкүн болбоду."</string> <string name="ime_action_go" msgid="8320845651737369027">"Өтүү"</string> <string name="ime_action_search" msgid="658110271822807811">"Издөө"</string> @@ -1229,14 +1238,13 @@ <string name="notification_ranker_binding_label" msgid="774540592299064747">"Эскертмелердин маанилүүлүгүн баалоо кызматы"</string> <string name="vpn_title" msgid="19615213552042827">"VPN иштетилди"</string> <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> аркылуу жандырылды"</string> - <!-- no translation found for vpn_text (1610714069627824309) --> - <skip /> - <!-- no translation found for vpn_text_long (4907843483284977618) --> - <skip /> + <string name="vpn_text" msgid="1610714069627824309">"Тармактын параметрлерин өзгөртүү үчүн бул жерди басыңыз."</string> + <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> сеансына туташуу ишке ашты. Желенин параметрлерин өзгөртүү үчүн бул жерди басыңыз."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Дайым иштеген VPN туташууда…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Дайым иштеген VPN туташтырылды"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Дайым иштеген VPN ажыратылды"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Дайым иштеген VPN\'де ката кетти"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Конфигурациялоо үчүн таптап коюңуз"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Жөндөө үчүн таптаңыз"</string> <string name="upload_file" msgid="2897957172366730416">"Файл тандоо"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Эч файл тандалган жок"</string> <string name="reset" msgid="2448168080964209908">"Баштапкы абалга келтирүү"</string> @@ -1639,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Тилди киргизиңиз"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Сунушталган"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Бардык тилдер"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Издөө"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Жумуш режими ӨЧҮРҮЛГӨН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Жумуш профилин, ошондой эле колдонмолорду, фондо шайкештирүү жана ага байланыштуу функцияларды иштетиңиз."</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index e2720c7f75dd..38b447498aa7 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ບໍ່ມີການເຂົ້າເຖິງອິນເຕີເນັດ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ແຕະເພື່ອເບິ່ງຕົວເລືອກ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"ສະຫຼັບໄປໃຊ້ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ແລ້ວ"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"ອຸປະກອນຈະໃຊ້ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ເມື່ອ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ບໍ່ມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ. ອາດມີການຮຽກເກັບຄ່າບໍລິການ."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"ສະຫຼັບຈາກ <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ໄປໃຊ້ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ແລ້ວ"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ຂໍ້ມູນອິນເຕີເນັດມືຖື"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"ອີເທີເນັດ"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ບໍ່ຮູ້ຈັກປະເພດເຄືອຂ່າຍ"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ບໍ່ສາມາດເຊື່ອມຕໍ່ Wi-Fi ໄດ້"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ມີສັນຍານອິນເຕີເນັດທີ່ບໍ່ດີ."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"ອະນຸຍາດການເຊື່ອມຕໍ່ຫຼືບໍ່?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ແຕະເພື່ອເລືອກພາສາ ແລະ ໂຄງແປ້ນພິມ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ຕົວເລືອກ"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"ກຳລັງກຽມ <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ກຳລັງກວດຫາຂໍ້ຜິດພາດ"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ກວດພົບ <xliff:g id="NAME">%s</xliff:g> ໃໝ່ແລ້ວ"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"ເຊື່ອມຕໍ່ກັບ <xliff:g id="SESSION">%s</xliff:g> ແລ້ວ. ແຕະເພື່ອຈັດການເຄືອຂ່າຍ."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ກຳລັງເຊື່ອມຕໍ່ Always-on VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ເຊື່ອມຕໍ່ VPN ແບບເປີດຕະຫຼອດເວລາແລ້ວ"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ຕັດການເຊື່ອມຕໍ່ VPN ແບບເປີດໃຊ້ຕະຫຼອດເວລາແລ້ວ"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN ແບບເປີດຕະຫຼອດເກີດຄວາມຜິດພາດ"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ແຕະເພື່ອຕັ້ງຄ່າ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ແຕະເພື່ອຕັ້ງຄ່າ"</string> <string name="upload_file" msgid="2897957172366730416">"ເລືອກໄຟລ໌"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ບໍ່ໄດ້ເລືອກໄຟລ໌ເທື່ອ"</string> <string name="reset" msgid="2448168080964209908">"ຣີເຊັດ"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"ພິມຊື່ພາສາ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"ແນະນຳ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ທຸກພາສາ"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"ຄົ້ນຫາ"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"ໂໝດບ່ອນເຮັດວຽກປິດຢູ່"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ອະນຸຍາດໃຫ້ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກສາມາດນຳໃຊ້ໄດ້ ເຊິ່ງຮວມທັງແອັບ, ການຊິ້ງຂໍ້ມູນໃນພື້ນຫຼັງ ແລະ ຄຸນສົມບັດທີ່ກ່ຽວຂ້ອງ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index ab38c0caf2ca..0406ee1881cc 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"„Wi-Fi“ tinkle nėra interneto ryšio"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Palieskite, kad būtų rodomos parinktys."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Perjungta į tinklą <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Įrenginys naudoja tinklą <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kai tinkle <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nėra interneto ryšio. Gali būti taikomi mokesčiai."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Perjungta iš tinklo <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> į tinklą <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobiliojo ryšio duomenys"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Eternetas"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nežinomas tinklo tipas"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepavyko prisijungti prie „Wi-Fi“"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" turi prastą interneto ryšį."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Leisti prisijungti?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Palieskite, kad pasirinktumėte kalbą ir išdėstymą"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidatai"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ruošiama <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tikrinama, ar nėra klaidų"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Aptikta nauja <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Prisijungta prie <xliff:g id="SESSION">%s</xliff:g>. Jei norite valdyti tinklą, palieskite."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Prisijungiama prie visada įjungto VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Prisijungta prie visada įjungto VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Visada įjungtas VPN atjungtas"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Visada įjungto VPN klaida"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Palieskite, kad konfigūruotumėte"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Palieskite, kad nustatytumėte"</string> <string name="upload_file" msgid="2897957172366730416">"Pasirinkti failą"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nepasirinktas joks failas"</string> <string name="reset" msgid="2448168080964209908">"Atstatyti"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Įveskite kalbos pav."</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Siūloma"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Visos kalbos"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Visi regionai"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Paieška"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Darbo režimas išjungtas"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Leisti veikti darbo profiliui, įskaitant programas, sinchronizavimą fone ir susijusias funkcijas."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 35b699f8f9c3..44368fb4df12 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1101,6 +1101,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi tīklā nav piekļuves internetam."</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Pieskarieties, lai skatītu iespējas."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Pārslēdzās uz tīklu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Kad tīklā <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nav piekļuves internetam, ierīcē tiek izmantots tīkls <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Var tikt piemērota maksa."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Pārslēdzās no tīkla <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> uz tīklu <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilie dati"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nezināms tīkla veids"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nevarēja izveidot savienojumu ar Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ir slikts interneta savienojums."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vai atļaut savienojumu?"</string> @@ -1178,7 +1189,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Pieskarieties, lai atlasītu valodu un izkārtojumu"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidāti"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Notiek <xliff:g id="NAME">%s</xliff:g> sagatavošana"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Tiek meklētas kļūdas"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Tika atrasta jauna <xliff:g id="NAME">%s</xliff:g>."</string> @@ -1257,8 +1267,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Ir izveidots savienojums ar: <xliff:g id="SESSION">%s</xliff:g>. Pieskarieties, lai pārvaldītu tīklu."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Notiek savienojuma izveide ar vienmēr ieslēgtu VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Izveidots savienojums ar vienmēr ieslēgtu VPN."</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Vienmēr ieslēgts VPN ir atvienots"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kļūda saistībā ar vienmēr ieslēgtu VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Pieskarieties, lai konfigurētu."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Pieskarieties, lai iestatītu."</string> <string name="upload_file" msgid="2897957172366730416">"Izvēlēties failu"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Neviens fails nav izvēlēts"</string> <string name="reset" msgid="2448168080964209908">"Atiestatīt"</string> @@ -1672,6 +1683,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Ierakstiet valodas nosaukumu"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ieteiktās"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Visas valodas"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Visi reģioni"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Meklēt"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Darba režīms IZSLĒGTS"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Atļaujiet darboties darba profilam, tostarp lietotnēm, sinhronizācijai fonā un saistītajām funkcijām."</string> diff --git a/core/res/res/values-mcc001/config.xml b/core/res/res/values-mcc001/config.xml new file mode 100644 index 000000000000..93cde03ba6a0 --- /dev/null +++ b/core/res/res/values-mcc001/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2016, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <bool name="config_use_sim_language_file">true</bool> +</resources> diff --git a/core/res/res/values-mcc222-mnc10/config.xml b/core/res/res/values-mcc222-mnc10/config.xml index cd6e8c6f46c2..c819de2ba43c 100644 --- a/core/res/res/values-mcc222-mnc10/config.xml +++ b/core/res/res/values-mcc222-mnc10/config.xml @@ -28,29 +28,4 @@ <string-array translatable="false" name="config_tether_apndata"> <item>Tethering Internet,web.omnitel.it,,,,,,,,,222,10,,DUN</item> </string-array> - - <string-array translatable="false" name="config_operatorConsideredNonRoaming"> - <item>21401</item> - <item>21402</item> - <item>21403</item> - <item>21404</item> - <item>21405</item> - <item>21406</item> - <item>21407</item> - <item>21408</item> - <item>21409</item> - <item>21410</item> - <item>21411</item> - <item>21412</item> - <item>21413</item> - <item>21414</item> - <item>21415</item> - <item>21416</item> - <item>21417</item> - <item>21418</item> - <item>21419</item> - <item>21420</item> - <item>21421</item> - </string-array> - </resources> diff --git a/core/res/res/values-mcc232-mnc10/config.xml b/core/res/res/values-mcc232-mnc10/config.xml new file mode 100644 index 000000000000..bdf83016d18e --- /dev/null +++ b/core/res/res/values-mcc232-mnc10/config.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, The Android Open Source Project + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>23203</item> + <item>23205</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc232-mnc13/config.xml b/core/res/res/values-mcc232-mnc13/config.xml new file mode 100644 index 000000000000..2c14f87374f6 --- /dev/null +++ b/core/res/res/values-mcc232-mnc13/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, The Android Open Source Project + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>23203</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc500/config.xml b/core/res/res/values-mcc302-mnc500/config.xml new file mode 100644 index 000000000000..77f64199a80b --- /dev/null +++ b/core/res/res/values-mcc302-mnc500/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, The Android Open Source Project + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>302</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc510/config.xml b/core/res/res/values-mcc302-mnc510/config.xml new file mode 100644 index 000000000000..77f64199a80b --- /dev/null +++ b/core/res/res/values-mcc302-mnc510/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + ** Copyright 2016, The Android Open Source Project + ** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** + ** http://www.apache.org/licenses/LICENSE-2.0 + ** + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + */ +--> + +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <!-- Don't use roaming icon for considered operators --> + <string-array translatable="false" name="config_operatorConsideredNonRoaming"> + <item>302</item> + </string-array> +</resources> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index e0ec16a0de9b..102c7a007a88 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi нема пристап на интернет"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Допрете за опции"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Префрлено на <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Уредот користи <xliff:g id="NEW_NETWORK">%1$s</xliff:g> кога <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> нема пристап до интернет. Може да се наплатат трошоци."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Префрлено од <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобилен интернет"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Етернет"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"непознат тип мрежа"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не можеше да се поврзе со Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има слаба конекција на интернет."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Дозволете поврзување?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Допрете за избирање јазик и распоред"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Се подготвува <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Се проверува за грешки"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Откриена е нова <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Поврзани сте на <xliff:g id="SESSION">%s</xliff:g>. Допрете за да управувате со мрежата."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Поврзување со секогаш вклучена VPN..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Поврзани со секогаш вклучена VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Секогаш вклучената VPN е неповрзана"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка на секогаш вклучена VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Допрете за конфигурирање"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Допрете за да поставите"</string> <string name="upload_file" msgid="2897957172366730416">"Избери датотека"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Не е избрана датотека"</string> <string name="reset" msgid="2448168080964209908">"Ресетирај"</string> @@ -1638,6 +1649,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Внеси име на јазик"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Сите јазици"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Сите региони"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Пребарај"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Режимот на работа е ИСКЛУЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Дозволете работниот профил да функционира, вклучувајќи ги апликациите, синхронизирањето во заднина и други поврзани функции."</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 39d493a6ea5b..a4d3fabc6dbb 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi-യിൽ ഇന്റർനെറ്റ് ആക്സസ് ഇല്ല."</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> എന്നതിലേക്ക് മാറി"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> നെറ്റ്വർക്കിന് ഇന്റർനെറ്റ് ആക്സസ്സ് ഇല്ലാത്തപ്പോൾ ഉപകരണം <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ഉപയോഗിക്കുന്നു. നിരക്കുകൾ ബാധകമായേക്കാം."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> നെറ്റ്വർക്കിൽ നിന്ന് <xliff:g id="NEW_NETWORK">%2$s</xliff:g> നെറ്റ്വർക്കിലേക്ക് മാറി"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"സെല്ലുലാർ ഡാറ്റ"</item> + <item msgid="75483255295529161">"വൈഫൈ"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"ഇതര്നെറ്റ്"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"തിരിച്ചറിയാനാകാത്ത ഒരു നെറ്റ്വർക്ക് തരം"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-ലേക്ക് കണക്റ്റുചെയ്യാൻ കഴിഞ്ഞില്ല"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" മോശം ഇന്റർനെറ്റ് കണക്ഷനാണുള്ളത്."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"കണക്ഷൻ അനുവദിക്കണോ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ഭാഷയും ലേഔട്ടും തിരഞ്ഞെടുക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"കാൻഡിഡേറ്റുകൾ"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> തയ്യാറാകുന്നു"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"പിശകുകളുണ്ടോയെന്നു പരിശോധിക്കുന്നു"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"പുതിയ <xliff:g id="NAME">%s</xliff:g> എന്നതിനെ തിരിച്ചറിഞ്ഞു"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> എന്ന സെഷനിലേക്ക് കണക്റ്റുചെയ്തു. നെറ്റ്വർക്ക് മാനേജുചെയ്യാൻ ടാപ്പുചെയ്യുക."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്യുന്നു…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN കണക്റ്റുചെയ്തു"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"\'എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN\' വിച്ഛേദിച്ചു"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"എല്ലായ്പ്പോഴും ഓണായിരിക്കുന്ന VPN പിശക്"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"കോൺഫിഗർ ചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"സജ്ജമാക്കാൻ ടാപ്പുചെയ്യുക"</string> <string name="upload_file" msgid="2897957172366730416">"ഫയല് തിരഞ്ഞെടുക്കുക"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ഫയലൊന്നും തിരഞ്ഞെടുത്തില്ല"</string> <string name="reset" msgid="2448168080964209908">"പുനഃസജ്ജമാക്കുക"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"ഭാഷയുടെ പേര് ടൈപ്പുചെയ്യുക"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"നിര്ദ്ദേശിച്ചത്"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"എല്ലാ ഭാഷകളും"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"തിരയുക"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"ഔദ്യോഗിക മോഡ് ഓഫാണ്"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ആപ്സും, പശ്ചാത്തല സമന്വയവും ബന്ധപ്പെട്ട ഫീച്ചറുകളും ഉൾപ്പെടെ, ഔദ്യോഗിക പ്രൊഫൈലിനെ പ്രവർത്തിക്കാൻ അനുവദിക്കുക."</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 5f384a17f3d0..1e8c39ca002a 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi-д интернет холболт байхгүй байна"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Сонголт хийхийн тулд товшино уу"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> руу шилжүүлсэн"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> интернэт холболтгүй үед төхөөрөмж <xliff:g id="NEW_NETWORK">%1$s</xliff:g>-г ашигладаг. Төлбөр гарч болзошгүй."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>-с <xliff:g id="NEW_NETWORK">%2$s</xliff:g> руу шилжүүлсэн"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобайл дата"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Этернэт"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"сүлжээний тодорхойгүй төрөл"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi-д холбогдож чадсангүй"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" Интернет холболт муу байна."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Холболтыг зөвшөөрөх үү?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Хэл болон бүдүүвчийг сонгохын тулд дарна уу"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"нэр дэвшигч"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>-ыг бэлдэж байна"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Алдааг шалгаж байна"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Шинэ <xliff:g id="NAME">%s</xliff:g> илэрлээ"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>-д холбогдов. Сүлжээг удирдах бол товшино уу."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Байнгын VPN-д холбогдож байна..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Байнга VPN холбоотой"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Тогтмол асаалттай VPN салсан"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Байнгын VPN алдаа"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Тохируулахын тулд товшино уу"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Тохируулахын тулд товшино уу"</string> <string name="upload_file" msgid="2897957172366730416">"Файл сонгох"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Сонгосон файл байхгүй"</string> <string name="reset" msgid="2448168080964209908">"Бүгдийг цэвэрлэх"</string> @@ -1634,6 +1645,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Улсын хэлийг бичнэ үү"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Санал болгосон"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Бүх хэл"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Бүх бүс нутаг"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Хайх"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Ажлын горимыг УНТРААСАН байна"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ажлын профайлд апп, дэвсгэр синхрончлол болон бусад холбоотой тохиргоог ажиллахыг зөвшөөрнө үү."</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 36d6f6a45336..8dc710e75cc5 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"वाय-फाय मध्ये इंटरनेट प्रवेश नाही"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"पर्यायांसाठी टॅप करा"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> वर स्विच केले"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> कडे इंटरनेट प्रवेश नसताना डिव्हाइस <xliff:g id="NEW_NETWORK">%1$s</xliff:g> वापरतो. शुल्क लागू शकतील."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> वरून <xliff:g id="NEW_NETWORK">%2$s</xliff:g> वर स्विच केले"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"मोबाइल डेटा"</item> + <item msgid="75483255295529161">"वाय-फाय"</item> + <item msgid="6862614801537202646">"ब्लूटुथ"</item> + <item msgid="5447331121797802871">"इथरनेट"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"अज्ञात नेटवर्क प्रकार"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाय-फाय ला कनेक्ट करू शकलो नाही"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" खराब इंटरनेट कनेक्शन आहे."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"कनेक्शनला अनुमती द्यायची?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा आणि लेआउट निवडण्यासाठी टॅप करा"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"उमेदवार"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> तयार करीत आहे"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटींसाठी तपासत आहे"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नवीन <xliff:g id="NAME">%s</xliff:g> आढळले"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> शी कनेक्ट केले. नेटवर्क व्यवस्थापित करण्यासाठी टॅप करा."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN कनेक्ट करणे नेहमी-चालू…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN कनेक्ट केलेले नेहमी-चालू"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"नेहमी-चालू असलेले VPN डिस्कनेक्ट केले"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"VPN त्रुटी नेहमी-चालू"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"कॉन्फिगर करण्यासाठी टॅप करा"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"सेट करण्यासाठी टॅप करा"</string> <string name="upload_file" msgid="2897957172366730416">"फाईल निवडा"</string> <string name="no_file_chosen" msgid="6363648562170759465">"फाईल निवडली नाही"</string> <string name="reset" msgid="2448168080964209908">"रीसेट करा"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"भाषा नाव टाइप करा"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"सूचित केलेले"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"सर्व भाषा"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"सर्व प्रदेश"</string> <string name="locale_search_menu" msgid="2560710726687249178">"शोध"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बंद आहे"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"कार्य प्रोफाइलला अॅप्स, पार्श्वभूमी संकालन आणि संबंधित वैशिष्ट्यांच्या समावेशासह कार्य करण्याची परवानगी द्या."</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 7db5c7473fb8..6050c9acb659 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi tiada akses Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Ketik untuk mendapatkan pilihan"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Beralih kepada <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Peranti menggunakan <xliff:g id="NEW_NETWORK">%1$s</xliff:g> apabila <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tiada akses Internet. Bayaran mungkin dikenakan."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Beralih daripada <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> kepada <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"data selular"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"jenis rangkaian tidak diketahui"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Tidak boleh menyambung kepada Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" mempunyai sambungan internet yang kurang baik."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Benarkan sambungan?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketik untuk memilih bahasa dan susun atur"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Menyediakan <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Menyemak untuk mengesan ralat"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> baharu dikesan"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Bersambung kepada <xliff:g id="SESSION">%s</xliff:g>. Ketik untuk mengurus rangkaian."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sentiasa hidup sedang disambungkan..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sentiasa hidup telah disambungkan"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN sentiasa hidup diputuskan sambungannya"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ralat VPN sentiasa hidup"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Ketik untuk membuat konfigurasi"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Ketik untuk menyediakan"</string> <string name="upload_file" msgid="2897957172366730416">"Pilih fail"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Tiada fail dipilih"</string> <string name="reset" msgid="2448168080964209908">"Tetapkan semula"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Taipkan nama bahasa"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Dicadangkan"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Cari"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Mod kerja DIMATIKAN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Benarkan profil kerja berfungsi, termasuk apl, penyegerakan latar belakang dan ciri yang berkaitan."</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 077b88967d19..3ed76a91ba20 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"ဝိုင်-ဖို်ငတွင် အင်တာနက် ဝင်ရောက်သုံးခွင့် မရှိပါ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"အခြားရွေးချယ်စရာများကိုကြည့်ရန် တို့ပါ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> သို့ ပြောင်းလိုက်ပြီ"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"စက်ပစ္စည်းသည် <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ဖြင့် အင်တာနက် အသုံးမပြုနိုင်သည့်အချိန်တွင် <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ကို သုံးပါသည်။ ဒေတာသုံးစွဲခ ကျသင့်နိုင်ပါသည်။"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> မှ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> သို့ ပြောင်းလိုက်ပြီ"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ဆယ်လူလာဒေတာ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"ဘလူးတုသ်"</item> + <item msgid="5447331121797802871">"အီသာနက်"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"အမည်မသိကွန်ရက်အမျိုးအစား"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ဝိုင်ဖိုင်ကိုချိတ်ဆက်မရပါ"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" အင်တာနက် ဆက်သွယ်မှု ကောင်းကောင်းမရှိပါ"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"ချိတ်ဆက်မှုကို ခွင့်ပြုမလား?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ရွေးချယ်ခံမည့်သူ"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ပြင်ဆင်နေသည်"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"အမှားအယွင်းများ စစ်ဆေးနေသည်"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> အသစ်တွေ့ရှိပါသည်"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> သို့ ချိတ်ဆက်ထားသည်။ ကွန်ရက်ကို စီမံခန့်ခွဲရန် တို့ပါ။"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်နေစဉ်…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"အမြဲတမ်းဖွင့်ထား VPN ဆက်သွယ်မှုရှိ"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"အမြဲတမ်းဖွင့်ထားရသော VPN ပြတ်တောက်နေသည်"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"အမြဲတမ်းဖွင့်ထား VPN အမှား"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ပြင်ဆင်သတ်မှတ်ရန် တို့ပါ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ပြင်ဆင်သတ်မှတ်ရန် တို့ပါ"</string> <string name="upload_file" msgid="2897957172366730416">"ဖိုင်ရွေးချယ်ရန်"</string> <string name="no_file_chosen" msgid="6363648562170759465">"မည်သည့်ဖိုင်ကိုမှမရွေးပါ"</string> <string name="reset" msgid="2448168080964209908">"ပြန်လည်သတ်မှတ်ရန်"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"ဘာသာစကားအမည် ထည့်ပါ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"အကြံပြုထားသော"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ဘာသာစကားများအားလုံး"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"ဒေသအားလုံး"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ရှာဖွေရန်"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"အလုပ်မုဒ် ပိတ်ထားသည်"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"အက်ပ်များ၊ နောက်ခံစင့်ခ်လုပ်ခြင်း၊ နှင့်သက်ဆိုင်သည့်အင်္ဂါရပ်များကို ဆောင်ရွက်ရန် အလုပ်ပရိုဖိုင်ကိုခွင့်ပြုပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c9b275c1f7d4..55b226036844 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi har ikke Internett-tilgang"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trykk for å få alternativer"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Byttet til <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Enheten bruker <xliff:g id="NEW_NETWORK">%1$s</xliff:g> når <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ikke har Internett-tilgang. Avgifter kan påløpe."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Byttet fra <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> til <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobildata"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"en ukjent nettverkstype"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kan ikke koble til Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dårlig Internett-tilkobling."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vil du tillat tilkoblingen?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trykk for å velge språk og layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string> - <string name="candidates_style" msgid="4333913089637062257">"TAG_FONT"<u>"kandidater"</u>"CLOSE_FONT"</string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Forbereder <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sjekker for feil"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> ble oppdaget"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Koblet til <xliff:g id="SESSION">%s</xliff:g>. Trykk for å administrere nettverket."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Alltid-på VPN kobler til ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Alltid-på VPN er tilkoblet"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Alltid på-VPN er frakoblet"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alltid-på VPN-feil"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Trykk for å konfigurere"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Trykk for å konfigurere"</string> <string name="upload_file" msgid="2897957172366730416">"Velg fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string> <string name="reset" msgid="2448168080964209908">"Tilbakestill"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Skriv inn språknavn"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Foreslått"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle språk"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Alle områder"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Søk"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Jobbmodus er AV"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Slå på jobbprofilen, inkludert apper, synkronisering i bakgrunnen og relaterte funksjoner."</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index a0dcfeb89440..c0d44737b9c1 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -1082,6 +1082,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi मा इन्टरनेट पहुँच छैन"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"विकल्पहरूका लागि ट्याप गर्नुहोस्"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> मा बदल्नुहोस्"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> मा इन्टरनेट माथिको पहुँच नहुँदा यन्त्रले <xliff:g id="NEW_NETWORK">%1$s</xliff:g> को प्रयोग गर्दछ। शुल्कहरू लागू हुन सक्छन्।"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> बाट <xliff:g id="NEW_NETWORK">%2$s</xliff:g> मा परिवर्तन गरियो"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"सेलुलर डेटा"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"ब्लुटुथ"</item> + <item msgid="5447331121797802871">"इथरनेट"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"नेटवर्कको कुनै अज्ञात प्रकार"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"वाइ-फाइसँग जडान गर्न सकेन"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" कमजोर इन्टरनेट जडान छ।"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"जडान अनुमति दिने हो?"</string> @@ -1159,7 +1170,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा र लेआउट चयन गर्न ट्याप गर्नुहोस्"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"उम्मेदवार"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"तयारी गर्दै <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"त्रुटिहरूको लागि जाँच गर्दै"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"नयाँ <xliff:g id="NAME">%s</xliff:g> भेटियो"</string> @@ -1238,8 +1248,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>सँग जोडिएको। नेटवर्क प्रबन्ध गर्न हान्नुहोस्।"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN जडान सधै जोड्दै…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"सधैँ खुल्ला हुने VPN जोडिएको"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"सधैँ-सक्रिय VPN लाई विच्छेद गरियो"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"सधैँ भरि VPN त्रुटिमा"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"कन्फिगर गर्न ट्याप गर्नुहोस्"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"सेट अप गर्न ट्याप गर्नुहोस्"</string> <string name="upload_file" msgid="2897957172366730416">"फाइल छान्नुहोस्"</string> <string name="no_file_chosen" msgid="6363648562170759465">"कुनै फाइल छानिएको छैन"</string> <string name="reset" msgid="2448168080964209908">"पुनःसेट गर्नु"</string> @@ -1642,6 +1653,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"भाषाको नाम टाइप गर्नुहोस्"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"सुझाव दिइयो"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"सम्पूर्ण भाषाहरू"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"सबै क्षेत्रहरू"</string> <string name="locale_search_menu" msgid="2560710726687249178">"खोज"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"कार्य मोड बन्द छ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"अनुप्रयोग, पृष्ठभूमि सिंक र सम्बन्धित विशेषताहरू सहित, कार्य प्रोफाइललाई कार्य गर्न अनुमति दिनुहोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index d7f10d3f1d17..183d8668d575 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wifi-netwerk heeft geen internettoegang"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tik voor opties"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Overgeschakeld naar <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Apparaat gebruikt <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wanneer <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> geen internetverbinding heeft. Er kunnen kosten in rekening worden gebracht."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Overgeschakeld van <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> naar <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobiele data"</item> + <item msgid="75483255295529161">"Wifi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"een onbekend netwerktype"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kan geen verbinding maken met wifi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" heeft een slechte internetverbinding."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Verbinding toestaan?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om een taal en indeling te selecteren"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidaten"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> voorbereiden"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Controleren op fouten"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nieuwe <xliff:g id="NAME">%s</xliff:g> gedetecteerd"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Verbonden met <xliff:g id="SESSION">%s</xliff:g>. Tik om het netwerk te beheren."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN-verbinding maken…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN-verbinding"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Always-on VPN-verbinding ontkoppeld"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fout met Always-on VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tik om te configureren"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tik om in te stellen"</string> <string name="upload_file" msgid="2897957172366730416">"Bestand kiezen"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Geen bestand geselecteerd"</string> <string name="reset" msgid="2448168080964209908">"Resetten"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Typ een taalnaam"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Voorgesteld"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alle talen"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Alle regio\'s"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Zoeken"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Werkmodus is UIT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Functioneren van werkprofiel toestaan, waaronder apps, synchronisatie op de achtergrond en gerelateerde functies."</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index e717e697f178..210ef8b48f85 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ਦੀ ਕੋਈ ਇੰਟਰਨੈਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"ਬਦਲਕੇ <xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ਲਿਆਂਦਾ ਗਿਆ"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ਦੀ ਇੰਟਰਨੈੱਟ \'ਤੇ ਪਹੁੰਚ ਨਾ ਹੋਣ \'ਤੇ ਡੀਵਾਈਸ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ।"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ਤੋਂ ਬਦਲਕੇ <xliff:g id="NEW_NETWORK">%2$s</xliff:g> \'ਤੇ ਕੀਤਾ ਗਿਆ"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"ਸੈਲਿਊਲਰ ਡੈਟਾ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"ਬਲੂਟੁੱਥ"</item> + <item msgid="5447331121797802871">"ਈਥਰਨੈੱਟ"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ਇੱਕ ਅਗਿਆਤ ਨੈੱਟਵਰਕ ਕਿਸਮ"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕਰ ਸਕਿਆ"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ਇਸਦਾ ਇੱਕ ਖ਼ਰਾਬ ਇੰਟਰਨੈਟ ਕਨੈਕਸ਼ਨ ਹੈ।"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"ਕੀ ਕਨੈਕਸ਼ਨ ਦੀ ਆਗਿਆ ਦੇਣੀ ਹੈ?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ਉਮੀਦਵਾਰ"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> ਤਿਆਰ ਹੋ ਰਿਹਾ ਹੈ"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"ਤਰੁੱਟੀਆਂ ਦੀ ਜਾਂਚ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ਨਵੇਂ <xliff:g id="NAME">%s</xliff:g> ਦਾ ਪਤਾ ਲਗਾਇਆ ਗਿਆ"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ। ਨੈੱਟਵਰਕ ਦੇ ਪ੍ਰਬੰਧਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਕਨੈਕਟ ਕੀਤਾ"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਡਿਸਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ਹਮੇਸ਼ਾਂ-ਚਾਲੂ VPN ਅਸ਼ੁੱਧੀ"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"ਸੰਰੂਪਣ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"ਸਥਾਪਤ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="upload_file" msgid="2897957172366730416">"ਫਾਈਲ ਚੁਣੋ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਚੁਣੀ ਗਈ"</string> <string name="reset" msgid="2448168080964209908">"ਰੀਸੈੱਟ ਕਰੋ"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"ਭਾਸ਼ਾ ਨਾਮ ਟਾਈਪ ਕਰੋ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"ਸੁਝਾਈਆਂ ਗਈਆਂ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"ਸਾਰੇ ਖੇਤਰ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜ"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"ਕੰਮ ਮੋਡ ਬੰਦ ਹੈ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ਐਪਾਂ, ਬੈਕਗ੍ਰਾਊਂਡ ਸਮਕਾਲੀਕਰਨ, ਅਤੇ ਸਬੰਧਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਮਲ ਕਰਦੇ ਹੋਏ ਕੰਮ ਪ੍ਰੋਫਾਈਲ ਨੂੰ ਕੰਮ ਕਰਨ ਦੀ ਮਨਜ਼ੂਰੀ ਦਿਓ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index d9e63a626d31..e8167085c8da 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Sieć Wi-Fi nie ma dostępu do internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Kliknij, by wyświetlić opcje"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Zmieniono na połączenie typu <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Urządzenie korzysta z połączenia typu <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, gdy <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nie dostępu do internetu. Mogą zostać naliczone opłaty."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Przełączono z połączenia typu <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na <xliff:g id="NEW_NETWORK">%2$s</xliff:g>."</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"komórkowa transmisja danych"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"nieznany typ sieci"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nie można połączyć się z siecią Wi-Fi."</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ma powolne połączenie internetowe."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Zezwolić na połączenie?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Kliknij, by wybrać język i układ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandydaci"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Przygotowuję: <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sprawdzanie w poszukiwaniu błędów"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Wykryto nowy nośnik: <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Nawiązano połączenie: <xliff:g id="SESSION">%s</xliff:g>. Dotknij, aby zarządzać siecią."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Łączę ze stałą siecią VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Połączono ze stałą siecią VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Rozłączono ze stałą siecią VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Błąd stałej sieci VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Kliknij, by skonfigurować"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Kliknij, by skonfigurować"</string> <string name="upload_file" msgid="2897957172366730416">"Wybierz plik"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nie wybrano pliku"</string> <string name="reset" msgid="2448168080964209908">"Resetuj"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Wpisz nazwę języka"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugerowane"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Wszystkie języki"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Wszystkie kraje"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Szukaj"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Tryb pracy jest WYŁĄCZONY"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Włącz profil do pracy, w tym aplikacje, synchronizację w tle i inne funkcje."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index eaaad25c91d8..ae8c7e1916ce 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"O Wi-Fi não tem acesso à Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Alternado para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"O dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Cobranças podem ser aplicadas."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Alternado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"dados da rede celular"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"um tipo de rede desconhecido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível se conectar a redes Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma conexão de baixa qualidade com a Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir conexão?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectado a <xliff:g id="SESSION">%s</xliff:g>. Toque para gerenciar a rede."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN sempre ativa desconectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre ativa"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toque para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Toque para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string> <string name="reset" msgid="2448168080964209908">"Redefinir"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Digitar nome do idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index ae115d877588..c8d7e4ed8e4b 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"O Wi-Fi não tem acesso à Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para obter mais opções"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Mudou para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"O dispositivo utiliza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Podem ser aplicados custos."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Mudou de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"dados móveis"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"um tipo de rede desconhecido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível ligar a Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma ligação à internet fraca."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir ligação?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o esquema"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"A preparar o <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"A verificar a presença de erros"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detetado"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Ligado a <xliff:g id="SESSION">%s</xliff:g>. Toque para gerir a rede."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"A ligar VPN sempre ativa..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa ligada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN sempre ativa desligada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro da VPN sempre ativa"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toque para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tocar para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Escolher ficheiro"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Não foi selecionado nenhum ficheiro"</string> <string name="reset" msgid="2448168080964209908">"Repor"</string> @@ -1310,7 +1321,7 @@ <string name="action_menu_overflow_description" msgid="2295659037509008453">"Mais opções"</string> <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> - <string name="storage_internal" msgid="3570990907910199483">"Armazenamento interno partilhado"</string> + <string name="storage_internal" msgid="3570990907910199483">"Armazen. interno partilhado"</string> <string name="storage_sd_card" msgid="3282948861378286745">"Cartão SD"</string> <string name="storage_sd_card_label" msgid="6347111320774379257">"Cartão SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"Unidade USB"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Intr. nome do idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Todas as regiões"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir o funcionamento do perfil de trabalho, incluindo as aplicações, a sincronização em segundo plano e as funcionalidades relacionadas."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index eaaad25c91d8..ae8c7e1916ce 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"O Wi-Fi não tem acesso à Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toque para ver opções"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Alternado para <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"O dispositivo usa <xliff:g id="NEW_NETWORK">%1$s</xliff:g> quando <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> não tem acesso à Internet. Cobranças podem ser aplicadas."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Alternado de <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> para <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"dados da rede celular"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"um tipo de rede desconhecido"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Não foi possível se conectar a redes Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tem uma conexão de baixa qualidade com a Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permitir conexão?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Preparando <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Procurando erros"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Novo <xliff:g id="NAME">%s</xliff:g> detectado"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectado a <xliff:g id="SESSION">%s</xliff:g>. Toque para gerenciar a rede."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"VPN sempre ativa desconectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre ativa"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Toque para configurar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Toque para configurar"</string> <string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string> <string name="reset" msgid="2448168080964209908">"Redefinir"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Digitar nome do idioma"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modo de trabalho DESATIVADO"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permitir que o perfil de trabalho funcione, incluindo apps, sincronização em segundo plano e recursos relacionados"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 6198f126379f..c3c0d61c7cbb 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1101,6 +1101,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Rețeaua Wi-Fi nu are acces la internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Atingeți pentru opțiuni"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"S-a comutat la <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Dispozitivul folosește <xliff:g id="NEW_NETWORK">%1$s</xliff:g> când <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nu are acces la internet. Se pot aplica taxe."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"S-a comutat de la <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> la <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"date mobile"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"un tip de rețea necunoscut"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nu se poate conecta la Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" are o conexiune la internet slabă."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Permiteți conectarea?"</string> @@ -1178,7 +1189,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Atingeți pentru a selecta limba și aspectul"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"candidați"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Se pregătește <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Se verifică dacă există erori"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"A fost detectat un nou <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1257,8 +1267,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Conectat la <xliff:g id="SESSION">%s</xliff:g>. Apăsați pentru a gestiona rețeaua."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Se efectuează conectarea la rețeaua VPN activată permanent…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Conectat(ă) la rețeaua VPN activată permanent"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Rețeaua VPN activată permanent a fost deconectată"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Eroare de rețea VPN activată permanent"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Atingeți ca să configurați"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Atingeți pentru a configura"</string> <string name="upload_file" msgid="2897957172366730416">"Alegeți un fișier"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nu au fost găsite fișiere"</string> <string name="reset" msgid="2448168080964209908">"Resetați"</string> @@ -1672,6 +1683,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Numele limbii"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugerate"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Toate limbile"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Toate regiunile"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Căutați"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modul de serviciu e DEZACTIVAT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Permiteți profilului de serviciu să funcționeze, inclusiv aplicațiile, sincronizarea în fundal și funcțiile asociate."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0ef96afb1219..5ca96e91c775 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Сеть Wi-Fi не подключена к Интернету"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Нажмите, чтобы показать варианты."</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Новое подключение: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Устройство использует <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, если подключение к сети <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> недоступно. Может взиматься плата за передачу данных."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Устройство отключено от сети <xliff:g id="NEW_NETWORK">%2$s</xliff:g> и теперь использует <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобильные данные"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"неизвестный тип сети"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не удалось подключиться к сети Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" – плохое интернет-соединение."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Разрешить подключение?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Нажмите, чтобы выбрать язык и раскладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"варианты"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Подготовка карты \"<xliff:g id="NAME">%s</xliff:g>\"…"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Поиск ошибок"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Обнаружена новая карта \"<xliff:g id="NAME">%s</xliff:g>\""</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Подключено: \"<xliff:g id="SESSION">%s</xliff:g>\". Нажмите здесь, чтобы изменить настройки сети."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Подключение…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Подключено"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Отключено"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ошибка"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Нажмите, чтобы настроить."</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Нажмите, чтобы настроить"</string> <string name="upload_file" msgid="2897957172366730416">"Выбрать файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Не выбран файл"</string> <string name="reset" msgid="2448168080964209908">"Сбросить"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Введите язык"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Рекомендуемые"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Все языки"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Все регионы"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Поиск"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Рабочий режим отключен"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Включить рабочий профиль: приложения, фоновую синхронизацию и связанные функции."</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 4f90b57d8997..8eabd5b16502 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -1078,6 +1078,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi හට අන්තර්ජාල ප්රවේශය නැත"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"විකල්ප සඳහා තට්ටු කරන්න"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> වෙත මාරු විය"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"උපාංගය <xliff:g id="NEW_NETWORK">%1$s</xliff:g> <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> සඳහා අන්තර්ජාල ප්රවේශය නැති විට භාවිත කරයි. ගාස්තු අදාළ විය හැකිය."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> සිට <xliff:g id="NEW_NETWORK">%2$s</xliff:g> වෙත මාරු විය"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"සෙලියුලර් දත්ත"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"බ්ලූටූත්"</item> + <item msgid="5447331121797802871">"ඊතර්නෙට්"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"නොදන්නා ජාල වර්ගයකි"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi වෙත සම්බන්ධ විය නොහැක"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" දුබල අන්තර්ජාල සම්බන්ධතාවයක් ඇත."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"සම්බන්ධතාවයට ඉඩ දෙන්නද?"</string> @@ -1155,7 +1166,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"භාෂාව හා පිරිසැලසුම තේරීමට තට්ටු කරන්න"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"අපේක්ෂකයන්"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> සූදානම් කරමින්"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"වැරදි සඳහා පරීක්ෂා කරමින්"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"නව <xliff:g id="NAME">%s</xliff:g> අනාවරණය කරන ලදි"</string> @@ -1234,8 +1244,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> වෙත සම්බන්ධිතයි. ජාලය කළමනාකරණය කිරීමට තට්ටු කරන්න."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"සැමවිටම VPN සම්බන්ධ වෙමින්…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"නිරතුරුවම VPN සම්බන්ධ කර ඇත"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"සැමවිට ක්රියාත්මක VPN විසන්ධි කරන ලදී"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"සැමවිට සක්රිය VPN දෝෂය"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"වින්යාස කිරීමට තට්ටු කරන්න"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"පිහිටුවීමට තට්ටු කරන්න"</string> <string name="upload_file" msgid="2897957172366730416">"ගොනුව තෝරන්න"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ගොනුවක් තෝරාගෙන නැත"</string> <string name="reset" msgid="2448168080964209908">"යළි පිහිටුවන්න"</string> @@ -1638,6 +1649,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"භාෂා නම ටයිප් කරන්න"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"යෝජිත"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"සියලු භාෂා"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"සියලු ප්රදේශ"</string> <string name="locale_search_menu" msgid="2560710726687249178">"සෙවීම"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"වැඩ ප්රකාරය ක්රියාවිරහිතයි"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"යෙදුම්, පසුබිම සමමුහුර්ත කිරීම, සහ සම්බන්ධිත විශේෂාංග ඇතුළුව, ක්රියා කිරීමට කාර්යාල පැතිකඩට ඉඩ දෙන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 0a4869327367..eca85e571add 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Sieť Wi-Fi nemá prístup k internetu"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Klepnutím získate možnosti"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Prepnuté na sieť: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Keď sieť <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nemá prístup k internetu, zariadenie používa sieť <xliff:g id="NEW_NETWORK">%1$s</xliff:g>. Môžu sa účtovať poplatky."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Prepnuté zo siete <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na sieť <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobilné dáta"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"neznámy typ siete"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nepodarilo sa pripojiť k sieti Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" má nekvalitné internetové pripojenie."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Povoliť pripojenie?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozloženie"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidáti"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravuje sa úložisko <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Prebieha kontrola chýb"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Bolo zistené nové úložisko <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Pripojené k relácii <xliff:g id="SESSION">%s</xliff:g>. Po klepnutí môžete sieť spravovať."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Pripájanie k vždy zapnutej sieti VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Pripojenie k vždy zapnutej sieti VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Vždy zapnutá sieť VPN bola odpojená"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba vždy zapnutej siete VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Klepnutím spustíte konfiguráciu"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Klepnutím prejdete do Nastavení"</string> <string name="upload_file" msgid="2897957172366730416">"Zvoliť súbor"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nie je vybratý žiadny súbor"</string> <string name="reset" msgid="2448168080964209908">"Obnoviť"</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Zadajte názov jazyka"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Navrhované"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Všetky jazyky"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Všetky regióny"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Vyhľadávanie"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Pracovný režim je VYPNUTÝ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Povoľte fungovanie pracovného profilu vrátane aplikácií, synchronizácie na pozadí a súvisiacich funkcií."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 7b8a03aa19ab..ee2dd5cd77e4 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Omrežje Wi-Fi nima dostopa do interneta"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Dotaknite se za možnosti"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Preklopljeno na omrežje vrste <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Naprava uporabi omrežje vrste <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, ko omrežje vrste <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nima dostopa do interneta. Prenos podatkov se lahko zaračuna posebej."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Preklopljeno z omrežja vrste <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na omrežje vrste <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"prenos podatkov v mobilnih omrežjih"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"neznana vrsta omrežja"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Z omrežjem Wi-Fi se ni mogoče povezati"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ima slabo internetno povezavo."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ali dovolite vzpostavitev povezave?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dotaknite se, če želite izbrati jezik in postavitev."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidati"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Pripravljanje shrambe <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Iskanje napak"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Zaznana je bila nova shramba <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Povezan z mestom <xliff:g id="SESSION">%s</xliff:g>. Tapnite za upravljanje omrežja."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezovanje v stalno vklopljeno navidezno zasebno omrežje ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Vzpostavljena povezava v stalno vklopljeno navidezno zasebno omrežje"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Povezava s stalno vklopljenim VPN-jem je prekinjena"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Napaka stalno vklopljenega navideznega zasebnega omrežja"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Dotanite se, če želite konfigurirati"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Dotaknite se, če želite nastaviti"</string> <string name="upload_file" msgid="2897957172366730416">"Izberi datoteko"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nobena datoteka ni izbrana"</string> <string name="reset" msgid="2448168080964209908">"Ponastavi"</string> @@ -1708,6 +1719,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Vnesite ime jezika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predlagano"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Vsi jeziki"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Išči"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Delovni način IZKLOPLJEN"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Dovoljeno delovanje delovnega profila, vključno z aplikacijami, sinhronizacijo v ozadju in povezanimi funkcijami."</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 05f0e597c5e7..9f06b12825c7 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi nuk ka qasje në internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Trokit për opsionet"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Kaloi te <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Pajisja përdor <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kur <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> nuk ka qasje në internet. Mund të zbatohen tarifa."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Kaloi nga <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> te <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"të dhënat celulare"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Eternet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"një lloj rrjeti i panjohur"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Nuk mund të lidhej me Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ka një lidhje të dobët interneti."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Të lejohet lidhja?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trokit për të zgjedhur gjuhën dhe strukturën"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidatë"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Po përgatit <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Po kontrollon për gabime"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"U zbulua karta e re <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Lidhur me <xliff:g id="SESSION">%s</xliff:g>. Trokit për të menaxhuar rrjetin."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Po lidh VPN-në për aktivizim të përhershëm…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN e lidhur në mënyrë të përhershme"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Rrjeti VPN gjithmonë aktiv u shkëput"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Gabimi VPN-je për aktivizimin e përhershëm"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Trokit për të konfiguruar"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Trokit për ta konfiguruar"</string> <string name="upload_file" msgid="2897957172366730416">"Zgjidh skedarin"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nuk u zgjodh asnjë skedar"</string> <string name="reset" msgid="2448168080964209908">"Rivendos"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Shkruaj emrin e gjuhës"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugjeruar"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Të gjitha gjuhët"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Të gjitha rajonet"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Kërko"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Modaliteti i punës është JOAKTIV"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Lejoje profilin e punës të funksionojë, duke përfshirë aplikacionet, sinkronizimin në sfond dhe funksionet e lidhura."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 517d77752293..6eb2d8d2b7a3 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1101,6 +1101,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi нема приступ интернету"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Додирните за опције"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Прешли сте на тип мреже <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Уређај користи тип мреже <xliff:g id="NEW_NETWORK">%1$s</xliff:g> када тип мреже <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> нема приступ интернету. Можда ће се наплаћивати трошкови."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Прешли сте са типа мреже <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на тип мреже <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобилни подаци"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Етернет"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"непознат тип мреже"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Није могуће повезати са Wi-Fi мрежом"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" има лошу интернет везу."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Желите ли да дозволите повезивање?"</string> @@ -1178,7 +1189,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Додирните да бисте изабрали језик и распоред"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> се припрема"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Проверава се да ли постоје грешке"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Нови уређај <xliff:g id="NAME">%s</xliff:g> је откривен"</string> @@ -1257,8 +1267,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Повезано са сесијом <xliff:g id="SESSION">%s</xliff:g>. Додирните да бисте управљали мрежом."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Повезивање стално укљученог VPN-а..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Стално укључени VPN је повезан"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Веза са стално укљученим VPN-ом је прекинута"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка стално укљученог VPN-а"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Додирните да бисте конфигурисали"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Додирните да бисте подесили"</string> <string name="upload_file" msgid="2897957172366730416">"Одабери датотеку"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Није изабрана ниједна датотека"</string> <string name="reset" msgid="2448168080964209908">"Поново постави"</string> @@ -1672,6 +1683,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Унесите назив језика"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Сви језици"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Претражи"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Режим за Work је ИСКЉУЧЕН"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Дозвољава профилу за Work да функционише, укључујући апликације, синхронизацију у позадини и сродне функције."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index cf1b19ccffc9..df2bc16b1001 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi-nätverket är inte anslutet till internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Tryck för alternativ"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Byte av nätverk till <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="NEW_NETWORK">%1$s</xliff:g> används på enheten när det inte finns internetåtkomst via <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>. Avgifter kan tillkomma."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Byte av nätverk från <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> till <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobildata"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"en okänd nätverkstyp"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Det gick inte att ansluta till Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" har en dålig Internetanslutning."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Tillåt anslutning?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Förbereder ditt <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Söker efter fel"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Nytt <xliff:g id="NAME">%s</xliff:g> har hittats"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Ansluten till <xliff:g id="SESSION">%s</xliff:g>. Knacka lätt för att hantera nätverket."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ansluter till Always-on VPN ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ansluten till Always-on VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Always-on VPN har kopplats från"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fel på Always-on VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Tryck om du vill konfigurera"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Tryck för att konfigurera"</string> <string name="upload_file" msgid="2897957172366730416">"Välj fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil har valts"</string> <string name="reset" msgid="2448168080964209908">"Återställ"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Ange språket"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Förslag"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Alla språk"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Alla regioner"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Söka"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Arbetsläget är inaktiverat"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Tillåt att jobbprofilen är aktiv, inklusive appar, bakgrundssynkronisering och andra tillhörande funktioner."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 3daaf93ee330..0e7fca16fdcb 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1074,6 +1074,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi haina muunganisho wa intaneti"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Gonga ili upate chaguo"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Sasa inatumia <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Kifaa hutumia <xliff:g id="NEW_NETWORK">%1$s</xliff:g> wakati <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> haina Intaneti. Huenda ukalipishwa."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Imebadilisha mtandao kutoka <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> na sasa inatumia <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"data ya simu za mkononi"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethaneti"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"aina ya mtandao isiyojulikana"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Haikuweza kuunganisha kwa Mtandao-Hewa"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ina muunganisho duni wa Mtandao."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ungepenga kuruhusu muunganisho?"</string> @@ -1151,7 +1162,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"wagombeaji"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inaandaa <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Inakagua hitilafu"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"<xliff:g id="NAME">%s</xliff:g> mpya imegunduliwa"</string> @@ -1230,8 +1240,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Imeunganishwa kwa <xliff:g id="SESSION">%s</xliff:g>. Gonga ili kudhibiti mtandao"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kila mara VPN iliyowashwa inaunganishwa…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Kila mara VPN iliyowashwa imeunganishwa"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Iwe imeondoa VPN kila wakati"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kila mara kuna hitilafu ya VPN iliyowashwa"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Gonga ili uweke mipangilio"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Gonga ili uweke mipangilio"</string> <string name="upload_file" msgid="2897957172366730416">"Chagua faili"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Hakuna faili iliyochaguliwa"</string> <string name="reset" msgid="2448168080964209908">"Weka upya"</string> @@ -1634,6 +1645,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Weka jina la lugha"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Inayopendekezwa"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Lugha zote"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Tafuta"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Hali ya kazi IMEZIMWA"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ruhusu wasifu wa kazini utumike, ikiwa ni pamoja na programu, usawazishaji wa chini chini na vipengele vinavyohusiana."</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index e851399e567e..d7efb64bb7c8 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"வைஃபை இணைய அணுகல் கொண்டிருக்கவில்லை"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"விருப்பங்களுக்கு, தட்டவும்"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>க்கு மாற்றப்பட்டது"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> இல் இணைய அணுகல் இல்லாததால், சாதனமானது <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ஐப் பயன்படுத்துகிறது. கட்டணங்கள் விதிக்கப்படலாம்."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> இலிருந்து <xliff:g id="NEW_NETWORK">%2$s</xliff:g>க்கு மாற்றப்பட்டது"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"செல்லுலார் தரவு"</item> + <item msgid="75483255295529161">"வைஃபை"</item> + <item msgid="6862614801537202646">"புளூடூத்"</item> + <item msgid="5447331121797802871">"ஈத்தர்நெட்"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"தெரியாத நெட்வொர்க் வகை"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"வைஃபை உடன் இணைக்க முடியவில்லை"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" இணைய இணைப்பு மோசமாக உள்ளது."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"இணைப்பை அனுமதிக்கவா?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"கேன்டிடேட்ஸ்"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> தயாராகிறது"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"பிழைகள் உள்ளதா எனப் பார்க்கிறது"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"புதிய <xliff:g id="NAME">%s</xliff:g> கண்டறியப்பட்டது"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> உடன் இணைக்கப்பட்டது. நெட்வொர்க்கை நிர்வகிக்க, தட்டவும்."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"எப்போதும் இயங்கும் VPN உடன் இணைக்கிறது…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"எப்போதும் இயங்கும் VPN இணைக்கப்பட்டது"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"எப்போதும் இயங்கும் VPN துண்டிக்கப்பட்டது"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"எப்போதும் இயங்கும் VPN பிழை"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"உள்ளமைக்க, தட்டவும்"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"அமைக்க, தட்டவும்"</string> <string name="upload_file" msgid="2897957172366730416">"கோப்பைத் தேர்வுசெய்"</string> <string name="no_file_chosen" msgid="6363648562170759465">"எந்தக் கோப்பும் தேர்வுசெய்யப்படவில்லை"</string> <string name="reset" msgid="2448168080964209908">"மீட்டமை"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"மொழி பெயரை உள்ளிடுக"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"பரிந்துரைகள்"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"எல்லா மொழிகளும்"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"எல்லா மண்டலங்களும்"</string> <string name="locale_search_menu" msgid="2560710726687249178">"தேடு"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"பணிப் பயன்முறை முடக்கப்பட்டது"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"செயல்பட, பணி சுயவிவரத்தை அனுமதி. இதில் பயன்பாடுகள், பின்னணி ஒத்திசைவு மற்றும் தொடர்புடைய அம்சங்கள் அடங்கும்."</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 7c48c8ccbf37..15fb94f99c2f 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fiకి ఇంటర్నెట్ ప్రాప్యత లేదు"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"ఎంపికల కోసం నొక్కండి"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>కి మార్చబడింది"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"పరికరం <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>కి ఇంటర్నెట్ ప్రాప్యత లేనప్పుడు <xliff:g id="NEW_NETWORK">%1$s</xliff:g>ని ఉపయోగిస్తుంది. ఛార్జీలు వర్తించవచ్చు."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> నుండి <xliff:g id="NEW_NETWORK">%2$s</xliff:g>కి మార్చబడింది"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"సెల్యులార్ డేటా"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"బ్లూటూత్"</item> + <item msgid="5447331121797802871">"ఈథర్నెట్"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"తెలియని నెట్వర్క్ రకం"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fiకి కనెక్ట్ చేయడం సాధ్యపడలేదు"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" బలహీన ఇంటర్నెట్ కనెక్షన్ను కలిగి ఉంది."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"కనెక్షన్ని అనుమతించాలా?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"భాష మరియు లేఅవుట్ను ఎంచుకోవడానికి నొక్కండి"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"క్యాండిడేట్లు"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>ని సిద్ధం చేస్తోంది"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"లోపాల కోసం తనిఖీ చేస్తోంది"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"కొత్త <xliff:g id="NAME">%s</xliff:g> గుర్తించబడింది"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g>కు కనెక్ట్ చేయబడింది. నెట్వర్క్ను నిర్వహించడానికి నొక్కండి."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ఎల్లప్పుడూ-ఆన్లో ఉండే VPN కనెక్ట్ చేయబడుతోంది…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ఎల్లప్పుడూ-ఆన్లో ఉండే VPN కనెక్ట్ చేయబడింది"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ఎల్లప్పుడూ ఆన్లో ఉండే VPN డిస్కనెక్ట్ చేయబడింది"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ఎల్లప్పుడూ-ఆన్లో ఉండే VPN లోపం"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"కాన్ఫిగర్ చేయడానికి నొక్కండి"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"సెటప్ చేయడానికి నొక్కండి"</string> <string name="upload_file" msgid="2897957172366730416">"ఫైల్ను ఎంచుకోండి"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ఫైల్ ఎంచుకోబడలేదు"</string> <string name="reset" msgid="2448168080964209908">"రీసెట్ చేయి"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"భాష పేరును టైప్ చేయండి"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"సూచించినవి"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"అన్ని భాషలు"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"అన్ని ప్రాంతాలు"</string> <string name="locale_search_menu" msgid="2560710726687249178">"శోధించు"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"కార్యాలయ మోడ్ ఆఫ్ చేయబడింది"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"అనువర్తనాలు, నేపథ్య సమకాలీకరణ మరియు సంబంధిత లక్షణాలతో సహా కార్యాలయ ప్రొఫైల్ను పని చేయడానికి అనుమతించండి."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 90d9f9bca794..5fe5d09cd2b2 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi ไม่สามารถเข้าถึงอินเทอร์เน็ต"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"แตะเพื่อดูตัวเลือก"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"เปลี่ยนเป็น <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"อุปกรณ์จะใช้ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> เมื่อ <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ไม่สามารถเข้าถึงอินเทอร์เน็ต อาจมีค่าบริการ"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"เปลี่ยนจาก <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> เป็น <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"เน็ตมือถือ"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"บลูทูธ"</item> + <item msgid="5447331121797802871">"อีเทอร์เน็ต"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"ประเภทเครือข่ายที่ไม่รู้จัก"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"ไม่สามารถเชื่อมต่อ WiFi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" มีสัญญาณอินเทอร์เน็ตไม่ดี"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"อนุญาตการเชื่อมต่อใช่ไหม"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"แตะเพื่อเลือกภาษาและรูปแบบ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ตัวเลือก"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"ตรวจพบ <xliff:g id="NAME">%s</xliff:g> ใหม่"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"เชื่อมต่อกับ <xliff:g id="SESSION">%s</xliff:g> แตะเพื่อจัดการเครือข่าย"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"กำลังเชื่อมต่อ VPN แบบเปิดตลอดเวลา…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"เชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ยกเลิกการเชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ข้อผิดพลาดของ VPN แบบเปิดตลอดเวลา"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"แตะเพื่อกำหนดค่า"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"แตะเพื่อตั้งค่า"</string> <string name="upload_file" msgid="2897957172366730416">"เลือกไฟล์"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ไม่ได้เลือกไฟล์ไว้"</string> <string name="reset" msgid="2448168080964209908">"รีเซ็ต"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"พิมพ์ชื่อภาษา"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"แนะนำ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ทุกภาษา"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"ภูมิภาคทั้งหมด"</string> <string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"โหมดทำงานปิดอยู่"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"อนุญาตให้โปรไฟล์งานทำงานได้ ซึ่งรวมถึงแอป การซิงค์ในพื้นหลัง และคุณลักษณะอื่นที่เกี่ยวข้อง"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index efb319f52d44..651db3635cd3 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Walang access sa Internet ang Wi-Fi"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"I-tap para sa mga opsyon"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Lumipat sa <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Ginagamit ng device ang <xliff:g id="NEW_NETWORK">%1$s</xliff:g> kapag walang access sa Internet ang <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>. Maaaring may mga malapat na singilin."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Lumipat sa <xliff:g id="NEW_NETWORK">%2$s</xliff:g> mula sa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"cellular data"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"isang hindi kilalang uri ng network"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Hindi makakonekta sa Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" ay mayroong mahinang koneksyon sa Internet."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Payagan ang kuneksyon?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"I-tap upang pumili ng wika at layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"mga kandidato"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Inihahanda ang <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Sinusuri para sa mga error"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Na-detect ang bagong <xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Nakakonekta sa <xliff:g id="SESSION">%s</xliff:g>. Tapikin upang pamahalaan ang network."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kumukonekta ang Always-on VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Nakakonekta ang Always-on VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Hindi nakakonekta ang palaging naka-on na VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error sa Always-on VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"I-tap upang i-configure"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"I-tap upang i-set up"</string> <string name="upload_file" msgid="2897957172366730416">"Pumili ng file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Walang napiling file"</string> <string name="reset" msgid="2448168080964209908">"I-reset"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"I-type ang wika"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Iminumungkahi"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Lahat ng wika"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Lahat ng rehiyon"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Maghanap"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"NAKA-OFF ang work mode"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Payagang gumana ang profile sa trabaho, kasama na ang mga app, pag-sync sa background at mga may kaugnayang feature."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 5a0776ab5f1a..9d3de40bd99a 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Kablosuz bağlantıda İnternet erişimi yok"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Seçenekler için dokunun"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> ağına geçildi"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ağının İnternet erişimi olmadığında cihaz <xliff:g id="NEW_NETWORK">%1$s</xliff:g> ağını kullanır. Bunun için ödeme alınabilir."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> ağından <xliff:g id="NEW_NETWORK">%2$s</xliff:g> ağına geçildi"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"hücresel veri"</item> + <item msgid="75483255295529161">"Kablosuz"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"bilinmeyen ağ türü"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Kablosuz bağlantısı kurulamadı"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" İnternet bağlantısı zayıf."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Bağlantıya izin verilsin mi?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için hafifçe dokunun"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"adaylar"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> hazırlanıyor"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Hatalar denetleniyor"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yeni <xliff:g id="NAME">%s</xliff:g> algılandı"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> oturumuna bağlı. Ağı yönetmek için hafifçe vurun."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Her zaman açık VPN\'ye bağlanılıyor…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Her zaman açık VPN\'ye bağlanıldı"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Her zaman açık VPN bağlantısı kesildi"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Her zaman açık VPN hatası"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Yapılandırmak için dokunun"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Ayarlamak için dokunun"</string> <string name="upload_file" msgid="2897957172366730416">"Dosya seç"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Seçili dosya yok"</string> <string name="reset" msgid="2448168080964209908">"Sıfırla"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Dil adını yazın"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Önerilen"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Tüm diller"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Ara"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"İş modu KAPALI"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Uygulamalar, arka planda senkronizasyon ve ilgili özellikler dahil olmak üzere iş profilinin çalışmasına izin ver."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 4810e37686af..77eff115efb6 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1126,6 +1126,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Мережа Wi-Fi не має доступу до Інтернету"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Торкніться, щоб відкрити опції"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Пристрій перейшов на мережу <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Пристрій використовує мережу <xliff:g id="NEW_NETWORK">%1$s</xliff:g>, коли мережа <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> не має доступу до Інтернету. Може стягуватися плата."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Пристрій перейшов з мережі <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> на мережу <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"мобільний трафік"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"Мережа VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"невідомий тип мережі"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Не вдалося під’єднатися до мережі Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" має погане з’єднання з Інтернетом."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Дозволити з’єднання?"</string> @@ -1203,7 +1214,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Торкніться, щоб вибрати мову та розкладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Підготовка пристрою пам’яті <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Виявлення помилок"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Виявлено новий пристрій пам’яті (<xliff:g id="NAME">%s</xliff:g>)"</string> @@ -1282,8 +1292,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Під’єднано до <xliff:g id="SESSION">%s</xliff:g>. Торкніться, щоб керувати мережею."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Під’єднання до постійної мережі VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Під’єднано до постійної мережі VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Постійну мережу VPN від’єднано"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Помилка постійної мережі VPN"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Торкніться, щоб налаштувати"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Торкніться, щоб налаштувати"</string> <string name="upload_file" msgid="2897957172366730416">"Виберіть файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Не вибрано файл"</string> <string name="reset" msgid="2448168080964209908">"Віднов."</string> @@ -1708,6 +1719,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Введіть назву мови"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Пропоновані"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Усі мови"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Усі регіони"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Пошук"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Робочий профіль ВИМКНЕНО"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Увімкнути робочий профіль, зокрема додатки, фонову синхронізацію та пов’язані функції."</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index f6771325be90..c35bb1319693 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi کی انٹرنیٹ تک رسائی نہیں ہے"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"اختیارات کیلئے تھپتھپائیں"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> پر سوئچ ہو گیا"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"جب <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> کے پاس انٹرنیٹ تک رسائی نہ ہو تو آلہ <xliff:g id="NEW_NETWORK">%1$s</xliff:g> کو استعمال کرتا ہے۔ چارجز کا اطلاق ہو سکتا ہے۔"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> سے <xliff:g id="NEW_NETWORK">%2$s</xliff:g> پر سوئچ ہو گیا"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"سیلولر ڈیٹا"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"بلوٹوتھ"</item> + <item msgid="5447331121797802871">"ایتھرنیٹ"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"نیٹ ورک کی نامعلوم قسم"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi سے مربوط نہیں ہو سکا"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" اس میں ایک کمزور انٹرنیٹ کنکشن ہے۔"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"کنکشن کی اجازت دیں؟"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"زبان اور لے آؤٹ منتخب کرنے کیلئے تھپتھپائیں"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"امیدواران"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> تیار کیا جا رہا ہے"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"خرابیوں کیلئے چیک کیا جا رہا ہے"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"نئے <xliff:g id="NAME">%s</xliff:g> کا پتا چلا"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> سے منسلک ہے۔ نیٹ ورک کا نظم کرنے کیلئے تھپتھپائیں۔"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ہمیشہ آن VPN مربوط ہو رہا ہے…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ہمیشہ آن VPN مربوط ہوگیا"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"ہمیشہ آن VPN غیر منسلک ہو گیا"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ہمیشہ آن VPN کی خرابی"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"کنفیگر کرنے کیلئے تھپتھپائیں"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"سیٹ اپ کرنے کیلئے تھپتھپائیں"</string> <string name="upload_file" msgid="2897957172366730416">"فائل منتخب کریں"</string> <string name="no_file_chosen" msgid="6363648562170759465">"کوئی فائل منتخب نہیں کی گئی"</string> <string name="reset" msgid="2448168080964209908">"دوبارہ ترتیب دیں"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"زبان کا نام ٹائپ کریں"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"تجویز کردہ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"سبھی زبانیں"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"تلاش"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"کام موڈ آف ہے"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"دفتری پروفائل کو کام کرنے دیں، بشمول ایپس، پس منظر کی مطابقت پذیری اور متعلقہ خصوصیات۔"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 8fc6428eb24b..835e45ee8102 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi tarmog‘ida internet aloqasi yo‘q"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Variantlarni ko‘rsatish uchun bosing"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"<xliff:g id="NETWORK_TYPE">%1$s</xliff:g> tarmog‘iga ulanildi"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Qurilma <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> tarmog‘ida internet o‘chganda, <xliff:g id="NEW_NETWORK">%1$s</xliff:g> tarmog‘iga ulaniladi. To‘lov olinishi mumkin."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> tarmog‘idan <xliff:g id="NEW_NETWORK">%2$s</xliff:g> tarmog‘iga o‘tildi"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"mobil internet"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"noma’lum tarmoq turi"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Wi-Fi’ga ulana olmadi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" tezligi past Internetga ulangan."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Ulanishga ruxsat berilsinmi?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Til va sxemani belgilash uchun bosing"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"nomzodlar"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> tayyorlanmoqda"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Xatolar qidirilmoqda"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Yangi <xliff:g id="NAME">%s</xliff:g> kartasi aniqlandi"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"<xliff:g id="SESSION">%s</xliff:g> ulandi. Tarmoq sozlamalarini o‘zgartirish uchun bu yerni bosing."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ulanmoqda…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ulandi"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Doimiy VPN o‘chirildi"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Xato"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Sozlash uchun bosing"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Sozlash uchun bosing"</string> <string name="upload_file" msgid="2897957172366730416">"Faylni tanlash"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Hech qanday fayl tanlanmadi"</string> <string name="reset" msgid="2448168080964209908">"Asliga qaytarish"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"Til nomini kiriting"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Taklif etiladi"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Barcha tillar"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"Qidiruv"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Ish rejimi O‘CHIQ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Ishchi profilini yoqish: ilovalar, fonda sinxronlash va bog‘liq funksiyalar."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index a537b8f0bb62..4a4c34abbd1c 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi không có quyền truy cập Internet"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Nhấn để biết tùy chọn"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Đã chuyển sang <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Thiết bị sử dụng <xliff:g id="NEW_NETWORK">%1$s</xliff:g> khi <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> không có quyền truy cập Internet. Bạn có thể phải trả phí."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Đã chuyển từ <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> sang <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"dữ liệu di động"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"Bluetooth"</item> + <item msgid="5447331121797802871">"Ethernet"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"loại mạng không xác định"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Không thể kết nối với Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" có kết nối Internet không tốt."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Cho phép kết nối?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Nhấn để chọn ngôn ngữ và bố cục"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"ứng viên"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Đang chuẩn bị <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Đang kiểm tra lỗi"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"Đã phát hiện <xliff:g id="NAME">%s</xliff:g> mới"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Đã kết nối với <xliff:g id="SESSION">%s</xliff:g>. Chạm để quản lý mạng."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Đang kết nối VPN luôn bật…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Đã kết nối VPN luôn bật"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Đã ngắt kết nối VPN luôn bật"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Lỗi VPN luôn bật"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Nhấn để định cấu hình"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Nhấn để thiết lập"</string> <string name="upload_file" msgid="2897957172366730416">"Chọn tệp"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Không có tệp nào được chọn"</string> <string name="reset" msgid="2448168080964209908">"Đặt lại"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Nhập tên ngôn ngữ"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ðược đề xuất"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Tất cả ngôn ngữ"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Tất cả khu vực"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Tìm kiếm"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Chế độ làm việc đang TẮT"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Cho phép hồ sơ công việc hoạt động, bao gồm ứng dụng, đồng bộ hóa trong nền và các tính năng liên quan."</string> diff --git a/core/res/res/values-watch/donottranslate.xml b/core/res/res/values-watch/donottranslate.xml new file mode 100644 index 000000000000..d247ff6f5694 --- /dev/null +++ b/core/res/res/values-watch/donottranslate.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<resources> + <!-- DO NOT TRANSLATE Spans within this text are applied to style composing regions + within an EditText widget. The text content is ignored and not used. + Note: This is @color/material_deep_teal_200, cannot use @color references here. --> + <string name="candidates_style" translatable="false"><font color="#80cbc4">candidates</font></string> + </resources> diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index f5735e69347a..a9f6e226510c 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -88,9 +88,4 @@ please see styles_device_defaults.xml. <item name="virtualButtonPressedDrawable">?selectableItemBackground</item> <item name="descendantFocusability">blocksDescendants</item> </style> - - <!-- DO NOTE TRANSLATE Spans within this text are applied to style composing regions - within an EditText widget. The text content is ignored and not used. - Note: This is @color/material_deep_teal_200, cannot use @color references here. --> - <string name="candidates_style"><font color="#80cbc4">candidates</font></string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 8116ec0500c0..1bdd065ed058 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"此 WLAN 网络无法访问互联网"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"点按即可查看相关选项"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"已切换至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"设备会在无法连接到<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>时使用<xliff:g id="NEW_NETWORK">%1$s</xliff:g>(可能需要支付相应的费用)。"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"已从<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>切换至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"移动数据网络"</item> + <item msgid="75483255295529161">"WLAN"</item> + <item msgid="6862614801537202646">"蓝牙"</item> + <item msgid="5447331121797802871">"以太网"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"未知网络类型"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"无法连接到WLAN"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互联网连接状况不佳。"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"要允许连接吗?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"候选"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在准备<xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"检查是否有错误"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"检测到新的<xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"已连接到<xliff:g id="SESSION">%s</xliff:g>。点按即可管理网络。"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在连接到始终开启的 VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已连接到始终开启的 VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"始终开启的 VPN 已断开连接"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"始终开启的 VPN 出现错误"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"点按即可进行配置"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"点按即可进行设置"</string> <string name="upload_file" msgid="2897957172366730416">"选择文件"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未选定任何文件"</string> <string name="reset" msgid="2448168080964209908">"重置"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"输入语言名称"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"建议语言"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"所有语言"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"搜索"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"工作模式已关闭"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"启用工作资料,包括应用、后台同步和相关功能。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index ef12eeab56f2..ff4f95ece2ee 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi 並未連接互聯網"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕按即可查看選項"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"已切換至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"當<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g>無法連線至互聯網時,裝置便會切換至<xliff:g id="NEW_NETWORK">%1$s</xliff:g>。可能需要支付額外費用。"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"已從<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>切換至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"流動數據"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"藍牙"</item> + <item msgid="5447331121797802871">"以太網"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"不明網絡類型"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"無法連線至 Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 互聯網連線欠佳。"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"允許連線?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕按即可選取語言和鍵盤配置"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"待選項目"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備<xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"已偵測到新<xliff:g id="NAME">%s</xliff:g>"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"已連線至 <xliff:g id="SESSION">%s</xliff:g>,輕按一下即可管理網絡。"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"永久連線的 VPN 已中斷"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"永久連線的 VPN 發生錯誤"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"輕觸即可設定"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"輕按即可設定"</string> <string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未選擇檔案"</string> <string name="reset" msgid="2448168080964209908">"重設"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"輸入語言名稱"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"建議"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"所有國家/地區"</string> <string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"工作模式已關閉"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"允許使用應用程式、背景同步及相關功能的工作設定檔。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 84e2c2c9f738..aedd91bf4e16 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"Wi-Fi 網路沒有網際網路連線"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"輕觸即可查看選項"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"已切換至<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"裝置會在無法連上 <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> 時切換至<xliff:g id="NEW_NETWORK">%1$s</xliff:g> (可能需要支付相關費用)。"</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"已從 <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> 切換至<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"行動數據"</item> + <item msgid="75483255295529161">"Wi-Fi"</item> + <item msgid="6862614801537202646">"藍牙"</item> + <item msgid="5447331121797802871">"乙太網路"</item> + <item msgid="8257233890381651999">"VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"不明的網路類型"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"無法連線至 Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" 的網際網路連線狀況不佳。"</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"允許連線?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕觸即可選取語言和版面配置"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"待選項目"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"正在準備「<xliff:g id="NAME">%s</xliff:g>」"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"正在檢查錯誤"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"偵測到新的「<xliff:g id="NAME">%s</xliff:g>」"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"已連線至 <xliff:g id="SESSION">%s</xliff:g>,輕觸一下即可管理網路。"</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"永久連線的 VPN 已中斷連線"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"永久連線的 VPN 發生錯誤"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"輕觸即可進行設定"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"輕觸即可進行設定"</string> <string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未選擇任何檔案"</string> <string name="reset" msgid="2448168080964209908">"重設"</string> @@ -1636,6 +1647,8 @@ <string name="search_language_hint" msgid="7042102592055108574">"請輸入語言名稱"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"建議語言"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string> + <!-- no translation found for region_picker_section_all (8966316787153001779) --> + <skip /> <string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Work 模式已關閉"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"啟用 Work 設定檔,包括應用程式、背景同步處理和相關功能。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 0c7af8dd21a5..59b6fbe0ba39 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1076,6 +1076,17 @@ <skip /> <string name="wifi_no_internet" msgid="8451173622563841546">"I-Wi-Fi ayinakho ukufinyelela kwe-inthanethi"</string> <string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Thepha ukuze uthole izinketho"</string> + <string name="network_switch_metered" msgid="4671730921726992671">"Kushintshelwe ku-<xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string> + <string name="network_switch_metered_detail" msgid="5325661434777870353">"Idivayisi isebenzisa i-<xliff:g id="NEW_NETWORK">%1$s</xliff:g> uma i-<xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> ingenakho ukufinyelela kwe-inthanethi. Izindleko zingasebenza."</string> + <string name="network_switch_metered_toast" msgid="5779283181685974304">"Kushintshelewe kusuka ku-<xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g> kuya ku-<xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string> + <string-array name="network_switch_type_name"> + <item msgid="2952042958050315394">"idatha yeselula"</item> + <item msgid="75483255295529161">"I-Wi-Fi"</item> + <item msgid="6862614801537202646">"I-Bluetooth"</item> + <item msgid="5447331121797802871">"I-Ethernet"</item> + <item msgid="8257233890381651999">"I-VPN"</item> + </string-array> + <string name="network_switch_type_name_unknown" msgid="4552612897806660656">"uhlobo olungaziwa lwenethiwekhi"</string> <string name="wifi_watchdog_network_disabled" msgid="7904214231651546347">"Ayikwazanga ukuxhuma kwi-Wi-Fi"</string> <string name="wifi_watchdog_network_disabled_detailed" msgid="5548780776418332675">" inoxhumano oluphansi lwe-inthanethi."</string> <string name="wifi_connect_alert_title" msgid="8455846016001810172">"Vumela ukuxhumeka?"</string> @@ -1153,7 +1164,6 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Thepha ukuze ukhethe ulimi nesakhiwo"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="candidates_style" msgid="4333913089637062257"><u>"abahlanganyeli"</u></string> <string name="ext_media_checking_notification_title" msgid="5734005953288045806">"Ilungiselela i-<xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Ihlolela amaphutha"</string> <string name="ext_media_new_notification_message" msgid="7589986898808506239">"I-<xliff:g id="NAME">%s</xliff:g> entsha itholiwe"</string> @@ -1232,8 +1242,9 @@ <string name="vpn_text_long" msgid="4907843483284977618">"Ixhume ku-<xliff:g id="SESSION">%s</xliff:g>. Thepha ukuphatha inethiwekhi."</string> <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"I-VPN ehlala ikhanya iyaxhuma…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"I-VPN ehlala ikhanya ixhunyiwe"</string> + <string name="vpn_lockdown_disconnected" msgid="4532298952570796327">"Njalo kuvuliwe i-VPN kunqamukile"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Iphutha le-VPN ehlala ikhanya"</string> - <string name="vpn_lockdown_config" msgid="4655589351146766608">"Thinta ukuze umise"</string> + <string name="vpn_lockdown_config" msgid="5099330695245008680">"Thepha ukuze usethe"</string> <string name="upload_file" msgid="2897957172366730416">"Khetha ifayela"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ayikho ifayela ekhethiwe"</string> <string name="reset" msgid="2448168080964209908">"Setha kabusha"</string> @@ -1636,6 +1647,7 @@ <string name="search_language_hint" msgid="7042102592055108574">"Thayipha igama lolimi"</string> <string name="language_picker_section_suggested" msgid="8414489646861640885">"Okuphakanyisiwe"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"Zonke izilimi"</string> + <string name="region_picker_section_all" msgid="8966316787153001779">"Zonke izifunda"</string> <string name="locale_search_menu" msgid="2560710726687249178">"Sesha"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"Imodi yomsebenzi IVALIWE"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"Vumela iphrofayela yomsebenzi ukuze isebenze, efaka izinhlelo zokusebenza, ukuvumelanisa kwangemuva, nezici ezisondelene."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 48e420198ffa..0a96ba399396 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5313,6 +5313,21 @@ i <attr name="alpha" /> </declare-styleable> + <!-- Drawable used to render according to the animation scale. Esp. when it is 0 due to battery + saver mode. It should contain one animatable drawable and one static drawable. + @hide --> + <declare-styleable name="AnimationScaleListDrawable"> + </declare-styleable> + + <!-- Attributes that can be assigned to a AnimationScaleListDrawable item. + @hide --> + <declare-styleable name="AnimationScaleListDrawableItem"> + <!-- Reference to a drawable resource to use for the state. If not + given, the drawable must be defined by the first child tag. --> + <attr name="drawable" /> + </declare-styleable> + + <!-- Drawable used to render a geometric shape, with a gradient or a solid color. --> <declare-styleable name="GradientDrawable"> <!-- Indicates whether the drawable should intially be visible. --> @@ -5342,7 +5357,10 @@ i <attr name="innerRadius" format="dimension" /> <!-- Thickness of the ring. When defined, thicknessRatio is ignored. --> <attr name="thickness" format="dimension" /> - <!-- Indicates whether the drawable's level affects the way the gradient is drawn. --> + <!-- Whether the drawable level value (see + {@link android.graphics.drawable.Drawable#getLevel()}) is used to scale the shape. + Scaling behavior depends on the shape type. For "ring", the angle is scaled from 0 to + 360. For all other types, there is no effect. The default value is true. --> <attr name="useLevel" /> <!-- If set, specifies the color to apply to the drawable as a tint. By default, no tint is applied. May be a color state list. --> @@ -5376,28 +5394,37 @@ i <declare-styleable name="GradientDrawableGradient"> <!-- Start color of the gradient. --> <attr name="startColor" format="color" /> - <!-- Optional center color. For linear gradients, use centerX or centerY - to place the center color. --> + <!-- Optional center color. For linear gradients, use centerX or centerY to place the center + color. --> <attr name="centerColor" format="color" /> <!-- End color of the gradient. --> <attr name="endColor" format="color" /> + <!-- Whether the drawable level value (see + {@link android.graphics.drawable.Drawable#getLevel()}) is used to scale the gradient. + Scaling behavior varies based on gradient type. For "linear", adjusts the ending + position along the gradient's axis of orientation. For "radial", adjusts the outer + radius. For "sweep", adjusts the ending angle. The default value is false. --> <attr name="useLevel" format="boolean" /> - <!-- Angle of the gradient. --> + <!-- Angle of the gradient, used only with linear gradient. Must be a multiple of 45 in the + range [0, 315]. --> <attr name="angle" format="float" /> <!-- Type of gradient. The default type is linear. --> <attr name="type"> - <!-- Linear gradient. --> + <!-- Linear gradient extending across the center point. --> <enum name="linear" value="0" /> - <!-- Radial, or circular, gradient. --> + <!-- Radial gradient extending from the center point outward. --> <enum name="radial" value="1" /> - <!-- Sweep, or angled or diamond, gradient. --> + <!-- Sweep (or angular) gradient sweeping counter-clockwise around the center point. --> <enum name="sweep" value="2" /> </attr> - <!-- X coordinate of the origin of the gradient within the shape. --> + <!-- X-position of the center point of the gradient within the shape as a fraction of the + width. The default value is 0.5. --> <attr name="centerX" format="float|fraction" /> - <!-- Y coordinate of the origin of the gradient within the shape. --> + <!-- Y-position of the center point of the gradient within the shape as a fraction of the + height. The default value is 0.5. --> <attr name="centerY" format="float|fraction" /> - <!-- Radius of the gradient, used only with radial gradient. --> + <!-- Radius of the gradient, used only with radial gradient. May be an explicit dimension + or a fractional value relative to the shape's minimum dimension. --> <attr name="gradientRadius" format="float|fraction|dimension" /> </declare-styleable> diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml index a864cf384adb..92426c6a9bca 100644 --- a/core/res/res/values/colors_material.xml +++ b/core/res/res/values/colors_material.xml @@ -61,7 +61,10 @@ <color name="secondary_text_default_material_dark">#b3ffffff</color> <item name="hint_alpha_material_dark" format="float" type="dimen">0.50</item> - <item name="hint_alpha_material_light" format="float" type="dimen">0.54</item> + <item name="hint_alpha_material_light" format="float" type="dimen">0.38</item> + + <item name="hint_pressed_alpha_material_dark" format="float" type="dimen">0.70</item> + <item name="hint_pressed_alpha_material_light" format="float" type="dimen">0.54</item> <item name="disabled_alpha_material_light" format="float" type="dimen">0.26</item> <item name="disabled_alpha_material_dark" format="float" type="dimen">0.30</item> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 3dbcdafcc99b..b047cdf3c69f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2158,6 +2158,11 @@ <!-- Flag specifying whether VT is available on device --> <bool name="config_device_vt_available">false</bool> + <!-- Flag specifying whether the device will use the "allow_hold_in_ims_call" carrier config + option. When false, the device will support holding of IMS calls, regardless of the + carrier config setting. --> + <bool name="config_device_respects_hold_carrier_config">true</bool> + <!-- Flag specifying whether VT should be available for carrier: independent of carrier provisioning. If false: hard disabled. If true: then depends on carrier provisioning, availability etc --> @@ -2300,8 +2305,8 @@ <!-- An array of CDMA roaming indicators which means international roaming --> <integer-array translatable="false" name="config_cdma_international_roaming_indicators" /> - <!-- set the system language as value of EF LI/EF PL --> - <bool name="config_use_sim_language_file">true</bool> + <!-- flag to indicate if EF LI/EF PL should be used for system language --> + <bool name="config_use_sim_language_file">false</bool> <!-- Use ERI text for network name on CDMA LTE --> <bool name="config_LTE_eri_for_network_name">true</bool> @@ -2540,4 +2545,12 @@ <!-- Verizon requires any SMS that starts with //VZWVVM to be treated as a VVM SMS--> <item>310004,310010,310012,310013,310590,310890,310910,311110,311270,311271,311272,311273,311274,311275,311276,311277,311278,311279,311280,311281,311282,311283,311284,311285,311286,311287,311288,311289,311390,311480,311481,311482,311483,311484,311485,311486,311487,311488,311489;^//VZWVVM.*</item> </string-array> + <!-- This config is holding calling number conversion map - expected to convert to emergency + number. Formats for this config as below: + <item>[dialstring1],[dialstring2],[dialstring3]:[replacement]</item> + + E.g. for Taiwan Type Approval, 110 and 119 should be converted to 112. + <item>110,119:112</item> + --> + <string-array translatable="false" name="config_convert_to_emergency_number_map" /> </resources> diff --git a/core/res/res/values/donottranslate.xml b/core/res/res/values/donottranslate.xml index a139529482da..3a1679c19fc8 100644 --- a/core/res/res/values/donottranslate.xml +++ b/core/res/res/values/donottranslate.xml @@ -26,4 +26,7 @@ <string name="icu_abbrev_wday_month_day_no_year">eeeMMMMd</string> <!-- @hide DO NOT TRANSLATE. date formatting pattern for system ui.--> <string name="system_ui_date_pattern">@string/icu_abbrev_wday_month_day_no_year</string> + <!-- @hide DO NOT TRANSLATE Spans within this text are applied to style composing regions + within an EditText widget. The text content is ignored and not used. --> + <string name="candidates_style" translatable="false"><u>candidates</u></string> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9002ed492019..d0107e161707 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3122,8 +3122,6 @@ <string name="fast_scroll_alphabet">\u0020ABCDEFGHIJKLMNOPQRSTUVWXYZ</string> <string name="fast_scroll_numeric_alphabet">\u00200123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ</string> - <string name="candidates_style"><u>candidates</u></string> - <!-- External media notification strings --> <skip /> @@ -3326,10 +3324,12 @@ <string name="vpn_lockdown_connecting">Always-on VPN connecting\u2026</string> <!-- Notification title when connected to lockdown VPN. --> <string name="vpn_lockdown_connected">Always-on VPN connected</string> + <!-- Notification title when not connected to lockdown VPN. --> + <string name="vpn_lockdown_disconnected">Always-on VPN disconnected</string> <!-- Notification title when error connecting to lockdown VPN. --> <string name="vpn_lockdown_error">Always-on VPN error</string> <!-- Notification body that indicates user can touch to configure lockdown VPN connection. --> - <string name="vpn_lockdown_config">Tap to configure</string> + <string name="vpn_lockdown_config">Tap to set up</string> <!-- Localized strings for WebView --> <!-- Label for button in a WebView that will open a chooser to choose a file to upload --> @@ -4357,6 +4357,9 @@ <string name="language_picker_section_suggested">Suggested</string> <!-- List section subheader for the language picker, containing a list of all languages available [CHAR LIMIT=30] --> <string name="language_picker_section_all">All languages</string> + <!-- List section subheader for the region picker, containing a list of all regions supported for the selected language. + Warning: this is a more 'neutral' term for 'country', not for the sub-divisions of a country. [CHAR LIMIT=30] --> + <string name="region_picker_section_all">All regions</string> <!-- Menu item in the locale menu [CHAR LIMIT=30] --> <string name="locale_search_menu">Search</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index def40dbcbd04..4613b7803376 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1459,6 +1459,7 @@ <java-symbol type="anim" name="dock_top_exit" /> <java-symbol type="anim" name="dock_bottom_enter" /> <java-symbol type="anim" name="dock_bottom_exit" /> + <java-symbol type="anim" name="dock_bottom_exit_keyguard" /> <java-symbol type="anim" name="dock_left_enter" /> <java-symbol type="anim" name="dock_left_exit" /> <java-symbol type="anim" name="dock_right_enter" /> @@ -1869,6 +1870,7 @@ <java-symbol type="string" name="vpn_title_long" /> <java-symbol type="string" name="vpn_lockdown_connecting" /> <java-symbol type="string" name="vpn_lockdown_connected" /> + <java-symbol type="string" name="vpn_lockdown_disconnected" /> <java-symbol type="string" name="vpn_lockdown_error" /> <java-symbol type="string" name="vpn_lockdown_config" /> <java-symbol type="string" name="wallpaper_binding_label" /> @@ -1943,6 +1945,7 @@ <java-symbol type="anim" name="lock_screen_behind_enter_fade_in" /> <java-symbol type="anim" name="lock_screen_wallpaper_exit" /> <java-symbol type="anim" name="launch_task_behind_source" /> + <java-symbol type="anim" name="wallpaper_open_exit" /> <java-symbol type="bool" name="config_alwaysUseCdmaRssi" /> <java-symbol type="dimen" name="status_bar_icon_size" /> @@ -2212,6 +2215,7 @@ <java-symbol type="bool" name="config_carrier_volte_provisioned" /> <java-symbol type="bool" name="config_carrier_volte_tty_supported" /> <java-symbol type="bool" name="config_device_vt_available" /> + <java-symbol type="bool" name="config_device_respects_hold_carrier_config" /> <java-symbol type="bool" name="config_carrier_vt_available" /> <java-symbol type="bool" name="config_device_wfc_ims_available" /> <java-symbol type="bool" name="config_carrier_wfc_ims_available" /> @@ -2505,6 +2509,7 @@ <java-symbol type="menu" name="language_selection_list" /> <java-symbol type="string" name="country_selection_title" /> <java-symbol type="string" name="language_picker_section_all" /> + <java-symbol type="string" name="region_picker_section_all" /> <java-symbol type="string" name="language_picker_section_suggested" /> <java-symbol type="string" name="language_selection_title" /> <java-symbol type="string" name="search_language_hint" /> @@ -2695,4 +2700,5 @@ <java-symbol type="drawable" name="ic_restart" /> + <java-symbol type="array" name="config_convert_to_emergency_number_map" /> </resources> diff --git a/docs/html/topic/libraries/support-library/revisions.jd b/docs/html/topic/libraries/support-library/revisions.jd index db99ec8b4d31..9a24d1540e9b 100644 --- a/docs/html/topic/libraries/support-library/revisions.jd +++ b/docs/html/topic/libraries/support-library/revisions.jd @@ -2974,8 +2974,6 @@ if (animator instanceof SimpleItemAnimator) { <ul> <li>Added {@link android.support.v7.widget.GridLayout} to provide support for the {@link android.widget.GridLayout} layout object.</li> - <li>Added {@link android.support.v7.widget.Space} which can be used to create blank areas - within a {@link android.support.v7.widget.GridLayout} layout object.</li> </ul> </dl> </div> diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 5c54324d8107..c3861083e2fd 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -77,6 +77,8 @@ public class SurfaceTexture { private long mProducer; private long mFrameAvailableListener; + private boolean mIsSingleBuffered; + /** * Callback interface for being notified that a new stream frame is available. */ @@ -130,6 +132,7 @@ public class SurfaceTexture { */ public SurfaceTexture(int texName, boolean singleBufferMode) { mCreatorLooper = Looper.myLooper(); + mIsSingleBuffered = singleBufferMode; nativeInit(false, texName, singleBufferMode, new WeakReference<SurfaceTexture>(this)); } @@ -157,6 +160,7 @@ public class SurfaceTexture { */ public SurfaceTexture(boolean singleBufferMode) { mCreatorLooper = Looper.myLooper(); + mIsSingleBuffered = singleBufferMode; nativeInit(true, 0, singleBufferMode, new WeakReference<SurfaceTexture>(this)); } @@ -378,6 +382,14 @@ public class SurfaceTexture { } } + /** + * Returns true if the SurfaceTexture is single-buffered + * @hide + */ + public boolean isSingleBuffered() { + return mIsSingleBuffered; + } + private native void nativeInit(boolean isDetached, int texName, boolean singleBufferMode, WeakReference<SurfaceTexture> weakSelf) throws Surface.OutOfResourcesException; diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index c836204486b0..0f305f3cff3d 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -144,6 +144,55 @@ import java.util.ArrayList; * android:valueType="pathType"/> * </set> * </pre></li> + * <p> + * Since AAPT tool is now supporting a new format which can bundle several related XML files into + * one, we can merge the previous example into one XML file, like this: + * </p> + * <pre> + * <animated-vector xmlns:android="http://schemas.android.com/apk/res/android" > + * <aapt:attr name="android:drawable"> + * <vector + * android:height="64dp" + * android:width="64dp" + * android:viewportHeight="600" + * android:viewportWidth="600" > + * <group + * android:name="rotationGroup" + * android:pivotX="300.0" + * android:pivotY="300.0" + * android:rotation="45.0" > + * <path + * android:name="v" + * android:fillColor="#000000" + * android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> + * </group> + * </vector> + * </aapt:attr> + * + * <target android:name="rotationGroup"> * + * <aapt:attr name="android:animation"> + * <objectAnimator + * android:duration="6000" + * android:propertyName="rotation" + * android:valueFrom="0" + * android:valueTo="360" /> + * </aapt:attr> + * </target> + * + * <target android:name="v" > + * <aapt:attr name="android:animation"> + * <set> + * <objectAnimator + * android:duration="3000" + * android:propertyName="pathData" + * android:valueFrom="M300,70 l 0,-70 70,70 0,0 -70,70z" + * android:valueTo="M300,70 l 0,-70 70,0 0,140 -70,0 z" + * android:valueType="pathType"/> + * </set> + * </aapt:attr> + * </target> + * </animated-vector> + * </pre> * * @attr ref android.R.styleable#AnimatedVectorDrawable_drawable * @attr ref android.R.styleable#AnimatedVectorDrawableTarget_name diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index 7f3a4373639b..3aca867c0347 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -1422,9 +1422,10 @@ public abstract class Drawable { /** * Obtains styled attributes from the theme, if available, or unstyled * resources if the theme is null. + * @hide */ - static @NonNull TypedArray obtainAttributes(@NonNull Resources res, @Nullable Theme theme, - @NonNull AttributeSet set, @NonNull int[] attrs) { + protected static @NonNull TypedArray obtainAttributes(@NonNull Resources res, + @Nullable Theme theme, @NonNull AttributeSet set, @NonNull int[] attrs) { if (theme == null) { return res.obtainAttributes(set, attrs); } diff --git a/graphics/java/android/graphics/drawable/DrawableContainer.java b/graphics/java/android/graphics/drawable/DrawableContainer.java index cc7f5c7cf753..c7a3c75f3545 100644 --- a/graphics/java/android/graphics/drawable/DrawableContainer.java +++ b/graphics/java/android/graphics/drawable/DrawableContainer.java @@ -27,8 +27,8 @@ import android.graphics.ColorFilter; import android.graphics.Insets; import android.graphics.Outline; import android.graphics.PixelFormat; -import android.graphics.Rect; import android.graphics.PorterDuff.Mode; +import android.graphics.Rect; import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.LayoutDirection; @@ -601,8 +601,9 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { * during inflation. * * @param res the resources used to inflate density-dependent values + * @hide */ - final void updateDensity(Resources res) { + protected final void updateDensity(Resources res) { mDrawableContainerState.updateDensity(res); } @@ -711,7 +712,10 @@ public class DrawableContainer extends Drawable implements Drawable.Callback { boolean mHasTintList; boolean mHasTintMode; - DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, + /** + * @hide + */ + protected DrawableContainerState(DrawableContainerState orig, DrawableContainer owner, Resources res) { mOwner = owner; mSourceRes = res != null ? res : (orig != null ? orig.mSourceRes : null); diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java index 3dbd2a96b00a..8c633b0da93a 100644 --- a/graphics/java/android/graphics/drawable/GradientDrawable.java +++ b/graphics/java/android/graphics/drawable/GradientDrawable.java @@ -475,16 +475,17 @@ public class GradientDrawable extends Drawable { } /** - * Sets the center location in pixels of the gradient. The radius is - * honored only when the gradient type is set to {@link #RADIAL_GRADIENT} - * or {@link #SWEEP_GRADIENT}. + * Sets the position of the center of the gradient as a fraction of the + * width and height. + * <p> + * The default value is (0.5, 0.5). * <p> * <strong>Note</strong>: changing this property will affect all instances * of a drawable loaded from a resource. It is recommended to invoke * {@link #mutate()} before changing this property. * - * @param x the x coordinate of the gradient's center in pixels - * @param y the y coordinate of the gradient's center in pixels + * @param x the X-position of the center of the gradient + * @param y the Y-position of the center of the gradient * * @see #mutate() * @see #setGradientType(int) @@ -498,9 +499,10 @@ public class GradientDrawable extends Drawable { } /** - * Returns the center X location of this gradient in pixels. + * Returns the X-position of the center of the gradient as a fraction of + * the width. * - * @return the center X location of this gradient in pixels + * @return the X-position of the center of the gradient * @see #setGradientCenter(float, float) */ public float getGradientCenterX() { @@ -508,9 +510,10 @@ public class GradientDrawable extends Drawable { } /** - * Returns the center Y location of this gradient in pixels. + * Returns the Y-position of the center of this gradient as a fraction of + * the height. * - * @return the center Y location of this gradient in pixels + * @return the Y-position of the center of the gradient * @see #setGradientCenter(float, float) */ public float getGradientCenterY() { @@ -554,19 +557,43 @@ public class GradientDrawable extends Drawable { } /** - * Sets whether or not this drawable will honor its {@code level} property. + * Sets whether this drawable's {@code level} property will be used to + * scale the gradient. If a gradient is not used, this property has no + * effect. * <p> - * <strong>Note</strong>: changing this property will affect all instances + * Scaling behavior varies based on gradient type: + * <ul> + * <li>{@link #LINEAR_GRADIENT} adjusts the ending position along the + * gradient's axis of orientation (see {@link #getOrientation()}) + * <li>{@link #RADIAL_GRADIENT} adjusts the outer radius + * <li>{@link #SWEEP_GRADIENT} adjusts the ending angle + * <ul> + * <p> + * The default value for this property is {@code false}. + * <p> + * <strong>Note</strong>: This property corresponds to the + * {@code android:useLevel} attribute on the inner {@code <gradient>} + * tag, NOT the {@code android:useLevel} attribute on the outer + * {@code <shape>} tag. For example, + * <pre>{@code + * <shape ...> + * <gradient + * ... + * android:useLevel="true" /> + * </shape> + * }</pre><p> + * <strong>Note</strong>: Changing this property will affect all instances * of a drawable loaded from a resource. It is recommended to invoke * {@link #mutate()} before changing this property. * - * @param useLevel {@code true} if this drawable should honor its level, - * {@code false} otherwise + * @param useLevel {@code true} if the gradient should be scaled based on + * level, {@code false} otherwise * * @see #mutate() * @see #setLevel(int) * @see #getLevel() * @see #getUseLevel() + * @attr ref android.R.styleable#GradientDrawableGradient_useLevel */ public void setUseLevel(boolean useLevel) { mGradientState.mUseLevel = useLevel; @@ -575,12 +602,13 @@ public class GradientDrawable extends Drawable { } /** - * Returns whether or not this drawable will honor its {@code level} - * property. + * Returns whether this drawable's {@code level} property will be used to + * scale the gradient. * - * @return {@code true} if this drawable should honor its level, + * @return {@code true} if the gradient should be scaled based on level, * {@code false} otherwise * @see #setUseLevel(boolean) + * @attr ref android.R.styleable#GradientDrawableGradient_useLevel */ public boolean getUseLevel() { return mGradientState.mUseLevel; diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 1864206118b2..c30c4c2f02d6 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -269,7 +269,8 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { // If the layer doesn't have a drawable or unresolved theme // attribute for a drawable, attempt to parse one from the child - // element. + // element. If multiple child elements exist, we'll only use the + // first one. if (layer.mDrawable == null && (layer.mThemeAttrs == null || layer.mThemeAttrs[R.styleable.LayerDrawableItem_drawable] == 0)) { while ((type = parser.next()) == XmlPullParser.TEXT) { @@ -279,13 +280,12 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { + ": <item> tag requires a 'drawable' attribute or " + "child tag defining a drawable"); } - layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme); - } - if (layer.mDrawable != null) { + // We found a child drawable. Take ownership. + layer.mDrawable = Drawable.createFromXmlInner(r, parser, attrs, theme); + layer.mDrawable.setCallback(this); state.mChildrenChangingConfigurations |= layer.mDrawable.getChangingConfigurations(); - layer.mDrawable.setCallback(this); } addLayer(layer); @@ -387,7 +387,19 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { final Drawable dr = a.getDrawable(R.styleable.LayerDrawableItem_drawable); if (dr != null) { + if (layer.mDrawable != null) { + // It's possible that a drawable was already set, in which case + // we should clear the callback. We may have also integrated the + // drawable's changing configurations, but we don't have enough + // information to revert that change. + layer.mDrawable.setCallback(null); + } + + // Take ownership of the new drawable. layer.mDrawable = dr; + layer.mDrawable.setCallback(this); + state.mChildrenChangingConfigurations |= + layer.mDrawable.getChangingConfigurations(); } } diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index dc1d18f3b2bd..9ff69650294d 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -27,9 +27,9 @@ import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.Insets; import android.graphics.PixelFormat; +import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; -import android.graphics.PorterDuff.Mode; import android.graphics.Shader; import android.util.ArrayMap; import android.util.AttributeSet; @@ -140,12 +140,16 @@ import dalvik.system.VMRuntime; * in the SVG's path data. This is defined in the viewport space.</dd> * <dt><code>android:fillColor</code></dt> * <dd>Specifies the color used to fill the path. May be a color or, for SDK 24+, a color state list - * or a gradient color. If this property is animated, any value set by the animation will - * override the original value. No path fill is drawn if this property is not specified.</dd> + * or a gradient color (See {@link android.R.styleable#GradientColor} + * and {@link android.R.styleable#GradientColorItem}). + * If this property is animated, any value set by the animation will override the original value. + * No path fill is drawn if this property is not specified.</dd> * <dt><code>android:strokeColor</code></dt> * <dd>Specifies the color used to draw the path outline. May be a color or, for SDK 24+, a color - * state list or a gradient color. If this property is animated, any value set by the animation will - * override the original value. No path outline is drawn if this property is not specified.</dd> + * state list or a gradient color (See {@link android.R.styleable#GradientColor} + * and {@link android.R.styleable#GradientColorItem}). + * If this property is animated, any value set by the animation will override the original value. + * No path outline is drawn if this property is not specified.</dd> * <dt><code>android:strokeWidth</code></dt> * <dd>The width a path stroke.</dd> * <dt><code>android:strokeAlpha</code></dt> @@ -166,8 +170,9 @@ import dalvik.system.VMRuntime; * <dt><code>android:strokeMiterLimit</code></dt> * <dd>Sets the Miter limit for a stroked path.</dd> * <dt><code>android:fillType</code></dt> - * <dd>Sets the fillType for a path. It is the same as SVG's "fill-rule" properties. - * For more details, see https://www.w3.org/TR/SVG/painting.html#FillRuleProperty</dd> + * <dd>Sets the fillType for a path. The types can be either "evenOdd" or "nonZero". They behave the + * same as SVG's "fill-rule" properties. For more details, see + * <a href="https://www.w3.org/TR/SVG/painting.html#FillRuleProperty">FillRuleProperty</a></dd> * </dl></dd> * </dl> * @@ -201,7 +206,26 @@ import dalvik.system.VMRuntime; * android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> * </group> * </vector> - * </pre></li> + * </pre> + * </li> + * <li>And here is an example of linear gradient color, which is supported in SDK 24+. + * See more details in {@link android.R.styleable#GradientColor} and + * {@link android.R.styleable#GradientColorItem}. + * <pre> + * <gradient xmlns:android="http://schemas.android.com/apk/res/android" + * android:angle="90" + * android:startColor="?android:attr/colorPrimary" + * android:endColor="?android:attr/colorControlActivated" + * android:centerColor="#f00" + * android:startX="0" + * android:startY="0" + * android:endX="100" + * android:endY="100" + * android:type="linear"> + * </gradient> + * </pre> + * </li> + * */ public class VectorDrawable extends Drawable { diff --git a/graphics/java/android/graphics/pdf/PdfEditor.java b/graphics/java/android/graphics/pdf/PdfEditor.java index 2b70b6a45f82..cd1f8de6ee0f 100644 --- a/graphics/java/android/graphics/pdf/PdfEditor.java +++ b/graphics/java/android/graphics/pdf/PdfEditor.java @@ -79,8 +79,12 @@ public final class PdfEditor { } mInput = input; - mNativeDocument = nativeOpen(mInput.getFd(), size); - mPageCount = nativeGetPageCount(mNativeDocument); + + synchronized (PdfRenderer.sPdfiumLock) { + mNativeDocument = nativeOpen(mInput.getFd(), size); + mPageCount = nativeGetPageCount(mNativeDocument); + } + mCloseGuard.open("close"); } @@ -102,7 +106,10 @@ public final class PdfEditor { public void removePage(int pageIndex) { throwIfClosed(); throwIfPageNotInDocument(pageIndex); - mPageCount = nativeRemovePage(mNativeDocument, pageIndex); + + synchronized (PdfRenderer.sPdfiumLock) { + mPageCount = nativeRemovePage(mNativeDocument, pageIndex); + } } /** @@ -125,11 +132,16 @@ public final class PdfEditor { if (clip == null) { Point size = new Point(); getPageSize(pageIndex, size); - nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, - 0, 0, size.x, size.y); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, + 0, 0, size.x, size.y); + } } else { - nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, - clip.left, clip.top, clip.right, clip.bottom); + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetTransformAndClip(mNativeDocument, pageIndex, transform.native_instance, + clip.left, clip.top, clip.right, clip.bottom); + } } } @@ -143,7 +155,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutSizeNull(outSize); throwIfPageNotInDocument(pageIndex); - nativeGetPageSize(mNativeDocument, pageIndex, outSize); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeGetPageSize(mNativeDocument, pageIndex, outSize); + } } /** @@ -156,7 +171,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutMediaBoxNull(outMediaBox); throwIfPageNotInDocument(pageIndex); - return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeGetPageMediaBox(mNativeDocument, pageIndex, outMediaBox); + } } /** @@ -169,7 +187,10 @@ public final class PdfEditor { throwIfClosed(); throwIfMediaBoxNull(mediaBox); throwIfPageNotInDocument(pageIndex); - nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetPageMediaBox(mNativeDocument, pageIndex, mediaBox); + } } /** @@ -182,7 +203,10 @@ public final class PdfEditor { throwIfClosed(); throwIfOutCropBoxNull(outCropBox); throwIfPageNotInDocument(pageIndex); - return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeGetPageCropBox(mNativeDocument, pageIndex, outCropBox); + } } /** @@ -195,7 +219,10 @@ public final class PdfEditor { throwIfClosed(); throwIfCropBoxNull(cropBox); throwIfPageNotInDocument(pageIndex); - nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeSetPageCropBox(mNativeDocument, pageIndex, cropBox); + } } /** @@ -205,7 +232,10 @@ public final class PdfEditor { */ public boolean shouldScaleForPrinting() { throwIfClosed(); - return nativeScaleForPrinting(mNativeDocument); + + synchronized (PdfRenderer.sPdfiumLock) { + return nativeScaleForPrinting(mNativeDocument); + } } /** @@ -219,7 +249,10 @@ public final class PdfEditor { public void write(ParcelFileDescriptor output) throws IOException { try { throwIfClosed(); - nativeWrite(mNativeDocument, output.getFd()); + + synchronized (PdfRenderer.sPdfiumLock) { + nativeWrite(mNativeDocument, output.getFd()); + } } finally { IoUtils.closeQuietly(output); } @@ -247,7 +280,9 @@ public final class PdfEditor { } private void doClose() { - nativeClose(mNativeDocument); + synchronized (PdfRenderer.sPdfiumLock) { + nativeClose(mNativeDocument); + } IoUtils.closeQuietly(mInput); mInput = null; mCloseGuard.close(); diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 520ebe5f2db8..cfc130990e92 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -99,6 +99,12 @@ import java.lang.annotation.RetentionPolicy; * @see #close() */ public final class PdfRenderer implements AutoCloseable { + /** + * Any call the native pdfium code has to be single threaded as the library does not support + * parallel use. + */ + final static Object sPdfiumLock = new Object(); + private final CloseGuard mCloseGuard = CloseGuard.get(); private final Point mTempPoint = new Point(); @@ -154,8 +160,12 @@ public final class PdfRenderer implements AutoCloseable { } mInput = input; - mNativeDocument = nativeCreate(mInput.getFd(), size); - mPageCount = nativeGetPageCount(mNativeDocument); + + synchronized (sPdfiumLock) { + mNativeDocument = nativeCreate(mInput.getFd(), size); + mPageCount = nativeGetPageCount(mNativeDocument); + } + mCloseGuard.open("close"); } @@ -189,7 +199,10 @@ public final class PdfRenderer implements AutoCloseable { */ public boolean shouldScaleForPrinting() { throwIfClosed(); - return nativeScaleForPrinting(mNativeDocument); + + synchronized (sPdfiumLock) { + return nativeScaleForPrinting(mNativeDocument); + } } /** @@ -224,7 +237,9 @@ public final class PdfRenderer implements AutoCloseable { if (mCurrentPage != null) { mCurrentPage.close(); } - nativeClose(mNativeDocument); + synchronized (sPdfiumLock) { + nativeClose(mNativeDocument); + } try { mInput.close(); } catch (IOException ioe) { @@ -277,7 +292,9 @@ public final class PdfRenderer implements AutoCloseable { private Page(int index) { Point size = mTempPoint; - mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size); + synchronized (sPdfiumLock) { + mNativePage = nativeOpenPageAndGetSize(mNativeDocument, index, size); + } mIndex = index; mWidth = size.x; mHeight = size.y; @@ -384,8 +401,10 @@ public final class PdfRenderer implements AutoCloseable { final long transformPtr = (transform != null) ? transform.native_instance : 0; - nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft, - contentTop, contentRight, contentBottom, transformPtr, renderMode); + synchronized (sPdfiumLock) { + nativeRenderPage(mNativeDocument, mNativePage, destination, contentLeft, + contentTop, contentRight, contentBottom, transformPtr, renderMode); + } } /** @@ -412,7 +431,9 @@ public final class PdfRenderer implements AutoCloseable { } private void doClose() { - nativeClosePage(mNativePage); + synchronized (sPdfiumLock) { + nativeClosePage(mNativePage); + } mNativePage = 0; mCloseGuard.close(); mCurrentPage = null; diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index cce58c2096f3..a96ca3922296 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -20,6 +20,7 @@ import android.annotation.Nullable; import android.annotation.WorkerThread; import android.app.Activity; import android.app.PendingIntent; +import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -356,6 +357,9 @@ public final class KeyChain { * * <p> This method may block while waiting for a connection to another process, and must never * be called from the main thread. + * <p> As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed + * at any time from the main thread, it is safer to rely on a long-lived context such as one + * returned from {@link Context#getApplicationContext()}. * * @param alias The alias of the desired private key, typically returned via * {@link KeyChainAliasCallback#alias}. @@ -368,7 +372,7 @@ public final class KeyChain { if (alias == null) { throw new NullPointerException("alias == null"); } - KeyChainConnection keyChainConnection = bind(context); + KeyChainConnection keyChainConnection = bind(context.getApplicationContext()); try { final IKeyChainService keyChainService = keyChainConnection.getService(); final String keyId = keyChainService.requestPrivateKey(alias); @@ -400,6 +404,9 @@ public final class KeyChain { * * <p> This method may block while waiting for a connection to another process, and must never * be called from the main thread. + * <p> As {@link Activity} and {@link Service} contexts are short-lived and can be destroyed + * at any time from the main thread, it is safer to rely on a long-lived context such as one + * returned from {@link Context#getApplicationContext()}. * * @param alias The alias of the desired certificate chain, typically * returned via {@link KeyChainAliasCallback#alias}. @@ -412,7 +419,7 @@ public final class KeyChain { if (alias == null) { throw new NullPointerException("alias == null"); } - KeyChainConnection keyChainConnection = bind(context); + KeyChainConnection keyChainConnection = bind(context.getApplicationContext()); try { IKeyChainService keyChainService = keyChainConnection.getService(); diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 366ef716c109..74b474eef371 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -3,6 +3,7 @@ include $(CLEAR_VARS) LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk HWUI_NEW_OPS := true +BUGREPORT_FONT_CACHE_USAGE := true # Enables fine-grained GLES error checking # If set to true, every GLES call is wrapped & error checked @@ -135,6 +136,13 @@ ifeq (true, $(HWUI_NEW_OPS)) endif +ifeq (true, $(BUGREPORT_FONT_CACHE_USAGE)) + hwui_src_files += \ + font/FontCacheHistoryTracker.cpp + hwui_cflags += -DBUGREPORT_FONT_CACHE_USAGE +endif + + ifndef HWUI_COMPILE_SYMBOLS hwui_cflags += -fvisibility=hidden endif diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 949ad450d5f7..a8ced9b2597b 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -21,6 +21,9 @@ #include "Properties.h" #include "renderstate/RenderState.h" #include "ShadowTessellator.h" +#ifdef BUGREPORT_FONT_CACHE_USAGE +#include "font/FontCacheHistoryTracker.h" +#endif #include "utils/GLUtils.h" #include <cutils/properties.h> @@ -195,12 +198,7 @@ void Caches::dumpMemoryUsage(String8 &log) { log.appendFormat(" PatchCache %8d / %8d\n", patchCache.getSize(), patchCache.getMaxSize()); - const uint32_t sizeA8 = fontRenderer.getFontRendererSize(GL_ALPHA); - const uint32_t sizeRGBA = fontRenderer.getFontRendererSize(GL_RGBA); - log.appendFormat(" FontRenderer A8 %8d / %8d\n", sizeA8, sizeA8); - log.appendFormat(" FontRenderer RGBA %8d / %8d\n", sizeRGBA, sizeRGBA); - log.appendFormat(" FontRenderer total %8d / %8d\n", sizeA8 + sizeRGBA, - sizeA8 + sizeRGBA); + fontRenderer.dumpMemoryUsage(log); log.appendFormat("Other:\n"); log.appendFormat(" FboCache %8d / %8d\n", @@ -213,11 +211,14 @@ void Caches::dumpMemoryUsage(String8 &log) { total += tessellationCache.getSize(); total += dropShadowCache.getSize(); total += patchCache.getSize(); - total += fontRenderer.getFontRendererSize(GL_ALPHA); - total += fontRenderer.getFontRendererSize(GL_RGBA); + total += fontRenderer.getSize(); log.appendFormat("Total memory usage:\n"); log.appendFormat(" %d bytes, %.2f MB\n", total, total / 1024.0f / 1024.0f); + +#ifdef BUGREPORT_FONT_CACHE_USAGE + fontRenderer.getFontRenderer().historyTracker().dump(log); +#endif } /////////////////////////////////////////////////////////////////////////////// diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 276c18d0d3f9..681cf55066b4 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -168,10 +168,17 @@ void FontRenderer::flushAllAndInvalidate() { for (uint32_t i = 0; i < mACacheTextures.size(); i++) { mACacheTextures[i]->init(); + +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(mACacheTextures[i]); +#endif } for (uint32_t i = 0; i < mRGBACacheTextures.size(); i++) { mRGBACacheTextures[i]->init(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(mRGBACacheTextures[i]); +#endif } mDrawn = false; @@ -183,6 +190,9 @@ void FontRenderer::flushLargeCaches(std::vector<CacheTexture*>& cacheTextures) { CacheTexture* cacheTexture = cacheTextures[i]; if (cacheTexture->getPixelBuffer()) { cacheTexture->init(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphsCleared(cacheTexture); +#endif LruCache<Font::FontDescription, Font*>::Iterator it(mActiveFonts); while (it.next()) { it.value()->invalidateTextureCache(cacheTexture); @@ -385,6 +395,10 @@ void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyp } cachedGlyph->mIsValid = true; + +#ifdef BUGREPORT_FONT_CACHE_USAGE + mHistoryTracker.glyphUploaded(cacheTexture, startX, startY, glyph.fWidth, glyph.fHeight); +#endif } CacheTexture* FontRenderer::createCacheTexture(int width, int height, GLenum format, @@ -747,19 +761,68 @@ static uint32_t calculateCacheSize(const std::vector<CacheTexture*>& cacheTextur return size; } -uint32_t FontRenderer::getCacheSize(GLenum format) const { +static uint32_t calculateFreeCacheSize(const std::vector<CacheTexture*>& cacheTextures) { + uint32_t size = 0; + for (uint32_t i = 0; i < cacheTextures.size(); i++) { + CacheTexture* cacheTexture = cacheTextures[i]; + if (cacheTexture && cacheTexture->getPixelBuffer()) { + size += cacheTexture->calculateFreeMemory(); + } + } + return size; +} + +const std::vector<CacheTexture*>& FontRenderer::cacheTexturesForFormat(GLenum format) const { switch (format) { case GL_ALPHA: { - return calculateCacheSize(mACacheTextures); + return mACacheTextures; } case GL_RGBA: { - return calculateCacheSize(mRGBACacheTextures); + return mRGBACacheTextures; } default: { - return 0; + LOG_ALWAYS_FATAL("Unsupported format: %d", format); + // Impossible to hit this, but the compiler doesn't know that + return *(new std::vector<CacheTexture*>()); } } } +static void dumpTextures(String8& log, const char* tag, + const std::vector<CacheTexture*>& cacheTextures) { + for (uint32_t i = 0; i < cacheTextures.size(); i++) { + CacheTexture* cacheTexture = cacheTextures[i]; + if (cacheTexture && cacheTexture->getPixelBuffer()) { + uint32_t free = cacheTexture->calculateFreeMemory(); + uint32_t total = cacheTexture->getPixelBuffer()->getSize(); + log.appendFormat(" %-4s texture %d %8d / %8d\n", tag, i, total - free, total); + } + } +} + +void FontRenderer::dumpMemoryUsage(String8& log) const { + const uint32_t sizeA8 = getCacheSize(GL_ALPHA); + const uint32_t usedA8 = sizeA8 - getFreeCacheSize(GL_ALPHA); + const uint32_t sizeRGBA = getCacheSize(GL_RGBA); + const uint32_t usedRGBA = sizeRGBA - getFreeCacheSize(GL_RGBA); + log.appendFormat(" FontRenderer A8 %8d / %8d\n", usedA8, sizeA8); + dumpTextures(log, "A8", cacheTexturesForFormat(GL_ALPHA)); + log.appendFormat(" FontRenderer RGBA %8d / %8d\n", usedRGBA, sizeRGBA); + dumpTextures(log, "RGBA", cacheTexturesForFormat(GL_RGBA)); + log.appendFormat(" FontRenderer total %8d / %8d\n", usedA8 + usedRGBA, sizeA8 + sizeRGBA); +} + +uint32_t FontRenderer::getCacheSize(GLenum format) const { + return calculateCacheSize(cacheTexturesForFormat(format)); +} + +uint32_t FontRenderer::getFreeCacheSize(GLenum format) const { + return calculateFreeCacheSize(cacheTexturesForFormat(format)); +} + +uint32_t FontRenderer::getSize() const { + return getCacheSize(GL_ALPHA) + getCacheSize(GL_RGBA); +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index e10a81b8ccd8..504dce862f71 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -21,8 +21,12 @@ #include "font/CacheTexture.h" #include "font/CachedGlyphInfo.h" #include "font/Font.h" +#ifdef BUGREPORT_FONT_CACHE_USAGE +#include "font/FontCacheHistoryTracker.h" +#endif #include <utils/LruCache.h> +#include <utils/String8.h> #include <utils/StrongPointer.h> #include <SkPaint.h> @@ -132,7 +136,12 @@ public: mLinearFiltering = linearFiltering; } - uint32_t getCacheSize(GLenum format) const; + uint32_t getSize() const; + void dumpMemoryUsage(String8& log) const; + +#ifdef BUGREPORT_FONT_CACHE_USAGE + FontCacheHistoryTracker& historyTracker() { return mHistoryTracker; } +#endif private: friend class Font; @@ -175,6 +184,10 @@ private: mUploadTexture = true; } + const std::vector<CacheTexture*>& cacheTexturesForFormat(GLenum format) const; + uint32_t getCacheSize(GLenum format) const; + uint32_t getFreeCacheSize(GLenum format) const; + uint32_t mSmallCacheWidth; uint32_t mSmallCacheHeight; uint32_t mLargeCacheWidth; @@ -199,6 +212,10 @@ private: bool mLinearFiltering; +#ifdef BUGREPORT_FONT_CACHE_USAGE + FontCacheHistoryTracker mHistoryTracker; +#endif + #ifdef ANDROID_ENABLE_RENDERSCRIPT // RS constructs RSC::sp<RSC::RS> mRs; diff --git a/libs/hwui/GammaFontRenderer.h b/libs/hwui/GammaFontRenderer.h index 5813e7f717ee..bd27a1a72060 100644 --- a/libs/hwui/GammaFontRenderer.h +++ b/libs/hwui/GammaFontRenderer.h @@ -22,6 +22,8 @@ #include <SkPaint.h> +#include <utils/String8.h> + namespace android { namespace uirenderer { @@ -46,8 +48,16 @@ public: return *mRenderer; } - uint32_t getFontRendererSize(GLenum format) const { - return mRenderer ? mRenderer->getCacheSize(format) : 0; + void dumpMemoryUsage(String8& log) const { + if (mRenderer) { + mRenderer->dumpMemoryUsage(log); + } else { + log.appendFormat("FontRenderer doesn't exist.\n"); + } + } + + uint32_t getSize() const { + return mRenderer ? mRenderer->getSize() : 0; } void endPrecaching(); diff --git a/libs/hwui/Readback.cpp b/libs/hwui/Readback.cpp index 55f823dfe226..0ab247dc8052 100644 --- a/libs/hwui/Readback.cpp +++ b/libs/hwui/Readback.cpp @@ -136,7 +136,7 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, EGL_NATIVE_BUFFER_ANDROID, clientBuffer, attrs); if (sourceImage == EGL_NO_IMAGE_KHR) { - ALOGW("Error creating image (%#x)", eglGetError()); + ALOGW("eglCreateImageKHR failed (%#x)", eglGetError()); return CopyResult::UnknownError; } GLuint sourceTexId; @@ -147,7 +147,8 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, GLenum status = GL_NO_ERROR; while ((status = glGetError()) != GL_NO_ERROR) { - ALOGW("Error creating image (%#x)", status); + ALOGW("glEGLImageTargetTexture2DOES failed (%#x)", status); + eglDestroyImageKHR(display, sourceImage); return CopyResult::UnknownError; } @@ -183,6 +184,13 @@ CopyResult Readback::copySurfaceInto(renderthread::RenderThread& renderThread, caches.textureState().deleteTexture(texture); renderState.deleteFramebuffer(fbo); + sourceTexture.deleteTexture(); + // All we're flushing & finishing is the deletion of the texture since + // copyTextureInto already did a major flush & finish as an implicit + // part of glReadPixels, so this shouldn't pose any major stalls. + glFinish(); + eglDestroyImageKHR(display, sourceImage); + GL_CHECKPOINT(MODERATE); return CopyResult::Success; diff --git a/libs/hwui/SkiaCanvas.cpp b/libs/hwui/SkiaCanvas.cpp index ce67554645d1..c7289fce1fbf 100644 --- a/libs/hwui/SkiaCanvas.cpp +++ b/libs/hwui/SkiaCanvas.cpp @@ -329,9 +329,10 @@ void SkiaCanvas::restoreToCount(int restoreCount) { static inline SkCanvas::SaveLayerFlags layerFlags(SaveFlags::Flags flags) { SkCanvas::SaveLayerFlags layerFlags = 0; - if (!(flags & SaveFlags::HasAlphaLayer)) { - layerFlags |= SkCanvas::kIsOpaque_SaveLayerFlag; - } + // We intentionally ignore the SaveFlags::HasAlphaLayer and + // SkCanvas::kIsOpaque_SaveLayerFlag flags because HWUI ignores it + // and our Android client may use it incorrectly. + // In Skia, this flag is purely for performance optimization. if (!(flags & SaveFlags::ClipToLayer)) { layerFlags |= SkCanvas::kDontClipToLayer_Legacy_SaveLayerFlag; diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp index 8ba4761c1b2e..4b13814bfdc6 100644 --- a/libs/hwui/font/CacheTexture.cpp +++ b/libs/hwui/font/CacheTexture.cpp @@ -324,5 +324,17 @@ bool CacheTexture::fitBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_ return false; } +uint32_t CacheTexture::calculateFreeMemory() const { + CacheBlock* cacheBlock = mCacheBlocks; + uint32_t free = 0; + // currently only two formats are supported: GL_ALPHA or GL_RGBA; + uint32_t bpp = mFormat == GL_RGBA ? 4 : 1; + while (cacheBlock) { + free += bpp * cacheBlock->mWidth * cacheBlock->mHeight; + cacheBlock = cacheBlock->mNext; + } + return free; +} + }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/font/CacheTexture.h b/libs/hwui/font/CacheTexture.h index 4dfb41dafcc7..6750a8ae11cf 100644 --- a/libs/hwui/font/CacheTexture.h +++ b/libs/hwui/font/CacheTexture.h @@ -178,6 +178,8 @@ public: return mCurrentQuad == mMaxQuadCount; } + uint32_t calculateFreeMemory() const; + private: void setDirty(bool dirty); diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp index 8e04c8715f62..a95454a4c010 100644 --- a/libs/hwui/font/Font.cpp +++ b/libs/hwui/font/Font.cpp @@ -408,9 +408,15 @@ void Font::render(const SkPaint* paint, const glyph_t* glyphs, if (cachedGlyph->mIsValid && cachedGlyph->mCacheTexture) { int penX = x + (int) roundf(positions[(glyphsCount << 1)]); int penY = y + (int) roundf(positions[(glyphsCount << 1) + 1]); - +#ifdef BUGREPORT_FONT_CACHE_USAGE + mState->historyTracker().glyphRendered(cachedGlyph, penX, penY); +#endif (*this.*render)(cachedGlyph, penX, penY, bitmap, bitmapW, bitmapH, bounds, positions); + } else { +#ifdef BUGREPORT_FONT_CACHE_USAGE + mState->historyTracker().glyphRendered(cachedGlyph, -1, -1); +#endif } glyphsCount++; diff --git a/libs/hwui/font/FontCacheHistoryTracker.cpp b/libs/hwui/font/FontCacheHistoryTracker.cpp new file mode 100644 index 000000000000..a2bfb27535e5 --- /dev/null +++ b/libs/hwui/font/FontCacheHistoryTracker.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2016 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. + */ + +#include "FontCacheHistoryTracker.h" + +#include "CachedGlyphInfo.h" +#include "CacheTexture.h" + +namespace android { +namespace uirenderer { + +void FontCacheHistoryTracker::dumpCachedGlyph(String8& log, const CachedGlyph& glyph) { + log.appendFormat("glyph (texture %p, position: (%d, %d), size: %dx%d, gen: %d)", glyph.texture, + glyph.startX, glyph.startY, glyph.bitmapW, glyph.bitmapH, glyph.generation); +} + +void FontCacheHistoryTracker::dumpRenderEntry(String8& log, const RenderEntry& entry) { + if (entry.penX == -1 && entry.penY == -1) { + log.appendFormat(" glyph skipped in gen: %d\n", entry.glyph.generation); + } else { + log.appendFormat(" rendered "); + dumpCachedGlyph(log, entry.glyph); + log.appendFormat(" at (%d, %d)\n", entry.penX, entry.penY); + } +} + +void FontCacheHistoryTracker::dumpUploadEntry(String8& log, const CachedGlyph& glyph) { + if (glyph.bitmapW == 0 && glyph.bitmapH == 0) { + log.appendFormat(" cleared cachetexture %p in gen %d\n", glyph.texture, + glyph.generation); + } else { + log.appendFormat(" uploaded "); + dumpCachedGlyph(log, glyph); + log.appendFormat("\n"); + } +} + +void FontCacheHistoryTracker::dump(String8& log) const { + log.appendFormat("FontCacheHistory: \n"); + log.appendFormat(" Upload history: \n"); + for (size_t i = 0; i < mUploadHistory.size(); i++) { + dumpUploadEntry(log, mUploadHistory[i]); + } + log.appendFormat(" Render history: \n"); + for (size_t i = 0; i < mRenderHistory.size(); i++) { + dumpRenderEntry(log, mRenderHistory[i]); + } +} + +void FontCacheHistoryTracker::glyphRendered(CachedGlyphInfo* glyphInfo, int penX, int penY) { + RenderEntry& entry = mRenderHistory.next(); + entry.glyph.generation = generation; + entry.glyph.texture = glyphInfo->mCacheTexture; + entry.glyph.startX = glyphInfo->mStartX; + entry.glyph.startY = glyphInfo->mStartY; + entry.glyph.bitmapW = glyphInfo->mBitmapWidth; + entry.glyph.bitmapH = glyphInfo->mBitmapHeight; + entry.penX = penX; + entry.penY = penY; +} + +void FontCacheHistoryTracker::glyphUploaded(CacheTexture* texture, uint32_t x, uint32_t y, + uint16_t glyphW, uint16_t glyphH) { + CachedGlyph& glyph = mUploadHistory.next(); + glyph.generation = generation; + glyph.texture = texture; + glyph.startX = x; + glyph.startY = y; + glyph.bitmapW = glyphW; + glyph.bitmapH = glyphH; +} + +void FontCacheHistoryTracker::glyphsCleared(CacheTexture* texture) { + CachedGlyph& glyph = mUploadHistory.next(); + glyph.generation = generation; + glyph.texture = texture; + glyph.startX = 0; + glyph.startY = 0; + glyph.bitmapW = 0; + glyph.bitmapH = 0; +} + +void FontCacheHistoryTracker::frameCompleted() { + generation++; +} +}; // namespace uirenderer +}; // namespace android diff --git a/libs/hwui/font/FontCacheHistoryTracker.h b/libs/hwui/font/FontCacheHistoryTracker.h new file mode 100644 index 000000000000..f1d9b9f10dc0 --- /dev/null +++ b/libs/hwui/font/FontCacheHistoryTracker.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2016 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. + */ + +#pragma once +#include "../utils/RingBuffer.h" + +#include <utils/String8.h> + +namespace android { +namespace uirenderer { + +class CacheTexture; +struct CachedGlyphInfo; + +// Tracks glyph uploads and recent rendered/skipped glyphs, so it can give an idea +// what a missing character is: skipped glyph, wrong coordinates in cache texture etc. +class FontCacheHistoryTracker { +public: + void glyphRendered(CachedGlyphInfo*, int penX, int penY); + void glyphUploaded(CacheTexture*, uint32_t x, uint32_t y, uint16_t glyphW, uint16_t glyphH); + void glyphsCleared(CacheTexture*); + void frameCompleted(); + + void dump(String8& log) const; +private: + struct CachedGlyph { + void* texture; + uint16_t generation; + uint16_t startX; + uint16_t startY; + uint16_t bitmapW; + uint16_t bitmapH; + }; + + struct RenderEntry { + CachedGlyph glyph; + int penX; + int penY; + }; + + static void dumpCachedGlyph(String8& log, const CachedGlyph& glyph); + static void dumpRenderEntry(String8& log, const RenderEntry& entry); + static void dumpUploadEntry(String8& log, const CachedGlyph& glyph); + + RingBuffer<RenderEntry, 300> mRenderHistory; + RingBuffer<CachedGlyph, 120> mUploadHistory; + uint16_t generation = 0; +}; + +}; // namespace uirenderer +}; // namespace android
\ No newline at end of file diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index dcaec428449c..975ac8368e3d 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -608,6 +608,10 @@ void CanvasContext::draw() { } GpuMemoryTracker::onFrameCompleted(); +#ifdef BUGREPORT_FONT_CACHE_USAGE + caches.fontRenderer.getFontRenderer().historyTracker().frameCompleted(); +#endif + } // Called by choreographer to do an RT-driven animation @@ -633,6 +637,9 @@ void CanvasContext::prepareAndDraw(RenderNode* node) { prepareTree(info, frameInfo, systemTime(CLOCK_MONOTONIC), node); if (info.out.canDrawThisFrame) { draw(); + } else { + // wait on fences so tasks don't overlap next frame + waitOnFences(); } } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 3eef29b24473..e1821751b57f 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -168,6 +168,8 @@ public: ANDROID_API int64_t getFrameNumber(); + void waitOnFences(); + private: friend class RegisterFrameCallbackTask; // TODO: Replace with something better for layer & other GL object @@ -178,8 +180,6 @@ private: void freePrefetchedLayers(TreeObserver* observer); - void waitOnFences(); - bool isSwapChainStuffed(); EGLint mLastFrameWidth = 0; diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index c9c07b3df292..e3b6dc6fd9fe 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -104,6 +104,9 @@ void DrawFrameTask::run() { if (CC_LIKELY(canDrawThisFrame)) { context->draw(); + } else { + // wait on fences so tasks don't overlap next frame + context->waitOnFences(); } if (!canUnblockUiThread) { diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index 27193b743379..abef66f9ecd9 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -36,6 +36,29 @@ namespace android { +// --- WeakLooperCallback --- + +class WeakLooperCallback: public LooperCallback { +protected: + virtual ~WeakLooperCallback() { } + +public: + WeakLooperCallback(const wp<LooperCallback>& callback) : + mCallback(callback) { + } + + virtual int handleEvent(int fd, int events, void* data) { + sp<LooperCallback> callback = mCallback.promote(); + if (callback != NULL) { + return callback->handleEvent(fd, events, data); + } + return 0; // the client is gone, remove the callback + } + +private: + wp<LooperCallback> mCallback; +}; + // --- PointerController --- // Time to wait before starting the fade when the pointer is inactive. @@ -57,10 +80,11 @@ PointerController::PointerController(const sp<PointerControllerPolicyInterface>& const sp<Looper>& looper, const sp<SpriteController>& spriteController) : mPolicy(policy), mLooper(looper), mSpriteController(spriteController) { mHandler = new WeakMessageHandler(this); + mCallback = new WeakLooperCallback(this); if (mDisplayEventReceiver.initCheck() == NO_ERROR) { mLooper->addFd(mDisplayEventReceiver.getFd(), Looper::POLL_CALLBACK, - Looper::EVENT_INPUT, this, nullptr); + Looper::EVENT_INPUT, mCallback, nullptr); } else { ALOGE("Failed to initialize DisplayEventReceiver."); } diff --git a/libs/input/PointerController.h b/libs/input/PointerController.h index 99292d7ca8a6..4794f3da824c 100644 --- a/libs/input/PointerController.h +++ b/libs/input/PointerController.h @@ -144,6 +144,7 @@ private: sp<Looper> mLooper; sp<SpriteController> mSpriteController; sp<WeakMessageHandler> mHandler; + sp<LooperCallback> mCallback; DisplayEventReceiver mDisplayEventReceiver; diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index 5286f8fa5ad3..89709ee6b95a 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -24,6 +24,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; +import android.util.SparseIntArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -170,6 +171,66 @@ public final class AudioAttributes implements Parcelable { public final static int USAGE_VIRTUAL_SOURCE = 15; /** + * IMPORTANT: when adding new usage types, add them to SDK_USAGES and update SUPPRESSIBLE_USAGES + * if applicable. + */ + + /** + * @hide + * Denotes a usage for notifications that do not expect immediate intervention from the user, + * will be muted when the Zen mode disables notifications + * @see #SUPPRESSIBLE_USAGES + */ + public final static int SUPPRESSIBLE_NOTIFICATION = 1; + /** + * @hide + * Denotes a usage for notifications that do expect immediate intervention from the user, + * will be muted when the Zen mode disables calls + * @see #SUPPRESSIBLE_USAGES + */ + public final static int SUPPRESSIBLE_CALL = 2; + + /** + * @hide + * Array of all usage types for calls and notifications to assign the suppression behavior, + * used by the Zen mode restrictions. + * @see com.android.server.notification.ZenModeHelper + */ + public static final SparseIntArray SUPPRESSIBLE_USAGES; + + static { + SUPPRESSIBLE_USAGES = new SparseIntArray(); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION, SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_RINGTONE, SUPPRESSIBLE_CALL); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_REQUEST,SUPPRESSIBLE_CALL); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_INSTANT,SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_COMMUNICATION_DELAYED,SUPPRESSIBLE_NOTIFICATION); + SUPPRESSIBLE_USAGES.put(USAGE_NOTIFICATION_EVENT, SUPPRESSIBLE_NOTIFICATION); + } + + /** + * @hide + * Array of all usage types exposed in the SDK that applications can use. + */ + public final static int[] SDK_USAGES = { + USAGE_UNKNOWN, + USAGE_MEDIA, + USAGE_VOICE_COMMUNICATION, + USAGE_VOICE_COMMUNICATION_SIGNALLING, + USAGE_ALARM, + USAGE_NOTIFICATION, + USAGE_NOTIFICATION_RINGTONE, + USAGE_NOTIFICATION_COMMUNICATION_REQUEST, + USAGE_NOTIFICATION_COMMUNICATION_INSTANT, + USAGE_NOTIFICATION_COMMUNICATION_DELAYED, + USAGE_NOTIFICATION_EVENT, + USAGE_ASSISTANCE_ACCESSIBILITY, + USAGE_ASSISTANCE_NAVIGATION_GUIDANCE, + USAGE_ASSISTANCE_SONIFICATION, + USAGE_GAME + }; + + /** * Flag defining a behavior where the audibility of the sound will be ensured by the system. */ public final static int FLAG_AUDIBILITY_ENFORCED = 0x1 << 0; diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java index 101facd4909b..9bf47938f543 100644 --- a/media/java/android/media/MediaRouter.java +++ b/media/java/android/media/MediaRouter.java @@ -219,26 +219,12 @@ public class MediaRouter { } if (mBluetoothA2dpRoute != null) { - final boolean a2dpEnabled = isBluetoothA2dpOn(); - if (mainType != AudioRoutesInfo.MAIN_SPEAKER && - mSelectedRoute == mBluetoothA2dpRoute && !a2dpEnabled) { - selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mDefaultAudioVideo, false); - } else if ((mSelectedRoute == mDefaultAudioVideo || mSelectedRoute == null) && - a2dpEnabled) { + if (mSelectedRoute == mDefaultAudioVideo || mSelectedRoute == null) { selectRouteStatic(ROUTE_TYPE_LIVE_AUDIO, mBluetoothA2dpRoute, false); } } } - boolean isBluetoothA2dpOn() { - try { - return mAudioService.isBluetoothA2dpOn(); - } catch (RemoteException e) { - Log.e(TAG, "Error querying Bluetooth A2DP state", e); - return false; - } - } - void updateDiscoveryRequest() { // What are we looking for today? int routeTypes = 0; @@ -908,6 +894,11 @@ public class MediaRouter { static void selectRouteStatic(int types, @NonNull RouteInfo route, boolean explicit) { Log.v(TAG, "Selecting route: " + route); assert(route != null); + if (route == sStatic.mDefaultAudioVideo && sStatic.mBluetoothA2dpRoute != null) { + Log.i(TAG, "Change the route to a BT route: " + sStatic.mBluetoothA2dpRoute + + "\nDo not select the default route when a BT route is available."); + route = sStatic.mBluetoothA2dpRoute; + } final RouteInfo oldRoute = sStatic.mSelectedRoute; if (oldRoute == route) return; if (!route.matchesTypes(types)) { @@ -917,16 +908,6 @@ public class MediaRouter { return; } - final RouteInfo btRoute = sStatic.mBluetoothA2dpRoute; - if (btRoute != null && (types & ROUTE_TYPE_LIVE_AUDIO) != 0 && - (route == btRoute || route == sStatic.mDefaultAudioVideo)) { - try { - sStatic.mAudioService.setBluetoothA2dpOn(route == btRoute); - } catch (RemoteException e) { - Log.e(TAG, "Error changing Bluetooth A2DP state", e); - } - } - final WifiDisplay activeDisplay = sStatic.mDisplayService.getWifiDisplayStatus().getActiveDisplay(); final boolean oldRouteHasAddress = oldRoute != null && oldRoute.mDeviceAddress != null; @@ -966,7 +947,7 @@ public class MediaRouter { static void selectDefaultRouteStatic() { // TODO: Be smarter about the route types here; this selects for all valid. if (sStatic.mSelectedRoute != sStatic.mBluetoothA2dpRoute - && sStatic.mBluetoothA2dpRoute != null && sStatic.isBluetoothA2dpOn()) { + && sStatic.mBluetoothA2dpRoute != null) { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mBluetoothA2dpRoute, false); } else { selectRouteStatic(ROUTE_TYPE_ANY, sStatic.mDefaultAudioVideo, false); @@ -1298,12 +1279,7 @@ public class MediaRouter { selectedRoute == sStatic.mDefaultAudioVideo) { dispatchRouteVolumeChanged(selectedRoute); } else if (sStatic.mBluetoothA2dpRoute != null) { - try { - dispatchRouteVolumeChanged(sStatic.mAudioService.isBluetoothA2dpOn() ? - sStatic.mBluetoothA2dpRoute : sStatic.mDefaultAudioVideo); - } catch (RemoteException e) { - Log.e(TAG, "Error checking Bluetooth A2DP state to report volume change", e); - } + dispatchRouteVolumeChanged(sStatic.mBluetoothA2dpRoute); } else { dispatchRouteVolumeChanged(sStatic.mDefaultAudioVideo); } diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index c8ab5f9bc429..0fafe4b19a42 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -21,12 +21,14 @@ import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.database.SQLException; import android.drm.DrmManagerClient; import android.graphics.BitmapFactory; import android.mtp.MtpConstants; import android.net.Uri; +import android.os.Build; import android.os.Environment; import android.os.RemoteException; import android.os.SystemProperties; @@ -153,6 +155,11 @@ public class MediaScanner implements AutoCloseable { private static final String MUSIC_DIR = "/music/"; private static final String PODCAST_DIR = "/podcasts/"; + public static final String SCANNED_BUILD_PREFS_NAME = "MediaScanBuild"; + public static final String LAST_INTERNAL_SCAN_FINGERPRINT = "lastScanFingerprint"; + private static final String SYSTEM_SOUNDS_DIR = "/system/media/audio"; + private static String sLastInternalScanFingerprint; + private static final String[] ID3_GENRES = { // ID3v1 Genres "Blues", @@ -402,6 +409,13 @@ public class MediaScanner implements AutoCloseable { mMediaProvider = mContext.getContentResolver() .acquireContentProviderClient(MediaStore.AUTHORITY); + if (sLastInternalScanFingerprint == null) { + final SharedPreferences scanSettings = + mContext.getSharedPreferences(SCANNED_BUILD_PREFS_NAME, Context.MODE_PRIVATE); + sLastInternalScanFingerprint = + scanSettings.getString(LAST_INTERNAL_SCAN_FINGERPRINT, new String()); + } + mAudioUri = Audio.Media.getContentUri(volumeName); mVideoUri = Video.Media.getContentUri(volumeName); mImagesUri = Images.Media.getContentUri(volumeName); @@ -585,16 +599,24 @@ public class MediaScanner implements AutoCloseable { entry.mRowId = 0; } - if (entry.mPath != null && - ((!mDefaultNotificationSet && + if (entry.mPath != null) { + if (((!mDefaultNotificationSet && doesPathHaveFilename(entry.mPath, mDefaultNotificationFilename)) || (!mDefaultRingtoneSet && doesPathHaveFilename(entry.mPath, mDefaultRingtoneFilename)) || (!mDefaultAlarmSet && doesPathHaveFilename(entry.mPath, mDefaultAlarmAlertFilename)))) { - Log.w(TAG, "forcing rescan of " + entry.mPath + - "since ringtone setting didn't finish"); - scanAlways = true; + Log.w(TAG, "forcing rescan of " + entry.mPath + + "since ringtone setting didn't finish"); + scanAlways = true; + } else if (isSystemSoundWithMetadata(entry.mPath) + && !Build.FINGERPRINT.equals(sLastInternalScanFingerprint)) { + // file is located on the system partition where the date cannot be trusted: + // rescan if the build fingerprint has changed since the last scan. + Log.i(TAG, "forcing rescan of " + entry.mPath + + " since build fingerprint changed"); + scanAlways = true; + } } // rescan for metadata if file was modified since last scan @@ -1128,6 +1150,15 @@ public class MediaScanner implements AutoCloseable { }; // end of anonymous MediaScannerClient instance + private static boolean isSystemSoundWithMetadata(String path) { + if (path.startsWith(SYSTEM_SOUNDS_DIR + ALARMS_DIR) + || path.startsWith(SYSTEM_SOUNDS_DIR + RINGTONES_DIR) + || path.startsWith(SYSTEM_SOUNDS_DIR + NOTIFICATIONS_DIR)) { + return true; + } + return false; + } + private String settingSetIndicatorName(String base) { return base + "_set"; } @@ -1252,16 +1283,6 @@ public class MediaScanner implements AutoCloseable { } } - private boolean inScanDirectory(String path, String[] directories) { - for (int i = 0; i < directories.length; i++) { - String directory = directories[i]; - if (path.startsWith(directory)) { - return true; - } - } - return false; - } - private void pruneDeadThumbnailFiles() { HashSet<String> existingFiles = new HashSet<String>(); String directory = "/sdcard/DCIM/.thumbnails"; diff --git a/media/java/android/media/MediaScannerConnection.java b/media/java/android/media/MediaScannerConnection.java index d71467255ff3..471fa2c4bad9 100644 --- a/media/java/android/media/MediaScannerConnection.java +++ b/media/java/android/media/MediaScannerConnection.java @@ -133,6 +133,10 @@ public class MediaScannerConnection implements ServiceConnection { } try { mContext.unbindService(this); + if (mClient instanceof ClientProxy) { + mClient = null; + } + mService = null; } catch (IllegalArgumentException ex) { if (false) { Log.v(TAG, "disconnect failed: " + ex); @@ -205,6 +209,7 @@ public class MediaScannerConnection implements ServiceConnection { void scanNextPath() { if (mNextPath >= mPaths.length) { mConnection.disconnect(); + mConnection = null; return; } String mimeType = mMimeTypes != null ? mMimeTypes[mNextPath] : null; diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java index 883c8c6ed75d..b65598cdad63 100644 --- a/obex/javax/obex/ClientOperation.java +++ b/obex/javax/obex/ClientOperation.java @@ -207,7 +207,6 @@ public final class ClientOperation implements Operation, BaseStream { * object */ public synchronized int getResponseCode() throws IOException { - //avoid dup validateConnection if ((mReplyHeader.responseCode == -1) || (mReplyHeader.responseCode == ResponseCodes.OBEX_HTTP_CONTINUE)) { validateConnection(); @@ -423,8 +422,9 @@ public final class ClientOperation implements Operation, BaseStream { private void validateConnection() throws IOException { ensureOpen(); - // to sure only one privateInput object exist. - if (mPrivateInput == null) { + // Make sure that a response has been recieved from remote + // before continuing + if (mPrivateInput == null || mReplyHeader.responseCode == -1) { startProcessing(); } } diff --git a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml index 20173b0dc3bf..24cbfbd6430e 100644 --- a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml +++ b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml @@ -4,7 +4,7 @@ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string> <string name="action_use_network" msgid="6076184727448466030">"যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন"</string> <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটওয়ার্ক ব্যবহার করবেন না"</string> - <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন করুন"</string> + <string name="action_bar_label" msgid="917235635415966620">"নেটওয়ার্কে প্রবেশ করুন"</string> <string name="ssl_error_warning" msgid="6653188881418638872">"আপনি যে নেটওয়ার্কে যোগ দেওয়ার চেষ্টা করছেন তাতে নিরাপত্তার সমস্যা আছে।"</string> <string name="ssl_error_example" msgid="647898534624078900">"উদাহরণস্বরূপ, লগইন পৃষ্ঠাটি প্রদর্শিত প্রতিষ্ঠানের অন্তর্গত নাও হতে পারে৷"</string> <string name="ssl_error_continue" msgid="6492718244923937110">"যাই হোক না কেন ব্রাউজারের মাধ্যমে অবিরত রাখুন"</string> diff --git a/packages/DocumentsUI/src/com/android/documentsui/Events.java b/packages/DocumentsUI/src/com/android/documentsui/Events.java index 14d4e2d942d9..02a912734239 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Events.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Events.java @@ -53,7 +53,8 @@ public final class Events { */ public static boolean isTouchType(int toolType) { return toolType == MotionEvent.TOOL_TYPE_FINGER - || toolType == MotionEvent.TOOL_TYPE_STYLUS; + || toolType == MotionEvent.TOOL_TYPE_STYLUS + || toolType == MotionEvent.TOOL_TYPE_UNKNOWN; } /** diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java index b82f8dd3d7a3..728d98f56e38 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java @@ -341,8 +341,18 @@ public class FilesActivity extends BaseActivity { // Fall back to traditional VIEW action... intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setData(doc.derivedUri); + intent.setDataAndType(doc.derivedUri, doc.mimeType); + + // Downloads has traditionally added the WRITE permission + // in the TrampolineActivity. Since this behavior is long + // established, we set the same permission for non-managed files + // This ensures consistent behavior between the Downloads root + // and other roots. + int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; + if (doc.isWriteSupported()) { + flags |= Intent.FLAG_GRANT_WRITE_URI_PERMISSION; + } + intent.setFlags(flags); if (DEBUG && intent.getClipData() != null) { Log.d(TAG, "Starting intent w/ clip data: " + intent.getClipData()); @@ -401,8 +411,13 @@ public class FilesActivity extends BaseActivity { return true; } - // Open the Close drawer if it is closed and we're at the top of a root. - if (size <= 1) { + final Intent intent = getIntent(); + final boolean launchedExternally = intent != null && intent.getData() != null + && mState.action == State.ACTION_BROWSE; + + // Open the Close drawer if it is closed and we're at the top of a root, but only when + // not launched by another app. + if (size <= 1 && !launchedExternally) { mDrawer.setOpen(true); // Remember so we don't just close it again if back is pressed again. mDrawerLastFiddled = System.currentTimeMillis(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java index d2e9885edf14..b3db037697f3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java +++ b/packages/DocumentsUI/src/com/android/documentsui/LocalPreferences.java @@ -22,6 +22,7 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.content.Context; import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; import android.os.UserHandle; import android.preference.PreferenceManager; @@ -85,6 +86,15 @@ public class LocalPreferences { public @interface PermissionStatus {} /** + * Clears all preferences associated with a given package. + * + * <p>Typically called when a package is removed or when user asked to clear its data. + */ + static void clearPackagePreferences(Context context, String packageName) { + clearScopedAccessPreferences(context, packageName); + } + + /** * Methods below are used to keep track of denied user requests on scoped directory access so * the dialog is not offered when user checked the 'Do not ask again' box * @@ -108,6 +118,23 @@ public class LocalPreferences { getPrefs(context).edit().putInt(key, status).apply(); } + private static void clearScopedAccessPreferences(Context context, String packageName) { + final String keySubstring = "|" + packageName + "|"; + final SharedPreferences prefs = getPrefs(context); + Editor editor = null; + for (final String key : prefs.getAll().keySet()) { + if (key.contains(keySubstring)) { + if (editor == null) { + editor = prefs.edit(); + } + editor.remove(key); + } + } + if (editor != null) { + editor.apply(); + } + } + private static String getScopedAccessDenialsKey(String packageName, String uuid, String directory) { final int userId = UserHandle.myUserId(); diff --git a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java index aef63afcbcd7..fd1183fda13d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java +++ b/packages/DocumentsUI/src/com/android/documentsui/PackageReceiver.java @@ -23,7 +23,7 @@ import android.content.Intent; import android.net.Uri; /** - * Clean up {@link RecentsProvider} when packages are removed. + * Cleans up {@link RecentsProvider} and {@link LocalPreferences} when packages are removed. */ public class PackageReceiver extends BroadcastReceiver { @Override @@ -31,15 +31,19 @@ public class PackageReceiver extends BroadcastReceiver { final ContentResolver resolver = context.getContentResolver(); final String action = intent.getAction(); + final Uri data = intent.getData(); + final String packageName = data == null ? null : data.getSchemeSpecificPart(); + if (Intent.ACTION_PACKAGE_FULLY_REMOVED.equals(action)) { resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE, null, null); - + if (packageName != null) { + LocalPreferences.clearPackagePreferences(context, packageName); + } } else if (Intent.ACTION_PACKAGE_DATA_CLEARED.equals(action)) { - final Uri data = intent.getData(); - if (data != null) { - final String packageName = data.getSchemeSpecificPart(); + if (packageName != null) { resolver.call(RecentsProvider.buildRecent(), RecentsProvider.METHOD_PURGE_PACKAGE, packageName, null); + LocalPreferences.clearPackagePreferences(context, packageName); } } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java index b7c0a9c1be1b..8a6723f6cd34 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java @@ -53,10 +53,13 @@ import android.provider.DocumentsContract.Document; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.support.v13.view.DragStartHelper; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat; +import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.GridLayoutManager.SpanSizeLookup; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.OnItemTouchListener; +import android.support.v7.widget.RecyclerView.Recycler; import android.support.v7.widget.RecyclerView.RecyclerListener; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.BidiFormatter; @@ -243,7 +246,40 @@ public class DirectoryFragment extends Fragment mRecView.setAdapter(mAdapter); - mLayout = new GridLayoutManager(getContext(), mColumnCount); + // Switch Access Accessibility API needs an {@link AccessibilityDelegate} to know the proper + // route when user selects an UI element. It usually guesses this if the element has an + // {@link OnClickListener}, but since we do not have one for itemView, we will need to + // manually route it to the right behavior. RecyclerView has its own AccessibilityDelegate, + // and routes it to its LayoutManager; so we must override the LayoutManager's accessibility + // methods to route clicks correctly. + mLayout = new GridLayoutManager(getContext(), mColumnCount) { + @Override + public void onInitializeAccessibilityNodeInfoForItem( + RecyclerView.Recycler recycler, RecyclerView.State state, + View host, AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info); + info.addAction(AccessibilityActionCompat.ACTION_CLICK); + } + + @Override + public boolean performAccessibilityActionForItem( + RecyclerView.Recycler recycler, RecyclerView.State state, View view, + int action, Bundle args) { + // We are only handling click events; route all other to default implementation + if (action == AccessibilityNodeInfoCompat.ACTION_CLICK) { + RecyclerView.ViewHolder vh = mRecView.getChildViewHolder(view); + if (vh instanceof DocumentHolder) { + DocumentHolder dh = (DocumentHolder) vh; + if (dh.mEventListener != null) { + dh.mEventListener.onActivate(dh); + return true; + } + } + } + return super.performAccessibilityActionForItem(recycler, state, view, action, + args); + } + }; SpanSizeLookup lookup = mAdapter.createSpanSizeLookup(); if (lookup != null) { mLayout.setSpanSizeLookup(lookup); @@ -717,63 +753,57 @@ public class DirectoryFragment extends Fragment private void openDocuments(final Selection selected) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_OPEN); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - // TODO: Implement support in Files activity for opening multiple docs. - BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); - } - }.execute(selected); + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + // TODO: Implement support in Files activity for opening multiple docs. + BaseActivity.get(DirectoryFragment.this).onDocumentsPicked(docs); } private void shareDocuments(final Selection selected) { Metrics.logUserAction(getContext(), Metrics.USER_ACTION_SHARE); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - Intent intent; - - // Filter out directories and virtual files - those can't be shared. - List<DocumentInfo> docsForSend = new ArrayList<>(); - for (DocumentInfo doc: docs) { - if (!doc.isDirectory() && !doc.isVirtualDocument()) { - docsForSend.add(doc); - } - } + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + Intent intent; - if (docsForSend.size() == 1) { - final DocumentInfo doc = docsForSend.get(0); - - intent = new Intent(Intent.ACTION_SEND); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - intent.setType(doc.mimeType); - intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); - - } else if (docsForSend.size() > 1) { - intent = new Intent(Intent.ACTION_SEND_MULTIPLE); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.addCategory(Intent.CATEGORY_DEFAULT); - - final ArrayList<String> mimeTypes = new ArrayList<>(); - final ArrayList<Uri> uris = new ArrayList<>(); - for (DocumentInfo doc : docsForSend) { - mimeTypes.add(doc.mimeType); - uris.add(doc.derivedUri); - } + // Filter out directories and virtual files - those can't be shared. + List<DocumentInfo> docsForSend = new ArrayList<>(); + for (DocumentInfo doc: docs) { + if (!doc.isDirectory() && !doc.isVirtualDocument()) { + docsForSend.add(doc); + } + } - intent.setType(findCommonMimeType(mimeTypes)); - intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + if (docsForSend.size() == 1) { + final DocumentInfo doc = docsForSend.get(0); - } else { - return; - } + intent = new Intent(Intent.ACTION_SEND); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setType(doc.mimeType); + intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); + + } else if (docsForSend.size() > 1) { + intent = new Intent(Intent.ACTION_SEND_MULTIPLE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addCategory(Intent.CATEGORY_DEFAULT); - intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via)); - startActivity(intent); + final ArrayList<String> mimeTypes = new ArrayList<>(); + final ArrayList<Uri> uris = new ArrayList<>(); + for (DocumentInfo doc : docsForSend) { + mimeTypes.add(doc.mimeType); + uris.add(doc.derivedUri); } - }.execute(selected); + + intent.setType(findCommonMimeType(mimeTypes)); + intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + + } else { + return; + } + + intent = Intent.createChooser(intent, getActivity().getText(R.string.share_via)); + startActivity(intent); } private String generateDeleteMessage(final List<DocumentInfo> docs) { @@ -819,52 +849,51 @@ public class DirectoryFragment extends Fragment assert(!selected.isEmpty()); final DocumentInfo srcParent = getDisplayState().stack.peek(); - new GetDocumentsTask() { - @Override - void onDocumentsReady(final List<DocumentInfo> docs) { - - TextView message = - (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); - message.setText(generateDeleteMessage(docs)); - - // This "insta-hides" files that are being deleted, because - // the delete operation may be not execute immediately (it - // may be queued up on the FileOperationService.) - // To hide the files locally, we call the hide method on the adapter - // ...which a live object...cannot be parceled. - // For that reason, for now, we implement this dialog NOT - // as a fragment (which can survive rotation and have its own state), - // but as a simple runtime dialog. So rotating a device with an - // active delete dialog...results in that dialog disappearing. - // We can do better, but don't have cycles for it now. - new AlertDialog.Builder(getActivity()) - .setView(message) - .setPositiveButton( - android.R.string.yes, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - // Finish selection mode first which clears selection so we - // don't end up trying to deselect deleted documents. - // This is done here, rather in the onActionItemClicked - // so we can avoid de-selecting items in the case where - // the user cancels the delete. - if (mActionMode != null) { - mActionMode.finish(); - } else { - Log.w(TAG, "Action mode is null before deleting documents."); - } - // Hide the files in the UI...since the operation - // might be queued up on FileOperationService. - // We're walking a line here. - mAdapter.hide(selected.getAll()); - FileOperations.delete( - getActivity(), docs, srcParent, getDisplayState().stack); - } - }) - .setNegativeButton(android.R.string.no, null) - .show(); - } - }.execute(selected); + + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + + TextView message = + (TextView) mInflater.inflate(R.layout.dialog_delete_confirmation, null); + message.setText(generateDeleteMessage(docs)); + + // This "insta-hides" files that are being deleted, because + // the delete operation may be not execute immediately (it + // may be queued up on the FileOperationService.) + // To hide the files locally, we call the hide method on the adapter + // ...which a live object...cannot be parceled. + // For that reason, for now, we implement this dialog NOT + // as a fragment (which can survive rotation and have its own state), + // but as a simple runtime dialog. So rotating a device with an + // active delete dialog...results in that dialog disappearing. + // We can do better, but don't have cycles for it now. + new AlertDialog.Builder(getActivity()) + .setView(message) + .setPositiveButton( + android.R.string.yes, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + // Finish selection mode first which clears selection so we + // don't end up trying to deselect deleted documents. + // This is done here, rather in the onActionItemClicked + // so we can avoid de-selecting items in the case where + // the user cancels the delete. + if (mActionMode != null) { + mActionMode.finish(); + } else { + Log.w(TAG, "Action mode is null before deleting documents."); + } + // Hide the files in the UI...since the operation + // might be queued up on FileOperationService. + // We're walking a line here. + mAdapter.hide(selected.getAll()); + FileOperations.delete( + getActivity(), docs, srcParent, getDisplayState().stack); + } + }) + .setNegativeButton(android.R.string.no, null) + .show(); } private void transferDocuments(final Selection selected, final @OpType int mode) { @@ -898,25 +927,21 @@ public class DirectoryFragment extends Fragment ? R.string.menu_move : R.string.menu_copy; intent.putExtra(DocumentsContract.EXTRA_PROMPT, getResources().getString(drawerTitleId)); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - // TODO: Can this move to Fragment bundle state? - getDisplayState().selectedDocumentsForCopy = docs; - - // Determine if there is a directory in the set of documents - // to be copied? Why? Directory creation isn't supported by some roots - // (like Downloads). This informs DocumentsActivity (the "picker") - // to restrict available roots to just those with support. - intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs)); - intent.putExtra(FileOperationService.EXTRA_OPERATION, mode); - - // This just identifies the type of request...we'll check it - // when we reveive a response. - startActivityForResult(intent, REQUEST_COPY_DESTINATION); - } + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + // TODO: Can this move to Fragment bundle state? + getDisplayState().selectedDocumentsForCopy = docs; + + // Determine if there is a directory in the set of documents + // to be copied? Why? Directory creation isn't supported by some roots + // (like Downloads). This informs DocumentsActivity (the "picker") + // to restrict available roots to just those with support. + intent.putExtra(Shared.EXTRA_DIRECTORY_COPY, hasDirectory(docs)); + intent.putExtra(FileOperationService.EXTRA_OPERATION, mode); - }.execute(selected); + // This just identifies the type of request...we'll check it + // when we reveive a response. + startActivityForResult(intent, REQUEST_COPY_DESTINATION); } private static boolean hasDirectory(List<DocumentInfo> docs) { @@ -935,12 +960,9 @@ public class DirectoryFragment extends Fragment // Rename option is only available in menu when 1 document selected assert(selected.size() == 1); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - RenameDocumentFragment.show(getFragmentManager(), docs.get(0)); - } - }.execute(selected); + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + RenameDocumentFragment.show(getFragmentManager(), docs.get(0)); } @Override @@ -1099,19 +1121,17 @@ public class DirectoryFragment extends Fragment } } - void copySelectionToClipboard(Selection selection) { - assert(!selection.isEmpty()); - new GetDocumentsTask() { - @Override - void onDocumentsReady(List<DocumentInfo> docs) { - mClipper.clipDocuments(docs); - Activity activity = getActivity(); - Snackbars.makeSnackbar(activity, - activity.getResources().getQuantityString( - R.plurals.clipboard_files_clipped, docs.size(), docs.size()), - Snackbar.LENGTH_SHORT).show(); - } - }.execute(selection); + void copySelectionToClipboard(Selection selected) { + assert(!selected.isEmpty()); + + // Model must be accessed in UI thread, since underlying cursor is not threadsafe. + List<DocumentInfo> docs = mModel.getDocuments(selected); + mClipper.clipDocuments(docs); + Activity activity = getActivity(); + Snackbars.makeSnackbar(activity, + activity.getResources().getQuantityString( + R.plurals.clipboard_files_clipped, docs.size(), docs.size()), + Snackbar.LENGTH_SHORT).show(); } public void pasteFromClipboard() { @@ -1420,25 +1440,6 @@ public class DirectoryFragment extends Fragment mShadowView.draw(canvas); } } - /** - * Abstract task providing support for loading documents *off* - * the main thread. And if it isn't obvious, creating a list - * of documents (especially large lists) can be pretty expensive. - */ - private abstract class GetDocumentsTask - extends AsyncTask<Selection, Void, List<DocumentInfo>> { - @Override - protected final List<DocumentInfo> doInBackground(Selection... selected) { - return mModel.getDocuments(selected[0]); - } - - @Override - protected final void onPostExecute(List<DocumentInfo> docs) { - onDocumentsReady(docs); - } - - abstract void onDocumentsReady(List<DocumentInfo> docs); - } @Override public boolean isSelected(String modelId) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index 3a86a51b2d18..63f66de9ad84 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -235,6 +235,10 @@ public class DocumentInfo implements Durable, Parcelable { return (flags & Document.FLAG_DIR_PREFERS_GRID) != 0; } + public boolean isWriteSupported() { + return (flags & Document.FLAG_SUPPORTS_WRITE) != 0; + } + public boolean isDeleteSupported() { return (flags & Document.FLAG_SUPPORTS_DELETE) != 0; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java index 111817132fa1..1de3bbc20496 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java +++ b/packages/DocumentsUI/src/com/android/documentsui/services/MoveJob.java @@ -117,7 +117,9 @@ final class MoveJob extends CopyJob { byteCopyDocument(src, dest); // Remove the source document. - deleteDocument(src, srcParent); + if(!isCanceled()) { + deleteDocument(src, srcParent); + } } @Override diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java index 32e335843016..808ec361fb4f 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/NekoService.java +++ b/packages/EasterEgg/src/com/android/egg/neko/NekoService.java @@ -102,6 +102,14 @@ public class NekoService extends JobService { return false; } + public static void registerJobIfNeeded(Context context, long intervalMinutes) { + JobScheduler jss = context.getSystemService(JobScheduler.class); + JobInfo info = jss.getPendingJob(JOB_ID); + if (info == null) { + registerJob(context, intervalMinutes); + } + } + public static void registerJob(Context context, long intervalMinutes) { JobScheduler jss = context.getSystemService(JobScheduler.class); jss.cancel(JOB_ID); diff --git a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java b/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java index 8a3ec8fa19e9..159b40a3e5af 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java +++ b/packages/EasterEgg/src/com/android/egg/neko/NekoTile.java @@ -68,6 +68,9 @@ public class NekoTile extends TileService implements PrefsListener { Tile tile = getQsTile(); int foodState = mPrefs.getFoodState(); Food food = new Food(foodState); + if (foodState != 0) { + NekoService.registerJobIfNeeded(this, food.getInterval(this)); + } tile.setIcon(food.getIcon(this)); tile.setLabel(food.getName(this)); tile.setState(foodState != 0 ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); diff --git a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java b/packages/EasterEgg/src/com/android/egg/neko/PrefState.java index 5f54180bc2e0..bf71b197d3cb 100644 --- a/packages/EasterEgg/src/com/android/egg/neko/PrefState.java +++ b/packages/EasterEgg/src/com/android/egg/neko/PrefState.java @@ -43,13 +43,11 @@ public class PrefState implements OnSharedPreferenceChangeListener { public void addCat(Cat cat) { mPrefs.edit() .putString(CAT_KEY_PREFIX + String.valueOf(cat.getSeed()), cat.getName()) - .commit(); + .apply(); } public void removeCat(Cat cat) { - mPrefs.edit() - .remove(CAT_KEY_PREFIX + String.valueOf(cat.getSeed())) - .commit(); + mPrefs.edit().remove(CAT_KEY_PREFIX + String.valueOf(cat.getSeed())).apply(); } public List<Cat> getCats() { @@ -71,7 +69,7 @@ public class PrefState implements OnSharedPreferenceChangeListener { } public void setFoodState(int foodState) { - mPrefs.edit().putInt(FOOD_STATE, foodState).commit(); + mPrefs.edit().putInt(FOOD_STATE, foodState).apply(); } public void setListener(PrefsListener listener) { diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 78b99274e444..7fe0d2fd074a 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -566,6 +566,7 @@ public class ExternalStorageProvider extends DocumentsProvider { throws FileNotFoundException { final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection)); + query = query.toLowerCase(); final File parent; synchronized (mRootsLock) { parent = mRoots.get(rootId).path; diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java index 4f5152aca6f3..285b1aeb7beb 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java @@ -16,12 +16,8 @@ package com.android.keyguard; -import android.animation.Animator; -import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; -import android.view.RenderNode; -import android.view.RenderNodeAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; @@ -144,9 +140,10 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { setTranslationY(0); AppearAnimationUtils.startTranslationYAnimation(this, 0 /* delay */, 280 /* duration */, mDisappearYTranslation, mDisappearAnimationUtils.getInterpolator()); - DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor.isUserUnlocked() - ? mDisappearAnimationUtils - : mDisappearAnimationUtilsLocked; + DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor + .needsSlowUnlockTransition() + ? mDisappearAnimationUtilsLocked + : mDisappearAnimationUtils; disappearAnimationUtils.startAnimation2d(mViews, new Runnable() { @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 84b90c44c1a6..506f77d443c6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -408,9 +408,9 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override public boolean startDisappearAnimation(final Runnable finishRunnable) { - float durationMultiplier = mKeyguardUpdateMonitor.isUserUnlocked() - ? 1f - : DISAPPEAR_MULTIPLIER_LOCKED; + float durationMultiplier = mKeyguardUpdateMonitor.needsSlowUnlockTransition() + ? DISAPPEAR_MULTIPLIER_LOCKED + : 1f; mLockPatternView.clearPattern(); enableClipping(false); setTranslationY(0); @@ -419,9 +419,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit -mDisappearAnimationUtils.getStartTranslation(), mDisappearAnimationUtils.getInterpolator()); - DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor.isUserUnlocked() - ? mDisappearAnimationUtils - : mDisappearAnimationUtilsLocked; + DisappearAnimationUtils disappearAnimationUtils = mKeyguardUpdateMonitor + .needsSlowUnlockTransition() + ? mDisappearAnimationUtilsLocked + : mDisappearAnimationUtils; disappearAnimationUtils.startAnimation2d(mLockPatternView.getCellStates(), () -> { enableClipping(true); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 56f37414a0e6..dccb1a921489 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -34,9 +34,12 @@ import android.app.PendingIntent; import android.app.admin.DevicePolicyManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.database.ContentObserver; import android.graphics.Bitmap; import android.hardware.fingerprint.FingerprintManager; @@ -138,6 +141,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SERVICE_STATE_CHANGE = 330; private static final int MSG_SCREEN_TURNED_ON = 331; private static final int MSG_SCREEN_TURNED_OFF = 332; + private static final int MSG_DREAMING_STATE_CHANGED = 333; /** Fingerprint state: Not listening to fingerprint. */ private static final int FINGERPRINT_STATE_STOPPED = 0; @@ -159,6 +163,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int DEFAULT_CHARGING_VOLTAGE_MICRO_VOLT = 5000000; + private static final ComponentName FALLBACK_HOME_COMPONENT = new ComponentName( + "com.android.settings", "com.android.settings.FallbackHome"); + private static KeyguardUpdateMonitor sInstance; private final Context mContext; @@ -177,7 +184,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private boolean mGoingToSleep; private boolean mBouncer; private boolean mBootCompleted; - private boolean mUserUnlocked; + private boolean mNeedsSlowUnlockTransition; private boolean mHasLockscreenWallpaper; // Device provisioning state @@ -287,6 +294,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { handleScreenTurnedOff(); Trace.endSection(); break; + case MSG_DREAMING_STATE_CHANGED: + handleDreamingStateChanged(msg.arg1); + break; } } }; @@ -572,8 +582,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { && !hasFingerprintUnlockTimedOut(sCurrentUser); } - public boolean isUserUnlocked() { - return mUserUnlocked; + public boolean needsSlowUnlockTransition() { + return mNeedsSlowUnlockTransition; } public StrongAuthTracker getStrongAuthTracker() { @@ -984,6 +994,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + private void handleDreamingStateChanged(int dreamStart) { + final int count = mCallbacks.size(); + boolean showingDream = dreamStart == 1; + for (int i = 0; i < count; i++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get(); + if (cb != null) { + cb.onDreamingStateChanged(showingDream); + } + } + } + /** * IMPORTANT: Must be called from UI thread. */ @@ -1444,7 +1465,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private void handleKeyguardReset() { if (DEBUG) Log.d(TAG, "handleKeyguardReset"); updateFingerprintListeningState(); - mUserUnlocked = mUserManager.isUserUnlocked(getCurrentUser()); + mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition(); + } + + private boolean resolveNeedsSlowUnlockTransition() { + if (mUserManager.isUserUnlocked(getCurrentUser())) { + return false; + } + Intent homeIntent = new Intent(Intent.ACTION_MAIN) + .addCategory(Intent.CATEGORY_HOME); + ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(homeIntent, + 0 /* flags */); + return FALLBACK_HOME_COMPONENT.equals(resolveInfo.getComponentInfo().getComponentName()); } /** @@ -1719,6 +1751,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_OFF); } + public void dispatchDreamingStarted() { + mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 1, 0)); + } + + public void dispatchDreamingStopped() { + mHandler.sendMessage(mHandler.obtainMessage(MSG_DREAMING_STATE_CHANGED, 0, 0)); + } + public boolean isDeviceInteractive() { return mDeviceInteractive; } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java index 4a2d356b6ddd..eb29d9b550e3 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitorCallback.java @@ -245,4 +245,10 @@ public class KeyguardUpdateMonitorCallback { * Called when the state whether we have a lockscreen wallpaper has changed. */ public void onHasLockscreenWallpaperChanged(boolean hasLockscreenWallpaper) { } + + /** + * Called when the dream's window state is changed. + * @param dreaming true if the dream's window has been created and is visible + */ + public void onDreamingStateChanged(boolean dreaming) { } } diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java index cce619e67d19..4950af3e14e0 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpDatabase.java @@ -873,7 +873,7 @@ class MtpDatabase { } private static int getRootFlags(int[] operationsSupported) { - int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD; + int rootFlag = Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY; if (MtpDeviceRecord.isWritingSupported(operationsSupported)) { rootFlag |= Root.FLAG_SUPPORTS_CREATE; } diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java index 404047b8baed..8c13c813552b 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDatabaseTest.java @@ -128,7 +128,7 @@ public class MtpDatabaseTest extends AndroidTestCase { cursor.moveToNext(); assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID)); assertEquals( - Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, getInt(cursor, Root.COLUMN_FLAGS)); assertEquals(R.drawable.ic_root_mtp, getInt(cursor, Root.COLUMN_ICON)); assertEquals("Device Storage", getString(cursor, Root.COLUMN_TITLE)); diff --git a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java index 9ed15c82f336..d19b46083f91 100644 --- a/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java +++ b/packages/MtpDocumentsProvider/tests/src/com/android/mtp/MtpDocumentsProviderTest.java @@ -210,7 +210,11 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { assertEquals(2, cursor.getCount()); cursor.moveToNext(); assertEquals("1", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | + Root.FLAG_SUPPORTS_CREATE | + Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device A Storage A", cursor.getString(3)); assertEquals("1", cursor.getString(4)); @@ -225,7 +229,8 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); cursor.moveToNext(); assertEquals("2", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_LOCAL_ONLY, cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device B Storage B", cursor.getString(3)); assertEquals("2", cursor.getString(4)); @@ -271,7 +276,9 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); assertEquals("1", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device A", cursor.getString(3)); assertEquals("1", cursor.getString(4)); @@ -279,7 +286,9 @@ public class MtpDocumentsProviderTest extends AndroidTestCase { cursor.moveToNext(); assertEquals("2", cursor.getString(0)); - assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1)); + assertEquals( + Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY, + cursor.getInt(1)); assertEquals(R.drawable.ic_root_mtp, cursor.getInt(2)); assertEquals("Device B Storage B", cursor.getString(3)); assertEquals("2", cursor.getString(4)); diff --git a/packages/PrintSpooler/res/layout/print_activity.xml b/packages/PrintSpooler/res/layout/print_activity.xml index 2db6fb06480c..31a776c99e80 100644 --- a/packages/PrintSpooler/res/layout/print_activity.xml +++ b/packages/PrintSpooler/res/layout/print_activity.xml @@ -16,7 +16,6 @@ <com.android.printspooler.widget.PrintContentView xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:printspooler="http://schemas.android.com/apk/res/com.android.printspooler" android:id="@+id/options_content" android:layout_width="fill_parent" android:layout_height="fill_parent"> @@ -28,12 +27,14 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingStart="8dip" + android:layout_marginEnd="16dp" android:elevation="@dimen/preview_controls_elevation" android:background="?android:attr/colorPrimary"> <Spinner android:id="@+id/destination_spinner" - android:layout_width="@dimen/preview_destination_spinner_width" + android:layout_width="wrap_content" + android:minWidth="@dimen/preview_destination_spinner_width" android:layout_height="wrap_content" android:layout_marginTop="4dip" android:dropDownWidth="wrap_content" diff --git a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml index 103c157b873f..0d8a90abe64b 100644 --- a/packages/PrintSpooler/res/layout/printer_dropdown_item.xml +++ b/packages/PrintSpooler/res/layout/printer_dropdown_item.xml @@ -16,7 +16,8 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" - android:layout_height="?android:attr/listPreferredItemHeightSmall" + android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" style="?android:attr/spinnerItemStyle" android:orientation="horizontal" android:gravity="start|center_vertical"> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index 3debf8e60cdb..d4e796339bc9 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -60,7 +60,7 @@ <item quantity="one">找到 <xliff:g id="COUNT_0">%1$s</xliff:g> 台打印机</item> </plurals> <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string> - <string name="printer_info_desc" msgid="7181988788991581654">"关于此打印机的更多信息"</string> + <string name="printer_info_desc" msgid="7181988788991581654">"此打印机的详细信息"</string> <string name="could_not_create_file" msgid="3425025039427448443">"无法创建文件"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"部分打印服务已停用"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"正在搜索打印机"</string> diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index c16e08a7c428..11235efbaf0f 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Grootste"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Gepasmaak (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hulp en terugvoer"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Kieslys"</string> </resources> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 6e9dcd7fc193..dbfd5d85ec38 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"በጣም ተለቅ ያለ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ብጁ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"እገዛ እና ግብረመልስ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ምናሌ"</string> </resources> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index ee579dc30b00..092cf63c6791 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"أكبر مستوى"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"مخصص (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"المساعدة والتعليقات"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"القائمة"</string> </resources> diff --git a/packages/SettingsLib/res/values-az-rAZ/strings.xml b/packages/SettingsLib/res/values-az-rAZ/strings.xml index 60d0169be4b0..2e58ae9b4e4e 100644 --- a/packages/SettingsLib/res/values-az-rAZ/strings.xml +++ b/packages/SettingsLib/res/values-az-rAZ/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Ən böyük"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Fərdi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Yardım və rəy"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string> </resources> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 060a5fb15be3..1f0ed53be45c 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveći"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string> </resources> diff --git a/packages/SettingsLib/res/values-be-rBY/strings.xml b/packages/SettingsLib/res/values-be-rBY/strings.xml index 03de8bab32c1..b8de297a9437 100644 --- a/packages/SettingsLib/res/values-be-rBY/strings.xml +++ b/packages/SettingsLib/res/values-be-rBY/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Найвялікшы"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Карыстальніцкі (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Даведка і водгукі"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index f6596dc48add..683a4d9d6b98 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Най-голямо"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Персонализирано (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Помощ и отзиви"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-bn-rBD/strings.xml b/packages/SettingsLib/res/values-bn-rBD/strings.xml index 4a11198be5f9..9ba656f78c33 100644 --- a/packages/SettingsLib/res/values-bn-rBD/strings.xml +++ b/packages/SettingsLib/res/values-bn-rBD/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"বৃহত্তম"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"কাস্টম (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"সহায়তা ও মতামত"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"মেনু"</string> </resources> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index 40a3630a4e55..f2c73232a59f 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveće"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagodi (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string> </resources> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 99850a5d5cd4..332daf3e5e96 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Màxim"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalitzat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ajuda i suggeriments"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string> </resources> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 361ba1f0cef2..d0dbe748e0bf 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Největší"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastní (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Nápověda a zpětná vazba"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Nabídka"</string> </resources> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 98f41fc8945d..3c4b95508277 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Størst"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tilpasset (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hjælp og feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index c9da6c96c0ff..0fca8b9ad4b2 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Am größten"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Benutzerdefiniert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hilfe & Feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string> </resources> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 05e4e64c383f..da1b03c8dc5c 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Μεγαλύτερα"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Προσαρμοσμένη (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Βοήθεια και σχόλια"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Μενού"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 799802b86b3a..70fa5017488e 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Largest"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 799802b86b3a..70fa5017488e 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Largest"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 799802b86b3a..70fa5017488e 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Largest"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Help & feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 08e739a00f50..63a5d873dc03 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Máximo"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y comentarios"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string> </resources> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 3d2f6c132da0..6b67b1194e04 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Lo más grande posible"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ayuda y sugerencias"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string> </resources> diff --git a/packages/SettingsLib/res/values-et-rEE/strings.xml b/packages/SettingsLib/res/values-et-rEE/strings.xml index a7b0f64f9a4d..de9255ae46d4 100644 --- a/packages/SettingsLib/res/values-et-rEE/strings.xml +++ b/packages/SettingsLib/res/values-et-rEE/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Suurim"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kohandatud (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Abi ja tagasiside"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menüü"</string> </resources> diff --git a/packages/SettingsLib/res/values-eu-rES/strings.xml b/packages/SettingsLib/res/values-eu-rES/strings.xml index f476511b8106..bd8c11ddde81 100644 --- a/packages/SettingsLib/res/values-eu-rES/strings.xml +++ b/packages/SettingsLib/res/values-eu-rES/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Handiena"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pertsonalizatua (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Laguntza eta iritziak"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menua"</string> </resources> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 44918513bcd7..027987fe8453 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"بزرگترین"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"سفارشی (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"راهنما و بازخورد"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"منو"</string> </resources> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index cdef968d90aa..a988ccf109dc 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Suurin"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Muokattu (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ohje ja palaute"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Valikko"</string> </resources> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 958b8fd4d5d3..e22e93824f10 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"La plus grande"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisée (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index cf08f3b5f237..e4a34d6d4f23 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Le plus grand"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personnalisé (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Aide et commentaires"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-gl-rES/strings.xml b/packages/SettingsLib/res/values-gl-rES/strings.xml index cdc4581ca80c..10a395766604 100644 --- a/packages/SettingsLib/res/values-gl-rES/strings.xml +++ b/packages/SettingsLib/res/values-gl-rES/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"O máis grande"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Axuda e suxestións"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menú"</string> </resources> diff --git a/packages/SettingsLib/res/values-gu-rIN/strings.xml b/packages/SettingsLib/res/values-gu-rIN/strings.xml index 1b40e01737d1..0f3079d36a0e 100644 --- a/packages/SettingsLib/res/values-gu-rIN/strings.xml +++ b/packages/SettingsLib/res/values-gu-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"સૌથી મોટું"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"કસ્ટમ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"સહાય અને પ્રતિસાદ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"મેનુ"</string> </resources> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 8dfbb4a58780..5407c215be95 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"सबसे बड़ा"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"कस्टम (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"सहायता और फ़ीडबैक"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string> </resources> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 07e492581d41..e52f44160d47 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najveće"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Prilagođeno (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoć i povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Izbornik"</string> </resources> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 0d8ec26eb668..ac4a43c46f47 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Legnagyobb"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egyéni (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Súgó és visszajelzés"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string> </resources> diff --git a/packages/SettingsLib/res/values-hy-rAM/strings.xml b/packages/SettingsLib/res/values-hy-rAM/strings.xml index cb12fbfaf502..e26d4cb62a21 100644 --- a/packages/SettingsLib/res/values-hy-rAM/strings.xml +++ b/packages/SettingsLib/res/values-hy-rAM/strings.xml @@ -38,7 +38,7 @@ <string name="bluetooth_disconnecting" msgid="8913264760027764974">"Անջատվում է..."</string> <string name="bluetooth_connecting" msgid="8555009514614320497">"Միանում է..."</string> <string name="bluetooth_connected" msgid="6038755206916626419">"Միացված է"</string> - <string name="bluetooth_pairing" msgid="1426882272690346242">"Զուգավորում..."</string> + <string name="bluetooth_pairing" msgid="1426882272690346242">"Զուգակցում..."</string> <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Միացված (առանց հեռախոսի)"</string> <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Միացված է (առանց մեդիա)"</string> <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Միացված է (հաղորդագրությանը մուտք չկա)"</string> @@ -72,7 +72,7 @@ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Զուգավորել"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"Զուգավորել"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Չեղարկել"</string> - <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Զուգավորում է մուտքի թույլտվությունը դեպի ձեր կոնտակտները և զանգերի պատմությունը, երբ միացված է:"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"Զուգակցում է մուտքի թույլտվությունը դեպի ձեր կոնտակտները և զանգերի պատմությունը, երբ միացված է:"</string> <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"Չհաջողվեց զուգավորել <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի հետ:"</string> <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"Հնարավոր չեղավ զուգավորվել <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի հետ սխալ PIN-ի կամ անցաբառի պատճառով:."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"Հնարավոր չէ կապ հաստատել <xliff:g id="DEVICE_NAME">%1$s</xliff:g>-ի հետ:"</string> @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Ամենամեծ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Հատուկ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Օգնություն և հետադարձ կապ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Ընտրացանկ"</string> </resources> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index ffdb60745571..5711ea704a41 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Terbesar"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"(<xliff:g id="DENSITYDPI">%d</xliff:g>) khusus"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Bantuan & masukan"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-is-rIS/strings.xml b/packages/SettingsLib/res/values-is-rIS/strings.xml index 25e13a4d69d8..44226ee35e15 100644 --- a/packages/SettingsLib/res/values-is-rIS/strings.xml +++ b/packages/SettingsLib/res/values-is-rIS/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Stærst"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Sérsniðið (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hjálp og ábendingar"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Valmynd"</string> </resources> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index cb323a29c499..6df553b7b6b3 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -329,8 +329,8 @@ <string name="home" msgid="3256884684164448244">"Home page Impostazioni"</string> <string-array name="battery_labels"> <item msgid="8494684293649631252">"0%"</item> - <item msgid="8934126114226089439">"50%%"</item> - <item msgid="1286113608943010849">"100%%"</item> + <item msgid="8934126114226089439">"50%"</item> + <item msgid="1286113608943010849">"100%"</item> </string-array> <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> fa"</string> <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> rimanenti"</string> @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Massimo"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizzato (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Guida e feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 7c16e4276347..6f7460a6639d 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"הכי גדול"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"מותאם אישית (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"עזרה ומשוב"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"תפריט"</string> </resources> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 25f4152a22fa..025b7fde4ed1 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -343,4 +343,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"最大"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"カスタム(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ヘルプとフィードバック"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"メニュー"</string> </resources> diff --git a/packages/SettingsLib/res/values-ka-rGE/strings.xml b/packages/SettingsLib/res/values-ka-rGE/strings.xml index ffe194a0bc29..0eda6a94d1fc 100644 --- a/packages/SettingsLib/res/values-ka-rGE/strings.xml +++ b/packages/SettingsLib/res/values-ka-rGE/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"უდიდესი"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"მორგებული (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"დახმარება და გამოხმაურება"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"მენიუ"</string> </resources> diff --git a/packages/SettingsLib/res/values-kk-rKZ/strings.xml b/packages/SettingsLib/res/values-kk-rKZ/strings.xml index 3dcc7eb50ced..369a10f3b3b0 100644 --- a/packages/SettingsLib/res/values-kk-rKZ/strings.xml +++ b/packages/SettingsLib/res/values-kk-rKZ/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Ең үлкен"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Арнаулы (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Анықтама және пікір"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Mәзір"</string> </resources> diff --git a/packages/SettingsLib/res/values-km-rKH/strings.xml b/packages/SettingsLib/res/values-km-rKH/strings.xml index aa0ce2498737..3e934bab59a3 100644 --- a/packages/SettingsLib/res/values-km-rKH/strings.xml +++ b/packages/SettingsLib/res/values-km-rKH/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ធំបំផុត"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ផ្ទាល់ខ្លួន (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ជំនួយ និងមតិស្ថាបនា"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ម៉ឺនុយ"</string> </resources> diff --git a/packages/SettingsLib/res/values-kn-rIN/strings.xml b/packages/SettingsLib/res/values-kn-rIN/strings.xml index 643875fa6ea0..5a8d53cfe11a 100644 --- a/packages/SettingsLib/res/values-kn-rIN/strings.xml +++ b/packages/SettingsLib/res/values-kn-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ದೊಡ್ಡ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ಕಸ್ಟಮ್ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ಸಹಾಯ ಮತ್ತು ಪ್ರತಿಕ್ರಿಯೆ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ಮೆನು"</string> </resources> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 46176818121c..bd9633491ade 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"가장 크게"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"맞춤(<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"고객센터"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"메뉴"</string> </resources> diff --git a/packages/SettingsLib/res/values-ky-rKG/strings.xml b/packages/SettingsLib/res/values-ky-rKG/strings.xml index 96c1ec024aa6..5ca4e7c3fb21 100644 --- a/packages/SettingsLib/res/values-ky-rKG/strings.xml +++ b/packages/SettingsLib/res/values-ky-rKG/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Эң чоң"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ыңгайлаштырылган (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Жардам жана жооп пикир"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-lo-rLA/strings.xml b/packages/SettingsLib/res/values-lo-rLA/strings.xml index 24f0c16c4962..b47629af0445 100644 --- a/packages/SettingsLib/res/values-lo-rLA/strings.xml +++ b/packages/SettingsLib/res/values-lo-rLA/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ໃຫຍ່ທີ່ສຸດ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ປັບແຕ່ງເອງ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ຊ່ວຍເຫຼືອ & ຄຳຕິຊົມ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ເມນູ"</string> </resources> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 4b8890d04d33..7ac54a8e925c 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Didžiausias"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tinkintas (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pagalba ir atsiliepimai"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string> </resources> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 4d76adc3e291..933d37447775 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Vislielākais"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Pielāgots (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Palīdzība un atsauksmes"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Izvēlne"</string> </resources> diff --git a/packages/SettingsLib/res/values-mk-rMK/strings.xml b/packages/SettingsLib/res/values-mk-rMK/strings.xml index 953360a7aa00..1e1c857e1212 100644 --- a/packages/SettingsLib/res/values-mk-rMK/strings.xml +++ b/packages/SettingsLib/res/values-mk-rMK/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Најголем"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Приспособен (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Помош и повратни информации"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string> </resources> diff --git a/packages/SettingsLib/res/values-ml-rIN/strings.xml b/packages/SettingsLib/res/values-ml-rIN/strings.xml index 92c04487ace2..6f758860fbe3 100644 --- a/packages/SettingsLib/res/values-ml-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ml-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ഏറ്റവും വലുത്"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ഇഷ്ടാനുസൃതം ( <xliff:g id="DENSITYDPI">%d</xliff:g> )"</string> <string name="help_feedback_label" msgid="6815040660801785649">"സഹായവും പ്രതികരണവും"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"മെനു"</string> </resources> diff --git a/packages/SettingsLib/res/values-mn-rMN/strings.xml b/packages/SettingsLib/res/values-mn-rMN/strings.xml index 4c98c04c07d4..bf7d7cebc775 100644 --- a/packages/SettingsLib/res/values-mn-rMN/strings.xml +++ b/packages/SettingsLib/res/values-mn-rMN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Хамгийн том"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Тогтмол утга (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Тусламж, санал хүсэлт"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Цэс"</string> </resources> diff --git a/packages/SettingsLib/res/values-mr-rIN/strings.xml b/packages/SettingsLib/res/values-mr-rIN/strings.xml index e3a7cc46cd44..a1123bcbdb35 100644 --- a/packages/SettingsLib/res/values-mr-rIN/strings.xml +++ b/packages/SettingsLib/res/values-mr-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"सर्वात मोठा"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"सानुकूल करा (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"मदत आणि अभिप्राय"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"मेनू"</string> </resources> diff --git a/packages/SettingsLib/res/values-ms-rMY/strings.xml b/packages/SettingsLib/res/values-ms-rMY/strings.xml index a1caa2a94419..8f115890ca7e 100644 --- a/packages/SettingsLib/res/values-ms-rMY/strings.xml +++ b/packages/SettingsLib/res/values-ms-rMY/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Terbesar"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tersuai (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Bantuan & maklum balas"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-my-rMM/strings.xml b/packages/SettingsLib/res/values-my-rMM/strings.xml index 6a1c33190486..cfba5dadb43f 100644 --- a/packages/SettingsLib/res/values-my-rMM/strings.xml +++ b/packages/SettingsLib/res/values-my-rMM/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"အကြီးဆုံး"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"စိတ်ကြိုက် (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"အကူအညီနှင့် အကြံပြုချက်"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"မီနူး"</string> </resources> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 5d8ae55fb592..2da378aee46a 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Størst"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Egendefinert (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hjelp og tilbakemelding"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string> </resources> diff --git a/packages/SettingsLib/res/values-ne-rNP/strings.xml b/packages/SettingsLib/res/values-ne-rNP/strings.xml index 15cc8ea87c72..a56b65573357 100644 --- a/packages/SettingsLib/res/values-ne-rNP/strings.xml +++ b/packages/SettingsLib/res/values-ne-rNP/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"सबैभन्दा ठूलो"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"अनुकूलन (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"मद्दत र प्रतिक्रिया"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"मेनु"</string> </resources> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 12bdb4f30c06..11d92e516113 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Grootst"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Aangepast (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Help en feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-pa-rIN/strings.xml b/packages/SettingsLib/res/values-pa-rIN/strings.xml index 21d11b00cd4b..d526064b0132 100644 --- a/packages/SettingsLib/res/values-pa-rIN/strings.xml +++ b/packages/SettingsLib/res/values-pa-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ਸਭ ਤੋਂ ਵੱਡਾ"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"ਵਿਸ਼ੇਸ਼-ਵਿਉਂਤਬੱਧ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ਮਦਦ ਅਤੇ ਪ੍ਰਤੀਕਰਮ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ਮੀਨੂ"</string> </resources> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index d5116a2e3d7c..dcbb934cea6c 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Największy"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Niestandardowe (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoc i opinie"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index f0cfa23df334..fc2222542324 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Maior"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 40dfc74806b3..c297de5d0121 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"O maior"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizado (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e comentários"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index f0cfa23df334..fc2222542324 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Maior"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizada (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ajuda e feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 6cc0f87e1b31..70912f9eb9d7 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Cel mai mare"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Personalizat (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ajutor și feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meniu"</string> </resources> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index ad4db89418b3..4af530dd83bb 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -34,7 +34,7 @@ <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> - <string name="bluetooth_disconnected" msgid="6557104142667339895">"Отключено"</string> + <string name="bluetooth_disconnected" msgid="6557104142667339895">"Нет подключения"</string> <string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string> <string name="bluetooth_connecting" msgid="8555009514614320497">"Подключение..."</string> <string name="bluetooth_connected" msgid="6038755206916626419">"Подключено"</string> @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Максимальный"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Другой (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Справка/отзыв"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-si-rLK/strings.xml b/packages/SettingsLib/res/values-si-rLK/strings.xml index 5efb4001a638..d9fed962bac6 100644 --- a/packages/SettingsLib/res/values-si-rLK/strings.xml +++ b/packages/SettingsLib/res/values-si-rLK/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"විශාලතම"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"අභිරුචි (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"උදව් සහ ප්රතිපෝෂණ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"මෙනුව"</string> </resources> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 7a7e3d49d12d..951d9fb995cf 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Najväčšie"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Vlastné (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomocník a spätná väzba"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Ponuka"</string> </resources> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 10bff6e038a9..2428076f637c 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Največje"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Po meri (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Pomoč in povratne informacije"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meni"</string> </resources> diff --git a/packages/SettingsLib/res/values-sq-rAL/strings.xml b/packages/SettingsLib/res/values-sq-rAL/strings.xml index e4f0eaa29596..1645f10732fa 100644 --- a/packages/SettingsLib/res/values-sq-rAL/strings.xml +++ b/packages/SettingsLib/res/values-sq-rAL/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Më i madhi"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"I personalizuar (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Ndihma dhe komentet"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menyja"</string> </resources> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index fba58c50211c..04dfb24c0c54 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Највећи"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Прилагођени (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Помоћ и повратне информације"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Мени"</string> </resources> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index ecc728a81eec..4b42db50a999 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Störst"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Anpassad (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Hjälp och feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Meny"</string> </resources> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 435a1bdd99be..f70a1fa557db 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Kubwa zaidi"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Kiwango maalum (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Usaidizi na maoni"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string> </resources> diff --git a/packages/SettingsLib/res/values-ta-rIN/strings.xml b/packages/SettingsLib/res/values-ta-rIN/strings.xml index 033955c77e91..5f6b1215226b 100644 --- a/packages/SettingsLib/res/values-ta-rIN/strings.xml +++ b/packages/SettingsLib/res/values-ta-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"மிகப் பெரியது"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"தனிப்பயன் (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"உதவி & கருத்து"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"மெனு"</string> </resources> diff --git a/packages/SettingsLib/res/values-te-rIN/strings.xml b/packages/SettingsLib/res/values-te-rIN/strings.xml index 57581765ae4e..ff8b8550cda7 100644 --- a/packages/SettingsLib/res/values-te-rIN/strings.xml +++ b/packages/SettingsLib/res/values-te-rIN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"అతి పెద్దగా"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"అనుకూలం (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"సహాయం & అభిప్రాయం"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"మెను"</string> </resources> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 4849e1955321..4d0a2e4ead46 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ใหญ่ที่สุด"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"กำหนดเอง (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"ความช่วยเหลือและความคิดเห็น"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"เมนู"</string> </resources> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 24f5499d4490..95897a325136 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Pinakamalaki"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Custom (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Tulong at feedback"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 950e3221ff7c..3c5b46d46bbe 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"En büyük"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Özel (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Yardım ve geri bildirim"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menü"</string> </resources> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 6b49b14084e9..ef30a69a3eb4 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Найбільші елементи"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Спеціальний масштаб (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Довідка й відгуки"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Меню"</string> </resources> diff --git a/packages/SettingsLib/res/values-ur-rPK/strings.xml b/packages/SettingsLib/res/values-ur-rPK/strings.xml index 2ac8a6145797..57b0b63e37e9 100644 --- a/packages/SettingsLib/res/values-ur-rPK/strings.xml +++ b/packages/SettingsLib/res/values-ur-rPK/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"سب سے بڑا"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"حسب ضرورت (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"مدد اور تاثرات"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"مینو"</string> </resources> diff --git a/packages/SettingsLib/res/values-uz-rUZ/strings.xml b/packages/SettingsLib/res/values-uz-rUZ/strings.xml index 9022ad31dacf..b4e05052ce16 100644 --- a/packages/SettingsLib/res/values-uz-rUZ/strings.xml +++ b/packages/SettingsLib/res/values-uz-rUZ/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Eng katta"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Moslashtirilgan (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Yordam va fikr-mulohaza"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menyu"</string> </resources> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index c58f84993bb6..494cb7cfd23c 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Lớn nhất"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Tùy chỉnh (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Trợ giúp và phản hồi"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Menu"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 18ae80e3d9b6..1c58a1145c08 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"最大"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自定义 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"帮助和反馈"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"菜单"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 660071df7073..45918f0a5583 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"最大"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"說明與意見反映"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string> </resources> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index bce6f244d1e4..b2e0d12bf98d 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"最大"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"自訂 (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"說明與意見回饋"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"選單"</string> </resources> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 07c6fce2c3f9..d1379086c302 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -341,4 +341,5 @@ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Okukhulu kakhulu"</string> <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"Ngokwezifiso (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> <string name="help_feedback_label" msgid="6815040660801785649">"Usizo nempendulo"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"Imenyu"</string> </resources> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 7d42211be5e5..682af8bd536f 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -863,4 +863,7 @@ <!-- Label for Help and feedback menu item --> <string name="help_feedback_label">Help & feedback</string> + <!-- Content description for drawer menu button [CHAR_LIMIT=30]--> + <string name="content_description_menu_button">Menu</string> + </resources> diff --git a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java index b5295da3cfaf..381f903a9701 100644 --- a/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/HelpUtils.java @@ -34,6 +34,8 @@ import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.MetricsProto.MetricsEvent; import java.net.URISyntaxException; import java.util.Locale; @@ -112,6 +114,9 @@ public class HelpUtils { helpMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { + MetricsLogger.action(activity, + MetricsEvent.ACTION_SETTING_HELP_AND_FEEDBACK, + intent.getStringExtra(EXTRA_CONTEXT)); try { activity.startActivityForResult(intent, 0); } catch (ActivityNotFoundException exc) { diff --git a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java index 0e3e0d584e97..5c577f8aa83c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java +++ b/packages/SettingsLib/src/com/android/settingslib/deviceinfo/StorageMeasurement.java @@ -126,6 +126,13 @@ public class StorageMeasurement { * internal storage. Key is {@link UserHandle}. */ public SparseLongArray usersSize = new SparseLongArray(); + + @Override + public String toString() { + return "MeasurementDetails: [totalSize: " + totalSize + " availSize: " + availSize + + " cacheSize: " + cacheSize + " mediaSize: " + mediaSize + + " miscSize: " + miscSize + "usersSize: " + usersSize + "]"; + } } public interface MeasurementReceiver { @@ -435,7 +442,7 @@ public class StorageMeasurement { private static long getDirectorySize(IMediaContainerService imcs, File path) { try { final long size = imcs.calculateDirectorySize(path.toString()); - Log.d(TAG, "getDirectorySize(" + path + ") returned " + size); + if (LOGV) Log.v(TAG, "getDirectorySize(" + path + ") returned " + size); return size; } catch (Exception e) { Log.w(TAG, "Could not read memory from default container service for " + path, e); diff --git a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java index a99e66873958..af8fd4c46a64 100644 --- a/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/display/DisplayDensityUtils.java @@ -23,6 +23,7 @@ import android.content.res.Resources; import android.hardware.display.DisplayManager; import android.os.AsyncTask; import android.os.RemoteException; +import android.os.UserHandle; import android.util.DisplayMetrics; import android.util.Log; import android.util.MathUtils; @@ -207,39 +208,41 @@ public class DisplayDensityUtils { /** * Asynchronously applies display density changes to the specified display. + * <p> + * The change will be applied to the user specified by the value of + * {@link UserHandle#myUserId()} at the time the method is called. * * @param displayId the identifier of the display to modify */ public static void clearForcedDisplayDensity(final int displayId) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - try { - final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - wm.clearForcedDisplayDensity(displayId); - } catch (RemoteException exc) { - Log.w(LOG_TAG, "Unable to clear forced display density setting"); - } + final int userId = UserHandle.myUserId(); + AsyncTask.execute(() -> { + try { + final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); + wm.clearForcedDisplayDensityForUser(displayId, userId); + } catch (RemoteException exc) { + Log.w(LOG_TAG, "Unable to clear forced display density setting"); } }); } /** * Asynchronously applies display density changes to the specified display. + * <p> + * The change will be applied to the user specified by the value of + * {@link UserHandle#myUserId()} at the time the method is called. * * @param displayId the identifier of the display to modify * @param density the density to force for the specified display */ public static void setForcedDisplayDensity(final int displayId, final int density) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - try { - final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - wm.setForcedDisplayDensity(displayId, density); - } catch (RemoteException exc) { - Log.w(LOG_TAG, "Unable to save forced display density setting"); - } + final int userId = UserHandle.myUserId(); + AsyncTask.execute(() -> { + try { + final IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); + wm.setForcedDisplayDensityForUser(displayId, density, userId); + } catch (RemoteException exc) { + Log.w(LOG_TAG, "Unable to save forced display density setting"); } }); } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java index 6658c14bd1cd..458672a41b77 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java @@ -28,6 +28,8 @@ import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.os.AsyncTask; import android.os.Bundle; +import android.os.UserHandle; +import android.os.UserManager; import android.provider.Settings; import android.support.v4.widget.DrawerLayout; import android.util.ArraySet; @@ -73,6 +75,7 @@ public class SettingsDrawerActivity extends Activity { private FrameLayout mContentHeaderContainer; private DrawerLayout mDrawerLayout; private boolean mShowingMenu; + private UserManager mUserManager; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -110,6 +113,8 @@ public class SettingsDrawerActivity extends Activity { onTileClicked(mDrawerAdapter.getTile(position)); }; }); + + mUserManager = UserManager.get(this); if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + " ms"); } @@ -226,6 +231,7 @@ public class SettingsDrawerActivity extends Activity { public void showMenuIcon() { mShowingMenu = true; getActionBar().setHomeAsUpIndicator(R.drawable.ic_menu); + getActionBar().setHomeActionContentDescription(R.string.content_description_menu_button); getActionBar().setDisplayHomeAsUpEnabled(true); } @@ -256,6 +262,7 @@ public class SettingsDrawerActivity extends Activity { return true; } try { + updateUserHandlesIfNeeded(tile); int numUserHandles = tile.userHandle.size(); if (numUserHandles > 1) { ProfileSelectDialog.show(getFragmentManager(), tile); @@ -277,6 +284,19 @@ public class SettingsDrawerActivity extends Activity { return true; } + private void updateUserHandlesIfNeeded(Tile tile) { + List<UserHandle> userHandles = tile.userHandle; + + for (int i = userHandles.size()-1; i >= 0; i--) { + if (mUserManager.getUserInfo(userHandles.get(i).getIdentifier()) == null) { + if (DEBUG_TIMING) { + Log.d(TAG, "Delete the user: " + userHandles.get(i).getIdentifier()); + } + userHandles.remove(i); + } + } + } + protected void onTileClicked(Tile tile) { if (openTile(tile)) { finish(); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java index 284827b57929..aae9cf6de797 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java @@ -29,7 +29,6 @@ import android.text.TextUtils; import android.util.AttributeSet; import android.util.SparseArray; import android.widget.TextView; - import com.android.settingslib.R; public class AccessPointPreference extends Preference { @@ -44,13 +43,14 @@ public class AccessPointPreference extends Preference { private final StateListDrawable mWifiSld; private final int mBadgePadding; private final UserBadgeCache mBadgeCache; - private TextView mTitleView; + private boolean mForSavedNetworks = false; private AccessPoint mAccessPoint; private Drawable mBadge; private int mLevel; private CharSequence mContentDescription; + private int mDefaultIconResId; static final int[] WIFI_CONNECTION_STRENGTH = { R.string.accessibility_wifi_one_bar, @@ -85,6 +85,24 @@ public class AccessPointPreference extends Preference { refresh(); } + public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache, + int iconResId, boolean forSavedNetworks) { + super(context); + mBadgeCache = cache; + mAccessPoint = accessPoint; + mForSavedNetworks = forSavedNetworks; + mAccessPoint.setTag(this); + mLevel = -1; + mDefaultIconResId = iconResId; + + mWifiSld = (StateListDrawable) context.getTheme() + .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0); + + // Distance from the end of the title at which this AP's user badge should sit. + mBadgePadding = context.getResources() + .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding); + } + public AccessPoint getAccessPoint() { return mAccessPoint; } @@ -112,7 +130,7 @@ public class AccessPointPreference extends Preference { protected void updateIcon(int level, Context context) { if (level == -1) { - setIcon(null); + safeSetDefaultIcon(); } else { if (getIcon() == null) { // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then @@ -124,16 +142,24 @@ public class AccessPointPreference extends Preference { ? STATE_SECURED : STATE_NONE); Drawable drawable = mWifiSld.getCurrent(); - if (!mForSavedNetworks) { + if (!mForSavedNetworks && drawable != null) { setIcon(drawable); - } else { - setIcon(null); + return; } } + safeSetDefaultIcon(); } } } + private void safeSetDefaultIcon() { + if (mDefaultIconResId != 0) { + setIcon(mDefaultIconResId); + } else { + setIcon(null); + } + } + protected void updateBadge(Context context) { WifiConfiguration config = mAccessPoint.getConfig(); if (config != null) { diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index f7e9541b0d33..cd2d6b337f73 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -36,7 +36,7 @@ <fraction name="def_window_transition_scale">100%</fraction> <bool name="def_haptic_feedback">true</bool> - <bool name="def_bluetooth_on">false</bool> + <bool name="def_bluetooth_on">true</bool> <bool name="def_wifi_display_on">false</bool> <bool name="def_install_non_market_apps">false</bool> <bool name="def_package_verifier_enable">true</bool> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 0f7fe6fc5124..a43c398f04ad 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -114,7 +114,7 @@ import java.util.regex.Pattern; public class SettingsProvider extends ContentProvider { private static final boolean DEBUG = false; - private static final boolean DROP_DATABASE_ON_MIGRATION = !Build.IS_DEBUGGABLE; + private static final boolean DROP_DATABASE_ON_MIGRATION = true; private static final String LOG_TAG = "SettingsProvider"; @@ -2142,6 +2142,12 @@ public class SettingsProvider extends ContentProvider { // Now upgrade should work fine. onUpgradeLocked(mUserId, oldVersion, newVersion); + + // Make a note what happened, so we don't wonder why data was lost + String reason = "Settings rebuilt! Current version: " + + curVersion + " while expected: " + newVersion; + getGlobalSettingsLocked().insertSettingLocked( + Settings.Global.DATABASE_DOWNGRADE_REASON, reason, "android"); } // Set the global settings version if owner. @@ -2411,7 +2417,7 @@ public class SettingsProvider extends ContentProvider { } if (currentVersion != newVersion) { - Slog.w("SettingsProvider", "warning: upgrading settings database to version " + Slog.wtf("SettingsProvider", "warning: upgrading settings database to version " + newVersion + " left it at " + currentVersion + " instead; this is probably a bug", new Throwable()); if (DEBUG) { diff --git a/packages/Shell/Android.mk b/packages/Shell/Android.mk index 73a044951bd5..81ab2ffc2a23 100644 --- a/packages/Shell/Android.mk +++ b/packages/Shell/Android.mk @@ -12,6 +12,8 @@ LOCAL_PACKAGE_NAME := Shell LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true +LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.shell.* + include $(BUILD_PACKAGE) include $(LOCAL_PATH)/tests/Android.mk diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java index 8b0759942df8..9fd80d3ef616 100644 --- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java +++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java @@ -132,6 +132,7 @@ public class BugreportStorageProvider extends DocumentsProvider { if (!getFileForDocId(documentId).delete()) { throw new FileNotFoundException("Failed to delete: " + documentId); } + getContext().getContentResolver().notifyChange(getNotificationUri(), null); } // This is used by BugreportProgressService so that the notification uri shared by diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index bdb103aed7e7..de2511574e09 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -150,9 +150,6 @@ <!-- DevicePolicyManager get user restrictions --> <uses-permission android:name="android.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS" /> - <!-- Needed for passing extras with intent ACTION_SHOW_ADMIN_SUPPORT_DETAILS --> - <uses-permission android:name="android.permission.MANAGE_DEVICE_ADMINS" /> - <!-- TV picture-in-picture --> <uses-permission android:name="android.permission.RECEIVE_MEDIA_RESOURCE_USAGE" /> diff --git a/packages/SystemUI/res/drawable-nodpi/play.xml b/packages/SystemUI/res/drawable-nodpi/play.xml index 747e60ba4c76..772023051636 100644 --- a/packages/SystemUI/res/drawable-nodpi/play.xml +++ b/packages/SystemUI/res/drawable-nodpi/play.xml @@ -21,7 +21,4 @@ Copyright (C) 2015 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M8.0,5.0l0.0,14.0l11.0,-7.0z"/> - <path - android:pathData="M0 0h24v24H0z" - android:fillColor="#00000000"/> </vector> diff --git a/packages/SystemUI/res/drawable/car_ic_arrow.xml b/packages/SystemUI/res/drawable/car_ic_arrow.xml index 9d292cc0259a..2c5ad27fe292 100644 --- a/packages/SystemUI/res/drawable/car_ic_arrow.xml +++ b/packages/SystemUI/res/drawable/car_ic_arrow.xml @@ -21,7 +21,4 @@ <path android:fillColor="#FFFFFFFF" android:pathData="M14.0,20.0l10.0,10.0 10.0,-10.0z"/> - <path - android:pathData="M0 0h48v48H0z" - android:fillColor="#00000000"/> </vector> diff --git a/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml b/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml index 7ddb40c503a6..314a25a6d5b2 100644 --- a/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_fullscreen_white_24dp.xml @@ -18,9 +18,6 @@ Copyright (C) 2016 The Android Open Source Project android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - <path - android:pathData="M0 0h24v24H0z" /> <path android:fillColor="#FFFFFF" android:pathData="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z" /> diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml b/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml index 6519673de871..1183203bc58d 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_backspace.xml @@ -19,7 +19,6 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - <path android:pathData="M0 0h24v24H0z" /> <path android:fillColor="@color/ksh_key_item_color" android:pathData="M22 3H7c-.69 0-1.23 .35 -1.59 .88 L0 12l5.41 8.11c.36 .53 .9 .89 1.59 .89 h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_enter.xml b/packages/SystemUI/res/drawable/ic_ksh_key_enter.xml index 599f35001293..66b130707213 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_enter.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_enter.xml @@ -19,7 +19,6 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - <path android:pathData="M0 0h24v24H0z" /> <path android:fillColor="@color/ksh_key_item_color" android:pathData="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_left.xml b/packages/SystemUI/res/drawable/ic_ksh_key_left.xml index 038187e86acb..57d0423e9ce0 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_left.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_left.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> <path android:fillColor="@color/ksh_key_item_color" android:pathData="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" /> - <path android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml b/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml index 1e2195edaf21..be8fe8c57215 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_meta.xml @@ -24,5 +24,4 @@ 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27 .28 v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" /> - <path android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_right.xml b/packages/SystemUI/res/drawable/ic_ksh_key_right.xml index f2d73150705a..720d4e4b24fb 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_right.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_right.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> <path android:fillColor="@color/ksh_key_item_color" android:pathData="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" /> - <path android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_ksh_key_up.xml b/packages/SystemUI/res/drawable/ic_ksh_key_up.xml index 36a83b1d1e82..350c9949bc4b 100644 --- a/packages/SystemUI/res/drawable/ic_ksh_key_up.xml +++ b/packages/SystemUI/res/drawable/ic_ksh_key_up.xml @@ -21,5 +21,4 @@ android:viewportHeight="24"> <path android:fillColor="@color/ksh_key_item_color" android:pathData="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z" /> - <path android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml b/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml index d9a4f7bd9137..5b65f100490c 100644 --- a/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_pause_white_24dp.xml @@ -22,6 +22,4 @@ Copyright (C) 2016 The Android Open Source Project <path android:fillColor="#FFFFFF" android:pathData="M6 19h4V5H6v14zm8-14v14h4V5h-4z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml b/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml index b8fa99e1dbae..ddc9e8dd17a0 100644 --- a/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml +++ b/packages/SystemUI/res/drawable/ic_play_arrow_white_24dp.xml @@ -22,6 +22,4 @@ Copyright (C) 2016 The Android Open Source Project <path android:fillColor="#FFFFFF" android:pathData="M8 5v14l11-7z" /> - <path - android:pathData="M0 0h24v24H0z" /> </vector> diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_disconnected.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_disconnected.xml index 4d2a35e508a9..2dcdb71194d1 100644 --- a/packages/SystemUI/res/drawable/ic_qs_wifi_disconnected.xml +++ b/packages/SystemUI/res/drawable/ic_qs_wifi_disconnected.xml @@ -19,9 +19,6 @@ android:viewportWidth="26.0" android:viewportHeight="24.0"> <path - android:pathData="M0 0h26v24H0z" - android:fillColor="#00000000"/> - <path android:fillColor="#FFFFFFFF" android:pathData="M21.0,8.5 c0.85,0.0 1.6,0.23 2.3,0.62l2.24,-2.79 diff --git a/packages/SystemUI/res/drawable/ic_send.xml b/packages/SystemUI/res/drawable/ic_send.xml index 6ce3672e89ca..7cac2a41a076 100644 --- a/packages/SystemUI/res/drawable/ic_send.xml +++ b/packages/SystemUI/res/drawable/ic_send.xml @@ -22,7 +22,4 @@ Copyright (C) 2014 The Android Open Source Project <path android:fillColor="#FF000000" android:pathData="M4.02,42.0L46.0,24.0 4.02,6.0 4.0,20.0l30.0,4.0 -30.0,4.0z"/> - <path - android:pathData="M0 0h48v48H0z" - android:fillColor="#00000000"/> </vector> diff --git a/packages/SystemUI/res/layout/remote_input.xml b/packages/SystemUI/res/layout/remote_input.xml index f0c4e595106a..73f26e2bb57c 100644 --- a/packages/SystemUI/res/layout/remote_input.xml +++ b/packages/SystemUI/res/layout/remote_input.xml @@ -42,7 +42,7 @@ android:singleLine="true" android:ellipsize="start" android:inputType="textShortMessage|textAutoCorrect|textCapSentences" - android:imeOptions="actionNone|flagNoExtractUi" /> + android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen" /> <FrameLayout android:layout_width="wrap_content" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 546698cfb28a..c87183724f42 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Toestel kan gemonitor word"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profiel kan gemonitor word"</string> <string name="vpn_footer" msgid="2388611096129106812">"Netwerk kan dalk gemonitor word"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Netwerk kan dalk gemonitor word"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Toestelmonitering"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profielmonitering"</string> <string name="monitoring_title" msgid="169206259253048106">"Netwerkmonitering"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Jy is gekoppel aan <xliff:g id="APPLICATION">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Jy is gekoppel aan <xliff:g id="APPLICATION">%1$s</xliff:g>, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Jy is gekoppel aan <xliff:g id="APPLICATION">%1$s</xliff:g>, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Jou werkprofiel word deur <xliff:g id="ORGANIZATION">%1$s</xliff:g> bestuur. Dit is gekoppel aan <xliff:g id="APPLICATION">%2$s</xliff:g>, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Jou werkprofiel word deur <xliff:g id="ORGANIZATION">%1$s</xliff:g> bestuur. Dit is gekoppel aan <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nJy is ook gekoppel aan <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, wat jou persoonlike netwerkaktiwiteit kan monitor."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jou toestel word bestuur deur <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nJou administrateur kan instelings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is gekoppel aan <xliff:g id="APPLICATION">%2$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nVir meer inligting, kontak jou administrateur."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Wys horlosiesekondes op die statusbalk. Sal batterylewe dalk beïnvloed."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Herrangskik Kitsinstellings"</string> <string name="show_brightness" msgid="6613930842805942519">"Wys helderheid in Kitsinstellings"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktiveer die verdeling van die skerm deur op te swiep"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktiveer gebaar om skerm te verdeel deur van die Oorsig-knoppie af op te swiep"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimenteel"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Skakel Bluetooth aan?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Jy moet Bluetooth aanskakel om jou sleutelbord aan jou tablet te koppel."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index bd4afe177b3e..a060cdc9f932 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"መሣሪያው ክትትል የሚደረግበት ሊሆን ይችላል"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"መገለጫ ክትትል ሊደረግበት ይችላል"</string> <string name="vpn_footer" msgid="2388611096129106812">"አውታረ መረብ በክትትል እየተደረገበት ሊሆን ይችላል"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"አውታረ መረብ ክትትል የሚደረግበት ሊሆን ይችላል"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"የመሣሪያ ክትትል"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"መገለጫን መከታተል"</string> <string name="monitoring_title" msgid="169206259253048106">"የአውታረ መረብ ክትትል"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው ከ<xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"የስራ መገለጫዎ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"የስራ መገለጫዎ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nእንዲሁም የግል አውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ጋርም ተገናኝተዋል።"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"የእርስዎ መሣሪያ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"የሰዓት ሰከንዶችን በሁኔታ አሞሌ ውስጥ አሳይ። በባትሪ ዕድሜ ላይ ተጽዕኖ ሊኖርው ይችል ይሆናል።"</string> <string name="qs_rearrange" msgid="8060918697551068765">"ፈጣን ቅንብሮችን ዳግም ያደራጁ"</string> <string name="show_brightness" msgid="6613930842805942519">"በፈጣን ቅንብሮች ውስጥ ብሩህነትን አሳይ"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"የተከፈለ ማያ ገጽ ወደ ላይ የማንሸራተት ጣት ምልክትን ያንቁ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ከአጠቃላይ እይታ አዝራሩ ወደ ላይ በማንሸራተት ወደ የተከፈለ ማያ ገጽ የሚገቡበትን የጣት ምልክት ያንቁ"</string> <string name="experimental" msgid="6198182315536726162">"የሙከራ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ብሉቱዝ ይብራ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"የቁልፍ ሰሌዳዎን ከእርስዎ ጡባዊ ጋር ለማገናኘት በመጀመሪያ ብሉቱዝን ማብራት አለብዎት።"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index eca668e2e22d..1dfe411e19c2 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -412,6 +412,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ربما تتم مراقبة الجهاز"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ربما تتم مراقبة الملف الشخصي"</string> <string name="vpn_footer" msgid="2388611096129106812">"قد تكون الشبكة خاضعة للمراقبة"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"قد تكون الشبكة خاضعة للمراقبة"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"مراقبة الأجهزة"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"مراقبة الملف الشخصي"</string> <string name="monitoring_title" msgid="169206259253048106">"مراقبة الشبكات"</string> @@ -424,6 +425,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"شبكة ظاهرية خاصة"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"أنت متصل بـ <xliff:g id="APPLICATION">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"أنت متصل بـ <xliff:g id="APPLICATION">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"أنت متصل بـ <xliff:g id="APPLICATION">%1$s</xliff:g>، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"تتم إدارة ملفك الشخصي للعمل عن طريق <xliff:g id="ORGANIZATION">%1$s</xliff:g>. وهذا الملف الشخصي للعمل متصل بـ <xliff:g id="APPLICATION">%2$s</xliff:g>، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"تتم إدارة ملفك الشخصي للعمل عن طريق <xliff:g id="ORGANIZATION">%1$s</xliff:g>. وهذا الملف الشخصي للعمل متصل بـ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>، الذي يمكنه مراقبة أنشطتك على شبكة العمل، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nأنت متصل أيضًا بـ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>، الذي يمكنه مراقبة أنشطتك الشخصية على الشبكة."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"تتم إدارة جهازك عن طريق <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nيمكن للمشرف مراقبة وإدارة كل من الإعدادات والوصول إلى الشركة والتطبيقات والبيانات المرتبطة بجهازك ومعلومات الموقع لجهازك.\n\nأنت متصل بـ <xliff:g id="APPLICATION">%2$s</xliff:g>، الذي يمكنه مراقبة أنشطتك على الشبكة، بما في ذلك الرسائل الإلكترونية والتطبيقات ومواقع الويب.\n\nللمزيد من المعلومات، اتصل بالمشرف."</string> @@ -500,8 +502,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"عرض ثواني الساعة في شريط الحالة. قد يؤثر ذلك في عمر البطارية."</string> <string name="qs_rearrange" msgid="8060918697551068765">"إعادة ترتيب الإعدادات السريعة"</string> <string name="show_brightness" msgid="6613930842805942519">"عرض السطوع في الإعدادات السريعة"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"تمكين إيماءة تقسيم الشاشة بالتمرير السريع لأعلى"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"تمكين الإيماء لإدخال تقسيم الشاشة من خلال التمرير السريع لأعلى من زر النظرة العامة"</string> <string name="experimental" msgid="6198182315536726162">"إعدادات تجريبية"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"تشغيل البلوتوث؟"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"لتوصيل لوحة المفاتيح بالجهاز اللوحي، يلزمك تشغيل بلوتوث أولاً."</string> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index 3d9cc4ab307d..8973b8677977 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Cihaz nəzarət altında ola bilər"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil izlənə bilər"</string> <string name="vpn_footer" msgid="2388611096129106812">"Şəbəkə nəzərdən keçirilə bilər"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Şəbəkə nəzərdən keçirilə bilər"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Cihaza nəzarət"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profil izlənməsi"</string> <string name="monitoring_title" msgid="169206259253048106">"Şəbəkə monitorinqi"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN (Virtual Şəxsi Şəbəkələr)"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəbəkə fəaliyyətinizə nəzarət edə bilər."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> tətbiqinə qoşulmusunuz və o, e-məktublar, tətbiq və veb saytlar daxil olmaqla şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"İş profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tərəfindən idarə olunur. <xliff:g id="APPLICATION">%2$s</xliff:g> tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizə nəzarət edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir.\n\nƏtraflı məlumat üçün administratorunuz ilə əlaqə saxlayın."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"İş profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tərəfindən idarə olunur. <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> tətbiqinə qoşuludur və iş şəbəkə fəaliyyətinizi idarə edə bilər, bura e-məktubıar, tətbiq və veb saytlar daxildir\n\nSiz, həmçinin, <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> tətbiqinə də qoşulsunuz və o, şəxsi şəbəkə fəaliyyətinizə nəzarət edə bilər."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Sizin cihaz tərəfindən idarə olunur <xliff:g id="ORGANIZATION">%1$s</xliff:g> . \n\n Sizin administrator nəzarət və parametrləri, korporativ giriş, apps, sizin cihaz ilə bağlı məlumat və cihaz yer məlumat idarə edə bilərsiniz. \n\n Siz bağlı olduğunuz <xliff:g id="APPLICATION">%2$s</xliff:g> , E-poçt, apps, və web o cümlədən, şəbəkə fəaliyyətinə nəzarət edə bilər. \n\n Daha ətraflı məlumat üçün, administratora müraciət."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Saatın saniyəsini status panelində göstərin. Batareyaya təsir edə bilər."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Sürətli Ayarları yenidən tənzimləyin"</string> <string name="show_brightness" msgid="6613930842805942519">"Sürətli ayarlarda parlaqlılığı göstərin"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Bölünmüş ekran sürüşdürməsi aktiv edin"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Jestlərin icmal düyməsindən yuxarı sürüşdürərək bölünmüş ekrana daxil olmasını aktiv edin"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth aktivləşsin?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Tabletinizlə klaviaturaya bağlanmaq üçün ilk olaraq Bluetooth\'u aktivləşdirməlisiniz."</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index f95045c0021c..cdb1917e1f21 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Uređaj se možda nadgleda"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil se možda nadgleda"</string> <string name="vpn_footer" msgid="2388611096129106812">"Mreža se možda nadgleda"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Mreža se možda nadgleda"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Nadgledanje uređaja"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadgledanje profila"</string> <string name="monitoring_title" msgid="169206259253048106">"Nadgledanje mreže"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Povezani ste sa aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Povezani ste sa aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Povezani ste sa aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može da nadgleda aktivnosti na ličnoj mreži, uključujući imejlove, aplikacije i veb-sajtove."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profilom za Work upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je sa aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g>, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profilom za Work upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je sa aplikacijom <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, koja može da nadgleda aktivnosti na poslovnoj mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nPovezani ste i sa aplikacijom <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, koja može da nadgleda aktivnosti na ličnoj mreži."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator može da nadgleda podešavanja, korporativni pristup, aplikacije, podatke povezane sa uređajem i informacije o lokaciji uređaja, kao i da upravlja njima.\n\nPovezani ste sa aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g>, koja može da nadgleda aktivnosti na mreži, uključujući imejlove, aplikacije i veb-sajtove.\n\nViše informacija potražite od administratora."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Sekunde na satu se prikazuju na statusnoj traci. To može da utiče na trajanje baterije."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Preuredi Brza podešavanja"</string> <string name="show_brightness" msgid="6613930842805942519">"Prikaži osvetljenost u Brzim podešavanjima"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Omogući pokret za prevlačenje nagore za podeljeni ekran"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Omogućava pokret za prelazak na podeljeni ekran prevlačenjem nagore od dugmeta Pregled"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentalno"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želite li da uključite Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Da biste povezali tastaturu sa tabletom, prvo morate da uključite Bluetooth."</string> diff --git a/packages/SystemUI/res/values-be-rBY/strings.xml b/packages/SystemUI/res/values-be-rBY/strings.xml index 325d70652cd3..7ddb67dcd275 100644 --- a/packages/SystemUI/res/values-be-rBY/strings.xml +++ b/packages/SystemUI/res/values-be-rBY/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"За прыладай могуць назіраць"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"За профілем могуць назіраць"</string> <string name="vpn_footer" msgid="2388611096129106812">"За сеткай могуць назіраць"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"За сеткай могуць назіраць"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Маніторынг прылад"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Маніторынг профіляў"</string> <string name="monitoring_title" msgid="169206259253048106">"Маніторынг сеткі"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Вы падлучаны да праграмы <xliff:g id="APPLICATION">%1$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Вы падлучаны да праграмы <xliff:g id="APPLICATION">%1$s</xliff:g>, якая сачыць за вашай асабістай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Вы падключаны да праграмы <xliff:g id="APPLICATION">%1$s</xliff:g>, якая можа сачыць за вашай асабістай сеткавай дзейнасцю, уключаючы электронную пошту, праграмы і вэб-сайты."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Ваш працоўны профіль знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ён падлучаны да праграмы <xliff:g id="APPLICATION">%2$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Ваш працоўны профіль знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ён падлучаны да праграмы <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nВы таксама падлучаны да праграмы <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, якая можа сачыць за вашай асабістай сеткавай актыўнасцю."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Ваша прылада знаходзіцца пад кіраваннем <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nВаш адміністратар можа сачыць і кіраваць наладамі, доступам да карпаратыўных рэсурсаў, праграмамі, данымі, звязанымі з вашай прыладай, і звесткамі пра месцазнаходжанне прылады.\n\nВы падлучаны да праграмы <xliff:g id="APPLICATION">%2$s</xliff:g>, якая можа сачыць за вашай сеткавай актыўнасцю, уключаючы электронную пошту, праграмы і вэб-сайты.\n\nДля атрымання дадатковай інфармацыі звярніцеся да адміністратара."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Паказваць секунды гадзінніка на панэлі стану. Можа паўплываць на рэсурс акумулятара."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Змяніць парадак Хуткіх налад"</string> <string name="show_brightness" msgid="6613930842805942519">"Паказваць яркасць у Хуткіх наладах"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Уключ. пераход да рэжыму дзялення экрана правядзеннем уверх"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Уключыць пераход да рэжыму дзялення экрана правядзеннем пальцам уверх ад кнопкі «Агляд»"</string> <string name="experimental" msgid="6198182315536726162">"Эксперыментальныя"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Уключыць Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Для падлучэння клавіятуры да планшэта трэба спачатку ўключыць Bluetooth."</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c5817eeeeadc..0606ab87a577 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Устройството може да се наблюдава"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Възможно е потребителският профил да се наблюдава"</string> <string name="vpn_footer" msgid="2388611096129106812">"Мрежата може да се наблюдава"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Мрежата може да се наблюдава"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Наблюдение на устройството"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Наблюдаване на потр. профил"</string> <string name="monitoring_title" msgid="169206259253048106">"Наблюдение на мрежата"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Установена е връзка с приложението <xliff:g id="APPLICATION">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Установена е връзка с приложението <xliff:g id="APPLICATION">%1$s</xliff:g>, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Установена е връзка с приложението <xliff:g id="APPLICATION">%1$s</xliff:g>, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Служебният ви потребителски профил се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Той е свързан с приложението <xliff:g id="APPLICATION">%2$s</xliff:g>, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Служебният ви потребителски профил се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Той е свързан с приложението <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nУстановена е връзка и с приложението <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, което може да наблюдава личната ви активност в мрежата."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Устройството ви се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nУстановена е връзка с приложението <xliff:g id="APPLICATION">%2$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Показване на секундите на часовника в лентата на състоянието. Може да се отрази на живота на батерията."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Пренареждане на бързите настройки"</string> <string name="show_brightness" msgid="6613930842805942519">"Показване на яркостта от бързите настройки"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Разделяне на екрана с прекарване на пръст нагоре: Активиране"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Активиране на жеста за влизане в режим на разделен екран чрез прокарване на пръст нагоре от бутона за общ преглед"</string> <string name="experimental" msgid="6198182315536726162">"Експериментални"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Да се включи ли Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"За да свържете клавиатурата с таблета си, първо трябва да включите Bluetooth."</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 40076e6d2c3f..aff290024e5f 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ডিভাইসটি নিরীক্ষণ করা হতে পারে"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"প্রোফাইল পর্যবেক্ষণ করা হতে পারে"</string> <string name="vpn_footer" msgid="2388611096129106812">"নেটওয়ার্ক নিরীক্ষণ করা হতে পারে"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"নেটওয়ার্ক নিরীক্ষণ করা হতে পারে"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ডিভাইস নিরীক্ষণ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"প্রোফাইল দেখরেখ করা"</string> <string name="monitoring_title" msgid="169206259253048106">"নেটওয়ার্ক নিরীক্ষণ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> -এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এর সাথে সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ এবং ওয়েবসাইটগুলি সহ আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করবে৷"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি <xliff:g id="APPLICATION">%2$s</xliff:g> -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> -এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nএছাড়াও আপনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন যা আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"স্থিতি দন্ডে ঘড়ির সেকেন্ড দেখায়৷ ব্যাটারি লাইফকে প্রভাবিত করতে পারে৷"</string> <string name="qs_rearrange" msgid="8060918697551068765">"দ্রুত সেটিংসে পুনরায় সাজান"</string> <string name="show_brightness" msgid="6613930842805942519">"দ্রুত সেটিংসে উজ্জ্বলতা দেখান"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"উপরের দিকে সোয়াইপ করে বিভক্ত-স্ক্রীনে প্রবেশ করার অঙ্গভঙ্গি সক্ষম করুন"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"\'এক নজরে\' বোতাম থেকে উপরের দিকে সোয়াইপ করে, বিভক্ত-স্ক্রীনে প্রবেশ করতে অঙ্গভঙ্গি সক্ষম করুন"</string> <string name="experimental" msgid="6198182315536726162">"পরীক্ষামূলক"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ব্লুটুথ চালু করবেন?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"আপনার ট্যাবলেটের সাথে আপনার কীবোর্ড সংযুক্ত করতে, আপনাকে প্রথমে ব্লুটুথ চালু করতে হবে।"</string> diff --git a/packages/SystemUI/res/values-bs-rBA-land/strings.xml b/packages/SystemUI/res/values-bs-rBA-land/strings.xml index bdc652af8f1a..56a4ad276d08 100644 --- a/packages/SystemUI/res/values-bs-rBA-land/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA-land/strings.xml @@ -19,5 +19,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u pejzažnom prikazu."</string> + <string name="toast_rotation_locked" msgid="7609673011431556092">"Ekran je sada zaključan u vodoravnom prikazu."</string> </resources> diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index dcba67bbb655..08a12d767fbd 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Uređaj može biti nadziran"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil može biti nadziran"</string> <string name="vpn_footer" msgid="2388611096129106812">"Mreža može biti nadzirana"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Mreža može biti nadzirana"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Praćenje uređaja"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Praćenje profila"</string> <string name="monitoring_title" msgid="169206259253048106">"Praćenje mreže"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Povezani ste sa aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-mailove, aplikacije i web-lokacije."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Povezani ste sa aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može pratiti vašu aktivnost na privatnoj mreži, uključujući e-mailove, aplikacije i web-lokacije."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Povezani ste na aplikaciju <xliff:g id="APPLICATION">%1$s</xliff:g>, koja može pratiti vaše privatne aktivnosti na mreži, uključujući e-poštu, aplikacije i web stranice."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profilom za posao upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je sa aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g>, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profilom za posao upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je sa aplikacijom <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, koja može pratiti vašu aktivnost na radnoj mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i sa aplikacijom <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, koja može pratiti vašu aktivnost na privatnoj mreži."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Vašim uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može pratiti postavke, korporativni pristup, aplikacije, podatke povezane sa vašim uređajem i informacije o lokaciji uređaja, kao i upravljati njima.\n\nPovezani ste sa aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g>, koja može pratiti vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nZa više informacija kontaktirajte svog administratora."</string> @@ -496,8 +498,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Prikaži sekunde na statusnoj traci. Može skratiti trajanje baterije."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Preuredi \"Brze postavke\""</string> <string name="show_brightness" msgid="6613930842805942519">"Prikaži osvjetljenje u opciji \"Brze postavke\""</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Omogućiti potez za podjelu ekrana prevlačenjem prema gore"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Uključite pokrete prstima da biste ušli u podijeljeni ekran tako što ćete od dugmeta Pregled prevući prstom prema gore"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentalno"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želiti li uključiti Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Da povežete tastaturu sa tabletom, prvo morate uključiti Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 3354f92638b0..b51d7e76222c 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"És possible que el dispositiu estigui supervisat."</string> <string name="profile_owned_footer" msgid="8021888108553696069">"El perfil es pot supervisar"</string> <string name="vpn_footer" msgid="2388611096129106812">"És possible que la xarxa estigui supervisada."</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"És possible que la xarxa estigui supervisada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Supervisió del dispositiu"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisió del perfil"</string> <string name="monitoring_title" msgid="169206259253048106">"Supervisió de la xarxa"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Estàs connectat a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Estàs connectat a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Estàs connectat a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el teu perfil professional. Aquest perfil està connectat a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el teu perfil professional. Aquest perfil està connectat a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nA més, estàs connectat a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que també pot supervisar la teva activitat personal a la xarxa."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pot supervisar l\'activitat a la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostra els segons del rellotge a la barra d\'estat. Això pot afectar la durada de la bateria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganitza Configuració ràpida"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostra la brillantor a Configuració ràpida"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Activa el gest per dividir la pantalla en lliscar cap amunt"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activa el gest per entrar al mode de pantalla dividida en lliscar cap amunt des del botó Visió general"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vols activar el Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Per connectar el teclat amb la tauleta, primer has d\'activar el Bluetooth."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index d64e5d9eb806..782602ab13ce 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Zařízení může být sledováno"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil může být monitorován"</string> <string name="vpn_footer" msgid="2388611096129106812">"Síť může být sledována"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Síť může být monitorována"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Sledování zařízení"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoring profilu"</string> <string name="monitoring_title" msgid="169206259253048106">"Sledování sítě"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Jste připojeni k aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Jste připojeni k aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Jste připojeni k aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Váš pracovní profil spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je připojen k aplikaci <xliff:g id="APPLICATION">%2$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Váš pracovní profil spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je připojen k aplikaci <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nTaké jste připojeni k aplikaci <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a informace o jeho poloze.\n\nJste připojeni k aplikaci <xliff:g id="APPLICATION">%2$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Na stavovém řádku se bude zobrazovat sekundová ručička. Může být ovlivněna výdrž baterie."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Změnit uspořádání Rychlého nastavení"</string> <string name="show_brightness" msgid="6613930842805942519">"Zobrazit jas v Rychlém nastavení"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktivovat rozdělenou obrazovku přejetím prstem nahoru"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Umožňuje aktivovat rozdělenou obrazovku přejetím prstem nahoru od tlačítka Přehled."</string> <string name="experimental" msgid="6198182315536726162">"Experimentální"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Zapnout Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Chcete-li klávesnici připojit k tabletu, nejdříve musíte zapnout Bluetooth."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index da8daa4da468..c37fe151d658 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Enheden kan være overvåget"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilen kan overvåges"</string> <string name="vpn_footer" msgid="2388611096129106812">"Netværket kan være overvåget"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Netværket kan være overvåget"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Overvågning af enhed"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilovervågning"</string> <string name="monitoring_title" msgid="169206259253048106">"Overvågning af netværk"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Du har forbindelse til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Du har forbindelse til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Du har forbindelse til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåge din private netværksaktivitet, bl.a. e-mails, apps og websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Din arbejdsprofil administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er forbundet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Din arbejdsprofil administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er forbundet til <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nDu er også forbundet til <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan overvåge din private netværksaktivitet."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Din enhed administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedens adgang, data tilknyttet din enhed og enhedens stedoplysninger.\n\nDu er forbundet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Vis sekunder i statuslinjen. Dette kan påvirke batteriets levetid."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Omarranger Hurtige indstillinger"</string> <string name="show_brightness" msgid="6613930842805942519">"Vis lysstyrke i Hurtige indstillinger"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktivér bevægelsen Stryg opad for at dele skærmen"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktivér bevægelse for at dele skærmen ved at stryge opad fra knappen Oversigt"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentel"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vil du slå Bluetooth til?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Bluetooth skal være slået til, før du kan knytte dit tastatur til din tablet."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 46078d9c2516..c353fae561b0 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Aktivität auf dem Gerät kann vom Eigentümer protokolliert werden"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil wird möglicherweise überwacht."</string> <string name="vpn_footer" msgid="2388611096129106812">"Das Netzwerk wird möglicherweise überwacht."</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Das Netzwerk wird möglicherweise überwacht"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Geräteüberwachung"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilüberwachung"</string> <string name="monitoring_title" msgid="169206259253048106">"Netzwerküberwachung"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Du bist mit der App <xliff:g id="APPLICATION">%1$s</xliff:g> verbunden, die deine Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Du bist mit der App <xliff:g id="APPLICATION">%1$s</xliff:g> verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Du bist mit der App \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" verbunden. Diese kann deine persönlichen Netzwerkaktivitäten erfassen, einschließlich E-Mails, Apps und Websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Dein Arbeitsprofil wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet. Das Profil ist mit der App <xliff:g id="APPLICATION">%2$s</xliff:g> verbunden, die deine geschäftlichen Netzwerkaktivitäten überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du von deinem Administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Dein Arbeitsprofil wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet. Das Profil ist mit der App <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> verbunden, die deine geschäftliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nDu bist außerdem mit der App <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> verbunden, die deine persönliche Netzwerkaktivität überwachen kann."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Dein Gerät wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet.\n\nDein Administrator kann die zu deinem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen deines Geräts.\n\nDu bist außerdem mit der App <xliff:g id="APPLICATION">%2$s</xliff:g> verbunden, die deine persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhältst du bei deinem Administrator."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Uhrsekunden in der Statusleiste anzeigen. Kann sich auf die Akkulaufzeit auswirken."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Schnelleinstellungen neu anordnen"</string> <string name="show_brightness" msgid="6613930842805942519">"Helligkeit in den Schnelleinstellungen anzeigen"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Teilen des Bildschirms durch Wischen nach oben aktivieren"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktiviert die Bewegung zum Teilen des Bildschirms, bei der von der Schaltfläche \"Übersicht\" nach oben gewischt wird"</string> <string name="experimental" msgid="6198182315536726162">"Experimentell"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth aktivieren?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Zum Verbinden von Tastatur und Tablet muss Bluetooth aktiviert sein."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 0a327ab24910..ac260dc6f5a9 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Η συσκευή μπορεί να παρακολουθείται"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Το προφίλ ενδέχεται να παρακολουθείται"</string> <string name="vpn_footer" msgid="2388611096129106812">"Το δίκτυο ενδέχεται να παρακολουθείται"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Το δίκτυο ενδέχεται να παρακολουθείται"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Παρακολούθηση συσκευής"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Παρακολούθηση προφίλ"</string> <string name="monitoring_title" msgid="169206259253048106">"Παρακολούθηση δικτύου"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Είναι συνδεδεμένο στην εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Είναι συνδεδεμένο στην εφαρμογή <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Η διαχείριση της συσκευής γίνεται από <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές, δεδομένα σχετικά με τη συσκευή και πληρ. τοποθεσίας της συσκευής.\n\nΕίστε συνδεδ. σε <xliff:g id="APPLICATION">%2$s</xliff:g> που μπορεί να παρακολουθεί τη δραστηρ. του δικτύου εργασίας, όπως μηνύματα ηλεκτρ. ταχυδρομείου, εφαρμογές και ιστότοπους.\n\nΓια περισ. πληροφορίες, επικοινωνήστε με το διαχειριστή."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Εμφάνιση δευτερολέπτων ρολογιού στη γραμμή κατάστασης. Ενδέχεται να επηρεάσει τη διάρκεια ζωής της μπαταρίας."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Αναδιάταξη Γρήγορων ρυθμίσεων"</string> <string name="show_brightness" msgid="6613930842805942519">"Εμφάνιση φωτεινότητας στις Γρήγορες ρυθμίσεις"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ενεργοποίηση κίνησης ολίσθησης επάνω για διαχωρισμό οθόνης"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Ενεργοποίηση κίνησης για μετάβαση σε διαχωρισμό οθόνης μέσω ολίσθησης επάνω από το κουμπί \"Επισκόπηση\""</string> <string name="experimental" msgid="6198182315536726162">"Σε πειραματικό στάδιο"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ενεργοποίηση Bluetooth;"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Για να συνδέσετε το πληκτρολόγιο με το tablet σας, θα πρέπει πρώτα να ενεργοποιήσετε το Bluetooth."</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 9443ad90c342..f97418348ed7 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Device may be monitored"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string> <string name="vpn_footer" msgid="2388611096129106812">"Network may be monitored"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Network may be monitored"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Device monitoring"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string> <string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your network activity including emails, apps and websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, which can monitor your personal network activity."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Your device is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Show clock seconds in the status bar. May impact battery life."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Rearrange Quick Settings"</string> <string name="show_brightness" msgid="6613930842805942519">"Show brightness in Quick Settings"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Enable split-screen swipe-up gesture"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Enable gesture to enter split-screen by swiping up from the Overview button"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Turn on Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 9443ad90c342..f97418348ed7 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Device may be monitored"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string> <string name="vpn_footer" msgid="2388611096129106812">"Network may be monitored"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Network may be monitored"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Device monitoring"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string> <string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your network activity including emails, apps and websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, which can monitor your personal network activity."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Your device is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Show clock seconds in the status bar. May impact battery life."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Rearrange Quick Settings"</string> <string name="show_brightness" msgid="6613930842805942519">"Show brightness in Quick Settings"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Enable split-screen swipe-up gesture"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Enable gesture to enter split-screen by swiping up from the Overview button"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Turn on Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 9443ad90c342..f97418348ed7 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Device may be monitored"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profile may be monitored"</string> <string name="vpn_footer" msgid="2388611096129106812">"Network may be monitored"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Network may be monitored"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Device monitoring"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profile monitoring"</string> <string name="monitoring_title" msgid="169206259253048106">"Network monitoring"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your network activity including emails, apps and websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"You\'re connected to <xliff:g id="APPLICATION">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps and websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nFor more information, contact your administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Your work profile is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>. It is connected to <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps and websites.\n\nYou\'re also connected to <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, which can monitor your personal network activity."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Your device is managed by <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nYour administrator can monitor and manage settings, corporate access, apps, data associated with your device, and your device\'s location information.\n\nYou\'re connected to <xliff:g id="APPLICATION">%2$s</xliff:g>, which can monitor your network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Show clock seconds in the status bar. May impact battery life."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Rearrange Quick Settings"</string> <string name="show_brightness" msgid="6613930842805942519">"Show brightness in Quick Settings"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Enable split-screen swipe-up gesture"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Enable gesture to enter split-screen by swiping up from the Overview button"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Turn on Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"To connect your keyboard with your tablet, you first have to turn on Bluetooth."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 602d6b2dfd71..12062d1ba4b6 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Es posible que el dispositivo esté supervisado."</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Es posible que se supervise el perfil."</string> <string name="vpn_footer" msgid="2388611096129106812">"Es posible que la red esté supervisada."</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Es posible que la red esté supervisada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Supervisión del dispositivo"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión del perfil"</string> <string name="monitoring_title" msgid="169206259253048106">"Supervisión de red"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Tienes conexión a la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Tienes conexión a la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar la actividad de la red personal, incluidos los correos electrónicos, las aplicaciones y los sitios web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Te conectaste a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar la actividad de tu red personal, incluidos los correos electrónicos, las apps y los sitios web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu perfil de trabajo. Tiene conexión a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu perfil de trabajo. Tiene conexión a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nTambién tienes conexión a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que puede supervisar la actividad de la red personal."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de la ubicación.\n\nTienes conexión a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Muestra los segundos del reloj en la barra de estado. Puede afectar la duración de la batería."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar la Configuración rápida"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar el brillo en la Configuración rápida"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Habilitar gesto de dedo hacia arriba para dividir pantalla"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Habilita el gesto de deslizar el dedo hacia arriba desde el botón Recientes para acceder al modo de pantalla dividida"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"¿Activar Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar el teclado con la tablet, primero debes activar Bluetooth."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index ba11d6fb9e5d..8d6f9d8ee2f0 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Es posible que este dispositivo esté supervisado"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Es posible que se supervise el perfil"</string> <string name="vpn_footer" msgid="2388611096129106812">"Puede que la red esté supervisada"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Puede que la red esté supervisada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Supervisión de dispositivo"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión del perfil"</string> <string name="monitoring_title" msgid="169206259253048106">"Supervisión de red"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Estas conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Estas conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede controlar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"El administrador de tu perfil de trabajo es <xliff:g id="ORGANIZATION">%1$s</xliff:g> y está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede controlar tu actividad de red del trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con el administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"El administrador de tu perfil de trabajo es <xliff:g id="ORGANIZATION">%1$s</xliff:g> y está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nTú también estás conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que puede controlar tu actividad de red personal."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"El administrador de tu dispositivo es <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Muestra los segundos del reloj en la barra de estado. Puede afectar a la duración de la batería."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar Ajustes rápidos"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar brillo en Ajustes rápidos"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Habilitar deslizar dedo hacia arriba para dividir pantalla"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Habilita el gesto de deslizar el dedo hacia arriba desde el botón Aplicaciones recientes para acceder al modo de pantalla dividida"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"¿Activar Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para poder conectar tu teclado a tu tablet, debes activar el Bluetooth."</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index bfc55e9724d1..801eb03af7f6 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -47,7 +47,7 @@ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"Pööra ekraani automaatselt"</string> <string name="status_bar_settings_mute_label" msgid="554682549917429396">"SUMMUTA"</string> <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"AUTO"</string> - <string name="status_bar_settings_notifications" msgid="397146176280905137">"Teatised"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"Märguanded"</string> <string name="bluetooth_tethered" msgid="7094101612161133267">"Bluetooth on jagatud"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"Seadista sisestusmeetodeid"</string> <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"Füüsiline klaviatuur"</string> @@ -164,7 +164,7 @@ <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) --> <skip /> <string name="accessibility_settings_button" msgid="799583911231893380">"Süsteemiseaded"</string> - <string name="accessibility_notifications_button" msgid="4498000369779421892">"Teatised"</string> + <string name="accessibility_notifications_button" msgid="4498000369779421892">"Märguanded"</string> <string name="accessibility_remove_notification" msgid="3603099514902182350">"Märguande eemaldamine."</string> <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS on lubatud."</string> <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS-signaali otsimine."</string> @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Seadet võidakse jälgida"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profiili võidakse jälgida"</string> <string name="vpn_footer" msgid="2388611096129106812">"Võrku võidakse jälgida"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Võrku võidakse jälgida"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Seadme jälgimine"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profiili jälgimine"</string> <string name="monitoring_title" msgid="169206259253048106">"Võrgu jälgimine"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Teie seade on ühendatud rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>, mis võib jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Teie seade on ühendatud rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Olete ühendatud rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Teie tööprofiili haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>. See on ühendatud rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Teie tööprofiili haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>. See on ühendatud rakendusega <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nTeie seade on ühendatud ka rakendusega <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, mis võib jälgida teie isiklikke võrgutegevusi."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Teie seadet haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nOlete ühendatud rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Olekuribal kella sekundite kuvamine. See võib mõjutada aku kasutusaega."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Korralda kiirseaded ümber"</string> <string name="show_brightness" msgid="6613930842805942519">"Kuva kiirseadetes heledus"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Luba ülespühkimise liigutus ekraani poolitamiseks"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Lubab žesti, mis poolitab ekraani, kui kasutaja pühib üles nupul Ülevaade."</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentaalne"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Kas lülitada Bluetooth sisse?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Klaviatuuri ühendamiseks tahvelarvutiga peate esmalt Bluetoothi sisse lülitama."</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index a340b3d3f90f..2c3a3141a751 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Baliteke gailua kontrolatuta egotea"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Baliteke profila kontrolatuta egotea"</string> <string name="vpn_footer" msgid="2388611096129106812">"Baliteke sarea kontrolatuta egotea"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Baliteke sarea kontrolatuta egotea"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Gailuen kontrola"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profila kontrolatzeko aukera"</string> <string name="monitoring_title" msgid="169206259253048106">"Sareen kontrola"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN konexioa"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da laneko profilaren kudeatzailea, eta profila <xliff:g id="APPLICATION">%2$s</xliff:g> aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da laneko profilaren kudeatzailea, eta profila <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nHorrez gain, sarean egiten dituzun jarduera pertsonalak kontrola ditzakeen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> aplikaziora konektatuta zaude."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da gailuaren kudeatzailea.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Erakutsi erlojuko segundoak egoera-barran. Baliteke bateria gehiago erabiltzea."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Berrantolatu ezarpen bizkorrak"</string> <string name="show_brightness" msgid="6613930842805942519">"Erakutsi distira Ezarpen bizkorretan"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Gaitu pantaila zatitzeko keinua hatza gora pasatuta"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Sakatu Ikuspegi nagusia botoia eta gaitu hatza gora pasatuta pantaila zatitzeko keinua"</string> <string name="experimental" msgid="6198182315536726162">"Esperimentala"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth eginbidea aktibatu nahi duzu?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Teklatua tabletara konektatzeko, Bluetooth eginbidea aktibatu behar duzu."</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 58a5d936a68f..dcc30e2495b3 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -347,8 +347,8 @@ <string name="description_direction_left" msgid="7207478719805562165">"لغزاندن به چپ برای <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"صداها و لرزشهایی به جز هشدارها، یادآوریها، رویدادها و تماسگیرندههایی که مشخص میکنید، مزاحم شما نمیشوند."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"سفارشی کردن"</string> - <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدیوها و بازیها را مسدود میکند. همچنان میتوانید تماس تلفنی برقرار کنید."</string> - <string name="zen_silence_introduction" msgid="3137882381093271568">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدیوها و بازیها را مسدود میکند."</string> + <string name="zen_silence_introduction_voice" msgid="2284540992298200729">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدئوها و بازیها را مسدود میکند. همچنان میتوانید تماس تلفنی برقرار کنید."</string> + <string name="zen_silence_introduction" msgid="3137882381093271568">"این کار «همه» صداها و لرزشها از جمله هشدارها، موسیقی، ویدئوها و بازیها را مسدود میکند."</string> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"اعلانهای کمتر فوری در زیر"</string> <string name="notification_tap_again" msgid="7590196980943943842">"دوباره ضربه بزنید تا باز شود"</string> @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ممکن است دستگاه کنترل شود"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"شاید نمایه کنترل شود"</string> <string name="vpn_footer" msgid="2388611096129106812">"ممکن است شبکه کنترل شود"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ممکن است شبکه کنترل شود"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"کنترل دستگاه"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"کنترل نمایه"</string> <string name="monitoring_title" msgid="169206259253048106">"کنترل شبکه"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"شما به <xliff:g id="APPLICATION">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شما از جمله رایانامه، برنامه و وبسایتها را کنترل کند."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"شما به <xliff:g id="APPLICATION">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شخصی شما از جمله رایانامه، برنامه و وبسایتها را کنترل کند."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"به <xliff:g id="APPLICATION">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شخصی شما را (ازجمله رایانامهها، برنامهها و وبسایتها) کنترل کند."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"نمایه کاریتان توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود. این به <xliff:g id="APPLICATION">%2$s</xliff:g> وصل است که فعالیت شبکه کاریتان از جمله رایانامه، برنامه و وبسایتها را کنترل میکند.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"نمایه کاری شما توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود. این به <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> متصل است که میتواند فعالیت شبکه کاریتان از جمله رایانامه، برنامه و وبسایتها را کنترل کند.\n\nشما همچنین به <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> متصل هستید که میتواند فعالیت شبکه شخصیتان را کنترل کند."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"دستگاهتان توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود.\n\nسرپرستتان میتواند تنظیمات، دسترسی شرکت، برنامهها، دادههای مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به <xliff:g id="APPLICATION">%2$s</xliff:g> وصل هستید که میتواند فعالیت شبکه شما را کنترل کند، از جمله رایانامه، برنامه و وبسایتها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ثانیههای ساعت را در نوار وضعیت نشان میدهد. ممکن است بر ماندگاری باتری تأثیر بگذارد."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ترتیب مجدد در تنظیمات سریع"</string> <string name="show_brightness" msgid="6613930842805942519">"نمایش روشنایی در تنظیمات سریع"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"فعال کردن تقسیم صفحه با اشاره بالا کشیدن"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"اشاره ورود به تقسیم صفحه با بالا کشیدن صفحه از دکمه نمای کلی را فعال میکند"</string> <string name="experimental" msgid="6198182315536726162">"آزمایشی"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"بلوتوث روشن شود؟"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"برای مرتبط کردن صفحهکلید با رایانه لوحی، ابتدا باید بلوتوث را روشن کنید."</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 5ff50be1aa23..cc5ee98c8bb3 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Laitetta voidaan valvoa"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profiilia saatetaan valvoa"</string> <string name="vpn_footer" msgid="2388611096129106812">"Verkkoa saatetaan valvoa"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Verkkoa saatetaan valvoa"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Laitteiden valvonta"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profiilin valvonta"</string> <string name="monitoring_title" msgid="169206259253048106">"Verkon valvonta"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Olet muodostanut yhteyden sovellukseen <xliff:g id="APPLICATION">%1$s</xliff:g>, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Olet muodostanut yhteyden sovellukseen <xliff:g id="APPLICATION">%1$s</xliff:g>, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Olet muodostanut yhteyden sovellukseen <xliff:g id="APPLICATION">%1$s</xliff:g>, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi esimerkiksi seurata avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Työprofiiliasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Se on yhteydessä sovellukseen <xliff:g id="APPLICATION">%2$s</xliff:g>, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nSaat lisätietoja järjestelmänvalvojaltasi."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Työprofiiliasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Se on yhteydessä sovellukseen <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisäksi olet yhteydessä sovellukseen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, joka voi valvoa henkilökohtaista toimintaasi verkossa."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Laitettasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJärjestelmänvalvojasi voi valvoa ja hallinnoida laitteesi asetuksia, yrityskäyttöä, sovelluksia, laitteeseesi liittyviä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä sovellukseen <xliff:g id="APPLICATION">%2$s</xliff:g>, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Näytä sekunnit tilapalkin kellossa. Tämä voi vaikuttaa akun kestoon."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Järjestä pika-asetukset uudelleen"</string> <string name="show_brightness" msgid="6613930842805942519">"Näytä kirkkaus pika-asetuksissa"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Siirry jaetun näytön tilaan pyyhkäisemällä ylöspäin"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Voit siirtyä jaetun näytön tilaan pyyhkäisemällä Viimeisimmät-painikkeesta ylöspäin."</string> <string name="experimental" msgid="6198182315536726162">"Kokeellinen"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Otetaanko Bluetooth käyttöön?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Jotta voit yhdistää näppäimistön tablettiisi, sinun on ensin otettava Bluetooth käyttöön."</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 7d50feef5cd8..09dd85afbad4 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Il est possible que cet appareil soit surveillé."</string> <string name="profile_owned_footer" msgid="8021888108553696069">"le profil peut être contrôlé"</string> <string name="vpn_footer" msgid="2388611096129106812">"Le réseau peut être surveillé"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Le réseau peut être surveillé"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Surveillance d\'appareils"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Contrôle de profil"</string> <string name="monitoring_title" msgid="169206259253048106">"Surveillance réseau"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"RPV"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nVous êtes également connecté à <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Votre appareil est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et ses données de localisation.\n\nVous êtes connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Afficher les secondes sur l\'horloge dans la barre d\'état. Cela peut réduire l\'autonomie de la pile."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Réorganiser les paramètres rapides"</string> <string name="show_brightness" msgid="6613930842805942519">"Afficher la luminosité dans les paramètres rapides"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Activer le geste d\'écran partagé en balayant vers le haut"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activer le geste permettant d\'utiliser l\'écran partagé en balayant l\'écran vers le haut à partir du bouton « Aperçu »"</string> <string name="experimental" msgid="6198182315536726162">"Fonctions expérimentales"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activer Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pour connecter votre clavier à votre tablette, vous devez d\'abord activer la connectivité Bluetooth."</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 447255ba85d2..f516e54e45fb 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Il est possible que cet appareil soit surveillé."</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Le profil peut être contrôlé."</string> <string name="vpn_footer" msgid="2388611096129106812">"Il est possible que le réseau soit surveillé."</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Il est possible que le réseau soit surveillé."</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Contrôle des appareils"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Contrôle du profil"</string> <string name="monitoring_title" msgid="169206259253048106">"Contrôle du réseau"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris votre activité relative aux e-mails, aux applications et aux sites Web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les e-mails, les applications et les sites Web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nPour en savoir plus, contactez votre administrateur."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>. Cette application peut contrôler l\'activité de ce profil sur le réseau, y compris l\'activité relative aux e-mails, aux applications et aux sites Web.\n\nVous êtes également connecté à <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>. Cette application peut surveiller votre activité personnelle sur le réseau."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Votre appareil géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à <xliff:g id="APPLICATION">%2$s</xliff:g> qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Afficher les secondes dans la barre d\'état. Cela risque de réduire l\'autonomie de la batterie."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Réorganiser la fenêtre de configuration rapide"</string> <string name="show_brightness" msgid="6613930842805942519">"Afficher la luminosité dans fenêtre de configuration rapide"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Activer l\'écran partagé en balayant vers le haut"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activer le geste permettant d\'utiliser l\'écran partagé en balayant l\'écran vers le haut à partir du bouton \"Aperçu\""</string> <string name="experimental" msgid="6198182315536726162">"Paramètres expérimentaux"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activer le Bluetooth ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pour connecter un clavier à votre tablette, vous devez avoir activé le Bluetooth."</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 6d0e366332a0..01ddd360f6f5 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"É posible que se supervise o dispositivo"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pódese supervisar"</string> <string name="vpn_footer" msgid="2388611096129106812">"É posible que se supervise a rede"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"É posible que se supervise a rede"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Supervisión de dispositivos"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Supervisión do perfil"</string> <string name="monitoring_title" msgid="169206259253048106">"Supervisión de rede"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"O teu perfil de traballo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"O teu perfil de traballo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nTamén estás conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode supervisar a túa actividade persoal na rede."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"O dispositivo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización do dispositivo.\n\nEstás conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode supervisar a túa actividade na rede: os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co teu administrador."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostra os segundos do reloxo na barra de estado. Pode influír na duración da batería."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar Configuración rápida"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar brillo en Configuración rápida"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Activar pantalla dividida pasando o dedo cara arriba"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activa o xesto de pasar o dedo cara arriba desde o botón Visión xeral para acceder ao modo de pantalla dividida"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Queres activar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teu teclado coa tableta, primeiro tes que activar o Bluetooth."</string> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 0663b41af0dd..a560ab85d9b6 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ઉપકરણ મૉનિટર કરી શકાય છે"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"પ્રોફાઇલ મૉનિટર કરી શકાય છે"</string> <string name="vpn_footer" msgid="2388611096129106812">"નેટવર્ક મૉનિટર કરી શકાય છે"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"નેટવર્ક મૉનિટર કરવામાં આવી શકે છે"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ઉપકરણ નિરીક્ષણ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"પ્રોફાઇલ નિરીક્ષણ"</string> <string name="monitoring_title" msgid="169206259253048106">"નેટવર્ક મૉનિટરિંગ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"તમે <xliff:g id="APPLICATION">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"તમે <xliff:g id="APPLICATION">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"તમે <xliff:g id="APPLICATION">%1$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિત તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે. તે <xliff:g id="APPLICATION">%2$s</xliff:g> સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"તમારી કાર્ય પ્રોફાઇલ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે. તે <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> સાથે કનેક્ટ થયેલ છે, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી કાર્ય નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nતમે <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> સાથે પણ કનેક્ટ થયેલ છો, જે તમારી વ્યક્તિગત નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"તમારું ઉપકરણ <xliff:g id="ORGANIZATION">%1$s</xliff:g> દ્વારા સંચાલિત થાય છે.\n\nતમારા વ્યવસ્થાપક, સેટિંગ્સ, કોર્પોરેટ ઍક્સેસ, ઍપ્લિકેશનો, તમારા ઉપકરણ સાથે સંકળાયેલ ડેટા અને તમારા ઉપકરણની સ્થાન માહિતીને મૉનિટર કરી અને સંચાલિત કરી શકે છે.\n\nતમે <xliff:g id="APPLICATION">%2$s</xliff:g> સાથે કનેક્ટ થયાં છો, જે ઇમેઇલ્સ, ઍપ્લિકેશનો અને વેબસાઇટ્સ સહિતની તમારી નેટવર્ક પ્રવૃત્તિને મૉનિટર કરી શકે છે.\n\nવધુ માહિતી માટે, તમારા વ્યવસ્થાપકનો સંપર્ક કરો."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ઘડિયાળ સેકન્ડ સ્થિતિ બારમાં બતાવો. બૅટરીની આવરદા પર અસર કરી શકે છે."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ઝડપી સેટિંગ્સને ફરીથી ગોઠવો"</string> <string name="show_brightness" msgid="6613930842805942519">"ઝડપી સેટિંગ્સમાં તેજ બતાવો"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"સ્પ્લિટ-સ્ક્રીન સ્વાઇપ-અપ હાવભાવ સક્ષમ કરો"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"વિહંગાવલોકન બટનમાંથી સ્વાઇપ કરીને સ્પ્લિટ-સ્ક્રીનમાં દાખલ થવા માટે હાવભાવ સક્ષમ કરો"</string> <string name="experimental" msgid="6198182315536726162">"પ્રાયોગિક"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth ચાલુ કરવુ છે?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"તમારા ટેબ્લેટ સાથે કીબોર્ડ કનેક્ટ કરવા માટે, તમારે પહેલાં Bluetooth ચાલુ કરવાની જરૂર પડશે."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 292455688081..62ece3c10e47 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"डिवाइस को मॉनीटर किया जा सकता है"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफ़ाइल को मॉनीटर किया जा सकता है"</string> <string name="vpn_footer" msgid="2388611096129106812">"नेटवर्क को मॉनीटर किया जा सकता है"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"नेटवर्क को मॉनिटर किया जा सकता है"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"डिवाइस को मॉनीटर करना"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफ़ाइल को मॉनीटर करना"</string> <string name="monitoring_title" msgid="169206259253048106">"नेटवर्क को मॉनीटर करना"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्लिकेशन और वेबसाइट सहित आपकी व्यक्तिगत नेटवर्क गतिविधि को मॉनिटर कर सकता है."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"आपकी कार्य प्रोफ़ाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है. वह <xliff:g id="APPLICATION">%2$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"आपकी कार्य प्रोफ़ाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है. वह <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> से भी कनेक्ट हैं, जो आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"आपका डिवाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप <xliff:g id="APPLICATION">%2$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"स्थिति बार में घड़ी के सेकंड दिखाएं. इससे बैटरी के जीवनकाल पर प्रभाव पड़ सकता है."</string> <string name="qs_rearrange" msgid="8060918697551068765">"त्वरित सेटिंग को पुन: व्यवस्थित करें"</string> <string name="show_brightness" msgid="6613930842805942519">"त्वरित सेटिंग में स्क्रीन की रोशनी दिखाएं"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"ऊपर स्वाइप करके विभाजित स्क्रीन में जाने का जेस्चर सक्षम करें"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"अवलोकन बटन से ऊपर स्वाइप करके स्क्रीन विभाजन में आने का हावभाव सक्षम करें"</string> <string name="experimental" msgid="6198182315536726162">"प्रयोगात्मक"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ब्लूटूथ चालू करें?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"अपने कीबोर्ड को अपने टैबलेट से कनेक्ट करने के लिए, आपको पहले ब्लूटूथ चालू करना होगा."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 02466d610b9e..bdf8faf51ca7 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Uređaj se možda nadzire"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil se možda nadzire"</string> <string name="vpn_footer" msgid="2388611096129106812">"Mreža se možda nadzire"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Mreža se možda nadzire"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Nadzor uređaja"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadzor profila"</string> <string name="monitoring_title" msgid="169206259253048106">"Nadzor mreže"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Povezani ste s aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Povezani ste s aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g> koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Povezani ste s aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g> koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Vašim poslovnim profilom upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je s aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g> koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Vašim poslovnim profilom upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je s aplikacijom <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i s aplikacijom <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> koja može nadzirati vašu osobnu aktivnost na mreži."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Vašim uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može nadzirati postavke, poslovni pristup, aplikacije, podatke povezane s uređajem i podatke o lokaciji uređaja te upravljati njima.\n\nPovezani ste s aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Prikazuju se sekunde na satu na traci statusa. Može utjecati na trajanje baterije."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Promijeni raspored Brzih postavki"</string> <string name="show_brightness" msgid="6613930842805942519">"Prikaži svjetlinu u Brzim postavkama"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Omogući pokret povlačenja prema gore za podijeljen zaslon"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Omogućivanje pokreta za otvaranje podijeljenog zaslona tako da se od gumba Pregled prstom prijeđe prema gore"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentalno"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želite li uključiti Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Da biste povezali tipkovnicu s tabletom, morate uključiti Bluetooth."</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index b89b1069922b..92d8721256db 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Lehet, hogy az eszközt figyelik"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilját felügyelhetik"</string> <string name="vpn_footer" msgid="2388611096129106812">"Lehet, hogy a hálózatot figyelik"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Lehet, hogy a hálózat felügyelt"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Eszközfigyelés"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilfelügyelet"</string> <string name="monitoring_title" msgid="169206259253048106">"Hálózatfigyelés"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Csatlakoztatta a(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazást, amely figyelheti hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Csatlakoztatta a(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazást, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Ön a(z) <xliff:g id="APPLICATION">%1$s</xliff:g> alkalmazáshoz csatlakozik, amely figyelheti személyes hálózati tevékenységét, beleértve az e-maileket, alkalmazásokat és webhelyeket."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Munkaprofilját a(z) <xliff:g id="ORGANIZATION">%1$s</xliff:g> felügyeli. Csatlakoztatva van hozzá a(z) <xliff:g id="APPLICATION">%2$s</xliff:g> alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nTovábbi információért forduljon a rendszergazdájához."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Munkaprofilját a(z) <xliff:g id="ORGANIZATION">%1$s</xliff:g> felügyeli. Csatlakoztatva van hozzá a(z) <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> alkalmazás, amely figyelheti az Ön hálózati tevékenységét, beleértve az e-maileket, az alkalmazásokat és a webhelyeket.\n\nCsatlakoztatta továbbá a(z) <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> alkalmazást, amely szintén figyelemmel kísérheti személyes hálózati tevékenységét."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Eszközét a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nA rendszergazda figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\nÖn a következőhöz csatlakozik: <xliff:g id="APPLICATION">%2$s</xliff:g>, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához."</string> @@ -481,7 +483,7 @@ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> <string name="accessibility_managed_profile" msgid="6613641363112584120">"Munkaprofil"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Egyeseknek tetszik, másoknak nem"</string> - <string name="tuner_warning" msgid="8730648121973575701">"A Kezelőfelület-hangoló az Android felhasználói felületének szerkesztéséhez és testreszabásához nyújt további megoldásokat. Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban,illetve eltűnhetnek azokból. Körültekintően járjon el."</string> + <string name="tuner_warning" msgid="8730648121973575701">"A Kezelőfelület-hangoló az Android felhasználói felületének szerkesztéséhez és testreszabásához nyújt további megoldásokat. Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban, illetve eltűnhetnek azokból. Körültekintően járjon el."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Ezek a kísérleti funkciók változhatnak vagy megsérülhetnek a későbbi kiadásokban, illetve eltűnhetnek azokból. Körültekintően járjon el."</string> <string name="got_it" msgid="2239653834387972602">"Értem"</string> <string name="tuner_toast" msgid="603429811084428439">"Gratulálunk! A Kezelőfelület-hangolót hozzáadtuk a Beállításokhoz"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Másodpercek megjelenítése az állapotsor óráján. Ez hatással lehet az akkumulátor üzemidejére."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Gyorsbeállítások átrendezése"</string> <string name="show_brightness" msgid="6613930842805942519">"Fényerő megjelenítése a gyorsbeállításokban"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Képernyőfelosztó gyors felfelé csúsztatás engedélyezése"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Kézmozdulat engedélyezése osztott képernyős nézet aktiválásához, ha az Áttekintés gombról felfelé húzza az ujját"</string> <string name="experimental" msgid="6198182315536726162">"Kísérleti"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Engedélyezi a Bluetooth-kapcsolatot?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ha a billentyűzetet csatlakoztatni szeretné táblagépéhez, először engedélyeznie kell a Bluetooth-kapcsolatot."</string> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index d0d6c506f72d..99b5f5267a29 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -32,7 +32,7 @@ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Ծանուցումներ չկան"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Ընթացիկ"</string> <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Ծանուցումներ"</string> - <string name="battery_low_title" msgid="6456385927409742437">"Մարտկոցը լիցքաթափվում է"</string> + <string name="battery_low_title" msgid="6456385927409742437">"Մարտկոցի լիցքը սպառվում է"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"Մնաց <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="battery_low_percent_format_saver_started" msgid="6859235584035338833">"Մնաց <xliff:g id="PERCENTAGE">%s</xliff:g>: Մարտկոցի տնտեսումը միացված է:"</string> <string name="invalid_charger" msgid="4549105996740522523">"USB լիցքավորումը չի աջակցվում:\nՕգտվեք միայն գործող լիցքավորիչից:"</string> @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Սարքը կարող է վերահսկվել"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Պրոֆիլը կարող է վերահսկվել"</string> <string name="vpn_footer" msgid="2388611096129106812">"Ցանցը կարող է վերահսկվել"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Ցանցը կարող է վերահսկվել"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Սարքի մշտադիտարկում"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Պրոֆիլի վերահսկում"</string> <string name="monitoring_title" msgid="169206259253048106">"Ցանցի մշտադիտարկում"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Դուք կապակցված եք <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Դուք կապակցված եք <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Դուք կապակցված եք <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Աշխատանքային պրոֆիլի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>: Այն կապակցված է <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Աշխատանքային պրոֆիլի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>: Այն կապակցված է <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> հավելվածին, որը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԴուք նույնպես կապակցված եք <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> հավելվածին, որը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները:"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Սարքի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև կապակցված եք <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Ցույց տալ ժամացույցի վայրկյանները կարգավիճակի տողում: Կարող է ազդել մարտկոցի աշխատանքի ժամանակի վրա:"</string> <string name="qs_rearrange" msgid="8060918697551068765">"Վերադասավորել Արագ կարգավորումները"</string> <string name="show_brightness" msgid="6613930842805942519">"Ցույց տալ պայծառությունն Արագ կարգավորումներում"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ակտիվացնել մատը վերև սահեցնելով էկրանը տրոհելու ժեստը"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Միացնել Համատեսք կոճակից մատը դեպի վերև սահեցնելու միջոցով տրոհված էկրանի ռեժիմ անցնելու ժեստը"</string> <string name="experimental" msgid="6198182315536726162">"Փորձնական"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Միացնե՞լ Bluetooth-ը:"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ստեղնաշարը ձեր պլանշետին միացնելու համար նախ անհրաժեշտ է միացնել Bluetooth-ը:"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index ad24d6a2954f..4591758480c6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Perangkat mungkin dipantau"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil dapat dipantau"</string> <string name="vpn_footer" msgid="2388611096129106812">"Jaringan mungkin dipantau"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Jaringan mungkin dipantau"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Pemantauan perangkat"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pemantauan profil"</string> <string name="monitoring_title" msgid="169206259253048106">"Pemantauan jaringan"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web.."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g> dan tersambung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g> dan tersambung ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nAnda juga tersambung ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Perangkat dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Tampilkan detik jam di bilah status. Dapat memengaruhi masa pakai baterai."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Atur Ulang Setelan Cepat"</string> <string name="show_brightness" msgid="6613930842805942519">"Tampilkan kecerahan di Setelan Cepat"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktifkan isyarat gesek atas untuk layar terpisah"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktifkan isyarat untuk masuk layar terpisah dengan menggesek tombol Ringkasan ke atas"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Aktifkan Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Untuk menghubungkan keyboard dengan tablet, terlebih dahulu aktifkan Bluetooth."</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index a95e28b2d55e..117652dabf88 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Hugsanlega er fylgst með tækjum"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Hugsanlega er fylgst með þessu sniði"</string> <string name="vpn_footer" msgid="2388611096129106812">"Hugsanlega er fylgst með netinu"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Hugsanlega er fylgst með netinu"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Tækjaeftirlit"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Fylgst með sniði"</string> <string name="monitoring_title" msgid="169206259253048106">"Neteftirlit"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Þú ert með tengingu við <xliff:g id="APPLICATION">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Þú ert með tengingu við <xliff:g id="APPLICATION">%1$s</xliff:g>, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Þú ert með tengingu við <xliff:g id="APPLICATION">%1$s</xliff:g>, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Vinnusniðinu þínu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Það er tengt <xliff:g id="APPLICATION">%2$s</xliff:g>, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Vinnusniðinu þínu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Það er tengt <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nÞú ert einnig með tengingu við <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, sem getur fylgst með persónulegri netnotkun þinni."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Tækinu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við <xliff:g id="APPLICATION">%2$s</xliff:g>, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Sýna sekúndur á klukku í stöðustikunni. Getur haft áhrif á endingu rafhlöðu."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Endurraða flýtistillingum"</string> <string name="show_brightness" msgid="6613930842805942519">"Sýna birtustig í flýtistillingum"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Virkja skjáskiptingu með því að strjúka upp"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Virkja skjáskiptingarbendingu með því að strjúka upp frá yfirlitshnappi"</string> <string name="experimental" msgid="6198182315536726162">"Tilraunastillingar"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Kveikja á Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Til að geta tengt lyklaborðið við spjaldtölvuna þarftu fyrst að kveikja á Bluetooth."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index d370b6588bcb..ed27f8a316cd 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Il dispositivo potrebbe essere monitorato"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Il profilo potrebbe essere monitorato"</string> <string name="vpn_footer" msgid="2388611096129106812">"La rete potrebbe essere monitorata"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"La rete potrebbe essere monitorata"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitoraggio del dispositivo"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoraggio del profilo"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitoraggio rete"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Sei connesso a <xliff:g id="APPLICATION">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Sei connesso a <xliff:g id="APPLICATION">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete personale, inclusi email, app e siti web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Sei collegato a <xliff:g id="APPLICATION">%1$s</xliff:g>, che consente di monitorare la tua attività di rete personale, inclusi siti web, email e app."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Il tuo profilo di lavoro è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>. È connesso a <xliff:g id="APPLICATION">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta il tuo amministratore."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Il tuo profilo di lavoro è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>. È connesso a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nSei connesso anche a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, da cui è possibile monitorare la tua attività di rete personale."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Il tuo dispositivo è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a <xliff:g id="APPLICATION">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostra i secondi nell\'orologio nella barra di stato. Ciò potrebbe ridurre la durata della carica della batteria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Riorganizza Impostazioni rapide"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostra luminosità in Impostazioni rapide"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Attiva Schermo diviso mediante scorrimento verso l\'alto"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Consente di attivare la modalità Schermo diviso scorrendo verso l\'alto dal pulsante Panoramica"</string> <string name="experimental" msgid="6198182315536726162">"Sperimentali"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Attivare il Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Per connettere la tastiera al tablet, devi prima attivare il Bluetooth."</string> diff --git a/packages/SystemUI/res/values-it/strings_car.xml b/packages/SystemUI/res/values-it/strings_car.xml index ae26c9e102bd..19c4e2b02ad0 100644 --- a/packages/SystemUI/res/values-it/strings_car.xml +++ b/packages/SystemUI/res/values-it/strings_car.xml @@ -20,5 +20,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="car_lockscreen_disclaimer_title" msgid="7997539137376896441">"Guida in modo sicuro"</string> - <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È necessario essere sempre pienamente coscienti delle condizioni di guida e rispettare le leggi vigenti. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, non adatte, vietate o implicare l\'attraversamento di confini. Anche le informazioni sulle attività commerciali potrebbero essere imprecise o incomplete. I dati non vengono forniti in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare il dispositivo mobile e non utilizzare app non progettate per Android Auto durante la guida."</string> + <string name="car_lockscreen_disclaimer_text" msgid="3061224684092952864">"È necessario essere sempre pienamente informati sulle condizioni della strada e rispettare la legislazione vigente. Le indicazioni stradali potrebbero essere imprecise, incomplete, pericolose, inadatte, vietate o richiedere l\'attraversamento di aree amministrative. Anche le informazioni sugli esercizi commerciali potrebbero essere imprecise o incomplete. I dati forniti non sono aggiornati in tempo reale e non è possibile garantire la precisione della geolocalizzazione. Non maneggiare dispositivi mobili e app non destinate ad Android Auto durante la guida."</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 4cf48c2c73e6..e82a4794e99a 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -408,6 +408,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ייתכן שהמכשיר נמצא במעקב"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ייתכן שהפרופיל נתון למעקב"</string> <string name="vpn_footer" msgid="2388611096129106812">"ייתכן שהרשת נמצאת במעקב"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ייתכן שהרשת מנוטרת"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"מעקב אחר מכשיר"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"מעקב אחר פרופיל"</string> <string name="monitoring_title" msgid="169206259253048106">"מעקב אחר פעילות ברשת"</string> @@ -420,6 +421,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הוא מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הוא מחובר לאפליקציה <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nאתה מחובר גם לאפליקציה <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"המכשיר שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nמנהל המערכת שלך יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר שלך ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך."</string> @@ -496,8 +498,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"הצג שניות בשעון בשורת הסטטוס. פעולה זו עשויה להשפיע על אורך חיי הסוללה."</string> <string name="qs_rearrange" msgid="8060918697551068765">"סידור מחדש של הגדרות מהירות"</string> <string name="show_brightness" msgid="6613930842805942519">"הצג בהירות בהגדרות מהירות"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"הפעל מסך מפוצל על ידי תנועת החלקה כלפי מעלה"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"הפעל את התנועה לכניסה למסך מפוצל על ידי החלקה כלפי מעלה מלחצן הסקירה"</string> <string name="experimental" msgid="6198182315536726162">"ניסיוניות"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"האם להפעיל את ה-Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"כדי לחבר את המקלדת לטאבלט, תחילה עליך להפעיל את ה-Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index c42e34652ae3..f3f5cd5a2b0e 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"端末が監視されている可能性があります"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"プロファイルが監視されている可能性があります"</string> <string name="vpn_footer" msgid="2388611096129106812">"ネットワークが監視されている可能性があります"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ネットワークが監視されている可能性があります"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"端末の監視"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"プロファイルの監視"</string> <string name="monitoring_title" msgid="169206259253048106">"ネットワーク監視"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g>に接続しています。このアプリはあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g>に接続しています。このアプリはあなたの個人のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"「<xliff:g id="APPLICATION">%1$s</xliff:g>」に接続しています。このアプリはあなたの個人のネットワーク アクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"この仕事用プロファイルは<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理され、<xliff:g id="APPLICATION">%2$s</xliff:g>に接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"この仕事用プロファイルは<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理され、<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>に接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>にも接続しているため、個人のネットワークアクティビティも監視できます。"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"この端末は<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\n<xliff:g id="APPLICATION">%2$s</xliff:g>に接続しているため、このアプリもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。"</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ステータスバーに時計の秒を表示します。電池使用量に影響する可能性があります。"</string> <string name="qs_rearrange" msgid="8060918697551068765">"クイック設定を並べ替え"</string> <string name="show_brightness" msgid="6613930842805942519">"クイック設定に明るさ調整バーを表示する"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"上にスワイプして分割画面に切り替える操作を有効にする"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"[概要] ボタンから上にスワイプして分割画面に切り替える操作を有効にします"</string> <string name="experimental" msgid="6198182315536726162">"試験運用版"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"BluetoothをONにしますか?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"タブレットでキーボードに接続するには、最初にBluetoothをONにする必要があります。"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 6ddcde8ee767..5743bc880442 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"შესაძლოა მოწყობილობის მონიტორინგი არ ხორციელდება"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"შესაძლოა პროფილზე ხორციელდებოდეს მონიტორინგი"</string> <string name="vpn_footer" msgid="2388611096129106812">"შესაძლოა ქსელზე ხორციელდება მონიტორინგი"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ქსელზე შესაძლოა მონიტორინგი ხორციელდებოდეს"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"მოწყობილობის მონიტორინგი"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"პროფილის მონიტორინგი"</string> <string name="monitoring_title" msgid="169206259253048106">"ქსელის მონიტორინგი"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"თქვენ დაუკავშირდით <xliff:g id="APPLICATION">%1$s</xliff:g>-ს, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"თქვენ დაუკავშირდით <xliff:g id="APPLICATION">%1$s</xliff:g>-ს, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"თქვენ დაუკავშირდით <xliff:g id="APPLICATION">%1$s</xliff:g>-ს, რომელსაც თქვენი პირადი ქსელის აქტივობის მონიტორინგი შეუძლია, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"თქვენი სამუშაო პროფილი <xliff:g id="ORGANIZATION">%1$s</xliff:g>-ის მიერ იმართება. ის დაკავშირებულია <xliff:g id="APPLICATION">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისთვის მიმართეთ თქვენს ადმინისტრატორს."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"თქვენი სამუშაო პროფილი <xliff:g id="ORGANIZATION">%1$s</xliff:g>-ის მიერ იმართება. ის დაკავშირებულია <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებსაიტების მონიტორინგი.\n\nასევე, დაკავშირებული ხართ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის მონიტორინგი."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"თქვენს მოწყობილობას მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nადმინისტრატორს შეუძლია თქვენი მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ <xliff:g id="APPLICATION">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"საათის წამების ჩვენება სტატუსის ზოლში. შეიძლება გავლენა იქონიოს ბატარეაზე."</string> <string name="qs_rearrange" msgid="8060918697551068765">"სწრაფი პარამეტრების გადაწყობა"</string> <string name="show_brightness" msgid="6613930842805942519">"სიკაშკაშის ჩვენება სწრაფ პარამეტრებში"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"ზემოთ გადაფურცვლისას ეკრანის გაყოფის ჟესტის ჩართვა"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"მიმოხილვის ღილაკიდან ზემოთ გადაფურცვლისას ეკრანის გაყოფის რეჟიმზე გადასვლის ჟესტის ჩართვა"</string> <string name="experimental" msgid="6198182315536726162">"ექსპერიმენტული"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"გსურთ Bluetooth-ის ჩართვა?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"კლავიატურის ტაბლეტთან დასაკავშირებლად, ჯერ უნდა ჩართოთ Bluetooth."</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 2c444e46f5ed..f4f525a3e346 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Құрылғы бақылануы мүмкін"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профиль бақылануы мүмкін"</string> <string name="vpn_footer" msgid="2388611096129106812">"Желі бақылауда болуы мүмкін"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Желі бақылауда болуы мүмкін"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Құрылғыны бақылау"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профильді бақылау"</string> <string name="monitoring_title" msgid="169206259253048106">"Желіні бақылау"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Сіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасына қосылғансыз."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Сіз жеке желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасына қосылғансыз."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Жеке желідегі әрекеттеріңізді, соның ішінде электрондық пошта хабарларын, қолданбаларды және вебсайттарды бақылай алатын <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасына қосылғансыз."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Жұмыс профиліңізді <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады. Ол жұмыс кезінде желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Жұмыс профиліңізді <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады. Ол желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> қолданбасына қосылған.\n\nСондай-ақ сіз желідегі жеке белсенділігіңізді бақылай алатын <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> қолданбасына қосылғансыз."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Құрылғыңызды <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және евб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасына қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Күйін көрсету жолағында сағат секундтарын көрсету. Батареяның қызмет көрсету мерзіміне әсер етуі мүмкін."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Жылдам параметрлерді қайта реттеу"</string> <string name="show_brightness" msgid="6613930842805942519">"Жылдам параметрлерде жарықтықты көрсету"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Бөлінген экранда жоғары қарай сырғыту қимылын қосу"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"\"Шолу\" түймесінен жоғары қарай жанау арқылы бөлінген экранға кіру қимылын қосу"</string> <string name="experimental" msgid="6198182315536726162">"Эксперименттік"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth функциясын қосу керек пе?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Пернетақтаны планшетке қосу үшін алдымен Bluetooth функциясын қосу керек."</string> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 0db7abc73b64..0e58b1208948 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ឧបករណ៍អាចត្រូវបានត្រួតពិនិត្យ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ប្រវត្តិរូបអាចត្រូវបានតាមដាន"</string> <string name="vpn_footer" msgid="2388611096129106812">"បណ្ដាញអាចត្រូវបានត្រួតពិនិត្យ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"បណ្ដាញអាចត្រូវបានត្រួតពិនិត្យ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ការត្រួតពិនិត្យឧបករណ៍"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"តាមដានប្រវត្ថិរូប"</string> <string name="monitoring_title" msgid="169206259253048106">"ការត្រួតពិនិត្យបណ្ដាញ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"អ្នកត្រូវបានតភ្ជាប់ទៅ <xliff:g id="APPLICATION">%1$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"អ្នកត្រូវបានតភ្ជាប់ទៅ <xliff:g id="APPLICATION">%1$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"អ្នកត្រូវបានភ្ជាប់ទៅ <xliff:g id="APPLICATION">%1$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>។ វាត្រូវបានតភ្ជាប់ទៅនឹង <xliff:g id="APPLICATION">%2$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រប់របស់អ្នក។"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ប្រវត្តិរូបការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>។ វាត្រូវបានតភ្ជាប់ទៅនឹង <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nអ្នកក៏ត្រូវបានតភ្ជាប់ផងដែរទៅនឹង <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញផ្ទាល់ខ្លួនរបស់អ្នក។"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ <xliff:g id="APPLICATION">%2$s</xliff:g> ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"បង្ហាញវិនាទីនៅលើរបារស្ថានភាពអាចនឹងប៉ះពាល់ដល់ថាមពលថ្ម។"</string> <string name="qs_rearrange" msgid="8060918697551068765">"រៀបចំការកំណត់រហ័សឡើងវិញ"</string> <string name="show_brightness" msgid="6613930842805942519">"បង្ហាញកម្រិតពន្លឺនៅក្នុងការកំណត់រហ័ស"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"បើកដំណើរការកាយវិការអូសទៅលើដើម្បីបំបែកអេក្រង់"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"បើកដំណើរការកាយវិការដើម្បីបំបែកអេក្រង់ដោយអូសទៅលើចាប់ពីប៊ូតុងទិដ្ឋភាព"</string> <string name="experimental" msgid="6198182315536726162">"ពិសោធន៍"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"បើកប៊្លូធូសឬ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ដើម្បីភ្ជាប់ក្តារចុចរបស់អ្នកជាមួយនឹងថេប្លេតរបស់អ្នក អ្នកត្រូវតែបើកប៊្លូធូសជាមុនសិន។"</string> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index c62a8db9cb45..ea2990086dab 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ಸಾಧನವನ್ನು ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ಪ್ರೊಫೈಲ್ ಅನ್ನು ಪರಿವೀಕ್ಷಿಸಬಹುದಾಗಿದೆ"</string> <string name="vpn_footer" msgid="2388611096129106812">"ನೆಟ್ವರ್ಕ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ನೆಟ್ವರ್ಕ್ ಅನ್ನು ವೀಕ್ಷಿಸಬಹುದಾಗಿರುತ್ತದೆ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ಸಾಧನ ಪರಿವೀಕ್ಷಣೆ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ಪ್ರೊಫೈಲ್ ಮೇಲ್ವಿಚಾರಣೆ"</string> <string name="monitoring_title" msgid="169206259253048106">"ನೆಟ್ವರ್ಕ್ ಪರಿವೀಕ್ಷಣೆ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"ನೀವು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"ನೀವು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ನೀವು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ.\n\nನೀವು ಕೂಡಾ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಗಡಿಯಾರ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು. ಇದಕ್ಕೆ ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯು ಪರಿಣಾಮಬೀರಬಹುದು."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಮರುಹೊಂದಿಸಿ"</string> <string name="show_brightness" msgid="6613930842805942519">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಪ್ರಖರತೆಯನ್ನು ತೋರಿಸಿ"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"ಸ್ಪ್ಲಿಟ್-ಸ್ಕ್ರೀನ್ ಸ್ವೈಪ್-ಅಪ್ ಗೆಶ್ಚರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ಸಮಗ್ರ ನೋಟದ ಬಟನ್ನಿಂದ ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ ಸ್ಪ್ಲಿಟ್-ಸ್ಕ್ರೀನ್ ನಮೂದಿಸಲು ಗೆಸ್ಚರ್ ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="experimental" msgid="6198182315536726162">"ಪ್ರಾಯೋಗಿಕ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡುವುದೇ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಅನ್ನು ಟ್ಯಾಬ್ಲೆಟ್ಗೆ ಸಂಪರ್ಕಿಸಲು, ನೀವು ಮೊದಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ."</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 3c08e923c7ff..04e1132bccf3 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"기기가 모니터링될 수 있음"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"프로필이 모니터링될 수 있음"</string> <string name="vpn_footer" msgid="2388611096129106812">"네트워크가 모니터링될 수 있음"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"네트워크가 모니터링될 수 있음"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"기기 모니터링"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"프로필 모니터링"</string> <string name="monitoring_title" msgid="169206259253048106">"네트워크 모니터링"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 개인 네트워크 활동을 모니터링할 수 있습니다."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"직장 프로필은 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다. 이는 <xliff:g id="APPLICATION">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"직장 프로필은 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다. 이는 <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n또한 <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>에 연결되어 있으며, 여기에서 내 개인 네트워크 활동을 모니터링할 수 있습니다."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 기기를 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 연결된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"상태 표시줄에 시계 초 단위를 표시합니다. 배터리 수명에 영향을 줄 수도 있습니다."</string> <string name="qs_rearrange" msgid="8060918697551068765">"빠른 설정 재정렬"</string> <string name="show_brightness" msgid="6613930842805942519">"빠른 설정에서 밝기 표시"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"화면 분할 위로 스와이프 동작 사용"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"최근 사용 버튼에서 위로 스와이프하기 동작으로 창 분할 모드를 사용 설정합니다."</string> <string name="experimental" msgid="6198182315536726162">"베타"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"블루투스를 켜시겠습니까?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"키보드를 태블릿에 연결하려면 먼저 블루투스를 켜야 합니다."</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index 7645b93795af..3f66b87e68db 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Түзмөктү көзөмөлдөсө болот"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профилди көзөмөлдөсө болот"</string> <string name="vpn_footer" msgid="2388611096129106812">"Тармак көзөмөлдөнүшү мүмкүн"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Тармак тинтилиши мүмкүн"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Түзмөккө көз салуу"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профилди көзөмөлдөө"</string> <string name="monitoring_title" msgid="169206259253048106">"Тармакка көз салуу"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттерди көзөмөлдөй турган <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди көзөмөлдөй турган <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди тескей турган <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Жумуш профилиңизди <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган <xliff:g id="APPLICATION">%2$s</xliff:g> менен туташкан.\n\nКөбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Жумуш профилиңизди <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди көзөмөлдөй турган <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> менен туташкан.\n\nМындан тышкары, тармактагы жеке аракеттериңизди көзөмөлдөгөн <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> колдонмосуна туташып турасыз."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Түзмөгүңүздү <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат.\nАдминистраторуңуз түзмөгүңүздөгү жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, дайындарды, ошону менен катар жайгашкан жер дайындарын башкарып, тийиштүү маалыматты карай алат.\n\nСиз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тармактагы аракетиңизди тескей турган APPLICATION колдонмосуна туташып турасыз.\n<xliff:g id="APPLICATION">%2$s</xliff:g>Көбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\n"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Абал тилкесинен сааттын секунддары көрсөтүлсүн. Батареянын кубаты көбүрөөк сарпталышы мүмкүн."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Ыкчам жөндөөлөрдү кайра коюу"</string> <string name="show_brightness" msgid="6613930842805942519">"Ыкчам жөндөөлөрдөн жарык деңгээлин көрсөтүү"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Өйдө серпип экранды бөлүү жаңсоосун иштетүү"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Сереп баскычынан өйдө серпип, экранды бөлүү режимин киргизүү үчүн жаңсоону иштетиңиз"</string> <string name="experimental" msgid="6198182315536726162">"Сынамык"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth күйгүзүлсүнбү?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Баскычтобуңузду планшетиңизге туташтыруу үчүн, адегенде Bluetooth\'ту күйгүзүшүңүз керек."</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 6b1fca8d493b..54855af824ac 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ອຸປະກອນອາດມີການເຝົ້າຕິດຕາມ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ໂປຣໄຟລ໌ອາດຖືກເຝົ້າຕິດຕາມຢູ່"</string> <string name="vpn_footer" msgid="2388611096129106812">"ເຄືອຂ່າຍອາດມີການເຝົ້າຕິດຕາມ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ການນຳໃຊ້ເຄືອຂ່າຍອາດມີການກວດສອບຕິດຕາມ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ການກວດສອບຕິດຕາມອຸປະກອນ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ການຕິດຕາມໂປຣໄຟລ໌"</string> <string name="monitoring_title" msgid="169206259253048106">"ການກວດສອບຕິດຕາມເຄືອຂ່າຍ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%1$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%1$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%1$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ ຮວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊໄດ້."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຄວບຄຸມໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ມັນຖືກເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%2$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ໃຫ້ຕິດຕໍ່ຜູ້ບໍລິຫານຂອງທ່ານ."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຂອງທ່ານຖືກຈັດການໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ມັນເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍບ່ອນເຮັດວຽກຂອງທ່ານ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\n\nທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ອຸປະກອນຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nຜູ້ຄວບຄຸມຂອງທ່ານສາມາດຕິດຕາມກວດກາ ແລະການຄຸ້ມຄອງການຕັ້ງຄ່າ, ແອັບການເຂົ້າຫາບໍລິສັດ, ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບອຸປະກອນຂອງທ່ານ, ແລະຂໍ້ມູນທີ່ຕັ້ງຂອງອຸປະກອນຂອງທ່ານ.\n\nທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%2$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ລວມທັງອີເມວ, ແອັບ, ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ສະແດງວິນາທີໂມງຢູ່ໃນແຖບສະຖານະ. ອາດຈະມີຜົນກະທົບຕໍ່ອາຍຸແບັດເຕີຣີ."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ຈັດວາງການຕັ້ງຄ່າດ່ວນຄືນໃໝ່"</string> <string name="show_brightness" msgid="6613930842805942519">"ສະແດງຄວາມແຈ້ງຢູ່ໃນການຕັ້ງຄ່າດ່ວນ"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"ເປີດໃຊ້ທ່າທາງການປັດຂຶ້ນເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ເປີດໃຊ້ທ່າທາງເພື່ອເຂົ້າສູ່ໜ້າຈໍແບບແຍກກັນ ໂດຍການປັດຂຶ້ນຈາກປຸ່ມພາບຮວມ"</string> <string name="experimental" msgid="6198182315536726162">"ຍັງຢູ່ໃນການທົດລອງ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ເປີດໃຊ້ Bluetooth ບໍ່?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ເພື່ອເຊື່ອມຕໍ່ແປ້ນພິມຂອງທ່ານກັບແທັບເລັດຂອງທ່ານ, ກ່ອນອື່ນໝົດທ່ານຕ້ອງເປີດ Bluetooth."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 46e50fbc3461..a76a6c5a5fbd 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -408,6 +408,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Įrenginys gali būti stebimas"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilis gali būti stebimas"</string> <string name="vpn_footer" msgid="2388611096129106812">"Tinklas gali būti stebimas"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Tinklas gali būti stebimas"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Įrenginio stebėjimas"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilio stebėjimas"</string> <string name="monitoring_title" msgid="169206259253048106">"Tinklo stebėjimas"</string> @@ -420,6 +421,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Esate prisijungę prie programos „<xliff:g id="APPLICATION">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Esate prisijungę prie programos „<xliff:g id="APPLICATION">%1$s</xliff:g>“, kuri gali stebėti asmeninio profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Esate prisijungę prie programos „<xliff:g id="APPLICATION">%1$s</xliff:g>“, kuri gali stebėti asmeninio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Darbo profilį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“. Jis susietas su programa „<xliff:g id="APPLICATION">%2$s</xliff:g>“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Darbo profilį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“. Jis susietas su programa „<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>“, kuri gali stebėti darbo profilio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nTaip pat esate prisijungę prie programos „<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>“, kuri gali stebėti asmeninio profilio tinklo veiklą."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jūsų įrenginį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie programos „<xliff:g id="APPLICATION">%2$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string> @@ -496,8 +498,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Rodyti laikrodžio sekundes būsenos juostoje. Tai gali paveikti akumuliatoriaus naudojimo laiką."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Pertvarkyti sparčiuosius nustatymus"</string> <string name="show_brightness" msgid="6613930842805942519">"Rodyti skaistį sparčiuosiuose nustatymuose"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Įgalinti ekrano skaidymo perbraukimo aukštyn gestą"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Įgalinti gestą, kuriuo galima įjungti skaidytą ekraną, perbraukiant aukštyn nuo apžvalgos mygtuko"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentinė versija"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Įjungti „Bluetooth“?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Kad galėtumėte prijungti klaviatūrą prie planšetinio kompiuterio, pirmiausia turite įjungti „Bluetooth“."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 9efad2e94127..6f430b76f6b3 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Ierīci var pārraudzīt"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilu var pārraudzīt"</string> <string name="vpn_footer" msgid="2388611096129106812">"Iespējams, tīklā veiktās darbības tiek pārraudzītas."</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Var tikt pārraudzītas tīklā veiktās darbības."</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Ierīces pārraudzība"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profila pārraudzība"</string> <string name="monitoring_title" msgid="169206259253048106">"Tīkla pārraudzība"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Ir izveidots savienojums ar lietotni <xliff:g id="APPLICATION">%1$s</xliff:g>, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Ir izveidots savienojums ar lietotni <xliff:g id="APPLICATION">%1$s</xliff:g>, kura var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Ir izveidots savienojums ar lietotni <xliff:g id="APPLICATION">%1$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Jūsu darba profilu pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Tas ir saistīts ar lietojumprogrammu <xliff:g id="APPLICATION">%2$s</xliff:g>, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Jūsu darba profilu pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Tas ir saistīts ar lietojumprogrammu <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, kura var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nIr piesaistīta arī lietojumprogramma <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās privātās darbības."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jūsu ierīci pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIr piesaistīta lietojumprogramma <xliff:g id="APPLICATION">%2$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Statusa joslā rādīt pulksteņa sekundes. Var ietekmēt akumulatora darbības laiku."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Pārkārtot ātros iestatījumus"</string> <string name="show_brightness" msgid="6613930842805942519">"Rādīt spilgtumu ātrajos iestatījumos"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Iespējot vilkšanu augšup, lai sadalītu ekrānu"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Iespējot žestu ekrāna sadalīšanai, velkot augšup no pogas Pārskats"</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentāli"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vai ieslēgt Bluetooth savienojumu?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Lai pievienotu tastatūru planšetdatoram, vispirms ir jāieslēdz Bluetooth savienojums."</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index 549543db03a7..68a8fc182811 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Уредот може да се следи"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профилот можеби се следи"</string> <string name="vpn_footer" msgid="2388611096129106812">"Мрежата може да се следи"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Мрежата може да се следи"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Следење на уредот"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Следење профил"</string> <string name="monitoring_title" msgid="169206259253048106">"Следење на мрежата"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"ВПН"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Поврзани сте на <xliff:g id="APPLICATION">%1$s</xliff:g>, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Поврзани сте на <xliff:g id="APPLICATION">%1$s</xliff:g>, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Поврзани сте на <xliff:g id="APPLICATION">%1$s</xliff:g>, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот работен профил. Истиот е поврзан на <xliff:g id="APPLICATION">%2$s</xliff:g>, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот работен профил. Истиот е поврзан на <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nВие исто така сте поврзани на <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, којашто може да ја следи вашата лична активност на мрежата."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот уред.\n\nВашиот администратор може да ги следи и да управува со параметрите, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nПоврзани сте на <xliff:g id="APPLICATION">%2$s</xliff:g>, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Прикажи ги секундите на часовникот на статусната лента. Може да влијае на траењето на батеријата."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Преуредете ги Брзи поставки"</string> <string name="show_brightness" msgid="6613930842805942519">"Прикажете ја осветленоста во Брзи поставки"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Овозможи го гестот повлекување нагоре за поделен екран"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Овозможете гест за отворање поделен екран со повлекување нагоре од копчето Краток преглед"</string> <string name="experimental" msgid="6198182315536726162">"Експериментално"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Да се вклучи Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"За да ја поврзете тастатурата со таблетот, најпрво треба да вклучите Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index 9f596b8175bb..ecb664e31877 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ഉപകരണം നിരീക്ഷിക്കപ്പെടാം"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"പ്രൊഫൈൽ നിരീക്ഷിക്കപ്പെടാം"</string> <string name="vpn_footer" msgid="2388611096129106812">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കപ്പെടാം"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ഉപകരണം നിരീക്ഷിക്കൽ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"പ്രൊഫൈൽ നിരീക്ഷിക്കൽ"</string> <string name="monitoring_title" msgid="169206259253048106">"നെറ്റ്വർക്ക് നിരീക്ഷിക്കൽ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"നിങ്ങൾ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"നിങ്ങൾ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"നിങ്ങൾ <xliff:g id="APPLICATION">%1$s</xliff:g> ആപ്പിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്വർക്ക് ആക്റ്റിവിറ്റി നിരീക്ഷിക്കാൻ ഈ ആപ്പിന് കഴിയും."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്. നിങ്ങൾ <xliff:g id="APPLICATION">%2$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്. നിങ്ങൾ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, ആപ്സ്, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nനിങ്ങൾ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> എന്നതിലേക്കും കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്.\n\nനിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു <xliff:g id="APPLICATION">%2$s</xliff:g> എന്നതിലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"സ്റ്റാറ്റസ് ബാറിൽ ക്ലോക്ക് സെക്കൻഡ് കാണിക്കുന്നത് ബാറ്ററിയുടെ ലൈഫിനെ ബാധിക്കാം."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ദ്രുത ക്രമീകരണം പുനഃസജ്ജീകരിക്കുക"</string> <string name="show_brightness" msgid="6613930842805942519">"ദ്രുത ക്രമീകരണത്തിൽ തെളിച്ചം കാണിക്കുക"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"സ്പ്ലിറ്റ്-സ്ക്രീൻ സ്വൈപ്പ്-അപ്പ് ജെസ്റ്റർ പ്രവർത്തനക്ഷമമാക്കുക"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ചുരുക്കവിവരണ ബട്ടണിൽ നിന്ന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്തുകൊണ്ട് സ്പ്ലിറ്റ്-സ്ക്രീനിലേക്ക് പ്രവേശിക്കാൻ ജെസ്റ്റർ പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="experimental" msgid="6198182315536726162">"പരീക്ഷണാത്മകം!"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth ഓണാക്കണോ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"നിങ്ങളുടെ ടാബ്ലെറ്റുമായി കീബോർഡ് കണക്റ്റുചെയ്യുന്നതിന്, ആദ്യം Bluetooth ഓണാക്കേണ്ടതുണ്ട്."</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index f3a2f0827f59..f55d6ed891d9 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -402,6 +402,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Төхөөрөмжийг хянах боломжтой"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профайлыг хянаж байж болзошгүй"</string> <string name="vpn_footer" msgid="2388611096129106812">"Сүлжээ хянагдаж байж болзошгүй"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Сүлжээг хянаж байж болзошгүй"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Төхөөрөмжийн хяналт"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Профайл хяналт"</string> <string name="monitoring_title" msgid="169206259253048106">"Сүлжээний хяналт"</string> @@ -414,6 +415,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Та имэйл, апп, вэб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон байна."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь <xliff:g id="APPLICATION">%2$s</xliff:g>-тэй холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-тай холбогдсон бөгөөд таны имэйл, апп, вебсайт зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой.\n\nМөн та <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны сүлжээний хувийн үйл ажиллагааг хянаж чадна."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Таны төхөөрөмжийг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг.\n\n Танай админ төхөөрөмж, төхөөрөмжийн байршилтай холбоотой өгөгдлийг холбох, тохиргоог өөрчлөх болон хяналт тавих боломжтой.\n\nТа <xliff:g id="APPLICATION">%2$s</xliff:g>-тай холбогдсон бөгөөд ингэснээр таны имэйл,апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Статус талбарт цагийн секундыг харуулах. Энэ нь тэжээлийн цэнэгт нөлөөлж болно."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Түргэн тохиргоог дахин засварлах"</string> <string name="show_brightness" msgid="6613930842805942519">"Түргэн тохиргоонд гэрэлтүүлэг харах"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Дэлгэц хуваах дээш шудрах дохиог идэвхжүүлэх"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Тойм товчлуурыг дээш шударч, хуваагдсан дэлгэцэд зангаагаар орох тохиргоог идэвхжүүлэх"</string> <string name="experimental" msgid="6198182315536726162">"Туршилтын"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth-г асаах уу?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Компьютерийн гараа таблетад холбохын тулд эхлээд Bluetooth-г асаана уу."</string> @@ -505,14 +505,14 @@ <string name="tuner_full_importance_settings" msgid="3207312268609236827">"Тэжээлийн мэдэгдлийн удирдлага"</string> <string name="tuner_full_importance_settings_on" msgid="7545060756610299966">"Идэвхтэй"</string> <string name="tuner_full_importance_settings_off" msgid="8208165412614935229">"Идэвхгүй"</string> - <string name="power_notification_controls_description" msgid="4372459941671353358">"Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын төвшин тогтоох боломжтой. \n\n"<b>"5-р төвшин"</b>" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"4-р төвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"3-р төвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n"<b>"2-р төвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n"<b>"1-р төвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n"<b>"0-р төвшин"</b>" \n- Энэ апп-н бүх мэдэгдлийг блоклоно"</string> + <string name="power_notification_controls_description" msgid="4372459941671353358">"Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын түвшин тогтоох боломжтой. \n\n"<b>"5-р түвшин"</b>" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"4-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"3-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n"<b>"2-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n"<b>"1-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n"<b>"0-р түвшин"</b>" \n- Энэ апп-н бүх мэдэгдлийг блоклоно"</string> <string name="user_unspecified_importance" msgid="361613856933432117">"Ач холбогдол: Автомат"</string> - <string name="blocked_importance" msgid="5035073235408414397">"Ач холбогдол: 0-р төвшин"</string> - <string name="min_importance" msgid="560779348928574878">"Ач холбогдол: 1-р төвшин"</string> - <string name="low_importance" msgid="7571498511534140">"Ач холбогдол: 2-р төвшин"</string> - <string name="default_importance" msgid="7609889614553354702">"Ач холбогдол: 3-р төвшин"</string> - <string name="high_importance" msgid="3441537905162782568">"Ач холбогдол: 4-р төвшин"</string> - <string name="max_importance" msgid="4880179829869865275">"Ач холбогдол: 5-р төвшин"</string> + <string name="blocked_importance" msgid="5035073235408414397">"Ач холбогдол: 0-р түвшин"</string> + <string name="min_importance" msgid="560779348928574878">"Ач холбогдол: 1-р түвшин"</string> + <string name="low_importance" msgid="7571498511534140">"Ач холбогдол: 2-р түвшин"</string> + <string name="default_importance" msgid="7609889614553354702">"Ач холбогдол: 3-р түвшин"</string> + <string name="high_importance" msgid="3441537905162782568">"Ач холбогдол: 4-р түвшин"</string> + <string name="max_importance" msgid="4880179829869865275">"Ач холбогдол: 5-р түвшин"</string> <string name="notification_importance_user_unspecified" msgid="2868359605125272874">"Апп нь мэдэгдэл бүрийн ач холбогдлыг тодорхойлдог."</string> <string name="notification_importance_blocked" msgid="4237497046867398057">"Энэ апп-н мэдэгдлийг хэзээ ч бүү харуул."</string> <string name="notification_importance_min" msgid="7844224511187027155">"Бүтэн дэлгэцэд саадгүй, гарч ирэхгүй, дуугүй, чичиргээгүй. Түгжигдсэн дэлгэц, статусын хэсгээс нуух."</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index e5c641039df3..8cf182bfafb5 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"डिव्हाइसचे परीक्षण केले जाऊ शकते"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफाईलचे परीक्षण केले जाऊ शकते"</string> <string name="vpn_footer" msgid="2388611096129106812">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"नेटवर्कचे परीक्षण केले जाऊ शकते"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"डिव्हाइस परीक्षण"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफाईल परीक्षण"</string> <string name="monitoring_title" msgid="169206259253048106">"नेटवर्क परीक्षण"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"आपण <xliff:g id="APPLICATION">%1$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"आपण <xliff:g id="APPLICATION">%1$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"आपण <xliff:g id="APPLICATION">%1$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"आपले कार्य प्रोफाईल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे. ते <xliff:g id="APPLICATION">%2$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"आपले कार्य प्रोफाईल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे. ते <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nआपण <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> शी देखील कनेक्ट केले आहे, जे आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकते."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"आपले डिव्हाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबद्ध सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो आणि व्यवस्थापित करू शकतो.\n\nआपण <xliff:g id="APPLICATION">%2$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"स्टेटस बारमध्ये घड्याळ सेकंद दर्शवा. कदाचित बॅटरी आयुष्य प्रभावित होऊ शकते."</string> <string name="qs_rearrange" msgid="8060918697551068765">"द्रुत सेटिंग्जची पुनर्रचना करा"</string> <string name="show_brightness" msgid="6613930842805942519">"द्रुत सेटिंग्जमध्ये चमक दर्शवा"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"विभाजित-स्क्रीन स्वाइप-अप जेश्चर सक्षम करा"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"विहंगावलोकन बटणावरून वर स्वाइप करून विभाजित-स्क्रीन प्रविष्ट करण्यासाठी जेश्चर सक्षम करा"</string> <string name="experimental" msgid="6198182315536726162">"प्रायोगिक"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ब्लूटुथ सुरू करायचे?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"आपला कीबोर्ड आपल्या टॅब्लेटसह कनेक्ट करण्यासाठी, आपल्याला प्रथम ब्लूटुथ चालू करणे आवश्यक आहे."</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index 7c543a6daab0..c4b90608b152 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Peranti mungkin dipantau"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil mungkin dipantau"</string> <string name="vpn_footer" msgid="2388611096129106812">"Rangkaian mungkin dipantau"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Rangkaian mungkin dipantau"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Pemantauan peranti"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pemantauan profil"</string> <string name="monitoring_title" msgid="169206259253048106">"Pemantauan rangkaian"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Anda disambungkan ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Anda disambungkan ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Anda disambungkan ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profil kerja anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil ini disambungkan ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profil kerja anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil disambungkan ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nAnda turut disambungkan ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang boleh memantau aktiviti rangkaian peribadi anda."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Peranti anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Tunjukkan saat jam dalam bar status. Mungkin menjejaskan hayat bateri."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Susun Semula Tetapan Pantas"</string> <string name="show_brightness" msgid="6613930842805942519">"Tunjukkan kecerahan dalam Tetapan Pantas"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Dayakan gerak isyarat leret ke atas utk masuk skrin terpisah"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Dayakan gerak isyarat untuk memasuki skrin terpisah dengan meleret ke atas daripada butang Ikhtisar"</string> <string name="experimental" msgid="6198182315536726162">"Percubaan"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Hidupkan Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Untuk menyambungkan papan kekunci anda dengan tablet, anda perlu menghidupkan Bluetooth terlebih dahulu."</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 56a72494d235..62b7ad6f290a 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ကိရိယာကို စောင့်ကြပ် နိုင်ပါသည်"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ပရိုဖိုင်ကို စောင့်ကြပ်နိုင်သည်"</string> <string name="vpn_footer" msgid="2388611096129106812">"ကွန်ရက်ကို ကို စောင့်ကြပ် နိုင်ပါသည်"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ကွန်ရက်ကို စောင့်ကြည့်စစ်ဆေးမှု ရှိနိုင်ပါသည်"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ကိရိယာကို စောင့်ကြပ်ခြင်း"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ပရိုဖိုင် စောင့်ကြပ်မှု"</string> <string name="monitoring_title" msgid="169206259253048106">"ကွန်ရက်ကို စောင့်ကြပ်ခြင်း"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"သင်သည် <xliff:g id="APPLICATION">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးများ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"သင်သည် <xliff:g id="APPLICATION">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်။ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"သင်သည် အီးမေးလ်၊ အက်ပ်နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကိုယ်ရေးကိုယ်တာ ကွန်ရက်အသုံးပြုမှုကို စောင့်ကြည့်နိုင်သည့် <xliff:g id="APPLICATION">%1$s</xliff:g> သို့ ချိတ်ဆက်ထားပါသည်။"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"သင့်အလုပ်ပရိုဖိုင်ကို <xliff:g id="ORGANIZATION">%1$s</xliff:g> မှစီမံခန့်ခွဲသည်။ ၎င်းကို <xliff:g id="APPLICATION">%2$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"သင့်အလုပ် ပရိုဖိုင်ကို <xliff:g id="ORGANIZATION">%1$s</xliff:g> မှစီမံခန့်ခွဲသည်။ ၎င်းကို <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> သို့ ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များနှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်အလုပ်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\n သင်သည်<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ကိုလည်း ချိတ်ဆက်ထားသည်၊ ၎င်းသည် သင့်ကိုယ်ပိုင်ကွန်ရက်လုပ်ဆောင်ချက်များကို စောင့်ကြည့်နိုင်သည်။"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"သင့်စက်ကိရိယာကို <xliff:g id="ORGANIZATION">%1$s</xliff:g> မှစီမံခန့်ခွဲပါသည်။ \n\n စီမံခန့်ခွဲသူသည် ကြိုတင်ပြင်ဆင်မှုများ၊ စုပေါင်းဝင်ရောက်ခွင့်၊ အက်ပ်များ၊ သင့်ကိရိယာနှင့်သက်ဆိုင်သော ဒေတာနှင့် သင့်ကိရိယာ၏ တည်နေရာအချက်အလက်များကို စောင့်ကြည့်ပြီး စီမံခန့်ခွဲနိုင်သည်။ \n\nသင်သည် <xliff:g id="APPLICATION">%2$s</xliff:g> သို့ချိတ်ဆက်ထားသည်၊ ၎င်းသည် အီးမေးလ်များ၊ အက်ပ်များ၊ နှင့် ဝဘ်ဆိုက်များအပါအဝင် သင့်ကွန်ရက်လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။ \n\nအချက်အလက်များ ပိုမိုရယူရန် သင်၏ စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ။"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"အခြေအနေပြနေရာမှာ နာရီ စက္ကန့်များကို ပြပါ။ ဘက်ထရီ သက်တမ်းကို အကျိုးသက်ရောက်နိုင်တယ်။"</string> <string name="qs_rearrange" msgid="8060918697551068765">"အမြန် ဆက်တင်များကို ပြန်စီစဉ်ရန်"</string> <string name="show_brightness" msgid="6613930842805942519">"အမြန် ဆက်တင်များထဲက တောက်ပမှုကို ပြရန်"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"မျက်နှာပြင်ခွဲကြည့်ရန် အပေါ်သို့ပွတ်ဆွဲခြင်း အမူအရာကိုဖွင့်ပါ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ခြုံကြည့်သည့်ခလုတ်မှ အပေါ်သို့ပွတ်ဆွဲခြင်းဖြင့် မျက်နှာပြင်ခွဲကြည့်ရန် လက်ဟန်ကိုဖွင့်ပါ"</string> <string name="experimental" msgid="6198182315536726162">"စမ်းသပ်ရေး"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ဘလူးတုသ် ဖွင့်ရမလား။"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ကီးဘုတ်ကို တပ်ဘလက်နှင့် ချိတ်ဆက်ရန်၊ ပမထဦးစွာ ဘလူးတုသ်ကို ဖွင့်ပါ။"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 3efdd3e13254..6406a142e0ac 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Enheten kan være overvåket"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilen kan overvåkes"</string> <string name="vpn_footer" msgid="2388611096129106812">"Nettverket kan være overvåket"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Nettverket kan bli overvåket"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Enhetsovervåking"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilovervåking"</string> <string name="monitoring_title" msgid="169206259253048106">"Nettverksovervåking"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Enheten er koblet til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Enheten er koblet til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Enheten er koblet til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Work-profilen din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er koblet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nFor å få mer informasjon, ta kontakt med administratoren."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Work-profilen din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er koblet til <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nDu er også koblet til <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan overvåke den personlige nettverksaktiviteten din."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Enheten din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Vis sekunder i statusfeltet på klokken. Det kan påvirke batteritiden."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Omorganiser hurtiginnstillingene"</string> <string name="show_brightness" msgid="6613930842805942519">"Vis lysstyrke i hurtiginnstillingene"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Slå på delt skjerm ved å sveipe opp"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Slå på bevegelsen for å åpne delt skjerm ved å sveipe opp fra Oversikt-knappen"</string> <string name="experimental" msgid="6198182315536726162">"På forsøksstadiet"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vil du slå på Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"For å koble tastaturet til nettbrettet ditt må du først slå på Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 07d0795bcf16..4e1ec0849fa7 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"उपकरण अनुगमन हुन सक्छ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"प्रोफाइल अनुगमन हुन सक्छ"</string> <string name="vpn_footer" msgid="2388611096129106812">"सञ्जाल अनुगमित हुन सक्छ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"नेटवर्कको अनुगमन गरिने सम्भावना छ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"उपकरण अनुगमन"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"प्रोफाइल अनुगमन गर्दै"</string> <string name="monitoring_title" msgid="169206259253048106">"सञ्जाल अनुगमन"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"तपाईँ <xliff:g id="APPLICATION">%1$s</xliff:g> सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँका नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"तपाईँ <xliff:g id="APPLICATION">%1$s</xliff:g> सँग जडित हुनुहुन्छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँको निजी नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"तपाईं <xliff:g id="APPLICATION">%1$s</xliff:g> मा जोडिनुभएको छ जसले इमेल, अनुप्रयोग र वेबसाइटहरू लगायतको तपाईंको व्यक्तिगत नेटवर्क सम्बन्धी गतिविधिको अनुगमन गर्न सक्छ।"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थापन गरिन्छ। यो <xliff:g id="APPLICATION">%2$s</xliff:g> सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थापन गरिन्छ। यो <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nतपाईँ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> सँग पनि जडित हुनुहुन्छ, जसले तपाईँको व्यक्तिगत नेटवर्क गतिविधि अनुगमन गर्न सक्छ।"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"तपाईँको उपकरण <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थित गरिन्छ।\n\nतपाईँको प्रशासकले तपाईँको यन्त्र र त्यसको स्थान जानकारीमार्फत सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, तपाईँको यन्त्रसँग सम्बद्ध डेटा र तपाईँको यन्त्रको स्थान जानकारीको अनुगमन र व्यवस्थापन गर्न सक्छ।\n\nतपाईँ <xliff:g id="APPLICATION">%2$s</xliff:g> सँग जडित हुनुहुन्छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि तपाईको प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"वस्तुस्थिति पट्टीको घडीमा सेकेन्ड देखाउनुहोस्। ब्याट्री आयु प्रभावित हुन सक्छ।"</string> <string name="qs_rearrange" msgid="8060918697551068765">"द्रुत सेटिङहरू पुनः व्यवस्थित गर्नुहोस्"</string> <string name="show_brightness" msgid="6613930842805942519">"द्रुत सेटिङहरूमा उज्यालो देखाउनुहोस्"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"विभाजित-स्क्रिन स्वाइप-अप इशारा सक्षम गर्नुहोस्"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"परिदृश्य बटनदेखि माथि स्वाइप गरी विभाजित-स्क्रिन प्रविष्ट गर्न इसारालाई सक्रिय गर्नुहोस्"</string> <string name="experimental" msgid="6198182315536726162">"प्रयोगात्मक"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"ब्लुटुथ सक्रिय पार्ने हो?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"आफ्नो ट्याब्लेटसँग किबोर्ड जोड्न, पहिले तपाईँले ब्लुटुथ सक्रिय गर्नुपर्छ।"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 95092290b825..a1d1e275ac1c 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Apparaat wordt mogelijk gecontroleerd"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profiel kan worden gecontroleerd"</string> <string name="vpn_footer" msgid="2388611096129106812">"Netwerk kan worden gecontroleerd"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Netwerk kan worden gecontroleerd"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Apparaatcontrole"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profielcontrole"</string> <string name="monitoring_title" msgid="169206259253048106">"Netwerkcontrole"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"U bent verbonden met <xliff:g id="APPLICATION">%1$s</xliff:g>, waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"U bent verbonden met <xliff:g id="APPLICATION">%1$s</xliff:g>, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Je bent verbonden met <xliff:g id="APPLICATION">%1$s</xliff:g>, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Je werkprofiel wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Deze is verbonden met <xliff:g id="APPLICATION">%2$s</xliff:g>, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Je werkprofiel wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Deze is verbonden met <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, waarmee je werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nU bent ook verbonden met <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, waarmee je persoonlijke netwerkactiviteit kan worden gecontroleerd."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Je apparaat wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJe beheerder kan instellingen, zakelijke toegang, apps, gekoppelde apparaatgegevens en locatiegegevens voor je apparaat controleren en beheren.\n\nU bent verbonden met <xliff:g id="APPLICATION">%2$s</xliff:g> waarmee je netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met je beheerder voor meer informatie."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Klokseconden op de statusbalk weergeven. Kan van invloed zijn op de accuduur."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Snelle instellingen opnieuw indelen"</string> <string name="show_brightness" msgid="6613930842805942519">"Helderheid weergeven in Snelle instellingen"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Omhoog vegen voor gesplitst scherm inschakelen"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Gebaar inschakelen om gesplitst scherm te openen door vanaf de knop Overzicht omhoog te vegen"</string> <string name="experimental" msgid="6198182315536726162">"Experimenteel"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth inschakelen?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Als je je toetsenbord wilt verbinden met je tablet, moet je eerst Bluetooth inschakelen."</string> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index 17c126163bad..2f0e77243896 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> <string name="vpn_footer" msgid="2388611096129106812">"ਨੈੱਟਵਰਕ ਦਾ ਨਿਰੀਖਣ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ਹੋ ਸਕਦਾ ਹੈ ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ ਹੋ ਰਹੀ ਹੋਵੇ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"ਡੀਵਾਈਸ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ਪ੍ਰੋਫਾਈਲ ਦਾ ਨਿਰੀਖਣ ਕਰਨਾ"</string> <string name="monitoring_title" msgid="169206259253048106">"ਨੈੱਟਵਰਕ ਨਿਰੀਖਣ ਕਰ ਰਿਹਾ ਹੈ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ਤੁਸੀਂ <xliff:g id="APPLICATION">%1$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲਾਂ, ਐਪਾਂ, ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ਤੁਹਾਡੀ ਕਾਰਜ ਪ੍ਰੋਫ਼ਾਈਲ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ। ਇਹ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੈ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈਬਸਫ਼ਿਆਂ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦੀ ਹੈ।\n\nਤੁਸੀਂ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ਨਾਲ ਵੀ ਕਨੈਕਟ ਹੋ, ਜੋ ਤੁਹਾਡੀ ਨਿੱਜੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦਾ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ।"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ਤੁਹਾਡੀ ਡੀਵਾਈਸ <xliff:g id="ORGANIZATION">%1$s</xliff:g> ਦੁਆਰਾ ਵਿਵਸਥਿਤ ਕੀਤੀ ਜਾਂਦੀ ਹੈ।\n\nਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ, ਕਾਰਪੋਰੇਟ ਪਹੁੰਚ, ਐਪਸ, ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਨਾਲ ਸੰਬੰਧਿਤ ਡੈਟਾ ਅਤੇ ਤੁਹਾਡੀ ਡੀਵਾਈਸ ਦੀ ਨਿਰਧਾਰਿਤ ਸਥਾਨ ਜਾਣਕਾਰੀ ਦਾ ਨਿਰੀਖਣ ਅਤੇ ਉਸਨੂੰ ਵਿਵਸਥਿਤ ਕਰ ਸਕਦਾ ਹੈ।\n\nਤੁਸੀਂ ਇੱਕ <xliff:g id="APPLICATION">%2$s</xliff:g> ਨਾਲ ਕਨੈਕਟ ਹੋ, ਜੋ ਈਮੇਲ, ਐਪਸ ਅਤੇ ਵੈੱਬਪੰਨੇ ਸਮੇਤ ਤੁਹਾਡੀ ਨੈੱਟਵਰਕ ਗਤੀਵਿਧੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ, ਆਪਣੇ ਪ੍ਰਬੰਧਕ ਨੂੰ ਸੰਪਰਕ ਕਰੋ।"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"ਸਥਿਤੀ ਬਾਰ ਵਿੱਚ ਘੜੀ ਸਕਿੰਟ ਦਿਖਾਓ। ਬੈਟਰੀ ਸਮਰੱਥਾ ਤੇ ਅਸਰ ਪੈ ਸਕਦਾ ਹੈ।"</string> <string name="qs_rearrange" msgid="8060918697551068765">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੁਬਾਰਾ ਕ੍ਰਮ ਦਿਓ"</string> <string name="show_brightness" msgid="6613930842805942519">"ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਮਕ ਦਿਖਾਓ"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਸਵਾਈਪ-ਅੱਪ ਸੰਕੇਤ ਨੂੰ ਯੋਗ ਬਣਾਓ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"ਰੂਪ-ਰੇਖਾ ਬਟਨ ਤੋਂ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰਨ ਦੁਆਰਾ ਸਪਲਿਟ-ਸਕ੍ਰੀਨ ਵਿੱਚ ਦਾਖਲ ਹੋਣ ਲਈ ਸੰਕੇਤ ਨੂੰ ਯੋਗ ਬਣਾਓ"</string> <string name="experimental" msgid="6198182315536726162">"ਪ੍ਰਯੋਗਾਤਮਿਕ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth ਚਾਲੂ ਕਰੋ?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ਆਪਣੇ ਟੈਬਲੇਟ ਨਾਲ ਆਪਣਾ ਕੀ-ਬੋਰਡ ਕਨੈਕਟ ਕਰਨ ਲਈ, ਤੁਹਾਨੂੰ ਪਹਿਲਾਂ Bluetooth ਚਾਲੂ ਕਰਨ ਦੀ ਜ਼ਰੂਰਤ ਹੈ।"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index c86d26c31770..7d69a9fd05ee 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -408,6 +408,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Urządzenie może być monitorowane"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil może być monitorowany"</string> <string name="vpn_footer" msgid="2388611096129106812">"Sieć może być monitorowana"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Sieć może być monitorowana"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitorowanie urządzeń"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorowanie profilu"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitorowanie sieci"</string> @@ -420,6 +421,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Masz połączenie z aplikacją <xliff:g id="APPLICATION">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Masz połączenie z aplikacją <xliff:g id="APPLICATION">%1$s</xliff:g>, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Masz połączenie z aplikacją <xliff:g id="APPLICATION">%1$s</xliff:g>, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Twoim profilem do pracy zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil jest połączony z aplikacją <xliff:g id="APPLICATION">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Twoim profilem do pracy zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil jest połączony z aplikacją <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nMasz też połączenie z aplikacją <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, która może monitorować Twoją prywatną aktywność w sieci."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Twoim urządzeniem zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z urządzeniem i informacje o jego lokalizacji oraz nimi zarządzać.\n\nMasz połączenie z aplikacją <xliff:g id="APPLICATION">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string> @@ -496,8 +498,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Pokaż sekundy na zegarku na pasku stanu. Może mieć wpływ na czas pracy baterii."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Uporządkuj Szybkie ustawienia"</string> <string name="show_brightness" msgid="6613930842805942519">"Pokaż jasność w Szybkich ustawieniach"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Włącz dzielenie ekranu gestem przesunięcia w górę"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Włącz dzielenie ekranu po wykonaniu gestu przesunięcia palcem w górę od przycisku Przegląd"</string> <string name="experimental" msgid="6198182315536726162">"Eksperymentalne"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Włączyć Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Aby połączyć klawiaturę z tabletem, musisz najpierw włączyć Bluetooth."</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 199dbad15371..91746f33fc4c 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"O dispositivo pode ser monitorado"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorado"</string> <string name="vpn_footer" msgid="2388611096129106812">"A rede pode ser monitorada"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"A rede pode ser monitorada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitoramento de dispositivos"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoramento de perfis"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitoramento de rede"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorar sua atividade pessoal na rede."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostrar segundos do relógio na barra de status. Pode afetar a duração da bateria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar \"Configurações rápidas\""</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar brilho nas \"Configurações rápidas\""</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ativar gesto para dividir a tela ao deslizar para cima"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Ativa o gesto para entrar no modo de tela dividida deslizando a partir do botão \"Visão geral\""</string> <string name="experimental" msgid="6198182315536726162">"Experimentais"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index d3d7f24903b6..496e05eb85c2 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"O dispositivo pode ser monitorizado"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorizado"</string> <string name="vpn_footer" msgid="2388611096129106812">"A rede pode ser monitorizada"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"A rede pode ser monitorizada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitorização de dispositivos"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorização de perfis"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitorização da rede"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Está ligado ao <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está ligado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está ligado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está ligado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"O seu dispositivo é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEstá ligado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostrar segundos do relógio na barra de estado. Pode afetar a autonomia da bateria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar as Definições rápidas"</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar luminosidade nas Definições rápidas"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ativar gesto de deslize rápido para cima do ecrã dividido"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Ativar o gesto para aceder ao ecrã dividido ao deslizar rapidamente para cima a partir do botão Vista geral"</string> <string name="experimental" msgid="6198182315536726162">"Experimental"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Pretende ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para ligar o teclado ao tablet, tem de ativar primeiro o Bluetooth."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 199dbad15371..91746f33fc4c 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"O dispositivo pode ser monitorado"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"O perfil pode ser monitorado"</string> <string name="vpn_footer" msgid="2388611096129106812">"A rede pode ser monitorada"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"A rede pode ser monitorada"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitoramento de dispositivos"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitoramento de perfis"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitoramento de rede"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorar sua atividade profissional na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorar sua atividade pessoal na rede."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Mostrar segundos do relógio na barra de status. Pode afetar a duração da bateria."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Reorganizar \"Configurações rápidas\""</string> <string name="show_brightness" msgid="6613930842805942519">"Mostrar brilho nas \"Configurações rápidas\""</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ativar gesto para dividir a tela ao deslizar para cima"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Ativa o gesto para entrar no modo de tela dividida deslizando a partir do botão \"Visão geral\""</string> <string name="experimental" msgid="6198182315536726162">"Experimentais"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Ativar o Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Para conectar o teclado ao tablet, é preciso primeiro ativar o Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index f59721a8ed33..115cf958f691 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -408,6 +408,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Dispozitivul poate fi monitorizat"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profilul poate fi monitorizat"</string> <string name="vpn_footer" msgid="2388611096129106812">"Rețeaua poate fi monitorizată"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Este posibil ca rețeaua să fie monitorizată"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitorizarea dispozitivului"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorizarea profilului"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitorizarea rețelei"</string> @@ -420,6 +421,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Sunteți conectat(ă) la <xliff:g id="APPLICATION">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Sunteți conectat(ă) la <xliff:g id="APPLICATION">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua personală, inclusiv e-mailurile, aplicațiile și site-urile."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"V-ați conectat la aplicația <xliff:g id="APPLICATION">%1$s</xliff:g>, care vă poate monitoriza activitatea personală în rețea, inclusiv e-mailurile, aplicațiile și site-urile accesate."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profilul de serviciu este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este conectat la <xliff:g id="APPLICATION">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profilul de serviciu este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este conectat la <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nDe asemenea, sunteți conectat(ă) la <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua personală."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Dispozitivul este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la <xliff:g id="APPLICATION">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul."</string> @@ -496,8 +498,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Afișează secundele pe ceas în bara de stare. Poate afecta autonomia bateriei."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Rearanjați Setările rapide"</string> <string name="show_brightness" msgid="6613930842805942519">"Afișați luminozitatea în Setările rapide"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Activați gestul de accesare a ecranului împărțit prin glisare în sus"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Activați gestul de accesare a ecranului împărțit prin glisarea în sus de la butonul Recente"</string> <string name="experimental" msgid="6198182315536726162">"Experimentale"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Activați Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Pentru a conecta tastatura la tabletă, mai întâi trebuie să activați Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index bee7eedcfbf3..f15caf4122bb 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Устройство может контролироваться"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Действия в профиле могут отслеживаться"</string> <string name="vpn_footer" msgid="2388611096129106812">"Сеть может отслеживаться"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Сеть может отслеживаться"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Отслеживание устройств"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Мониторинг профиля"</string> <string name="monitoring_title" msgid="169206259253048106">"Отслеживание сетей"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"Сеть VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Запущено приложение \"<xliff:g id="APPLICATION">%1$s</xliff:g>\", которое может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Запущено приложение \"<xliff:g id="APPLICATION">%1$s</xliff:g>\", которое может отслеживать ваши действия в Интернете (выполняемые в личном профиле), включая работу с электронной почтой, приложениями и веб-сайтами."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Запущено приложение \"<xliff:g id="APPLICATION">%1$s</xliff:g>\", которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Вашим рабочим профилем управляет \"<xliff:g id="ORGANIZATION">%1$s</xliff:g>\". Приложение \"<xliff:g id="APPLICATION">%2$s</xliff:g>\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа дополнительной информацией обратитесь к своему администратору."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Вашим рабочим профилем управляет \"<xliff:g id="ORGANIZATION">%1$s</xliff:g>\". Приложение \"<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>\" может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nПриложение \"<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>\" может отслеживать ваши действия в Интернете, выполняемые в личном профиле."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Вашим корпоративным профилем управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nПриложение <xliff:g id="APPLICATION">%2$s</xliff:g> также может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Показывать в строке состояния время с точностью до секунды (заряд батареи может расходоваться быстрее)."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Изменить порядок Быстрых настроек"</string> <string name="show_brightness" msgid="6613930842805942519">"Добавить яркость в Быстрые настройки"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Разделять экран пролистыванием вверх"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Включить разделение экрана пролистыванием вверх с кнопки \"Обзор\""</string> <string name="experimental" msgid="6198182315536726162">"Экспериментальная функция"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Подключение по Bluetooth"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Чтобы подключить клавиатуру к планшету, включите Bluetooth."</string> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 0811f5e77adb..f05ba9a8327f 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"ඇතැම් විට උපාංගය නිරීක්ෂණය විය හැක"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ඇතැම් විට පැතිකඩ නිරීක්ෂණය කරන ලදි"</string> <string name="vpn_footer" msgid="2388611096129106812">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"ඇතැම් විට ජාලය නිරීක්ෂණය විය හැක"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"උපාංගය නිරීක්ෂණය"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"පැතිකඩ නිරීක්ෂණය කිරීම"</string> <string name="monitoring_title" msgid="169206259253048106">"ජාල නිරීක්ෂණය"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION">%1$s</xliff:g> වෙත ඔබ සම්බන්ධ වී ඇත."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION">%1$s</xliff:g> වෙත ඔබ සම්බන්ධ වී ඇත."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ පෞද්ගලික ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION">%1$s</xliff:g> වෙත ඔබ සම්බන්ධ වී ඇත."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ <xliff:g id="ORGANIZATION">%1$s</xliff:g> විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION">%2$s</xliff:g> වෙත ඔබ සම්බන්ධ වී ඇත.\n\nවැඩිදුර විස්තර සඳහා, ඔබේ පරිපාලක අමතන්න."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"ඔබේ කාර්යාල පැතිකඩ කළමනාකරණය කරන්නේ <xliff:g id="ORGANIZATION">%1$s</xliff:g> විසිනි. එය ඊ-තැපැල්, යෙදුම් සහ වෙබ් අඩවි ඇතුළු ඔබේ කාර්යාල ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, වෙත ඔබ සම්බන්ධ වී ඇත.\n\nඔබ ඔබේ පෞද්ගලික ජාල ක්රියාකාරකම් නිරීක්ෂණය කළ හැකි, <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> වෙතද සම්බන්ධ වී ඇත."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ඔබේ උපාංගය කළමනාකරණය කරන්නේ <xliff:g id="ORGANIZATION">%1$s</xliff:g> විසිනි.\n\nඔබේ පරිපාලකට ඔබේ උපාංගය හා සම්බන්ධිත සැකසීම්, ආයතනික ප්රවේශය, යෙදුම්, දත්ත සහ ඔබේ උපාංගය තිබෙන ස්ථානයේ තොරතුරු නිරීක්ෂණය කිරීමට සහ කළමනාකරණය කිරීමට හැකිය.\n\nඔබ ඊ-තැපැල්, යෙදුම්, සහ වෙබ් අඩවි ඇතුළු ඔබේ ජාල ක්රියාකාරකම් නිරීක්ෂණය කිරීමට හැකි <xliff:g id="APPLICATION">%2$s</xliff:g>, වෙතද සම්බන්ධව ඇත.\n\nවැඩිදුර තොරතුරු සඳහා, ඔබගේ පරිපාලක අමතන්න."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"තත්ත්ව තීරුවෙහි ඔරලෝසු තත්පර පෙන්වන්න. බැටරි ආයු කාලයට බලපෑමට හැකිය."</string> <string name="qs_rearrange" msgid="8060918697551068765">"ඉක්මන් සැකසීම් යළි පිළිවෙළට සකසන්න"</string> <string name="show_brightness" msgid="6613930842805942519">"ඉක්මන් සැකසීම්වල දීප්තිය පෙන්වන්න"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"බෙදුම්-තිරය ඉහළට-ස්වයිප් කිරීමේ අභිනය සබල කරන්න"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"දළ විශ්ලේෂණ බොත්තම හරහා ඉහළට ස්වයිප් කිරීමෙන් බෙදුම් තිරයට ඇතුළු වීමට ඉඟිය සබල කිරීම"</string> <string name="experimental" msgid="6198182315536726162">"පරීක්ෂණාත්මක"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"බ්ලූටූත් ක්රියාත්මක කරන්නද?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"ඔබේ යතුරු පුවරුව ඔබේ ටැබ්ලට් පරිගණකයට සම්බන්ධ කිරීමට, ඔබ පළමුව බ්ලූටූත් ක්රියාත්මක කළ යුතුය."</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 304c9a06eb35..2fe207323c10 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Zariadenie môže byť sledované"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil môže byť monitorovaný"</string> <string name="vpn_footer" msgid="2388611096129106812">"Sieť môže byť sledovaná"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Sieť môže byť monitorovaná"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Sledovanie zariadenia"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorovanie profilu"</string> <string name="monitoring_title" msgid="169206259253048106">"Sledovanie siete"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Ste pripojený/-á k aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Ste pripojený/-á k aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Ste pripojený/-á k aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Váš pracovný profil spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je pripojený k aplikácii <xliff:g id="APPLICATION">%2$s</xliff:g>, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Váš pracovný profil spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je pripojený k aplikácii <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nSte tiež pripojený/-á k aplikácii <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ktorá môže sledovať vašu osobnú aktivitu v sieti."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Vaše zariadenie spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSprávca môže sledovať a spravovať nastavenia, podnikový prístup, aplikácie a údaje priradené k vášmu účtu, ako aj informácie o polohe zariadenia.\n\nSte pripojený/-á k aplikácii <xliff:g id="APPLICATION">%2$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Zobrazí sekundy v stavovom riadku. Môže to ovplyvňovať výdrž batérie."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Zmeniť usporiadanie Rýchlych nastavení"</string> <string name="show_brightness" msgid="6613930842805942519">"Zobraziť jas v Rýchlych nastaveniach"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktivovať rozdelenú obrazovku prejdením prstom"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Umožňuje aktivovať rozdelenú obrazovku prejdením prstom nahor od tlačidla Prehľad"</string> <string name="experimental" msgid="6198182315536726162">"Experimentálne"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Zapnúť Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ak chcete klávesnicu pripojiť k tabletu, najprv musíte zapnúť Bluetooth."</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index a8bc3d1a5dc2..2ab93909c492 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Naprava je morda nadzorovana"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil je morda nadziran"</string> <string name="vpn_footer" msgid="2388611096129106812">"Omrežje je lahko nadzorovano"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Omrežje je morda nadzorovano"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Nadzor naprave"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Nadzor nad profilom"</string> <string name="monitoring_title" msgid="169206259253048106">"Nadzor omrežja"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Povezani ste z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Povezani ste z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Povezani ste z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Delovni profil upravlja organizacija <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Delovni profil upravlja organizacija <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je z aplikacijo <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nPovezani ste tudi z aplikacijo <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ki lahko nadzira vašo osebno omrežno dejavnost."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Napravo upravlja organizcija <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Prikaže sekunde pri uri v vrstici stanja. To lahko vpliva na čas delovanja pri akumulatorskem napajanju."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Preuredi hitre nastavitve"</string> <string name="show_brightness" msgid="6613930842805942519">"Prikaz svetlosti v hitrih nastavitvah"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Omogočanje poteze za razdeljen zaslon z vlečenjem navzgor"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Omogočanje poteze za vklop razdeljenega zaslona, tako da uporabnik od gumba za pregled povleče s prstom navzgor"</string> <string name="experimental" msgid="6198182315536726162">"Poskusno"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Želite vklopiti Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Če želite povezati tipkovnico in tablični računalnik, vklopite Bluetooth."</string> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index 4bc29aa610dd..146964dfcdc1 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Pajisja mund të monitorohet"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profili mund të monitorohet"</string> <string name="vpn_footer" msgid="2388611096129106812">"Rrjeti mund të jetë i monitoruar"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Rrjeti mund të jetë i monitoruar"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Monitorimi i pajisjes"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Monitorimi i profilit"</string> <string name="monitoring_title" msgid="169206259253048106">"Monitorimi i rrjetit"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Je i lidhur me aplikacionin <xliff:g id="APPLICATION">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd në rrjet përfshirë mailet, aplikacionet dhe sajtet e uebit."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Je i lidhur me aplikacionin <xliff:g id="APPLICATION">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Je i lidhur me aplikacionin <xliff:g id="APPLICATION">%1$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd personal në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ai është i lidhur me <xliff:g id="APPLICATION">%2$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nPër më shumë informacione, kontakto me administratorin tënd."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Profili yt i punës menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ai është i lidhur me <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd të punës në rrjet, përfshirë mailet, aplikacionet dhe sajtet e uebit.\n\nJe lidhur gjithashtu edhe me <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, i cili mund të monitorojë aktivitetin tënd personal në rrjet."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Pajisja jote menaxhohet nga <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratori mund të monitorojë dhe menaxhojë cilësimet, qasjen e korporatës, aplikacionet, të dhënat që shoqërojnë pajisjen tënde si dhe informacionin e vendndodhjes së pajisjes.\n\nJe i lidhur me <xliff:g id="APPLICATION">%2$s</xliff:g>, që mund të monitorojë aktivitetin tënd të punës në rrjet përfshirë mail-at, aplikacionet dhe faqet e internetit.\n\nPër më shumë informacion, kontakto me administratorin tënd."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Trego sekondat e orës në shiritin e statusit. Mund të ndikojë te jeta e baterisë."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Risistemo Cilësimet e shpejta"</string> <string name="show_brightness" msgid="6613930842805942519">"Shfaq ndriçimin te Cilësimet e shpejta"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktivizo gjestin e rrëshqitjes lart për ekranin e ndarë"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktivizo gjestin për të hyrë tek ekrani i ndarë duke rrëshqitur lart nga butoni \"Përmbledhja\""</string> <string name="experimental" msgid="6198182315536726162">"Eksperimentale"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Të aktivizohet \"bluetooth-i\"?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Për të lidhur tastierën me tabletin, në fillim duhet të aktivizosh \"bluetooth-in\"."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 16ae7e2ec3aa..b1270280b565 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Уређај се можда надгледа"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профил се можда надгледа"</string> <string name="vpn_footer" msgid="2388611096129106812">"Мрежа се можда надгледа"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Мрежа се можда надгледа"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Надгледање уређаја"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Надгледање профила"</string> <string name="monitoring_title" msgid="169206259253048106">"Надгледање мреже"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Повезани сте са апликацијом <xliff:g id="APPLICATION">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Повезани сте са апликацијом <xliff:g id="APPLICATION">%1$s</xliff:g>, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Повезани сте са апликацијом <xliff:g id="APPLICATION">%1$s</xliff:g>, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Профилом за Work управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Повезан је са апликацијом <xliff:g id="APPLICATION">%2$s</xliff:g>, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Профилом за Work управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Повезан је са апликацијом <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nПовезани сте и са апликацијом <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, која може да надгледа активности на личној мрежи."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Уређајем управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са апликацијом <xliff:g id="APPLICATION">%2$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Секунде на сату се приказују на статусној траци. То може да утиче на трајање батерије."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Преуреди Брза подешавања"</string> <string name="show_brightness" msgid="6613930842805942519">"Прикажи осветљеност у Брзим подешавањима"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Омогући покрет за превлачење нагоре за подељени екран"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Омогућава покрет за прелазак на подељени екран превлачењем нагоре од дугмета Преглед"</string> <string name="experimental" msgid="6198182315536726162">"Експериментално"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Желите ли да укључите Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Да бисте повезали тастатуру са таблетом, прво морате да укључите Bluetooth."</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index e6988d702137..a6aa2d1c28c1 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Enheten kan övervakas"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Det kan hända att profilen övervakas"</string> <string name="vpn_footer" msgid="2388611096129106812">"Nätverket kan vara övervakat"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Nätverket kan vara övervakat"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Enhetsövervakning"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilövervakning"</string> <string name="monitoring_title" msgid="169206259253048106">"Nätverksövervakning"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Du är ansluten till <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan bevaka aktivitet på nätverket, inklusive e-post, appar och webbplatser."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Du är ansluten till <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan bevaka din privata aktivitet på nätverket, inklusive e-post, appar och webbplatser."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Du är ansluten till <xliff:g id="APPLICATION">%1$s</xliff:g> som kan övervaka din privata aktivitet på nätverket, inklusive e-postmeddelanden, appar och webbplatser."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Jobbprofilen hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den är ansluten till <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Jobbprofilen hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den är ansluten till <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nDu är även ansluten till <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan hantera privat aktivitet på nätverket."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Enheten hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratören kan bevaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsuppgifter.\n\nDu är ansluten till <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan övervaka aktivitet på nätverket, inklusive e-post. appar och webbplatser .\n\nKontakta administratören för mer information."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Visa klocksekunder i statusfältet. Detta kan påverka batteritiden."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Ordna snabbinställningarna"</string> <string name="show_brightness" msgid="6613930842805942519">"Visa ljusstyrka i snabbinställningarna"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Aktivera delad skärm när du sveper uppåt"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Aktivera en rörelse som delar skärmen när du sveper uppåt från knappen Översikt"</string> <string name="experimental" msgid="6198182315536726162">"Experimentella"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vill du aktivera Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Om du vill ansluta tangentbordet till surfplattan måste du först aktivera Bluetooth."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 50c668532adc..c6bd735bb0bd 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Huenda kifaa kinafuatiliwa"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Huenda wasifu ukafuatiliwa"</string> <string name="vpn_footer" msgid="2388611096129106812">"Huenda mtandao unafuatiliwa"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Huenda mtandao unafuatiliwa"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Ufuatiliaji wa kifaa"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Ufuatiliaji wasifu"</string> <string name="monitoring_title" msgid="169206259253048106">"Ufuatiliaji wa mtandao"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Umeunganishwa kwenye <xliff:g id="APPLICATION">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Umeunganishwa kwenye <xliff:g id="APPLICATION">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Umeunganishwa kwenye <xliff:g id="APPLICATION">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Wasifu wako wa kazini unasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Wasifu huu umeunganishwa kwenye <xliff:g id="APPLICATION">%2$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\nKwa maelezo zaidi, wasiliana na msimamizi wako."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Wasifu wako wa kazini unasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Wasifu huu umeunganishwa kwenye <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ambayo inaweza kufuatilia mtandao wako wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti. \n\n Wewe pia umeunganishwa kwenye <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako kibinafsi."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Kifaa chako kinasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. \n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. \n\n Umeuganishwa kwenye <xliff:g id="APPLICATION">%2$s</xliff:g>, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\n Kwa maelezo zaidi, wasiliana na msimamizi wako."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Onyesha sekunde za saa katika sehemu ya arifa. Inaweza kuathiri muda wa matumizi ya betri."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Panga Upya Mipangilio ya Haraka"</string> <string name="show_brightness" msgid="6613930842805942519">"Onyesha unga\'avu katika Mipangilio ya Haraka"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Ruhusu kugawanya skrini kwa ishara ya kutelezesha kidole juu"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Washa kipengele cha ishara ili utumie skrini iliyogawanywa kwa kutelezesha kidole juu kutoka kitufe cha Muhtasari"</string> <string name="experimental" msgid="6198182315536726162">"Ya majaribio"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Je, ungependa kuwasha Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ili uunganishe Kibodi yako kwenye kompyuta yako kibao, lazima kwanza uwashe Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index f0cb53044a9f..ae2e4b0a8904 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"சாதனம் கண்காணிக்கப்படலாம்"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"சுயவிவரம் கண்காணிக்கப்படலாம்"</string> <string name="vpn_footer" msgid="2388611096129106812">"நெட்வொர்க் கண்காணிக்கப்படலாம்"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"நெட்வொர்க் கண்காணிக்கப்படலாம்"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"சாதனத்தைக் கண்காணித்தல்"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"சுயவிவரத்தைக் கண்காணித்தல்"</string> <string name="monitoring_title" msgid="169206259253048106">"நெட்வொர்க்கைக் கண்காணித்தல்"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால் மின்னஞ்சல்கள், பயன்பாடுகள், இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"உங்கள் பணி சுயவிவரத்தை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. <xliff:g id="APPLICATION">%2$s</xliff:g> உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"உங்கள் பணி சுயவிவரத்தை <xliff:g id="ORGANIZATION">%1$s</xliff:g> நிர்வகிக்கிறது. <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nமேலும் <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளதால், உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டையும் அதனால் கண்காணிக்க முடியும்."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"சாதனத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g> உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"நிலைப் பட்டியில் கடிகார வினாடிகளைக் காட்டும். பேட்டரியின் ஆயுளைக் குறைக்கலாம்."</string> <string name="qs_rearrange" msgid="8060918697551068765">"விரைவு அமைப்புகளை மறுவரிசைப்படுத்து"</string> <string name="show_brightness" msgid="6613930842805942519">"விரைவு அமைப்புகளில் ஒளிர்வுப் பட்டியைக் காட்டு"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"மேலே ஸ்வைப் செய்வதன் மூலம் திரையைப் பிரிக்கும் சைகையை இயக்கு"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"மேலோட்டப் பார்வை பொத்தானிலிருந்து மேலே ஸ்வைப் செய்வதன் மூலம், திரைப் பிரிப்பைச் செயலாக்குவதற்கான சைகையை இயக்கும்"</string> <string name="experimental" msgid="6198182315536726162">"சோதனை முயற்சி"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"புளூடூத்தை இயக்கவா?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"உங்கள் டேப்லெட்டுடன் விசைப்பலகையை இணைக்க, முதலில் புளூடூத்தை இயக்க வேண்டும்."</string> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index e50d47a1bf9d..eb0aec3bb43b 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"పరికరం పర్యవేక్షించబడవచ్చు"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"ప్రొఫైల్ని పర్యవేక్షించవచ్చు"</string> <string name="vpn_footer" msgid="2388611096129106812">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"నెట్వర్క్ పర్యవేక్షించబడవచ్చు"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"పరికర పర్యవేక్షణ"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ప్రొఫైల్ పర్యవేక్షణ"</string> <string name="monitoring_title" msgid="169206259253048106">"నెట్వర్క్ పర్యవేక్షణ"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"మీరు <xliff:g id="APPLICATION">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"మీరు <xliff:g id="APPLICATION">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"మీరు <xliff:g id="APPLICATION">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"మీ కార్యాలయ ప్రొఫైల్ను <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ <xliff:g id="APPLICATION">%2$s</xliff:g>కి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"మీ కార్యాలయ ప్రొఫైల్ను <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>కి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమీరు <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>కి కూడా కనెక్ట్ చేయబడ్డారు, ఇది మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"మీ పరికరాన్ని <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్లను, కార్పొరేట్ ప్రాప్యతను, అనువర్తనాలను, మీ పరికరంతో అనుబంధించిన డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు <xliff:g id="APPLICATION">%2$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"స్థితి పట్టీలో గడియారం సెకన్లు చూపుతుంది. బ్యాటరీ శక్తి ప్రభావితం చేయవచ్చు."</string> <string name="qs_rearrange" msgid="8060918697551068765">"శీఘ్ర సెట్టింగ్ల ఏర్పాటు క్రమం మార్చు"</string> <string name="show_brightness" msgid="6613930842805942519">"శీఘ్ర సెట్టింగ్ల్లో ప్రకాశం చూపు"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"పైకి స్వైప్ చేయడం ద్వారా స్క్రీన్ విభజన సంజ్ఞను ప్రారంభించు"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"స్థూలదృష్టి బటన్ నుండి పైకి స్వైప్ చేయడం ద్వారా స్క్రీన్ విభజనలోకి ప్రవేశించడానికి సంజ్ఞను ప్రారంభిస్తుంది"</string> <string name="experimental" msgid="6198182315536726162">"ప్రయోగాత్మకం"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"బ్లూటూత్ ఆన్ చేయాలా?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"మీ కీబోర్డ్ను మీ టాబ్లెట్తో కనెక్ట్ చేయడానికి, మీరు ముందుగా బ్లూటూత్ ఆన్ చేయాలి."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 7eb227eb84b5..f31bb027c661 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"อาจมีการตรวจสอบอุปกรณ์"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"อาจมีการตรวจสอบโปรไฟล์"</string> <string name="vpn_footer" msgid="2388611096129106812">"เครือข่ายอาจได้รับการตรวจสอบ"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"เครือข่ายอาจถูกตรวจสอบ"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"การตรวจสอบอุปกรณ์"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"การตรวจสอบโปรไฟล์"</string> <string name="monitoring_title" msgid="169206259253048106">"การตรวจสอบเครือข่าย"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"คุณเชื่อมต่อกับ <xliff:g id="APPLICATION">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"คุณเชื่อมต่อกับ <xliff:g id="APPLICATION">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"คุณเชื่อมต่อกับ <xliff:g id="APPLICATION">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวของคุณ รวมถึงอีเมล แอป และเว็บไซต์ได้"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"โปรไฟล์งานได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g> โดยมีการเชื่อมต่อกับ <xliff:g id="APPLICATION">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"โปรไฟล์งานได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g> โดยมีการเชื่อมต่อกับ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่าย รวมถึงอีเมล แอป และเว็บไซต์ได้\n\nนอกจากนี้ คุณยังเชื่อมต่อกับ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนตัวได้"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"อุปกรณ์ได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nผู้ดูและรบบของคุณสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์ได้\n\nคุณมีการเชื่อมต่อกับ <xliff:g id="APPLICATION">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"แสดงวินาทีของนาฬิกาในแถบสถานะ อาจส่งผลต่ออายุแบตเตอรี"</string> <string name="qs_rearrange" msgid="8060918697551068765">"จัดเรียงการตั้งค่าด่วนใหม่"</string> <string name="show_brightness" msgid="6613930842805942519">"แสดงความสว่างในการตั้งค่าด่วน"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"เปิดใช้ท่าทางสัมผัสการเลื่อนขึ้นเพื่อแยกหน้าจอ"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"เปิดใช้ท่าทางสัมผัสเพื่อเข้าสู่โหมดแยกหน้าจอโดยเลื่อนขึ้นจากปุ่มภาพรวม"</string> <string name="experimental" msgid="6198182315536726162">"ทดสอบ"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"เปิดบลูทูธไหม"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"หากต้องการเชื่อมต่อแป้นพิมพ์กับแท็บเล็ต คุณต้องเปิดบลูทูธก่อน"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index ed6830e87b87..97e1b15dace8 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Maaaring subaybayan ang device"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Maaaring subaybayan ang profile"</string> <string name="vpn_footer" msgid="2388611096129106812">"Maaaring sinusubaybayan ang network"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Maaaring sinusubaybayan ang network"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Pagsubaybay sa device"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Pagsubaybay sa Profile"</string> <string name="monitoring_title" msgid="169206259253048106">"Pagsubaybay sa network"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Nakakonekta ka sa <xliff:g id="APPLICATION">%1$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network kabilang ang mga email, app at website."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Nakakonekta ka sa <xliff:g id="APPLICATION">%1$s</xliff:g>, na maaaring sumubaybay sa iyong personal na aktibidad sa network, kabilang ang mga email, app at website."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Nakakonekta ka sa <xliff:g id="APPLICATION">%1$s</xliff:g>, na maaaring sumubaybay sa aktibidad sa iyong personal na network, kabilang ang mga email, app at website."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Ang iyong profile sa trabaho ay pinapamahalaan ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Nakakonekta ito sa <xliff:g id="APPLICATION">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Ang iyong profile sa trabaho ay pinapamahalaan ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Nakakonekta ito sa <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nNakakonekta ka rin sa <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, na maaaring sumubaybay sa iyong personal na aktibidad sa network."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Pinapamahalaan ang iyong device ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMaaaring subaybayan at pamahalaan ng iyong administrator ang mga setting, corporate na access, app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa <xliff:g id="APPLICATION">%2$s</xliff:g>, na maaaring subaybayan ang iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Ipakita ang mga segundo ng orasan sa status bar. Maaaring makaapekto sa tagal ng baterya."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Ayusing Muli ang Mga Mabilisang Setting"</string> <string name="show_brightness" msgid="6613930842805942519">"Ipakita ang liwanag sa Mga Mabilisang Setting"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"I-enable ang pag-swipe pataas na galaw para sa split-screen"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"I-enable ang gesture upang makapasok sa split-screen sa pamamagitan ng pagsa-swipe pataas mula sa button ng Pangkalahatang-ideya"</string> <string name="experimental" msgid="6198182315536726162">"Pang-eksperimento"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"I-on ang Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Upang ikonekta ang iyong keyboard sa iyong tablet, kailangan mo munang i-on ang Bluetooth."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 8fae7975e51a..f336b34811d9 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Cihaz izlenebilir"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil izlenebilir"</string> <string name="vpn_footer" msgid="2388611096129106812">"Ağ etkinliği izlenebilir"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Ağ etkinliği izlenebilir"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Cihaz izleme"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profil izleme"</string> <string name="monitoring_title" msgid="169206259253048106">"Ağ izleme"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasına bağlısınız."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasına bağlısınız."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasına bağlısınız."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"İş profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"İş profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> uygulamasına bağlı.\n\n Ayrıca kişisel ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> uygulamasına bağlısınız."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Cihazınız <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz; ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkilendirilmiş verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasına bağlısınız.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Durum çubuğunda saatin saniyelerini gösterir. Pil ömrünü etkileyebilir."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Hızlı Ayarlar\'ı Yeniden Düzenle"</string> <string name="show_brightness" msgid="6613930842805942519">"Hızlı Ayarlar\'da parlaklığı göster"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Hızlıca yukarı kaydırma hareketiyle ekran bölm. etkinleştir"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Genel bakış düğmesinden yukarı hızlıca kaydırarak bölünmüş ekrana geçme hareketini etkinleştir"</string> <string name="experimental" msgid="6198182315536726162">"Deneysel"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth açılsın mı?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Klavyenizi tabletinize bağlamak için önce Bluetooth\'u açmanız gerekir."</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 7eaf0dbad8c8..b760eee433ee 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -410,6 +410,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Дії на пристрої можуть відстежуватися"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Профіль може відстежуватись"</string> <string name="vpn_footer" msgid="2388611096129106812">"Дії в мережі можуть відстежуватися"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Мережа може відстежуватися"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Відстеження дій на пристрої"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Відстеження профілю"</string> <string name="monitoring_title" msgid="169206259253048106">"Відстеження дій у мережі"</string> @@ -422,6 +423,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Ваш профіль під’єднано до додатка <xliff:g id="APPLICATION">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Ваш профіль під’єднано до додатка <xliff:g id="APPLICATION">%1$s</xliff:g>, який може відстежувати вашу особисту активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Ваш профіль під’єднано до додатка <xliff:g id="APPLICATION">%1$s</xliff:g>, який може відстежувати вашу особисту активність у мережі, зокрема доступ до електронної пошти, додатків і веб-сайтів."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Вашим робочим профілем керує <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Профіль під’єднано до додатка <xliff:g id="APPLICATION">%2$s</xliff:g>, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Вашим робочим профілем керує <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Профіль під’єднано до додатка <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nВаш профіль також під’єднано до додатка <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, який може відстежувати вашу особисту активність у мережі."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Вашим пристроєм керує організація <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки, геодані й інші дані, пов’язані з вашим пристроєм.\n\nВаш профіль під’єднано до додатка <xliff:g id="APPLICATION">%2$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше."</string> @@ -498,8 +500,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Показувати секунди на годиннику в рядку стану. Акумулятор може розряджатися швидше."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Упорядкувати швидкі налаштування"</string> <string name="show_brightness" msgid="6613930842805942519">"Показувати панель яскравості у швидких налаштуваннях"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Увімкнути розділення екрана рухом пальця вгору"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Увімкнути жест розділення екрана рухом пальця вгору від кнопки \"Огляд\""</string> <string name="experimental" msgid="6198182315536726162">"Експериментальні налаштування"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Увімкнути Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Щоб під’єднати клавіатуру до планшета, спершу потрібно ввімкнути Bluetooth."</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 5c0ed1860a5f..de1c5fa44ae0 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"آلہ کو مانیٹر کیا جا سکتا ہے"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"پروفائل کو مانیٹر کیا جا سکتا ہے"</string> <string name="vpn_footer" msgid="2388611096129106812">"نیٹ ورک کو مانیٹر کیا جا سکتا ہے"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"نیٹ ورک کو شاید مانیٹر کیا جائے"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"آلہ کو مانیٹر کرنا"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"پروفائل کو مانیٹر کرنا"</string> <string name="monitoring_title" msgid="169206259253048106">"نیٹ ورک کو مانیٹر کرنا"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"آپ <xliff:g id="APPLICATION">%1$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"آپ <xliff:g id="APPLICATION">%1$s</xliff:g> سے منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی سمیت ای میلز، ایپس اور ویب سائٹس مانیٹر کر سکتی ہے۔"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"آپ <xliff:g id="APPLICATION">%1$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نجی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"آپ کا دفتری پروفائل <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔ یہ <xliff:g id="APPLICATION">%2$s</xliff:g> سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"آپ کا دفتری پروفائل <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔ یہ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nآپ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> سے بھی منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی کو مانیٹر کر سکتی ہے۔"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"آپ کا آلہ <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ <xliff:g id="APPLICATION">%2$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"گھڑی کے سیکنڈز اسٹیٹس بار میں دکھائیں۔ اس کا بیٹری کی زندگی پر اثر پڑ سکتا ہے۔"</string> <string name="qs_rearrange" msgid="8060918697551068765">"فوری ترتیبات کو دوبارہ ترتیب دیں"</string> <string name="show_brightness" msgid="6613930842805942519">"فوری ترتیبات میں چمکیلا پن دکھائیں"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"سپلٹ اسکرین کیلئے سوائپ اپ اشارہ فعال کریں"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"مجموعی جائزہ بٹن سے سوائپ اپ کرکے سپلٹ اسکرین میں داخل ہونے کیلئے اشارہ فعال کریں"</string> <string name="experimental" msgid="6198182315536726162">"تجرباتی"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"بلوٹوتھ آن کریں؟"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"اپنے کی بورڈ کو اپنے ٹیبلٹ کے ساتھ منسلک کرنے کیلئے پہلے آپ کو اپنا بلو ٹوتھ آن کرنا ہو گا۔"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index ac6194fecb0d..4e054cb7c42b 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Qurilma kuzatilishi mumkin"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Profil kuzatilishi mumkin"</string> <string name="vpn_footer" msgid="2388611096129106812">"Tarmoqni kuzatish mumkin"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Tarmoq kuzatilishi mumkin"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Qurilmalarni kuzatish"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Profilni kuzatish"</string> <string name="monitoring_title" msgid="169206259253048106">"Tarmoqlarni kuzatish"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirilgan. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Sizning ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. <xliff:g id="APPLICATION">%2$s</xliff:g> ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Sizning ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ilovasi ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ilovasi ham shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Qurilmangiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz <xliff:g id="APPLICATION">%2$s</xliff:g> ilovasiga ham ulangansiz. Ushbu ilova internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlar bilan ishlashingizni kuzata oladi.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Holat panelida soat soniyalari ko‘rsatilsin. Bu batareya resursiga ta’sir qilishi mumkin."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Tezkor sozlamalarni qayta tartiblash"</string> <string name="show_brightness" msgid="6613930842805942519">"Tezkor sozlamalarda yorqinlikni ko‘rsatish"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Tepaga surish orqali ekranni ikkiga bo‘lish"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Umumiy ma’lumot tugmasini tepaga surish orqali ekranni bo‘lish ishorasini yoqish"</string> <string name="experimental" msgid="6198182315536726162">"Tajribaviy"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bluetooth yoqilsinmi?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Klaviaturani planshetingizga ulash uchun Bluetooth xizmatini yoqishingiz kerak."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 930eebe9ad10..775f7ff22e66 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Thiết bị có thể được giám sát"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Hồ sơ có thể được giám sát"</string> <string name="vpn_footer" msgid="2388611096129106812">"Mạng có thể được giám sát"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Mạng có thể được giám sát"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Giám sát thiết bị"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Giám sát hồ sơ"</string> <string name="monitoring_title" msgid="169206259253048106">"Giám sát mạng"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Bạn đang kết nối với <xliff:g id="APPLICATION">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Bạn đang kết nối với <xliff:g id="APPLICATION">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Bạn đang kết nối với <xliff:g id="APPLICATION">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Hồ sơ công việc của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Hồ sơ được kết nối với <xliff:g id="APPLICATION">%2$s</xliff:g>, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Hồ sơ công việc của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Hồ sơ được kết nối với <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ứng dụng này có thể giám sát hoạt động mạng cơ quan của bạn, bao gồm email, ứng dụng và trang web.\n\nBạn cũng được kết nối với <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, có thể giám sát hoạt động mạng cá nhân của bạn."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Thiết bị của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với <xliff:g id="APPLICATION">%2$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Hiển thị giây đồng hồ trong thanh trạng thái. Có thể ảnh hưởng đến thời lượng pin."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Sắp xếp lại Cài đặt nhanh"</string> <string name="show_brightness" msgid="6613930842805942519">"Hiển thị độ sáng trong Cài đặt nhanh"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Bật cử chỉ vuốt lên ở chế độ chia đôi màn hình"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Cho phép cử chỉ truy cập chế độ chia đôi màn hình bằng cách vuốt lên từ nút Tổng quan"</string> <string name="experimental" msgid="6198182315536726162">"Thử nghiệm"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Bật Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Để kết nối bàn phím với máy tính bảng, trước tiên, bạn phải bật Bluetooth."</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 2548c4b2f4ee..c25acac23580 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"设备可能会受到监控"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"资料可能会受到监控"</string> <string name="vpn_footer" msgid="2388611096129106812">"网络可能会受到监控"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"网络可能会受到监控"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"设备监测"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"资料监控"</string> <string name="monitoring_title" msgid="169206259253048106">"网络监控"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"您已连接到<xliff:g id="APPLICATION">%1$s</xliff:g>,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"您已连接到<xliff:g id="APPLICATION">%1$s</xliff:g>,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"您已连接到<xliff:g id="APPLICATION">%1$s</xliff:g>,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"您的工作资料由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。您已连接到<xliff:g id="APPLICATION">%2$s</xliff:g>,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"您的工作资料由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。您已连接到<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n此外,您还连接到了<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,该应用可以监控您的个人网络活动。"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的设备由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到<xliff:g id="APPLICATION">%2$s</xliff:g>,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"在状态栏中显示时钟的秒数。这可能会影响电池的续航时间。"</string> <string name="qs_rearrange" msgid="8060918697551068765">"重新排列快捷设置"</string> <string name="show_brightness" msgid="6613930842805942519">"在快捷设置中显示亮度栏"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"启用分屏上滑手势"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"启用通过从“概览”按钮向上滑动的手势进入分屏模式"</string> <string name="experimental" msgid="6198182315536726162">"实验性功能"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"要开启蓝牙吗?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"要将您的键盘连接到平板电脑,您必须先开启蓝牙。"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index c0172b1cf7ff..7cd2d5d79913 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -406,6 +406,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"裝置可能會受到監控"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"個人檔案可能受到監控"</string> <string name="vpn_footer" msgid="2388611096129106812">"網絡可能會受到監控"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"網絡可能會受到監控"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"裝置監控"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"個人檔案監控"</string> <string name="monitoring_title" msgid="169206259253048106">"網絡監控"</string> @@ -418,6 +419,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"您已連結至<xliff:g id="APPLICATION">%1$s</xliff:g> ,它能夠監控您的網絡活動,包括電郵、應用程式和網站。"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"您已連結至<xliff:g id="APPLICATION">%1$s</xliff:g>,它能夠監控您的個人網絡活動,包括電郵、應用程式和網站。"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"您已連接至「<xliff:g id="APPLICATION">%1$s</xliff:g>」,此應用程式可以監控您的個人網絡活動,包括電郵、應用程式及網站。"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"您的工作設定檔由<xliff:g id="ORGANIZATION">%1$s</xliff:g>管理。它已連結至<xliff:g id="APPLICATION">%2$s</xliff:g>,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n如需進一步資訊,請聯絡您的管理員。"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"您的工作設定檔由<xliff:g id="ORGANIZATION">%1$s</xliff:g>管理。它已連結至<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>,能夠監控您的工作網絡活動,包括電郵、應用程式和網站。\n\n此外,您亦連結至<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,因此它亦能夠監控您的個人網絡活動。"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的裝置由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,您的裝置連至 <xliff:g id="APPLICATION">%2$s</xliff:g>,它能監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。"</string> @@ -494,8 +496,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"在狀態列中顯示時鐘秒數,但可能會影響電池壽命。"</string> <string name="qs_rearrange" msgid="8060918697551068765">"重新排列快速設定"</string> <string name="show_brightness" msgid="6613930842805942519">"在快速設定顯示亮度"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"啟用分割畫面向上快速滑動手勢"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"從 [概覽] 按鈕向上快速滑動,即可使用手勢功能進入分割畫面模式"</string> <string name="experimental" msgid="6198182315536726162">"實驗版"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"要開啟藍牙嗎?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連接至平板電腦,請先開啟藍牙。"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 66c126404d21..d7f6f704682f 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"裝置可能會受到監控"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"設定檔可能會受到監控"</string> <string name="vpn_footer" msgid="2388611096129106812">"網路可能會受到監控"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"網路可能會受到監控"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"裝置監控"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"設定檔監控"</string> <string name="monitoring_title" msgid="169206259253048106">"網路監控"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"由於您已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"由於您已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"由於你已連結至「<xliff:g id="APPLICATION">%1$s</xliff:g>」,你的個人網路活動 (包括收發電子郵件、使用應用程式及瀏覽網站) 可能會受到這個應用程式監控。"</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"您的 Work 設定檔是由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。由於設定檔已連線至 <xliff:g id="APPLICATION">%2$s</xliff:g>,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n詳情請洽您的管理員。"</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"您的 Work 設定檔是由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。由於設定檔已連線至 <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n同時由於您也連線至<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,您的個人網路活動也會受到這個應用程式監控。"</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的裝置由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 <xliff:g id="APPLICATION">%2$s</xliff:g>,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。"</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"在狀態列中顯示時鐘秒數。這可能會影響電池續航力。"</string> <string name="qs_rearrange" msgid="8060918697551068765">"重新排列快速設定"</string> <string name="show_brightness" msgid="6613930842805942519">"在快速設定中顯示亮度"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"啟用分割畫面向上滑動手勢"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"啟用透過從 [總覽] 按鈕向上滑動的手勢進入分割畫面"</string> <string name="experimental" msgid="6198182315536726162">"實驗性"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"要開啟藍牙功能嗎?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"如要將鍵盤連線到平板電腦,您必須先開啟藍牙。"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 49bf0bd0d502..72fb812c47bb 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -404,6 +404,7 @@ <string name="device_owned_footer" msgid="3802752663326030053">"Idivayisi inganganyelwa"</string> <string name="profile_owned_footer" msgid="8021888108553696069">"Iphrofayela ingaqashwa"</string> <string name="vpn_footer" msgid="2388611096129106812">"Inethiwekhi kungenzeka iqashiwe"</string> + <string name="branded_vpn_footer" msgid="2168111859226496230">"Inethiwekhi kungenzeka iqashiwe"</string> <string name="monitoring_title_device_owned" msgid="7121079311903859610">"Ukwengamela idivayisi"</string> <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"Ukuqapha iphrofayela"</string> <string name="monitoring_title" msgid="169206259253048106">"Ukuqashwa kwenethiwekhi"</string> @@ -416,6 +417,7 @@ <string name="legacy_vpn_name" msgid="6604123105765737830">"I-VPN"</string> <string name="monitoring_description_app" msgid="6259179342284742878">"Uxhumeke ku-<xliff:g id="APPLICATION">%1$s</xliff:g>, engahlola umsebenzi wakho wenethiwekhi ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> <string name="monitoring_description_app_personal" msgid="484599052118316268">"Uxhumeke ku-<xliff:g id="APPLICATION">%1$s</xliff:g>, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> + <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Uxhumeke ku-<xliff:g id="APPLICATION">%1$s</xliff:g>, engaqapha umsebenzi wakho womuntu siqu wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi."</string> <string name="monitoring_description_app_work" msgid="1754325860918060897">"Iphrofayela yakho yomsebenzi iphethwe yi-<xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ixhumeke ku-<xliff:g id="APPLICATION">%2$s</xliff:g>, engahlola umsebenzi wenethiwekhi yakho yokusebenza, ofaka ama-imeyili, izinhlelo zokusebenza, namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho."</string> <string name="monitoring_description_app_personal_work" msgid="4946600443852045903">"Iphrofayela yakho yomsebenzi iphethwe yi-<xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ixhumeke ku-<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, engahlola umsebenzi wenethiwekhi yakho yomsebenzi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nFuthi uxhumeke ku-<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, engahlola umsebenzi wenethiwekhi yakho yomuntu siqu."</string> <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Idivayisi yakho iphethwe yi-<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nUmqondisi wakho angaqaphela aphinde aphathe izilungiselelo, ukufinyelela kwezinkampani, izinhlelo zokusebenza, idatha ehlotshaniswa nedivayisi yakho, nolwazi lendawo yedivayisi yakho.\n\nUxhumeke ku-<xliff:g id="APPLICATION">%2$s</xliff:g>, engaqaphela umsebenzi wakho wenethiwekhi, ofaka ama-imeyili, izinhlelo zokusebenza namawebhusayithi.\n\nUkuze uthole olunye ulwazi, xhumana nomqondisi wakho."</string> @@ -492,8 +494,6 @@ <string name="clock_seconds_desc" msgid="6282693067130470675">"Bonisa amasekhondi wewashi kubha yesimo. Ingathinta impilo yebhethri."</string> <string name="qs_rearrange" msgid="8060918697551068765">"Hlela kabusha izilungiselelo ezisheshayo"</string> <string name="show_brightness" msgid="6613930842805942519">"Bonisa ukukhanya kuzilungiselelo ezisheshayo"</string> - <string name="overview_nav_bar_gesture" msgid="8579814204727917764">"Nika amandla ukuthinta kokuswayiphela phezulu ukuhlukanisa isikrini"</string> - <string name="overview_nav_bar_gesture_desc" msgid="6329167382305102615">"Nika amandla ukuthinta ukuze ungene ekuhlukaniseni isikrini ngokuswayiphela phezulu kusukela kunkinobho yokubuka konke"</string> <string name="experimental" msgid="6198182315536726162">"Okokulinga"</string> <string name="enable_bluetooth_title" msgid="5027037706500635269">"Vula i-Bluetooth?"</string> <string name="enable_bluetooth_message" msgid="9106595990708985385">"Ukuze uxhume ikhibhodi yakho nethebhulethi yakho, kufanele uqale ngokuvula i-Bluetooth."</string> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 6c48b25a93da..ca6297091737 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1001,6 +1001,9 @@ <!-- Footer vpn present text [CHAR LIMIT=50] --> <string name="vpn_footer">Network may be monitored</string> + <!-- Footer vpn present text [CHAR LIMIT=50] --> + <string name="branded_vpn_footer">Network may be monitored</string> + <!-- Monitoring dialog title for device owned devices [CHAR LIMIT=35] --> <string name="monitoring_title_device_owned">Device monitoring</string> @@ -1037,6 +1040,9 @@ <!-- Monitoring dialog text for single app (inside personal profile) [CHAR LIMIT=400] --> <string name="monitoring_description_app_personal">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps, and websites.</string> + <!-- Monitoring dialog text for single app (inside personal profile) [CHAR LIMIT=400] --> + <string name="branded_monitoring_description_app_personal">You\'re connected to <xliff:g id="application">%1$s</xliff:g>, which can monitor your personal network activity, including emails, apps, and websites.</string> + <!-- Monitoring dialog text for single app (inside work profile) [CHAR LIMIT=400] --> <string name="monitoring_description_app_work">Your work profile is managed by <xliff:g id="organization">%1$s</xliff:g>. It is connected to <xliff:g id="application">%2$s</xliff:g>, which can monitor your work network activity, including emails, apps, and websites.\n\nFor more information, contact your administrator.</string> @@ -1243,11 +1249,6 @@ <!-- Option to use new paging layout in quick settings [CHAR LIMIT=60] --> <string name="qs_paging" translatable="false">Use the new Quick Settings</string> - <!-- Toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=60]--> - <string name="overview_nav_bar_gesture">Enable split-screen swipe-up gesture</string> - <!-- Description for the toggle to enable the gesture to enter split-screen by swiping up from the Overview button. [CHAR LIMIT=NONE]--> - <string name="overview_nav_bar_gesture_desc">Enable gesture to enter split-screen by swiping up from the Overview button</string> - <!-- Category in the System UI Tuner settings, where new/experimental settings are --> <string name="experimental">Experimental</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 1ee13e96ecfe..c659acfaf14e 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -42,7 +42,7 @@ </style> <!-- Theme used for the activity that shows when the system forced an app to be resizable --> - <style name="ForcedResizableTheme" parent="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"> + <style name="ForcedResizableTheme" parent="@android:style/Theme.Translucent.NoTitleBar"> <item name="android:windowBackground">@drawable/forced_resizable_background</item> <item name="android:statusBarColor">@color/transparent</item> <item name="android:windowAnimationStyle">@style/Animation.ForcedResizable</item> @@ -217,7 +217,7 @@ <style name="Animation.StatusBar"> </style> - <style name="systemui_theme" parent="@android:style/Theme.DeviceDefault" /> + <style name="systemui_theme" parent="@*android:style/Theme.DeviceDefault.Settings.Dark" /> <style name="systemui_theme_remote_input" parent="@android:style/Theme.DeviceDefault.Light"> <item name="android:colorAccent">@color/remote_input_accent</item> diff --git a/packages/SystemUI/res/xml/other_settings.xml b/packages/SystemUI/res/xml/other_settings.xml index 3c872fa98bc7..ce636cdaf4fb 100644 --- a/packages/SystemUI/res/xml/other_settings.xml +++ b/packages/SystemUI/res/xml/other_settings.xml @@ -18,11 +18,6 @@ xmlns:sysui="http://schemas.android.com/apk/res-auto" android:title="@string/other"> - <com.android.systemui.tuner.TunerSwitch - android:key="overview_nav_bar_gesture" - android:title="@string/overview_nav_bar_gesture" - android:summary="@string/overview_nav_bar_gesture_desc" /> - <!-- importance --> <Preference android:key="power_notification_controls" diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index 84901ee67e71..b393cf7eb9d5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -90,10 +90,10 @@ public class KeyguardService extends Service { } @Override // Binder interface - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardService.mBinder#setOccluded"); checkPermission(); - mKeyguardViewMediator.setOccluded(isOccluded); + mKeyguardViewMediator.setOccluded(isOccluded, animate); Trace.endSection(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index de0c77b8a2d6..6103355a568e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -964,6 +964,7 @@ public class KeyguardViewMediator extends SystemUI { * if there is a secure lock pattern. */ public void onDreamingStarted() { + KeyguardUpdateMonitor.getInstance(mContext).dispatchDreamingStarted(); synchronized (this) { if (mDeviceInteractive && mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser())) { @@ -976,6 +977,7 @@ public class KeyguardViewMediator extends SystemUI { * A dream stopped. */ public void onDreamingStopped() { + KeyguardUpdateMonitor.getInstance(mContext).dispatchDreamingStopped(); synchronized (this) { if (mDeviceInteractive) { cancelDoKeyguardLaterLocked(); @@ -1114,11 +1116,11 @@ public class KeyguardViewMediator extends SystemUI { /** * Notify us when the keyguard is occluded by another window */ - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardViewMediator#setOccluded"); if (DEBUG) Log.d(TAG, "setOccluded " + isOccluded); mHandler.removeMessages(SET_OCCLUDED); - Message msg = mHandler.obtainMessage(SET_OCCLUDED, (isOccluded ? 1 : 0), 0); + Message msg = mHandler.obtainMessage(SET_OCCLUDED, isOccluded ? 1 : 0, animate ? 1 : 0); mHandler.sendMessage(msg); Trace.endSection(); } @@ -1126,7 +1128,7 @@ public class KeyguardViewMediator extends SystemUI { /** * Handles SET_OCCLUDED message sent by setOccluded() */ - private void handleSetOccluded(boolean isOccluded) { + private void handleSetOccluded(boolean isOccluded, boolean animate) { Trace.beginSection("KeyguardViewMediator#handleSetOccluded"); synchronized (KeyguardViewMediator.this) { if (mHiding && isOccluded) { @@ -1137,7 +1139,7 @@ public class KeyguardViewMediator extends SystemUI { if (mOccluded != isOccluded) { mOccluded = isOccluded; - mStatusBarKeyguardViewManager.setOccluded(isOccluded); + mStatusBarKeyguardViewManager.setOccluded(isOccluded, animate); updateActivityLockScreenState(); adjustStatusBarLocked(); } @@ -1468,7 +1470,7 @@ public class KeyguardViewMediator extends SystemUI { break; case SET_OCCLUDED: Trace.beginSection("KeyguardViewMediator#handleMessage SET_OCCLUDED"); - handleSetOccluded(msg.arg1 != 0); + handleSetOccluded(msg.arg1 != 0, msg.arg2 != 0); Trace.endSection(); break; case KEYGUARD_TIMEOUT: diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java index 15ae4ad6dac0..4ac629dc1da5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java @@ -120,11 +120,10 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene mFooterTextId = R.string.device_owned_footer; mIsVisible = true; } else { - mFooterTextId = R.string.vpn_footer; + boolean isBranded = mSecurityController.isVpnBranded(); + mFooterTextId = isBranded ? R.string.branded_vpn_footer : R.string.vpn_footer; // Update the VPN footer icon, if needed. - int footerIconId = (mSecurityController.isVpnBranded() - ? R.drawable.ic_qs_branded_vpn - : R.drawable.ic_qs_vpn); + int footerIconId = isBranded ? R.drawable.ic_qs_branded_vpn : R.drawable.ic_qs_vpn; if (mFooterIconId != footerIconId) { mFooterIconId = footerIconId; mMainHandler.post(mUpdateIcon); @@ -148,11 +147,15 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene String primaryVpn = mSecurityController.getPrimaryVpnName(); String profileVpn = mSecurityController.getProfileVpnName(); boolean managed = mSecurityController.hasProfileOwner(); + boolean isBranded = deviceOwner == null && mSecurityController.isVpnBranded(); mDialog = new SystemUIDialog(mContext); - mDialog.setTitle(getTitle(deviceOwner)); - mDialog.setMessage(getMessage(deviceOwner, profileOwner, primaryVpn, profileVpn, managed)); - mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this); + if (!isBranded) { + mDialog.setTitle(getTitle(deviceOwner)); + } + mDialog.setMessage(getMessage(deviceOwner, profileOwner, primaryVpn, profileVpn, managed, + isBranded)); + mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(isBranded), this); if (mSecurityController.isVpnEnabled() && !mSecurityController.isVpnRestricted()) { mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getSettingsButton(), this); } @@ -163,12 +166,12 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene return mContext.getString(R.string.status_bar_settings_settings_button); } - private String getPositiveButton() { - return mContext.getString(R.string.quick_settings_done); + private String getPositiveButton(boolean isBranded) { + return mContext.getString(isBranded ? android.R.string.ok : R.string.quick_settings_done); } private String getMessage(String deviceOwner, String profileOwner, String primaryVpn, - String profileVpn, boolean primaryUserIsManaged) { + String profileVpn, boolean primaryUserIsManaged, boolean isBranded) { // Show a special warning when the device has device owner, but -- // TODO See b/25779452 -- device owner doesn't actually have monitoring power. if (deviceOwner != null) { @@ -184,8 +187,12 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene return mContext.getString(R.string.monitoring_description_app_personal_work, profileOwner, profileVpn, primaryVpn); } else { - return mContext.getString(R.string.monitoring_description_app_personal, - primaryVpn); + if (isBranded) { + return mContext.getString(R.string.branded_monitoring_description_app_personal); + } else { + return mContext.getString(R.string.monitoring_description_app_personal, + primaryVpn); + } } } else if (profileVpn != null) { return mContext.getString(R.string.monitoring_description_app_work, diff --git a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl index 940366444e63..9214eef61df5 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl +++ b/packages/SystemUI/src/com/android/systemui/recents/IRecentsNonSystemUserCallbacks.aidl @@ -35,4 +35,5 @@ oneway interface IRecentsNonSystemUserCallbacks { in Rect initialBounds); void onDraggingInRecents(float distanceFromTop); void onDraggingInRecentsEnded(float velocity); + void showCurrentUserToast(int msgResId, int msgLength); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index e117bfeb1364..72074635999c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -18,10 +18,12 @@ package com.android.systemui.recents; import android.app.ActivityManager; import android.app.UiModeManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.res.Configuration; @@ -53,6 +55,7 @@ import com.android.systemui.recents.events.activity.DockedTopTaskEvent; import com.android.systemui.recents.events.activity.RecentsActivityStartingEvent; import com.android.systemui.recents.events.component.RecentsVisibilityChangedEvent; import com.android.systemui.recents.events.component.ScreenPinningRequestEvent; +import com.android.systemui.recents.events.component.ShowUserToastEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.model.RecentsTaskLoader; @@ -96,7 +99,7 @@ public class Recents extends SystemUI // and does not reside in the home stack. private String mOverrideRecentsPackageName; - private Handler mHandler; + private Handler mHandler = new Handler(); private RecentsImpl mImpl; private int mDraggingInRecentsCurrentUser; @@ -162,6 +165,20 @@ public class Recents extends SystemUI } }; + + private BroadcastReceiver mSystemUserUnlockedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) { + int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); + if (userId != UserHandle.USER_NULL) { + mImpl.onUserUnlocked(userId); + } + } + } + }; + + /** * Returns the callbacks interface that non-system users can call. */ @@ -191,7 +208,7 @@ public class Recents extends SystemUI sSystemServicesProxy = SystemServicesProxy.getInstance(mContext); sTaskLoader = new RecentsTaskLoader(mContext); sConfiguration = new RecentsConfiguration(mContext); - mHandler = new Handler(); + UiModeManager uiModeManager = (UiModeManager) mContext. getSystemService(Context.UI_MODE_SERVICE); if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { @@ -221,6 +238,12 @@ public class Recents extends SystemUI // For the system user, initialize an instance of the interface that we can pass to the // secondary user mSystemToUserCallbacks = new RecentsSystemUser(mContext, mImpl); + + // Listen for user-unlocked to kick off preloading recents + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_USER_UNLOCKED); + mContext.registerReceiverAsUser(mSystemUserUnlockedReceiver, UserHandle.SYSTEM, filter, + null /* permission */, null /* scheduler */); } else { // For the secondary user, bind to the primary user's service to get a persistent // interface to register its implementation and to later update its state @@ -455,8 +478,8 @@ public class Recents extends SystemUI mDraggingInRecentsCurrentUser = currentUser; return true; } else { - Toast.makeText(mContext, R.string.recents_incompatible_app_message, - Toast.LENGTH_SHORT).show(); + EventBus.getDefault().send(new ShowUserToastEvent( + R.string.recents_incompatible_app_message, Toast.LENGTH_SHORT)); return false; } } else { @@ -674,6 +697,27 @@ public class Recents extends SystemUI mImpl.onConfigurationChanged(); } + public final void onBusEvent(ShowUserToastEvent event) { + int currentUser = sSystemServicesProxy.getCurrentUser(); + if (sSystemServicesProxy.isSystemUser(currentUser)) { + mImpl.onShowCurrentUserToast(event.msgResId, event.msgLength); + } else { + if (mSystemToUserCallbacks != null) { + IRecentsNonSystemUserCallbacks callbacks = + mSystemToUserCallbacks.getNonSystemUserRecentsForUser(currentUser); + if (callbacks != null) { + try { + callbacks.showCurrentUserToast(event.msgResId, event.msgLength); + } catch (RemoteException e) { + Log.e(TAG, "Callback failed", e); + } + } else { + Log.e(TAG, "No SystemUI callbacks found for user: " + currentUser); + } + } + } + } + /** * Attempts to register with the system user. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index 2757fc4f5cc7..a7f271648e13 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -40,6 +40,7 @@ import android.view.LayoutInflater; import android.view.ViewConfiguration; import android.view.WindowManager; +import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.policy.DockedDividerUtils; import com.android.systemui.R; @@ -186,7 +187,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener reloadResources(); } - public void onBootCompleted() { + public void onUserUnlocked(int userId) { // When we start, preload the data associated with the previous recent tasks. // We can use a new plan since the caches will be the same. RecentsTaskLoader loader = Recents.getTaskLoader(); @@ -199,6 +200,10 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener loader.loadTasks(mContext, plan, launchOpts); } + public void onBootCompleted() { + // Do nothing + } + public void onConfigurationChanged() { reloadResources(); mDummyStackView.reloadOnConfigurationChange(); @@ -392,6 +397,10 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener EventBus.getDefault().sendOntoMainThread(new DraggingInRecentsEndedEvent(velocity)); } + public void onShowCurrentUserToast(int msgResId, int msgLength) { + Toast.makeText(mContext, msgResId, msgLength).show(); + } + /** * Transitions to the next recent task in the stack. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java index 60bf760bfb44..ff9e89e9e00b 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImplProxy.java @@ -38,6 +38,7 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub { private static final int MSG_DOCK_TOP_TASK = 7; private static final int MSG_ON_DRAGGING_IN_RECENTS = 8; private static final int MSG_ON_DRAGGING_IN_RECENTS_ENDED = 9; + private static final int MSG_SHOW_USER_TOAST = 10; private RecentsImpl mImpl; @@ -109,6 +110,11 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_DRAGGING_IN_RECENTS_ENDED, velocity)); } + @Override + public void showCurrentUserToast(int msgResId, int msgLength) { + mHandler.sendMessage(mHandler.obtainMessage(MSG_SHOW_USER_TOAST, msgResId, msgLength)); + } + private final Handler mHandler = new Handler() { @Override @@ -147,6 +153,9 @@ public class RecentsImplProxy extends IRecentsNonSystemUserCallbacks.Stub { case MSG_ON_DRAGGING_IN_RECENTS_ENDED: mImpl.onDraggingInRecentsEnded((Float) msg.obj); break; + case MSG_SHOW_USER_TOAST: + mImpl.onShowCurrentUserToast(msg.arg1, msg.arg2); + break; default: super.handleMessage(msg); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java new file mode 100644 index 000000000000..e2b39c39b586 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recents/events/component/ShowUserToastEvent.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.recents.events.component; + +import com.android.systemui.recents.events.EventBus; + +/** + * This is sent when we want to show a toast for the current user. + */ +public class ShowUserToastEvent extends EventBus.Event { + + public final int msgResId; + public final int msgLength; + + public ShowUserToastEvent(int msgResId, int msgLength) { + this.msgResId = msgResId; + this.msgLength = msgLength; + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java index 702b076d5aec..fce7f9d51ea4 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java @@ -1258,7 +1258,7 @@ public class TaskStackLayoutAlgorithm { String innerPrefix = prefix + " "; writer.print(prefix); writer.print(TAG); - writer.write(" numStackTasks="); writer.write(mNumStackTasks); + writer.write(" numStackTasks="); writer.print(mNumStackTasks); writer.println(); writer.print(innerPrefix); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java index 5f083d57f9ae..5920f46b12f6 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/ForcedResizableInfoActivityController.java @@ -20,12 +20,14 @@ import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.os.Handler; +import android.os.UserHandle; import android.util.ArraySet; import android.widget.Toast; import com.android.systemui.R; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.AppTransitionFinishedEvent; +import com.android.systemui.recents.events.component.ShowUserToastEvent; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener; import com.android.systemui.stackdivider.events.StartedDragingEvent; @@ -100,9 +102,8 @@ public class ForcedResizableInfoActivityController { } private void activityDismissingDockedStack() { - Toast toast = Toast.makeText(mContext, R.string.dock_non_resizeble_failed_to_dock_text, - Toast.LENGTH_SHORT); - toast.show(); + EventBus.getDefault().send(new ShowUserToastEvent( + R.string.dock_non_resizeble_failed_to_dock_text, Toast.LENGTH_SHORT)); } private void showPending() { @@ -112,7 +113,7 @@ public class ForcedResizableInfoActivityController { ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchTaskId(mPendingTaskIds.valueAt(i)); options.setTaskOverlay(true); - mContext.startActivity(intent, options.toBundle()); + mContext.startActivityAsUser(intent, options.toBundle(), UserHandle.CURRENT); } mPendingTaskIds.clear(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index a1854fa06562..b3a1893832e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1944,9 +1944,18 @@ public abstract class BaseStatusBar extends SystemUI implements .getIdentifier(); if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId) && mKeyguardManager.isDeviceLocked(userId)) { - if (startWorkChallengeIfNecessary(userId, - intent.getIntentSender(), notificationKey)) { - // Show work challenge, do not run pendingintent and + boolean canBypass = false; + try { + canBypass = ActivityManagerNative.getDefault() + .canBypassWorkChallenge(intent); + } catch (RemoteException e) { + } + // For direct-boot aware activities, they can be shown when + // the device is still locked without triggering the work + // challenge. + if ((!canBypass) && startWorkChallengeIfNecessary(userId, + intent.getIntentSender(), notificationKey)) { + // Show work challenge, do not run PendingIntent and // remove notification return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java index 2045ec8dfa2d..1d7bede962d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java @@ -56,6 +56,8 @@ public class DismissView extends StackScrollerDecorView { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDismissButton.setText(R.string.clear_all_notifications_text); + mDismissButton.setContentDescription( + mContext.getString(R.string.accessibility_clear_all)); } public boolean isButtonVisible() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 02fdd3fc6424..caf5447d9d26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -507,7 +507,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { int intrinsicHeight = getIntrinsicHeight(); mIsPinned = pinned; if (intrinsicHeight != getIntrinsicHeight()) { - notifyHeightChanged(false); + notifyHeightChanged(false /* needsAnimation */); } if (pinned) { setIconAnimationRunning(true); @@ -840,8 +840,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } public void resetHeight() { - mMaxExpandHeight = 0; - mHeadsUpHeight = 0; onHeightReset(); requestLayout(); } @@ -907,6 +905,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } public void resetTranslation() { + if (mTranslateAnim != null) { + mTranslateAnim.cancel(); + } if (mTranslateableViews != null) { for (int i = 0; i < mTranslateableViews.size(); i++) { mTranslateableViews.get(i).setTranslationX(0); @@ -1290,7 +1291,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } mHeadsUpHeight = headsUpChild.getHeight(); if (intrinsicBefore != getIntrinsicHeight()) { - notifyHeightChanged(false /* needsAnimation */); + notifyHeightChanged(true /* needsAnimation */); } } @@ -1398,7 +1399,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { if (isChildInGroup()) { mGroupManager.setGroupExpanded(mStatusBarNotification, true); } - notifyHeightChanged(false); + notifyHeightChanged(false /* needsAnimation */); } public void setChildrenExpanded(boolean expanded, boolean animate) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java index 88f37a320926..8b4225a8ab0b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java @@ -174,7 +174,10 @@ public class KeyguardAffordanceView extends ImageView { private void drawBackgroundCircle(Canvas canvas) { if (mCircleRadius > 0 || mFinishing) { - if (mFinishing && mSupportHardware) { + if (mFinishing && mSupportHardware && mHwCenterX != null) { + // Our hardware drawing proparties can be null if the finishing started but we have + // never drawn before. In that case we are not doing a render thread animation + // anyway, so we need to use the normal drawing. DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; displayListCanvas.drawCircle(mHwCenterX, mHwCenterY, mHwCircleRadius, mHwCirclePaint); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 6d73ccb21823..cf962df64dd9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -93,8 +93,10 @@ public class KeyguardIndicationController { ServiceManager.getService(BatteryStats.SERVICE_NAME)); KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitor); - context.registerReceiverAsUser(mReceiver, UserHandle.SYSTEM, + context.registerReceiverAsUser(mTickReceiver, UserHandle.SYSTEM, new IntentFilter(Intent.ACTION_TIME_TICK), null, null); + context.registerReceiverAsUser(mUnlockReceiver, UserHandle.ALL, + new IntentFilter(Intent.ACTION_USER_UNLOCKED), null, null); } public void setVisible(boolean visible) { @@ -322,7 +324,16 @@ public class KeyguardIndicationController { } }; - BroadcastReceiver mReceiver = new BroadcastReceiver() { + BroadcastReceiver mTickReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mVisible) { + updateIndication(); + } + } + }; + + BroadcastReceiver mUnlockReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (mVisible) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index 9fd09d92162c..78e56c04ce9b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -205,7 +205,7 @@ public class NotificationContentView extends FrameLayout { && MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED) { singleLineWidthSpec = MeasureSpec.makeMeasureSpec( width - mSingleLineWidthIndention + mSingleLineView.getPaddingEnd(), - MeasureSpec.AT_MOST); + MeasureSpec.EXACTLY); } mSingleLineView.measure(singleLineWidthSpec, MeasureSpec.makeMeasureSpec(maxSize, MeasureSpec.AT_MOST)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 93ed1398c2a6..41b0bb2c59ad 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -308,6 +308,7 @@ public class KeyguardStatusBarView extends RelativeLayout super.setVisibility(visibility); if (visibility != View.VISIBLE) { mSystemIconsSuperContainer.animate().cancel(); + mSystemIconsSuperContainer.setTranslationX(0); mMultiUserSwitch.animate().cancel(); mMultiUserSwitch.setAlpha(1f); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java index f98b9e586a1c..df4566b28d8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightStatusBarController.java @@ -27,7 +27,7 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARE /** * Controls how light status bar flag applies to the icons. */ -public class LightStatusBarController { +public class LightStatusBarController implements BatteryController.BatteryStateChangeCallback { private final StatusBarIconController mIconController; private final BatteryController mBatteryController; @@ -37,6 +37,7 @@ public class LightStatusBarController { private int mDockedStackVisibility; private boolean mFullscreenLight; private boolean mDockedLight; + private int mLastStatusBarMode; private final Rect mLastFullscreenBounds = new Rect(); private final Rect mLastDockedBounds = new Rect(); @@ -45,6 +46,7 @@ public class LightStatusBarController { BatteryController batteryController) { mIconController = iconController; mBatteryController = batteryController; + batteryController.addStateChangedCallback(this); } public void setFingerprintUnlockController( @@ -73,6 +75,7 @@ public class LightStatusBarController { } mFullscreenStackVisibility = newFullscreen; mDockedStackVisibility = newDocked; + mLastStatusBarMode = statusBarMode; mLastFullscreenBounds.set(fullscreenStackBounds); mLastDockedBounds.set(dockedStackBounds); } @@ -123,4 +126,16 @@ public class LightStatusBarController { mIconController.setIconsDark(true, animateChange()); } } + + @Override + public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { + + } + + @Override + public void onPowerSaveChanged(boolean isPowerSave) { + onSystemUiVisibilityChanged(mFullscreenStackVisibility, mDockedStackVisibility, + 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds, true /* sbModeChange*/, + mLastStatusBarMode); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java index af851014f04d..a6a5742e240c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -92,6 +92,7 @@ public abstract class PanelView extends FrameLayout { * Whether an instant expand request is currently pending and we are just waiting for layout. */ private boolean mInstantExpanding; + private boolean mAnimateAfterExpanding; PanelBar mBar; @@ -656,7 +657,7 @@ public abstract class PanelView extends FrameLayout { vel = 0; } mFlingAnimationUtils.apply(animator, mExpandedHeight, target, vel, getHeight()); - if (expandBecauseOfFalsing) { + if (vel == 0) { animator.setDuration(350); } } else { @@ -870,6 +871,7 @@ public abstract class PanelView extends FrameLayout { } mInstantExpanding = true; + mAnimateAfterExpanding = animate; mUpdateFlingOnLayout = false; abortAnimations(); cancelPeek(); @@ -894,7 +896,7 @@ public abstract class PanelView extends FrameLayout { if (mStatusBar.getStatusBarWindow().getHeight() != mStatusBar.getStatusBarHeight()) { getViewTreeObserver().removeOnGlobalLayoutListener(this); - if (animate) { + if (mAnimateAfterExpanding) { notifyExpandingStarted(); fling(0, true /* expand */); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 96fb7a8172d0..9251f32099a7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -279,6 +279,14 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, */ private static final int REMOTE_INPUT_KEPT_ENTRY_AUTO_CANCEL_DELAY = 200; + /** + * Never let the alpha become zero for surfaces that draw with SRC - otherwise the RenderNode + * won't draw anything and uninitialized memory will show through + * if mScrimSrcModeEnabled. Note that 0.001 is rounded down to 0 in + * libhwui. + */ + private static final float SRC_MIN_ALPHA = 0.002f; + static { boolean onlyCoreApps; boolean freeformWindowManagement; @@ -656,6 +664,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private boolean mNoAnimationOnNextBarModeChange; private FalsingManager mFalsingManager; + private KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { + @Override + public void onDreamingStateChanged(boolean dreaming) { + if (dreaming) { + maybeEscalateHeadsUp(); + } + } + }; + @Override public void start() { mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)) @@ -693,8 +710,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mUnlockMethodCache.addListener(this); startKeyguard(); + KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateCallback); mDozeServiceHost = new DozeServiceHost(); - KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mDozeServiceHost); putComponent(DozeHost.class, mDozeServiceHost); putComponent(PhoneStatusBar.class, this); @@ -2209,17 +2226,13 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, if (mBackdrop.getVisibility() != View.VISIBLE) { mBackdrop.setVisibility(View.VISIBLE); if (allowEnterAnimation) { - mBackdrop.animate().alpha(1f).withEndAction(new Runnable() { - @Override - public void run() { - mStatusBarWindowManager.setBackdropShowing(true); - } - }); + mBackdrop.setAlpha(SRC_MIN_ALPHA); + mBackdrop.animate().alpha(1f); } else { mBackdrop.animate().cancel(); mBackdrop.setAlpha(1f); - mStatusBarWindowManager.setBackdropShowing(true); } + mStatusBarWindowManager.setBackdropShowing(true); metaDataChanged = true; if (DEBUG_MEDIA) { Log.v(TAG, "DEBUG_MEDIA: Fading in album artwork"); @@ -2282,11 +2295,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } else { mStatusBarWindowManager.setBackdropShowing(false); mBackdrop.animate() - // Never let the alpha become zero - otherwise the RenderNode - // won't draw anything and uninitialized memory will show through - // if mScrimSrcModeEnabled. Note that 0.001 is rounded down to 0 in - // libhwui. - .alpha(0.002f) + .alpha(SRC_MIN_ALPHA) .setInterpolator(Interpolators.ACCELERATE_DECELERATE) .setDuration(300) .setStartDelay(0) @@ -2301,7 +2310,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, }); if (mKeyguardFadingAway) { mBackdrop.animate() - // Make it disappear faster, as the focus should be on the activity // behind. .setDuration(mKeyguardFadingAwayDuration / 2) @@ -4120,6 +4128,15 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } /** + * Plays the animation when an activity that was occluding Keyguard goes away. + */ + public void animateKeyguardUnoccluding() { + mScrimController.animateKeyguardUnoccluding(500); + mNotificationPanel.setExpandedFraction(0f); + animateExpandNotificationsPanel(); + } + + /** * Starts the timeout when we try to start the affordances on Keyguard. We usually rely that * Keyguard goes away via fadeKeyguardAfterLaunchTransition, however, that might not happen * because the launched app crashed or something else went wrong. @@ -4437,6 +4454,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } if (state == StatusBarState.KEYGUARD) { removeRemoteInputEntriesKeptUntilCollapsed(); + maybeEscalateHeadsUp(); } mState = state; mGroupManager.setStatusBarState(state); @@ -4956,7 +4974,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } - private final class DozeServiceHost extends KeyguardUpdateMonitorCallback implements DozeHost { + private final class DozeServiceHost implements DozeHost { // Amount of time to allow to update the time shown on the screen before releasing // the wakelock. This timeout is design to compensate for the fact that we don't // currently have a way to know when time display contents have actually been diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 8b87a7fa1596..35e084db9cd7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -176,7 +176,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mSkipFirstFrame = skipFirstFrame; mOnAnimationFinished = onAnimationFinished; - if (mKeyguardUpdateMonitor.isUserUnlocked()) { + if (!mKeyguardUpdateMonitor.needsSlowUnlockTransition()) { scheduleUpdate(); // No need to wait for the next frame to be drawn for this case - onPreDraw will execute @@ -196,6 +196,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } } + public void animateKeyguardUnoccluding(long duration) { + mAnimateChange = false; + setScrimBehindColor(0f); + mAnimateChange = true; + scheduleUpdate(); + mDurationOverride = duration; + } + public void animateGoingToFullShade(long delay, long duration) { mDurationOverride = duration; mAnimationDelay = delay; @@ -233,9 +241,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } private float getScrimInFrontAlpha() { - return mKeyguardUpdateMonitor.isUserUnlocked() - ? SCRIM_IN_FRONT_ALPHA - : SCRIM_IN_FRONT_ALPHA_LOCKED; + return mKeyguardUpdateMonitor.needsSlowUnlockTransition() + ? SCRIM_IN_FRONT_ALPHA_LOCKED + : SCRIM_IN_FRONT_ALPHA; } private void scheduleUpdate() { if (mUpdatePending) return; @@ -397,7 +405,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, } private Interpolator getInterpolator() { - if (mAnimateKeyguardFadingOut && !mKeyguardUpdateMonitor.isUserUnlocked()) { + if (mAnimateKeyguardFadingOut && mKeyguardUpdateMonitor.needsSlowUnlockTransition()) { return KEYGUARD_FADE_OUT_INTERPOLATOR_LOCKED; } else if (mAnimateKeyguardFadingOut) { return KEYGUARD_FADE_OUT_INTERPOLATOR; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index c72f994cf5a8..664e1030d8a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -242,7 +242,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb return mStatusBarWindowManager.isShowingWallpaper(); } - public void setOccluded(boolean occluded) { + public void setOccluded(boolean occluded, boolean animate) { if (occluded && !mOccluded && mShowing) { if (mPhoneStatusBar.isInLaunchTransition()) { mOccluded = true; @@ -258,9 +258,12 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } } mOccluded = occluded; - mPhoneStatusBar.updateMediaMetaData(false, false); + mPhoneStatusBar.updateMediaMetaData(false, animate && !occluded); mStatusBarWindowManager.setKeyguardOccluded(occluded); reset(); + if (animate && !occluded) { + mPhoneStatusBar.animateKeyguardUnoccluding(); + } } public boolean isOccluded() { @@ -288,7 +291,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb public void hide(long startTime, long fadeoutDuration) { mShowing = false; - if (!KeyguardUpdateMonitor.getInstance(mContext).isUserUnlocked()) { + if (KeyguardUpdateMonitor.getInstance(mContext).needsSlowUnlockTransition()) { fadeoutDuration = KEYGUARD_DISMISS_DURATION_LOCKED; } long uptimeMillis = SystemClock.uptimeMillis(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java index d3ae54984e99..f6c0942d7ed0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java @@ -381,7 +381,7 @@ public class HeadsUpManager implements ViewTreeObserver.OnComputeInternalInsetsL } public void onComputeInternalInsets(ViewTreeObserver.InternalInsetsInfo info) { - if (mIsExpanded) { + if (mIsExpanded || mBar.isBouncerShowing()) { // The touchable region is always the full area when expanded return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java index 61bac2d8d3c4..e6066aaa4c31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java @@ -59,6 +59,7 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI private AudioManager mAudioManager; private boolean mGestureAborted; private boolean mLongClicked; + private OnClickListener mOnClickListener; private final Runnable mCheckLongPress = new Runnable() { public void run() { @@ -109,6 +110,12 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI mCode = code; } + @Override + public void setOnClickListener(OnClickListener onClickListener) { + super.setOnClickListener(onClickListener); + mOnClickListener = onClickListener; + } + public void loadAsync(String uri) { new AsyncTask<String, Void, Drawable>() { @Override @@ -190,6 +197,7 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI // Provide the same haptic feedback that the system offers for virtual keys. performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); } + playSoundEffect(SoundEffectConstants.CLICK); removeCallbacks(mCheckLongPress); postDelayed(mCheckLongPress, ViewConfiguration.getLongPressTimeout()); break; @@ -215,14 +223,14 @@ public class KeyButtonView extends ImageView implements ButtonDispatcher.ButtonI if (doIt) { sendEvent(KeyEvent.ACTION_UP, 0); sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); - playSoundEffect(SoundEffectConstants.CLICK); } else { sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_CANCELED); } } else { // no key code, just a regular ImageView - if (doIt) { - performClick(); + if (doIt && mOnClickListener != null) { + mOnClickListener.onClick(this); + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); } } removeCallbacks(mCheckLongPress); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index cdd452fe300d..ab2a8bc6e92b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -38,6 +38,7 @@ import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; @@ -86,6 +87,8 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene private int mRevealCy; private int mRevealR; + private boolean mResetting; + public RemoteInputView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -281,6 +284,8 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene } private void reset() { + mResetting = true; + mEditText.getText().clear(); mEditText.setEnabled(true); mSendButton.setVisibility(VISIBLE); @@ -288,6 +293,19 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene mController.removeSpinning(mEntry.key); updateSendButton(); onDefocus(false /* animate */); + + mResetting = false; + } + + @Override + public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { + if (mResetting && child == mEditText) { + // Suppress text events if it happens during resetting. Ideally this would be + // suppressed by the text view not being shown, but that doesn't work here because it + // needs to stay visible for the animation. + return false; + } + return super.onRequestSendAccessibilityEvent(child, event); } private void updateSendButton() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index 3c9373bd46a2..d7920a9b1e7b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -123,8 +123,10 @@ public class NotificationChildrenContainer extends ViewGroup { mDividers.get(i).layout(0, 0, getWidth(), mDividerHeight); } if (mOverflowNumber != null) { - mOverflowNumber.layout(getWidth() - mOverflowNumber.getMeasuredWidth(), 0, getWidth(), - mOverflowNumber.getMeasuredHeight()); + boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; + int left = (isRtl ? 0 : getWidth() - mOverflowNumber.getMeasuredWidth()); + int right = left + mOverflowNumber.getMeasuredWidth(); + mOverflowNumber.layout(left, 0, right, mOverflowNumber.getMeasuredHeight()); } if (mNotificationHeader != null) { mNotificationHeader.layout(0, 0, mNotificationHeader.getMeasuredWidth(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index c8c43101c90f..5f4bd1d7c240 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -216,7 +216,6 @@ public class NotificationStackScrollLayout extends ViewGroup private float mTopPaddingOverflow; private boolean mDontReportNextOverScroll; private boolean mDontClampNextScroll; - private boolean mRequestViewResizeAnimationOnLayout; private boolean mNeedViewResizeAnimation; private View mExpandedGroupView; private boolean mEverythingNeedsAnimation; @@ -518,10 +517,6 @@ public class NotificationStackScrollLayout extends ViewGroup setMaxLayoutHeight(getHeight()); updateContentHeight(); clampScrollPosition(); - if (mRequestViewResizeAnimationOnLayout) { - requestAnimationOnViewResize(null); - mRequestViewResizeAnimationOnLayout = false; - } requestChildrenUpdate(); updateFirstAndLastBackgroundViews(); } @@ -1966,9 +1961,9 @@ public class NotificationStackScrollLayout extends ViewGroup } private void applyCurrentBackgroundBounds() { - if (!mFadingOut) { - mScrimController.setExcludedBackgroundArea(mCurrentBounds); - } + mScrimController.setExcludedBackgroundArea( + mFadingOut || mParentFadingOut || mAmbientState.isDark() ? null + : mCurrentBounds); invalidate(); } @@ -3104,9 +3099,6 @@ public class NotificationStackScrollLayout extends ViewGroup @Override public void onReset(ExpandableView view) { - if (mIsExpanded && mAnimationsEnabled) { - mRequestViewResizeAnimationOnLayout = true; - } updateAnimationState(view); updateChronometerForChild(view); } @@ -3847,11 +3839,7 @@ public class NotificationStackScrollLayout extends ViewGroup } private void updateFadingState() { - if (mFadingOut || mParentFadingOut || mAmbientState.isDark()) { - mScrimController.setExcludedBackgroundArea(null); - } else { - applyCurrentBackgroundBounds(); - } + applyCurrentBackgroundBounds(); updateSrcDrawing(); } @@ -3912,6 +3900,7 @@ public class NotificationStackScrollLayout extends ViewGroup private class NotificationSwipeHelper extends SwipeHelper { private static final long SHOW_GEAR_DELAY = 60; private static final long COVER_GEAR_DELAY = 4000; + private static final long SWIPE_GEAR_TIMING = 200; private CheckForDrag mCheckForDrag; private Runnable mFalsingCheck; private Handler mHandler; @@ -4028,6 +4017,9 @@ public class NotificationStackScrollLayout extends ViewGroup boolean gestureTowardsGear = isTowardsGear(velocity, mCurrIconRow.isIconOnLeft()); boolean gestureFastEnough = Math.abs(velocity) > getEscapeVelocity(); + final double timeForGesture = ev.getEventTime() - ev.getDownTime(); + final boolean showGearForSlowOnGoing = !canChildBeDismissed(animView) + && timeForGesture >= SWIPE_GEAR_TIMING; if (mGearSnappedTo && mCurrIconRow.isVisible()) { if (mGearSnappedOnLeft == mCurrIconRow.isIconOnLeft()) { @@ -4052,7 +4044,8 @@ public class NotificationStackScrollLayout extends ViewGroup } else { dismissOrSnapBack(animView, velocity, ev); } - } else if ((!gestureFastEnough && swipedEnoughToShowGear(animView)) + } else if (((!gestureFastEnough || showGearForSlowOnGoing) + && swipedEnoughToShowGear(animView)) || gestureTowardsGear) { // Gear has not been snapped to previously and this is gear revealing gesture snapToGear(animView, velocity); @@ -4104,13 +4097,9 @@ public class NotificationStackScrollLayout extends ViewGroup final float multiplier = canChildBeDismissed(animView) ? 0.4f : 0.2f; final float snapBackThreshold = getSpaceForGear(animView) * multiplier; final float translation = getTranslation(animView); - final boolean fromLeft = translation > 0; - final float absTrans = Math.abs(translation); - final float notiThreshold = getSize(mTranslatingParentView) * 0.4f; - - return mCurrIconRow.isVisible() && (mCurrIconRow.isIconOnLeft() - ? (translation > snapBackThreshold && translation <= notiThreshold) - : (translation < -snapBackThreshold && translation >= -notiThreshold)); + return !swipedFarEnough() && mCurrIconRow.isVisible() && (mCurrIconRow.isIconOnLeft() + ? translation > snapBackThreshold + : translation < -snapBackThreshold); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java index 5e4854c24387..3f8650a5e116 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java @@ -78,6 +78,18 @@ public class PipManager { sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( "com.google.android.leanbacklauncher", "com.google.android.leanbacklauncher.settings.HomeScreenSettingsActivity")); + sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( + "com.google.android.apps.mediashell", + "com.google.android.apps.mediashell.settings.CastSettingsActivity")); + sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( + "com.google.android.katniss", + "com.google.android.katniss.setting.SpeechSettingsActivity")); + sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( + "com.google.android.katniss", + "com.google.android.katniss.setting.SearchSettingsActivity")); + sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( + "com.google.android.gsf.notouch", + "com.google.android.gsf.notouch.UsageDiagnosticsSettingActivity")); } /** diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk index c9c58050f367..d122cccfb74c 100644 --- a/packages/SystemUI/tests/Android.mk +++ b/packages/SystemUI/tests/Android.mk @@ -58,6 +58,42 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ # UI it doesn't own. This is necessary to allow screenshots to be taken LOCAL_CERTIFICATE := platform +# Provide jack a list of classes to exclude from code coverage. +# This is needed because the SystemUITests compile SystemUI source directly, rather than using +# LOCAL_INSTRUMENTATION_FOR := SystemUI. +# +# We want to exclude the test classes from code coverage measurements, but they share the same +# package as the rest of SystemUI so they can't be easily filtered by package name. +# +# Generate a comma separated list of patterns based on the test source files under src/ +# SystemUI classes are in ../src/ so they won't be excluded. +# Example: +# Input files: src/com/android/systemui/Test.java src/com/android/systemui/AnotherTest.java +# Generated exclude list: com.android.systemui.Test*,com.android.systemui.AnotherTest* + +# Filter all src files under src/ to just java files +local_java_files := $(filter %.java,$(call all-java-files-under, src)) +# Transform java file names into full class names. +# This only works if the class name matches the file name and the directory structure +# matches the package. +local_classes := $(subst /,.,$(patsubst src/%.java,%,$(local_java_files))) +local_comma := , +local_empty := +local_space := $(local_empty) $(local_empty) +# Convert class name list to jacoco exclude list +# This appends a * to all classes and replace the space separators with commas. +jacoco_exclude := $(subst $(space),$(comma),$(patsubst %,%*,$(local_classes))) + +LOCAL_JACK_COVERAGE_INCLUDE_FILTER := com.android.systemui.* +LOCAL_JACK_COVERAGE_EXCLUDE_FILTER := com.android.systemui.tests.*,$(jacoco_exclude) + include frameworks/base/packages/SettingsLib/common.mk include $(BUILD_PACKAGE) + +# Reset variables +local_java_files := +local_classes := +local_comma := +local_space := +jacoco_exclude := diff --git a/packages/VpnDialogs/res/values-ro/strings.xml b/packages/VpnDialogs/res/values-ro/strings.xml index 4865e964fc74..e2e1e44021b0 100644 --- a/packages/VpnDialogs/res/values-ro/strings.xml +++ b/packages/VpnDialogs/res/values-ro/strings.xml @@ -25,5 +25,5 @@ <string name="duration" msgid="3584782459928719435">"Durată:"</string> <string name="data_transmitted" msgid="7988167672982199061">"Trimise:"</string> <string name="data_received" msgid="4062776929376067820">"Primite:"</string> - <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> (de) octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g> (de) pachete"</string> + <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> octeți/<xliff:g id="NUMBER_1">%2$s</xliff:g> pachete"</string> </resources> diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 5099db775d60..8a0dfe51189f 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -2207,7 +2207,12 @@ message MetricsEvent { // CATEGORY: SETTINGS ACTION_AMBIENT_DISPLAY = 495; + // ACTION: Settings -> [sub settings activity] -> Options menu -> Help & Support + // SUBTYPE: sub settings classname + ACTION_SETTING_HELP_AND_FEEDBACK = 496; + // ---- End N-MR1 Constants, all N-MR1 constants go above this line ---- + // Add new aosp constants above this line. // END OF AOSP CONSTANTS } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 695ea606a90b..8dca14f13202 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2208,6 +2208,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { AccessibilityServiceInfo mAccessibilityServiceInfo; + // The service that's bound to this instance. Whenever this value is non-null, this + // object is registered as a death recipient IBinder mService; IAccessibilityServiceClient mServiceInterface; @@ -2342,14 +2344,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } else { userState.mBindingServices.add(mComponentName); - mService = userState.mUiAutomationServiceClient.asBinder(); mMainHandler.post(new Runnable() { @Override public void run() { // Simulate asynchronous connection since in onServiceConnected // we may modify the state data in case of an error but bind is // called while iterating over the data and bad things can happen. - onServiceConnected(mComponentName, mService); + onServiceConnected(mComponentName, + userState.mUiAutomationServiceClient.asBinder()); } }); userState.mUiAutomationService = this; @@ -2441,7 +2443,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { @Override public void onServiceConnected(ComponentName componentName, IBinder service) { synchronized (mLock) { - mService = service; + if (mService != service) { + if (mService != null) { + mService.unlinkToDeath(this, 0); + } + mService = service; + try { + mService.linkToDeath(this, 0); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Failed registering death link"); + binderDied(); + return; + } + } mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service); UserState userState = getUserStateLocked(mUserId); addServiceLocked(this, userState); @@ -3075,7 +3089,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } public void onAdded() throws RemoteException { - linkToOwnDeathLocked(); final long identity = Binder.clearCallingIdentity(); try { mWindowManagerService.addWindowToken(mOverlayWindowToken, @@ -3092,17 +3105,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } finally { Binder.restoreCallingIdentity(identity); } - unlinkToOwnDeathLocked(); - } - - public void linkToOwnDeathLocked() throws RemoteException { - mService.linkToDeath(this, 0); - } - - public void unlinkToOwnDeathLocked() { - if (mService != null) { - mService.unlinkToDeath(this, 0); - } } public void resetLocked() { @@ -3115,7 +3117,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } catch (RemoteException re) { /* ignore */ } - mService = null; + if (mService != null) { + mService.unlinkToDeath(this, 0); + mService = null; + } mServiceInterface = null; } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 9d3889b3bdf7..b5fcb5cb6a3b 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -2266,6 +2266,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku pw.print(info.updatePeriodMillis); pw.print(" resizeMode="); pw.print(info.resizeMode); + pw.print(" widgetCategory="); pw.print(info.widgetCategory); pw.print(" autoAdvanceViewId="); pw.print(info.autoAdvanceViewId); diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index b5b0cd86f397..4caeba84b202 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -875,7 +875,7 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_IGNORED; } synchronized (this) { - if (isOpRestricted(uid, code, resolvedPackageName)) { + if (isOpRestrictedLocked(uid, code, resolvedPackageName)) { return AppOpsManager.MODE_IGNORED; } code = AppOpsManager.opToSwitch(code); @@ -1024,7 +1024,7 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_ERRORED; } Op op = getOpLocked(ops, code, true); - if (isOpRestricted(uid, code, packageName)) { + if (isOpRestrictedLocked(uid, code, packageName)) { return AppOpsManager.MODE_IGNORED; } if (op.duration == -1) { @@ -1082,7 +1082,7 @@ public class AppOpsService extends IAppOpsService.Stub { return AppOpsManager.MODE_ERRORED; } Op op = getOpLocked(ops, code, true); - if (isOpRestricted(uid, code, resolvedPackageName)) { + if (isOpRestrictedLocked(uid, code, resolvedPackageName)) { return AppOpsManager.MODE_IGNORED; } final int switchCode = AppOpsManager.opToSwitch(code); @@ -1308,7 +1308,7 @@ public class AppOpsService extends IAppOpsService.Stub { return op; } - private boolean isOpRestricted(int uid, int code, String packageName) { + private boolean isOpRestrictedLocked(int uid, int code, String packageName) { int userHandle = UserHandle.getUserId(uid); final int restrictionSetCount = mOpUserRestrictions.size(); @@ -2210,24 +2210,32 @@ public class AppOpsService extends IAppOpsService.Stub { private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token, int userHandle, String[] exceptionPackages) { - ClientRestrictionState restrictionState = mOpUserRestrictions.get(token); + boolean notifyChange = false; - if (restrictionState == null) { - try { - restrictionState = new ClientRestrictionState(token); - } catch (RemoteException e) { - return; + synchronized (AppOpsService.this) { + ClientRestrictionState restrictionState = mOpUserRestrictions.get(token); + + if (restrictionState == null) { + try { + restrictionState = new ClientRestrictionState(token); + } catch (RemoteException e) { + return; + } + mOpUserRestrictions.put(token, restrictionState); } - mOpUserRestrictions.put(token, restrictionState); - } - if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) { - notifyWatchersOfChange(code); + if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) { + notifyChange = true; + } + + if (restrictionState.isDefault()) { + mOpUserRestrictions.remove(token); + restrictionState.destroy(); + } } - if (restrictionState.isDefault()) { - mOpUserRestrictions.remove(token); - restrictionState.destroy(); + if (notifyChange) { + notifyWatchersOfChange(code); } } @@ -2263,10 +2271,12 @@ public class AppOpsService extends IAppOpsService.Stub { @Override public void removeUser(int userHandle) throws RemoteException { checkSystemUid("removeUser"); - final int tokenCount = mOpUserRestrictions.size(); - for (int i = tokenCount - 1; i >= 0; i--) { - ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i); - opRestrictions.removeUser(userHandle); + synchronized (AppOpsService.this) { + final int tokenCount = mOpUserRestrictions.size(); + for (int i = tokenCount - 1; i >= 0; i--) { + ClientRestrictionState opRestrictions = mOpUserRestrictions.valueAt(i); + opRestrictions.removeUser(userHandle); + } } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 8c5887f7a514..89fdfaf30559 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -293,7 +293,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { */ private final boolean isBluetoothPersistedStateOn() { return Settings.Global.getInt(mContentResolver, - Settings.Global.BLUETOOTH_ON, 0) != BLUETOOTH_OFF; + Settings.Global.BLUETOOTH_ON, BLUETOOTH_ON_BLUETOOTH) != BLUETOOTH_OFF; } /** @@ -301,7 +301,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { */ private final boolean isBluetoothPersistedStateOnBluetooth() { return Settings.Global.getInt(mContentResolver, - Settings.Global.BLUETOOTH_ON, 0) == BLUETOOTH_ON_BLUETOOTH; + Settings.Global.BLUETOOTH_ON, BLUETOOTH_ON_BLUETOOTH) == BLUETOOTH_ON_BLUETOOTH; } /** diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 66d23a29f4ea..1671803cda48 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -24,6 +24,7 @@ import static android.net.ConnectivityManager.TYPE_VPN; import static android.net.ConnectivityManager.getNetworkTypeName; import static android.net.ConnectivityManager.isNetworkTypeValid; import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL; +import static android.net.NetworkCapabilities.NET_CAPABILITY_FOREGROUND; import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; @@ -262,6 +263,11 @@ public class ConnectivityService extends IConnectivityManager.Stub DONT_REAP }; + private enum UnneededFor { + LINGER, // Determine whether this network is unneeded and should be lingered. + TEARDOWN, // Determine whether this network is unneeded and should be torn down. + } + /** * used internally to change our mobile data enabled flag */ @@ -696,13 +702,13 @@ public class ConnectivityService extends IConnectivityManager.Stub if (DBG) log("ConnectivityService starting up"); mMetricsLog = logger; - mDefaultRequest = createInternetRequestForTransport(-1); + mDefaultRequest = createInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST); NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest, new Binder()); mNetworkRequests.put(mDefaultRequest, defaultNRI); mNetworkRequestInfoLogs.log("REGISTER " + defaultNRI); mDefaultMobileDataRequest = createInternetRequestForTransport( - NetworkCapabilities.TRANSPORT_CELLULAR); + NetworkCapabilities.TRANSPORT_CELLULAR, NetworkRequest.Type.BACKGROUND_REQUEST); mHandlerThread = createHandlerThread(); mHandlerThread.start(); @@ -853,15 +859,15 @@ public class ConnectivityService extends IConnectivityManager.Stub mLingerMonitor = new LingerMonitor(mContext, mNotifier, dailyLimit, rateLimit); } - private NetworkRequest createInternetRequestForTransport(int transportType) { + private NetworkRequest createInternetRequestForTransport( + int transportType, NetworkRequest.Type type) { NetworkCapabilities netCap = new NetworkCapabilities(); netCap.addCapability(NET_CAPABILITY_INTERNET); netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED); if (transportType > -1) { netCap.addTransportType(transportType); } - return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), - NetworkRequest.Type.REQUEST); + return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type); } // Used only for testing. @@ -1981,8 +1987,12 @@ public class ConnectivityService extends IConnectivityManager.Stub for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { pw.println(nai.toString()); pw.increaseIndent(); - pw.println(String.format("Requests: %d request/%d total", - nai.numRequestNetworkRequests(), nai.numNetworkRequests())); + pw.println(String.format( + "Requests: REQUEST:%d LISTEN:%d BACKGROUND_REQUEST:%d total:%d", + nai.numForegroundNetworkRequests(), + nai.numNetworkRequests() - nai.numRequestNetworkRequests(), + nai.numBackgroundNetworkRequests(), + nai.numNetworkRequests())); pw.increaseIndent(); for (int i = 0; i < nai.numNetworkRequests(); i++) { pw.println(nai.requestAt(i).toString()); @@ -2141,14 +2151,10 @@ public class ConnectivityService extends IConnectivityManager.Stub case NetworkAgent.EVENT_NETWORK_CAPABILITIES_CHANGED: { final NetworkCapabilities networkCapabilities = (NetworkCapabilities) msg.obj; if (networkCapabilities.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL) || - networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { + networkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED) || + networkCapabilities.hasCapability(NET_CAPABILITY_FOREGROUND)) { Slog.wtf(TAG, "BUG: " + nai + " has CS-managed capability."); } - if (nai.everConnected && !nai.networkCapabilities.equalImmutableCapabilities( - networkCapabilities)) { - Slog.wtf(TAG, "BUG: " + nai + " changed immutable capabilities: " - + nai.networkCapabilities + " -> " + networkCapabilities); - } updateCapabilities(nai.getCurrentScore(), nai, networkCapabilities); break; } @@ -2308,15 +2314,13 @@ public class ConnectivityService extends IConnectivityManager.Stub // 3. If this network is unneeded (which implies it is not lingering), and there is at least // one lingered request, start lingering. nai.updateLingerTimer(); - if (nai.isLingering() && nai.numRequestNetworkRequests() > 0) { + if (nai.isLingering() && nai.numForegroundNetworkRequests() > 0) { if (DBG) log("Unlingering " + nai.name()); nai.unlinger(); logNetworkEvent(nai, NetworkEvent.NETWORK_UNLINGER); - } else if (unneeded(nai) && nai.getLingerExpiry() > 0) { // unneeded() calls isLingering() + } else if (unneeded(nai, UnneededFor.LINGER) && nai.getLingerExpiry() > 0) { int lingerTime = (int) (nai.getLingerExpiry() - now); - if (DBG) { - Log.d(TAG, "Lingering " + nai.name() + " for " + lingerTime + "ms"); - } + if (DBG) log("Lingering " + nai.name() + " for " + lingerTime + "ms"); nai.linger(); logNetworkEvent(nai, NetworkEvent.NETWORK_LINGER); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_LOSING, lingerTime); @@ -2495,15 +2499,37 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - // Is nai unneeded by all NetworkRequests (and should be disconnected)? - // This is whether it is satisfying any NetworkRequests or were it to become validated, - // would it have a chance of satisfying any NetworkRequests. - private boolean unneeded(NetworkAgentInfo nai) { - if (!nai.everConnected || nai.isVPN() || - nai.isLingering() || nai.numRequestNetworkRequests() > 0) { + // Determines whether the network is the best (or could become the best, if it validated), for + // none of a particular type of NetworkRequests. The type of NetworkRequests considered depends + // on the value of reason: + // + // - UnneededFor.TEARDOWN: non-listen NetworkRequests. If a network is unneeded for this reason, + // then it should be torn down. + // - UnneededFor.LINGER: foreground NetworkRequests. If a network is unneeded for this reason, + // then it should be lingered. + private boolean unneeded(NetworkAgentInfo nai, UnneededFor reason) { + final int numRequests; + switch (reason) { + case TEARDOWN: + numRequests = nai.numRequestNetworkRequests(); + break; + case LINGER: + numRequests = nai.numForegroundNetworkRequests(); + break; + default: + Slog.wtf(TAG, "Invalid reason. Cannot happen."); + return true; + } + + if (!nai.everConnected || nai.isVPN() || nai.isLingering() || numRequests > 0) { return false; } for (NetworkRequestInfo nri : mNetworkRequests.values()) { + if (reason == UnneededFor.LINGER && nri.request.isBackgroundRequest()) { + // Background requests don't affect lingering. + continue; + } + // If this Network is already the highest scoring Network for a request, or if // there is hope for it to become one if it validated, then it is needed. if (nri.request.isRequest() && nai.satisfies(nri.request) && @@ -2591,6 +2617,7 @@ public class ConnectivityService extends IConnectivityManager.Stub boolean wasKept = false; NetworkAgentInfo nai = mNetworkForRequestId.get(nri.request.requestId); if (nai != null) { + boolean wasBackgroundNetwork = nai.isBackgroundNetwork(); nai.removeRequest(nri.request.requestId); if (VDBG) { log(" Removing from current network " + nai.name() + @@ -2599,13 +2626,17 @@ public class ConnectivityService extends IConnectivityManager.Stub // If there are still lingered requests on this network, don't tear it down, // but resume lingering instead. updateLingerState(nai, SystemClock.elapsedRealtime()); - if (unneeded(nai)) { + if (unneeded(nai, UnneededFor.TEARDOWN)) { if (DBG) log("no live requests for " + nai.name() + "; disconnecting"); teardownUnneededNetwork(nai); } else { wasKept = true; } mNetworkForRequestId.remove(nri.request.requestId); + if (!wasBackgroundNetwork && nai.isBackgroundNetwork()) { + // Went from foreground to background. + updateCapabilities(nai.getCurrentScore(), nai, nai.networkCapabilities); + } } // TODO: remove this code once we know that the Slog.wtf is never hit. @@ -4528,6 +4559,12 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private void updateCapabilities( int oldScore, NetworkAgentInfo nai, NetworkCapabilities networkCapabilities) { + if (nai.everConnected && !nai.networkCapabilities.equalImmutableCapabilities( + networkCapabilities)) { + Slog.wtf(TAG, "BUG: " + nai + " changed immutable capabilities: " + + nai.networkCapabilities + " -> " + networkCapabilities); + } + // Don't modify caller's NetworkCapabilities. networkCapabilities = new NetworkCapabilities(networkCapabilities); if (nai.lastValidated) { @@ -4540,20 +4577,39 @@ public class ConnectivityService extends IConnectivityManager.Stub } else { networkCapabilities.removeCapability(NET_CAPABILITY_CAPTIVE_PORTAL); } - if (!Objects.equals(nai.networkCapabilities, networkCapabilities)) { - if (nai.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) != - networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) { - try { - mNetd.setNetworkPermission(nai.network.netId, - networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) ? - null : NetworkManagementService.PERMISSION_SYSTEM); - } catch (RemoteException e) { - loge("Exception in setNetworkPermission: " + e); - } - } - synchronized (nai) { - nai.networkCapabilities = networkCapabilities; + if (nai.isBackgroundNetwork()) { + networkCapabilities.removeCapability(NET_CAPABILITY_FOREGROUND); + } else { + networkCapabilities.addCapability(NET_CAPABILITY_FOREGROUND); + } + + if (Objects.equals(nai.networkCapabilities, networkCapabilities)) return; + + if (nai.networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) != + networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) { + try { + mNetd.setNetworkPermission(nai.network.netId, + networkCapabilities.hasCapability(NET_CAPABILITY_NOT_RESTRICTED) ? + null : NetworkManagementService.PERMISSION_SYSTEM); + } catch (RemoteException e) { + loge("Exception in setNetworkPermission: " + e); } + } + + final NetworkCapabilities prevNc = nai.networkCapabilities; + synchronized (nai) { + nai.networkCapabilities = networkCapabilities; + } + if (nai.getCurrentScore() == oldScore && + networkCapabilities.equalRequestableCapabilities(prevNc)) { + // If the requestable capabilities haven't changed, and the score hasn't changed, then + // the change we're processing can't affect any requests, it can only affect the listens + // on this network. We might have been called by rematchNetworkAndRequests when a + // network changed foreground state. + processListenRequests(nai, true); + } else { + // If the requestable capabilities have changed or the score changed, we can't have been + // called by rematchNetworkAndRequests, so it's safe to start a rematch. rematchAllNetworksAndRequests(nai, oldScore); notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); } @@ -4676,8 +4732,13 @@ public class ConnectivityService extends IConnectivityManager.Stub // must be no other active linger timers, and we must stop lingering. oldNetwork.clearLingerState(); - if (unneeded(oldNetwork)) { + if (unneeded(oldNetwork, UnneededFor.TEARDOWN)) { + // Tear the network down. teardownUnneededNetwork(oldNetwork); + } else { + // Put the network in the background. + updateCapabilities(oldNetwork.getCurrentScore(), oldNetwork, + oldNetwork.networkCapabilities); } } @@ -4695,6 +4756,31 @@ public class ConnectivityService extends IConnectivityManager.Stub setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers()); } + private void processListenRequests(NetworkAgentInfo nai, boolean capabilitiesChanged) { + // For consistency with previous behaviour, send onLost callbacks before onAvailable. + for (NetworkRequestInfo nri : mNetworkRequests.values()) { + NetworkRequest nr = nri.request; + if (!nr.isListen()) continue; + if (nai.isSatisfyingRequest(nr.requestId) && !nai.satisfies(nr)) { + nai.removeRequest(nri.request.requestId); + callCallbackForRequest(nri, nai, ConnectivityManager.CALLBACK_LOST, 0); + } + } + + if (capabilitiesChanged) { + notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED); + } + + for (NetworkRequestInfo nri : mNetworkRequests.values()) { + NetworkRequest nr = nri.request; + if (!nr.isListen()) continue; + if (nai.satisfies(nr) && !nai.isSatisfyingRequest(nr.requestId)) { + nai.addRequest(nr); + notifyNetworkCallback(nai, nri); + } + } + } + // Handles a network appearing or improving its score. // // - Evaluates all current NetworkRequests that can be @@ -4728,13 +4814,25 @@ public class ConnectivityService extends IConnectivityManager.Stub boolean keep = newNetwork.isVPN(); boolean isNewDefault = false; NetworkAgentInfo oldDefaultNetwork = null; + + final boolean wasBackgroundNetwork = newNetwork.isBackgroundNetwork(); + final int score = newNetwork.getCurrentScore(); + if (VDBG) log("rematching " + newNetwork.name()); + // Find and migrate to this Network any NetworkRequests for // which this network is now the best. ArrayList<NetworkAgentInfo> affectedNetworks = new ArrayList<NetworkAgentInfo>(); ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<NetworkRequestInfo>(); - if (VDBG) log(" network has: " + newNetwork.networkCapabilities); + NetworkCapabilities nc = newNetwork.networkCapabilities; + if (VDBG) log(" network has: " + nc); for (NetworkRequestInfo nri : mNetworkRequests.values()) { + // Process requests in the first pass and listens in the second pass. This allows us to + // change a network's capabilities depending on which requests it has. This is only + // correct if the change in capabilities doesn't affect whether the network satisfies + // requests or not, and doesn't affect the network's score. + if (nri.request.isListen()) continue; + final NetworkAgentInfo currentNetwork = mNetworkForRequestId.get(nri.request.requestId); final boolean satisfies = newNetwork.satisfies(nri.request); if (newNetwork == currentNetwork && satisfies) { @@ -4749,22 +4847,14 @@ public class ConnectivityService extends IConnectivityManager.Stub // check if it satisfies the NetworkCapabilities if (VDBG) log(" checking if request is satisfied: " + nri.request); if (satisfies) { - if (nri.request.isListen()) { - // This is not a request, it's a callback listener. - // Add it to newNetwork regardless of score. - if (newNetwork.addRequest(nri.request)) addedRequests.add(nri); - continue; - } - // next check if it's better than any current network we're using for // this request if (VDBG) { log("currentScore = " + (currentNetwork != null ? currentNetwork.getCurrentScore() : 0) + - ", newScore = " + newNetwork.getCurrentScore()); + ", newScore = " + score); } - if (currentNetwork == null || - currentNetwork.getCurrentScore() < newNetwork.getCurrentScore()) { + if (currentNetwork == null || currentNetwork.getCurrentScore() < score) { if (VDBG) log("rematch for " + newNetwork.name()); if (currentNetwork != null) { if (VDBG) log(" accepting network in place of " + currentNetwork.name()); @@ -4786,7 +4876,7 @@ public class ConnectivityService extends IConnectivityManager.Stub // TODO - this could get expensive if we have alot of requests for this // network. Think about if there is a way to reduce this. Push // netid->request mapping to each factory? - sendUpdatedScoreToFactories(nri.request, newNetwork.getCurrentScore()); + sendUpdatedScoreToFactories(nri.request, score); if (isDefaultRequest(nri)) { isNewDefault = true; oldDefaultNetwork = currentNetwork; @@ -4812,16 +4902,14 @@ public class ConnectivityService extends IConnectivityManager.Stub mNetworkForRequestId.remove(nri.request.requestId); sendUpdatedScoreToFactories(nri.request, 0); } else { - if (nri.request.isRequest()) { - Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + - newNetwork.name() + - " without updating mNetworkForRequestId or factories!"); - } + Slog.wtf(TAG, "BUG: Removing request " + nri.request.requestId + " from " + + newNetwork.name() + + " without updating mNetworkForRequestId or factories!"); } - // TODO: technically, sending CALLBACK_LOST here is - // incorrect if nri is a request (not a listen) and there - // is a replacement network currently connected that can - // satisfy it. However, the only capability that can both + // TODO: Technically, sending CALLBACK_LOST here is + // incorrect if there is a replacement network currently + // connected that can satisfy nri, which is a request + // (not a listen). However, the only capability that can both // a) be requested and b) change is NET_CAPABILITY_TRUSTED, // so this code is only incorrect for a network that loses // the TRUSTED capability, which is a rare case. @@ -4846,6 +4934,28 @@ public class ConnectivityService extends IConnectivityManager.Stub } } + if (!newNetwork.networkCapabilities.equalRequestableCapabilities(nc)) { + Slog.wtf(TAG, String.format( + "BUG: %s changed requestable capabilities during rematch: %s -> %s", + nc, newNetwork.networkCapabilities)); + } + if (newNetwork.getCurrentScore() != score) { + Slog.wtf(TAG, String.format( + "BUG: %s changed score during rematch: %d -> %d", + score, newNetwork.getCurrentScore())); + } + + // Second pass: process all listens. + if (wasBackgroundNetwork != newNetwork.isBackgroundNetwork()) { + // If the network went from background to foreground or vice versa, we need to update + // its foreground state. It is safe to do this after rematching the requests because + // NET_CAPABILITY_FOREGROUND does not affect requests, as is not a requestable + // capability and does not affect the network's score (see the Slog.wtf call above). + updateCapabilities(score, newNetwork, newNetwork.networkCapabilities); + } else { + processListenRequests(newNetwork, false); + } + // do this after the default net is switched, but // before LegacyTypeTracker sends legacy broadcasts for (NetworkRequestInfo nri : addedRequests) notifyNetworkCallback(newNetwork, nri); @@ -4923,7 +5033,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } if (reapUnvalidatedNetworks == ReapUnvalidatedNetworks.REAP) { for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { - if (unneeded(nai)) { + if (unneeded(nai, UnneededFor.TEARDOWN)) { if (nai.getLingerExpiry() > 0) { // This network has active linger timers and no requests, but is not // lingering. Linger it. @@ -5037,6 +5147,10 @@ public class ConnectivityService extends IConnectivityManager.Stub if (!networkAgent.created && (state == NetworkInfo.State.CONNECTED || (state == NetworkInfo.State.CONNECTING && networkAgent.isVPN()))) { + + // A network that has just connected has zero requests and is thus a foreground network. + networkAgent.networkCapabilities.addCapability(NET_CAPABILITY_FOREGROUND); + try { // This should never fail. Specifying an already in use NetID will cause failure. if (networkAgent.isVPN()) { @@ -5198,6 +5312,8 @@ public class ConnectivityService extends IConnectivityManager.Stub NetworkRequest nr = networkAgent.requestAt(i); NetworkRequestInfo nri = mNetworkRequests.get(nr); if (VDBG) log(" sending notification for " + nr); + // TODO: if we're in the middle of a rematch, can we send a CAP_CHANGED callback for + // a network that no longer satisfies the listen? if (nri.mPendingIntent == null) { callCallbackForRequest(nri, networkAgent, notifyType, arg1); } else { diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java index 3fdccebd0228..83d374c41a51 100644 --- a/services/core/java/com/android/server/IntentResolver.java +++ b/services/core/java/com/android/server/IntentResolver.java @@ -364,6 +364,7 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, listCut.get(i), resultList, userId); } + filterResults(resultList); sortResults(resultList); return resultList; } @@ -457,6 +458,7 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> { buildResolveList(intent, categories, debug, defaultOnly, resolvedType, scheme, schemeCut, finalList, userId); } + filterResults(finalList); sortResults(finalList); if (debug) { @@ -521,6 +523,12 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> { Collections.sort(results, mResolvePrioritySorter); } + /** + * Apply filtering to the results. This happens before the results are sorted. + */ + protected void filterResults(List<R> results) { + } + protected void dumpFilter(PrintWriter out, String prefix, F filter) { out.print(prefix); out.println(filter); } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index cdd977be29ed..0023e4bef77c 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -1056,6 +1056,10 @@ class MountService extends IMountService.Stub || mForceAdoptable) { flags |= DiskInfo.FLAG_ADOPTABLE; } + // Adoptable storage isn't currently supported on FBE devices + if (StorageManager.isFileEncryptedNativeOnly()) { + flags &= ~DiskInfo.FLAG_ADOPTABLE; + } mDisks.put(id, new DiskInfo(id, flags)); break; } @@ -1985,6 +1989,11 @@ class MountService extends IMountService.Stub } if ((mask & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0) { + if (StorageManager.isFileEncryptedNativeOnly()) { + throw new IllegalStateException( + "Adoptable storage not available on device with native FBE"); + } + synchronized (mLock) { mForceAdoptable = (flags & StorageManager.DEBUG_FORCE_ADOPTABLE) != 0; diff --git a/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java b/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java new file mode 100644 index 000000000000..1361a3166cf0 --- /dev/null +++ b/services/core/java/com/android/server/accounts/AccountManagerBackupHelper.java @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.accounts; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.accounts.AccountManagerInternal; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.os.UserHandle; +import android.text.TextUtils; +import android.util.Log; +import android.util.PackageUtils; +import android.util.Xml; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.content.PackageMonitor; +import com.android.internal.util.FastXmlSerializer; +import com.android.internal.util.XmlUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * Helper class for backup and restore of account access grants. + */ +public final class AccountManagerBackupHelper { + private static final String TAG = "AccountManagerBackupHelper"; + + private static final long PENDING_RESTORE_TIMEOUT_MILLIS = 60 * 60 * 1000; // 1 hour + + private static final String TAG_PERMISSIONS = "permissions"; + private static final String TAG_PERMISSION = "permission"; + private static final String ATTR_ACCOUNT_SHA_256 = "account-sha-256"; + private static final String ATTR_PACKAGE = "package"; + private static final String ATTR_DIGEST = "digest"; + + private static final String ACCOUNT_ACCESS_GRANTS = "" + + "SELECT " + AccountManagerService.ACCOUNTS_NAME + ", " + + AccountManagerService.GRANTS_GRANTEE_UID + + " FROM " + AccountManagerService.TABLE_ACCOUNTS + + ", " + AccountManagerService.TABLE_GRANTS + + " WHERE " + AccountManagerService.GRANTS_ACCOUNTS_ID + + "=" + AccountManagerService.ACCOUNTS_ID; + + private final Object mLock = new Object(); + + private final AccountManagerService mAccountManagerService; + private final AccountManagerInternal mAccountManagerInternal; + + @GuardedBy("mLock") + private List<PendingAppPermission> mRestorePendingAppPermissions; + + @GuardedBy("mLock") + private RestorePackageMonitor mRestorePackageMonitor; + + @GuardedBy("mLock") + private Runnable mRestoreCancelCommand; + + public AccountManagerBackupHelper(AccountManagerService accountManagerService, + AccountManagerInternal accountManagerInternal) { + mAccountManagerService = accountManagerService; + mAccountManagerInternal = accountManagerInternal; + } + + private final class PendingAppPermission { + private final @NonNull String accountDigest; + private final @NonNull String packageName; + private final @NonNull String certDigest; + private final @IntRange(from = 0) int userId; + + public PendingAppPermission(String accountDigest, String packageName, + String certDigest, int userId) { + this.accountDigest = accountDigest; + this.packageName = packageName; + this.certDigest = certDigest; + this.userId = userId; + } + + public boolean apply(PackageManager packageManager) { + Account account = null; + AccountManagerService.UserAccounts accounts = mAccountManagerService + .getUserAccounts(userId); + synchronized (accounts.cacheLock) { + for (Account[] accountsPerType : accounts.accountCache.values()) { + for (Account accountPerType : accountsPerType) { + if (accountDigest.equals(PackageUtils.computeSha256Digest( + accountPerType.name.getBytes()))) { + account = accountPerType; + break; + } + } + if (account != null) { + break; + } + } + } + if (account == null) { + return false; + } + final PackageInfo packageInfo; + try { + packageInfo = packageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNATURES, userId); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + String currentCertDigest = PackageUtils.computeCertSha256Digest( + packageInfo.signatures[0]); + if (!certDigest.equals(currentCertDigest)) { + return false; + } + final int uid = packageInfo.applicationInfo.uid; + if (!mAccountManagerInternal.hasAccountAccess(account, uid)) { + mAccountManagerService.grantAppPermission(account, + AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, uid); + } + return true; + } + } + + public byte[] backupAccountAccessPermissions(int userId) { + final AccountManagerService.UserAccounts accounts = mAccountManagerService + .getUserAccounts(userId); + synchronized (accounts.cacheLock) { + SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); + try ( + Cursor cursor = db.rawQuery(ACCOUNT_ACCESS_GRANTS, null); + ) { + if (cursor == null || !cursor.moveToFirst()) { + return null; + } + + final int nameColumnIdx = cursor.getColumnIndex( + AccountManagerService.ACCOUNTS_NAME); + final int uidColumnIdx = cursor.getColumnIndex( + AccountManagerService.GRANTS_GRANTEE_UID); + + ByteArrayOutputStream dataStream = new ByteArrayOutputStream(); + try { + final XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(dataStream, StandardCharsets.UTF_8.name()); + serializer.startDocument(null, true); + serializer.startTag(null, TAG_PERMISSIONS); + + PackageManager packageManager = mAccountManagerService.mContext + .getPackageManager(); + + do { + final String accountName = cursor.getString(nameColumnIdx); + final int uid = cursor.getInt(uidColumnIdx); + + final String[] packageNames = packageManager.getPackagesForUid(uid); + if (packageNames == null) { + continue; + } + + for (String packageName : packageNames) { + String digest = PackageUtils.computePackageCertSha256Digest( + packageManager, packageName, userId); + if (digest != null) { + serializer.startTag(null, TAG_PERMISSION); + serializer.attribute(null, ATTR_ACCOUNT_SHA_256, + PackageUtils.computeSha256Digest(accountName.getBytes())); + serializer.attribute(null, ATTR_PACKAGE, packageName); + serializer.attribute(null, ATTR_DIGEST, digest); + serializer.endTag(null, TAG_PERMISSION); + } + } + } while (cursor.moveToNext()); + + serializer.endTag(null, TAG_PERMISSIONS); + serializer.endDocument(); + serializer.flush(); + } catch (IOException e) { + Log.e(TAG, "Error backing up account access grants", e); + return null; + } + + return dataStream.toByteArray(); + } + } + } + + public void restoreAccountAccessPermissions(byte[] data, int userId) { + try { + ByteArrayInputStream dataStream = new ByteArrayInputStream(data); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(dataStream, StandardCharsets.UTF_8.name()); + PackageManager packageManager = mAccountManagerService.mContext.getPackageManager(); + + final int permissionsOuterDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, permissionsOuterDepth)) { + if (!TAG_PERMISSIONS.equals(parser.getName())) { + continue; + } + final int permissionOuterDepth = parser.getDepth(); + while (XmlUtils.nextElementWithin(parser, permissionOuterDepth)) { + if (!TAG_PERMISSION.equals(parser.getName())) { + continue; + } + String accountDigest = parser.getAttributeValue(null, ATTR_ACCOUNT_SHA_256); + if (TextUtils.isEmpty(accountDigest)) { + XmlUtils.skipCurrentTag(parser); + } + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); + if (TextUtils.isEmpty(packageName)) { + XmlUtils.skipCurrentTag(parser); + } + String digest = parser.getAttributeValue(null, ATTR_DIGEST); + if (TextUtils.isEmpty(digest)) { + XmlUtils.skipCurrentTag(parser); + } + + PendingAppPermission pendingAppPermission = new PendingAppPermission( + accountDigest, packageName, digest, userId); + + if (!pendingAppPermission.apply(packageManager)) { + synchronized (mLock) { + // Start watching before add pending to avoid a missed signal + if (mRestorePackageMonitor == null) { + mRestorePackageMonitor = new RestorePackageMonitor(); + mRestorePackageMonitor.register(mAccountManagerService.mContext, + mAccountManagerService.mMessageHandler.getLooper(), true); + } + if (mRestorePendingAppPermissions == null) { + mRestorePendingAppPermissions = new ArrayList<>(); + } + mRestorePendingAppPermissions.add(pendingAppPermission); + } + } + } + } + + // Make sure we eventually prune the in-memory pending restores + synchronized (mLock) { + mRestoreCancelCommand = new CancelRestoreCommand(); + } + mAccountManagerService.mMessageHandler.postDelayed(mRestoreCancelCommand, + PENDING_RESTORE_TIMEOUT_MILLIS); + } catch (XmlPullParserException | IOException e) { + Log.e(TAG, "Error restoring app permissions", e); + } + } + + private final class RestorePackageMonitor extends PackageMonitor { + @Override + public void onPackageAdded(String packageName, int uid) { + synchronized (mLock) { + // Can happen if restore is cancelled and there is a notification in flight + if (mRestorePendingAppPermissions == null) { + return; + } + if (UserHandle.getUserId(uid) != UserHandle.USER_SYSTEM) { + return; + } + final int count = mRestorePendingAppPermissions.size(); + for (int i = count - 1; i >= 0; i--) { + PendingAppPermission pendingAppPermission = + mRestorePendingAppPermissions.get(i); + if (!pendingAppPermission.packageName.equals(packageName)) { + continue; + } + if (pendingAppPermission.apply( + mAccountManagerService.mContext.getPackageManager())) { + mRestorePendingAppPermissions.remove(i); + } + } + if (mRestorePendingAppPermissions.isEmpty() + && mRestoreCancelCommand != null) { + mAccountManagerService.mMessageHandler.removeCallbacks(mRestoreCancelCommand); + mRestoreCancelCommand.run(); + mRestoreCancelCommand = null; + } + } + } + } + + private final class CancelRestoreCommand implements Runnable { + @Override + public void run() { + synchronized (mLock) { + mRestorePendingAppPermissions = null; + if (mRestorePackageMonitor != null) { + mRestorePackageMonitor.unregister(); + mRestorePackageMonitor = null; + } + } + } + } +} diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index b0e8c276a4e4..b69750794761 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -22,18 +22,24 @@ import android.accounts.Account; import android.accounts.AccountAndUser; import android.accounts.AccountAuthenticatorResponse; import android.accounts.AccountManager; +import android.accounts.AccountManagerInternal; import android.accounts.AuthenticatorDescription; import android.accounts.CantAddAccountActivity; import android.accounts.GrantCredentialsPermissionActivity; +import android.accounts.IAccountAccessTracker; import android.accounts.IAccountAuthenticator; import android.accounts.IAccountAuthenticatorResponse; import android.accounts.IAccountManager; import android.accounts.IAccountManagerResponse; +import android.annotation.IntRange; import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManagerNative; +import android.app.ActivityThread; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; @@ -46,9 +52,11 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.IntentSender; import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -72,20 +80,25 @@ import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.Process; +import android.os.RemoteCallback; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.text.TextUtils; import android.util.Log; +import android.util.PackageUtils; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.SparseBooleanArray; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.content.PackageMonitor; import com.android.internal.util.ArrayUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; @@ -115,6 +128,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -145,13 +159,6 @@ public class AccountManagerService } @Override - public void onBootPhase(int phase) { - if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { - mService.systemReady(); - } - } - - @Override public void onUnlockUser(int userHandle) { mService.onUnlockUser(userHandle); } @@ -164,13 +171,13 @@ public class AccountManagerService private static final int MAX_DEBUG_DB_SIZE = 64; - private final Context mContext; + final Context mContext; private final PackageManager mPackageManager; private final AppOpsManager mAppOpsManager; private UserManager mUserManager; - private final MessageHandler mMessageHandler; + final MessageHandler mMessageHandler; // Messages that can be sent on mHandler private static final int MESSAGE_TIMED_OUT = 3; @@ -178,9 +185,9 @@ public class AccountManagerService private final IAccountAuthenticatorCache mAuthenticatorCache; - private static final String TABLE_ACCOUNTS = "accounts"; - private static final String ACCOUNTS_ID = "_id"; - private static final String ACCOUNTS_NAME = "name"; + static final String TABLE_ACCOUNTS = "accounts"; + static final String ACCOUNTS_ID = "_id"; + static final String ACCOUNTS_NAME = "name"; private static final String ACCOUNTS_TYPE = "type"; private static final String ACCOUNTS_TYPE_COUNT = "count(type)"; private static final String ACCOUNTS_PASSWORD = "password"; @@ -194,10 +201,10 @@ public class AccountManagerService private static final String AUTHTOKENS_TYPE = "type"; private static final String AUTHTOKENS_AUTHTOKEN = "authtoken"; - private static final String TABLE_GRANTS = "grants"; - private static final String GRANTS_ACCOUNTS_ID = "accounts_id"; + static final String TABLE_GRANTS = "grants"; + static final String GRANTS_ACCOUNTS_ID = "accounts_id"; private static final String GRANTS_AUTH_TOKEN_TYPE = "auth_token_type"; - private static final String GRANTS_GRANTEE_UID = "uid"; + static final String GRANTS_GRANTEE_UID = "uid"; private static final String TABLE_EXTRAS = "extras"; private static final String EXTRAS_ID = "_id"; @@ -237,6 +244,13 @@ public class AccountManagerService + " AND " + ACCOUNTS_NAME + "=?" + " AND " + ACCOUNTS_TYPE + "=?"; + private static final String COUNT_OF_MATCHING_GRANTS_ANY_TOKEN = "" + + "SELECT COUNT(*) FROM " + TABLE_GRANTS + ", " + TABLE_ACCOUNTS + + " WHERE " + GRANTS_ACCOUNTS_ID + "=" + ACCOUNTS_ID + + " AND " + GRANTS_GRANTEE_UID + "=?" + + " AND " + ACCOUNTS_NAME + "=?" + + " AND " + ACCOUNTS_TYPE + "=?"; + private static final String SELECTION_AUTHTOKENS_BY_ACCOUNT = AUTHTOKENS_ACCOUNTS_ID + "=(select _id FROM accounts WHERE name=? AND type=?)"; @@ -257,16 +271,16 @@ public class AccountManagerService static class UserAccounts { private final int userId; - private final DeDatabaseHelper openHelper; + final DeDatabaseHelper openHelper; private final HashMap<Pair<Pair<Account, String>, Integer>, Integer> credentialsPermissionNotificationIds = new HashMap<Pair<Pair<Account, String>, Integer>, Integer>(); private final HashMap<Account, Integer> signinRequiredNotificationIds = new HashMap<Account, Integer>(); - private final Object cacheLock = new Object(); + final Object cacheLock = new Object(); /** protected by the {@link #cacheLock} */ - private final HashMap<String, Account[]> accountCache = - new LinkedHashMap<String, Account[]>(); + final HashMap<String, Account[]> accountCache = + new LinkedHashMap<>(); /** protected by the {@link #cacheLock} */ private final HashMap<Account, HashMap<String, String>> userDataCache = new HashMap<Account, HashMap<String, String>>(); @@ -305,6 +319,8 @@ public class AccountManagerService private final SparseArray<UserAccounts> mUsers = new SparseArray<>(); private final SparseBooleanArray mLocalUnlockedUsers = new SparseBooleanArray(); + private final CopyOnWriteArrayList<AccountManagerInternal.OnAppPermissionChangeListener> + mAppPermissionChangeListeners = new CopyOnWriteArrayList<>(); private static AtomicReference<AccountManagerService> sThis = new AtomicReference<>(); private static final Account[] EMPTY_ACCOUNT_ARRAY = new Account[]{}; @@ -376,6 +392,118 @@ public class AccountManagerService } } }, UserHandle.ALL, userFilter, null, null); + + LocalServices.addService(AccountManagerInternal.class, new AccountManagerInternalImpl()); + + // Need to cancel account request notifications if the update/install can access the account + new PackageMonitor() { + @Override + public void onPackageAdded(String packageName, int uid) { + // Called on a handler, and running as the system + cancelAccountAccessRequestNotificationIfNeeded(uid, true); + } + + @Override + public void onPackageUpdateFinished(String packageName, int uid) { + // Called on a handler, and running as the system + cancelAccountAccessRequestNotificationIfNeeded(uid, true); + } + }.register(mContext, mMessageHandler.getLooper(), UserHandle.ALL, true); + + // Cancel account request notification if an app op was preventing the account access + mAppOpsManager.startWatchingMode(AppOpsManager.OP_GET_ACCOUNTS, null, + new AppOpsManager.OnOpChangedInternalListener() { + @Override + public void onOpChanged(int op, String packageName) { + try { + final int userId = ActivityManager.getCurrentUser(); + final int uid = mPackageManager.getPackageUidAsUser(packageName, userId); + final int mode = mAppOpsManager.checkOpNoThrow( + AppOpsManager.OP_GET_ACCOUNTS, uid, packageName); + if (mode == AppOpsManager.MODE_ALLOWED) { + final long identity = Binder.clearCallingIdentity(); + try { + cancelAccountAccessRequestNotificationIfNeeded(packageName, uid, true); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } catch (NameNotFoundException e) { + /* ignore */ + } + } + }); + + // Cancel account request notification if a permission was preventing the account access + mPackageManager.addOnPermissionsChangeListener( + (int uid) -> { + Account[] accounts = null; + String[] packageNames = mPackageManager.getPackagesForUid(uid); + if (packageNames != null) { + final int userId = UserHandle.getUserId(uid); + final long identity = Binder.clearCallingIdentity(); + try { + for (String packageName : packageNames) { + if (mContext.getPackageManager().checkPermission( + Manifest.permission.GET_ACCOUNTS, packageName) + != PackageManager.PERMISSION_GRANTED) { + continue; + } + + if (accounts == null) { + accounts = getAccountsAsUser(null, userId, "android"); + if (ArrayUtils.isEmpty(accounts)) { + return; + } + } + + for (Account account : accounts) { + cancelAccountAccessRequestNotificationIfNeeded( + account, uid, packageName, true); + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + }); + } + + private void cancelAccountAccessRequestNotificationIfNeeded(int uid, + boolean checkAccess) { + Account[] accounts = getAccountsAsUser(null, UserHandle.getUserId(uid), "android"); + for (Account account : accounts) { + cancelAccountAccessRequestNotificationIfNeeded(account, uid, checkAccess); + } + } + + private void cancelAccountAccessRequestNotificationIfNeeded(String packageName, int uid, + boolean checkAccess) { + Account[] accounts = getAccountsAsUser(null, UserHandle.getUserId(uid), "android"); + for (Account account : accounts) { + cancelAccountAccessRequestNotificationIfNeeded(account, uid, packageName, checkAccess); + } + } + + private void cancelAccountAccessRequestNotificationIfNeeded(Account account, int uid, + boolean checkAccess) { + String[] packageNames = mPackageManager.getPackagesForUid(uid); + if (packageNames != null) { + for (String packageName : packageNames) { + cancelAccountAccessRequestNotificationIfNeeded(account, uid, + packageName, checkAccess); + } + } + } + + private void cancelAccountAccessRequestNotificationIfNeeded(Account account, + int uid, String packageName, boolean checkAccess) { + if (!checkAccess || hasAccountAccess(account, packageName, + UserHandle.getUserHandleForUid(uid))) { + cancelNotification(getCredentialPermissionNotificationId(account, + AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, uid), packageName, + UserHandle.getUserHandleForUid(uid)); + } } @Override @@ -393,9 +521,6 @@ public class AccountManagerService } } - public void systemReady() { - } - private UserManager getUserManager() { if (mUserManager == null) { mUserManager = UserManager.get(mContext); @@ -566,7 +691,8 @@ public class AccountManagerService final ArrayList<String> accountNames = cur.getValue(); final Account[] accountsForType = new Account[accountNames.size()]; for (int i = 0; i < accountsForType.length; i++) { - accountsForType[i] = new Account(accountNames.get(i), accountType); + accountsForType[i] = new Account(accountNames.get(i), accountType, + new AccountAccessTracker()); } accounts.accountCache.put(accountType, accountsForType); } @@ -1376,6 +1502,8 @@ public class AccountManagerService Bundle result = new Bundle(); result.putString(AccountManager.KEY_ACCOUNT_NAME, resultingAccount.name); result.putString(AccountManager.KEY_ACCOUNT_TYPE, resultingAccount.type); + result.putBinder(AccountManager.KEY_ACCOUNT_ACCESS_TRACKER, + resultingAccount.getAccessTracker().asBinder()); try { response.onResult(result); } catch (RemoteException e) { @@ -1722,6 +1850,21 @@ public class AccountManagerService } finally { Binder.restoreCallingIdentity(id); } + + if (isChanged) { + synchronized (accounts.credentialsPermissionNotificationIds) { + for (Pair<Pair<Account, String>, Integer> key + : accounts.credentialsPermissionNotificationIds.keySet()) { + if (account.equals(key.first.first) + && AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE.equals(key.first.second)) { + final int uid = (Integer) key.second; + mMessageHandler.post(() -> cancelAccountAccessRequestNotificationIfNeeded( + account, uid, false)); + } + } + } + } + return isChanged; } @@ -2118,7 +2261,7 @@ public class AccountManagerService final int callingUid = getCallingUid(); clearCallingIdentity(); - if (callingUid != Process.SYSTEM_UID) { + if (UserHandle.getAppId(callingUid) != Process.SYSTEM_UID) { throw new SecurityException("can only call from system"); } int userId = UserHandle.getUserId(callingUid); @@ -2318,9 +2461,11 @@ public class AccountManagerService if (result.containsKey(AccountManager.KEY_AUTH_TOKEN_LABEL)) { Intent intent = newGrantCredentialsPermissionIntent( account, + null, callerUid, new AccountAuthenticatorResponse(this), - authTokenType); + authTokenType, + true); Bundle bundle = new Bundle(); bundle.putParcelable(AccountManager.KEY_INTENT, intent); onResult(bundle); @@ -2371,7 +2516,7 @@ public class AccountManagerService intent); doNotification(mAccounts, account, result.getString(AccountManager.KEY_AUTH_FAILED_MESSAGE), - intent, accounts.userId); + intent, "android", accounts.userId); } } super.onResult(result); @@ -2402,7 +2547,7 @@ public class AccountManagerService } private void createNoCredentialsPermissionNotification(Account account, Intent intent, - int userId) { + String packageName, int userId) { int uid = intent.getIntExtra( GrantCredentialsPermissionActivity.EXTRAS_REQUESTING_UID, -1); String authTokenType = intent.getStringExtra( @@ -2430,20 +2575,23 @@ public class AccountManagerService PendingIntent.FLAG_CANCEL_CURRENT, null, user)) .build(); installNotification(getCredentialPermissionNotificationId( - account, authTokenType, uid), n, user); + account, authTokenType, uid), n, packageName, user.getIdentifier()); } - private Intent newGrantCredentialsPermissionIntent(Account account, int uid, - AccountAuthenticatorResponse response, String authTokenType) { + private Intent newGrantCredentialsPermissionIntent(Account account, String packageName, + int uid, AccountAuthenticatorResponse response, String authTokenType, + boolean startInNewTask) { Intent intent = new Intent(mContext, GrantCredentialsPermissionActivity.class); - // See FLAG_ACTIVITY_NEW_TASK docs for limitations and benefits of the flag. - // Since it was set in Eclair+ we can't change it without breaking apps using - // the intent from a non-Activity context. - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addCategory( - String.valueOf(getCredentialPermissionNotificationId(account, authTokenType, uid))); + if (startInNewTask) { + // See FLAG_ACTIVITY_NEW_TASK docs for limitations and benefits of the flag. + // Since it was set in Eclair+ we can't change it without breaking apps using + // the intent from a non-Activity context. This is the default behavior. + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } + intent.addCategory(String.valueOf(getCredentialPermissionNotificationId(account, + authTokenType, uid) + (packageName != null ? packageName : ""))); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_ACCOUNT, account); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_AUTH_TOKEN_TYPE, authTokenType); intent.putExtra(GrantCredentialsPermissionActivity.EXTRAS_RESPONSE, response); @@ -3294,6 +3442,137 @@ public class AccountManagerService } @Override + public boolean hasAccountAccess(@NonNull Account account, @NonNull String packageName, + @NonNull UserHandle userHandle) { + if (UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) { + throw new SecurityException("Can be called only by system UID"); + } + Preconditions.checkNotNull(account, "account cannot be null"); + Preconditions.checkNotNull(packageName, "packageName cannot be null"); + Preconditions.checkNotNull(userHandle, "userHandle cannot be null"); + + final int userId = userHandle.getIdentifier(); + + Preconditions.checkArgumentInRange(userId, 0, Integer.MAX_VALUE, "user must be concrete"); + + try { + final int uid = mPackageManager.getPackageUidAsUser(packageName, userId); + return hasAccountAccess(account, packageName, uid); + } catch (NameNotFoundException e) { + return false; + } + } + + private boolean hasAccountAccess(@NonNull Account account, @Nullable String packageName, + int uid) { + if (packageName == null) { + String[] packageNames = mPackageManager.getPackagesForUid(uid); + if (ArrayUtils.isEmpty(packageNames)) { + return false; + } + // For app op checks related to permissions all packages in the UID + // have the same app op state, so doesn't matter which one we pick. + packageName = packageNames[0]; + } + + // Use null token which means any token. Having a token means the package + // is trusted by the authenticator, hence it is fine to access the account. + if (permissionIsGranted(account, null, uid, UserHandle.getUserId(uid))) { + return true; + } + // In addition to the permissions required to get an auth token we also allow + // the account to be accessed by holders of the get accounts permissions. + return checkUidPermission(Manifest.permission.GET_ACCOUNTS_PRIVILEGED, uid, packageName) + || checkUidPermission(Manifest.permission.GET_ACCOUNTS, uid, packageName); + } + + private boolean checkUidPermission(String permission, int uid, String opPackageName) { + final long identity = Binder.clearCallingIdentity(); + try { + IPackageManager pm = ActivityThread.getPackageManager(); + if (pm.checkUidPermission(permission, uid) != PackageManager.PERMISSION_GRANTED) { + return false; + } + final int opCode = AppOpsManager.permissionToOpCode(permission); + return (opCode == AppOpsManager.OP_NONE || mAppOpsManager.noteOpNoThrow( + opCode, uid, opPackageName) == AppOpsManager.MODE_ALLOWED); + } catch (RemoteException e) { + /* ignore - local call */ + } finally { + Binder.restoreCallingIdentity(identity); + } + return false; + } + + @Override + public IntentSender createRequestAccountAccessIntentSenderAsUser(@NonNull Account account, + @NonNull String packageName, @NonNull UserHandle userHandle) { + if (UserHandle.getAppId(Binder.getCallingUid()) != Process.SYSTEM_UID) { + throw new SecurityException("Can be called only by system UID"); + } + + Preconditions.checkNotNull(account, "account cannot be null"); + Preconditions.checkNotNull(packageName, "packageName cannot be null"); + Preconditions.checkNotNull(userHandle, "userHandle cannot be null"); + + final int userId = userHandle.getIdentifier(); + + Preconditions.checkArgumentInRange(userId, 0, Integer.MAX_VALUE, "user must be concrete"); + + final int uid; + try { + uid = mPackageManager.getPackageUidAsUser(packageName, userId); + } catch (NameNotFoundException e) { + Slog.e(TAG, "Unknown package " + packageName); + return null; + } + + Intent intent = newRequestAccountAccessIntent(account, packageName, uid, null); + + final long identity = Binder.clearCallingIdentity(); + try { + return PendingIntent.getActivityAsUser( + mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE, + null, new UserHandle(userId)).getIntentSender(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + private Intent newRequestAccountAccessIntent(Account account, String packageName, + int uid, RemoteCallback callback) { + return newGrantCredentialsPermissionIntent(account, packageName, uid, + new AccountAuthenticatorResponse(new IAccountAuthenticatorResponse.Stub() { + @Override + public void onResult(Bundle value) throws RemoteException { + handleAuthenticatorResponse(true); + } + + @Override + public void onRequestContinued() { + /* ignore */ + } + + @Override + public void onError(int errorCode, String errorMessage) throws RemoteException { + handleAuthenticatorResponse(false); + } + + private void handleAuthenticatorResponse(boolean accessGranted) throws RemoteException { + cancelNotification(getCredentialPermissionNotificationId(account, + AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, uid), packageName, + UserHandle.getUserHandleForUid(uid)); + if (callback != null) { + Bundle result = new Bundle(); + result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, accessGranted); + callback.sendResult(result); + } + } + }), AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, false); + } + + @Override public boolean someUserHasAccount(@NonNull final Account account) { if (!UserHandle.isSameApp(Process.SYSTEM_UID, Binder.getCallingUid())) { throw new SecurityException("Only system can check for accounts across users"); @@ -4166,7 +4445,7 @@ public class AccountManagerService } } - private class MessageHandler extends Handler { + class MessageHandler extends Handler { MessageHandler(Looper looper) { super(looper); } @@ -4933,7 +5212,7 @@ public class AccountManagerService } private void doNotification(UserAccounts accounts, Account account, CharSequence message, - Intent intent, int userId) { + Intent intent, String packageName, final int userId) { long identityToken = clearCallingIdentity(); try { if (Log.isLoggable(TAG, Log.VERBOSE)) { @@ -4943,12 +5222,12 @@ public class AccountManagerService if (intent.getComponent() != null && GrantCredentialsPermissionActivity.class.getName().equals( intent.getComponent().getClassName())) { - createNoCredentialsPermissionNotification(account, intent, userId); + createNoCredentialsPermissionNotification(account, intent, packageName, userId); } else { + Context contextForUser = getContextForUser(new UserHandle(userId)); final Integer notificationId = getSigninRequiredNotificationId(accounts, account); intent.addCategory(String.valueOf(notificationId)); - UserHandle user = new UserHandle(userId); - Context contextForUser = getContextForUser(user); + final String notificationTitleFormat = contextForUser.getText(R.string.notification_title).toString(); Notification n = new Notification.Builder(contextForUser) @@ -4960,9 +5239,9 @@ public class AccountManagerService .setContentText(message) .setContentIntent(PendingIntent.getActivityAsUser( mContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT, - null, user)) + null, new UserHandle(userId))) .build(); - installNotification(notificationId, n, user); + installNotification(notificationId, n, packageName, userId); } } finally { restoreCallingIdentity(identityToken); @@ -4970,18 +5249,40 @@ public class AccountManagerService } @VisibleForTesting - protected void installNotification(final int notificationId, final Notification n, + protected void installNotification(int notificationId, final Notification notification, UserHandle user) { - ((NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE)) - .notifyAsUser(null, notificationId, n, user); + installNotification(notificationId, notification, "android", user.getIdentifier()); + } + + private void installNotification(int notificationId, final Notification notification, + String packageName, int userId) { + final long token = clearCallingIdentity(); + try { + INotificationManager notificationManager = NotificationManager.getService(); + try { + notificationManager.enqueueNotificationWithTag(packageName, packageName, null, + notificationId, notification, new int[1], userId); + } catch (RemoteException e) { + /* ignore - local call */ + } + } finally { + Binder.restoreCallingIdentity(token); + } } @VisibleForTesting protected void cancelNotification(int id, UserHandle user) { + cancelNotification(id, mContext.getPackageName(), user); + } + + protected void cancelNotification(int id, String packageName, UserHandle user) { long identityToken = clearCallingIdentity(); try { - ((NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE)) - .cancelAsUser(null, id, user); + INotificationManager service = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + service.cancelNotificationWithTag(packageName, null, id, user.getIdentifier()); + } catch (RemoteException e) { + /* ignore - local call */ } finally { restoreCallingIdentity(identityToken); } @@ -5042,18 +5343,40 @@ public class AccountManagerService private boolean permissionIsGranted( Account account, String authTokenType, int callerUid, int userId) { - final boolean isPrivileged = isPrivileged(callerUid); - final boolean fromAuthenticator = account != null - && isAccountManagedByCaller(account.type, callerUid, userId); - final boolean hasExplicitGrants = account != null - && hasExplicitlyGrantedPermission(account, authTokenType, callerUid); + if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "Access to " + account + " granted calling uid is system"); + } + return true; + } + + if (isPrivileged(callerUid)) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "Access to " + account + " granted calling uid " + + callerUid + " privileged"); + } + return true; + } + if (account != null && isAccountManagedByCaller(account.type, callerUid, userId)) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "Access to " + account + " granted calling uid " + + callerUid + " manages the account"); + } + return true; + } + if (account != null && hasExplicitlyGrantedPermission(account, authTokenType, callerUid)) { + if (Log.isLoggable(TAG, Log.VERBOSE)) { + Log.v(TAG, "Access to " + account + " granted calling uid " + + callerUid + " user granted access"); + } + return true; + } + if (Log.isLoggable(TAG, Log.VERBOSE)) { - Log.v(TAG, "checkGrantsOrCallingUidAgainstAuthenticator: caller uid " - + callerUid + ", " + account - + ": is authenticator? " + fromAuthenticator - + ", has explicit permission? " + hasExplicitGrants); + Log.v(TAG, "Access to " + account + " not granted for uid " + callerUid); } - return fromAuthenticator || hasExplicitGrants || isPrivileged; + + return false; } private boolean isAccountVisibleToCaller(String accountType, int callingUid, int userId, @@ -5137,16 +5460,26 @@ public class AccountManagerService private boolean hasExplicitlyGrantedPermission(Account account, String authTokenType, int callerUid) { - if (callerUid == Process.SYSTEM_UID) { + if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) { return true; } - UserAccounts accounts = getUserAccountsForCaller(); + UserAccounts accounts = getUserAccounts(UserHandle.getUserId(callerUid)); synchronized (accounts.cacheLock) { final SQLiteDatabase db = accounts.openHelper.getReadableDatabase(); - String[] args = { String.valueOf(callerUid), authTokenType, - account.name, account.type}; - final boolean permissionGranted = - DatabaseUtils.longForQuery(db, COUNT_OF_MATCHING_GRANTS, args) != 0; + + final String query; + final String[] args; + + if (authTokenType != null) { + query = COUNT_OF_MATCHING_GRANTS; + args = new String[] {String.valueOf(callerUid), authTokenType, + account.name, account.type}; + } else { + query = COUNT_OF_MATCHING_GRANTS_ANY_TOKEN; + args = new String[] {String.valueOf(callerUid), account.name, + account.type}; + } + final boolean permissionGranted = DatabaseUtils.longForQuery(db, query, args) != 0; if (!permissionGranted && ActivityManager.isRunningInTestHarness()) { // TODO: Skip this check when running automated tests. Replace this // with a more general solution. @@ -5245,7 +5578,7 @@ public class AccountManagerService throws RemoteException { final int callingUid = getCallingUid(); - if (callingUid != Process.SYSTEM_UID) { + if (UserHandle.getAppId(callingUid) != Process.SYSTEM_UID) { throw new SecurityException(); } @@ -5263,7 +5596,7 @@ public class AccountManagerService * which is in the system. This means we don't need to protect it with permissions. * @hide */ - private void grantAppPermission(Account account, String authTokenType, int uid) { + void grantAppPermission(Account account, String authTokenType, int uid) { if (account == null || authTokenType == null) { Log.e(TAG, "grantAppPermission: called with invalid arguments", new Exception()); return; @@ -5287,6 +5620,14 @@ public class AccountManagerService } cancelNotification(getCredentialPermissionNotificationId(account, authTokenType, uid), UserHandle.of(accounts.userId)); + + cancelAccountAccessRequestNotificationIfNeeded(account, uid, true); + } + + // Listeners are a final CopyOnWriteArrayList, hence no lock needed. + for (AccountManagerInternal.OnAppPermissionChangeListener listener + : mAppPermissionChangeListeners) { + mMessageHandler.post(() -> listener.onAppPermissionChanged(account, uid)); } } @@ -5320,9 +5661,16 @@ public class AccountManagerService } finally { db.endTransaction(); } + cancelNotification(getCredentialPermissionNotificationId(account, authTokenType, uid), new UserHandle(accounts.userId)); } + + // Listeners are a final CopyOnWriteArrayList, hence no lock needed. + for (AccountManagerInternal.OnAppPermissionChangeListener listener + : mAppPermissionChangeListeners) { + mMessageHandler.post(() -> listener.onAppPermissionChanged(account, uid)); + } } static final private String stringArrayToString(String[] value) { @@ -5361,7 +5709,7 @@ public class AccountManagerService if (accountsForType != null) { System.arraycopy(accountsForType, 0, newAccountsForType, 0, oldLength); } - newAccountsForType[oldLength] = account; + newAccountsForType[oldLength] = new Account(account, new AccountAccessTracker()); accounts.accountCache.put(account.type, newAccountsForType); } @@ -5604,4 +5952,115 @@ public class AccountManagerService } } } + + private final class AccountAccessTracker extends IAccountAccessTracker.Stub { + @Override + public void onAccountAccessed() throws RemoteException { + final int uid = Binder.getCallingUid(); + if (UserHandle.getAppId(uid) == Process.SYSTEM_UID) { + return; + } + final int userId = UserHandle.getCallingUserId(); + final long identity = Binder.clearCallingIdentity(); + try { + for (Account account : getAccounts(userId, mContext.getOpPackageName())) { + IAccountAccessTracker accountTracker = account.getAccessTracker(); + if (accountTracker != null && asBinder() == accountTracker.asBinder()) { + // An app just accessed the account. At this point it knows about + // it and there is not need to hide this account from the app. + if (!hasAccountAccess(account, null, uid)) { + updateAppPermission(account, AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, + uid, true); + } + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } + } + } + + private final class AccountManagerInternalImpl extends AccountManagerInternal { + private final Object mLock = new Object(); + + @GuardedBy("mLock") + private AccountManagerBackupHelper mBackupHelper; + + @Override + public void requestAccountAccess(@NonNull Account account, @NonNull String packageName, + @IntRange(from = 0) int userId, @NonNull RemoteCallback callback) { + if (account == null) { + Slog.w(TAG, "account cannot be null"); + return; + } + if (packageName == null) { + Slog.w(TAG, "packageName cannot be null"); + return; + } + if (userId < UserHandle.USER_SYSTEM) { + Slog.w(TAG, "user id must be concrete"); + return; + } + if (callback == null) { + Slog.w(TAG, "callback cannot be null"); + return; + } + + if (AccountManagerService.this.hasAccountAccess(account, packageName, + new UserHandle(userId))) { + Bundle result = new Bundle(); + result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true); + callback.sendResult(result); + return; + } + + final int uid; + try { + uid = mPackageManager.getPackageUidAsUser(packageName, userId); + } catch (NameNotFoundException e) { + Slog.e(TAG, "Unknown package " + packageName); + return; + } + + Intent intent = newRequestAccountAccessIntent(account, packageName, uid, callback); + final UserAccounts userAccounts; + synchronized (mUsers) { + userAccounts = mUsers.get(userId); + } + doNotification(userAccounts, account, null, intent, packageName, userId); + } + + @Override + public void addOnAppPermissionChangeListener(OnAppPermissionChangeListener listener) { + // Listeners are a final CopyOnWriteArrayList, hence no lock needed. + mAppPermissionChangeListeners.add(listener); + } + + @Override + public boolean hasAccountAccess(@NonNull Account account, @IntRange(from = 0) int uid) { + return AccountManagerService.this.hasAccountAccess(account, null, uid); + } + + @Override + public byte[] backupAccountAccessPermissions(int userId) { + synchronized (mLock) { + if (mBackupHelper == null) { + mBackupHelper = new AccountManagerBackupHelper( + AccountManagerService.this, this); + } + return mBackupHelper.backupAccountAccessPermissions(userId); + } + } + + @Override + public void restoreAccountAccessPermissions(byte[] data, int userId) { + synchronized (mLock) { + if (mBackupHelper == null) { + mBackupHelper = new AccountManagerBackupHelper( + AccountManagerService.this, this); + } + mBackupHelper.restoreAccountAccessPermissions(data, userId); + } + } + } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cd82f66c254c..f65fab8d98aa 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -641,7 +641,8 @@ public final class ActivityManagerService extends ActivityManagerNative boolean mDoingSetFocusedActivity; public boolean canShowErrorDialogs() { - return mShowDialogs && !mSleeping && !mShuttingDown; + return mShowDialogs && !mSleeping && !mShuttingDown + && mLockScreenShown != LOCK_SCREEN_SHOWN; } private static final class PriorityState { @@ -1158,6 +1159,7 @@ public final class ActivityManagerService extends ActivityManagerNative * For example, references to the commonly used services. */ HashMap<String, IBinder> mAppBindArgs; + HashMap<String, IBinder> mIsolatedAppBindArgs; /** * Temporary to avoid allocations. Protected by main lock. @@ -2377,22 +2379,21 @@ public final class ActivityManagerService extends ActivityManagerNative if (memInfo != null) { updateCpuStatsNow(); long nativeTotalPss = 0; + final List<ProcessCpuTracker.Stats> stats; synchronized (mProcessCpuTracker) { - final int N = mProcessCpuTracker.countStats(); - for (int j=0; j<N; j++) { - ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(j); - if (st.vsize <= 0 || st.uid >= Process.FIRST_APPLICATION_UID) { - // This is definitely an application process; skip it. + stats = mProcessCpuTracker.getStats( (st)-> { + return st.vsize > 0 && st.uid < Process.FIRST_APPLICATION_UID; + }); + } + final int N = stats.size(); + for (int j = 0; j < N; j++) { + synchronized (mPidsSelfLocked) { + if (mPidsSelfLocked.indexOfKey(stats.get(j).pid) >= 0) { + // This is one of our own processes; skip it. continue; } - synchronized (mPidsSelfLocked) { - if (mPidsSelfLocked.indexOfKey(st.pid) >= 0) { - // This is one of our own processes; skip it. - continue; - } - } - nativeTotalPss += Debug.getPss(st.pid, null, null); } + nativeTotalPss += Debug.getPss(stats.get(j).pid, null, null); } memInfo.readMemInfo(); synchronized (ActivityManagerService.this) { @@ -2935,18 +2936,24 @@ public final class ActivityManagerService extends ActivityManagerNative * lazily setup to make sure the services are running when they're asked for. */ private HashMap<String, IBinder> getCommonServicesLocked(boolean isolated) { + // Isolated processes won't get this optimization, so that we don't + // violate the rules about which services they have access to. + if (isolated) { + if (mIsolatedAppBindArgs == null) { + mIsolatedAppBindArgs = new HashMap<>(); + mIsolatedAppBindArgs.put("package", ServiceManager.getService("package")); + } + return mIsolatedAppBindArgs; + } + if (mAppBindArgs == null) { mAppBindArgs = new HashMap<>(); - // Isolated processes won't get this optimization, so that we don't - // violate the rules about which services they have access to. - if (!isolated) { - // Setup the application init args - mAppBindArgs.put("package", ServiceManager.getService("package")); - mAppBindArgs.put("window", ServiceManager.getService("window")); - mAppBindArgs.put(Context.ALARM_SERVICE, - ServiceManager.getService(Context.ALARM_SERVICE)); - } + // Setup the application init args + mAppBindArgs.put("package", ServiceManager.getService("package")); + mAppBindArgs.put("window", ServiceManager.getService("window")); + mAppBindArgs.put(Context.ALARM_SERVICE, + ServiceManager.getService(Context.ALARM_SERVICE)); } return mAppBindArgs; } @@ -13828,7 +13835,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { java.lang.Process logcat = new ProcessBuilder( "/system/bin/timeout", "-k", "15s", "10s", - "/system/bin/logcat", "-v", "time", "-b", "events", "-b", "system", + "/system/bin/logcat", "-v", "threadtime", "-b", "events", "-b", "system", "-b", "main", "-b", "crash", "-t", String.valueOf(lines)) .redirectErrorStream(true).start(); @@ -16518,21 +16525,24 @@ public final class ActivityManagerService extends ActivityManagerNative } updateCpuStatsNow(); long[] memtrackTmp = new long[1]; + final List<ProcessCpuTracker.Stats> stats; + // Get a list of Stats that have vsize > 0 synchronized (mProcessCpuTracker) { - final int N = mProcessCpuTracker.countStats(); - for (int i=0; i<N; i++) { - ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); - if (st.vsize > 0) { - long pss = Debug.getPss(st.pid, null, memtrackTmp); - if (pss > 0) { - if (infoMap.indexOfKey(st.pid) < 0) { - ProcessMemInfo mi = new ProcessMemInfo(st.name, st.pid, - ProcessList.NATIVE_ADJ, -1, "native", null); - mi.pss = pss; - mi.memtrack = memtrackTmp[0]; - memInfos.add(mi); - } - } + stats = mProcessCpuTracker.getStats((st) -> { + return st.vsize > 0; + }); + } + final int statsCount = stats.size(); + for (int i = 0; i < statsCount; i++) { + ProcessCpuTracker.Stats st = stats.get(i); + long pss = Debug.getPss(st.pid, null, memtrackTmp); + if (pss > 0) { + if (infoMap.indexOfKey(st.pid) < 0) { + ProcessMemInfo mi = new ProcessMemInfo(st.name, st.pid, + ProcessList.NATIVE_ADJ, -1, "native", null); + mi.pss = pss; + mi.memtrack = memtrackTmp[0]; + memInfos.add(mi); } } } @@ -17785,6 +17795,7 @@ public final class ActivityManagerService extends ActivityManagerNative || Intent.ACTION_MEDIA_BUTTON.equals(action) || Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.equals(action) || Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS.equals(action) + || Intent.ACTION_MASTER_CLEAR.equals(action) || AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(action) || AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) || LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action) @@ -22187,4 +22198,22 @@ public final class ActivityManagerService extends ActivityManagerNative Binder.restoreCallingIdentity(callingId); } } + + @Override + public boolean canBypassWorkChallenge(PendingIntent intent) throws RemoteException { + final int userId = intent.getCreatorUserHandle().getIdentifier(); + if (!mUserController.isUserRunningLocked(userId, ActivityManager.FLAG_AND_LOCKED)) { + return false; + } + IIntentSender target = intent.getTarget(); + if (!(target instanceof PendingIntentRecord)) { + return false; + } + final PendingIntentRecord record = (PendingIntentRecord) target; + final ResolveInfo rInfo = mStackSupervisor.resolveIntent(record.key.requestIntent, + record.key.requestResolvedType, userId, PackageManager.MATCH_DIRECT_BOOT_AWARE); + // For direct boot aware activities, they can be shown without triggering a work challenge + // before the profile user is unlocked. + return rInfo != null && rInfo.activityInfo != null; + } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 489eb77729e3..589563333dfa 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -17,6 +17,7 @@ package com.android.server.am; import static android.app.ActivityManager.StackId; +import static android.app.ActivityManager.StackId.DOCKED_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_CROP_WINDOWS; @@ -946,21 +947,29 @@ final class ActivityRecord { // The activity now gets access to the data associated with this Intent. service.grantUriPermissionFromIntentLocked(callingUid, packageName, intent, getUriPermissionsLocked(), userId); - // We want to immediately deliver the intent to the activity if - // it is currently the top resumed activity... however, if the - // device is sleeping, then all activities are stopped, so in that - // case we will deliver it if this is the current top activity on its - // stack. final ReferrerIntent rintent = new ReferrerIntent(intent, referrer); boolean unsent = true; - if ((state == ActivityState.RESUMED - || (service.isSleepingLocked() && task.stack != null - && task.stack.topRunningActivityLocked() == this)) - && app != null && app.thread != null) { + final ActivityStack stack = task.stack; + final boolean isTopActivityInStack = + stack != null && stack.topRunningActivityLocked() == this; + final boolean isTopActivityWhileSleeping = + service.isSleepingLocked() && isTopActivityInStack; + final boolean isTopActivityInMinimizedDockedStack = isTopActivityInStack + && stack.mStackId == DOCKED_STACK_ID && mStackSupervisor.mIsDockMinimized + && state == ActivityState.PAUSED; + + // We want to immediately deliver the intent to the activity if: + // - It is the resumed activity. + // - The device is sleeping and it is the top activity behind the lock screen (b/6700897). + // - It is the top activity in a minimized docked stack. In this case the activity will be + // temporarily resumed then paused again on the client side. + if ((state == ActivityState.RESUMED || isTopActivityWhileSleeping + || isTopActivityInMinimizedDockedStack) && app != null && app.thread != null) { try { ArrayList<ReferrerIntent> ar = new ArrayList<>(1); ar.add(rintent); - app.thread.scheduleNewIntent(ar, appToken); + app.thread.scheduleNewIntent( + ar, appToken, isTopActivityInMinimizedDockedStack /* andPause */); unsent = false; } catch (RemoteException e) { Slog.w(TAG, "Exception thrown sending new intent to " + this, e); @@ -1309,8 +1318,12 @@ final class ActivityRecord { state == ActivityState.RESUMED; } - public void setSleeping(boolean _sleeping) { - if (sleeping == _sleeping) { + void setSleeping(boolean _sleeping) { + setSleeping(_sleeping, false); + } + + void setSleeping(boolean _sleeping, boolean force) { + if (!force && sleeping == _sleeping) { return; } if (app != null && app.thread != null) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 8c4c0ad9af05..60d3d1ec349b 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1308,7 +1308,9 @@ final class ActivityStack { // It is possible the activity was freezing the screen before it was paused. // In that case go ahead and remove the freeze this activity has on the screen // since it is no longer visible. - prev.stopFreezingScreenLocked(true /*force*/); + if (prev != null) { + prev.stopFreezingScreenLocked(true /*force*/); + } mPausingActivity = null; } @@ -1591,11 +1593,6 @@ final class ActivityStack { return STACK_INVISIBLE; } - final boolean isLockscreenShown = mService.mLockScreenShown == LOCK_SCREEN_SHOWN; - if (isLockscreenShown && !StackId.isAllowedOverLockscreen(mStackId)) { - return STACK_INVISIBLE; - } - final ActivityStack focusedStack = mStackSupervisor.getFocusedStack(); final int focusedStackId = focusedStack.mStackId; @@ -2498,7 +2495,8 @@ final class ActivityStack { break; } } - next.app.thread.scheduleNewIntent(next.newIntents, next.appToken); + next.app.thread.scheduleNewIntent( + next.newIntents, next.appToken, false /* andPause */); } // Well the app will no longer be stopped. @@ -4517,15 +4515,6 @@ final class ActivityStack { return true; } - // TODO: We could probably make the condition below just check that the activity state is - // stopped, but also checking the sleep state for now to reduce change impact late in - // development cycle. - if (mService.isSleepingOrShuttingDownLocked() && r.state == ActivityState.STOPPED) { - if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, - "Skipping config check (stopped while sleeping): " + r); - return true; - } - if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Ensuring correct configuration: " + r); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index a0087c858641..17670f8c5669 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -3765,6 +3765,12 @@ public final class ActivityStackSupervisor implements DisplayListener { void activityRelaunchedLocked(IBinder token) { mWindowManager.notifyAppRelaunchingFinished(token); + if (mService.isSleepingOrShuttingDownLocked()) { + final ActivityRecord r = ActivityRecord.isInStackLocked(token); + if (r != null) { + r.setSleeping(true, true); + } + } } void activityRelaunchingLocked(ActivityRecord r) { diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java index f26e47e934c4..d719c586f6c5 100644 --- a/services/core/java/com/android/server/am/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java @@ -29,6 +29,7 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED; +import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.KeyguardManager; import android.app.admin.DevicePolicyManagerInternal; @@ -210,6 +211,11 @@ class ActivityStartInterceptor { if (!mService.mUserController.shouldConfirmCredentials(userId)) { return null; } + // Allow direct boot aware activity to be displayed before the user is unlocked. + if (aInfo.directBootAware && mService.mUserController.isUserRunningLocked(userId, + ActivityManager.FLAG_AND_LOCKED)) { + return null; + } final IIntentSender target = mService.getIntentSenderLocked( INTENT_SENDER_ACTIVITY, callingPackage, Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ intent }, diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index bbf09e88abc3..cec37d850e18 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -103,6 +103,7 @@ import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.PowerManagerInternal; +import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; @@ -132,6 +133,9 @@ class ActivityStarter { private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; private static final String TAG_USER_LEAVING = TAG + POSTFIX_USER_LEAVING; + // TODO b/30204367 remove when the platform fully supports ephemeral applications + private static final boolean USE_DEFAULT_EPHEMERAL_LAUNCHER = false; + private final ActivityManagerService mService; private final ActivityStackSupervisor mSupervisor; private ActivityStartInterceptor mInterceptor; @@ -456,39 +460,13 @@ class ActivityStarter { // starts either the intent we resolved here [on install error] or the ephemeral // app [on install success]. if (rInfo != null && rInfo.ephemeralResolveInfo != null) { - // Create a pending intent to start the intent resolved here. - final IIntentSender failureTarget = mService.getIntentSenderLocked( - ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, - Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ intent }, - new String[]{ resolvedType }, - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT - | PendingIntent.FLAG_IMMUTABLE, null); - - // Create a pending intent to start the ephemeral application; force it to be - // directed to the ephemeral package. - ephemeralIntent.setPackage(rInfo.ephemeralResolveInfo.getPackageName()); - final IIntentSender ephemeralTarget = mService.getIntentSenderLocked( - ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, - Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ ephemeralIntent }, - new String[]{ resolvedType }, - PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT - | PendingIntent.FLAG_IMMUTABLE, null); - - int flags = intent.getFlags(); - intent = new Intent(); - intent.setFlags(flags - | Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - intent.putExtra(Intent.EXTRA_PACKAGE_NAME, - rInfo.ephemeralResolveInfo.getPackageName()); - intent.putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, new IntentSender(failureTarget)); - intent.putExtra(Intent.EXTRA_EPHEMERAL_SUCCESS, new IntentSender(ephemeralTarget)); - + intent = buildEphemeralInstallerIntent(intent, ephemeralIntent, + rInfo.ephemeralResolveInfo.getPackageName(), callingPackage, resolvedType, + userId); resolvedType = null; callingUid = realCallingUid; callingPid = realCallingPid; - rInfo = rInfo.ephemeralInstaller; aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); } @@ -543,6 +521,60 @@ class ActivityStarter { return err; } + /** + * Builds and returns an intent to launch the ephemeral installer. + */ + private Intent buildEphemeralInstallerIntent(Intent launchIntent, Intent origIntent, + String ephemeralPackage, String callingPackage, String resolvedType, int userId) { + final Intent nonEphemeralIntent = new Intent(origIntent); + nonEphemeralIntent.setFlags(nonEphemeralIntent.getFlags() | Intent.FLAG_IGNORE_EPHEMERAL); + // Intent that is launched if the ephemeral package couldn't be installed + // for any reason. + final IIntentSender failureIntentTarget = mService.getIntentSenderLocked( + ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, + Binder.getCallingUid(), userId, null /*token*/, null /*resultWho*/, 1, + new Intent[]{ nonEphemeralIntent }, new String[]{ resolvedType }, + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_IMMUTABLE, null /*bOptions*/); + + final Intent ephemeralIntent; + if (USE_DEFAULT_EPHEMERAL_LAUNCHER) { + // Force the intent to be directed to the ephemeral package + ephemeralIntent = new Intent(origIntent); + ephemeralIntent.setPackage(ephemeralPackage); + } else { + // Success intent goes back to the installer + // TODO; do we need any extras for the installer? + ephemeralIntent = new Intent(launchIntent); + ephemeralIntent.setData(null); + } + + // Intent that is eventually launched if the ephemeral package was + // installed successfully. This will actually be launched by a platform + // broadcast receiver. + final IIntentSender successIntentTarget = mService.getIntentSenderLocked( + ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, + Binder.getCallingUid(), userId, null /*token*/, null /*resultWho*/, 0, + new Intent[]{ ephemeralIntent }, new String[]{ resolvedType }, + PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT + | PendingIntent.FLAG_IMMUTABLE, null /*bOptions*/); + + // Finally build the actual intent to launch the ephemeral installer + int flags = launchIntent.getFlags(); + final Intent intent = new Intent(); + intent.setFlags(flags + | Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_CLEAR_TASK + | Intent.FLAG_ACTIVITY_NO_HISTORY + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + intent.putExtra(Intent.EXTRA_PACKAGE_NAME, ephemeralPackage); + intent.putExtra(Intent.EXTRA_EPHEMERAL_FAILURE, new IntentSender(failureIntentTarget)); + intent.putExtra(Intent.EXTRA_EPHEMERAL_SUCCESS, new IntentSender(successIntentTarget)); + // TODO: Remove when the platform has fully implemented ephemeral apps + intent.setData(origIntent.getData()); + return intent; + } + void postStartActivityUncheckedProcessing( ActivityRecord r, int result, int prevFocusedStackId, ActivityRecord sourceRecord, ActivityStack targetStack) { @@ -572,6 +604,9 @@ class ActivityStarter { // If we launched the activity from a no display activity that was launched from the home // screen, we also need to start recents to un-minimize the docked stack, since the // noDisplay activity will be finished shortly after. + // Note that some apps have trampoline activities without noDisplay being set. In that case, + // we have another heuristic in DockedStackDividerController.notifyAppTransitionStarting + // that tries to detect that case. // TODO: We should prevent noDisplay activities from affecting task/stack ordering and // visibility instead of using this flag. final boolean noDisplayActivityOverHome = sourceRecord != null diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 7eff773543c8..0c67c75dc3e8 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -22,7 +22,6 @@ import com.android.internal.logging.MetricsProto; import com.android.internal.os.ProcessCpuTracker; import com.android.server.Watchdog; -import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.ActivityThread; @@ -33,10 +32,7 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; -import android.content.pm.IPackageDataObserver; -import android.content.pm.PackageManager; import android.os.Binder; -import android.os.Bundle; import android.os.Message; import android.os.Process; import android.os.RemoteException; @@ -59,7 +55,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Set; -import java.util.concurrent.Semaphore; import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR; @@ -359,7 +354,7 @@ class AppErrors { return; } - Message msg = Message.obtain(); + final Message msg = Message.obtain(); msg.what = ActivityManagerService.SHOW_ERROR_UI_MSG; task = data.task; @@ -575,6 +570,8 @@ class AppErrors { boolean handleAppCrashLocked(ProcessRecord app, String reason, String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) { long now = SystemClock.uptimeMillis(); + boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; Long crashTime; Long crashTimePersistent; @@ -612,7 +609,9 @@ class AppErrors { // processes run critical code. mService.removeProcessLocked(app, false, false, "crash"); mService.mStackSupervisor.resumeFocusedStackTopActivityLocked(); - return false; + if (!showBackground) { + return false; + } } mService.mStackSupervisor.resumeFocusedStackTopActivityLocked(); } else { @@ -705,7 +704,7 @@ class AppErrors { } final boolean crashSilenced = mAppsNotReportingCrashes != null && mAppsNotReportingCrashes.contains(proc.info.packageName); - if (mService.canShowErrorDialogs() && !crashSilenced) { + if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced) { proc.crashDialog = new AppErrorDialog(mContext, mService, data); } else { // The device is asleep, so just pretend that the user @@ -942,7 +941,9 @@ class AppErrors { null, null, 0, null, null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, Process.SYSTEM_UID, 0 /* TODO: Verify */); - if (mService.canShowErrorDialogs()) { + boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; + if (mService.canShowErrorDialogs() || showBackground) { d = new AppNotRespondingDialog(mService, mContext, proc, (ActivityRecord)data.get("activity"), msg.arg1 != 0); diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 2467a9094072..9c0845363860 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -38,6 +38,7 @@ import com.android.server.am.ActivityStackSupervisor.ActivityContainer; import java.io.PrintWriter; import java.lang.ref.WeakReference; +import java.util.Objects; final class PendingIntentRecord extends IIntentSender.Stub { private static final String TAG = TAG_WITH_CLASS_NAME ? "PendingIntentRecord" : TAG_AM; @@ -102,7 +103,7 @@ final class PendingIntentRecord extends IIntentSender.Stub { if (requestResolvedType != null) { hash = (ODD_PRIME_NUMBER*hash) + requestResolvedType.hashCode(); } - hash = (ODD_PRIME_NUMBER*hash) + _p.hashCode(); + hash = (ODD_PRIME_NUMBER*hash) + (_p != null ? _p.hashCode() : 0); hash = (ODD_PRIME_NUMBER*hash) + _t; hashCode = hash; //Slog.i(ActivityManagerService.TAG, this + " hashCode=0x" @@ -121,20 +122,14 @@ final class PendingIntentRecord extends IIntentSender.Stub { if (userId != other.userId){ return false; } - if (!packageName.equals(other.packageName)) { + if (!Objects.equals(packageName, other.packageName)) { return false; } if (activity != other.activity) { return false; } - if (who != other.who) { - if (who != null) { - if (!who.equals(other.who)) { - return false; - } - } else if (other.who != null) { - return false; - } + if (!Objects.equals(who, other.who)) { + return false; } if (requestCode != other.requestCode) { return false; @@ -148,14 +143,8 @@ final class PendingIntentRecord extends IIntentSender.Stub { return false; } } - if (requestResolvedType != other.requestResolvedType) { - if (requestResolvedType != null) { - if (!requestResolvedType.equals(other.requestResolvedType)) { - return false; - } - } else if (other.requestResolvedType != null) { - return false; - } + if (!Objects.equals(requestResolvedType, other.requestResolvedType)) { + return false; } if (flags != other.flags) { return false; diff --git a/services/core/java/com/android/server/am/TaskPersister.java b/services/core/java/com/android/server/am/TaskPersister.java index 48fecd5c4714..43eb251ba23b 100644 --- a/services/core/java/com/android/server/am/TaskPersister.java +++ b/services/core/java/com/android/server/am/TaskPersister.java @@ -87,6 +87,8 @@ public class TaskPersister { private final RecentTasks mRecentTasks; private final SparseArray<SparseBooleanArray> mTaskIdsInFile = new SparseArray<>(); private final File mTaskIdsDir; + // To lock file operations in TaskPersister + private final Object mIoLock = new Object(); /** * Value determines write delay mode as follows: < 0 We are Flushing. No delays between writes @@ -195,52 +197,52 @@ public class TaskPersister { return mTaskIdsInFile.get(userId).clone(); } final SparseBooleanArray persistedTaskIds = new SparseBooleanArray(); - BufferedReader reader = null; - String line; - try { - reader = new BufferedReader(new FileReader(getUserPersistedTaskIdsFile(userId))); - while ((line = reader.readLine()) != null) { - for (String taskIdString : line.split("\\s+")) { - int id = Integer.parseInt(taskIdString); - persistedTaskIds.put(id, true); + synchronized (mIoLock) { + BufferedReader reader = null; + String line; + try { + reader = new BufferedReader(new FileReader(getUserPersistedTaskIdsFile(userId))); + while ((line = reader.readLine()) != null) { + for (String taskIdString : line.split("\\s+")) { + int id = Integer.parseInt(taskIdString); + persistedTaskIds.put(id, true); + } } + } catch (FileNotFoundException e) { + // File doesn't exist. Ignore. + } catch (Exception e) { + Slog.e(TAG, "Error while reading taskIds file for user " + userId, e); + } finally { + IoUtils.closeQuietly(reader); } - } catch (FileNotFoundException e) { - // File doesn't exist. Ignore. - } catch (Exception e) { - Slog.e(TAG, "Error while reading taskIds file for user " + userId, e); - } finally { - IoUtils.closeQuietly(reader); } mTaskIdsInFile.put(userId, persistedTaskIds); return persistedTaskIds.clone(); } + @VisibleForTesting - void maybeWritePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { + void writePersistedTaskIdsForUser(@NonNull SparseBooleanArray taskIds, int userId) { if (userId < 0) { return; } - SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); - if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIds)) { - return; - } final File persistedTaskIdsFile = getUserPersistedTaskIdsFile(userId); - BufferedWriter writer = null; - try { - writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile)); - for (int i = 0; i < taskIds.size(); i++) { - if (taskIds.valueAt(i)) { - writer.write(String.valueOf(taskIds.keyAt(i))); - writer.newLine(); + synchronized (mIoLock) { + BufferedWriter writer = null; + try { + writer = new BufferedWriter(new FileWriter(persistedTaskIdsFile)); + for (int i = 0; i < taskIds.size(); i++) { + if (taskIds.valueAt(i)) { + writer.write(String.valueOf(taskIds.keyAt(i))); + writer.newLine(); + } } + } catch (Exception e) { + Slog.e(TAG, "Error while writing taskIds file for user " + userId, e); + } finally { + IoUtils.closeQuietly(writer); } - } catch (Exception e) { - Slog.e(TAG, "Error while writing taskIds file for user " + userId, e); - } finally { - IoUtils.closeQuietly(writer); } - mTaskIdsInFile.put(userId, taskIds.clone()); } void unloadUserDataFromMemory(int userId) { @@ -543,16 +545,23 @@ public class TaskPersister { } private void writeTaskIdsFiles() { - int candidateUserIds[]; + SparseArray<SparseBooleanArray> changedTaskIdsPerUser = new SparseArray<>(); synchronized (mService) { - candidateUserIds = mRecentTasks.usersWithRecentsLoadedLocked(); - } - SparseBooleanArray taskIdsToSave; - for (int userId : candidateUserIds) { - synchronized (mService) { - taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId).clone(); + for (int userId : mRecentTasks.usersWithRecentsLoadedLocked()) { + SparseBooleanArray taskIdsToSave = mRecentTasks.mPersistedTaskIds.get(userId); + SparseBooleanArray persistedIdsInFile = mTaskIdsInFile.get(userId); + if (persistedIdsInFile != null && persistedIdsInFile.equals(taskIdsToSave)) { + continue; + } else { + SparseBooleanArray taskIdsToSaveCopy = taskIdsToSave.clone(); + mTaskIdsInFile.put(userId, taskIdsToSaveCopy); + changedTaskIdsPerUser.put(userId, taskIdsToSaveCopy); + } } - maybeWritePersistedTaskIdsForUser(taskIdsToSave, userId); + } + for (int i = 0; i < changedTaskIdsPerUser.size(); i++) { + writePersistedTaskIdsForUser(changedTaskIdsPerUser.valueAt(i), + changedTaskIdsPerUser.keyAt(i)); } } diff --git a/services/core/java/com/android/server/am/UriPermission.java b/services/core/java/com/android/server/am/UriPermission.java index 6e371c1138ca..0aa54d910ea7 100644 --- a/services/core/java/com/android/server/am/UriPermission.java +++ b/services/core/java/com/android/server/am/UriPermission.java @@ -19,6 +19,7 @@ package com.android.server.am; import android.content.Intent; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import com.android.server.am.ActivityManagerService.GrantUri; @@ -93,7 +94,16 @@ final class UriPermission { } private void updateModeFlags() { + final int oldModeFlags = modeFlags; modeFlags = ownedModeFlags | globalModeFlags | persistableModeFlags | persistedModeFlags; + + if (Log.isLoggable(TAG, Log.VERBOSE) && (modeFlags != oldModeFlags)) { + Slog.d(TAG, + "Permission for " + targetPkg + " to " + uri + " is changing from 0x" + + Integer.toHexString(oldModeFlags) + " to 0x" + + Integer.toHexString(modeFlags), + new Throwable()); + } } /** diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 275870e3d4b0..b4606bb652cf 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -206,7 +206,6 @@ public class AudioService extends IAudioService.Stub { private static final int MSG_BT_HEADSET_CNCT_FAILED = 9; private static final int MSG_SET_ALL_VOLUMES = 10; private static final int MSG_REPORT_NEW_ROUTES = 12; - private static final int MSG_SET_FORCE_BT_A2DP_USE = 13; private static final int MSG_CHECK_MUSIC_ACTIVE = 14; private static final int MSG_BROADCAST_AUDIO_BECOMING_NOISY = 15; private static final int MSG_CONFIGURE_SAFE_MEDIA_VOLUME = 16; @@ -512,6 +511,10 @@ public class AudioService extends IAudioService.Stub { // Request to override default use of A2DP for media. private boolean mBluetoothA2dpEnabled; + // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore + // state of bluetooth A2DP enable request sen by deprecated APIs setBluetoothA2dpOn() and + // isBluettohA2dpOn() + private boolean mBluetoothA2dpEnabledExternal; private final Object mBluetoothA2dpEnabledLock = new Object(); // Monitoring of audio routes. Protected by mCurAudioRoutes. @@ -2706,22 +2709,23 @@ public class AudioService extends IAudioService.Stub { return (mForcedUseForComm == AudioSystem.FORCE_BT_SCO); } - /** @see AudioManager#setBluetoothA2dpOn(boolean) */ + /** + * Deprecated. + * Keep stub implementation until MediaRouter stops using it. + * @deprecated + * */ public void setBluetoothA2dpOn(boolean on) { - synchronized (mBluetoothA2dpEnabledLock) { - mBluetoothA2dpEnabled = on; - sendMsg(mAudioHandler, MSG_SET_FORCE_BT_A2DP_USE, SENDMSG_QUEUE, - AudioSystem.FOR_MEDIA, - mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP, - null, 0); - } + mBluetoothA2dpEnabledExternal = on; + Log.e(TAG, "setBluetoothA2dpOn() is deprecated, now a no-op", + new Exception("Deprecated use of setBluetoothA2dpOn()")); } - /** @see AudioManager#isBluetoothA2dpOn() */ + /** Deprecated. + * Keep stub implementation until MediaRouter stops using it + * @deprecated + * */ public boolean isBluetoothA2dpOn() { - synchronized (mBluetoothA2dpEnabledLock) { - return mBluetoothA2dpEnabled; - } + return mBluetoothA2dpEnabledExternal; } /** @see AudioManager#startBluetoothSco() */ @@ -3792,6 +3796,11 @@ public class AudioService extends IAudioService.Stub { Slog.i(TAG, "setWiredDeviceConnectionState(" + state + " nm: " + name + " addr:" + address + ")"); } + if ((state == 0) && ((type == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || + (type == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) || + (type == AudioSystem.DEVICE_OUT_LINE))) { + setBluetoothA2dpOnInt(true); + } int delay = checkSendBecomingNoisyIntent(type, state); queueMsgUnderWakeLock(mAudioHandler, MSG_SET_WIRED_DEVICE_CONNECTION_STATE, @@ -4603,7 +4612,6 @@ public class AudioService extends IAudioService.Stub { break; case MSG_SET_FORCE_USE: - case MSG_SET_FORCE_BT_A2DP_USE: setForceUse(msg.arg1, msg.arg2); break; @@ -5011,6 +5019,7 @@ public class AudioService extends IAudioService.Stub { devices |= dev; } } + if (devices == device) { sendMsg(mAudioHandler, MSG_BROADCAST_AUDIO_BECOMING_NOISY, @@ -5106,11 +5115,6 @@ public class AudioService extends IAudioService.Stub { } synchronized (mConnectedDevices) { - if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || - (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) || - (device == AudioSystem.DEVICE_OUT_LINE))) { - setBluetoothA2dpOnInt(true); - } boolean isUsb = ((device & ~AudioSystem.DEVICE_OUT_ALL_USB) == 0) || (((device & AudioSystem.DEVICE_BIT_IN) != 0) && ((device & ~AudioSystem.DEVICE_IN_ALL_USB) == 0)); @@ -5594,7 +5598,6 @@ public class AudioService extends IAudioService.Stub { public void setBluetoothA2dpOnInt(boolean on) { synchronized (mBluetoothA2dpEnabledLock) { mBluetoothA2dpEnabled = on; - mAudioHandler.removeMessages(MSG_SET_FORCE_BT_A2DP_USE); setForceUseInt_SyncDevices(AudioSystem.FOR_MEDIA, mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); } diff --git a/services/core/java/com/android/server/audio/FocusRequester.java b/services/core/java/com/android/server/audio/FocusRequester.java index 49be879b93c7..cc18114120eb 100644 --- a/services/core/java/com/android/server/audio/FocusRequester.java +++ b/services/core/java/com/android/server/audio/FocusRequester.java @@ -40,9 +40,9 @@ public class FocusRequester { private static final String TAG = "MediaFocusControl"; private static final boolean DEBUG = false; - private AudioFocusDeathHandler mDeathHandler; - private final IAudioFocusDispatcher mFocusDispatcher; // may be null - private final IBinder mSourceRef; + private AudioFocusDeathHandler mDeathHandler; // may be null + private IAudioFocusDispatcher mFocusDispatcher; // may be null + private final IBinder mSourceRef; // may be null private final String mClientId; private final String mPackageName; private final int mCallingUid; @@ -205,6 +205,7 @@ public class FocusRequester { if (mSourceRef != null && mDeathHandler != null) { mSourceRef.unlinkToDeath(mDeathHandler, 0); mDeathHandler = null; + mFocusDispatcher = null; } } catch (java.util.NoSuchElementException e) { Log.e(TAG, "FocusRequester.release() hit ", e); @@ -275,12 +276,13 @@ public class FocusRequester { mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE; mFocusController.notifyExtPolicyFocusGrant_syncAf(toAudioFocusInfo(), AudioManager.AUDIOFOCUS_REQUEST_GRANTED); - if (mFocusDispatcher != null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd != null) { if (DEBUG) { Log.v(TAG, "dispatching " + focusChangeToString(focusGain) + " to " + mClientId); } - mFocusDispatcher.dispatchAudioFocusChange(focusGain, mClientId); + fd.dispatchAudioFocusChange(focusGain, mClientId); } } catch (android.os.RemoteException e) { Log.e(TAG, "Failure to signal gain of audio focus due to: ", e); @@ -311,14 +313,15 @@ public class FocusRequester { toAudioFocusInfo(), false /* wasDispatched */); return; } - if (mFocusDispatcher != null) { + final IAudioFocusDispatcher fd = mFocusDispatcher; + if (fd != null) { if (DEBUG) { Log.v(TAG, "dispatching " + focusChangeToString(mFocusLossReceived) + " to " + mClientId); } mFocusController.notifyExtPolicyFocusLoss_syncAf( toAudioFocusInfo(), true /* wasDispatched */); - mFocusDispatcher.dispatchAudioFocusChange(mFocusLossReceived, mClientId); + fd.dispatchAudioFocusChange(mFocusLossReceived, mClientId); } } } catch (android.os.RemoteException e) { diff --git a/services/core/java/com/android/server/audio/MediaFocusControl.java b/services/core/java/com/android/server/audio/MediaFocusControl.java index 278d70b2226d..206834e9adc4 100644 --- a/services/core/java/com/android/server/audio/MediaFocusControl.java +++ b/services/core/java/com/android/server/audio/MediaFocusControl.java @@ -160,6 +160,7 @@ public class MediaFocusControl { Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for " + clientToRemove); stackIterator.remove(); + // stack entry not used anymore, clear references fr.release(); } } @@ -171,7 +172,7 @@ public class MediaFocusControl { * Called synchronized on mAudioFocusLock * Remove focus listeners from the focus stack for a particular client when it has died. */ - private void removeFocusStackEntryForClient(IBinder cb) { + private void removeFocusStackEntryOnDeath(IBinder cb) { // is the owner of the audio focus part of the client to remove? boolean isTopOfStackForClientToRemove = !mFocusStack.isEmpty() && mFocusStack.peek().hasSameBinder(cb); @@ -181,9 +182,10 @@ public class MediaFocusControl { while(stackIterator.hasNext()) { FocusRequester fr = stackIterator.next(); if(fr.hasSameBinder(cb)) { - Log.i(TAG, "AudioFocus removeFocusStackEntry(): removing entry for " + cb); + Log.i(TAG, "AudioFocus removeFocusStackEntryOnDeath(): removing entry for " + cb); stackIterator.remove(); - // the client just died, no need to unlink to its death + // stack entry not used anymore, clear references + fr.release(); } } if (isTopOfStackForClientToRemove) { @@ -257,14 +259,9 @@ public class MediaFocusControl { public void binderDied() { synchronized(mAudioFocusLock) { - Log.w(TAG, " AudioFocus audio focus client died"); - removeFocusStackEntryForClient(mCb); + removeFocusStackEntryOnDeath(mCb); } } - - public IBinder getBinder() { - return mCb; - } } /** @@ -420,6 +417,7 @@ public class MediaFocusControl { // (premature death == death before abandoning focus) // Register for client death notification AudioFocusDeathHandler afdh = new AudioFocusDeathHandler(cb); + try { cb.linkToDeath(afdh, 0); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java index 3503eacb0735..cb4bb8840b5a 100644 --- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java +++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java @@ -104,14 +104,16 @@ import java.util.TreeSet; // ----------------------------------------------- // If a network has no chance of satisfying any requests (even if it were to become validated // and enter state #5), ConnectivityService will disconnect the NetworkAgent's AsyncChannel. -// If the network ever for any period of time had satisfied a NetworkRequest (i.e. had been -// the highest scoring that satisfied the NetworkRequest's constraints), but is no longer the -// highest scoring network for any NetworkRequest, then there will be a 30s pause before -// ConnectivityService disconnects the NetworkAgent's AsyncChannel. During this pause the -// network is considered "lingering". This pause exists to allow network communication to be -// wrapped up rather than abruptly terminated. During this pause if the network begins satisfying -// a NetworkRequest, ConnectivityService will cancel the future disconnection of the NetworkAgent's -// AsyncChannel, and the network is no longer considered "lingering". +// +// If the network was satisfying a foreground NetworkRequest (i.e. had been the highest scoring that +// satisfied the NetworkRequest's constraints), but is no longer the highest scoring network for any +// foreground NetworkRequest, then there will be a 30s pause to allow network communication to be +// wrapped up rather than abruptly terminated. During this pause the network is said to be +// "lingering". During this pause if the network begins satisfying a foreground NetworkRequest, +// ConnectivityService will cancel the future disconnection of the NetworkAgent's AsyncChannel, and +// the network is no longer considered "lingering". After the linger timer expires, if the network +// is satisfying one or more background NetworkRequests it is kept up in the background. If it is +// not, ConnectivityService disconnects the NetworkAgent's AsyncChannel. public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public NetworkInfo networkInfo; @@ -228,11 +230,13 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { // The list of NetworkRequests being satisfied by this Network. private final SparseArray<NetworkRequest> mNetworkRequests = new SparseArray<>(); - // The list of NetworkRequests that this Network previously satisfied with the highest - // score. A non-empty list indicates that if this Network was validated it is lingered. + // How many of the satisfied requests are actual requests and not listens. private int mNumRequestNetworkRequests = 0; + // How many of the satisfied requests are of type BACKGROUND_REQUEST. + private int mNumBackgroundNetworkRequests = 0; + public final Messenger messenger; public final AsyncChannel asyncChannel; @@ -266,6 +270,32 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { // // These functions must only called on ConnectivityService's main thread. + private static final boolean ADD = true; + private static final boolean REMOVE = false; + + private void updateRequestCounts(boolean add, NetworkRequest request) { + int delta = add ? +1 : -1; + switch (request.type) { + case REQUEST: + case TRACK_DEFAULT: + mNumRequestNetworkRequests += delta; + break; + + case BACKGROUND_REQUEST: + mNumRequestNetworkRequests += delta; + mNumBackgroundNetworkRequests += delta; + break; + + case LISTEN: + break; + + case NONE: + default: + Log.wtf(TAG, "Unhandled request type " + request.type); + break; + } + } + /** * Add {@code networkRequest} to this network as it's satisfied by this network. * @return true if {@code networkRequest} was added or false if {@code networkRequest} was @@ -274,9 +304,15 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public boolean addRequest(NetworkRequest networkRequest) { NetworkRequest existing = mNetworkRequests.get(networkRequest.requestId); if (existing == networkRequest) return false; - if (existing != null && existing.isRequest()) mNumRequestNetworkRequests--; + if (existing != null) { + // Should only happen if the requestId wraps. If that happens lots of other things will + // be broken as well. + Log.wtf(TAG, String.format("Duplicate requestId for %s and %s on %s", + networkRequest, existing, name())); + updateRequestCounts(REMOVE, existing); + } mNetworkRequests.put(networkRequest.requestId, networkRequest); - if (networkRequest.isRequest()) mNumRequestNetworkRequests++; + updateRequestCounts(ADD, networkRequest); return true; } @@ -286,9 +322,9 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { public void removeRequest(int requestId) { NetworkRequest existing = mNetworkRequests.get(requestId); if (existing == null) return; + updateRequestCounts(REMOVE, existing); mNetworkRequests.remove(requestId); if (existing.isRequest()) { - mNumRequestNetworkRequests--; unlingerRequest(existing); } } @@ -317,12 +353,37 @@ public class NetworkAgentInfo implements Comparable<NetworkAgentInfo> { } /** + * Returns the number of requests currently satisfied by this network of type + * {@link android.net.NetworkRequest.Type.BACKGROUND_REQUEST}. + */ + public int numBackgroundNetworkRequests() { + return mNumBackgroundNetworkRequests; + } + + /** + * Returns the number of foreground requests currently satisfied by this network. + */ + public int numForegroundNetworkRequests() { + return mNumRequestNetworkRequests - mNumBackgroundNetworkRequests; + } + + /** * Returns the number of requests of any type currently satisfied by this network. */ public int numNetworkRequests() { return mNetworkRequests.size(); } + /** + * Returns whether the network is a background network. A network is a background network if it + * is satisfying no foreground requests and at least one background request. (If it did not have + * a background request, it would be a speculative network that is only being kept up because + * it might satisfy a request if it validated). + */ + public boolean isBackgroundNetwork() { + return !isVPN() && numForegroundNetworkRequests() == 0 && mNumBackgroundNetworkRequests > 0; + } + // Does this network satisfy request? public boolean satisfies(NetworkRequest request) { return created && diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java index 7525f302c141..c2c1a8c5fef7 100644 --- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java +++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java @@ -25,6 +25,7 @@ import android.net.NetworkState; import android.net.RouteInfo; import android.net.ip.RouterAdvertisementDaemon; import android.net.ip.RouterAdvertisementDaemon.RaParams; +import android.net.util.NetdService; import android.os.INetworkManagementService; import android.os.ServiceSpecificException; import android.os.RemoteException; @@ -193,7 +194,7 @@ class IPv6TetheringInterfaceServices { private void configureLocalDns( HashSet<Inet6Address> deprecatedDnses, HashSet<Inet6Address> newDnses) { - INetd netd = getNetdServiceOrNull(); + final INetd netd = NetdService.getInstance(); if (netd == null) { if (newDnses != null) newDnses.clear(); Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses"); @@ -265,18 +266,6 @@ class IPv6TetheringInterfaceServices { return localRoutes; } - private INetd getNetdServiceOrNull() { - if (mNMService != null) { - try { - return mNMService.getNetdService(); - } catch (RemoteException ignored) { - // This blocks until netd can be reached, but it can return - // null during a netd crash. - } - } - return null; - } - // Given a prefix like 2001:db8::/64 return 2001:db8::1. private static Inet6Address getLocalDnsIpFor(IpPrefix localPrefix) { final byte[] dnsBytes = localPrefix.getRawAddress(); diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 01b23939815c..4e236d164a69 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -482,8 +482,7 @@ public final class ContentService extends IContentService.Stub { SyncManager syncManager = getSyncManager(); if (syncManager != null) { syncManager.scheduleSync(account, userId, uId, authority, extras, - 0 /* no delay */, 0 /* no delay */, - false /* onlyThoseWithUnkownSyncableState */); + SyncStorageEngine.AuthorityInfo.UNDEFINED); } } finally { restoreCallingIdentity(identityToken); @@ -547,12 +546,9 @@ public final class ContentService extends IContentService.Stub { getSyncManager().updateOrAddPeriodicSync(info, runAtTime, flextime, extras); } else { - long beforeRuntimeMillis = (flextime) * 1000; - long runtimeMillis = runAtTime * 1000; syncManager.scheduleSync( request.getAccount(), userId, callerUid, request.getProvider(), extras, - beforeRuntimeMillis, runtimeMillis, - false /* onlyThoseWithUnknownSyncableState */); + SyncStorageEngine.AuthorityInfo.UNDEFINED); } } finally { restoreCallingIdentity(identityToken); @@ -841,7 +837,7 @@ public final class ContentService extends IContentService.Stub { try { SyncManager syncManager = getSyncManager(); if (syncManager != null) { - return syncManager.getIsSyncable( + return syncManager.computeSyncable( account, userId, providerName); } } finally { diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 39ddc3a98317..6870c56c2ef0 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -19,6 +19,7 @@ package com.android.server.content; import android.accounts.Account; import android.accounts.AccountAndUser; import android.accounts.AccountManager; +import android.accounts.AccountManagerInternal; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.AppGlobals; @@ -47,6 +48,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageManagerInternal; import android.content.pm.ProviderInfo; import android.content.pm.RegisteredServicesCache; import android.content.pm.RegisteredServicesCacheListener; @@ -64,6 +66,7 @@ import android.os.Looper; import android.os.Message; import android.os.Messenger; import android.os.PowerManager; +import android.os.RemoteCallback; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; @@ -79,6 +82,7 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; +import com.android.internal.util.ArrayUtils; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerInternal; import com.google.android.collect.Lists; @@ -133,6 +137,8 @@ import java.util.Set; public class SyncManager { static final String TAG = "SyncManager"; + private static final boolean DEBUG_ACCOUNT_ACCESS = false; + /** Delay a sync due to local changes this long. In milliseconds */ private static final long LOCAL_SYNC_DELAY; @@ -194,6 +200,11 @@ public class SyncManager { private static final String HANDLE_SYNC_ALARM_WAKE_LOCK = "SyncManagerHandleSyncAlarm"; private static final String SYNC_LOOP_WAKE_LOCK = "SyncLoopWakeLock"; + + private static final int SYNC_OP_STATE_VALID = 0; + private static final int SYNC_OP_STATE_INVALID = 1; + private static final int SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS = 2; + private Context mContext; private static final AccountAndUser[] INITIAL_ACCOUNTS_ARRAY = new AccountAndUser[0]; @@ -310,6 +321,12 @@ public class SyncManager { private final UserManager mUserManager; + private final AccountManager mAccountManager; + + private final AccountManagerInternal mAccountManagerInternal; + + private final PackageManagerInternal mPackageManagerInternal; + private List<UserInfo> getAllUsers() { return mUserManager.getUsers(); } @@ -490,9 +507,7 @@ public class SyncManager { @Override public void onSyncRequest(SyncStorageEngine.EndPoint info, int reason, Bundle extras) { scheduleSync(info.account, info.userId, reason, info.provider, extras, - 0 /* no flexMillis */, - 0 /* run immediately */, - false); + AuthorityInfo.UNDEFINED); } }); @@ -522,8 +537,7 @@ public class SyncManager { if (!removed) { scheduleSync(null, UserHandle.USER_ALL, SyncOperation.REASON_SERVICE_CHANGED, - type.authority, null, 0 /* no delay */, 0 /* no delay */, - false /* onlyThoseWithUnkownSyncableState */); + type.authority, null, AuthorityInfo.UNDEFINED); } } }, mSyncHandler); @@ -562,6 +576,19 @@ public class SyncManager { } mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + mAccountManager = (AccountManager) mContext.getSystemService(Context.ACCOUNT_SERVICE); + mAccountManagerInternal = LocalServices.getService(AccountManagerInternal.class); + mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); + + mAccountManagerInternal.addOnAppPermissionChangeListener((Account account, int uid) -> { + // If the UID gained access to the account kick-off syncs lacking account access + if (mAccountManagerInternal.hasAccountAccess(account, uid)) { + scheduleSync(account, UserHandle.getUserId(uid), + SyncOperation.REASON_ACCOUNTS_UPDATED, + null, null, AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS); + } + }); + mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService( BatteryStats.SERVICE_NAME)); @@ -631,6 +658,37 @@ public class SyncManager { mContext.startService(startServiceIntent); } }); + + // Sync adapters were able to access the synced account without the accounts + // permission which circumvents our permission model. Therefore, we require + // sync adapters that don't have access to the account to get user consent. + // This can be noisy, therefore we will white-list sync adapters installed + // before we started checking for account access because they already know + // the account (they run before) which is the genie is out of the bottle. + whiteListExistingSyncAdaptersIfNeeded(); + } + + private void whiteListExistingSyncAdaptersIfNeeded() { + if (!mSyncStorageEngine.shouldGrantSyncAdaptersAccountAccess()) { + return; + } + List<UserInfo> users = mUserManager.getUsers(true); + final int userCount = users.size(); + for (int i = 0; i < userCount; i++) { + UserHandle userHandle = users.get(i).getUserHandle(); + final int userId = userHandle.getIdentifier(); + for (RegisteredServicesCache.ServiceInfo<SyncAdapterType> service + : mSyncAdapters.getAllServices(userId)) { + String packageName = service.componentName.getPackageName(); + for (Account account : mAccountManager.getAccountsByTypeAsUser( + service.type.accountType, userHandle)) { + if (!canAccessAccount(account, packageName, userId)) { + mAccountManager.updateAppPermission(account, + AccountManager.ACCOUNT_ACCESS_TOKEN_TYPE, service.uid, true); + } + } + } + } } private boolean isDeviceProvisioned() { @@ -655,7 +713,7 @@ public class SyncManager { return mSyncStorageEngine; } - public int getIsSyncable(Account account, int userId, String providerName) { + private int getIsSyncable(Account account, int userId, String providerName) { int isSyncable = mSyncStorageEngine.getIsSyncable(account, userId, providerName); UserInfo userInfo = UserManager.get(mContext).getUserInfo(userId); @@ -666,22 +724,22 @@ public class SyncManager { RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo = mSyncAdapters.getServiceInfo( SyncAdapterType.newKey(providerName, account.type), userId); - if (syncAdapterInfo == null) return isSyncable; + if (syncAdapterInfo == null) return AuthorityInfo.NOT_SYNCABLE; PackageInfo pInfo = null; try { pInfo = AppGlobals.getPackageManager().getPackageInfo( syncAdapterInfo.componentName.getPackageName(), 0, userId); - if (pInfo == null) return isSyncable; + if (pInfo == null) return AuthorityInfo.NOT_SYNCABLE; } catch (RemoteException re) { // Shouldn't happen. - return isSyncable; + return AuthorityInfo.NOT_SYNCABLE; } if (pInfo.restrictedAccountType != null && pInfo.restrictedAccountType.equals(account.type)) { return isSyncable; } else { - return 0; + return AuthorityInfo.NOT_SYNCABLE; } } @@ -733,13 +791,11 @@ public class SyncManager { * @param extras a Map of SyncAdapter-specific information to control * syncs of a specific provider. Can be null. Is ignored * if the url is null. - * @param beforeRuntimeMillis milliseconds before runtimeMillis that this sync can run. - * @param runtimeMillis maximum milliseconds in the future to wait before performing sync. - * @param onlyThoseWithUnkownSyncableState Only sync authorities that have unknown state. + * @param targetSyncState Only sync authorities that have the specified sync state. + * Use {@link AuthorityInfo#UNDEFINED} to sync all authorities. */ public void scheduleSync(Account requestedAccount, int userId, int reason, - String requestedAuthority, Bundle extras, long beforeRuntimeMillis, - long runtimeMillis, boolean onlyThoseWithUnkownSyncableState) { + String requestedAuthority, Bundle extras, int targetSyncState) { final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE); if (extras == null) { extras = new Bundle(); @@ -749,17 +805,27 @@ public class SyncManager { + requestedAuthority); } - AccountAndUser[] accounts; - if (requestedAccount != null && userId != UserHandle.USER_ALL) { - accounts = new AccountAndUser[] { new AccountAndUser(requestedAccount, userId) }; + AccountAndUser[] accounts = null; + if (requestedAccount != null) { + if (userId != UserHandle.USER_ALL) { + accounts = new AccountAndUser[]{new AccountAndUser(requestedAccount, userId)}; + } else { + for (AccountAndUser runningAccount : mRunningAccounts) { + if (requestedAccount.equals(runningAccount.account)) { + accounts = ArrayUtils.appendElement(AccountAndUser.class, + accounts, runningAccount); + } + } + } } else { accounts = mRunningAccounts; - if (accounts.length == 0) { - if (isLoggable) { - Slog.v(TAG, "scheduleSync: no accounts configured, dropping"); - } - return; + } + + if (ArrayUtils.isEmpty(accounts)) { + if (isLoggable) { + Slog.v(TAG, "scheduleSync: no accounts configured, dropping"); } + return; } final boolean uploadOnly = extras.getBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, false); @@ -808,29 +874,45 @@ public class SyncManager { } for (String authority : syncableAuthorities) { - int isSyncable = getIsSyncable(account.account, account.userId, - authority); + int isSyncable = computeSyncable(account.account, account.userId, authority); + if (isSyncable == AuthorityInfo.NOT_SYNCABLE) { continue; } - final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo; - syncAdapterInfo = mSyncAdapters.getServiceInfo( - SyncAdapterType.newKey(authority, account.account.type), account.userId); + + final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo = + mSyncAdapters.getServiceInfo(SyncAdapterType.newKey(authority, + account.account.type), account.userId); if (syncAdapterInfo == null) { continue; } + final int owningUid = syncAdapterInfo.uid; - final String owningPackage = syncAdapterInfo.componentName.getPackageName(); - try { - if (ActivityManagerNative.getDefault().getAppStartMode(owningUid, - owningPackage) == ActivityManager.APP_START_MODE_DISABLED) { - Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":" - + syncAdapterInfo.componentName - + " -- package not allowed to start"); + + if (isSyncable == AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS) { + if (isLoggable) { + Slog.v(TAG, " Not scheduling sync operation: " + + "isSyncable == SYNCABLE_NO_ACCOUNT_ACCESS"); + } + Bundle finalExtras = new Bundle(extras); + String packageName = syncAdapterInfo.componentName.getPackageName(); + // If the app did not run and has no account access, done + if (!mPackageManagerInternal.wasPackageEverLaunched(packageName, userId)) { continue; } - } catch (RemoteException e) { + mAccountManagerInternal.requestAccountAccess(account.account, + packageName, userId, + new RemoteCallback((Bundle result) -> { + if (result != null + && result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) { + scheduleSync(account.account, userId, reason, authority, + finalExtras, targetSyncState); + } + } + )); + continue; } + final boolean allowParallelSyncs = syncAdapterInfo.type.allowParallelSyncs(); final boolean isAlwaysSyncable = syncAdapterInfo.type.isAlwaysSyncable(); if (isSyncable < 0 && isAlwaysSyncable) { @@ -838,9 +920,11 @@ public class SyncManager { account.account, account.userId, authority, AuthorityInfo.SYNCABLE); isSyncable = AuthorityInfo.SYNCABLE; } - if (onlyThoseWithUnkownSyncableState && isSyncable >= 0) { + + if (targetSyncState != AuthorityInfo.UNDEFINED && targetSyncState != isSyncable) { continue; } + if (!syncAdapterInfo.type.supportsUploading() && uploadOnly) { continue; } @@ -863,7 +947,10 @@ public class SyncManager { account.account, authority, account.userId); long delayUntil = mSyncStorageEngine.getDelayUntilTime(info); - if (isSyncable < 0) { + + final String owningPackage = syncAdapterInfo.componentName.getPackageName(); + + if (isSyncable == AuthorityInfo.NOT_INITIALIZED) { // Initialisation sync. Bundle newExtras = new Bundle(); newExtras.putBoolean(ContentResolver.SYNC_EXTRAS_INITIALIZE, true); @@ -882,13 +969,11 @@ public class SyncManager { owningUid, owningPackage, reason, source, authority, newExtras, allowParallelSyncs) ); - } - if (!onlyThoseWithUnkownSyncableState) { + } else if (targetSyncState == AuthorityInfo.UNDEFINED + || targetSyncState == isSyncable) { if (isLoggable) { Slog.v(TAG, "scheduleSync:" + " delay until " + delayUntil - + " run by " + runtimeMillis - + " flexMillis " + beforeRuntimeMillis + ", source " + source + ", account " + account + ", authority " + authority @@ -904,6 +989,56 @@ public class SyncManager { } } + public int computeSyncable(Account account, int userId, String authority) { + final int status = getIsSyncable(account, userId, authority); + if (status == AuthorityInfo.NOT_SYNCABLE) { + return AuthorityInfo.NOT_SYNCABLE; + } + final SyncAdapterType type = SyncAdapterType.newKey(authority, account.type); + final RegisteredServicesCache.ServiceInfo<SyncAdapterType> syncAdapterInfo = + mSyncAdapters.getServiceInfo(type, userId); + if (syncAdapterInfo == null) { + return AuthorityInfo.NOT_SYNCABLE; + } + final int owningUid = syncAdapterInfo.uid; + final String owningPackage = syncAdapterInfo.componentName.getPackageName(); + try { + if (ActivityManagerNative.getDefault().getAppStartMode(owningUid, + owningPackage) == ActivityManager.APP_START_MODE_DISABLED) { + Slog.w(TAG, "Not scheduling job " + syncAdapterInfo.uid + ":" + + syncAdapterInfo.componentName + + " -- package not allowed to start"); + return AuthorityInfo.NOT_SYNCABLE; + } + } catch (RemoteException e) { + /* ignore - local call */ + } + if (!canAccessAccount(account, owningPackage, owningUid)) { + Log.w(TAG, "Access to " + account + " denied for package " + + owningPackage + " in UID " + syncAdapterInfo.uid); + return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS; + } + + return status; + } + + private boolean canAccessAccount(Account account, String packageName, int uid) { + if (mAccountManager.hasAccountAccess(account, packageName, + UserHandle.getUserHandleForUid(uid))) { + return true; + } + // We relax the account access rule to also include the system apps as + // they are trusted and we want to minimize the cases where the user + // involvement is required to grant access to the synced account. + try { + mContext.getPackageManager().getApplicationInfoAsUser(packageName, + PackageManager.MATCH_SYSTEM_ONLY, UserHandle.getUserId(uid)); + return true; + } catch (NameNotFoundException e) { + return false; + } + } + private void removeSyncsForAuthority(EndPoint info) { verifyJobScheduler(); List<SyncOperation> ops = getAllPendingSyncs(); @@ -960,9 +1095,7 @@ public class SyncManager { final Bundle extras = new Bundle(); extras.putBoolean(ContentResolver.SYNC_EXTRAS_UPLOAD, true); scheduleSync(account, userId, reason, authority, extras, - LOCAL_SYNC_DELAY /* earliest run time */, - 2 * LOCAL_SYNC_DELAY /* latest sync time. */, - false /* onlyThoseWithUnkownSyncableState */); + AuthorityInfo.UNDEFINED); } public SyncAdapterType[] getSyncAdapterTypes(int userId) { @@ -1421,8 +1554,7 @@ public class SyncManager { mContext.getOpPackageName()); for (Account account : accounts) { scheduleSync(account, userId, SyncOperation.REASON_USER_START, null, null, - 0 /* no delay */, 0 /* No flexMillis */, - true /* onlyThoseWithUnknownSyncableState */); + AuthorityInfo.NOT_INITIALIZED); } } @@ -2530,13 +2662,18 @@ public class SyncManager { } } - if (isOperationValid(op)) { - if (!dispatchSyncOperation(op)) { + final int syncOpState = computeSyncOpState(op); + switch (syncOpState) { + case SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS: + case SYNC_OP_STATE_INVALID: { mSyncJobService.callJobFinished(op.jobId, false); - } - } else { + } return; + } + + if (!dispatchSyncOperation(op)) { mSyncJobService.callJobFinished(op.jobId, false); } + setAuthorityPendingState(op.target); } @@ -2596,8 +2733,8 @@ public class SyncManager { if (syncTargets != null) { scheduleSync(syncTargets.account, syncTargets.userId, - SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider, null, 0, 0, - true); + SyncOperation.REASON_ACCOUNTS_UPDATED, syncTargets.provider, + null, AuthorityInfo.NOT_INITIALIZED); } } @@ -2665,6 +2802,31 @@ public class SyncManager { SyncStorageEngine.SOURCE_PERIODIC, extras, syncAdapterInfo.type.allowParallelSyncs(), true, SyncOperation.NO_JOB_ID, pollFrequencyMillis, flexMillis); + + final int syncOpState = computeSyncOpState(op); + switch (syncOpState) { + case SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS: { + String packageName = op.owningPackage; + final int userId = UserHandle.getUserId(op.owningUid); + // If the app did not run and has no account access, done + if (!mPackageManagerInternal.wasPackageEverLaunched(packageName, userId)) { + return; + } + mAccountManagerInternal.requestAccountAccess(op.target.account, + packageName, userId, new RemoteCallback((Bundle result) -> { + if (result != null + && result.getBoolean(AccountManager.KEY_BOOLEAN_RESULT)) { + updateOrAddPeriodicSync(target, pollFrequency, flex, extras); + } + } + )); + } return; + + case SYNC_OP_STATE_INVALID: { + return; + } + } + scheduleSyncOperationH(op); mSyncStorageEngine.reportChange(ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS); } @@ -2725,29 +2887,38 @@ public class SyncManager { /** * Determine if a sync is no longer valid and should be dropped. */ - private boolean isOperationValid(SyncOperation op) { + private int computeSyncOpState(SyncOperation op) { final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE); int state; final EndPoint target = op.target; - boolean syncEnabled = mSyncStorageEngine.getMasterSyncAutomatically(target.userId); + // Drop the sync if the account of this operation no longer exists. AccountAndUser[] accounts = mRunningAccounts; if (!containsAccountAndUser(accounts, target.account, target.userId)) { if (isLoggable) { Slog.v(TAG, " Dropping sync operation: account doesn't exist."); } - return false; + return SYNC_OP_STATE_INVALID; } // Drop this sync request if it isn't syncable. - state = getIsSyncable(target.account, target.userId, target.provider); - if (state == 0) { + state = computeSyncable(target.account, target.userId, target.provider); + if (state == AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS) { if (isLoggable) { - Slog.v(TAG, " Dropping sync operation: isSyncable == 0."); + Slog.v(TAG, " Dropping sync operation: " + + "isSyncable == SYNCABLE_NO_ACCOUNT_ACCESS"); } - return false; + return SYNC_OP_STATE_INVALID_NO_ACCOUNT_ACCESS; } - syncEnabled = syncEnabled && mSyncStorageEngine.getSyncAutomatically( - target.account, target.userId, target.provider); + if (state == AuthorityInfo.NOT_SYNCABLE) { + if (isLoggable) { + Slog.v(TAG, " Dropping sync operation: isSyncable == NOT_SYNCABLE"); + } + return SYNC_OP_STATE_INVALID; + } + + final boolean syncEnabled = mSyncStorageEngine.getMasterSyncAutomatically(target.userId) + && mSyncStorageEngine.getSyncAutomatically(target.account, + target.userId, target.provider); // We ignore system settings that specify the sync is invalid if: // 1) It's manual - we try it anyway. When/if it fails it will be rescheduled. @@ -2760,9 +2931,9 @@ public class SyncManager { if (isLoggable) { Slog.v(TAG, " Dropping sync operation: disallowed by settings/network."); } - return false; + return SYNC_OP_STATE_INVALID; } - return true; + return SYNC_OP_STATE_VALID; } private boolean dispatchSyncOperation(SyncOperation op) { diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java index bc3fc6a47aef..069ae7394319 100644 --- a/services/core/java/com/android/server/content/SyncStorageEngine.java +++ b/services/core/java/com/android/server/content/SyncStorageEngine.java @@ -137,7 +137,7 @@ public class SyncStorageEngine extends Handler { private static final boolean SYNC_ENABLED_DEFAULT = false; // the version of the accounts xml file format - private static final int ACCOUNTS_VERSION = 2; + private static final int ACCOUNTS_VERSION = 3; private static HashMap<String, String> sAuthorityRenames; private static PeriodicSyncAddedListener mPeriodicSyncAddedListener; @@ -211,6 +211,12 @@ public class SyncStorageEngine extends Handler { public static class AuthorityInfo { // Legal values of getIsSyncable + + /** + * The syncable state is undefined. + */ + public static final int UNDEFINED = -2; + /** * Default state for a newly installed adapter. An uninitialized adapter will receive an * initialization sync which are governed by a different set of rules to that of regular @@ -234,6 +240,12 @@ public class SyncStorageEngine extends Handler { */ public static final int SYNCABLE_NOT_INITIALIZED = 2; + /** + * The adapter is syncable but does not have access to the synced account and needs a + * user access approval. + */ + public static final int SYNCABLE_NO_ACCOUNT_ACCESS = 3; + final EndPoint target; final int ident; boolean enabled; @@ -402,6 +414,8 @@ public class SyncStorageEngine extends Handler { private OnSyncRequestListener mSyncRequestListener; private OnAuthorityRemovedListener mAuthorityRemovedListener; + private boolean mGrantSyncAdaptersAccountAccess; + private SyncStorageEngine(Context context, File dataDir) { mContext = context; sSyncStorageEngine = this; @@ -1404,6 +1418,10 @@ public class SyncStorageEngine extends Handler { } } + public boolean shouldGrantSyncAdaptersAccountAccess() { + return mGrantSyncAdaptersAccountAccess; + } + /** * public for testing */ @@ -1458,6 +1476,11 @@ public class SyncStorageEngine extends Handler { } catch (NumberFormatException e) { version = 0; } + + if (version < 3) { + mGrantSyncAdaptersAccountAccess = true; + } + String nextIdString = parser.getAttributeValue(null, XML_ATTR_NEXT_AUTHORITY_ID); try { int id = (nextIdString == null) ? 0 : Integer.parseInt(nextIdString); diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 0abd2e79b45f..971989b21219 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1402,6 +1402,9 @@ public final class DisplayManagerService extends SystemService { throw new IllegalArgumentException("width, height, and densityDpi must be " + "greater than 0"); } + if (surface != null && surface.isSingleBuffered()) { + throw new IllegalArgumentException("Surface can't be single-buffered"); + } if ((flags & DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC) != 0) { flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; @@ -1460,6 +1463,9 @@ public final class DisplayManagerService extends SystemService { @Override // Binder call public void setVirtualDisplaySurface(IVirtualDisplayCallback callback, Surface surface) { + if (surface != null && surface.isSingleBuffered()) { + throw new IllegalArgumentException("Surface can't be single-buffered"); + } final long token = Binder.clearCallingIdentity(); try { setVirtualDisplaySurfaceInternal(callback.asBinder(), surface); diff --git a/services/core/java/com/android/server/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java index 07fa2ce01b3b..0ec48b992b1e 100644 --- a/services/core/java/com/android/server/display/NightDisplayService.java +++ b/services/core/java/com/android/server/display/NightDisplayService.java @@ -33,8 +33,11 @@ import android.net.Uri; import android.opengl.Matrix; import android.os.Handler; import android.os.Looper; +import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings.Secure; +import android.service.vr.IVrManager; +import android.service.vr.IVrStateCallbacks; import android.util.MathUtils; import android.util.Slog; import android.view.animation.AnimationUtils; @@ -44,7 +47,9 @@ import com.android.server.SystemService; import com.android.server.twilight.TwilightListener; import com.android.server.twilight.TwilightManager; import com.android.server.twilight.TwilightState; +import com.android.server.vr.VrManagerService; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.Calendar; import java.util.TimeZone; @@ -83,6 +88,31 @@ public final class NightDisplayService extends SystemService private static final ColorMatrixEvaluator COLOR_MATRIX_EVALUATOR = new ColorMatrixEvaluator(); private final Handler mHandler; + private final AtomicBoolean mIgnoreAllColorMatrixChanges = new AtomicBoolean(); + private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { + @Override + public void onVrStateChanged(final boolean enabled) { + // Turn off all night mode display stuff while device is in VR mode. + mIgnoreAllColorMatrixChanges.set(enabled); + mHandler.post(new Runnable() { + @Override + public void run() { + // Cancel in-progress animations + if (mColorMatrixAnimator != null) { + mColorMatrixAnimator.cancel(); + } + + final DisplayTransformManager dtm = + getLocalService(DisplayTransformManager.class); + if (enabled) { + dtm.setColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY, MATRIX_IDENTITY); + } else if (mController.isActivated()) { + dtm.setColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY, MATRIX_NIGHT); + } + } + }); + } + }; private int mCurrentUser = UserHandle.USER_NULL; private ContentObserver mUserSetupObserver; @@ -105,7 +135,17 @@ public final class NightDisplayService extends SystemService @Override public void onBootPhase(int phase) { - if (phase == PHASE_BOOT_COMPLETED) { + if (phase == PHASE_SYSTEM_SERVICES_READY) { + IVrManager vrManager = + (IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE); + if (vrManager != null) { + try { + vrManager.registerListener(mVrStateCallbacks); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to register VR mode state listener: " + e); + } + } + } else if (phase == PHASE_BOOT_COMPLETED) { mBootCompleted = true; // Register listeners now that boot is complete. @@ -182,6 +222,8 @@ public final class NightDisplayService extends SystemService } private void setUp() { + Slog.d(TAG, "setUp: currentUser=" + mCurrentUser); + // Create a new controller for the current user and start listening for changes. mController = new NightDisplayController(getContext(), mCurrentUser); mController.setListener(this); @@ -196,6 +238,8 @@ public final class NightDisplayService extends SystemService } private void tearDown() { + Slog.d(TAG, "tearDown: currentUser=" + mCurrentUser); + if (mController != null) { mController.setListener(null); mController = null; @@ -230,6 +274,11 @@ public final class NightDisplayService extends SystemService mColorMatrixAnimator.cancel(); } + // Don't do any color matrix change animations if we are ignoring them anyway. + if (mIgnoreAllColorMatrixChanges.get()) { + return; + } + final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class); final float[] from = dtm.getColorMatrix(LEVEL_COLOR_MATRIX_NIGHT_DISPLAY); final float[] to = mIsActivated ? MATRIX_NIGHT : null; @@ -273,6 +322,8 @@ public final class NightDisplayService extends SystemService @Override public void onAutoModeChanged(int autoMode) { + Slog.d(TAG, "onAutoModeChanged: autoMode=" + autoMode); + if (mAutoMode != null) { mAutoMode.onStop(); mAutoMode = null; @@ -291,6 +342,8 @@ public final class NightDisplayService extends SystemService @Override public void onCustomStartTimeChanged(NightDisplayController.LocalTime startTime) { + Slog.d(TAG, "onCustomStartTimeChanged: startTime=" + startTime); + if (mAutoMode != null) { mAutoMode.onCustomStartTimeChanged(startTime); } @@ -298,6 +351,8 @@ public final class NightDisplayService extends SystemService @Override public void onCustomEndTimeChanged(NightDisplayController.LocalTime endTime) { + Slog.d(TAG, "onCustomEndTimeChanged: endTime=" + endTime); + if (mAutoMode != null) { mAutoMode.onCustomEndTimeChanged(endTime); } @@ -419,7 +474,7 @@ public final class NightDisplayService extends SystemService @Override public void onAlarm() { - if (DEBUG) Slog.d(TAG, "onAlarm"); + Slog.d(TAG, "onAlarm"); updateActivated(); } } @@ -477,7 +532,8 @@ public final class NightDisplayService extends SystemService @Override public void onTwilightStateChanged(@Nullable TwilightState state) { - if (DEBUG) Slog.d(TAG, "onTwilightStateChanged"); + Slog.d(TAG, "onTwilightStateChanged: isNight=" + + (state == null ? null : state.isNight())); updateActivated(state); } } diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 777eee81473a..697186e562fb 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -78,6 +78,8 @@ import java.util.List; public class MediaSessionService extends SystemService implements Monitor { private static final String TAG = "MediaSessionService"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + // Leave log for media key event always. + private static final boolean DEBUG_MEDIA_KEY_EVENT = DEBUG || true; private static final int WAKELOCK_TIMEOUT = 5000; @@ -302,7 +304,7 @@ public class MediaSessionService extends SystemService implements Monitor { */ private void destroySessionLocked(MediaSessionRecord session) { if (DEBUG) { - Log.d(TAG, "Destroying session : " + session.toString()); + Log.d(TAG, "Destroying " + session); } int userId = session.getUserId(); UserRecord user = mUserRecords.get(userId); @@ -408,7 +410,7 @@ public class MediaSessionService extends SystemService implements Monitor { if (component != null) { if (compName.equals(component)) { if (DEBUG) { - Log.d(TAG, "ok to get sessions: " + component + + Log.d(TAG, "ok to get sessions. " + component + " is authorized notification listener"); } return true; @@ -417,7 +419,7 @@ public class MediaSessionService extends SystemService implements Monitor { } } if (DEBUG) { - Log.d(TAG, "not ok to get sessions, " + compName + + Log.d(TAG, "not ok to get sessions. " + compName + " is not in list of ENABLED_NOTIFICATION_LISTENERS for user " + userId); } } @@ -462,7 +464,7 @@ public class MediaSessionService extends SystemService implements Monitor { mHandler.post(MessageHandler.MSG_SESSIONS_CHANGED, userId, 0); if (DEBUG) { - Log.d(TAG, "Created session for package " + callerPackageName + " with tag " + tag); + Log.d(TAG, "Created session for " + callerPackageName + " with tag " + tag); } return session; } @@ -881,17 +883,16 @@ public class MediaSessionService extends SystemService implements Monitor { private void dispatchAdjustVolumeLocked(int suggestedStream, int direction, int flags, MediaSessionRecord session) { - if (DEBUG) { - String description = session == null ? null : session.toString(); - Log.d(TAG, "Adjusting session " + description + " by " + direction + ". flags=" - + flags + ", suggestedStream=" + suggestedStream); - - } boolean preferSuggestedStream = false; if (isValidLocalStreamType(suggestedStream) && AudioSystem.isStreamActive(suggestedStream, 0)) { preferSuggestedStream = true; } + if (DEBUG) { + Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags=" + + flags + ", suggestedStream=" + suggestedStream + + ", preferSuggestedStream=" + preferSuggestedStream); + } if (session == null || preferSuggestedStream) { if ((flags & AudioManager.FLAG_ACTIVE_MEDIA_ONLY) != 0 && !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) { @@ -946,8 +947,8 @@ public class MediaSessionService extends SystemService implements Monitor { private void dispatchMediaKeyEventLocked(KeyEvent keyEvent, boolean needWakeLock, MediaSessionRecord session) { if (session != null) { - if (DEBUG) { - Log.d(TAG, "Sending media key to " + session.toString()); + if (DEBUG_MEDIA_KEY_EVENT) { + Log.d(TAG, "Sending " + keyEvent + " to " + session); } if (needWakeLock) { mKeyEventReceiver.aquireWakeLockLocked(); @@ -966,11 +967,6 @@ public class MediaSessionService extends SystemService implements Monitor { && user.mRestoredMediaButtonReceiver == null) { continue; } - if (DEBUG) { - Log.d(TAG, "Sending media key to last known PendingIntent " - + user.mLastMediaButtonReceiver + " or restored Intent " - + user.mRestoredMediaButtonReceiver); - } if (needWakeLock) { mKeyEventReceiver.aquireWakeLockLocked(); } @@ -979,10 +975,19 @@ public class MediaSessionService extends SystemService implements Monitor { mediaButtonIntent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent); try { if (user.mLastMediaButtonReceiver != null) { + if (DEBUG_MEDIA_KEY_EVENT) { + Log.d(TAG, "Sending " + keyEvent + + " to the last known pendingIntent " + + user.mLastMediaButtonReceiver); + } user.mLastMediaButtonReceiver.send(getContext(), needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1, mediaButtonIntent, mKeyEventReceiver, mHandler); } else { + if (DEBUG_MEDIA_KEY_EVENT) { + Log.d(TAG, "Sending " + keyEvent + " to the restored intent " + + user.mRestoredMediaButtonReceiver); + } mediaButtonIntent.setComponent(user.mRestoredMediaButtonReceiver); getContext().sendBroadcastAsUser(mediaButtonIntent, UserHandle.of(userId)); diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index f3fc676fe2e6..3e1c529a5fc6 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -90,6 +90,7 @@ import static org.xmlpull.v1.XmlPullParser.START_TAG; import android.Manifest; import android.annotation.IntDef; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.AppGlobals; import android.app.AppOpsManager; @@ -141,6 +142,7 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.ServiceManager; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -289,6 +291,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int MSG_UPDATE_INTERFACE_QUOTA = 10; private static final int MSG_REMOVE_INTERFACE_QUOTA = 11; private static final int MSG_RESTRICT_BACKGROUND_BLACKLIST_CHANGED = 12; + private static final int MSG_SET_FIREWALL_RULES = 13; private final Context mContext; private final IActivityManager mActivityManager; @@ -513,12 +516,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { try { app = pm.getApplicationInfoAsUser(pkg, PackageManager.MATCH_SYSTEM_ONLY, userId); } catch (PackageManager.NameNotFoundException e) { - // Should not happen - Slog.wtf(TAG, "No ApplicationInfo for package " + pkg); + if (LOGD) Slog.d(TAG, "No ApplicationInfo for package " + pkg); + // Ignore it - some apps on allow-in-data-usage-save are optional. continue; } if (!app.isPrivilegedApp()) { - Slog.wtf(TAG, "pm.getApplicationInfoAsUser() returned non-privileged app: " + pkg); + Slog.e(TAG, "addDefaultRestrictBackgroundWhitelistUidsUL(): " + + "skipping non-privileged app " + pkg); continue; } final int uid = UserHandle.getUid(userId, app.uid); @@ -528,8 +532,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { + "background whitelist. Revoked status: " + mRestrictBackgroundWhitelistRevokedUids.get(uid)); if (!mRestrictBackgroundWhitelistRevokedUids.get(uid)) { - Slog.i(TAG, "adding default package " + pkg + " (uid " + uid + " for user " - + userId + ") to restrict background whitelist"); + if (LOGD) + Slog.d(TAG, "adding default package " + pkg + " (uid " + uid + " for user " + + userId + ") to restrict background whitelist"); mRestrictBackgroundWhitelistUids.append(uid, true); changed = true; } @@ -568,117 +573,127 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } public void systemReady() { - if (!isBandwidthControlEnabled()) { - Slog.w(TAG, "bandwidth controls disabled, unable to enforce policy"); - return; - } + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "systemReady"); + try { + if (!isBandwidthControlEnabled()) { + Slog.w(TAG, "bandwidth controls disabled, unable to enforce policy"); + return; + } - mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class); + mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class); - mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true); + mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true); - synchronized (mUidRulesFirstLock) { - synchronized (mNetworkPoliciesSecondLock) { - updatePowerSaveWhitelistUL(); - mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); - mPowerManagerInternal.registerLowPowerModeObserver( - new PowerManagerInternal.LowPowerModeListener() { - @Override - public void onLowPowerModeChanged(boolean enabled) { - if (LOGD) Slog.d(TAG, "onLowPowerModeChanged(" + enabled + ")"); - synchronized (mUidRulesFirstLock) { - if (mRestrictPower != enabled) { - mRestrictPower = enabled; - updateRulesForRestrictPowerUL(); + synchronized (mUidRulesFirstLock) { + synchronized (mNetworkPoliciesSecondLock) { + updatePowerSaveWhitelistUL(); + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); + mPowerManagerInternal.registerLowPowerModeObserver( + new PowerManagerInternal.LowPowerModeListener() { + @Override + public void onLowPowerModeChanged(boolean enabled) { + if (LOGD) Slog.d(TAG, "onLowPowerModeChanged(" + enabled + ")"); + synchronized (mUidRulesFirstLock) { + if (mRestrictPower != enabled) { + mRestrictPower = enabled; + updateRulesForRestrictPowerUL(); + } } } - } - }); - mRestrictPower = mPowerManagerInternal.getLowPowerModeEnabled(); + }); + mRestrictPower = mPowerManagerInternal.getLowPowerModeEnabled(); - mSystemReady = true; + mSystemReady = true; - // read policy from disk - readPolicyAL(); + // read policy from disk + readPolicyAL(); - if (addDefaultRestrictBackgroundWhitelistUidsUL()) { - writePolicyAL(); - } + if (addDefaultRestrictBackgroundWhitelistUidsUL()) { + writePolicyAL(); + } - setRestrictBackgroundUL(mRestrictBackground); - updateRulesForGlobalChangeAL(false); - updateNotificationsNL(); + setRestrictBackgroundUL(mRestrictBackground); + updateRulesForGlobalChangeAL(false); + updateNotificationsNL(); + } } - } - try { - mActivityManager.registerUidObserver(mUidObserver, - ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE); - mNetworkManager.registerObserver(mAlertObserver); - } catch (RemoteException e) { - // ignored; both services live in system_server + try { + mActivityManager.registerUidObserver(mUidObserver, + ActivityManager.UID_OBSERVER_PROCSTATE|ActivityManager.UID_OBSERVER_GONE); + mNetworkManager.registerObserver(mAlertObserver); + } catch (RemoteException e) { + // ignored; both services live in system_server + } + + // listen for changes to power save whitelist + final IntentFilter whitelistFilter = new IntentFilter( + PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED); + mContext.registerReceiver(mPowerSaveWhitelistReceiver, whitelistFilter, null, mHandler); + + DeviceIdleController.LocalService deviceIdleService + = LocalServices.getService(DeviceIdleController.LocalService.class); + deviceIdleService.setNetworkPolicyTempWhitelistCallback(mTempPowerSaveChangedCallback); + + // watch for network interfaces to be claimed + final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION); + mContext.registerReceiver(mConnReceiver, connFilter, CONNECTIVITY_INTERNAL, mHandler); + + // listen for package changes to update policy + final IntentFilter packageFilter = new IntentFilter(); + packageFilter.addAction(ACTION_PACKAGE_ADDED); + packageFilter.addDataScheme("package"); + mContext.registerReceiver(mPackageReceiver, packageFilter, null, mHandler); + + // listen for UID changes to update policy + mContext.registerReceiver( + mUidRemovedReceiver, new IntentFilter(ACTION_UID_REMOVED), null, mHandler); + + // listen for user changes to update policy + final IntentFilter userFilter = new IntentFilter(); + userFilter.addAction(ACTION_USER_ADDED); + userFilter.addAction(ACTION_USER_REMOVED); + mContext.registerReceiver(mUserReceiver, userFilter, null, mHandler); + + // listen for stats update events + final IntentFilter statsFilter = new IntentFilter(ACTION_NETWORK_STATS_UPDATED); + mContext.registerReceiver( + mStatsReceiver, statsFilter, READ_NETWORK_USAGE_HISTORY, mHandler); + + // listen for restrict background changes from notifications + final IntentFilter allowFilter = new IntentFilter(ACTION_ALLOW_BACKGROUND); + mContext.registerReceiver(mAllowReceiver, allowFilter, MANAGE_NETWORK_POLICY, mHandler); + + // listen for snooze warning from notifications + final IntentFilter snoozeWarningFilter = new IntentFilter(ACTION_SNOOZE_WARNING); + mContext.registerReceiver(mSnoozeWarningReceiver, snoozeWarningFilter, + MANAGE_NETWORK_POLICY, mHandler); + + // listen for configured wifi networks to be removed + final IntentFilter wifiConfigFilter = + new IntentFilter(CONFIGURED_NETWORKS_CHANGED_ACTION); + mContext.registerReceiver(mWifiConfigReceiver, wifiConfigFilter, null, mHandler); + + // listen for wifi state changes to catch metered hint + final IntentFilter wifiStateFilter = new IntentFilter( + WifiManager.NETWORK_STATE_CHANGED_ACTION); + mContext.registerReceiver(mWifiStateReceiver, wifiStateFilter, null, mHandler); + + mUsageStats.addAppIdleStateChangeListener(new AppIdleStateChangeListener()); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } - - // listen for changes to power save whitelist - final IntentFilter whitelistFilter = new IntentFilter( - PowerManager.ACTION_POWER_SAVE_WHITELIST_CHANGED); - mContext.registerReceiver(mPowerSaveWhitelistReceiver, whitelistFilter, null, mHandler); - - DeviceIdleController.LocalService deviceIdleService - = LocalServices.getService(DeviceIdleController.LocalService.class); - deviceIdleService.setNetworkPolicyTempWhitelistCallback(mTempPowerSaveChangedCallback); - - // watch for network interfaces to be claimed - final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION); - mContext.registerReceiver(mConnReceiver, connFilter, CONNECTIVITY_INTERNAL, mHandler); - - // listen for package changes to update policy - final IntentFilter packageFilter = new IntentFilter(); - packageFilter.addAction(ACTION_PACKAGE_ADDED); - packageFilter.addDataScheme("package"); - mContext.registerReceiver(mPackageReceiver, packageFilter, null, mHandler); - - // listen for UID changes to update policy - mContext.registerReceiver( - mUidRemovedReceiver, new IntentFilter(ACTION_UID_REMOVED), null, mHandler); - - // listen for user changes to update policy - final IntentFilter userFilter = new IntentFilter(); - userFilter.addAction(ACTION_USER_ADDED); - userFilter.addAction(ACTION_USER_REMOVED); - mContext.registerReceiver(mUserReceiver, userFilter, null, mHandler); - - // listen for stats update events - final IntentFilter statsFilter = new IntentFilter(ACTION_NETWORK_STATS_UPDATED); - mContext.registerReceiver( - mStatsReceiver, statsFilter, READ_NETWORK_USAGE_HISTORY, mHandler); - - // listen for restrict background changes from notifications - final IntentFilter allowFilter = new IntentFilter(ACTION_ALLOW_BACKGROUND); - mContext.registerReceiver(mAllowReceiver, allowFilter, MANAGE_NETWORK_POLICY, mHandler); - - // listen for snooze warning from notifications - final IntentFilter snoozeWarningFilter = new IntentFilter(ACTION_SNOOZE_WARNING); - mContext.registerReceiver(mSnoozeWarningReceiver, snoozeWarningFilter, - MANAGE_NETWORK_POLICY, mHandler); - - // listen for configured wifi networks to be removed - final IntentFilter wifiConfigFilter = new IntentFilter(CONFIGURED_NETWORKS_CHANGED_ACTION); - mContext.registerReceiver(mWifiConfigReceiver, wifiConfigFilter, null, mHandler); - - // listen for wifi state changes to catch metered hint - final IntentFilter wifiStateFilter = new IntentFilter( - WifiManager.NETWORK_STATE_CHANGED_ACTION); - mContext.registerReceiver(mWifiStateReceiver, wifiStateFilter, null, mHandler); - - mUsageStats.addAppIdleStateChangeListener(new AppIdleStateChangeListener()); - } final private IUidObserver mUidObserver = new IUidObserver.Stub() { @Override public void onUidStateChanged(int uid, int procState) throws RemoteException { - synchronized (mUidRulesFirstLock) { - updateUidStateUL(uid, procState); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "onUidStateChanged"); + try { + synchronized (mUidRulesFirstLock) { + updateUidStateUL(uid, procState); + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } } @@ -702,6 +717,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { synchronized (mUidRulesFirstLock) { updatePowerSaveWhitelistUL(); updateRulesForRestrictPowerUL(); + updateRulesForAppIdleUL(); } } }; @@ -1426,8 +1442,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { + "; generating default policy"); // Build default mobile policy, and assume usage cycle starts today - final long warningBytes = mContext.getResources().getInteger( - com.android.internal.R.integer.config_networkPolicyDefaultWarning) * MB_IN_BYTES; + final int dataWarningConfig = mContext.getResources().getInteger( + com.android.internal.R.integer.config_networkPolicyDefaultWarning); + final long warningBytes; + if (dataWarningConfig == WARNING_DISABLED) { + warningBytes = WARNING_DISABLED; + } else { + warningBytes = dataWarningConfig * MB_IN_BYTES; + } final Time time = new Time(); time.setToNow(); @@ -2044,7 +2066,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // Must whitelist foreground apps before turning data saver mode on. // TODO: there is no need to iterate through all apps here, just those in the foreground, // so it could call AM to get the UIDs of such apps, and iterate through them instead. - updateRulesForAllAppsUL(TYPE_RESTRICT_BACKGROUND); + updateRulesForRestrictBackgroundUL(); try { if (!mNetworkManager.setDataSaverModeEnabled(mRestrictBackground)) { Slog.e(TAG, "Could not change Data Saver Mode on NMS to " + mRestrictBackground); @@ -2201,21 +2223,26 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @Override public void setDeviceIdleMode(boolean enabled) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); - - synchronized (mUidRulesFirstLock) { - if (mDeviceIdleMode != enabled) { + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "setDeviceIdleMode"); + try { + synchronized (mUidRulesFirstLock) { + if (mDeviceIdleMode == enabled) { + return; + } mDeviceIdleMode = enabled; if (mSystemReady) { // Device idle change means we need to rebuild rules for all // known apps, so do a global refresh. updateRulesForRestrictPowerUL(); } - if (enabled) { - EventLogTags.writeDeviceIdleOnPhase("net"); - } else { - EventLogTags.writeDeviceIdleOffPhase("net"); - } } + if (enabled) { + EventLogTags.writeDeviceIdleOnPhase("net"); + } else { + EventLogTags.writeDeviceIdleOffPhase("net"); + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } } @@ -2503,25 +2530,30 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * {@link #updateRulesForPowerRestrictionsUL(int)} */ private void updateUidStateUL(int uid, int uidState) { - final int oldUidState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); - if (oldUidState != uidState) { - // state changed, push updated rules - mUidState.put(uid, uidState); - updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState, uidState); - if (isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState) - != isProcStateAllowedWhileIdleOrPowerSaveMode(uidState) ) { - if (isUidIdle(uid)) { - updateRuleForAppIdleUL(uid); - } - if (mDeviceIdleMode) { - updateRuleForDeviceIdleUL(uid); - } - if (mRestrictPower) { - updateRuleForRestrictPowerUL(uid); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateUidStateUL"); + try { + final int oldUidState = mUidState.get(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + if (oldUidState != uidState) { + // state changed, push updated rules + mUidState.put(uid, uidState); + updateRestrictBackgroundRulesOnUidStatusChangedUL(uid, oldUidState, uidState); + if (isProcStateAllowedWhileIdleOrPowerSaveMode(oldUidState) + != isProcStateAllowedWhileIdleOrPowerSaveMode(uidState) ) { + if (isUidIdle(uid)) { + updateRuleForAppIdleUL(uid); + } + if (mDeviceIdleMode) { + updateRuleForDeviceIdleUL(uid); + } + if (mRestrictPower) { + updateRuleForRestrictPowerUL(uid); + } + updateRulesForPowerRestrictionsUL(uid); } - updateRulesForPowerRestrictionsUL(uid); + updateNetworkStats(uid, isUidStateForegroundUL(uidState)); } - updateNetworkStats(uid, isUidStateForegroundUL(uidState)); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } } @@ -2574,8 +2606,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } void updateRulesForPowerSaveUL() { - updateRulesForWhitelistedPowerSaveUL(mRestrictPower, FIREWALL_CHAIN_POWERSAVE, - mUidFirewallPowerSaveRules); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForPowerSaveUL"); + try { + updateRulesForWhitelistedPowerSaveUL(mRestrictPower, FIREWALL_CHAIN_POWERSAVE, + mUidFirewallPowerSaveRules); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } void updateRuleForRestrictPowerUL(int uid) { @@ -2583,8 +2620,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } void updateRulesForDeviceIdleUL() { - updateRulesForWhitelistedPowerSaveUL(mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE, - mUidFirewallDozableRules); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForDeviceIdleUL"); + try { + updateRulesForWhitelistedPowerSaveUL(mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE, + mUidFirewallDozableRules); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } void updateRuleForDeviceIdleUL(int uid) { @@ -2621,10 +2663,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { uidRules.put(mUidState.keyAt(i), FIREWALL_RULE_ALLOW); } } - setUidFirewallRules(chain, uidRules); + setUidFirewallRulesAsync(chain, uidRules, CHAIN_TOGGLE_ENABLE); + } else { + setUidFirewallRulesAsync(chain, null, CHAIN_TOGGLE_DISABLE); } - - enableFirewallChainUL(chain, enabled); } private boolean isWhitelistedBatterySaverUL(int uid) { @@ -2646,27 +2688,32 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } void updateRulesForAppIdleUL() { - final SparseIntArray uidRules = mUidFirewallStandbyRules; - uidRules.clear(); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForAppIdleUL"); + try { + final SparseIntArray uidRules = mUidFirewallStandbyRules; + uidRules.clear(); - // Fully update the app idle firewall chain. - final List<UserInfo> users = mUserManager.getUsers(); - for (int ui = users.size() - 1; ui >= 0; ui--) { - UserInfo user = users.get(ui); - int[] idleUids = mUsageStats.getIdleUidsForUser(user.id); - for (int uid : idleUids) { - if (!mPowerSaveTempWhitelistAppIds.get(UserHandle.getAppId(uid), false)) { - // quick check: if this uid doesn't have INTERNET permission, it - // doesn't have network access anyway, so it is a waste to mess - // with it here. - if (hasInternetPermissions(uid)) { - uidRules.put(uid, FIREWALL_RULE_DENY); + // Fully update the app idle firewall chain. + final List<UserInfo> users = mUserManager.getUsers(); + for (int ui = users.size() - 1; ui >= 0; ui--) { + UserInfo user = users.get(ui); + int[] idleUids = mUsageStats.getIdleUidsForUser(user.id); + for (int uid : idleUids) { + if (!mPowerSaveTempWhitelistAppIds.get(UserHandle.getAppId(uid), false)) { + // quick check: if this uid doesn't have INTERNET permission, it + // doesn't have network access anyway, so it is a waste to mess + // with it here. + if (hasInternetPermissions(uid)) { + uidRules.put(uid, FIREWALL_RULE_DENY); + } } } } - } - setUidFirewallRules(FIREWALL_CHAIN_STANDBY, uidRules); + setUidFirewallRulesAsync(FIREWALL_CHAIN_STANDBY, uidRules, CHAIN_TOGGLE_NONE); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } void updateRuleForAppIdleUL(int uid) { @@ -2691,33 +2738,41 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * {@link #mRestrictPower}, or {@link #mDeviceIdleMode} value. */ private void updateRulesForGlobalChangeAL(boolean restrictedNetworksChanged) { - long start; - if (LOGD) start = System.currentTimeMillis(); - - updateRulesForRestrictPowerUL(); - updateRulesForRestrictBackgroundUL(); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForGlobalChangeAL"); + try { + updateRulesForAppIdleUL(); + updateRulesForRestrictPowerUL(); + updateRulesForRestrictBackgroundUL(); - // If the set of restricted networks may have changed, re-evaluate those. - if (restrictedNetworksChanged) { - normalizePoliciesNL(); - updateNetworkRulesNL(); - } - if (LOGD) { - final long delta = System.currentTimeMillis() - start; - Slog.d(TAG, "updateRulesForGlobalChangeAL(" + restrictedNetworksChanged + ") took " - + delta + "ms"); + // If the set of restricted networks may have changed, re-evaluate those. + if (restrictedNetworksChanged) { + normalizePoliciesNL(); + updateNetworkRulesNL(); + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } } + // TODO: rename / document to make it clear these are global (not app-specific) rules private void updateRulesForRestrictPowerUL() { - updateRulesForDeviceIdleUL(); - updateRulesForAppIdleUL(); - updateRulesForPowerSaveUL(); - updateRulesForAllAppsUL(TYPE_RESTRICT_POWER); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForRestrictPowerUL"); + try { + updateRulesForDeviceIdleUL(); + updateRulesForPowerSaveUL(); + updateRulesForAllAppsUL(TYPE_RESTRICT_POWER); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } private void updateRulesForRestrictBackgroundUL() { - updateRulesForAllAppsUL(TYPE_RESTRICT_BACKGROUND); + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForRestrictBackgroundUL"); + try { + updateRulesForAllAppsUL(TYPE_RESTRICT_BACKGROUND); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } private static final int TYPE_RESTRICT_BACKGROUND = 1; @@ -2732,33 +2787,42 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // TODO: refactor / consolidate all those updateXyz methods, there are way too many of them... private void updateRulesForAllAppsUL(@RestrictType int type) { - final PackageManager pm = mContext.getPackageManager(); + if (Trace.isTagEnabled(Trace.TRACE_TAG_NETWORK)) { + Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForRestrictPowerUL-" + type); + } + try { + final PackageManager pm = mContext.getPackageManager(); - // update rules for all installed applications - final List<UserInfo> users = mUserManager.getUsers(); - final List<ApplicationInfo> apps = pm.getInstalledApplications( - PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.MATCH_DISABLED_COMPONENTS - | PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); - - final int usersSize = users.size(); - final int appsSize = apps.size(); - for (int i = 0; i < usersSize; i++) { - final UserInfo user = users.get(i); - for (int j = 0; j < appsSize; j++) { - final ApplicationInfo app = apps.get(j); - final int uid = UserHandle.getUid(user.id, app.uid); - switch (type) { - case TYPE_RESTRICT_BACKGROUND: - updateRulesForDataUsageRestrictionsUL(uid); - break; - case TYPE_RESTRICT_POWER: - updateRulesForPowerRestrictionsUL(uid); - break; - default: - Slog.w(TAG, "Invalid type for updateRulesForAllApps: " + type); + // update rules for all installed applications + final List<UserInfo> users = mUserManager.getUsers(); + final List<ApplicationInfo> apps = pm.getInstalledApplications( + PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.MATCH_DISABLED_COMPONENTS + | PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE); + + final int usersSize = users.size(); + final int appsSize = apps.size(); + for (int i = 0; i < usersSize; i++) { + final UserInfo user = users.get(i); + for (int j = 0; j < appsSize; j++) { + final ApplicationInfo app = apps.get(j); + final int uid = UserHandle.getUid(user.id, app.uid); + switch (type) { + case TYPE_RESTRICT_BACKGROUND: + updateRulesForDataUsageRestrictionsUL(uid); + break; + case TYPE_RESTRICT_POWER: + updateRulesForPowerRestrictionsUL(uid); + break; + default: + Slog.w(TAG, "Invalid type for updateRulesForAllApps: " + type); + } } } + } finally { + if (Trace.isTagEnabled(Trace.TRACE_TAG_NETWORK)) { + Trace.traceEnd(Trace.TRACE_TAG_NETWORK); + } } } @@ -3302,6 +3366,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { removeInterfaceQuota((String) msg.obj); return true; } + case MSG_SET_FIREWALL_RULES: { + final int chain = msg.arg1; + final int toggle = msg.arg2; + final SparseIntArray uidRules = (SparseIntArray) msg.obj; + if (uidRules != null) { + setUidFirewallRules(chain, uidRules); + } + if (toggle != CHAIN_TOGGLE_NONE) { + enableFirewallChainUL(chain, toggle == CHAIN_TOGGLE_ENABLE); + } + return true; + } default: { return false; } @@ -3351,6 +3427,31 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } + private static final int CHAIN_TOGGLE_NONE = 0; + private static final int CHAIN_TOGGLE_ENABLE = 1; + private static final int CHAIN_TOGGLE_DISABLE = 2; + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = false, value = { + CHAIN_TOGGLE_NONE, + CHAIN_TOGGLE_ENABLE, + CHAIN_TOGGLE_DISABLE + }) + public @interface ChainToggleType { + } + + /** + * Calls {@link #setUidFirewallRules(int, SparseIntArray)} and + * {@link #enableFirewallChainUL(int, boolean)} asynchronously. + * + * @param chain firewall chain. + * @param uidRules new UID rules; if {@code null}, only toggles chain state. + * @param toggle whether the chain should be enabled, disabled, or not changed. + */ + private void setUidFirewallRulesAsync(int chain, @Nullable SparseIntArray uidRules, + @ChainToggleType int toggle) { + mHandler.obtainMessage(MSG_SET_FIREWALL_RULES, chain, toggle, uidRules).sendToTarget(); + } + /** * Set uid rules on a particular firewall chain. This is going to synchronize the rules given * here to netd. It will clean up dead rules and make sure the target chain only contains rules diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index bb55240fc859..eb85f191304e 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -58,7 +58,6 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.app.PendingIntent; -import android.app.RemoteInput; import android.app.StatusBarManager; import android.app.backup.BackupManager; import android.app.usage.UsageEvents; @@ -93,7 +92,6 @@ import android.os.IBinder; import android.os.IInterface; import android.os.Looper; import android.os.Message; -import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; @@ -122,6 +120,8 @@ import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.Xml; +import android.view.WindowManager; +import android.view.WindowManagerInternal; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.widget.Toast; @@ -138,6 +138,7 @@ import com.android.server.SystemService; import com.android.server.lights.Light; import com.android.server.lights.LightsManager; import com.android.server.notification.ManagedServices.ManagedServiceInfo; +import com.android.server.policy.PhoneWindowManager; import com.android.server.statusbar.StatusBarManagerInternal; import com.android.server.vr.VrManagerInternal; import com.android.server.notification.ManagedServices.UserProfiles; @@ -193,7 +194,7 @@ public class NotificationManagerService extends SystemService { private static final int MESSAGE_RECONSIDER_RANKING = 1000; private static final int MESSAGE_RANKING_SORT = 1001; - static final int LONG_DELAY = 3500; // 3.5 seconds + static final int LONG_DELAY = PhoneWindowManager.TOAST_WINDOW_TIMEOUT; static final int SHORT_DELAY = 2000; // 2 seconds static final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250}; @@ -232,6 +233,7 @@ public class NotificationManagerService extends SystemService { @Nullable StatusBarManagerInternal mStatusBar; Vibrator mVibrator; private VrManagerInternal mVrManagerInternal; + private WindowManagerInternal mWindowManagerInternal; final IBinder mForegroundToken = new Binder(); private Handler mHandler; @@ -452,13 +454,15 @@ public class NotificationManagerService extends SystemService { final String pkg; final ITransientNotification callback; int duration; + Binder token; - ToastRecord(int pid, String pkg, ITransientNotification callback, int duration) - { + ToastRecord(int pid, String pkg, ITransientNotification callback, int duration, + Binder token) { this.pid = pid; this.pkg = pkg; this.callback = callback; this.duration = duration; + this.token = token; } void update(int duration) { @@ -1125,6 +1129,7 @@ public class NotificationManagerService extends SystemService { mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); mAudioManagerInternal = getLocalService(AudioManagerInternal.class); mVrManagerInternal = getLocalService(VrManagerInternal.class); + mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class); mZenModeHelper.onSystemReady(); } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) { // This observer will force an update when observe is called, causing us to @@ -1325,10 +1330,13 @@ public class NotificationManagerService extends SystemService { } } - record = new ToastRecord(callingPid, pkg, callback, duration); + Binder token = new Binder(); + mWindowManagerInternal.addWindowToken(token, + WindowManager.LayoutParams.TYPE_TOAST); + record = new ToastRecord(callingPid, pkg, callback, duration, token); mToastQueue.add(record); index = mToastQueue.size() - 1; - keepProcessAliveLocked(callingPid); + keepProcessAliveIfNeededLocked(callingPid); } // If it's at index 0, it's the current toast. It doesn't matter if it's // new or just been updated. Call back and tell it to show itself. @@ -2991,7 +2999,7 @@ public class NotificationManagerService extends SystemService { while (record != null) { if (DBG) Slog.d(TAG, "Show pkg=" + record.pkg + " callback=" + record.callback); try { - record.callback.show(); + record.callback.show(record.token); scheduleTimeoutLocked(record); return; } catch (RemoteException e) { @@ -3002,7 +3010,7 @@ public class NotificationManagerService extends SystemService { if (index >= 0) { mToastQueue.remove(index); } - keepProcessAliveLocked(record.pid); + keepProcessAliveIfNeededLocked(record.pid); if (mToastQueue.size() > 0) { record = mToastQueue.get(0); } else { @@ -3022,8 +3030,11 @@ public class NotificationManagerService extends SystemService { // don't worry about this, we're about to remove it from // the list anyway } - mToastQueue.remove(index); - keepProcessAliveLocked(record.pid); + + ToastRecord lastToast = mToastQueue.remove(index); + mWindowManagerInternal.removeWindowToken(lastToast.token, true); + + keepProcessAliveIfNeededLocked(record.pid); if (mToastQueue.size() > 0) { // Show the next one. If the callback fails, this will remove // it from the list, so don't assume that the list hasn't changed @@ -3067,7 +3078,7 @@ public class NotificationManagerService extends SystemService { } // lock on mToastQueue - void keepProcessAliveLocked(int pid) + void keepProcessAliveIfNeededLocked(int pid) { int toastCount = 0; // toasts from this pid ArrayList<ToastRecord> list = mToastQueue; diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index c22bfb321a5c..afd42ea67c0f 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -35,6 +35,7 @@ import android.content.pm.ServiceInfo; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.database.ContentObserver; +import android.media.AudioAttributes; import android.media.AudioManager; import android.media.AudioManagerInternal; import android.media.AudioSystem; @@ -736,13 +737,14 @@ public class ZenModeHelper { // total silence restrictions final boolean muteEverything = mZenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; - for (int i = USAGE_UNKNOWN; i <= USAGE_VIRTUAL_SOURCE; i++) { - if (i == USAGE_NOTIFICATION) { - applyRestrictions(muteNotifications || muteEverything, i); - } else if (i == USAGE_NOTIFICATION_RINGTONE) { - applyRestrictions(muteCalls || muteEverything, i); + for (int usage : AudioAttributes.SDK_USAGES) { + final int suppressionBehavior = AudioAttributes.SUPPRESSIBLE_USAGES.get(usage); + if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_NOTIFICATION) { + applyRestrictions(muteNotifications || muteEverything, usage); + } else if (suppressionBehavior == AudioAttributes.SUPPRESSIBLE_CALL) { + applyRestrictions(muteCalls || muteEverything, usage); } else { - applyRestrictions(muteEverything, i); + applyRestrictions(muteEverything, usage); } } } diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index 8d926f5d316f..68b465aaf816 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -60,7 +60,7 @@ final class EphemeralResolverConnection { public EphemeralResolverConnection(Context context, ComponentName componentName) { mContext = context; - mIntent = new Intent().setComponent(componentName); + mIntent = new Intent(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE).setComponent(componentName); } public final List<EphemeralResolveInfo> getEphemeralResolveInfoList( diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 72c549f7bec6..2e18b1c417fe 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -230,6 +230,11 @@ public final class Installer extends SystemService { mInstaller.execute("move_ab", apkPath, instructionSet, outputPath); } + public void deleteOdex(String apkPath, String instructionSet, String outputPath) + throws InstallerException { + mInstaller.execute("delete_odex", apkPath, instructionSet, outputPath); + } + private static void assertValidInstructionSet(String instructionSet) throws InstallerException { for (String abi : Build.SUPPORTED_ABIS) { diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java index bff6d2d4786e..42079fb0df1b 100644 --- a/services/core/java/com/android/server/pm/OtaDexoptService.java +++ b/services/core/java/com/android/server/pm/OtaDexoptService.java @@ -31,7 +31,7 @@ import android.os.ServiceManager; import android.os.storage.StorageManager; import android.util.Log; import android.util.Slog; - +import com.android.internal.logging.MetricsLogger; import com.android.internal.os.InstallerConnection; import com.android.internal.os.InstallerConnection.InstallerException; @@ -40,6 +40,7 @@ import java.io.FileDescriptor; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; /** * A service for A/B OTA dexopting. @@ -53,6 +54,10 @@ public class OtaDexoptService extends IOtaDexopt.Stub { // The synthetic library dependencies denoting "no checks." private final static String[] NO_LIBRARIES = new String[] { "&" }; + // The amount of "available" (free - low threshold) space necessary at the start of an OTA to + // not bulk-delete unused apps' odex files. + private final static long BULK_DELETE_THRESHOLD = 1024 * 1024 * 1024; // 1GB. + private final Context mContext; private final PackageManagerService mPackageManagerService; @@ -65,6 +70,25 @@ public class OtaDexoptService extends IOtaDexopt.Stub { private int completeSize; + // MetricsLogger properties. + + // Space before and after. + private long availableSpaceBefore; + private long availableSpaceAfterBulkDelete; + private long availableSpaceAfterDexopt; + + // Packages. + private int importantPackageCount; + private int otherPackageCount; + + // Number of dexopt commands. This may be different from the count of packages. + private int dexoptCommandCountTotal; + private int dexoptCommandCountExecuted; + + // For spent time. + private long otaDexoptTimeStart; + + public OtaDexoptService(Context context, PackageManagerService packageManagerService) { this.mContext = context; this.mPackageManagerService = packageManagerService; @@ -128,6 +152,18 @@ public class OtaDexoptService extends IOtaDexopt.Stub { generatePackageDexopts(p, PackageManagerService.REASON_FIRST_BOOT)); } completeSize = mDexoptCommands.size(); + + long spaceAvailable = getAvailableSpace(); + if (spaceAvailable < BULK_DELETE_THRESHOLD) { + Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: " + + PackageManagerServiceUtils.packagesToString(others)); + for (PackageParser.Package pkg : others) { + deleteOatArtifactsOfPackage(pkg); + } + } + long spaceAvailableNow = getAvailableSpace(); + + prepareMetricsLogging(important.size(), others.size(), spaceAvailable, spaceAvailableNow); } @Override @@ -136,6 +172,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub { Log.i(TAG, "Cleaning up OTA Dexopt state."); } mDexoptCommands = null; + + performMetricsLogging(); } @Override @@ -169,28 +207,67 @@ public class OtaDexoptService extends IOtaDexopt.Stub { String next = mDexoptCommands.remove(0); - if (IsFreeSpaceAvailable()) { + if (getAvailableSpace() > 0) { + dexoptCommandCountExecuted++; + return next; } else { + if (DEBUG_DEXOPT) { + Log.w(TAG, "Not enough space for OTA dexopt, stopping with " + + (mDexoptCommands.size() + 1) + " commands left."); + } mDexoptCommands.clear(); return "(no free space)"; } } - /** - * Check for low space. Returns true if there's space left. - */ - private boolean IsFreeSpaceAvailable() { - // TODO: If apps are not installed in the internal /data partition, we should compare - // against that storage's free capacity. + private long getMainLowSpaceThreshold() { File dataDir = Environment.getDataDirectory(); @SuppressWarnings("deprecation") long lowThreshold = StorageManager.from(mContext).getStorageLowBytes(dataDir); if (lowThreshold == 0) { throw new IllegalStateException("Invalid low memory threshold"); } + return lowThreshold; + } + + /** + * Returns the difference of free space to the low-storage-space threshold. Positive values + * indicate free bytes. + */ + private long getAvailableSpace() { + // TODO: If apps are not installed in the internal /data partition, we should compare + // against that storage's free capacity. + long lowThreshold = getMainLowSpaceThreshold(); + + File dataDir = Environment.getDataDirectory(); long usableSpace = dataDir.getUsableSpace(); - return (usableSpace >= lowThreshold); + + return usableSpace - lowThreshold; + } + + private static String getOatDir(PackageParser.Package pkg) { + if (!pkg.canHaveOatDir()) { + return null; + } + File codePath = new File(pkg.codePath); + if (codePath.isDirectory()) { + return PackageDexOptimizer.getOatDir(codePath).getAbsolutePath(); + } + return null; + } + + private void deleteOatArtifactsOfPackage(PackageParser.Package pkg) { + String[] instructionSets = getAppDexInstructionSets(pkg.applicationInfo); + for (String codePath : pkg.getAllCodePaths()) { + for (String isa : instructionSets) { + try { + mPackageManagerService.mInstaller.deleteOdex(codePath, isa, getOatDir(pkg)); + } catch (InstallerException e) { + Log.e(TAG, "Failed deleting oat files for " + codePath, e); + } + } + } } /** @@ -271,6 +348,55 @@ public class OtaDexoptService extends IOtaDexopt.Stub { } } + /** + * Initialize logging fields. + */ + private void prepareMetricsLogging(int important, int others, long spaceBegin, long spaceBulk) { + availableSpaceBefore = spaceBegin; + availableSpaceAfterBulkDelete = spaceBulk; + availableSpaceAfterDexopt = 0; + + importantPackageCount = important; + otherPackageCount = others; + + dexoptCommandCountTotal = mDexoptCommands.size(); + dexoptCommandCountExecuted = 0; + + otaDexoptTimeStart = System.nanoTime(); + } + + private static int inMegabytes(long value) { + long in_mega_bytes = value / (1024 * 1024); + if (in_mega_bytes > Integer.MAX_VALUE) { + Log.w(TAG, "Recording " + in_mega_bytes + "MB of free space, overflowing range"); + return Integer.MAX_VALUE; + } + return (int)in_mega_bytes; + } + + private void performMetricsLogging() { + long finalTime = System.nanoTime(); + + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_before_mb", + inMegabytes(availableSpaceBefore)); + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_bulk_delete_mb", + inMegabytes(availableSpaceAfterBulkDelete)); + MetricsLogger.histogram(mContext, "ota_dexopt_available_space_after_dexopt_mb", + inMegabytes(availableSpaceAfterDexopt)); + + MetricsLogger.histogram(mContext, "ota_dexopt_num_important_packages", + importantPackageCount); + MetricsLogger.histogram(mContext, "ota_dexopt_num_other_packages", otherPackageCount); + + MetricsLogger.histogram(mContext, "ota_dexopt_num_commands", dexoptCommandCountTotal); + MetricsLogger.histogram(mContext, "ota_dexopt_num_commands_executed", + dexoptCommandCountExecuted); + + final int elapsedTimeSeconds = + (int) TimeUnit.NANOSECONDS.toSeconds(finalTime - otaDexoptTimeStart); + MetricsLogger.histogram(mContext, "ota_dexopt_time_s", elapsedTimeSeconds); + } + private static class OTADexoptPackageDexOptimizer extends PackageDexOptimizer.ForcedUpdatePackageDexOptimizer { diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 6a56fa6e629b..d25abbf1ff8a 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -870,13 +870,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub { IntentSender statusReceiver, int userId) { final int callingUid = Binder.getCallingUid(); mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall"); - boolean allowSilentUninstall = true; if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) { mAppOps.checkPackage(callingUid, callerPackageName); - final String installerPackageName = mPm.getInstallerPackageName(packageName); - allowSilentUninstall = mPm.isOrphaned(packageName) || - (installerPackageName != null - && installerPackageName.equals(callerPackageName)); } // Check whether the caller is device owner, in which case we do it silently. @@ -887,8 +882,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub { final PackageDeleteObserverAdapter adapter = new PackageDeleteObserverAdapter(mContext, statusReceiver, packageName, isDeviceOwner, userId); - if (allowSilentUninstall && mContext.checkCallingOrSelfPermission( - android.Manifest.permission.DELETE_PACKAGES) == PackageManager.PERMISSION_GRANTED) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DELETE_PACKAGES) + == PackageManager.PERMISSION_GRANTED) { // Sweet, call straight through! mPm.deletePackage(packageName, adapter.getBinder(), userId, flags); } else if (isDeviceOwner) { diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 6cdc40f7a81c..0b8a34799166 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -44,6 +44,7 @@ import android.content.pm.PackageParser.ApkLite; import android.content.pm.PackageParser.PackageLite; import android.content.pm.PackageParser.PackageParserException; import android.content.pm.Signature; +import android.os.Binder; import android.os.Bundle; import android.os.FileBridge; import android.os.FileUtils; @@ -109,6 +110,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final int installerUid; final SessionParams params; final long createdMillis; + final int defaultContainerGid; /** Staging location where client data is written. */ final File stageDir; @@ -199,13 +201,19 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { private final Handler.Callback mHandlerCallback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { + // Cache package manager data without the lock held + final PackageInfo pkgInfo = mPm.getPackageInfo( + params.appPackageName, PackageManager.GET_SIGNATURES /*flags*/, userId); + final ApplicationInfo appInfo = mPm.getApplicationInfo( + params.appPackageName, 0, userId); + synchronized (mLock) { if (msg.obj != null) { mRemoteObserver = (IPackageInstallObserver2) msg.obj; } try { - commitLocked(); + commitLocked(pkgInfo, appInfo); } catch (PackageManagerException e) { final String completeMsg = ExceptionUtils.getCompleteMessage(e); Slog.e(TAG, "Commit of session " + sessionId + " failed: " + completeMsg); @@ -264,6 +272,14 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } else { mPermissionsAccepted = false; } + final long identity = Binder.clearCallingIdentity(); + try { + final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE, + PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); + defaultContainerGid = UserHandle.getSharedAppGid(uid); + } finally { + Binder.restoreCallingIdentity(identity); + } } public SessionInfo generateInfo() { @@ -520,7 +536,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { mHandler.obtainMessage(MSG_COMMIT, adapter.getBinder()).sendToTarget(); } - private void commitLocked() throws PackageManagerException { + private void commitLocked(PackageInfo pkgInfo, ApplicationInfo appInfo) + throws PackageManagerException { if (mDestroyed) { throw new PackageManagerException(INSTALL_FAILED_INTERNAL_ERROR, "Session destroyed"); } @@ -538,7 +555,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // Verify that stage looks sane with respect to existing application. // This currently only ensures packageName, versionCode, and certificate // consistency. - validateInstallLocked(); + validateInstallLocked(pkgInfo, appInfo); Preconditions.checkNotNull(mPackageName); Preconditions.checkNotNull(mSignatures); @@ -650,7 +667,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { * Note that upgrade compatibility is still performed by * {@link PackageManagerService}. */ - private void validateInstallLocked() throws PackageManagerException { + private void validateInstallLocked(PackageInfo pkgInfo, ApplicationInfo appInfo) + throws PackageManagerException { mPackageName = null; mVersionCode = -1; mSignatures = null; @@ -729,10 +747,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { if (removeSplitList.size() > 0) { // validate split names marked for removal - final int flags = mSignatures == null ? PackageManager.GET_SIGNATURES : 0; - final PackageInfo pkg = mPm.getPackageInfo(params.appPackageName, flags, userId); for (String splitName : removeSplitList) { - if (!ArrayUtils.contains(pkg.splitNames, splitName)) { + if (!ArrayUtils.contains(pkgInfo.splitNames, splitName)) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, "Split not found: " + splitName); } @@ -740,11 +756,11 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // ensure we've got appropriate package name, version code and signatures if (mPackageName == null) { - mPackageName = pkg.packageName; - mVersionCode = pkg.versionCode; + mPackageName = pkgInfo.packageName; + mVersionCode = pkgInfo.versionCode; } if (mSignatures == null) { - mSignatures = pkg.signatures; + mSignatures = pkgInfo.signatures; } } @@ -757,8 +773,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } else { // Partial installs must be consistent with existing install - final ApplicationInfo app = mPm.getApplicationInfo(mPackageName, 0, userId); - if (app == null) { + if (appInfo == null) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, "Missing existing base package for " + mPackageName); } @@ -766,8 +781,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { final PackageLite existing; final ApkLite existingBase; try { - existing = PackageParser.parsePackageLite(new File(app.getCodePath()), 0); - existingBase = PackageParser.parseApkLite(new File(app.getBaseCodePath()), + existing = PackageParser.parsePackageLite(new File(appInfo.getCodePath()), 0); + existingBase = PackageParser.parseApkLite(new File(appInfo.getBaseCodePath()), PackageParser.PARSE_COLLECT_CERTIFICATES); } catch (PackageParserException e) { throw PackageManagerException.from(e); @@ -777,7 +792,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { // Inherit base if not overridden if (mResolvedBaseFile == null) { - mResolvedBaseFile = new File(app.getBaseCodePath()); + mResolvedBaseFile = new File(appInfo.getBaseCodePath()); mResolvedInheritedFiles.add(mResolvedBaseFile); } @@ -794,7 +809,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } // Inherit compiled oat directory. - final File packageInstallDir = (new File(app.getBaseCodePath())).getParentFile(); + final File packageInstallDir = (new File(appInfo.getBaseCodePath())).getParentFile(); mInheritedFilesBase = packageInstallDir; final File oatDir = new File(packageInstallDir, "oat"); if (oatDir.exists()) { @@ -822,7 +837,8 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } } - private void assertApkConsistent(String tag, ApkLite apk) throws PackageManagerException { + private void assertApkConsistent(String tag, ApkLite apk) + throws PackageManagerException { if (!mPackageName.equals(apk.packageName)) { throw new PackageManagerException(INSTALL_FAILED_INVALID_APK, tag + " package " + apk.packageName + " inconsistent with " + mPackageName); @@ -1035,10 +1051,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { "Failed to finalize container " + cid); } - final int uid = mPm.getPackageUid(PackageManagerService.DEFAULT_CONTAINER_PACKAGE, - PackageManager.MATCH_SYSTEM_ONLY, UserHandle.USER_SYSTEM); - final int gid = UserHandle.getSharedAppGid(uid); - if (!PackageHelper.fixSdPermissions(cid, gid, null)) { + if (!PackageHelper.fixSdPermissions(cid, defaultContainerGid, null)) { throw new PackageManagerException(INSTALL_FAILED_CONTAINER_ERROR, "Failed to fix permissions on container " + cid); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f326555ee00a..783db051f8de 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -177,6 +177,7 @@ import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; +import android.os.PatternMatcher; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; @@ -196,6 +197,7 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeRecord; import android.provider.Settings.Global; +import android.provider.Settings.Secure; import android.security.KeyStore; import android.security.SystemKeyStore; import android.system.ErrnoException; @@ -210,6 +212,7 @@ import android.util.ExceptionUtils; import android.util.Log; import android.util.LogPrinter; import android.util.MathUtils; +import android.util.Pair; import android.util.PrintStreamPrinter; import android.util.Slog; import android.util.SparseArray; @@ -363,7 +366,8 @@ public class PackageManagerService extends IPackageManager.Stub { static final boolean CLEAR_RUNTIME_PERMISSIONS_ON_UPGRADE = false; - private static final boolean DISABLE_EPHEMERAL_APPS = !Build.IS_DEBUGGABLE; + private static final boolean DISABLE_EPHEMERAL_APPS = false; + private static final boolean HIDE_EPHEMERAL_APIS = true; private static final int RADIO_UID = Process.PHONE_UID; private static final int LOG_UID = Process.LOG_UID; @@ -455,6 +459,8 @@ public class PackageManagerService extends IPackageManager.Stub { private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; + private static final String PACKAGE_SCHEME = "package"; + private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay"; private static int DEFAULT_EPHEMERAL_HASH_PREFIX_MASK = 0xFFFFF000; @@ -531,6 +537,10 @@ public class PackageManagerService extends IPackageManager.Stub { final String[] mSeparateProcesses; final boolean mIsUpgrade; final boolean mIsPreNUpgrade; + final boolean mIsPreNMR1Upgrade; + + @GuardedBy("mPackages") + private boolean mDexOptDialogShown; /** The location for ASEC container files on internal storage. */ final String mAsecInternalPath; @@ -1117,7 +1127,9 @@ public class PackageManagerService extends IPackageManager.Stub { final @Nullable String mRequiredVerifierPackage; final @NonNull String mRequiredInstallerPackage; + final @NonNull String mRequiredUninstallerPackage; final @Nullable String mSetupWizardPackage; + final @Nullable String mStorageManagerPackage; final @NonNull String mServicesSystemSharedLibraryPackageName; final @NonNull String mSharedSystemSharedLibraryPackageName; @@ -2238,6 +2250,8 @@ public class PackageManagerService extends IPackageManager.Stub { // as there is no profiling data available. mIsPreNUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N; + mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1; + // save off the names of pre-existing system packages prior to scanning; we don't // want to automatically grant runtime permissions for new system apps if (mPromoteSystemApps) { @@ -2457,6 +2471,9 @@ public class PackageManagerService extends IPackageManager.Stub { } mExpectingBetter.clear(); + // Resolve the storage manager. + mStorageManagerPackage = getStorageManagerPackageName(); + // Resolve protected action filters. Only the setup wizard is allowed to // have a high priority filter for these actions. mSetupWizardPackage = getSetupWizardPackageName(); @@ -2620,6 +2637,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (!mOnlyCore) { mRequiredVerifierPackage = getRequiredButNotReallyRequiredVerifierLPr(); mRequiredInstallerPackage = getRequiredInstallerLPr(); + mRequiredUninstallerPackage = getRequiredUninstallerLPr(); mIntentFilterVerifierComponent = getIntentFilterVerifierComponentNameLPr(); mIntentFilterVerifier = new IntentVerifierProxy(mContext, mIntentFilterVerifierComponent); @@ -2630,6 +2648,7 @@ public class PackageManagerService extends IPackageManager.Stub { } else { mRequiredVerifierPackage = null; mRequiredInstallerPackage = null; + mRequiredUninstallerPackage = null; mIntentFilterVerifierComponent = null; mIntentFilterVerifier = null; mServicesSystemSharedLibraryPackageName = null; @@ -2707,10 +2726,11 @@ public class PackageManagerService extends IPackageManager.Stub { UserHandle.USER_SYSTEM); if (matches.size() == 1) { return matches.get(0).getComponentInfo().packageName; - } else { - Log.e(TAG, "There should probably be exactly one verifier; found " + matches); + } else if (matches.size() == 0) { + Log.e(TAG, "There should probably be a verifier, but, none were found"); return null; } + throw new RuntimeException("There must be exactly one verifier; found " + matches); } private @NonNull String getRequiredSharedLibraryLPr(String libraryName) { @@ -2742,6 +2762,22 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private @NonNull String getRequiredUninstallerLPr() { + final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.setData(Uri.fromParts(PACKAGE_SCHEME, "foo.bar", null)); + + final ResolveInfo resolveInfo = resolveIntent(intent, null, + MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, + UserHandle.USER_SYSTEM); + if (resolveInfo == null || + mResolveActivity.name.equals(resolveInfo.getComponentInfo().name)) { + throw new RuntimeException("There must be exactly one uninstaller; found " + + resolveInfo); + } + return resolveInfo.getComponentInfo().packageName; + } + private @NonNull ComponentName getIntentFilterVerifierComponentNameLPr() { final Intent intent = new Intent(Intent.ACTION_INTENT_FILTER_NEEDS_VERIFICATION); @@ -4722,20 +4758,6 @@ public class PackageManagerService extends IPackageManager.Stub { final ResolveInfo bestChoice = chooseBestActivity(intent, resolvedType, flags, query, userId); - - if (isEphemeralAllowed(intent, query, userId)) { - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral"); - final EphemeralResolveInfo ai = - getEphemeralResolveInfo(intent, resolvedType, userId); - if (ai != null) { - if (DEBUG_EPHEMERAL) { - Slog.v(TAG, "Returning an EphemeralResolveInfo"); - } - bestChoice.ephemeralInstaller = mEphemeralInstallerInfo; - bestChoice.ephemeralResolveInfo = ai; - } - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); - } return bestChoice; } finally { Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); @@ -4776,11 +4798,23 @@ public class PackageManagerService extends IPackageManager.Stub { false, false, false, userId); } + private boolean isEphemeralDisabled() { + // ephemeral apps have been disabled across the board + if (DISABLE_EPHEMERAL_APPS) { + return true; + } + // system isn't up yet; can't read settings, so, assume no ephemeral apps + if (!mSystemReady) { + return true; + } + return Secure.getInt(mContext.getContentResolver(), Secure.WEB_ACTION_ENABLED, 1) == 0; + } private boolean isEphemeralAllowed( - Intent intent, List<ResolveInfo> resolvedActivites, int userId) { + Intent intent, List<ResolveInfo> resolvedActivities, int userId, + boolean skipPackageCheck) { // Short circuit and return early if possible. - if (DISABLE_EPHEMERAL_APPS) { + if (isEphemeralDisabled()) { return false; } final int callingUser = UserHandle.getCallingUserId(); @@ -4793,18 +4827,21 @@ public class PackageManagerService extends IPackageManager.Stub { if (intent.getComponent() != null) { return false; } - if (intent.getPackage() != null) { + if ((intent.getFlags() & Intent.FLAG_IGNORE_EPHEMERAL) != 0) { + return false; + } + if (!skipPackageCheck && intent.getPackage() != null) { return false; } final boolean isWebUri = hasWebURI(intent); - if (!isWebUri) { + if (!isWebUri || intent.getData().getHost() == null) { return false; } // Deny ephemeral apps if the user chose _ALWAYS or _ALWAYS_ASK for intent resolution. synchronized (mPackages) { - final int count = resolvedActivites.size(); + final int count = (resolvedActivities == null ? 0 : resolvedActivities.size()); for (int n = 0; n < count; n++) { - ResolveInfo info = resolvedActivites.get(n); + ResolveInfo info = resolvedActivities.get(n); String packageName = info.activityInfo.packageName; PackageSetting ps = mSettings.mPackages.get(packageName); if (ps != null) { @@ -4826,19 +4863,19 @@ public class PackageManagerService extends IPackageManager.Stub { return true; } - private EphemeralResolveInfo getEphemeralResolveInfo(Intent intent, String resolvedType, - int userId) { - final int ephemeralPrefixMask = Global.getInt(mContext.getContentResolver(), + private static EphemeralResolveInfo getEphemeralResolveInfo( + Context context, EphemeralResolverConnection resolverConnection, Intent intent, + String resolvedType, int userId, String packageName) { + final int ephemeralPrefixMask = Global.getInt(context.getContentResolver(), Global.EPHEMERAL_HASH_PREFIX_MASK, DEFAULT_EPHEMERAL_HASH_PREFIX_MASK); - final int ephemeralPrefixCount = Global.getInt(mContext.getContentResolver(), + final int ephemeralPrefixCount = Global.getInt(context.getContentResolver(), Global.EPHEMERAL_HASH_PREFIX_COUNT, DEFAULT_EPHEMERAL_HASH_PREFIX_COUNT); final EphemeralDigest digest = new EphemeralDigest(intent.getData(), ephemeralPrefixMask, ephemeralPrefixCount); final int[] shaPrefix = digest.getDigestPrefix(); final byte[][] digestBytes = digest.getDigestBytes(); final List<EphemeralResolveInfo> ephemeralResolveInfoList = - mEphemeralResolverConnection.getEphemeralResolveInfoList( - shaPrefix, ephemeralPrefixMask); + resolverConnection.getEphemeralResolveInfoList(shaPrefix, ephemeralPrefixMask); if (ephemeralResolveInfoList == null || ephemeralResolveInfoList.size() == 0) { // No hash prefix match; there are no ephemeral apps for this domain. return null; @@ -4855,6 +4892,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (filters.isEmpty()) { continue; } + if (packageName != null + && !packageName.equals(ephemeralApplication.getPackageName())) { + continue; + } // We have a domain match; resolve the filters to see if anything matches. final EphemeralIntentResolver ephemeralResolver = new EphemeralIntentResolver(); for (int j = filters.size() - 1; j >= 0; --j) { @@ -5258,8 +5299,12 @@ public class PackageManagerService extends IPackageManager.Stub { } // reader + boolean sortResult = false; + boolean addEphemeral = false; + boolean matchEphemeralPackage = false; + List<ResolveInfo> result; + final String pkgName = intent.getPackage(); synchronized (mPackages) { - final String pkgName = intent.getPackage(); if (pkgName == null) { List<CrossProfileIntentFilter> matchingFilters = getMatchingCrossProfileIntentFilters(intent, resolvedType, userId); @@ -5267,15 +5312,16 @@ public class PackageManagerService extends IPackageManager.Stub { ResolveInfo xpResolveInfo = querySkipCurrentProfileIntents(matchingFilters, intent, resolvedType, flags, userId); if (xpResolveInfo != null) { - List<ResolveInfo> result = new ArrayList<ResolveInfo>(1); - result.add(xpResolveInfo); - return filterIfNotSystemUser(result, userId); + List<ResolveInfo> xpResult = new ArrayList<ResolveInfo>(1); + xpResult.add(xpResolveInfo); + return filterIfNotSystemUser(xpResult, userId); } // Check for results in the current profile. - List<ResolveInfo> result = mActivities.queryIntent( - intent, resolvedType, flags, userId); - result = filterIfNotSystemUser(result, userId); + result = filterIfNotSystemUser(mActivities.queryIntent( + intent, resolvedType, flags, userId), userId); + addEphemeral = + isEphemeralAllowed(intent, result, userId, false /*skipPackageCheck*/); // Check for cross profile results. boolean hasNonNegativePriorityResult = hasNonNegativePriority(result); @@ -5287,7 +5333,7 @@ public class PackageManagerService extends IPackageManager.Stub { Collections.singletonList(xpResolveInfo), userId).size() > 0; if (isVisibleToUser) { result.add(xpResolveInfo); - Collections.sort(result, mResolvePrioritySorter); + sortResult = true; } } if (hasWebURI(intent)) { @@ -5303,28 +5349,61 @@ public class PackageManagerService extends IPackageManager.Stub { // in the result. result.remove(xpResolveInfo); } - if (result.size() == 0) { + if (result.size() == 0 && !addEphemeral) { result.add(xpDomainInfo.resolveInfo); return result; } - } else if (result.size() <= 1) { - return result; } - result = filterCandidatesWithDomainPreferredActivitiesLPr(intent, flags, result, - xpDomainInfo, userId); - Collections.sort(result, mResolvePrioritySorter); + if (result.size() > 1 || addEphemeral) { + result = filterCandidatesWithDomainPreferredActivitiesLPr( + intent, flags, result, xpDomainInfo, userId); + sortResult = true; + } + } + } else { + final PackageParser.Package pkg = mPackages.get(pkgName); + if (pkg != null) { + result = filterIfNotSystemUser( + mActivities.queryIntentForPackage( + intent, resolvedType, flags, pkg.activities, userId), + userId); + } else { + // the caller wants to resolve for a particular package; however, there + // were no installed results, so, try to find an ephemeral result + addEphemeral = isEphemeralAllowed( + intent, null /*result*/, userId, true /*skipPackageCheck*/); + matchEphemeralPackage = true; + result = new ArrayList<ResolveInfo>(); } - return result; } - final PackageParser.Package pkg = mPackages.get(pkgName); - if (pkg != null) { - return filterIfNotSystemUser( - mActivities.queryIntentForPackage( - intent, resolvedType, flags, pkg.activities, userId), - userId); + } + if (addEphemeral) { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "resolveEphemeral"); + final EphemeralResolveInfo ai = getEphemeralResolveInfo( + mContext, mEphemeralResolverConnection, intent, resolvedType, userId, + matchEphemeralPackage ? pkgName : null); + if (ai != null) { + if (DEBUG_EPHEMERAL) { + Slog.v(TAG, "Adding ephemeral installer to the ResolveInfo list"); + } + final ResolveInfo ephemeralInstaller = new ResolveInfo(mEphemeralInstallerInfo); + ephemeralInstaller.ephemeralResolveInfo = ai; + // make sure this resolver is the default + ephemeralInstaller.isDefault = true; + ephemeralInstaller.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART + | IntentFilter.MATCH_ADJUSTMENT_NORMAL; + // add a non-generic filter + ephemeralInstaller.filter = new IntentFilter(intent.getAction()); + ephemeralInstaller.filter.addDataPath( + intent.getData().getPath(), PatternMatcher.PATTERN_LITERAL); + result.add(ephemeralInstaller); } - return new ArrayList<ResolveInfo>(); + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); } + if (sortResult) { + Collections.sort(result, mResolvePrioritySorter); + } + return result; } private static class CrossProfileDomainInfo { @@ -6204,7 +6283,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public ParceledListSlice<EphemeralApplicationInfo> getEphemeralApplications(int userId) { - if (DISABLE_EPHEMERAL_APPS) { + if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return null; } @@ -6228,7 +6307,7 @@ public class PackageManagerService extends IPackageManager.Stub { enforceCrossUserPermission(Binder.getCallingUid(), userId, true /* requireFullPermission */, false /* checkShell */, "isEphemeral"); - if (DISABLE_EPHEMERAL_APPS) { + if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return false; } @@ -6246,7 +6325,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public byte[] getEphemeralApplicationCookie(String packageName, int userId) { - if (DISABLE_EPHEMERAL_APPS) { + if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return null; } @@ -6264,7 +6343,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean setEphemeralApplicationCookie(String packageName, byte[] cookie, int userId) { - if (DISABLE_EPHEMERAL_APPS) { + if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return true; } @@ -6282,7 +6361,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public Bitmap getEphemeralApplicationIcon(String packageName, int userId) { - if (DISABLE_EPHEMERAL_APPS) { + if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return null; } @@ -6612,9 +6691,13 @@ public class PackageManagerService extends IPackageManager.Stub { private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, File srcFile, final int policyFlags) throws PackageManagerException { + // When upgrading from pre-N MR1, verify the package time stamp using the package + // directory and not the APK file. + final long lastModifiedTime = mIsPreNMR1Upgrade + ? new File(pkg.codePath).lastModified() : getLastModifiedTime(pkg, srcFile); if (ps != null && ps.codePath.equals(srcFile) - && ps.timeStamp == getLastModifiedTime(pkg, srcFile) + && ps.timeStamp == lastModifiedTime && !isCompatSignatureUpdateNeeded(pkg) && !isRecoverSignatureUpdateNeeded(pkg)) { long mSigningKeySetId = ps.keySetData.getProperSigningKeySet(); @@ -6636,7 +6719,7 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.w(TAG, "PackageSetting for " + ps.name + " is missing signatures. Collecting certs again to recover them."); } else { - Log.i(TAG, srcFile.toString() + " changed; collecting certs"); + Slog.i(TAG, srcFile.toString() + " changed; collecting certs"); } try { @@ -7075,7 +7158,11 @@ public class PackageManagerService extends IPackageManager.Stub { } } if (doTrim) { - if (!isFirstBoot()) { + final boolean dexOptDialogShown; + synchronized (mPackages) { + dexOptDialogShown = mDexOptDialogShown; + } + if (!isFirstBoot() && dexOptDialogShown) { try { ActivityManagerNative.getDefault().showBootMessage( mContext.getResources().getString( @@ -7169,6 +7256,9 @@ public class PackageManagerService extends IPackageManager.Stub { numberOfPackagesVisited, numberOfPackagesToDexopt), true); } catch (RemoteException e) { } + synchronized (mPackages) { + mDexOptDialogShown = true; + } } // If the OTA updates a system app which was previously preopted to a non-preopted state @@ -8366,6 +8456,10 @@ public class PackageManagerService extends IPackageManager.Stub { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_FACTORY_TEST; } + if (isSystemApp(pkg)) { + pkgSetting.isOrphaned = true; + } + ArrayList<PackageParser.Package> clientLibPkgs = null; if ((scanFlags & SCAN_CHECK_ONLY) != 0) { @@ -8649,7 +8743,9 @@ public class PackageManagerService extends IPackageManager.Stub { for (i=0; i<N; i++) { PackageParser.PermissionGroup pg = pkg.permissionGroups.get(i); PackageParser.PermissionGroup cur = mPermissionGroups.get(pg.info.name); - if (cur == null) { + final String curPackageName = cur == null ? null : cur.info.packageName; + final boolean isPackageUpdate = pg.info.packageName.equals(curPackageName); + if (cur == null || isPackageUpdate) { mPermissionGroups.put(pg.info.name, pg); if ((policyFlags&PackageParser.PARSE_CHATTY) != 0) { if (r == null) { @@ -8657,6 +8753,9 @@ public class PackageManagerService extends IPackageManager.Stub { } else { r.append(' '); } + if (isPackageUpdate) { + r.append("UPD:"); + } r.append(pg.info.name); } } else { @@ -9189,15 +9288,17 @@ public class PackageManagerService extends IPackageManager.Stub { mEphemeralInstallerActivity.packageName = pkg.applicationInfo.packageName; mEphemeralInstallerActivity.processName = pkg.applicationInfo.packageName; mEphemeralInstallerActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE; - mEphemeralInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS | - ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; + mEphemeralInstallerActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS + | ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; mEphemeralInstallerActivity.theme = 0; mEphemeralInstallerActivity.exported = true; mEphemeralInstallerActivity.enabled = true; mEphemeralInstallerInfo.activityInfo = mEphemeralInstallerActivity; mEphemeralInstallerInfo.priority = 0; - mEphemeralInstallerInfo.preferredOrder = 0; - mEphemeralInstallerInfo.match = 0; + mEphemeralInstallerInfo.preferredOrder = 1; + mEphemeralInstallerInfo.isDefault = true; + mEphemeralInstallerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART + | IntentFilter.MATCH_ADJUSTMENT_NORMAL; if (DEBUG_EPHEMERAL) { Slog.d(TAG, "Set ephemeral installer activity: " + mEphemeralInstallerComponent); @@ -11165,6 +11266,19 @@ public class PackageManagerService extends IPackageManager.Stub { private static final class EphemeralIntentResolver extends IntentResolver<EphemeralResolveIntentInfo, EphemeralResolveInfo> { + /** + * The result that has the highest defined order. Ordering applies on a + * per-package basis. Mapping is from package name to Pair of order and + * EphemeralResolveInfo. + * <p> + * NOTE: This is implemented as a field variable for convenience and efficiency. + * By having a field variable, we're able to track filter ordering as soon as + * a non-zero order is defined. Otherwise, multiple loops across the result set + * would be needed to apply ordering. If the intent resolver becomes re-entrant, + * this needs to be contained entirely within {@link #filterResults()}. + */ + final ArrayMap<String, Pair<Integer, EphemeralResolveInfo>> mOrderResult = new ArrayMap<>(); + @Override protected EphemeralResolveIntentInfo[] newArray(int size) { return new EphemeralResolveIntentInfo[size]; @@ -11181,7 +11295,51 @@ public class PackageManagerService extends IPackageManager.Stub { if (!sUserManager.exists(userId)) { return null; } - return info.getEphemeralResolveInfo(); + final String packageName = info.getEphemeralResolveInfo().getPackageName(); + final Integer order = info.getOrder(); + final Pair<Integer, EphemeralResolveInfo> lastOrderResult = + mOrderResult.get(packageName); + // ordering is enabled and this item's order isn't high enough + if (lastOrderResult != null && lastOrderResult.first >= order) { + return null; + } + final EphemeralResolveInfo res = info.getEphemeralResolveInfo(); + if (order > 0) { + // non-zero order, enable ordering + mOrderResult.put(packageName, new Pair<>(order, res)); + } + return res; + } + + @Override + protected void filterResults(List<EphemeralResolveInfo> results) { + // only do work if ordering is enabled [most of the time it won't be] + if (mOrderResult.size() == 0) { + return; + } + int resultSize = results.size(); + for (int i = 0; i < resultSize; i++) { + final EphemeralResolveInfo info = results.get(i); + final String packageName = info.getPackageName(); + final Pair<Integer, EphemeralResolveInfo> savedInfo = mOrderResult.get(packageName); + if (savedInfo == null) { + // package doesn't having ordering + continue; + } + if (savedInfo.second == info) { + // circled back to the highest ordered item; remove from order list + mOrderResult.remove(savedInfo); + if (mOrderResult.size() == 0) { + // no more ordered items + break; + } + continue; + } + // item has a worse order, remove it from the result list + results.remove(i); + resultSize--; + i--; + } } } @@ -11250,7 +11408,7 @@ public class PackageManagerService extends IPackageManager.Stub { } for (int id : resolvedUserIds) { final Intent intent = new Intent(action, - pkg != null ? Uri.fromParts("package", pkg, null) : null); + pkg != null ? Uri.fromParts(PACKAGE_SCHEME, pkg, null) : null); if (extras != null) { intent.putExtras(extras); } @@ -11746,6 +11904,12 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } + if (packageName.equals(mRequiredUninstallerPackage)) { + Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName + + "\": required for package uninstallation"); + return false; + } + if (packageName.equals(mRequiredVerifierPackage)) { Slog.w(TAG, "Cannot suspend/un-suspend package \"" + packageName + "\": required for package verification"); @@ -15310,6 +15474,17 @@ public class PackageManagerService extends IPackageManager.Stub { Preconditions.checkNotNull(packageName); Preconditions.checkNotNull(observer); final int uid = Binder.getCallingUid(); + if (!isOrphaned(packageName) + && !isCallerAllowedToSilentlyUninstall(uid, packageName)) { + try { + final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); + intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null)); + intent.putExtra(PackageInstaller.EXTRA_CALLBACK, observer.asBinder()); + observer.onUserActionRequired(intent); + } catch (RemoteException re) { + } + return; + } final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0; final int[] users = deleteAllUsers ? sUserManager.getUserIds() : new int[]{ userId }; if (UserHandle.getUserId(uid) != userId || (deleteAllUsers && users.length > 1)) { @@ -15378,6 +15553,37 @@ public class PackageManagerService extends IPackageManager.Stub { }); } + private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) { + if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID + || callingUid == Process.SYSTEM_UID) { + return true; + } + final int callingUserId = UserHandle.getUserId(callingUid); + // If the caller installed the pkgName, then allow it to silently uninstall. + if (callingUid == getPackageUid(getInstallerPackageName(pkgName), 0, callingUserId)) { + return true; + } + + // Allow package verifier to silently uninstall. + if (mRequiredVerifierPackage != null && + callingUid == getPackageUid(mRequiredVerifierPackage, 0, callingUserId)) { + return true; + } + + // Allow package uninstaller to silently uninstall. + if (mRequiredUninstallerPackage != null && + callingUid == getPackageUid(mRequiredUninstallerPackage, 0, callingUserId)) { + return true; + } + + // Allow storage manager to silently uninstall. + if (mStorageManagerPackage != null && + callingUid == getPackageUid(mStorageManagerPackage, 0, callingUserId)) { + return true; + } + return false; + } + private int[] getBlockUninstallForUsers(String packageName, int[] userIds) { int[] result = EMPTY_INT_ARRAY; for (int userId : userIds) { @@ -17590,6 +17796,22 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } + private @Nullable String getStorageManagerPackageName() { + final Intent intent = new Intent(StorageManager.ACTION_MANAGE_STORAGE); + + final List<ResolveInfo> matches = queryIntentActivitiesInternal(intent, null, + MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE + | MATCH_DISABLED_COMPONENTS, + UserHandle.myUserId()); + if (matches.size() == 1) { + return matches.get(0).getComponentInfo().packageName; + } else { + Slog.e(TAG, "There should probably be exactly one storage manager; found " + + matches.size() + ": matches=" + matches); + return null; + } + } + @Override public void setApplicationEnabledSetting(String appPackageName, int newState, int flags, int userId, String callingPackage) { @@ -20842,6 +21064,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); public boolean isPackageDataProtected(int userId, String packageName) { return mProtectedPackages.isPackageDataProtected(userId, packageName); } + + @Override + public boolean wasPackageEverLaunched(String packageName, int userId) { + synchronized (mPackages) { + return mSettings.wasPackageEverLaunchedLPr(packageName, userId); + } + } } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java index 751c5858446b..cfd0af7635e8 100644 --- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java +++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java @@ -19,6 +19,7 @@ package com.android.server.pm; import static com.android.server.pm.PackageManagerService.DEBUG_DEXOPT; import static com.android.server.pm.PackageManagerService.TAG; +import android.annotation.NonNull; import android.app.AppGlobals; import android.content.Intent; import android.content.pm.PackageParser; @@ -35,13 +36,9 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import java.util.Set; +import java.util.function.Predicate; /** * Class containing helper methods for the PackageManagerService. @@ -67,34 +64,51 @@ public class PackageManagerServiceUtils { return pkgNames; } - private static void filterRecentlyUsedApps(Collection<PackageParser.Package> pkgs, - long estimatedPreviousSystemUseTime, - long dexOptLRUThresholdInMills) { - // Filter out packages that aren't recently used. - int total = pkgs.size(); - int skipped = 0; - for (Iterator<PackageParser.Package> i = pkgs.iterator(); i.hasNext();) { - PackageParser.Package pkg = i.next(); - long then = pkg.getLatestForegroundPackageUseTimeInMills(); - if (then < estimatedPreviousSystemUseTime - dexOptLRUThresholdInMills) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Skipping dexopt of " + pkg.packageName + - " last used in foreground: " + - ((then == 0) ? "never" : new Date(then))); - } - i.remove(); - skipped++; - } else { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Will dexopt " + pkg.packageName + - " last used in foreground: " + - ((then == 0) ? "never" : new Date(then))); - } + // Sort a list of apps by their last usage, most recently used apps first. The order of + // packages without usage data is undefined (but they will be sorted after the packages + // that do have usage data). + public static void sortPackagesByUsageDate(List<PackageParser.Package> pkgs, + PackageManagerService packageManagerService) { + if (!packageManagerService.isHistoricalPackageUsageAvailable()) { + return; + } + + Collections.sort(pkgs, (pkg1, pkg2) -> + Long.compare(pkg2.getLatestForegroundPackageUseTimeInMills(), + pkg1.getLatestForegroundPackageUseTimeInMills())); + } + + // Apply the given {@code filter} to all packages in {@code packages}. If tested positive, the + // package will be removed from {@code packages} and added to {@code result} with its + // dependencies. If usage data is available, the positive packages will be sorted by usage + // data (with {@code sortTemp} as temporary storage). + private static void applyPackageFilter(Predicate<PackageParser.Package> filter, + Collection<PackageParser.Package> result, + Collection<PackageParser.Package> packages, + @NonNull List<PackageParser.Package> sortTemp, + PackageManagerService packageManagerService) { + for (PackageParser.Package pkg : packages) { + if (filter.test(pkg)) { + sortTemp.add(pkg); } } - if (DEBUG_DEXOPT) { - Log.i(TAG, "Skipped dexopt " + skipped + " of " + total); + + sortPackagesByUsageDate(sortTemp, packageManagerService); + packages.removeAll(sortTemp); + + for (PackageParser.Package pkg : sortTemp) { + result.add(pkg); + + Collection<PackageParser.Package> deps = + packageManagerService.findSharedNonSystemLibraries(pkg); + if (!deps.isEmpty()) { + deps.removeAll(result); + result.addAll(deps); + packages.removeAll(deps); + } } + + sortTemp.clear(); } // Sort apps by importance for dexopt ordering. Important apps are given @@ -104,46 +118,25 @@ public class PackageManagerServiceUtils { PackageManagerService packageManagerService) { ArrayList<PackageParser.Package> remainingPkgs = new ArrayList<>(packages); LinkedList<PackageParser.Package> result = new LinkedList<>(); + ArrayList<PackageParser.Package> sortTemp = new ArrayList<>(remainingPkgs.size()); // Give priority to core apps. - for (PackageParser.Package pkg : remainingPkgs) { - if (pkg.coreApp) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding core app " + result.size() + ": " + pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + applyPackageFilter((pkg) -> pkg.coreApp, result, remainingPkgs, sortTemp, + packageManagerService); // Give priority to system apps that listen for pre boot complete. Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED); - ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); - for (PackageParser.Package pkg : remainingPkgs) { - if (pkgNames.contains(pkg.packageName)) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding pre boot system app " + result.size() + ": " + - pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM); + applyPackageFilter((pkg) -> pkgNames.contains(pkg.packageName), result, remainingPkgs, + sortTemp, packageManagerService); // Give priority to apps used by other apps. - for (PackageParser.Package pkg : remainingPkgs) { - if (PackageDexOptimizer.isUsedByOtherApps(pkg)) { - if (DEBUG_DEXOPT) { - Log.i(TAG, "Adding app used by other apps " + result.size() + ": " + - pkg.packageName); - } - result.add(pkg); - } - } - remainingPkgs.removeAll(result); + applyPackageFilter((pkg) -> PackageDexOptimizer.isUsedByOtherApps(pkg), result, + remainingPkgs, sortTemp, packageManagerService); // Filter out packages that aren't recently used, add all remaining apps. // TODO: add a property to control this? + Predicate<PackageParser.Package> remainingPredicate; if (!remainingPkgs.isEmpty() && packageManagerService.isHistoricalPackageUsageAvailable()) { if (DEBUG_DEXOPT) { Log.i(TAG, "Looking at historical package use"); @@ -159,34 +152,24 @@ public class PackageManagerServiceUtils { lastUsed.getLatestForegroundPackageUseTimeInMills(); // Be defensive if for some reason package usage has bogus data. if (estimatedPreviousSystemUseTime != 0) { - filterRecentlyUsedApps(remainingPkgs, estimatedPreviousSystemUseTime, - SEVEN_DAYS_IN_MILLISECONDS); + final long cutoffTime = estimatedPreviousSystemUseTime - SEVEN_DAYS_IN_MILLISECONDS; + remainingPredicate = + (pkg) -> pkg.getLatestForegroundPackageUseTimeInMills() >= cutoffTime; + } else { + // No meaningful historical info. Take all. + remainingPredicate = (pkg) -> true; } + sortPackagesByUsageDate(remainingPkgs, packageManagerService); + } else { + // No historical info. Take all. + remainingPredicate = (pkg) -> true; } - result.addAll(remainingPkgs); - - // Now go ahead and also add the libraries required for these packages. - // TODO: Think about interleaving things. - Set<PackageParser.Package> dependencies = new HashSet<>(); - for (PackageParser.Package p : result) { - dependencies.addAll(packageManagerService.findSharedNonSystemLibraries(p)); - } - if (!dependencies.isEmpty()) { - // We might have packages already in `result` that are dependencies - // of other packages. Make sure we don't add those to the list twice. - dependencies.removeAll(result); - } - result.addAll(dependencies); + applyPackageFilter(remainingPredicate, result, remainingPkgs, sortTemp, + packageManagerService); if (DEBUG_DEXOPT) { - StringBuilder sb = new StringBuilder(); - for (PackageParser.Package pkg : result) { - if (sb.length() > 0) { - sb.append(", "); - } - sb.append(pkg.packageName); - } - Log.i(TAG, "Packages to be dexopted: " + sb.toString()); + Log.i(TAG, "Packages to be dexopted: " + packagesToString(result)); + Log.i(TAG, "Packages skipped from dexopt: " + packagesToString(remainingPkgs)); } return result; @@ -203,4 +186,15 @@ public class PackageManagerServiceUtils { throw ee.rethrowAsIOException(); } } + + public static String packagesToString(Collection<PackageParser.Package> c) { + StringBuilder sb = new StringBuilder(); + for (PackageParser.Package pkg : c) { + if (sb.length() > 0) { + sb.append(", "); + } + sb.append(pkg.packageName); + } + return sb.toString(); + } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 5126305dd0d1..b0c536f04652 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4154,6 +4154,14 @@ final class Settings { return pkg.getCurrentEnabledStateLPr(classNameStr, userId); } + boolean wasPackageEverLaunchedLPr(String packageName, int userId) { + final PackageSetting pkgSetting = mPackages.get(packageName); + if (pkgSetting == null) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + return !pkgSetting.getNotLaunched(userId); + } + boolean setPackageStoppedStateLPw(PackageManagerService pm, String packageName, boolean stopped, boolean allowedByPermission, int uid, int userId) { int appId = UserHandle.getAppId(uid); diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 827b88a5b61a..1acc9552c0a1 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -667,6 +667,12 @@ class ShortcutPackage extends ShortcutPackageItem { // - version code hasn't change // - lastUpdateTime hasn't change // - all target activities are still enabled. + + // Note, system apps timestamps do *not* change after OTAs. (But they do + // after an adb sync or a local flash.) + // This means if a system app's version code doesn't change on an OTA, + // we don't notice it's updated. But that's fine since their version code *should* + // really change on OTAs. if ((getPackageInfo().getVersionCode() == pi.versionCode) && (getPackageInfo().getLastUpdateTime() == pi.lastUpdateTime) && areAllActivitiesStillEnabled()) { @@ -1145,6 +1151,17 @@ class ShortcutPackage extends ShortcutPackageItem { } } + /** @return true if there's any shortcuts that are not manifest shortcuts. */ + public boolean hasNonManifestShortcuts() { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + if (!si.isDeclaredInManifest()) { + return true; + } + } + return false; + } + public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { pw.println(); diff --git a/services/core/java/com/android/server/pm/ShortcutPackageItem.java b/services/core/java/com/android/server/pm/ShortcutPackageItem.java index 79b5c4eae1dc..178005840ab1 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageItem.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageItem.java @@ -40,7 +40,7 @@ abstract class ShortcutPackageItem { private final ShortcutPackageInfo mPackageInfo; - protected final ShortcutUser mShortcutUser; + protected ShortcutUser mShortcutUser; protected ShortcutPackageItem(@NonNull ShortcutUser shortcutUser, int packageUserId, @NonNull String packageName, @@ -51,6 +51,13 @@ abstract class ShortcutPackageItem { mPackageInfo = Preconditions.checkNotNull(packageInfo); } + /** + * Change the parent {@link ShortcutUser}. Need it in the restore code. + */ + public void replaceUser(ShortcutUser user) { + mShortcutUser = user; + } + public ShortcutUser getUser() { return mShortcutUser; } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index c1fc7f114c67..2c61f75bd426 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -54,6 +54,7 @@ import android.graphics.RectF; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Binder; +import android.os.Build; import android.os.Environment; import android.os.FileUtils; import android.os.Handler; @@ -324,9 +325,29 @@ public class ShortcutService extends IShortcutService.Stub { int CHECK_LAUNCHER_ACTIVITY = 12; int IS_ACTIVITY_ENABLED = 13; int PACKAGE_UPDATE_CHECK = 14; - - int COUNT = PACKAGE_UPDATE_CHECK + 1; - } + int ASYNC_PRELOAD_USER_DELAY = 15; + + int COUNT = ASYNC_PRELOAD_USER_DELAY + 1; + } + + private static final String[] STAT_LABELS = { + "getHomeActivities()", + "Launcher permission check", + "getPackageInfo()", + "getPackageInfo(SIG)", + "getApplicationInfo", + "cleanupDanglingBitmaps", + "getActivity+metadata", + "getInstalledPackages", + "checkPackageChanges", + "getApplicationResources", + "resourceNameLookup", + "getLauncherActivity", + "checkLauncherActivity", + "isActivityEnabled", + "packageUpdateCheck", + "asyncPreloadUserDelay" + }; final Object mStatLock = new Object(); @@ -359,6 +380,12 @@ public class ShortcutService extends IShortcutService.Stub { @GuardedBy("mLock") private Exception mLastWtfStacktrace; + static class InvalidFileFormatException extends Exception { + public InvalidFileFormatException(String message, Throwable cause) { + super(message, cause); + } + } + public ShortcutService(Context context) { this(context, BackgroundThread.get().getLooper(), /*onyForPackgeManagerApis*/ false); } @@ -533,19 +560,26 @@ public class ShortcutService extends IShortcutService.Stub { /** lifecycle event */ void handleUnlockUser(int userId) { if (DEBUG) { - Slog.d(TAG, "handleUnlockUser: user=" + userId); + Slog.d(TAG, "handleUnlockUser: user=" + userId); } synchronized (mLock) { mUnlockedUsers.put(userId, true); - - // Preload the user's shortcuts. - // Also see if the locale has changed. - // Note as of nyc, the locale is per-user, so the locale shouldn't change - // when the user is locked. However due to b/30119489 it still happens. - getUserShortcutsLocked(userId).detectLocaleChange(); - - checkPackageChanges(userId); } + + // Preload the user data. + // Note, we don't use mHandler here but instead just start a new thread. + // This is because mHandler (which uses com.android.internal.os.BackgroundThread) is very + // busy at this point and this could take hundreds of milliseconds, which would be too + // late since the launcher would already have started. + // So we just create a new thread. This code runs rarely, so we don't use a thread pool + // or anything. + final long start = injectElapsedRealtime(); + injectRunOnNewThread(() -> { + synchronized (mLock) { + logDurationStat(Stats.ASYNC_PRELOAD_USER_DELAY, start); + getUserShortcutsLocked(userId); + } + }); } /** lifecycle event */ @@ -933,7 +967,7 @@ public class ShortcutService extends IShortcutService.Stub { try { final ShortcutUser ret = loadUserInternal(userId, in, /* forBackup= */ false); return ret; - } catch (IOException | XmlPullParserException e) { + } catch (IOException | XmlPullParserException | InvalidFileFormatException e) { Slog.e(TAG, "Failed to read file " + file.getBaseFile(), e); return null; } finally { @@ -942,7 +976,8 @@ public class ShortcutService extends IShortcutService.Stub { } private ShortcutUser loadUserInternal(@UserIdInt int userId, InputStream is, - boolean fromBackup) throws XmlPullParserException, IOException { + boolean fromBackup) throws XmlPullParserException, IOException, + InvalidFileFormatException { final BufferedInputStream bis = new BufferedInputStream(is); @@ -1110,6 +1145,9 @@ public class ShortcutService extends IShortcutService.Stub { userPackages = new ShortcutUser(this, userId); } mUsers.put(userId, userPackages); + + // Also when a user's data is first accessed, scan all packages. + checkPackageChanges(userId); } return userPackages; } @@ -1468,6 +1506,10 @@ public class ShortcutService extends IShortcutService.Stub { mHandler.post(r); } + void injectRunOnNewThread(Runnable r) { + new Thread(r).start(); + } + /** * @throws IllegalArgumentException if {@code numShortcuts} is bigger than * {@link #getMaxActivityShortcuts()}. @@ -2625,10 +2667,14 @@ public class ShortcutService extends IShortcutService.Stub { boolean forceRescan) { final ShortcutUser user = getUserShortcutsLocked(userId); + // Note after each OTA, we'll need to rescan all system apps, as their lastUpdateTime + // is not reliable. final long now = injectCurrentTimeMillis(); + final boolean afterOta = + !injectBuildFingerprint().equals(user.getLastAppScanOsFingerprint()); // Then for each installed app, publish manifest shortcuts when needed. - forUpdatedPackages(userId, lastScanTime, ai -> { + forUpdatedPackages(userId, lastScanTime, afterOta, ai -> { user.attemptToRestoreIfNeededAndSave(this, ai.packageName, userId); user.rescanPackageIfNeeded(ai.packageName, forceRescan); }); @@ -2636,6 +2682,7 @@ public class ShortcutService extends IShortcutService.Stub { // Write the time just before the scan, because there may be apps that have just // been updated, and we want to catch them in the next time. user.setLastAppScanTime(now); + user.setLastAppScanOsFingerprint(injectBuildFingerprint()); scheduleSaveUser(userId); } @@ -2874,7 +2921,7 @@ public class ShortcutService extends IShortcutService.Stub { return parceledList.getList(); } - private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime, + private void forUpdatedPackages(@UserIdInt int userId, long lastScanTime, boolean afterOta, Consumer<ApplicationInfo> callback) { if (DEBUG) { Slog.d(TAG, "forUpdatedPackages for user " + userId + ", lastScanTime=" + lastScanTime); @@ -2886,7 +2933,8 @@ public class ShortcutService extends IShortcutService.Stub { // If the package has been updated since the last scan time, then scan it. // Also if it's a system app with no update, lastUpdateTime is not reliable, so // just scan it. - if (pi.lastUpdateTime >= lastScanTime || isPureSystemApp(pi.applicationInfo)) { + if (pi.lastUpdateTime >= lastScanTime + || (afterOta && isPureSystemApp(pi.applicationInfo))) { if (DEBUG) { Slog.d(TAG, "Found updated package " + pi.packageName); } @@ -3129,15 +3177,16 @@ public class ShortcutService extends IShortcutService.Stub { wtf("Can't restore: user " + userId + " is locked or not running"); return; } - final ShortcutUser user; + // Actually do restore. + final ShortcutUser restored; final ByteArrayInputStream is = new ByteArrayInputStream(payload); try { - user = loadUserInternal(userId, is, /* fromBackup */ true); - } catch (XmlPullParserException | IOException e) { + restored = loadUserInternal(userId, is, /* fromBackup */ true); + } catch (XmlPullParserException | IOException | InvalidFileFormatException e) { Slog.w(TAG, "Restoration failed.", e); return; } - mUsers.put(userId, user); + getUserShortcutsLocked(userId).mergeRestoredFile(restored); // Rescan all packages to re-publish manifest shortcuts and do other checks. rescanUpdatedPackagesLocked(userId, @@ -3218,23 +3267,9 @@ public class ShortcutService extends IShortcutService.Stub { pw.println(" Stats:"); synchronized (mStatLock) { - final String p = " "; - dumpStatLS(pw, p, Stats.GET_DEFAULT_HOME, "getHomeActivities()"); - dumpStatLS(pw, p, Stats.LAUNCHER_PERMISSION_CHECK, "Launcher permission check"); - - dumpStatLS(pw, p, Stats.GET_PACKAGE_INFO, "getPackageInfo()"); - dumpStatLS(pw, p, Stats.GET_PACKAGE_INFO_WITH_SIG, "getPackageInfo(SIG)"); - dumpStatLS(pw, p, Stats.GET_APPLICATION_INFO, "getApplicationInfo"); - dumpStatLS(pw, p, Stats.CLEANUP_DANGLING_BITMAPS, "cleanupDanglingBitmaps"); - dumpStatLS(pw, p, Stats.GET_ACTIVITY_WITH_METADATA, "getActivity+metadata"); - dumpStatLS(pw, p, Stats.GET_INSTALLED_PACKAGES, "getInstalledPackages"); - dumpStatLS(pw, p, Stats.CHECK_PACKAGE_CHANGES, "checkPackageChanges"); - dumpStatLS(pw, p, Stats.GET_APPLICATION_RESOURCES, "getApplicationResources"); - dumpStatLS(pw, p, Stats.RESOURCE_NAME_LOOKUP, "resourceNameLookup"); - dumpStatLS(pw, p, Stats.GET_LAUNCHER_ACTIVITY, "getLauncherActivity"); - dumpStatLS(pw, p, Stats.CHECK_LAUNCHER_ACTIVITY, "checkLauncherActivity"); - dumpStatLS(pw, p, Stats.IS_ACTIVITY_ENABLED, "isActivityEnabled"); - dumpStatLS(pw, p, Stats.PACKAGE_UPDATE_CHECK, "packageUpdateCheck"); + for (int i = 0; i < Stats.COUNT; i++) { + dumpStatLS(pw, " ", i); + } } pw.println(); @@ -3277,12 +3312,12 @@ public class ShortcutService extends IShortcutService.Stub { return tobj.format("%Y-%m-%d %H:%M:%S"); } - private void dumpStatLS(PrintWriter pw, String prefix, int statId, String label) { + private void dumpStatLS(PrintWriter pw, String prefix, int statId) { pw.print(prefix); final int count = mCountStats[statId]; final long dur = mDurationStats[statId]; pw.println(String.format("%s: count=%d, total=%dms, avg=%.1fms", - label, count, dur, + STAT_LABELS[statId], count, dur, (count == 0 ? 0 : ((double) dur) / count))); } @@ -3578,6 +3613,12 @@ public class ShortcutService extends IShortcutService.Stub { Binder.restoreCallingIdentity(token); } + // Injection point. + @VisibleForTesting + String injectBuildFingerprint() { + return Build.FINGERPRINT; + } + final void wtf(String message) { wtf(message, /* exception= */ null); } diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java index ce3ed9c7deef..5d4bfa4dcb3e 100644 --- a/services/core/java/com/android/server/pm/ShortcutUser.java +++ b/services/core/java/com/android/server/pm/ShortcutUser.java @@ -23,12 +23,14 @@ import android.content.pm.ShortcutManager; import android.text.TextUtils; import android.text.format.Formatter; import android.util.ArrayMap; +import android.util.Log; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; +import com.android.server.pm.ShortcutService.InvalidFileFormatException; import libcore.util.Objects; @@ -60,6 +62,7 @@ class ShortcutUser { // Suffix "2" was added to force rescan all packages after the next OTA. private static final String ATTR_LAST_APP_SCAN_TIME = "last-app-scan-time2"; + private static final String ATTR_LAST_APP_SCAN_OS_FINGERPRINT = "last-app-scan-fp"; private static final String KEY_USER_ID = "userId"; private static final String KEY_LAUNCHERS = "launchers"; private static final String KEY_PACKAGES = "packages"; @@ -125,6 +128,8 @@ class ShortcutUser { private long mLastAppScanTime; + private String mLastAppScanOsFingerprint; + public ShortcutUser(ShortcutService service, int userId) { mService = service; mUserId = userId; @@ -142,6 +147,14 @@ class ShortcutUser { mLastAppScanTime = lastAppScanTime; } + public String getLastAppScanOsFingerprint() { + return mLastAppScanOsFingerprint; + } + + public void setLastAppScanOsFingerprint(String lastAppScanOsFingerprint) { + mLastAppScanOsFingerprint = lastAppScanOsFingerprint; + } + // We don't expose this directly to non-test code because only ShortcutUser should add to/ // remove from it. @VisibleForTesting @@ -153,6 +166,11 @@ class ShortcutUser { return mPackages.containsKey(packageName); } + private void addPackage(@NonNull ShortcutPackage p) { + p.replaceUser(this); + mPackages.put(p.getPackageName(), p); + } + public ShortcutPackage removePackage(@NonNull String packageName) { final ShortcutPackage removed = mPackages.remove(packageName); @@ -168,7 +186,8 @@ class ShortcutUser { return mLaunchers; } - public void addLauncher(ShortcutLauncher launcher) { + private void addLauncher(ShortcutLauncher launcher) { + launcher.replaceUser(this); mLaunchers.put(PackageWithUser.of(launcher.getPackageUserId(), launcher.getPackageName()), launcher); } @@ -315,11 +334,16 @@ class ShortcutUser { throws IOException, XmlPullParserException { out.startTag(null, TAG_ROOT); - ShortcutService.writeAttr(out, ATTR_KNOWN_LOCALES, mKnownLocales); - ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_TIME, - mLastAppScanTime); + if (!forBackup) { + // Don't have to back them up. + ShortcutService.writeAttr(out, ATTR_KNOWN_LOCALES, mKnownLocales); + ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_TIME, + mLastAppScanTime); + ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_OS_FINGERPRINT, + mLastAppScanOsFingerprint); - ShortcutService.writeTagValue(out, TAG_LAUNCHER, mLastKnownLauncher); + ShortcutService.writeTagValue(out, TAG_LAUNCHER, mLastKnownLauncher); + } // Can't use forEachPackageItem due to the checked exceptions. { @@ -352,53 +376,59 @@ class ShortcutUser { } public static ShortcutUser loadFromXml(ShortcutService s, XmlPullParser parser, int userId, - boolean fromBackup) throws IOException, XmlPullParserException { + boolean fromBackup) throws IOException, XmlPullParserException, InvalidFileFormatException { final ShortcutUser ret = new ShortcutUser(s, userId); - ret.mKnownLocales = ShortcutService.parseStringAttribute(parser, - ATTR_KNOWN_LOCALES); - - // If lastAppScanTime is in the future, that means the clock went backwards. - // Just scan all apps again. - final long lastAppScanTime = ShortcutService.parseLongAttribute(parser, - ATTR_LAST_APP_SCAN_TIME); - final long currentTime = s.injectCurrentTimeMillis(); - ret.mLastAppScanTime = lastAppScanTime < currentTime ? lastAppScanTime : 0; - - final int outerDepth = parser.getDepth(); - int type; - while ((type = parser.next()) != XmlPullParser.END_DOCUMENT - && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { - if (type != XmlPullParser.START_TAG) { - continue; - } - final int depth = parser.getDepth(); - final String tag = parser.getName(); - - if (depth == outerDepth + 1) { - switch (tag) { - case TAG_LAUNCHER: { - ret.mLastKnownLauncher = ShortcutService.parseComponentNameAttribute( - parser, ATTR_VALUE); - continue; - } - case ShortcutPackage.TAG_ROOT: { - final ShortcutPackage shortcuts = ShortcutPackage.loadFromXml( - s, ret, parser, fromBackup); - - // Don't use addShortcut(), we don't need to save the icon. - ret.mPackages.put(shortcuts.getPackageName(), shortcuts); - continue; - } - - case ShortcutLauncher.TAG_ROOT: { - ret.addLauncher( - ShortcutLauncher.loadFromXml(parser, ret, userId, fromBackup)); - continue; + try { + ret.mKnownLocales = ShortcutService.parseStringAttribute(parser, + ATTR_KNOWN_LOCALES); + + // If lastAppScanTime is in the future, that means the clock went backwards. + // Just scan all apps again. + final long lastAppScanTime = ShortcutService.parseLongAttribute(parser, + ATTR_LAST_APP_SCAN_TIME); + final long currentTime = s.injectCurrentTimeMillis(); + ret.mLastAppScanTime = lastAppScanTime < currentTime ? lastAppScanTime : 0; + ret.mLastAppScanOsFingerprint = ShortcutService.parseStringAttribute(parser, + ATTR_LAST_APP_SCAN_OS_FINGERPRINT); + final int outerDepth = parser.getDepth(); + int type; + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT + && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { + if (type != XmlPullParser.START_TAG) { + continue; + } + final int depth = parser.getDepth(); + final String tag = parser.getName(); + + if (depth == outerDepth + 1) { + switch (tag) { + case TAG_LAUNCHER: { + ret.mLastKnownLauncher = ShortcutService.parseComponentNameAttribute( + parser, ATTR_VALUE); + continue; + } + case ShortcutPackage.TAG_ROOT: { + final ShortcutPackage shortcuts = ShortcutPackage.loadFromXml( + s, ret, parser, fromBackup); + + // Don't use addShortcut(), we don't need to save the icon. + ret.mPackages.put(shortcuts.getPackageName(), shortcuts); + continue; + } + + case ShortcutLauncher.TAG_ROOT: { + ret.addLauncher( + ShortcutLauncher.loadFromXml(parser, ret, userId, fromBackup)); + continue; + } } } + ShortcutService.warnForInvalidTag(depth, tag); } - ShortcutService.warnForInvalidTag(depth, tag); + } catch (RuntimeException e) { + throw new ShortcutService.InvalidFileFormatException( + "Unable to parse file", e); } return ret; } @@ -447,6 +477,51 @@ class ShortcutUser { } } + public void mergeRestoredFile(ShortcutUser restored) { + final ShortcutService s = mService; + // Note, a restore happens only at the end of setup wizard. At this point, no apps are + // installed from Play Store yet, but it's still possible that system apps have already + // published dynamic shortcuts, since some apps do so on BOOT_COMPLETED. + // When such a system app has allowbackup=true, then we go ahead and replace all existing + // shortcuts with the restored shortcuts. (Then we'll re-publish manifest shortcuts later + // in the call site.) + // When such a system app has allowbackup=false, then we'll keep the shortcuts that have + // already been published. So we selectively add restored ShortcutPackages here. + // + // The same logic applies to launchers, but since launchers shouldn't pin shortcuts + // without users interaction it's really not a big deal, so we just clear existing + // ShortcutLauncher instances in mLaunchers and add all the restored ones here. + + mLaunchers.clear(); + restored.forAllLaunchers(sl -> { + // If the app is already installed and allowbackup = false, then ignore the restored + // data. + if (s.isPackageInstalled(sl.getPackageName(), getUserId()) + && !s.shouldBackupApp(sl.getPackageName(), getUserId())) { + return; + } + addLauncher(sl); + }); + restored.forAllPackages(sp -> { + // If the app is already installed and allowbackup = false, then ignore the restored + // data. + if (s.isPackageInstalled(sp.getPackageName(), getUserId()) + && !s.shouldBackupApp(sp.getPackageName(), getUserId())) { + return; + } + + final ShortcutPackage previous = getPackageShortcutsIfExists(sp.getPackageName()); + if (previous != null && previous.hasNonManifestShortcuts()) { + Log.w(TAG, "Shortcuts for package " + sp.getPackageName() + " are being restored." + + " Existing non-manifeset shortcuts will be overwritten."); + } + addPackage(sp); + }); + // Empty the launchers and packages in restored to avoid accidentally using them. + restored.mLaunchers.clear(); + restored.mPackages.clear(); + } + public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { pw.print(prefix); pw.print("User: "); @@ -457,6 +532,8 @@ class ShortcutUser { pw.print(mLastAppScanTime); pw.print("] "); pw.print(ShortcutService.formatTime(mLastAppScanTime)); + pw.print(" Last app scan FP: "); + pw.print(mLastAppScanOsFingerprint); pw.println(); prefix += prefix + " "; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index c9ad49a565c1..af055da2b9e6 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -180,7 +180,8 @@ public class UserManagerService extends IUserManager.Stub { UserInfo.FLAG_MANAGED_PROFILE | UserInfo.FLAG_EPHEMERAL | UserInfo.FLAG_RESTRICTED - | UserInfo.FLAG_GUEST; + | UserInfo.FLAG_GUEST + | UserInfo.FLAG_DEMO; private static final int MIN_USER_ID = 10; // We need to keep process uid within Integer.MAX_VALUE. diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a39add80ba8f..ccf9b898d7b2 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -301,6 +301,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** Amount of time (in milliseconds) to wait for windows drawn before powering on. */ static final int WAITING_FOR_DRAWN_TIMEOUT = 1000; + /** Amount of time (in milliseconds) a toast window can be shown. */ + public static final int TOAST_WINDOW_TIMEOUT = 3500; // 3.5 seconds + /** * Lock protecting internal state. Must not call out into window * manager with lock held. (This lock will be acquired in places @@ -2229,9 +2232,22 @@ public class PhoneWindowManager implements WindowManagerPolicy { attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; } break; + case TYPE_SCREENSHOT: attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; break; + + case TYPE_TOAST: + // While apps should use the dedicated toast APIs to add such windows + // it possible legacy apps to add the window directly. Therefore, we + // make windows added directly by the app behave as a toast as much + // as possible in terms of timeout and animation. + if (attrs.hideTimeoutMilliseconds < 0 + || attrs.hideTimeoutMilliseconds > TOAST_WINDOW_TIMEOUT) { + attrs.hideTimeoutMilliseconds = TOAST_WINDOW_TIMEOUT; + } + attrs.windowAnimations = com.android.internal.R.style.Animation_Toast; + break; } if (attrs.type != TYPE_STATUS_BAR) { @@ -2805,7 +2821,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mNavigationBarPosition == NAV_BAR_BOTTOM) { if (transit == TRANSIT_EXIT || transit == TRANSIT_HIDE) { - return R.anim.dock_bottom_exit; + if (isKeyguardShowingAndNotOccluded()) { + return R.anim.dock_bottom_exit_keyguard; + } else { + return R.anim.dock_bottom_exit; + } } else if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { return R.anim.dock_bottom_enter; @@ -5318,15 +5338,18 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean showing = mKeyguardDelegate.isShowing(); if (wasOccluded && !isOccluded && showing) { mKeyguardOccluded = false; - mKeyguardDelegate.setOccluded(false); + mKeyguardDelegate.setOccluded(false, true /* animate */); mStatusBar.getAttrs().privateFlags |= PRIVATE_FLAG_KEYGUARD; if (!mKeyguardDelegate.hasLockscreenWallpaper()) { mStatusBar.getAttrs().flags |= FLAG_SHOW_WALLPAPER; } + Animation anim = AnimationUtils.loadAnimation(mContext, + com.android.internal.R.anim.wallpaper_open_exit); + mWindowManagerFuncs.overridePlayingAppAnimationsLw(anim); return true; } else if (!wasOccluded && isOccluded && showing) { mKeyguardOccluded = true; - mKeyguardDelegate.setOccluded(true); + mKeyguardDelegate.setOccluded(true, false /* animate */); mStatusBar.getAttrs().privateFlags &= ~PRIVATE_FLAG_KEYGUARD; mStatusBar.getAttrs().flags &= ~FLAG_SHOW_WALLPAPER; return true; @@ -5511,7 +5534,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void onServiceDisconnected(ComponentName name) { - notifyScreenshotError(); + synchronized (mScreenshotLock) { + if (mScreenshotConnection != null) { + mContext.unbindService(mScreenshotConnection); + mScreenshotConnection = null; + mHandler.removeCallbacks(mScreenshotTimeout); + notifyScreenshotError(); + } + } } }; if (mContext.bindServiceAsUser(serviceIntent, conn, @@ -7748,7 +7778,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { int delta = newRotation - oldRotation; if (delta < 0) delta += 4; // Likewise we don't rotate seamlessly for 180 degree rotations - // in this case the surfaces never resize, and our logic to + // in this case the surfaces never resize, and our logic to // revert the transformations on size change will fail. We could // fix this in the future with the "tagged" frames idea. if (delta == Surface.ROTATION_180) { diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 4fce49e16815..2af4c9b23201 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -180,7 +180,7 @@ public class KeyguardServiceDelegate { mKeyguardService.onBootCompleted(); } if (mKeyguardState.occluded) { - mKeyguardService.setOccluded(mKeyguardState.occluded); + mKeyguardService.setOccluded(mKeyguardState.occluded, false /* animate */); } } @@ -232,10 +232,10 @@ public class KeyguardServiceDelegate { } } - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { if (mKeyguardService != null) { - if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ")"); - mKeyguardService.setOccluded(isOccluded); + if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ") animate=" + animate); + mKeyguardService.setOccluded(isOccluded, animate); } mKeyguardState.occluded = isOccluded; } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 55652fe3a4e4..2169927d89ee 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -63,9 +63,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { } @Override // Binder interface - public void setOccluded(boolean isOccluded) { + public void setOccluded(boolean isOccluded, boolean animate) { try { - mService.setOccluded(isOccluded); + mService.setOccluded(isOccluded, animate); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 2824e6e66ffa..570b93c09c9a 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -2538,18 +2538,18 @@ public final class PowerManagerService extends SystemService boolean setDeviceIdleModeInternal(boolean enabled) { synchronized (mLock) { - if (mDeviceIdleMode != enabled) { - mDeviceIdleMode = enabled; - updateWakeLockDisabledStatesLocked(); - if (enabled) { - EventLogTags.writeDeviceIdleOnPhase("power"); - } else { - EventLogTags.writeDeviceIdleOffPhase("power"); - } - return true; + if (mDeviceIdleMode == enabled) { + return false; } - return false; + mDeviceIdleMode = enabled; + updateWakeLockDisabledStatesLocked(); + } + if (enabled) { + EventLogTags.writeDeviceIdleOnPhase("power"); + } else { + EventLogTags.writeDeviceIdleOffPhase("power"); } + return true; } boolean setLightDeviceIdleModeInternal(boolean enabled) { diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java index 0ae171768199..90c711a47941 100644 --- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java +++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java @@ -87,6 +87,11 @@ public class DeviceStorageMonitorService extends SystemService { private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB private static final long DEFAULT_CHECK_INTERVAL = MONITOR_INTERVAL*60*1000; + // com.android.internal.R.string.low_internal_storage_view_text_no_boot + // hard codes 250MB in the message as the storage space required for the + // boot image. + private static final long BOOT_IMAGE_STORAGE_REQUIREMENT = 250 * 1024 * 1024; + private long mFreeMem; // on /data private long mFreeMemAfterLastCacheClear; // on /data private long mLastReportedFreeMem; @@ -290,9 +295,10 @@ public class DeviceStorageMonitorService extends SystemService { mLowMemFlag = false; } } - if (!mLowMemFlag && !mIsBootImageOnDisk) { + if (!mLowMemFlag && !mIsBootImageOnDisk && mFreeMem < BOOT_IMAGE_STORAGE_REQUIREMENT) { Slog.i(TAG, "No boot image on disk due to lack of space. Sending notification"); sendNotification(); + mLowMemFlag = true; } if (mFreeMem < mMemFullThreshold) { if (!mMemFullFlag) { @@ -383,7 +389,7 @@ public class DeviceStorageMonitorService extends SystemService { @Override public boolean isMemoryLow() { - return mLowMemFlag || !mIsBootImageOnDisk; + return mLowMemFlag; } @Override diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index d9c42541f9f4..a7b9cf44bae6 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -102,9 +102,8 @@ public class TrustManagerService extends SystemService { private static final int MSG_START_USER = 7; private static final int MSG_CLEANUP_USER = 8; private static final int MSG_SWITCH_USER = 9; - private static final int MSG_SET_DEVICE_LOCKED = 10; - private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 11; - private static final int MSG_UNLOCK_USER = 12; + private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 10; + private static final int MSG_UNLOCK_USER = 11; private static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000; @@ -317,20 +316,6 @@ public class TrustManagerService extends SystemService { } } - public void setDeviceLockedForUser(int userId, boolean locked) { - if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) { - synchronized (mDeviceLockedForUser) { - mDeviceLockedForUser.put(userId, locked); - } - if (locked) { - try { - ActivityManagerNative.getDefault().notifyLockedProfile(userId); - } catch (RemoteException e) { - } - } - } - } - boolean isDeviceLockedInner(int userId) { synchronized (mDeviceLockedForUser) { return mDeviceLockedForUser.get(userId, true); @@ -838,10 +823,24 @@ public class TrustManagerService extends SystemService { } @Override - public void setDeviceLockedForUser(int userId, boolean value) { + public void setDeviceLockedForUser(int userId, boolean locked) { enforceReportPermission(); - mHandler.obtainMessage(MSG_SET_DEVICE_LOCKED, value ? 1 : 0, userId) - .sendToTarget(); + final long identity = Binder.clearCallingIdentity(); + try { + if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) { + synchronized (mDeviceLockedForUser) { + mDeviceLockedForUser.put(userId, locked); + } + if (locked) { + try { + ActivityManagerNative.getDefault().notifyLockedProfile(userId); + } catch (RemoteException e) { + } + } + } + } finally { + Binder.restoreCallingIdentity(identity); + } } @Override @@ -917,9 +916,6 @@ public class TrustManagerService extends SystemService { mCurrentUser = msg.arg1; refreshDeviceLockedForUser(UserHandle.USER_ALL); break; - case MSG_SET_DEVICE_LOCKED: - setDeviceLockedForUser(msg.arg2, msg.arg1 != 0); - break; case MSG_FLUSH_TRUST_USUALLY_MANAGED: SparseBooleanArray usuallyManaged; synchronized (mTrustUsuallyManagedForUser) { diff --git a/services/core/java/com/android/server/twilight/TwilightService.java b/services/core/java/com/android/server/twilight/TwilightService.java index acd65875ffac..db7df25da3de 100644 --- a/services/core/java/com/android/server/twilight/TwilightService.java +++ b/services/core/java/com/android/server/twilight/TwilightService.java @@ -151,7 +151,7 @@ public final class TwilightService extends SystemService } private void startListening() { - if (DEBUG) Slog.d(TAG, "startListening"); + Slog.d(TAG, "startListening"); // Start listening for location updates (default: low power, max 1h, min 10m). mLocationManager.requestLocationUpdates( @@ -173,7 +173,7 @@ public final class TwilightService extends SystemService mTimeChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (DEBUG) Slog.d(TAG, "onReceive: " + intent); + Slog.d(TAG, "onReceive: " + intent); updateTwilightState(); } }; @@ -188,7 +188,7 @@ public final class TwilightService extends SystemService } private void stopListening() { - if (DEBUG) Slog.d(TAG, "stopListening"); + Slog.d(TAG, "stopListening"); if (mTimeChangedReceiver != null) { getContext().unregisterReceiver(mTimeChangedReceiver); @@ -241,15 +241,20 @@ public final class TwilightService extends SystemService @Override public void onAlarm() { - if (DEBUG) Slog.d(TAG, "onAlarm"); + Slog.d(TAG, "onAlarm"); updateTwilightState(); } @Override public void onLocationChanged(Location location) { - if (DEBUG) Slog.d(TAG, "onLocationChanged: " + location); - mLastLocation = location; - updateTwilightState(); + if (location != null) { + Slog.d(TAG, "onLocationChanged:" + + " provider=" + location.getProvider() + + " accuracy=" + location.getAccuracy() + + " time=" + location.getTime()); + mLastLocation = location; + updateTwilightState(); + } } @Override diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index d4d6f3225edd..e4ec295fa34e 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -382,7 +382,7 @@ public class AppTransition implements Dump { topOpeningAppAnimator != null ? topOpeningAppAnimator.animation : null, topClosingAppAnimator != null ? topClosingAppAnimator.animation : null); mService.getDefaultDisplayContentLocked().getDockedDividerController() - .notifyAppTransitionStarting(); + .notifyAppTransitionStarting(openingApps); // Prolong the start for the transition when docking a task from recents, unless recents // ended it already then we don't need to wait. diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 621e43a12d48..a8a0b0efb784 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -30,6 +30,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerService.WINDOW_REPLACEMENT_TIMEOUT_DURATION; import static com.android.server.wm.WindowManagerService.H.NOTIFY_ACTIVITY_DRAWN; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; import com.android.server.input.InputApplicationHandle; import com.android.server.wm.WindowManagerService.H; @@ -44,6 +45,7 @@ import android.util.Slog; import android.view.IApplicationToken; import android.view.View; import android.view.WindowManager; +import android.view.animation.Animation; import java.io.PrintWriter; import java.util.ArrayDeque; @@ -838,6 +840,18 @@ class AppWindowToken extends WindowToken { } } + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + if (mAppAnimator.isAnimating()) { + final WindowState win = findMainWindow(); + final int width = win.mContainingFrame.width(); + final int height = win.mContainingFrame.height(); + mAppAnimator.setAnimation(a, width, height, false, STACK_CLIP_NONE); + } + } + @Override void dump(PrintWriter pw, String prefix) { super.dump(pw, prefix); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1d57872b2fbc..b90b864318f0 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -22,19 +22,25 @@ import static android.app.ActivityManager.StackId.PINNED_STACK_ID; 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.TYPE_TOAST; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP; import android.app.ActivityManager.StackId; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Region.Op; +import android.os.Build; +import android.os.UserHandle; import android.util.DisplayMetrics; import android.util.Slog; import android.view.Display; import android.view.DisplayInfo; import android.view.Surface; +import android.view.animation.Animation; import java.io.PrintWriter; import java.util.ArrayList; @@ -637,7 +643,7 @@ class DisplayContent { */ TaskStack getDockedStackVisibleForUserLocked() { final TaskStack stack = mService.mStackIdToStack.get(DOCKED_STACK_ID); - return (stack != null && stack.isVisibleForUserLocked()) ? stack : null; + return (stack != null && stack.isVisibleLocked(true /* ignoreKeyguard */)) ? stack : null; } /** @@ -674,4 +680,48 @@ class DisplayContent { return touchedWin; } + + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw}. + */ + void overridePlayingAppAnimationsLw(Animation a) { + for (int i = mStacks.size() - 1; i >= 0; i--) { + mStacks.get(i).overridePlayingAppAnimations(a); + } + } + + boolean canAddToastWindowForUid(int uid) { + // We allow one toast window per UID being shown at a time. + WindowList windows = getWindowList(); + final int windowCount = windows.size(); + for (int i = 0; i < windowCount; i++) { + WindowState window = windows.get(i); + if (window.mAttrs.type == TYPE_TOAST && window.mOwnerUid == uid + && !window.mPermanentlyHidden && !window.mAnimatingExit) { + return false; + } + } + return true; + } + + void scheduleToastWindowsTimeoutIfNeededLocked(WindowState oldFocus, + WindowState newFocus) { + if (oldFocus == null || (newFocus != null && newFocus.mOwnerUid == oldFocus.mOwnerUid)) { + return; + } + final int lostFocusUid = oldFocus.mOwnerUid; + WindowList windows = getWindowList(); + final int windowCount = windows.size(); + for (int i = 0; i < windowCount; i++) { + WindowState window = windows.get(i); + if (window.mAttrs.type == TYPE_TOAST && window.mOwnerUid == lostFocusUid) { + if (!mService.mH.hasMessages(WindowManagerService.H.WINDOW_HIDE_TIMEOUT, window)) { + mService.mH.sendMessageDelayed( + mService.mH.obtainMessage( + WindowManagerService.H.WINDOW_HIDE_TIMEOUT, window), + window.mAttrs.hideTimeoutMilliseconds); + } + } + } + } } diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index f93e2ffa73be..f8d2ee931d04 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -38,6 +38,7 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.util.ArraySet; import android.util.Slog; import android.view.DisplayInfo; import android.view.IDockedStackListener; @@ -492,8 +493,31 @@ public class DockedStackDividerController implements DimLayerUser { checkMinimizeChanged(false /* animate */); } - void notifyAppTransitionStarting() { + void notifyAppTransitionStarting(ArraySet<AppWindowToken> openingApps) { + final boolean wasMinimized = mMinimizedDock; checkMinimizeChanged(true /* animate */); + + // We were minimized, and now we are still minimized, but somebody is trying to launch an + // app in docked stack, better show recent apps so we actually get unminimized! This catches + // any case that was missed in ActivityStarter.postStartActivityUncheckedProcessing because + // we couldn't retrace the launch of the app in the docked stack to the launch from + // homescreen. + if (wasMinimized && mMinimizedDock && containsAppInDockedStack(openingApps)) { + mService.showRecentApps(true /* fromHome */); + } + } + + /** + * @return true if {@param apps} contains an activity in the docked stack, false otherwise. + */ + private boolean containsAppInDockedStack(ArraySet<AppWindowToken> apps) { + for (int i = apps.size() - 1; i >= 0; i--) { + final AppWindowToken token = apps.valueAt(i); + if (token.mTask != null && token.mTask.mStack.mStackId == DOCKED_STACK_ID) { + return true; + } + } + return false; } boolean isMinimizedDock() { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 1dcada6729fc..ca1830106fb5 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -38,6 +38,7 @@ import android.util.EventLog; import android.util.Slog; import android.view.DisplayInfo; import android.view.Surface; +import android.view.animation.Animation; import com.android.server.EventLogTags; @@ -677,19 +678,6 @@ class Task implements DimLayer.DimLayerUser { return (tokensCount != 0) && mAppTokens.get(tokensCount - 1).showForAllUsers; } - boolean isVisibleForUser() { - for (int i = mAppTokens.size() - 1; i >= 0; i--) { - final AppWindowToken appToken = mAppTokens.get(i); - for (int j = appToken.allAppWindows.size() - 1; j >= 0; j--) { - WindowState window = appToken.allAppWindows.get(j); - if (!window.isHiddenFromUserLocked()) { - return true; - } - } - } - return false; - } - boolean isVisible() { for (int i = mAppTokens.size() - 1; i >= 0; i--) { final AppWindowToken appToken = mAppTokens.get(i); @@ -778,6 +766,15 @@ class Task implements DimLayer.DimLayerUser { return mStack.getDisplayContent().getDisplayInfo(); } + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + for (int i = mAppTokens.size() - 1; i >= 0; i--) { + mAppTokens.get(i).overridePlayingAppAnimations(a); + } + } + @Override public String toString() { return "{taskId=" + mTaskId + " appTokens=" + mAppTokens + " mdr=" + mDeferRemoval + "}"; diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 8be5b19d1530..8f8f6422091c 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -44,6 +44,7 @@ import android.util.SparseArray; import android.view.DisplayInfo; import android.view.Surface; import android.view.SurfaceControl; +import android.view.animation.Animation; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; @@ -398,23 +399,21 @@ public class TaskStack implements DimLayer.DimLayerUser, return false; } - final int oldDockSide = mStackId == DOCKED_STACK_ID ? getDockSide() : DOCKED_INVALID; mTmpRect2.set(mBounds); mDisplayContent.rotateBounds(mRotation, newRotation, mTmpRect2); if (mStackId == DOCKED_STACK_ID) { repositionDockedStackAfterRotation(mTmpRect2); snapDockedStackAfterRotation(mTmpRect2); final int newDockSide = getDockSide(mTmpRect2); - if (oldDockSide != newDockSide) { - // Update the dock create mode and clear the dock create bounds, these - // might change after a rotation and the original values will be invalid. - mService.setDockedStackCreateStateLocked( - (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP) - ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT - : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT, - null); - mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide); - } + + // Update the dock create mode and clear the dock create bounds, these + // might change after a rotation and the original values will be invalid. + mService.setDockedStackCreateStateLocked( + (newDockSide == DOCKED_LEFT || newDockSide == DOCKED_TOP) + ? DOCKED_STACK_CREATE_MODE_TOP_OR_LEFT + : DOCKED_STACK_CREATE_MODE_BOTTOM_OR_RIGHT, + null); + mDisplayContent.getDockedDividerController().notifyDockSideChanged(newDockSide); } mBoundsAfterRotation.set(mTmpRect2); @@ -890,7 +889,7 @@ public class TaskStack implements DimLayer.DimLayerUser, mAdjustImeAmount = adjustAmount; mAdjustDividerAmount = adjustDividerAmount; updateAdjustedBounds(); - return isVisibleForUserLocked(); + return isVisibleLocked(true /* ignoreKeyguard */); } else { return false; } @@ -926,7 +925,7 @@ public class TaskStack implements DimLayer.DimLayerUser, if (minimizeAmount != mMinimizeAmount) { mMinimizeAmount = minimizeAmount; updateAdjustedBounds(); - return isVisibleForUserLocked(); + return isVisibleLocked(true /* ignoreKeyguard*/); } else { return false; } @@ -943,7 +942,7 @@ public class TaskStack implements DimLayer.DimLayerUser, void beginImeAdjustAnimation() { for (int j = mTasks.size() - 1; j >= 0; j--) { final Task task = mTasks.get(j); - if (task.isVisibleForUser()) { + if (task.isVisible()) { task.setDragResizing(true, DRAG_RESIZE_MODE_DOCKED_DIVIDER); task.addWindowsWaitingForDrawnIfResizingChanged(); } @@ -1233,9 +1232,13 @@ public class TaskStack implements DimLayer.DimLayerUser, } boolean isVisibleLocked() { + return isVisibleLocked(false /* ignoreKeyguard */); + } + + boolean isVisibleLocked(boolean ignoreKeyguard) { final boolean keyguardOn = mService.mPolicy.isKeyguardShowingOrOccluded() && !mService.mAnimator.mKeyguardGoingAway; - if (keyguardOn && !StackId.isAllowedOverLockscreen(mStackId)) { + if (!ignoreKeyguard && keyguardOn && !StackId.isAllowedOverLockscreen(mStackId)) { // The keyguard is showing and the stack shouldn't show on top of the keyguard. return false; } @@ -1252,20 +1255,6 @@ public class TaskStack implements DimLayer.DimLayerUser, return false; } - /** - * @return true if a the stack is visible for the current in user, ignoring any other visibility - * aspects, and false otherwise - */ - boolean isVisibleForUserLocked() { - for (int i = mTasks.size() - 1; i >= 0; i--) { - final Task task = mTasks.get(i); - if (task.isVisibleForUser()) { - return true; - } - } - return false; - } - boolean isDragResizing() { return mDragResizing; } @@ -1379,4 +1368,13 @@ public class TaskStack implements DimLayer.DimLayerUser, public boolean getBoundsAnimating() { return mBoundsAnimating; } + + /** + * See {@link WindowManagerService#overridePlayingAppAnimationsLw} + */ + void overridePlayingAppAnimations(Animation a) { + for (int i = mTasks.size() - 1; i >= 0; --i) { + mTasks.get(i).overridePlayingAppAnimations(a); + } + } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index 2b66c3af2beb..e7ceba90bde3 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -757,14 +757,16 @@ class WallpaperController { } // Now stick it in. For apps over wallpaper keep the wallpaper at the bottommost - // layer. For keyguard over wallpaper put the wallpaper under the keyguard. + // layer. For keyguard over wallpaper put the wallpaper under the lowest window that + // is currently on screen, i.e. not hidden by policy. int insertionIndex = 0; if (visible && wallpaperTarget != null) { final int type = wallpaperTarget.mAttrs.type; final int privateFlags = wallpaperTarget.mAttrs.privateFlags; if ((privateFlags & PRIVATE_FLAG_KEYGUARD) != 0 || type == TYPE_KEYGUARD_SCRIM) { - insertionIndex = windows.indexOf(wallpaperTarget); + insertionIndex = Math.min(windows.indexOf(wallpaperTarget), + findLowestWindowOnScreen(windows)); } } if (DEBUG_WALLPAPER_LIGHT || DEBUG_WINDOW_MOVEMENT @@ -781,6 +783,21 @@ class WallpaperController { return changed; } + /** + * @return The index in {@param windows} of the lowest window that is currently on screen and + * not hidden by the policy. + */ + private int findLowestWindowOnScreen(WindowList windows) { + final int size = windows.size(); + for (int index = 0; index < size; index++) { + final WindowState win = windows.get(index); + if (win.isOnScreen()) { + return index; + } + } + return Integer.MAX_VALUE; + } + boolean adjustWallpaperWindows() { mService.mWindowPlacerLocked.mWallpaperMayChange = false; diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index b0d357c6320c..1ee5a22195ef 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -121,6 +121,9 @@ public class WindowAnimator { private final AppTokenList mTmpExitingAppTokens = new AppTokenList(); + /** The window that was previously hiding the Keyguard. */ + private WindowState mLastShowWinWhenLocked; + private String forceHidingToString() { switch (mForceHiding) { case KEYGUARD_NOT_SHOWN: return "KEYGUARD_NOT_SHOWN"; @@ -221,13 +224,30 @@ public class WindowAnimator { } } + /** + * @return The window that is currently hiding the Keyguard, or if it was hiding the Keyguard, + * and it's still animating. + */ + private WindowState getWinShowWhenLockedOrAnimating() { + final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); + if (winShowWhenLocked != null) { + return winShowWhenLocked; + } + if (mLastShowWinWhenLocked != null && mLastShowWinWhenLocked.isOnScreen() + && mLastShowWinWhenLocked.isAnimatingLw() + && (mLastShowWinWhenLocked.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) { + return mLastShowWinWhenLocked; + } + return null; + } + private boolean shouldForceHide(WindowState win) { final WindowState imeTarget = mService.mInputMethodTarget; final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleNow() && ((imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0 || !mPolicy.canBeForceHidden(imeTarget, imeTarget.mAttrs)); - final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); + final WindowState winShowWhenLocked = getWinShowWhenLockedOrAnimating(); final AppWindowToken appShowWhenLocked = winShowWhenLocked == null ? null : winShowWhenLocked.mAppToken; @@ -241,7 +261,7 @@ public class WindowAnimator { allowWhenLocked |= appShowWhenLocked == win.mAppToken // Show all SHOW_WHEN_LOCKED windows if some apps are shown over lockscreen || (win.mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0 - // Show error dialogs over apps that dismiss keyguard. + // Show error dialogs over apps that are shown on lockscreen || (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0; } @@ -555,6 +575,11 @@ public class WindowAnimator { mPostKeyguardExitAnimation = null; } } + + final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); + if (winShowWhenLocked != null) { + mLastShowWinWhenLocked = winShowWhenLocked; + } } private void updateWallpaperLocked(int displayId) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index eb9ad6caee8c..707b13780c46 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -21,6 +21,7 @@ import android.animation.ValueAnimator; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; import android.app.AppOpsManager; @@ -35,6 +36,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; @@ -201,6 +203,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR; import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION; import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; +import static android.view.WindowManager.LayoutParams.TYPE_TOAST; import static android.view.WindowManager.LayoutParams.TYPE_VOICE_INTERACTION; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import static android.view.WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY; @@ -249,6 +252,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_KEEP_SCREEN_ON; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowStateAnimator.DRAW_PENDING; +import static com.android.server.wm.WindowStateAnimator.STACK_CLIP_NONE; /** {@hide} */ public class WindowManagerService extends IWindowManager.Stub @@ -1868,6 +1872,7 @@ public class WindowManagerService extends IWindowManager.Stub boolean reportNewConfig = false; WindowState attachedWindow = null; long origId; + final int callingUid = Binder.getCallingUid(); final int type = attrs.type; synchronized(mWindowMap) { @@ -1915,6 +1920,8 @@ public class WindowManagerService extends IWindowManager.Stub boolean addToken = false; WindowToken token = mTokenMap.get(attrs.token); AppWindowToken atoken = null; + boolean addToastWindowRequiresToken = false; + if (token == null) { if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { Slog.w(TAG_WM, "Attempted to add application window with unknown token " @@ -1951,6 +1958,15 @@ public class WindowManagerService extends IWindowManager.Stub + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } + if (type == TYPE_TOAST) { + // Apps targeting SDK above N MR1 cannot arbitrary add toast windows. + if (doesAddToastWindowRequireToken(attrs.packageName, callingUid, + attachedWindow)) { + Slog.w(TAG_WM, "Attempted to add a toast window with unknown token " + + attrs.token + ". Aborting."); + return WindowManagerGlobal.ADD_BAD_APP_TOKEN; + } + } token = new WindowToken(this, attrs.token, -1, false); addToken = true; } else if (type >= FIRST_APPLICATION_WINDOW && type <= LAST_APPLICATION_WINDOW) { @@ -2000,6 +2016,15 @@ public class WindowManagerService extends IWindowManager.Stub + attrs.token + ". Aborting."); return WindowManagerGlobal.ADD_BAD_APP_TOKEN; } + } else if (type == TYPE_TOAST) { + // Apps targeting SDK above N MR1 cannot arbitrary add toast windows. + addToastWindowRequiresToken = doesAddToastWindowRequireToken(attrs.packageName, + callingUid, attachedWindow); + if (addToastWindowRequiresToken && token.windowType != TYPE_TOAST) { + Slog.w(TAG_WM, "Attempted to add a toast window with bad token " + + attrs.token + ". Aborting."); + return WindowManagerGlobal.ADD_BAD_APP_TOKEN; + } } else if (type == TYPE_QS_DIALOG) { if (token.windowType != TYPE_QS_DIALOG) { Slog.w(TAG_WM, "Attempted to add QS dialog window with bad token " @@ -2044,6 +2069,36 @@ public class WindowManagerService extends IWindowManager.Stub win.openInputChannel(outInputChannel); } + // If adding a toast requires a token for this app we always schedule hiding + // toast windows to make sure they don't stick around longer then necessary. + // We hide instead of remove such windows as apps aren't prepared to handle + // windows being removed under them. + // + // If the app is older it can add toasts without a token and hence overlay + // other apps. To be maximally compatible with these apps we will hide the + // window after the toast timeout only if the focused window is from another + // UID, otherwise we allow unlimited duration. When a UID looses focus we + // schedule hiding all of its toast windows. + if (type == TYPE_TOAST) { + if (!getDefaultDisplayContentLocked().canAddToastWindowForUid(callingUid)) { + Slog.w(TAG_WM, "Adding more than one toast window for UID at a time."); + return WindowManagerGlobal.ADD_DUPLICATE_ADD; + } + // Make sure this happens before we moved focus as one can make the + // toast focusable to force it not being hidden after the timeout. + // Focusable toasts are always timed out to prevent a focused app to + // show a focusable toasts while it has focus which will be kept on + // the screen after the activity goes away. + if (addToastWindowRequiresToken + || (attrs.flags & LayoutParams.FLAG_NOT_FOCUSABLE) == 0 + || mCurrentFocus == null + || mCurrentFocus.mOwnerUid != callingUid) { + mH.sendMessageDelayed( + mH.obtainMessage(H.WINDOW_HIDE_TIMEOUT, win), + win.mAttrs.hideTimeoutMilliseconds); + } + } + // From now on, no exceptions or errors allowed! res = WindowManagerGlobal.ADD_OKAY; @@ -2182,11 +2237,6 @@ public class WindowManagerService extends IWindowManager.Stub if (win.isVisibleOrAdding() && updateOrientationFromAppTokensLocked(false)) { reportNewConfig = true; } - if (attrs.removeTimeoutMilliseconds > 0) { - mH.sendMessageDelayed( - mH.obtainMessage(H.WINDOW_REMOVE_TIMEOUT, win), - attrs.removeTimeoutMilliseconds); - } } if (reportNewConfig) { @@ -2198,6 +2248,32 @@ public class WindowManagerService extends IWindowManager.Stub return res; } + private boolean doesAddToastWindowRequireToken(String packageName, int callingUid, + WindowState attachedWindow) { + // Try using the target SDK of the root window + if (attachedWindow != null) { + return attachedWindow.mAppToken != null + && attachedWindow.mAppToken.targetSdk > Build.VERSION_CODES.N_MR1; + } else { + // Otherwise, look at the package + try { + ApplicationInfo appInfo = mContext.getPackageManager() + .getApplicationInfoAsUser(packageName, 0, + UserHandle.getUserId(callingUid)); + if (appInfo.uid != callingUid) { + throw new SecurityException("Package " + packageName + " not in UID " + + callingUid); + } + if (appInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1) { + return true; + } + } catch (PackageManager.NameNotFoundException e) { + /* ignore */ + } + } + return false; + } + /** * Returns true if we're done setting up any transitions. */ @@ -2908,12 +2984,11 @@ public class WindowManagerService extends IWindowManager.Stub } result |= RELAYOUT_RES_SURFACE_CHANGED; } - final WindowSurfaceController surfaceController = winAnimator.mSurfaceController; - if (viewVisibility == View.VISIBLE && surfaceController != null) { + if (viewVisibility == View.VISIBLE && winAnimator.hasSurface()) { // We already told the client to go invisible, but the message may not be // handled yet, or it might want to draw a last frame. If we already have a // surface, let the client use that, but don't create new surface at this point. - surfaceController.getSurface(outSurface); + winAnimator.mSurfaceController.getSurface(outSurface); } else { if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Releasing surface in: " + win); @@ -5212,6 +5287,11 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public void overridePlayingAppAnimationsLw(Animation a) { + getDefaultDisplayContentLocked().overridePlayingAppAnimationsLw(a); + } + /** * Re-sizes a stack and its containing tasks. * @param stackId Id of stack to resize. @@ -8160,7 +8240,7 @@ public class WindowManagerService extends IWindowManager.Stub public static final int NOTIFY_APP_TRANSITION_FINISHED = 49; public static final int NOTIFY_STARTING_WINDOW_DRAWN = 50; public static final int UPDATE_ANIMATION_SCALE = 51; - public static final int WINDOW_REMOVE_TIMEOUT = 52; + public static final int WINDOW_HIDE_TIMEOUT = 52; public static final int NOTIFY_DOCKED_STACK_MINIMIZED_CHANGED = 53; public static final int SEAMLESS_ROTATION_TIMEOUT = 54; @@ -8780,7 +8860,7 @@ public class WindowManagerService extends IWindowManager.Stub mAmInternal.notifyStartingWindowDrawn(); } break; - case WINDOW_REMOVE_TIMEOUT: { + case WINDOW_HIDE_TIMEOUT: { final WindowState window = (WindowState) msg.obj; synchronized(mWindowMap) { // TODO: This is all about fixing b/21693547 @@ -8791,8 +8871,11 @@ public class WindowManagerService extends IWindowManager.Stub // running under debugger) to crash (b/29105388). The windows will // eventually be removed when the client process finishes. // The best we can do for now is remove the FLAG_KEEP_SCREEN_ON - // and prevent the symptoms of b/21693547. + // and prevent the symptoms of b/21693547. Since apps don't + // support windows being removed under them we hide the window + // and it will be removed when the app dies. window.mAttrs.flags &= ~FLAG_KEEP_SCREEN_ON; + window.hidePermanentlyLw(); window.setDisplayLayoutNeeded(); mWindowPlacerLocked.performSurfacePlacement(); } @@ -9110,7 +9193,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void setForcedDisplayDensity(int displayId, int density) { + public void setForcedDisplayDensityForUser(int displayId, int density, int userId) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { @@ -9120,16 +9203,20 @@ public class WindowManagerService extends IWindowManager.Stub if (displayId != Display.DEFAULT_DISPLAY) { throw new IllegalArgumentException("Can only set the default display"); } + + final int targetUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), + Binder.getCallingUid(), userId, false, true, "setForcedDisplayDensityForUser", + null); final long ident = Binder.clearCallingIdentity(); try { synchronized(mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); - if (displayContent != null) { + if (displayContent != null && mCurrentUserId == targetUserId) { setForcedDisplayDensityLocked(displayContent, density); - Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.DISPLAY_DENSITY_FORCED, - Integer.toString(density), mCurrentUserId); } + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.DISPLAY_DENSITY_FORCED, + Integer.toString(density), targetUserId); } } finally { Binder.restoreCallingIdentity(ident); @@ -9137,7 +9224,7 @@ public class WindowManagerService extends IWindowManager.Stub } @Override - public void clearForcedDisplayDensity(int displayId) { + public void clearForcedDisplayDensityForUser(int displayId, int userId) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { @@ -9147,16 +9234,20 @@ public class WindowManagerService extends IWindowManager.Stub if (displayId != Display.DEFAULT_DISPLAY) { throw new IllegalArgumentException("Can only set the default display"); } + + final int callingUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(), + Binder.getCallingUid(), userId, false, true, "clearForcedDisplayDensityForUser", + null); final long ident = Binder.clearCallingIdentity(); try { synchronized(mWindowMap) { final DisplayContent displayContent = getDisplayContentLocked(displayId); - if (displayContent != null) { + if (displayContent != null && mCurrentUserId == callingUserId) { setForcedDisplayDensityLocked(displayContent, displayContent.mInitialDisplayDensity); - Settings.Secure.putStringForUser(mContext.getContentResolver(), - Settings.Secure.DISPLAY_DENSITY_FORCED, "", mCurrentUserId); } + Settings.Secure.putStringForUser(mContext.getContentResolver(), + Settings.Secure.DISPLAY_DENSITY_FORCED, "", callingUserId); } } finally { Binder.restoreCallingIdentity(ident); @@ -9828,6 +9919,12 @@ public class WindowManagerService extends IWindowManager.Stub adjustForImeIfNeeded(displayContent); + // We may need to schedule some toast windows to be removed. The + // toasts for an app that does not have input focus are removed + // within a timeout to prevent apps to redress other apps' UI. + getDefaultDisplayContentLocked().scheduleToastWindowsTimeoutIfNeededLocked( + oldFocus, newFocus); + Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); return true; } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 54f60ef6a8a7..1fa0783e0cab 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -166,6 +166,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mPolicyVisibility = true; boolean mPolicyVisibilityAfterAnim = true; boolean mAppOpVisibility = true; + boolean mPermanentlyHidden; // the window should never be shown again boolean mAppFreezing; boolean mAttachedHidden; // is our parent window hidden? boolean mWallpaperVisible; // for wallpaper, what was last vis report? @@ -1876,6 +1877,11 @@ final class WindowState implements WindowManagerPolicy.WindowState { // Being hidden due to app op request. return false; } + if (mPermanentlyHidden) { + // Permanently hidden until the app exists as apps aren't prepared + // to handle their windows being removed from under them. + return false; + } if (mPolicyVisibility && mPolicyVisibilityAfterAnim) { // Already showing. return false; @@ -1966,6 +1972,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } + public void hidePermanentlyLw() { + if (!mPermanentlyHidden) { + mPermanentlyHidden = true; + hideLw(true, true); + } + } + public void pokeDrawLockLw(long timeout) { if (isVisibleOrAdding()) { if (mDrawLock == null) { @@ -2615,7 +2628,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.println(Integer.toHexString(mSystemUiVisibility)); } if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility - || mAttachedHidden) { + || mAttachedHidden || mPermanentlyHidden) { pw.print(prefix); pw.print("mPolicyVisibility="); pw.print(mPolicyVisibility); pw.print(" mPolicyVisibilityAfterAnim="); @@ -2623,6 +2636,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.print(" mAppOpVisibility="); pw.print(mAppOpVisibility); pw.print(" mAttachedHidden="); pw.println(mAttachedHidden); + pw.print(" mPermanentlyHidden="); pw.println(mPermanentlyHidden); } if (!mRelayoutCalled || mLayoutNeeded) { pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 00f4a45ba9c5..0285f7075e95 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -228,8 +228,6 @@ class WindowStateAnimator { int mAttrType; static final long PENDING_TRANSACTION_FINISH_WAIT_TIME = 100; - long mDeferTransactionUntilFrame = -1; - long mDeferTransactionTime = -1; boolean mForceScaleUntilResize; @@ -2055,35 +2053,11 @@ class WindowStateAnimator { if (!mWin.isChildWindow()) { return; } - mDeferTransactionUntilFrame = frameNumber; - mDeferTransactionTime = System.currentTimeMillis(); mSurfaceController.deferTransactionUntil( mWin.mAttachedWindow.mWinAnimator.mSurfaceController.getHandle(), frameNumber); } - // Defer the current transaction to the frame number of the last saved transaction. - // We do this to avoid shooting through an unsynchronized transaction while something is - // pending. This is generally fine, as either we will get in on the synchronization, - // or SurfaceFlinger will see that the frame has already occured. The only - // potential problem is in frame number resets so we reset things with a timeout - // every so often to be careful. - void deferToPendingTransaction() { - if (mDeferTransactionUntilFrame < 0) { - return; - } - long time = System.currentTimeMillis(); - if (time > mDeferTransactionTime + PENDING_TRANSACTION_FINISH_WAIT_TIME) { - mDeferTransactionTime = -1; - mDeferTransactionUntilFrame = -1; - } else if (mWin.mAttachedWindow != null && - mWin.mAttachedWindow.mWinAnimator.hasSurface()) { - mSurfaceController.deferTransactionUntil( - mWin.mAttachedWindow.mWinAnimator.mSurfaceController.getHandle(), - mDeferTransactionUntilFrame); - } - } - /** * Sometimes we need to synchronize the first frame of animation with some external event. * To achieve this, we prolong the start of the animation and keep producing the first frame of diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index c77e5725a707..f5ed9d1b8650 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -153,9 +153,9 @@ class WindowSurfaceController { } void destroyInTransaction() { - // if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { - Slog.i(TAG, "Destroying surface " + this + " called by " + Debug.getCallers(8)); - // } + if (SHOW_TRANSACTIONS || SHOW_SURFACE_ALLOC) { + Slog.i(TAG, "Destroying surface " + this + " called by " + Debug.getCallers(8)); + } try { if (mSurfaceControl != null) { mSurfaceControl.destroy(); diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index fa5e3cabeb44..5a79da938c60 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -742,10 +742,6 @@ class WindowSurfacePlacer { // Moved from updateWindowsAndWallpaperLocked(). if (w.mHasSurface) { - // If we have recently synchronized a previous transaction for this - // window ensure we don't push through an unsynchronized one now. - winAnimator.deferToPendingTransaction(); - // Take care of the window being ready to display. final boolean committed = winAnimator.commitFinishDrawingLocked(); if (isDefaultDisplay && committed) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index c75b8c2b9ba6..777c0b35e4be 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -29,6 +29,7 @@ import static org.xmlpull.v1.XmlPullParser.TEXT; import android.Manifest.permission; import android.accessibilityservice.AccessibilityServiceInfo; +import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.IntDef; import android.annotation.NonNull; @@ -524,6 +525,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { static class ActiveAdmin { private static final String TAG_DISABLE_KEYGUARD_FEATURES = "disable-keyguard-features"; + private static final String TAG_TEST_ONLY_ADMIN = "test-only-admin"; private static final String TAG_DISABLE_CAMERA = "disable-camera"; private static final String TAG_DISABLE_CALLER_ID = "disable-caller-id"; private static final String TAG_DISABLE_CONTACTS_SEARCH = "disable-contacts-search"; @@ -616,6 +618,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int disabledKeyguardFeatures = DEF_KEYGUARD_FEATURES_DISABLED; boolean encryptionRequested = false; + boolean testOnlyAdmin = false; boolean disableCamera = false; boolean disableCallerId = false; boolean disableContactsSearch = false; @@ -785,6 +788,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { out.attribute(null, ATTR_VALUE, Boolean.toString(encryptionRequested)); out.endTag(null, TAG_ENCRYPTION_REQUESTED); } + if (testOnlyAdmin) { + out.startTag(null, TAG_TEST_ONLY_ADMIN); + out.attribute(null, ATTR_VALUE, Boolean.toString(testOnlyAdmin)); + out.endTag(null, TAG_TEST_ONLY_ADMIN); + } if (disableCamera) { out.startTag(null, TAG_DISABLE_CAMERA); out.attribute(null, ATTR_VALUE, Boolean.toString(disableCamera)); @@ -980,6 +988,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if (TAG_ENCRYPTION_REQUESTED.equals(tag)) { encryptionRequested = Boolean.parseBoolean( parser.getAttributeValue(null, ATTR_VALUE)); + } else if (TAG_TEST_ONLY_ADMIN.equals(tag)) { + testOnlyAdmin = Boolean.parseBoolean( + parser.getAttributeValue(null, ATTR_VALUE)); } else if (TAG_DISABLE_CAMERA.equals(tag)) { disableCamera = Boolean.parseBoolean( parser.getAttributeValue(null, ATTR_VALUE)); @@ -1178,6 +1189,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { void dump(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("uid="); pw.println(getUid()); + pw.print(prefix); pw.print("testOnlyAdmin="); + pw.println(testOnlyAdmin); pw.print(prefix); pw.println("policies:"); ArrayList<DeviceAdminInfo.PolicyInfo> pols = info.getUsedPolicies(); if (pols != null) { @@ -2828,8 +2841,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { long ident = mInjector.binderClearCallingIdentity(); try { - if (!refreshing - && getActiveAdminUncheckedLocked(adminReceiver, userHandle) != null) { + final ActiveAdmin existingAdmin + = getActiveAdminUncheckedLocked(adminReceiver, userHandle); + if (!refreshing && existingAdmin != null) { throw new IllegalArgumentException("Admin is already added"); } if (policy.mRemovingAdmins.contains(adminReceiver)) { @@ -2837,6 +2851,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "Trying to set an admin which is being removed"); } ActiveAdmin newAdmin = new ActiveAdmin(info, /* parent */ false); + newAdmin.testOnlyAdmin = + (existingAdmin != null) ? existingAdmin.testOnlyAdmin + : isPackageTestOnly(adminReceiver.getPackageName(), userHandle); policy.mAdminMap.put(adminReceiver, newAdmin); int replaceIndex = -1; final int N = policy.mAdminList.size(); @@ -2948,23 +2965,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { enforceShell("forceRemoveActiveAdmin"); long ident = mInjector.binderClearCallingIdentity(); try { - final ApplicationInfo ai; - try { - ai = mIPackageManager.getApplicationInfo(adminReceiver.getPackageName(), - 0, userHandle); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - if (ai == null) { - throw new IllegalStateException("Couldn't find package to remove admin " - + adminReceiver.getPackageName() + " " + userHandle); - } - if ((ai.flags & ApplicationInfo.FLAG_TEST_ONLY) == 0) { - throw new SecurityException("Attempt to remove non-test admin " + adminReceiver - + adminReceiver + " " + userHandle); - } - // If admin is a device or profile owner tidy that up first. synchronized (this) { + if (!isAdminTestOnlyLocked(adminReceiver, userHandle)) { + throw new SecurityException("Attempt to remove non-test admin " + + adminReceiver + " " + userHandle); + } + + // If admin is a device or profile owner tidy that up first. if (isDeviceOwner(adminReceiver, userHandle)) { clearDeviceOwnerLocked(getDeviceOwnerAdminLocked(), userHandle); } @@ -2976,11 +2983,47 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } // Remove the admin skipping sending the broadcast. removeAdminArtifacts(adminReceiver, userHandle); + Slog.i(LOG_TAG, "Admin " + adminReceiver + " removed from user " + userHandle); } finally { mInjector.binderRestoreCallingIdentity(ident); } } + /** + * Return if a given package has testOnly="true", in which case we'll relax certain rules + * for CTS. + * + * DO NOT use this method except in {@link #setActiveAdmin}. Use {@link #isAdminTestOnlyLocked} + * to check wehter an active admin is test-only or not. + * + * The system allows this flag to be changed when an app is updated, which is not good + * for us. So we persist the flag in {@link ActiveAdmin} when an admin is first installed, + * and used the persisted version in actual checks. (See b/31382361 and b/28928996) + */ + private boolean isPackageTestOnly(String packageName, int userHandle) { + final ApplicationInfo ai; + try { + ai = mIPackageManager.getApplicationInfo(packageName, + (PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE), userHandle); + } catch (RemoteException e) { + throw new IllegalStateException(e); + } + if (ai == null) { + throw new IllegalStateException("Couldn't find package to remove admin " + + packageName + " " + userHandle); + } + return (ai.flags & ApplicationInfo.FLAG_TEST_ONLY) != 0; + } + + /** + * See {@link #isPackageTestOnly}. + */ + private boolean isAdminTestOnlyLocked(ComponentName who, int userHandle) { + final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userHandle); + return (admin != null) && admin.testOnlyAdmin; + } + private void enforceShell(String method) { final int callingUid = Binder.getCallingUid(); if (callingUid != Process.SHELL_UID && callingUid != Process.ROOT_UID) { @@ -3678,12 +3721,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private boolean isActivePasswordSufficientForUserLocked( DevicePolicyData policy, int userHandle, boolean parent) { - if (policy.mActivePasswordQuality < getPasswordQuality(null, userHandle, parent) - || policy.mActivePasswordLength < getPasswordMinimumLength( + final int requiredPasswordQuality = getPasswordQuality(null, userHandle, parent); + if (policy.mActivePasswordQuality < requiredPasswordQuality) { + return false; + } + if (requiredPasswordQuality >= DevicePolicyManager.PASSWORD_QUALITY_NUMERIC + && policy.mActivePasswordLength < getPasswordMinimumLength( null, userHandle, parent)) { return false; } - if (policy.mActivePasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) { + if (requiredPasswordQuality != DevicePolicyManager.PASSWORD_QUALITY_COMPLEX) { return true; } return policy.mActivePasswordUpperCase >= getPasswordMinimumUpperCase( @@ -4517,7 +4564,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * not installed and therefore not available. * * @throws SecurityException if the caller is not a profile or device owner. - * @throws UnsupportedException if the package does not support being set as always-on. + * @throws UnsupportedOperationException if the package does not support being set as always-on. */ @Override public boolean setAlwaysOnVpnPackage(ComponentName admin, String vpnPackage, boolean lockdown) @@ -5713,7 +5760,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { + " for device owner"); } synchronized (this) { - enforceCanSetDeviceOwnerLocked(userId); + enforceCanSetDeviceOwnerLocked(admin, userId); if (getActiveAdminUncheckedLocked(admin, userId) == null || getUserData(userId).mRemovingAdmins.contains(admin)) { throw new IllegalArgumentException("Not active admin: " + admin); @@ -5745,6 +5792,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } finally { mInjector.binderRestoreCallingIdentity(ident); } + Slog.i(LOG_TAG, "Device owner set: " + admin + " on user " + userId); return true; } } @@ -5866,6 +5914,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } finally { mInjector.binderRestoreCallingIdentity(ident); } + Slog.i(LOG_TAG, "Device owner removed: " + deviceOwnerComponent); } } @@ -5901,7 +5950,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { + " not installed for userId:" + userHandle); } synchronized (this) { - enforceCanSetProfileOwnerLocked(userHandle); + enforceCanSetProfileOwnerLocked(who, userHandle); if (getActiveAdminUncheckedLocked(who, userHandle) == null || getUserData(userHandle).mRemovingAdmins.contains(who)) { @@ -5910,6 +5959,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mOwners.setProfileOwner(who, ownerName, userHandle); mOwners.writeProfileOwner(userHandle); + Slog.i(LOG_TAG, "Profile owner set: " + who + " on user " + userHandle); return true; } } @@ -5934,6 +5984,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } finally { mInjector.binderRestoreCallingIdentity(ident); } + Slog.i(LOG_TAG, "Profile owner " + who + " removed from user " + userId); } } @@ -6210,9 +6261,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * The profile owner can only be set before the user setup phase has completed, * except for: * - SYSTEM_UID - * - adb if there are not accounts. + * - adb if there are no accounts. (But see {@link #hasIncompatibleAccountsLocked}) */ - private void enforceCanSetProfileOwnerLocked(int userHandle) { + private void enforceCanSetProfileOwnerLocked(@Nullable ComponentName owner, int userHandle) { UserInfo info = getUserInfo(userHandle); if (info == null) { // User doesn't exist. @@ -6232,8 +6283,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } int callingUid = mInjector.binderGetCallingUid(); if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) { - if (hasUserSetupCompleted(userHandle) && - AccountManager.get(mContext).getAccountsAsUser(userHandle).length > 0) { + if (hasUserSetupCompleted(userHandle) + && hasIncompatibleAccountsLocked(userHandle, owner)) { throw new IllegalStateException("Not allowed to set the profile owner because " + "there are already some accounts on the profile"); } @@ -6250,14 +6301,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * The Device owner can only be set by adb or an app with the MANAGE_PROFILE_AND_DEVICE_OWNERS * permission. */ - private void enforceCanSetDeviceOwnerLocked(int userId) { + private void enforceCanSetDeviceOwnerLocked(@Nullable ComponentName owner, int userId) { int callingUid = mInjector.binderGetCallingUid(); boolean isAdb = callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID; if (!isAdb) { enforceCanManageProfileAndDeviceOwners(); } - final int code = checkSetDeviceOwnerPreCondition(userId, isAdb); + final int code = checkSetDeviceOwnerPreConditionLocked(owner, userId, isAdb); switch (code) { case CODE_OK: return; @@ -8474,8 +8525,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * The device owner can only be set before the setup phase of the primary user has completed, * except for adb command if no accounts or additional users are present on the device. */ - private synchronized @DeviceOwnerPreConditionCode int checkSetDeviceOwnerPreCondition( - int deviceOwnerUserId, boolean isAdb) { + private synchronized @DeviceOwnerPreConditionCode int checkSetDeviceOwnerPreConditionLocked( + @Nullable ComponentName owner, int deviceOwnerUserId, boolean isAdb) { if (mOwners.hasDeviceOwner()) { return CODE_HAS_DEVICE_OWNER; } @@ -8492,7 +8543,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (mUserManager.getUserCount() > 1) { return CODE_NONSYSTEM_USER_EXISTS; } - if (AccountManager.get(mContext).getAccounts().length > 0) { + if (hasIncompatibleAccountsLocked(UserHandle.USER_SYSTEM, owner)) { return CODE_ACCOUNTS_NOT_EMPTY; } } else { @@ -8518,7 +8569,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } private boolean isDeviceOwnerProvisioningAllowed(int deviceOwnerUserId) { - return CODE_OK == checkSetDeviceOwnerPreCondition(deviceOwnerUserId, /* isAdb */ false); + synchronized (this) { + return CODE_OK == checkSetDeviceOwnerPreConditionLocked( + /* owner unknown */ null, deviceOwnerUserId, /* isAdb */ false); + } } private boolean hasFeatureManagedUsers() { @@ -9051,6 +9105,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { saveSettingsLocked(userHandle); updateMaximumTimeToLockLocked(userHandle); policy.mRemovingAdmins.remove(adminReceiver); + + Slog.i(LOG_TAG, "Device admin " + adminReceiver + " removed from user " + userHandle); } // The removed admin might have disabled camera, so update user // restrictions. @@ -9075,4 +9131,81 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return policy.mDeviceProvisioningConfigApplied; } } + + /** + * Return true if a given user has any accounts that'll prevent installing a device or profile + * owner {@code owner}. + * - If the user has no accounts, then return false. + * - Otherwise, if the owner is unknown (== null), or is not test-only, then return true. + * - Otherwise, if there's any account that does not have ..._ALLOWED, or does have + * ..._DISALLOWED, return true. + * - Otherwise return false. + */ + private boolean hasIncompatibleAccountsLocked(int userId, @Nullable ComponentName owner) { + final long token = mInjector.binderClearCallingIdentity(); + try { + final AccountManager am = AccountManager.get(mContext); + final Account accounts[] = am.getAccountsAsUser(userId); + if (accounts.length == 0) { + return false; + } + final String[] feature_allow = + { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED }; + final String[] feature_disallow = + { DevicePolicyManager.ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED }; + + // Even if we find incompatible accounts along the way, we still check all accounts + // for logging. + boolean compatible = true; + for (Account account : accounts) { + if (hasAccountFeatures(am, account, feature_disallow)) { + Log.e(LOG_TAG, account + " has " + feature_disallow[0]); + compatible = false; + } + if (!hasAccountFeatures(am, account, feature_allow)) { + Log.e(LOG_TAG, account + " doesn't have " + feature_allow[0]); + compatible = false; + } + } + if (compatible) { + Log.w(LOG_TAG, "All accounts are compatible"); + } else { + Log.e(LOG_TAG, "Found incompatible accounts"); + } + + // Then check if the owner is test-only. + String log; + if (owner == null) { + // Owner is unknown. Suppose it's not test-only + compatible = false; + log = "Only test-only device/profile owner can be installed with accounts"; + } else if (isAdminTestOnlyLocked(owner, userId)) { + if (compatible) { + log = "Installing test-only owner " + owner; + } else { + log = "Can't install test-only owner " + owner + " with incompatible accounts"; + } + } else { + compatible = false; + log = "Can't install non test-only owner " + owner + " with accounts"; + } + if (compatible) { + Log.w(LOG_TAG, log); + } else { + Log.e(LOG_TAG, log); + } + return !compatible; + } finally { + mInjector.binderRestoreCallingIdentity(token); + } + } + + private boolean hasAccountFeatures(AccountManager am, Account account, String[] features) { + try { + return am.hasFeatures(account, features, null, null).getResult(); + } catch (Exception e) { + Log.w(LOG_TAG, "Failed to get account feature", e); + return false; + } + } } diff --git a/services/net/Android.mk b/services/net/Android.mk index 336bc45c6ab7..408794e7d0b9 100644 --- a/services/net/Android.mk +++ b/services/net/Android.mk @@ -7,4 +7,7 @@ LOCAL_MODULE := services.net LOCAL_SRC_FILES += \ $(call all-java-files-under,java) +LOCAL_AIDL_INCLUDES += \ + system/netd/server/binder + include $(BUILD_STATIC_JAVA_LIBRARY) diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java index 4bb0902f2ec0..4c7545240c23 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -19,6 +19,7 @@ package android.net.apf; import static android.system.OsConstants.*; import android.os.SystemClock; +import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkUtils; import android.net.apf.ApfGenerator; @@ -44,6 +45,7 @@ import com.android.internal.util.IndentingPrintWriter; import java.io.FileDescriptor; import java.io.IOException; import java.lang.Thread; +import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; @@ -171,8 +173,8 @@ public class ApfFilter { private static final int ETH_HEADER_LEN = 14; private static final int ETH_DEST_ADDR_OFFSET = 0; private static final int ETH_ETHERTYPE_OFFSET = 12; - private static final byte[] ETH_BROADCAST_MAC_ADDRESS = new byte[]{ - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; + private static final byte[] ETH_BROADCAST_MAC_ADDRESS = + {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; // TODO: Make these offsets relative to end of link-layer header; don't include ETH_HEADER_LEN. private static final int IPV4_FRAGMENT_OFFSET_OFFSET = ETH_HEADER_LEN + 6; // Endianness is not an issue for this constant because the APF interpreter always operates in @@ -181,6 +183,7 @@ public class ApfFilter { private static final int IPV4_PROTOCOL_OFFSET = ETH_HEADER_LEN + 9; private static final int IPV4_DEST_ADDR_OFFSET = ETH_HEADER_LEN + 16; private static final int IPV4_ANY_HOST_ADDRESS = 0; + private static final int IPV4_BROADCAST_ADDRESS = -1; // 255.255.255.255 private static final int IPV6_NEXT_HEADER_OFFSET = ETH_HEADER_LEN + 6; private static final int IPV6_SRC_ADDR_OFFSET = ETH_HEADER_LEN + 8; @@ -188,7 +191,7 @@ public class ApfFilter { private static final int IPV6_HEADER_LEN = 40; // The IPv6 all nodes address ff02::1 private static final byte[] IPV6_ALL_NODES_ADDRESS = - new byte[]{ (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; @@ -206,7 +209,7 @@ public class ApfFilter { private static final int ARP_OPCODE_OFFSET = ARP_HEADER_OFFSET + 6; private static final short ARP_OPCODE_REQUEST = 1; private static final short ARP_OPCODE_REPLY = 2; - private static final byte[] ARP_IPV4_HEADER = new byte[]{ + private static final byte[] ARP_IPV4_HEADER = { 0, 1, // Hardware type: Ethernet (1) 8, 0, // Protocol type: IP (0x0800) 6, // Hardware size: 6 @@ -229,6 +232,9 @@ public class ApfFilter { // Our IPv4 address, if we have just one, otherwise null. @GuardedBy("this") private byte[] mIPv4Address; + // The subnet prefix length of our IPv4 network. Only valid if mIPv4Address is not null. + @GuardedBy("this") + private int mIPv4PrefixLength; @VisibleForTesting ApfFilter(ApfCapabilities apfCapabilities, NetworkInterface networkInterface, @@ -364,26 +370,6 @@ public class ApfFilter { // Can't be static because it's in a non-static inner class. // TODO: Make this static once RA is its own class. - private int uint8(byte b) { - return b & 0xff; - } - - private int uint16(short s) { - return s & 0xffff; - } - - private long uint32(int i) { - return i & 0xffffffffL; - } - - private long getUint16(ByteBuffer buffer, int position) { - return uint16(buffer.getShort(position)); - } - - private long getUint32(ByteBuffer buffer, int position) { - return uint32(buffer.getInt(position)); - } - private void prefixOptionToString(StringBuffer sb, int offset) { String prefix = IPv6AddresstoString(offset + 16); int length = uint8(mPacket.get(offset + 2)); @@ -737,39 +723,57 @@ public class ApfFilter { // Here's a basic summary of what the IPv4 filter program does: // // if filtering multicast (i.e. multicast lock not held): - // if it's multicast: - // drop - // if it's not broadcast: + // if it's DHCP destined to our MAC: // pass - // if it's not DHCP destined to our MAC: + // if it's L2 broadcast: + // drop + // if it's IPv4 multicast: + // drop + // if it's IPv4 broadcast: // drop // pass if (mMulticastFilter) { - // Check for multicast destination address range - gen.addLoad8(Register.R0, IPV4_DEST_ADDR_OFFSET); - gen.addAnd(0xf0); - gen.addJumpIfR0Equals(0xe0, gen.DROP_LABEL); + final String skipDhcpv4Filter = "skip_dhcp_v4_filter"; - // Drop all broadcasts besides DHCP addressed to us - // If not a broadcast packet, pass - gen.addLoadImmediate(Register.R0, ETH_DEST_ADDR_OFFSET); - gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, gen.PASS_LABEL); - // If not UDP, drop + // Pass DHCP addressed to us. + // Check it's UDP. gen.addLoad8(Register.R0, IPV4_PROTOCOL_OFFSET); - gen.addJumpIfR0NotEquals(IPPROTO_UDP, gen.DROP_LABEL); - // If fragment, drop. This matches the BPF filter installed by the DHCP client. + gen.addJumpIfR0NotEquals(IPPROTO_UDP, skipDhcpv4Filter); + // Check it's not a fragment. This matches the BPF filter installed by the DHCP client. gen.addLoad16(Register.R0, IPV4_FRAGMENT_OFFSET_OFFSET); - gen.addJumpIfR0AnyBitsSet(IPV4_FRAGMENT_OFFSET_MASK, gen.DROP_LABEL); - // If not to DHCP client port, drop + gen.addJumpIfR0AnyBitsSet(IPV4_FRAGMENT_OFFSET_MASK, skipDhcpv4Filter); + // Check it's addressed to DHCP client port. gen.addLoadFromMemory(Register.R1, gen.IPV4_HEADER_SIZE_MEMORY_SLOT); gen.addLoad16Indexed(Register.R0, UDP_DESTINATION_PORT_OFFSET); - gen.addJumpIfR0NotEquals(DHCP_CLIENT_PORT, gen.DROP_LABEL); - // If not DHCP to our MAC address, drop + gen.addJumpIfR0NotEquals(DHCP_CLIENT_PORT, skipDhcpv4Filter); + // Check it's DHCP to our MAC address. gen.addLoadImmediate(Register.R0, DHCP_CLIENT_MAC_OFFSET); // NOTE: Relies on R1 containing IPv4 header offset. gen.addAddR1(); - gen.addJumpIfBytesNotEqual(Register.R0, mHardwareAddress, gen.DROP_LABEL); + gen.addJumpIfBytesNotEqual(Register.R0, mHardwareAddress, skipDhcpv4Filter); + gen.addJump(gen.PASS_LABEL); + + // Drop all multicasts/broadcasts. + gen.defineLabel(skipDhcpv4Filter); + + // If IPv4 destination address is in multicast range, drop. + gen.addLoad8(Register.R0, IPV4_DEST_ADDR_OFFSET); + gen.addAnd(0xf0); + gen.addJumpIfR0Equals(0xe0, gen.DROP_LABEL); + + // If IPv4 broadcast packet, drop regardless of L2 (b/30231088). + gen.addLoad32(Register.R0, IPV4_DEST_ADDR_OFFSET); + gen.addJumpIfR0Equals(IPV4_BROADCAST_ADDRESS, gen.DROP_LABEL); + if (mIPv4Address != null && mIPv4PrefixLength < 31) { + int broadcastAddr = ipv4BroadcastAddress(mIPv4Address, mIPv4PrefixLength); + gen.addJumpIfR0Equals(broadcastAddr, gen.DROP_LABEL); + } + + // If L2 broadcast packet, drop. + gen.addLoadImmediate(Register.R0, ETH_DEST_ADDR_OFFSET); + gen.addJumpIfBytesNotEqual(Register.R0, ETH_BROADCAST_MAC_ADDRESS, gen.PASS_LABEL); + gen.addJump(gen.DROP_LABEL); } // Otherwise, pass @@ -1062,26 +1066,32 @@ public class ApfFilter { } } - // Find the single IPv4 address if there is one, otherwise return null. - private static byte[] findIPv4Address(LinkProperties lp) { - byte[] ipv4Address = null; - for (InetAddress inetAddr : lp.getAddresses()) { - byte[] addr = inetAddr.getAddress(); - if (addr.length != 4) continue; - // More than one IPv4 address, abort - if (ipv4Address != null && !Arrays.equals(ipv4Address, addr)) return null; - ipv4Address = addr; + /** Find the single IPv4 LinkAddress if there is one, otherwise return null. */ + private static LinkAddress findIPv4LinkAddress(LinkProperties lp) { + LinkAddress ipv4Address = null; + for (LinkAddress address : lp.getLinkAddresses()) { + if (!(address.getAddress() instanceof Inet4Address)) { + continue; + } + if (ipv4Address != null && !ipv4Address.isSameAddressAs(address)) { + // More than one IPv4 address, abort. + return null; + } + ipv4Address = address; } return ipv4Address; } public synchronized void setLinkProperties(LinkProperties lp) { // NOTE: Do not keep a copy of LinkProperties as it would further duplicate state. - byte[] ipv4Address = findIPv4Address(lp); - // If ipv4Address is the same as mIPv4Address, then there's no change, just return. - if (Arrays.equals(ipv4Address, mIPv4Address)) return; - // Otherwise update mIPv4Address and install new program. - mIPv4Address = ipv4Address; + final LinkAddress ipv4Address = findIPv4LinkAddress(lp); + final byte[] addr = (ipv4Address != null) ? ipv4Address.getAddress().getAddress() : null; + final int prefix = (ipv4Address != null) ? ipv4Address.getPrefixLength() : 0; + if ((prefix == mIPv4PrefixLength) && Arrays.equals(addr, mIPv4Address)) { + return; + } + mIPv4Address = addr; + mIPv4PrefixLength = prefix; installNewProgramLocked(); } @@ -1127,4 +1137,38 @@ public class ApfFilter { pw.decreaseIndent(); } } + + private static int uint8(byte b) { + return b & 0xff; + } + + private static int uint16(short s) { + return s & 0xffff; + } + + private static long uint32(int i) { + return i & 0xffffffffL; + } + + private static long getUint16(ByteBuffer buffer, int position) { + return uint16(buffer.getShort(position)); + } + + private static long getUint32(ByteBuffer buffer, int position) { + return uint32(buffer.getInt(position)); + } + + // TODO: move to android.net.NetworkUtils + @VisibleForTesting + public static int ipv4BroadcastAddress(byte[] addrBytes, int prefixLength) { + return bytesToInt(addrBytes) | (int) (uint32(-1) >>> prefixLength); + } + + @VisibleForTesting + public static int bytesToInt(byte[] addrBytes) { + return (uint8(addrBytes[0]) << 24) + + (uint8(addrBytes[1]) << 16) + + (uint8(addrBytes[2]) << 8) + + (uint8(addrBytes[3])); + } } diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java index 654ef18f9608..6d9020390bef 100644 --- a/services/net/java/android/net/ip/IpManager.java +++ b/services/net/java/android/net/ip/IpManager.java @@ -382,6 +382,7 @@ public class IpManager extends StateMachine { private final State mStoppedState = new StoppedState(); private final State mStoppingState = new StoppingState(); private final State mStartedState = new StartedState(); + private final State mRunningState = new RunningState(); private final String mTag; private final Context mContext; @@ -476,6 +477,7 @@ public class IpManager extends StateMachine { // Super simple StateMachine. addState(mStoppedState); addState(mStartedState); + addState(mRunningState, mStartedState); addState(mStoppingState); setInitialState(mStoppedState); @@ -570,7 +572,7 @@ public class IpManager extends StateMachine { pw.decreaseIndent(); pw.println(); - pw.println("StateMachine dump:"); + pw.println(mTag + " StateMachine dump:"); pw.increaseIndent(); mLocalLog.readOnlyLocalLog().dump(fd, pw, args); pw.decreaseIndent(); @@ -768,6 +770,11 @@ public class IpManager extends StateMachine { // - IPv6 addresses // - IPv6 routes // - IPv6 DNS servers + // + // N.B.: this is fundamentally race-prone and should be fixed by + // changing NetlinkTracker from a hybrid edge/level model to an + // edge-only model, or by giving IpManager its own netlink socket(s) + // so as to track all required information directly. LinkProperties netlinkLinkProperties = mNetlinkTracker.getLinkProperties(); newLp.setLinkAddresses(netlinkLinkProperties.getLinkAddresses()); for (RouteInfo route : netlinkLinkProperties.getRoutes()) { @@ -939,16 +946,30 @@ public class IpManager extends StateMachine { return true; } + private void stopAllIP() { + // We don't need to worry about routes, just addresses, because: + // - disableIpv6() will clear autoconf IPv6 routes as well, and + // - we don't get IPv4 routes from netlink + // so we neither react to nor need to wait for changes in either. + + try { + mNwService.disableIpv6(mInterfaceName); + } catch (Exception e) { + Log.e(mTag, "Failed to disable IPv6" + e); + } + + try { + mNwService.clearInterfaceAddresses(mInterfaceName); + } catch (Exception e) { + Log.e(mTag, "Failed to clear addresses " + e); + } + } + class StoppedState extends State { @Override public void enter() { - try { - mNwService.disableIpv6(mInterfaceName); - mNwService.clearInterfaceAddresses(mInterfaceName); - } catch (Exception e) { - Log.e(mTag, "Failed to clear addresses or disable IPv6" + e); - } + stopAllIP(); resetLinkProperties(); if (mStartTimeMillis > 0) { @@ -1023,12 +1044,71 @@ public class IpManager extends StateMachine { } class StartedState extends State { - private boolean mDhcpActionInFlight; - @Override public void enter() { mStartTimeMillis = SystemClock.elapsedRealtime(); + if (mConfiguration.mProvisioningTimeoutMs > 0) { + final long alarmTime = SystemClock.elapsedRealtime() + + mConfiguration.mProvisioningTimeoutMs; + mProvisioningTimeoutAlarm.schedule(alarmTime); + } + + if (readyToProceed()) { + transitionTo(mRunningState); + } else { + // Clear all IPv4 and IPv6 before proceeding to RunningState. + // Clean up any leftover state from an abnormal exit from + // tethering or during an IpManager restart. + stopAllIP(); + } + } + + @Override + public void exit() { + mProvisioningTimeoutAlarm.cancel(); + } + + @Override + public boolean processMessage(Message msg) { + switch (msg.what) { + case CMD_STOP: + transitionTo(mStoppingState); + break; + + case EVENT_NETLINK_LINKPROPERTIES_CHANGED: + handleLinkPropertiesUpdate(NO_CALLBACKS); + if (readyToProceed()) { + transitionTo(mRunningState); + } + break; + + case EVENT_PROVISIONING_TIMEOUT: + handleProvisioningFailure(); + break; + + default: + // It's safe to process messages out of order because the + // only message that can both + // a) be received at this time and + // b) affect provisioning state + // is EVENT_NETLINK_LINKPROPERTIES_CHANGED (handled above). + deferMessage(msg); + } + return HANDLED; + } + + boolean readyToProceed() { + return (!mLinkProperties.hasIPv4Address() && + !mLinkProperties.hasGlobalIPv6Address()); + } + } + + class RunningState extends State { + private boolean mDhcpActionInFlight; + + @Override + public void enter() { mApfFilter = ApfFilter.maybeCreate(mConfiguration.mApfCapabilities, mNetworkInterface, mCallback, mMulticastFiltering); // TODO: investigate the effects of any multicast filtering racing/interfering with the @@ -1037,12 +1117,6 @@ public class IpManager extends StateMachine { mCallback.setFallbackMulticastFilter(mMulticastFiltering); } - if (mConfiguration.mProvisioningTimeoutMs > 0) { - final long alarmTime = SystemClock.elapsedRealtime() + - mConfiguration.mProvisioningTimeoutMs; - mProvisioningTimeoutAlarm.schedule(alarmTime); - } - if (mConfiguration.mEnableIPv6) { // TODO: Consider transitionTo(mStoppingState) if this fails. startIPv6(); @@ -1070,7 +1144,6 @@ public class IpManager extends StateMachine { @Override public void exit() { - mProvisioningTimeoutAlarm.cancel(); stopDhcpAction(); if (mIpReachabilityMonitor != null) { @@ -1167,10 +1240,6 @@ public class IpManager extends StateMachine { break; } - case EVENT_PROVISIONING_TIMEOUT: - handleProvisioningFailure(); - break; - case EVENT_DHCPACTION_TIMEOUT: stopDhcpAction(); break; diff --git a/services/net/java/android/net/util/NetdService.java b/services/net/java/android/net/util/NetdService.java new file mode 100644 index 000000000000..153cb502afca --- /dev/null +++ b/services/net/java/android/net/util/NetdService.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.util; + +import android.net.INetd; +import android.os.ServiceManager; +import android.util.Log; + + +/** + * @hide + */ +public class NetdService { + private static final String TAG = NetdService.class.getSimpleName(); + private static final String NETD_SERVICE_NAME = "netd"; + + /** + * It is the caller's responsibility to check for a null return value + * and to handle RemoteException errors from invocations on the returned + * interface if, for example, netd dies and is restarted. + * + * @return an INetd instance or null. + */ + public static INetd getInstance() { + final INetd netdInstance = INetd.Stub.asInterface( + ServiceManager.getService(NETD_SERVICE_NAME)); + if (netdInstance == null) { + Log.w(TAG, "WARNING: returning null INetd instance."); + } + return netdInstance; + } +} diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index 07cc9c05f57a..07b26e83e934 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -57,6 +57,9 @@ import java.util.concurrent.TimeoutException; * spooler if needed, to make the timed remote calls, to handle * remote exceptions, and to bind/unbind to the remote instance as * needed. + * + * The calls might be blocking and need the main thread of to be unblocked to finish. Hence do not + * call this while holding any monitors that might need to be acquired the main thread. */ final class RemotePrintSpooler { diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 05301c1cb5f2..a91cdb38a15a 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -434,12 +434,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } public void createPrinterDiscoverySession(@NonNull IPrinterDiscoveryObserver observer) { + mSpooler.clearCustomPrinterIconCache(); + synchronized (mLock) { throwIfDestroyedLocked(); if (mPrinterDiscoverySession == null) { - mSpooler.clearCustomPrinterIconCache(); - // If we do not have a session, tell all service to create one. mPrinterDiscoverySession = new PrinterDiscoverySessionMediator(mContext) { @Override @@ -731,6 +731,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, @Override public void onCustomPrinterIconLoaded(PrinterId printerId, Icon icon) { + mSpooler.onCustomPrinterIconLoaded(printerId, icon); + synchronized (mLock) { throwIfDestroyedLocked(); @@ -738,7 +740,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, if (mPrinterDiscoverySession == null) { return; } - mSpooler.onCustomPrinterIconLoaded(printerId, icon); mPrinterDiscoverySession.onCustomPrinterIconLoadedLocked(printerId); } } @@ -979,18 +980,21 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, * Prune persistent state if a print service was uninstalled */ public void prunePrintServices() { + ArrayList<ComponentName> installedComponents; + synchronized (mLock) { - ArrayList<ComponentName> installedComponents = getInstalledComponents(); + installedComponents = getInstalledComponents(); // Remove unnecessary entries from persistent state "disabled services" boolean disabledServicesUninstalled = mDisabledServices.retainAll(installedComponents); if (disabledServicesUninstalled) { writeDisabledPrintServicesLocked(mDisabledServices); } - - // Remove unnecessary entries from persistent state "approved services" - mSpooler.pruneApprovedPrintServices(installedComponents); } + + // Remove unnecessary entries from persistent state "approved services" + mSpooler.pruneApprovedPrintServices(installedComponents); + } private void onConfigurationChangedLocked() { diff --git a/services/tests/servicestests/src/android/net/apf/ApfTest.java b/services/tests/servicestests/src/android/net/apf/ApfTest.java index bd761180c2a4..f7c61d15bb5f 100644 --- a/services/tests/servicestests/src/android/net/apf/ApfTest.java +++ b/services/tests/servicestests/src/android/net/apf/ApfTest.java @@ -20,6 +20,9 @@ import static android.system.OsConstants.*; import com.android.frameworks.servicestests.R; +import android.net.LinkAddress; +import android.net.LinkProperties; +import android.net.NetworkUtils; import android.net.apf.ApfCapabilities; import android.net.apf.ApfFilter; import android.net.apf.ApfGenerator; @@ -28,8 +31,6 @@ import android.net.apf.ApfGenerator.Register; import android.net.ip.IpManager; import android.net.metrics.IpConnectivityLog; import android.net.metrics.RaEvent; -import android.net.LinkAddress; -import android.net.LinkProperties; import android.os.ConditionVariable; import android.os.Parcelable; import android.system.ErrnoException; @@ -61,7 +62,7 @@ import libcore.io.Streams; * Tests for APF program generator and interpreter. * * Build, install and run with: - * runtest frameworks-services -c com.android.server.ApfTest + * runtest frameworks-services -c android.net.apf.ApfTest */ public class ApfTest extends AndroidTestCase { private static final int TIMEOUT_MS = 500; @@ -86,21 +87,45 @@ public class ApfTest extends AndroidTestCase { private final static boolean DROP_MULTICAST = true; private final static boolean ALLOW_MULTICAST = false; + private static String label(int code) { + switch (code) { + case PASS: return "PASS"; + case DROP: return "DROP"; + default: return "UNKNOWN"; + } + } + + private static void assertReturnCodesEqual(int expected, int got) { + assertEquals(label(expected), label(got)); + } + private void assertVerdict(int expected, byte[] program, byte[] packet, int filterAge) { - assertEquals(expected, apfSimulate(program, packet, filterAge)); + assertReturnCodesEqual(expected, apfSimulate(program, packet, filterAge)); + } + + private void assertVerdict(int expected, byte[] program, byte[] packet) { + assertReturnCodesEqual(expected, apfSimulate(program, packet, 0)); } private void assertPass(byte[] program, byte[] packet, int filterAge) { assertVerdict(PASS, program, packet, filterAge); } + private void assertPass(byte[] program, byte[] packet) { + assertVerdict(PASS, program, packet); + } + private void assertDrop(byte[] program, byte[] packet, int filterAge) { assertVerdict(DROP, program, packet, filterAge); } + private void assertDrop(byte[] program, byte[] packet) { + assertVerdict(DROP, program, packet); + } + private void assertVerdict(int expected, ApfGenerator gen, byte[] packet, int filterAge) throws IllegalInstructionException { - assertEquals(expected, apfSimulate(gen.generate(), packet, filterAge)); + assertReturnCodesEqual(expected, apfSimulate(gen.generate(), packet, filterAge)); } private void assertPass(ApfGenerator gen, byte[] packet, int filterAge) @@ -516,7 +541,7 @@ public class ApfTest extends AndroidTestCase { gen = new ApfGenerator(); gen.addLoadImmediate(Register.R0, 1); gen.addJumpIfBytesNotEqual(Register.R0, new byte[]{123}, gen.DROP_LABEL); - byte[] packet123 = new byte[]{0,123,0,0,0,0,0,0,0,0,0,0,0,0,0}; + byte[] packet123 = {0,123,0,0,0,0,0,0,0,0,0,0,0,0,0}; assertPass(gen, packet123, 0); gen = new ApfGenerator(); gen.addJumpIfBytesNotEqual(Register.R0, new byte[]{123}, gen.DROP_LABEL); @@ -524,7 +549,7 @@ public class ApfTest extends AndroidTestCase { gen = new ApfGenerator(); gen.addLoadImmediate(Register.R0, 1); gen.addJumpIfBytesNotEqual(Register.R0, new byte[]{1,2,30,4,5}, gen.DROP_LABEL); - byte[] packet12345 = new byte[]{0,1,2,3,4,5,0,0,0,0,0,0,0,0,0}; + byte[] packet12345 = {0,1,2,3,4,5,0,0,0,0,0,0,0,0,0}; assertDrop(gen, packet12345, 0); gen = new ApfGenerator(); gen.addLoadImmediate(Register.R0, 1); @@ -575,12 +600,12 @@ public class ApfTest extends AndroidTestCase { } private static class TestApfFilter extends ApfFilter { - public final static byte[] MOCK_MAC_ADDR = new byte[]{1,2,3,4,5,6}; + public final static byte[] MOCK_MAC_ADDR = {1,2,3,4,5,6}; private FileDescriptor mWriteSocket; public TestApfFilter(IpManager.Callback ipManagerCallback, boolean multicastFilter, IpConnectivityLog log) throws Exception { - super(new ApfCapabilities(2, 1536, ARPHRD_ETHER), NetworkInterface.getByName("lo"), + super(new ApfCapabilities(2, 1700, ARPHRD_ETHER), NetworkInterface.getByName("lo"), ipManagerCallback, multicastFilter, log); } @@ -620,19 +645,21 @@ public class ApfTest extends AndroidTestCase { private static final int ETH_HEADER_LEN = 14; private static final int ETH_DEST_ADDR_OFFSET = 0; private static final int ETH_ETHERTYPE_OFFSET = 12; - private static final byte[] ETH_BROADCAST_MAC_ADDRESS = new byte[]{ - (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; + private static final byte[] ETH_BROADCAST_MAC_ADDRESS = + {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; private static final int IPV4_VERSION_IHL_OFFSET = ETH_HEADER_LEN + 0; private static final int IPV4_PROTOCOL_OFFSET = ETH_HEADER_LEN + 9; private static final int IPV4_DEST_ADDR_OFFSET = ETH_HEADER_LEN + 16; + private static final byte[] IPV4_BROADCAST_ADDRESS = + {(byte) 255, (byte) 255, (byte) 255, (byte) 255}; private static final int IPV6_NEXT_HEADER_OFFSET = ETH_HEADER_LEN + 6; private static final int IPV6_HEADER_LEN = 40; private static final int IPV6_DEST_ADDR_OFFSET = ETH_HEADER_LEN + 24; // The IPv6 all nodes address ff02::1 private static final byte[] IPV6_ALL_NODES_ADDRESS = - new byte[]{ (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; + { (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; @@ -670,14 +697,14 @@ public class ApfTest extends AndroidTestCase { private static final int DHCP_CLIENT_MAC_OFFSET = ETH_HEADER_LEN + UDP_HEADER_LEN + 48; private static final int ARP_HEADER_OFFSET = ETH_HEADER_LEN; - private static final byte[] ARP_IPV4_REQUEST_HEADER = new byte[]{ + private static final byte[] ARP_IPV4_REQUEST_HEADER = { 0, 1, // Hardware type: Ethernet (1) 8, 0, // Protocol type: IP (0x0800) 6, // Hardware size: 6 4, // Protocol size: 4 0, 1 // Opcode: request (1) }; - private static final byte[] ARP_IPV4_REPLY_HEADER = new byte[]{ + private static final byte[] ARP_IPV4_REPLY_HEADER = { 0, 1, // Hardware type: Ethernet (1) 8, 0, // Protocol type: IP (0x0800) 6, // Hardware size: 6 @@ -686,38 +713,63 @@ public class ApfTest extends AndroidTestCase { }; private static final int ARP_TARGET_IP_ADDRESS_OFFSET = ETH_HEADER_LEN + 24; - private static final byte[] MOCK_IPV4_ADDR = new byte[]{10, 0, 0, 1}; - private static final byte[] ANOTHER_IPV4_ADDR = new byte[]{10, 0, 0, 2}; - private static final byte[] IPV4_ANY_HOST_ADDR = new byte[]{0, 0, 0, 0}; + private static final byte[] MOCK_IPV4_ADDR = {10, 0, 0, 1}; + private static final byte[] MOCK_BROADCAST_IPV4_ADDR = {10, 0, 31, (byte) 255}; // prefix = 19 + private static final byte[] MOCK_MULTICAST_IPV4_ADDR = {(byte) 224, 0, 0, 1}; + private static final byte[] ANOTHER_IPV4_ADDR = {10, 0, 0, 2}; + private static final byte[] IPV4_ANY_HOST_ADDR = {0, 0, 0, 0}; @LargeTest public void testApfFilterIPv4() throws Exception { MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); + LinkAddress link = new LinkAddress(InetAddress.getByAddress(MOCK_IPV4_ADDR), 19); + LinkProperties lp = new LinkProperties(); + lp.addLinkAddress(link); + ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, DROP_MULTICAST, mLog); + apfFilter.setLinkProperties(lp); + byte[] program = ipManagerCallback.getApfProgram(); // Verify empty packet of 100 zero bytes is passed ByteBuffer packet = ByteBuffer.wrap(new byte[100]); - assertPass(program, packet.array(), 0); + assertPass(program, packet.array()); // Verify unicast IPv4 packet is passed + put(packet, ETH_DEST_ADDR_OFFSET, TestApfFilter.MOCK_MAC_ADDR); packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); - assertPass(program, packet.array(), 0); - - // Verify broadcast IPv4, not DHCP to us, is dropped - packet.put(ETH_BROADCAST_MAC_ADDRESS); - assertDrop(program, packet.array(), 0); + put(packet, IPV4_DEST_ADDR_OFFSET, MOCK_IPV4_ADDR); + assertPass(program, packet.array()); + + // Verify L2 unicast to IPv4 broadcast addresses is dropped (b/30231088) + put(packet, IPV4_DEST_ADDR_OFFSET, IPV4_BROADCAST_ADDRESS); + assertDrop(program, packet.array()); + put(packet, IPV4_DEST_ADDR_OFFSET, MOCK_BROADCAST_IPV4_ADDR); + assertDrop(program, packet.array()); + + // Verify multicast/broadcast IPv4, not DHCP to us, is dropped + put(packet, ETH_DEST_ADDR_OFFSET, ETH_BROADCAST_MAC_ADDRESS); + assertDrop(program, packet.array()); packet.put(IPV4_VERSION_IHL_OFFSET, (byte)0x45); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); packet.put(IPV4_PROTOCOL_OFFSET, (byte)IPPROTO_UDP); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); packet.putShort(UDP_DESTINATION_PORT_OFFSET, (short)DHCP_CLIENT_PORT); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); + put(packet, IPV4_DEST_ADDR_OFFSET, MOCK_MULTICAST_IPV4_ADDR); + assertDrop(program, packet.array()); + put(packet, IPV4_DEST_ADDR_OFFSET, MOCK_BROADCAST_IPV4_ADDR); + assertDrop(program, packet.array()); + put(packet, IPV4_DEST_ADDR_OFFSET, IPV4_BROADCAST_ADDRESS); + assertDrop(program, packet.array()); // Verify broadcast IPv4 DHCP to us is passed - packet.position(DHCP_CLIENT_MAC_OFFSET); - packet.put(TestApfFilter.MOCK_MAC_ADDR); - assertPass(program, packet.array(), 0); + put(packet, DHCP_CLIENT_MAC_OFFSET, TestApfFilter.MOCK_MAC_ADDR); + assertPass(program, packet.array()); + + // Verify unicast IPv4 DHCP to us is passed + put(packet, ETH_DEST_ADDR_OFFSET, TestApfFilter.MOCK_MAC_ADDR); + assertPass(program, packet.array()); apfFilter.shutdown(); } @@ -731,82 +783,108 @@ public class ApfTest extends AndroidTestCase { // Verify empty IPv6 packet is passed ByteBuffer packet = ByteBuffer.wrap(new byte[100]); packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IPV6); - assertPass(program, packet.array(), 0); + assertPass(program, packet.array()); // Verify empty ICMPv6 packet is passed packet.put(IPV6_NEXT_HEADER_OFFSET, (byte)IPPROTO_ICMPV6); - assertPass(program, packet.array(), 0); + assertPass(program, packet.array()); // Verify empty ICMPv6 NA packet is passed packet.put(ICMP6_TYPE_OFFSET, (byte)ICMP6_NEIGHBOR_ANNOUNCEMENT); - assertPass(program, packet.array(), 0); + assertPass(program, packet.array()); // Verify ICMPv6 NA to ff02::1 is dropped - packet.position(IPV6_DEST_ADDR_OFFSET); - packet.put(IPV6_ALL_NODES_ADDRESS); - assertDrop(program, packet.array(), 0); + put(packet, IPV6_DEST_ADDR_OFFSET, IPV6_ALL_NODES_ADDRESS); + assertDrop(program, packet.array()); apfFilter.shutdown(); } @LargeTest public void testApfFilterMulticast() throws Exception { + final byte[] unicastIpv4Addr = {(byte)192,0,2,63}; + final byte[] broadcastIpv4Addr = {(byte)192,0,2,(byte)255}; + final byte[] multicastIpv4Addr = {(byte)224,0,0,1}; + final byte[] multicastIpv6Addr = {(byte)0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte)0xfb}; + MockIpManagerCallback ipManagerCallback = new MockIpManagerCallback(); + LinkAddress link = new LinkAddress(InetAddress.getByAddress(unicastIpv4Addr), 24); + LinkProperties lp = new LinkProperties(); + lp.addLinkAddress(link); + ApfFilter apfFilter = new TestApfFilter(ipManagerCallback, ALLOW_MULTICAST, mLog); + apfFilter.setLinkProperties(lp); + byte[] program = ipManagerCallback.getApfProgram(); // Construct IPv4 and IPv6 multicast packets. ByteBuffer mcastv4packet = ByteBuffer.wrap(new byte[100]); mcastv4packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); - mcastv4packet.position(IPV4_DEST_ADDR_OFFSET); - mcastv4packet.put(new byte[]{(byte)224,0,0,1}); + put(mcastv4packet, IPV4_DEST_ADDR_OFFSET, multicastIpv4Addr); ByteBuffer mcastv6packet = ByteBuffer.wrap(new byte[100]); mcastv6packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IPV6); mcastv6packet.put(IPV6_NEXT_HEADER_OFFSET, (byte)IPPROTO_UDP); - mcastv6packet.position(IPV6_DEST_ADDR_OFFSET); - mcastv6packet.put(new byte[]{(byte)0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,(byte)0xfb}); + put(mcastv6packet, IPV6_DEST_ADDR_OFFSET, multicastIpv6Addr); // Construct IPv4 broadcast packet. - ByteBuffer bcastv4packet = ByteBuffer.wrap(new byte[100]); - bcastv4packet.put(ETH_BROADCAST_MAC_ADDRESS); - bcastv4packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); - bcastv4packet.position(IPV4_DEST_ADDR_OFFSET); - bcastv4packet.put(new byte[]{(byte)192,(byte)0,(byte)2,(byte)63}); + ByteBuffer bcastv4packet1 = ByteBuffer.wrap(new byte[100]); + bcastv4packet1.put(ETH_BROADCAST_MAC_ADDRESS); + bcastv4packet1.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); + put(bcastv4packet1, IPV4_DEST_ADDR_OFFSET, multicastIpv4Addr); + + ByteBuffer bcastv4packet2 = ByteBuffer.wrap(new byte[100]); + bcastv4packet2.put(ETH_BROADCAST_MAC_ADDRESS); + bcastv4packet2.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); + put(bcastv4packet2, IPV4_DEST_ADDR_OFFSET, IPV4_BROADCAST_ADDRESS); + + // Construct IPv4 broadcast with L2 unicast address packet (b/30231088). + ByteBuffer bcastv4unicastl2packet = ByteBuffer.wrap(new byte[100]); + bcastv4unicastl2packet.put(TestApfFilter.MOCK_MAC_ADDR); + bcastv4unicastl2packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_IP); + put(bcastv4unicastl2packet, IPV4_DEST_ADDR_OFFSET, broadcastIpv4Addr); // Verify initially disabled multicast filter is off - assertPass(program, bcastv4packet.array(), 0); - assertPass(program, mcastv4packet.array(), 0); - assertPass(program, mcastv6packet.array(), 0); + assertPass(program, mcastv4packet.array()); + assertPass(program, mcastv6packet.array()); + assertPass(program, bcastv4packet1.array()); + assertPass(program, bcastv4packet2.array()); + assertPass(program, bcastv4unicastl2packet.array()); // Turn on multicast filter and verify it works ipManagerCallback.resetApfProgramWait(); apfFilter.setMulticastFilter(true); program = ipManagerCallback.getApfProgram(); - assertDrop(program, bcastv4packet.array(), 0); - assertDrop(program, mcastv4packet.array(), 0); - assertDrop(program, mcastv6packet.array(), 0); + assertDrop(program, mcastv4packet.array()); + assertDrop(program, mcastv6packet.array()); + assertDrop(program, bcastv4packet1.array()); + assertDrop(program, bcastv4packet2.array()); + assertDrop(program, bcastv4unicastl2packet.array()); // Turn off multicast filter and verify it's off ipManagerCallback.resetApfProgramWait(); apfFilter.setMulticastFilter(false); program = ipManagerCallback.getApfProgram(); - assertPass(program, bcastv4packet.array(), 0); - assertPass(program, mcastv4packet.array(), 0); - assertPass(program, mcastv6packet.array(), 0); + assertPass(program, mcastv4packet.array()); + assertPass(program, mcastv6packet.array()); + assertPass(program, bcastv4packet1.array()); + assertPass(program, bcastv4packet2.array()); + assertPass(program, bcastv4unicastl2packet.array()); // Verify it can be initialized to on ipManagerCallback.resetApfProgramWait(); apfFilter.shutdown(); apfFilter = new TestApfFilter(ipManagerCallback, DROP_MULTICAST, mLog); + apfFilter.setLinkProperties(lp); program = ipManagerCallback.getApfProgram(); - assertDrop(program, bcastv4packet.array(), 0); - assertDrop(program, mcastv4packet.array(), 0); - assertDrop(program, mcastv6packet.array(), 0); + assertDrop(program, mcastv4packet.array()); + assertDrop(program, mcastv6packet.array()); + assertDrop(program, bcastv4packet1.array()); + assertDrop(program, bcastv4unicastl2packet.array()); // Verify that ICMPv6 multicast is not dropped. mcastv6packet.put(IPV6_NEXT_HEADER_OFFSET, (byte)IPPROTO_ICMPV6); - assertPass(program, mcastv6packet.array(), 0); + assertPass(program, mcastv6packet.array()); apfFilter.shutdown(); } @@ -819,17 +897,17 @@ public class ApfTest extends AndroidTestCase { private void verifyArpFilter(byte[] program, int filterResult) { // Verify ARP request packet - assertPass(program, arpRequestBroadcast(MOCK_IPV4_ADDR), 0); - assertVerdict(filterResult, program, arpRequestBroadcast(ANOTHER_IPV4_ADDR), 0); - assertDrop(program, arpRequestBroadcast(IPV4_ANY_HOST_ADDR), 0); + assertPass(program, arpRequestBroadcast(MOCK_IPV4_ADDR)); + assertVerdict(filterResult, program, arpRequestBroadcast(ANOTHER_IPV4_ADDR)); + assertDrop(program, arpRequestBroadcast(IPV4_ANY_HOST_ADDR)); // Verify unicast ARP reply packet is always accepted. - assertPass(program, arpReplyUnicast(MOCK_IPV4_ADDR), 0); - assertPass(program, arpReplyUnicast(ANOTHER_IPV4_ADDR), 0); - assertPass(program, arpReplyUnicast(IPV4_ANY_HOST_ADDR), 0); + assertPass(program, arpReplyUnicast(MOCK_IPV4_ADDR)); + assertPass(program, arpReplyUnicast(ANOTHER_IPV4_ADDR)); + assertPass(program, arpReplyUnicast(IPV4_ANY_HOST_ADDR)); // Verify GARP reply packets are always filtered - assertDrop(program, garpReply(), 0); + assertDrop(program, garpReply()); } @LargeTest @@ -855,34 +933,26 @@ public class ApfTest extends AndroidTestCase { private static byte[] arpRequestBroadcast(byte[] tip) { ByteBuffer packet = ByteBuffer.wrap(new byte[100]); packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_ARP); - packet.position(ETH_DEST_ADDR_OFFSET); - packet.put(ETH_BROADCAST_MAC_ADDRESS); - packet.position(ARP_HEADER_OFFSET); - packet.put(ARP_IPV4_REQUEST_HEADER); - packet.position(ARP_TARGET_IP_ADDRESS_OFFSET); - packet.put(tip); + put(packet, ETH_DEST_ADDR_OFFSET, ETH_BROADCAST_MAC_ADDRESS); + put(packet, ARP_HEADER_OFFSET, ARP_IPV4_REPLY_HEADER); + put(packet, ARP_TARGET_IP_ADDRESS_OFFSET, tip); return packet.array(); } private static byte[] arpReplyUnicast(byte[] tip) { ByteBuffer packet = ByteBuffer.wrap(new byte[100]); packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_ARP); - packet.position(ARP_HEADER_OFFSET); - packet.put(ARP_IPV4_REPLY_HEADER); - packet.position(ARP_TARGET_IP_ADDRESS_OFFSET); - packet.put(tip); + put(packet, ARP_HEADER_OFFSET, ARP_IPV4_REPLY_HEADER); + put(packet, ARP_TARGET_IP_ADDRESS_OFFSET, tip); return packet.array(); } private static byte[] garpReply() { ByteBuffer packet = ByteBuffer.wrap(new byte[100]); packet.putShort(ETH_ETHERTYPE_OFFSET, (short)ETH_P_ARP); - packet.position(ETH_DEST_ADDR_OFFSET); - packet.put(ETH_BROADCAST_MAC_ADDRESS); - packet.position(ARP_HEADER_OFFSET); - packet.put(ARP_IPV4_REPLY_HEADER); - packet.position(ARP_TARGET_IP_ADDRESS_OFFSET); - packet.put(IPV4_ANY_HOST_ADDR); + put(packet, ETH_DEST_ADDR_OFFSET, ETH_BROADCAST_MAC_ADDRESS); + put(packet, ARP_HEADER_OFFSET, ARP_IPV4_REPLY_HEADER); + put(packet, ARP_TARGET_IP_ADDRESS_OFFSET, IPV4_ANY_HOST_ADDR); return packet.array(); } @@ -893,22 +963,22 @@ public class ApfTest extends AndroidTestCase { byte[] program = ipManagerCallback.getApfProgram(); // Verify new program should drop RA for 1/6th its lifetime - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); assertDrop(program, packet.array(), lifetime/6); assertPass(program, packet.array(), lifetime/6 + 1); assertPass(program, packet.array(), lifetime); // Verify RA checksum is ignored packet.putShort(ICMP6_RA_CHECKSUM_OFFSET, (short)12345); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); packet.putShort(ICMP6_RA_CHECKSUM_OFFSET, (short)-12345); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); // Verify other changes to RA make it not match filter packet.put(0, (byte)-1); - assertPass(program, packet.array(), 0); + assertPass(program, packet.array()); packet.put(0, (byte)0); - assertDrop(program, packet.array(), 0); + assertDrop(program, packet.array()); } // Test that when ApfFilter is shown the given packet, it generates a program to filter it @@ -973,7 +1043,7 @@ public class ApfTest extends AndroidTestCase { basePacket.putShort(ICMP6_RA_ROUTER_LIFETIME_OFFSET, (short)1000); basePacket.position(IPV6_DEST_ADDR_OFFSET); basePacket.put(IPV6_ALL_NODES_ADDRESS); - assertPass(program, basePacket.array(), 0); + assertPass(program, basePacket.array()); testRaLifetime(apfFilter, ipManagerCallback, basePacket, 1000); verifyRaEvent(new RaEvent(1000, -1, -1, -1, -1, -1)); @@ -1069,6 +1139,13 @@ public class ApfTest extends AndroidTestCase { return file.getAbsolutePath(); } + private static void put(ByteBuffer buffer, int position, byte[] bytes) { + final int original = buffer.position(); + buffer.position(position); + buffer.put(bytes); + buffer.position(original); + } + /** * Call the APF interpreter the run {@code program} on {@code packet} pretending the * filter was installed {@code filter_age} seconds ago. @@ -1089,4 +1166,30 @@ public class ApfTest extends AndroidTestCase { */ private native static boolean compareBpfApf(String filter, String pcap_filename, byte[] apf_program); + + public void testBytesToInt() { + assertEquals(0x00000000, ApfFilter.bytesToInt(IPV4_ANY_HOST_ADDR)); + assertEquals(0xffffffff, ApfFilter.bytesToInt(IPV4_BROADCAST_ADDRESS)); + assertEquals(0x0a000001, ApfFilter.bytesToInt(MOCK_IPV4_ADDR)); + assertEquals(0x0a000002, ApfFilter.bytesToInt(ANOTHER_IPV4_ADDR)); + assertEquals(0x0a001fff, ApfFilter.bytesToInt(MOCK_BROADCAST_IPV4_ADDR)); + assertEquals(0xe0000001, ApfFilter.bytesToInt(MOCK_MULTICAST_IPV4_ADDR)); + } + + public void testBroadcastAddress() throws Exception { + assertEqualsIp("255.255.255.255", ApfFilter.ipv4BroadcastAddress(IPV4_ANY_HOST_ADDR, 0)); + assertEqualsIp("0.0.0.0", ApfFilter.ipv4BroadcastAddress(IPV4_ANY_HOST_ADDR, 32)); + assertEqualsIp("0.0.3.255", ApfFilter.ipv4BroadcastAddress(IPV4_ANY_HOST_ADDR, 22)); + assertEqualsIp("0.255.255.255", ApfFilter.ipv4BroadcastAddress(IPV4_ANY_HOST_ADDR, 8)); + + assertEqualsIp("255.255.255.255", ApfFilter.ipv4BroadcastAddress(MOCK_IPV4_ADDR, 0)); + assertEqualsIp("10.0.0.1", ApfFilter.ipv4BroadcastAddress(MOCK_IPV4_ADDR, 32)); + assertEqualsIp("10.0.0.255", ApfFilter.ipv4BroadcastAddress(MOCK_IPV4_ADDR, 24)); + assertEqualsIp("10.0.255.255", ApfFilter.ipv4BroadcastAddress(MOCK_IPV4_ADDR, 16)); + } + + public void assertEqualsIp(String expected, int got) throws Exception { + int want = ApfFilter.bytesToInt(InetAddress.getByName(expected).getAddress()); + assertEquals(want, got); + } } diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index fa2381451af9..ace6c6e86a66 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -719,6 +719,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { } public void tearDown() throws Exception { + setMobileDataAlwaysOn(false); if (mCellNetworkAgent != null) { mCellNetworkAgent.disconnect(); } if (mWiFiNetworkAgent != null) { mWiFiNetworkAgent.disconnect(); } mCellNetworkAgent = mWiFiNetworkAgent = null; @@ -1816,6 +1817,85 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCm.unregisterNetworkCallback(cellNetworkCallback); } + private void setMobileDataAlwaysOn(boolean enable) { + ContentResolver cr = mServiceContext.getContentResolver(); + Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, enable ? 1 : 0); + mService.updateMobileDataAlwaysOn(); + mService.waitForIdle(); + } + + private boolean isForegroundNetwork(MockNetworkAgent network) { + NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork()); + assertNotNull(nc); + return nc.hasCapability(NET_CAPABILITY_FOREGROUND); + } + + @SmallTest + public void testBackgroundNetworks() throws Exception { + // Create a background request. We can't do this ourselves because ConnectivityService + // doesn't have an API for it. So just turn on mobile data always on. + setMobileDataAlwaysOn(true); + final NetworkRequest request = new NetworkRequest.Builder().build(); + final NetworkRequest fgRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_FOREGROUND).build(); + final TestNetworkCallback callback = new TestNetworkCallback(); + final TestNetworkCallback fgCallback = new TestNetworkCallback(); + mCm.registerNetworkCallback(request, callback); + mCm.registerNetworkCallback(fgRequest, fgCallback); + + mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); + mCellNetworkAgent.connect(true); + callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + assertTrue(isForegroundNetwork(mCellNetworkAgent)); + + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + mWiFiNetworkAgent.connect(true); + + // When wifi connects, cell lingers. + callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + fgCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + fgCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + assertTrue(isForegroundNetwork(mCellNetworkAgent)); + assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); + + // When lingering is complete, cell is still there but is now in the background. + fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, TEST_LINGER_DELAY_MS); + callback.assertNoCallback(); + assertFalse(isForegroundNetwork(mCellNetworkAgent)); + assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); + + // File a cell request and check that cell comes into the foreground. + final NetworkRequest cellRequest = new NetworkRequest.Builder() + .addTransportType(TRANSPORT_CELLULAR).build(); + final TestNetworkCallback cellCallback = new TestNetworkCallback(); + mCm.requestNetwork(cellRequest, cellCallback); + cellCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + callback.assertNoCallback(); // Because the network is already up. + assertTrue(isForegroundNetwork(mCellNetworkAgent)); + assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); + + // Release the request. The network immediately goes into the background, since it was not + // lingering. + mCm.unregisterNetworkCallback(cellCallback); + fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); + callback.assertNoCallback(); + assertFalse(isForegroundNetwork(mCellNetworkAgent)); + assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); + + // Disconnect wifi and check that cell is foreground again. + mWiFiNetworkAgent.disconnect(); + callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); + fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + assertTrue(isForegroundNetwork(mCellNetworkAgent)); + + mCm.unregisterNetworkCallback(callback); + mCm.unregisterNetworkCallback(fgCallback); + } + @SmallTest public void testRequestBenchmark() throws Exception { // Benchmarks connecting and switching performance in the presence of a large number of @@ -1921,8 +2001,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Turn on mobile data always on. The factory starts looking again. testFactory.expectAddRequests(1); - Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, 1); - mService.updateMobileDataAlwaysOn(); + setMobileDataAlwaysOn(true); testFactory.waitForNetworkRequests(2); assertTrue(testFactory.getMyStartRequested()); @@ -1942,8 +2021,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Turn off mobile data always on and expect the request to disappear... testFactory.expectRemoveRequests(1); - Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, 0); - mService.updateMobileDataAlwaysOn(); + setMobileDataAlwaysOn(false); testFactory.waitForNetworkRequests(1); // ... and cell data to be torn down. diff --git a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java index 404c14271b89..a3d0afab88eb 100644 --- a/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accounts/AccountManagerServiceTest.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.accounts.Account; +import android.accounts.AccountManagerInternal; import android.accounts.AuthenticatorDescription; import android.app.AppOpsManager; import android.app.Notification; @@ -44,6 +45,8 @@ import android.test.mock.MockContext; import android.test.mock.MockPackageManager; import android.util.Log; +import com.android.server.LocalServices; + import java.io.File; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -73,6 +76,7 @@ public class AccountManagerServiceTest extends AndroidTestCase { SQLiteDatabase.deleteDatabase(new File(mAms.getCeDatabaseName(UserHandle.USER_SYSTEM))); SQLiteDatabase.deleteDatabase(new File(mAms.getDeDatabaseName(UserHandle.USER_SYSTEM))); SQLiteDatabase.deleteDatabase(new File(mAms.getPreNDatabaseName(UserHandle.USER_SYSTEM))); + LocalServices.removeServiceForTest(AccountManagerInternal.class); super.tearDown(); } @@ -282,6 +286,7 @@ public class AccountManagerServiceTest extends AndroidTestCase { private AccountManagerService createAccountManagerService(Context mockContext, Context realContext) { + LocalServices.removeServiceForTest(AccountManagerInternal.class); return new MyAccountManagerService(mockContext, new MyMockPackageManager(), new MockAccountAuthenticatorCache(), realContext); } @@ -420,6 +425,11 @@ public class AccountManagerServiceTest extends AndroidTestCase { public int checkSignatures(final int uid1, final int uid2) { return PackageManager.SIGNATURE_MATCH; } + + @Override + public void addOnPermissionsChangeListener( + OnPermissionsChangedListener listener) { + } } static public class MyAccountManagerService extends AccountManagerService { diff --git a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java index e440a0d603d2..984a484dadc2 100644 --- a/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java +++ b/services/tests/servicestests/src/com/android/server/am/TaskPersisterTest.java @@ -62,7 +62,7 @@ public class TaskPersisterTest extends AndroidTestCase { for (int i = 0; i < 100; i++) { taskIdsOnFile.put(getRandomTaskIdForUser(testUserId), true); } - mTaskPersister.maybeWritePersistedTaskIdsForUser(taskIdsOnFile, testUserId); + mTaskPersister.writePersistedTaskIdsForUser(taskIdsOnFile, testUserId); SparseBooleanArray newTaskIdsOnFile = mTaskPersister .loadPersistedTaskIdsForUser(testUserId); assertTrue("TaskIds written differ from TaskIds read back from file", diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 1c7a138468cf..792f3001c049 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -390,6 +390,11 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override + void injectRunOnNewThread(Runnable r) { + runOnHandler(r); + } + + @Override void injectEnforceCallingPermission(String permission, String message) { if (!mCallerPermissions.contains(permission)) { throw new SecurityException("Missing permission: " + permission); @@ -402,6 +407,11 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override + String injectBuildFingerprint() { + return mInjectedBuildFingerprint; + } + + @Override void wtf(String message, Throwable th) { // During tests, WTF is fatal. fail(message + " exception: " + th + "\n" + Log.getStackTraceString(th)); @@ -523,6 +533,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { protected Map<String, PackageInfo> mInjectedPackages; protected Set<PackageWithUser> mUninstalledPackages; + protected Set<String> mSystemPackages; protected PackageManager mMockPackageManager; protected PackageManagerInternal mMockPackageManagerInternal; @@ -623,6 +634,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { protected static final String PACKAGE_FALLBACK_LAUNCHER_NAME = "fallback"; protected static final int PACKAGE_FALLBACK_LAUNCHER_PRIORITY = -999; + protected String mInjectedBuildFingerprint = "build1"; + static { QUERY_ALL.setQueryFlags( ShortcutQuery.FLAG_GET_ALL_KINDS); @@ -672,6 +685,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { pi -> pi.applicationInfo.flags &= ~ApplicationInfo.FLAG_ALLOW_BACKUP); mUninstalledPackages = new HashSet<>(); + mSystemPackages = new HashSet<>(); mInjectedFilePathRoot = new File(getTestContext().getCacheDir(), "test-files"); @@ -921,6 +935,12 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { }); } + protected void setPackageLastUpdateTime(String packageName, long value) { + updatePackageInfo(packageName, pi -> { + pi.lastUpdateTime = value; + }); + } + protected void uninstallPackage(int userId, String packageName) { if (ENABLE_DUMP) { Log.v(TAG, "Unnstall package " + packageName + " / " + userId); @@ -952,6 +972,9 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { if (mUninstalledPackages.contains(PackageWithUser.of(userId, packageName))) { ret.applicationInfo.flags &= ~ApplicationInfo.FLAG_INSTALLED; } + if (mSystemPackages.contains(packageName)) { + ret.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; + } if (getSignatures) { ret.signatures = pi.signatures; diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 253334eec9cf..143398f63860 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -3945,11 +3945,11 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mInjectedPackages.remove(CALLING_PACKAGE_1); mInjectedPackages.remove(CALLING_PACKAGE_3); - mService.handleUnlockUser(USER_0); + mService.checkPackageChanges(USER_0); assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0)); assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0)); - assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0)); + assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_0)); // --------------- assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_10)); assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_10)); assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_3, "s1", USER_10)); @@ -3961,7 +3961,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(bitmapDirectoryExists(CALLING_PACKAGE_2, USER_10)); assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10)); - mService.handleUnlockUser(USER_10); + mService.checkPackageChanges(USER_10); assertNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_1, "s1", USER_0)); assertNotNull(mService.getPackageShortcutForTest(CALLING_PACKAGE_2, "s1", USER_0)); @@ -4154,7 +4154,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { updatePackageVersion(CALLING_PACKAGE_1, 1); // Then send the broadcast, to only user-0. - mService.mPackageMonitor.onReceive(getTestContext(), + mService.mPackageMonitor.onReceive(getTestContext(), genPackageUpdateIntent(CALLING_PACKAGE_1, USER_0)); waitOnMainThread(); @@ -4186,10 +4186,13 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mInjectedCurrentTimeMillis = START_TIME + 200; mRunningUsers.put(USER_10, true); + mUnlockedUsers.put(USER_10, true); reset(c0); reset(c10); + setPackageLastUpdateTime(CALLING_PACKAGE_1, mInjectedCurrentTimeMillis); mService.handleUnlockUser(USER_10); + mService.checkPackageChanges(USER_10); waitOnMainThread(); @@ -4221,7 +4224,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // Then send the broadcast, to only user-0. mService.mPackageMonitor.onReceive(getTestContext(), genPackageUpdateIntent(CALLING_PACKAGE_2, USER_0)); - mService.handleUnlockUser(USER_10); + mService.checkPackageChanges(USER_10); waitOnMainThread(); @@ -4243,9 +4246,9 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { updatePackageVersion(CALLING_PACKAGE_3, 100); // Then send the broadcast, to only user-0. - mService.mPackageMonitor.onReceive(getTestContext(), + mService.mPackageMonitor.onReceive(getTestContext(), genPackageUpdateIntent(CALLING_PACKAGE_3, USER_0)); - mService.handleUnlockUser(USER_10); + mService.checkPackageChanges(USER_10); waitOnMainThread(); @@ -4344,6 +4347,128 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } + public void testHandlePackageUpdate_systemAppUpdate() { + + // Package1 is a system app. Package 2 is not a system app, so it's not scanned + // in this test at all. + mSystemPackages.add(CALLING_PACKAGE_1); + + // Initial state: no shortcuts. + mService.checkPackageChanges(USER_0); + + assertEquals(mInjectedCurrentTimeMillis, + mService.getUserShortcutsLocked(USER_0).getLastAppScanTime()); + assertEquals(mInjectedBuildFingerprint, + mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint()); + + // They have no shortcuts. + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Next. + // Update the packages -- now they have 1 manifest shortcut. + // But checkPackageChanges() don't notice it, since their version code / timestamp haven't + // changed. + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), + R.xml.shortcut_1); + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()), + R.xml.shortcut_1); + mInjectedCurrentTimeMillis += 1000; + mService.checkPackageChanges(USER_0); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Next. + // Update the build finger print. All system apps will be scanned now. + mInjectedBuildFingerprint = "update1"; + mInjectedCurrentTimeMillis += 1000; + mService.checkPackageChanges(USER_0); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("ms1"); + }); + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Next. + // Update manifest shortcuts. + mInjectedBuildFingerprint = "update2"; + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), + R.xml.shortcut_2); + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_2, ShortcutActivity.class.getName()), + R.xml.shortcut_2); + mInjectedCurrentTimeMillis += 1000; + mService.checkPackageChanges(USER_0); + + // Fingerprint hasn't changed, so CALLING_PACKAGE_1 wasn't scanned. + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("ms1"); + }); + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Update the fingerprint, but CALLING_PACKAGE_1's version code hasn't changed, so + // still not scanned. + mInjectedBuildFingerprint = "update2"; + mInjectedCurrentTimeMillis += 1000; + mService.checkPackageChanges(USER_0); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("ms1"); + }); + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Now update the version code, so CALLING_PACKAGE_1 is scanned again. + mInjectedBuildFingerprint = "update3"; + mInjectedCurrentTimeMillis += 1000; + updatePackageVersion(CALLING_PACKAGE_1, 1); + mService.checkPackageChanges(USER_0); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("ms1", "ms2"); + }); + runWithCaller(CALLING_PACKAGE_2, USER_0, () -> { + assertWith(getCallerShortcuts()) + .isEmpty(); + }); + + // Make sure getLastAppScanTime / getLastAppScanOsFingerprint are persisted. + initService(); + assertEquals(mInjectedCurrentTimeMillis, + mService.getUserShortcutsLocked(USER_0).getLastAppScanTime()); + assertEquals(mInjectedBuildFingerprint, + mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint()); + } + public void testHandlePackageChanged() { final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1"); final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2"); @@ -5234,6 +5359,12 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * It's the case with preintalled apps -- when applyRestore() is called, the system * apps are already installed, so manifest shortcuts need to be re-published. + * + * Also, when a restore target app is already installed, and + * - if it has allowBackup=true, we'll restore normally, so all existing shortcuts will be + * replaced. (but manifest shortcuts will be re-published anyway.) We log a warning on + * logcat. + * - if it has allowBackup=false, we don't touch any of the existing shortcuts. */ public void testBackupAndRestore_appAlreadyInstalledWhenRestored() { // Pre-backup. Same as testBackupAndRestore_manifestRePublished(). @@ -5265,6 +5396,19 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.mPackageMonitor.onReceive(mServiceContext, genPackageAddIntent(CALLING_PACKAGE_1, USER_0)); + // Set up shortcuts for package 3, which won't be backed up / restored. + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_3, ShortcutActivity.class.getName()), + R.xml.shortcut_1); + updatePackageVersion(CALLING_PACKAGE_3, 1); + mService.mPackageMonitor.onReceive(mServiceContext, + genPackageAddIntent(CALLING_PACKAGE_3, USER_0)); + + runWithCaller(CALLING_PACKAGE_3, USER_0, () -> { + assertTrue(getManager().setDynamicShortcuts(list( + makeShortcut("s1")))); + }); + // Make sure the manifest shortcuts have been published. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertWith(getCallerShortcuts()) @@ -5290,6 +5434,11 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .areAllDisabled(); }); + runWithCaller(CALLING_PACKAGE_3, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("s1", "ms1"); + }); + // Backup and *without restarting the service, just call applyRestore()*. { int prevUid = mInjectedCallingUid; @@ -5329,6 +5478,12 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .areAllNotDynamic() ; }); + + // Package 3 still has the same shortcuts. + runWithCaller(CALLING_PACKAGE_3, USER_0, () -> { + assertWith(getCallerShortcuts()) + .haveIds("s1", "ms1"); + }); } public void testSaveAndLoad_crossProfile() { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 43d2a1f1156c..a04034e3f764 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -535,6 +535,18 @@ public class VoiceInteractionManagerService extends SystemService { + " user=" + userHandle); } + ComponentName getCurAssistant(int userHandle) { + String curAssistant = Settings.Secure.getStringForUser( + mContext.getContentResolver(), + Settings.Secure.ASSISTANT, userHandle); + if (TextUtils.isEmpty(curAssistant)) { + return null; + } + if (DEBUG) Slog.d(TAG, "getCurAssistant curAssistant=" + curAssistant + + " user=" + userHandle); + return ComponentName.unflattenFromString(curAssistant); + } + void resetCurAssistant(int userHandle) { Settings.Secure.putStringForUser(mContext.getContentResolver(), Settings.Secure.ASSISTANT, null, userHandle); @@ -1178,6 +1190,7 @@ public class VoiceInteractionManagerService extends SystemService { synchronized (VoiceInteractionManagerServiceStub.this) { ComponentName curInteractor = getCurInteractor(userHandle); ComponentName curRecognizer = getCurRecognizer(userHandle); + ComponentName curAssistant = getCurAssistant(userHandle); if (curRecognizer == null) { // Could a new recognizer appear when we don't have one pre-installed? if (anyPackagesAppearing()) { @@ -1196,6 +1209,7 @@ public class VoiceInteractionManagerService extends SystemService { // the default config. setCurInteractor(null, userHandle); setCurRecognizer(null, userHandle); + resetCurAssistant(userHandle); initForUser(userHandle); return; } @@ -1212,6 +1226,20 @@ public class VoiceInteractionManagerService extends SystemService { return; } + if (curAssistant != null) { + int change = isPackageDisappearing(curAssistant.getPackageName()); + if (change == PACKAGE_PERMANENT_CHANGE) { + // If the currently set assistant is being removed, then we should + // reset back to the default state (which is probably that we prefer + // to have the default full voice interactor enabled). + setCurInteractor(null, userHandle); + setCurRecognizer(null, userHandle); + resetCurAssistant(userHandle); + initForUser(userHandle); + return; + } + } + // There is no interactor, so just deal with a simple recognizer. int change = isPackageDisappearing(curRecognizer.getPackageName()); if (change == PACKAGE_PERMANENT_CHANGE diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index a093d54568d3..c0061859bf60 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -327,7 +327,7 @@ public abstract class Connection extends Conferenceable { * * @hide */ - public static final int PROPERTY_SHOW_CALLBACK_NUMBER = 1<<0; + public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1<<0; /** * Whether the call is a generic conference, where we do not know the precise state of @@ -655,8 +655,8 @@ public abstract class Connection extends Conferenceable { builder.append("Properties:"); } - if (can(properties, PROPERTY_SHOW_CALLBACK_NUMBER)) { - builder.append(isLong ? " PROPERTY_SHOW_CALLBACK_NUMBER" : " clbk"); + if (can(properties, PROPERTY_EMERGENCY_CALLBACK_MODE)) { + builder.append(isLong ? " PROPERTY_EMERGENCY_CALLBACK_MODE" : " ecbm"); } if (can(properties, PROPERTY_HIGH_DEF_AUDIO)) { @@ -733,7 +733,6 @@ public abstract class Connection extends Conferenceable { * {@link android.telecom.InCallService.VideoCall}. */ public static abstract class VideoProvider { - /** * Video is not being received (no protocol pause was issued). * @see #handleCallSessionEvent(int) @@ -818,6 +817,14 @@ public abstract class Connection extends Conferenceable { private static final int MSG_SET_PAUSE_IMAGE = 11; private static final int MSG_REMOVE_VIDEO_CALLBACK = 12; + private static final String SESSION_EVENT_RX_PAUSE_STR = "RX_PAUSE"; + private static final String SESSION_EVENT_RX_RESUME_STR = "RX_RESUME"; + private static final String SESSION_EVENT_TX_START_STR = "TX_START"; + private static final String SESSION_EVENT_TX_STOP_STR = "TX_STOP"; + private static final String SESSION_EVENT_CAMERA_FAILURE_STR = "CAMERA_FAIL"; + private static final String SESSION_EVENT_CAMERA_READY_STR = "CAMERA_READY"; + private static final String SESSION_EVENT_UNKNOWN_STR = "UNKNOWN"; + private VideoProvider.VideoProviderHandler mMessageHandler; private final VideoProvider.VideoProviderBinder mBinder; @@ -1328,6 +1335,32 @@ public abstract class Connection extends Conferenceable { } } } + + /** + * Returns a string representation of a call session event. + * + * @param event A call session event passed to {@link #handleCallSessionEvent(int)}. + * @return String representation of the call session event. + * @hide + */ + public static String sessionEventToString(int event) { + switch (event) { + case SESSION_EVENT_CAMERA_FAILURE: + return SESSION_EVENT_CAMERA_FAILURE_STR; + case SESSION_EVENT_CAMERA_READY: + return SESSION_EVENT_CAMERA_READY_STR; + case SESSION_EVENT_RX_PAUSE: + return SESSION_EVENT_RX_PAUSE_STR; + case SESSION_EVENT_RX_RESUME: + return SESSION_EVENT_RX_RESUME_STR; + case SESSION_EVENT_TX_START: + return SESSION_EVENT_TX_START_STR; + case SESSION_EVENT_TX_STOP: + return SESSION_EVENT_TX_STOP_STR; + default: + return SESSION_EVENT_UNKNOWN_STR + " " + event; + } + } } private final Listener mConnectionDeathListener = new Listener() { diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index dc9767caf01e..5081c25f2003 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -433,18 +433,11 @@ public class CarrierConfigManager { "disable_severe_when_extreme_disabled_bool"; /** - * The data call APN retry configuration for default type APN. + * The data call retry configuration for different types of APN. * @hide */ - public static final String KEY_CARRIER_DATA_CALL_RETRY_CONFIG_DEFAULT_STRING = - "carrier_data_call_retry_config_default_string"; - - /** - * The data call APN retry configuration for other type APNs. - * @hide - */ - public static final String KEY_CARRIER_DATA_CALL_RETRY_CONFIG_OTHERS_STRING = - "carrier_data_call_retry_config_others_string"; + public static final String KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS = + "carrier_data_call_retry_config_strings"; /** * Delay between trying APN from the pool @@ -870,6 +863,11 @@ public class CarrierConfigManager { /** * Flag indicating whether the carrier supports the Hold command while in an IMS call. + * <p> + * The device configuration value {@code config_device_respects_hold_carrier_config} ultimately + * controls whether this carrier configuration option is used. Where + * {@code config_device_respects_hold_carrier_config} is false, the value of the + * {@link #KEY_ALLOW_HOLD_IN_IMS_CALL_BOOL} carrier configuration option is ignored. * @hide */ public static final String KEY_ALLOW_HOLD_IN_IMS_CALL_BOOL = "allow_hold_in_ims_call"; @@ -1017,11 +1015,12 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL, false); sDefaults.putBoolean(KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_SEVERE_WHEN_EXTREME_DISABLED_BOOL, true); - sDefaults.putString(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_DEFAULT_STRING, - "default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000," - + "320000:5000,640000:5000,1280000:5000,1800000:5000"); - sDefaults.putString(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_OTHERS_STRING, - "max_retries=3, 5000, 5000, 5000"); + sDefaults.putStringArray(KEY_CARRIER_DATA_CALL_RETRY_CONFIG_STRINGS, new String[]{ + "default:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000," + + "320000:5000,640000:5000,1280000:5000,1800000:5000", + "mms:default_randomization=2000,5000,10000,20000,40000,80000:5000,160000:5000," + + "320000:5000,640000:5000,1280000:5000,1800000:5000", + "others:max_retries=3, 5000, 5000, 5000"}); sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_DEFAULT_LONG, 20000); sDefaults.putLong(KEY_CARRIER_DATA_CALL_APN_DELAY_FASTER_LONG, 3000); sDefaults.putString(KEY_CARRIER_ERI_FILE_NAME_STRING, "eri.xml"); diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index 03d6d2130ec0..7350eeced479 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -24,6 +24,7 @@ import com.android.i18n.phonenumbers.ShortNumberUtil; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.database.Cursor; import android.location.CountryDetector; import android.net.Uri; @@ -3021,4 +3022,79 @@ public class PhoneNumberUtils return SubscriptionManager.getDefaultVoiceSubscriptionId(); } //==== End of utility methods used only in compareStrictly() ===== + + + /* + * The config held calling number conversion map, expected to convert to emergency number. + */ + private static final String[] CONVERT_TO_EMERGENCY_MAP = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_convert_to_emergency_number_map); + /** + * Check whether conversion to emergency number is enabled + * + * @return {@code true} when conversion to emergency numbers is enabled, + * {@code false} otherwise + * + * @hide + */ + public static boolean isConvertToEmergencyNumberEnabled() { + return CONVERT_TO_EMERGENCY_MAP != null && CONVERT_TO_EMERGENCY_MAP.length > 0; + } + + /** + * Converts to emergency number based on the conversion map. + * The conversion map is declared as config_convert_to_emergency_number_map. + * + * Make sure {@link #isConvertToEmergencyNumberEnabled} is true before calling + * this function. + * + * @return The converted emergency number if the number matches conversion map, + * otherwise original number. + * + * @hide + */ + public static String convertToEmergencyNumber(String number) { + if (TextUtils.isEmpty(number)) { + return number; + } + + String normalizedNumber = normalizeNumber(number); + + // The number is already emergency number. Skip conversion. + if (isEmergencyNumber(normalizedNumber)) { + return number; + } + + for (String convertMap : CONVERT_TO_EMERGENCY_MAP) { + if (DBG) log("convertToEmergencyNumber: " + convertMap); + String[] entry = null; + String[] filterNumbers = null; + String convertedNumber = null; + if (!TextUtils.isEmpty(convertMap)) { + entry = convertMap.split(":"); + } + if (entry != null && entry.length == 2) { + convertedNumber = entry[1]; + if (!TextUtils.isEmpty(entry[0])) { + filterNumbers = entry[0].split(","); + } + } + // Skip if the format of entry is invalid + if (TextUtils.isEmpty(convertedNumber) || filterNumbers == null + || filterNumbers.length == 0) { + continue; + } + + for (String filterNumber : filterNumbers) { + if (DBG) log("convertToEmergencyNumber: filterNumber = " + filterNumber + + ", convertedNumber = " + convertedNumber); + if (!TextUtils.isEmpty(filterNumber) && filterNumber.equals(normalizedNumber)) { + if (DBG) log("convertToEmergencyNumber: Matched. Successfully converted to: " + + convertedNumber); + return convertedNumber; + } + } + } + return number; + } } diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java index b4f400fe852c..cd0a012d14fd 100644 --- a/telephony/java/android/telephony/Rlog.java +++ b/telephony/java/android/telephony/Rlog.java @@ -16,8 +16,15 @@ package android.telephony; +import android.text.TextUtils; import android.util.Log; +import android.util.Base64; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + + /** * A class to log strings to the RADIO LOG. * @@ -87,11 +94,52 @@ public final class Rlog { /** * Redact personally identifiable information for production users. - * If log tag is loggable in verbose mode, return the original string, otherwise return XXX. + * @param tag used to identify the source of a log message + * @param pii the personally identifiable information we want to apply secure hash on. + * @return If tag is loggable in verbose mode or pii is null, return the original input. + * otherwise return a secure Hash of input pii */ public static String pii(String tag, Object pii) { - return (isLoggable(tag, Log.VERBOSE) ? String.valueOf(pii) : "XXX"); + String val = String.valueOf(pii); + if (pii == null || TextUtils.isEmpty(val) || isLoggable(tag, Log.VERBOSE)) { + return val; + } + return "[" + secureHash(val.getBytes()) + "]"; } + /** + * Redact personally identifiable information for production users. + * @param enablePiiLogging set when caller explicitly want to enable sensitive logging. + * @param pii the personally identifiable information we want to apply secure hash on. + * @return If enablePiiLogging is set to true or pii is null, return the original input. + * otherwise return a secure Hash of input pii + */ + public static String pii(boolean enablePiiLogging, Object pii) { + String val = String.valueOf(pii); + if (pii == null || TextUtils.isEmpty(val) || enablePiiLogging) { + return val; + } + return "[" + secureHash(val.getBytes()) + "]"; + } + + /** + * Returns a secure hash (using the SHA1 algorithm) of the provided input. + * + * @return the hash + * @param input the bytes for which the secure hash should be computed. + */ + private static String secureHash(byte[] input) { + MessageDigest messageDigest; + + try { + messageDigest = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException e) { + return "####"; + } + + byte[] result = messageDigest.digest(input); + return Base64.encodeToString( + result, Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP); + } } diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 6229ed921bcc..cf2d27e28709 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -340,7 +340,7 @@ public class SubscriptionInfo implements Parcelable { String iccIdToPrint = null; if (iccId != null) { if (iccId.length() > 9 && !Build.IS_DEBUGGABLE) { - iccIdToPrint = iccId.substring(0, 9) + "XXXXXXXXXXX"; + iccIdToPrint = iccId.substring(0, 9) + Rlog.pii(false, iccId.substring(9)); } else { iccIdToPrint = iccId; } diff --git a/tests/Assist/res/drawable/assistant.xml b/tests/Assist/res/drawable/assistant.xml index 2a89dda949b9..56fe2de9b7ba 100644 --- a/tests/Assist/res/drawable/assistant.xml +++ b/tests/Assist/res/drawable/assistant.xml @@ -19,9 +19,6 @@ Copyright (C) 2014 The Android Open Source Project android:viewportWidth="48.0" android:viewportHeight="48.0"> <path - android:pathData="M0 0h48v48H0z" - android:fillColor="#00000000"/> - <path android:fillColor="#FF000000" android:pathData="M38.0,4.0L10.0,4.0C7.79,4.0 6.0,5.79 6.0,8.0l0.0,28.0c0.0,2.21 1.79,4.0 4.0,4.0l8.0,0.0l6.0,6.0 6.0,-6.0l8.0,0.0c2.21,0.0 4.0,-1.79 4.0,-4.0L36.0,8.0c0.0,-2.21 -1.79,-4.0 -4.0,-4.0zM27.75,25.75L24.0,34.0l-3.75,-8.25L12.0,22.0l8.25,-3.75L24.0,10.0l3.75,8.25L36.0,22.0l-8.25,3.75z"/> </vector> diff --git a/tools/fonts/fontchain_lint.py b/tools/fonts/fontchain_lint.py index 2956d87f247c..7ec46a3ee86b 100755 --- a/tools/fonts/fontchain_lint.py +++ b/tools/fonts/fontchain_lint.py @@ -256,8 +256,8 @@ def parse_fonts_xml(fonts_xml_path): def check_emoji_coverage(all_emoji, equivalent_emoji): - emoji_font = get_emoji_font() - check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji) + emoji_font = get_emoji_font() + check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji) def get_emoji_font(): @@ -274,15 +274,12 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): assert sequence in coverage, ( '%s is not supported in the emoji font.' % printable(sequence)) - # disable temporarily - we cover more than this - """ for sequence in coverage: if sequence in {0x0000, 0x000D, 0x0020}: # The font needs to support a few extra characters, which is OK continue assert sequence in all_emoji, ( 'Emoji font should not support %s.' % printable(sequence)) - """ for first, second in sorted(equivalent_emoji.items()): assert coverage[first] == coverage[second], ( @@ -290,8 +287,6 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): printable(first), printable(second))) - # disable temporarily - some equivalent sequences we don't even know about - """ for glyph in set(coverage.values()): maps_to_glyph = [seq for seq in coverage if coverage[seq] == glyph] if len(maps_to_glyph) > 1: @@ -307,7 +302,7 @@ def check_emoji_font_coverage(emoji_font, all_emoji, equivalent_emoji): 'The sequences %s should not result in the same glyph %s' % ( printable(equivalent_seqs), glyph)) - """ + def check_emoji_defaults(default_emoji): missing_text_chars = _emoji_properties['Emoji'] - default_emoji @@ -334,15 +329,9 @@ def check_emoji_defaults(default_emoji): # Noto does not have monochrome glyphs for Unicode 7.0 wingdings and # webdings yet. missing_text_chars -= _chars_by_age['7.0'] - # TODO: Remove these after b/26113320 is fixed - missing_text_chars -= { - 0x263A, # WHITE SMILING FACE - 0x270C, # VICTORY HAND - 0x2744, # SNOWFLAKE - 0x2764, # HEAVY BLACK HEART - } assert missing_text_chars == set(), ( - 'Text style version of some emoji characters are missing: ' + repr(missing_text_chars)) + 'Text style version of some emoji characters are missing: ' + + repr(missing_text_chars)) # Setting reverse to true returns a dictionary that maps the values to sets of @@ -362,7 +351,7 @@ def parse_unicode_datafile(file_path, reverse=False): if not line: continue - chars, prop = line.split(';') + chars, prop = line.split(';')[:2] chars = chars.strip() prop = prop.strip() @@ -423,26 +412,6 @@ def parse_ucd(ucd_path): _emoji_zwj_sequences = parse_unicode_datafile( path.join(ucd_path, 'emoji-zwj-sequences.txt')) - # filter modern pentathlon, as it seems likely to be removed from final spec - # also filter rifle - def is_excluded(n): - return n in [0x1f93b, 0x1f946] - - def contains_excluded(t): - if type(t) == int: - return is_excluded(t) - return any(is_excluded(cp) for cp in t) - - # filter modern pentathlon, as it seems likely to be removed from final spec - _emoji_properties['Emoji'] = set( - t for t in _emoji_properties['Emoji'] if not contains_excluded(t)) - _emoji_sequences = dict( - (t, v) for (t, v) in _emoji_sequences.items() if not contains_excluded(t)) - - # add in UN flag - UN_seq = flag_sequence('UN') - _emoji_sequences[UN_seq] = 'Emoji_Flag_Sequence' - def flag_sequence(territory_code): return tuple(0x1F1E6 + ord(ch) - ord('A') for ch in territory_code) @@ -454,7 +423,8 @@ 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('WF'), flag_sequence('XK'), flag_sequence('YT'), + flag_sequence('UN'), flag_sequence('WF'), flag_sequence('XK'), + flag_sequence('YT'), }) EQUIVALENT_FLAGS = { @@ -467,6 +437,22 @@ EQUIVALENT_FLAGS = { COMBINING_KEYCAP = 0x20E3 +# Characters that Android defaults to emoji style, different from the recommendations in UTR #51 +ANDROID_DEFAULT_EMOJI = frozenset({ + 0x2600, # BLACK SUN WITH RAYS + 0x2601, # CLOUD + 0x260E, # BLACK TELEPHONE + 0x261D, # WHITE UP POINTING INDEX + 0x263A, # WHITE SMILING FACE + 0x2660, # BLACK SPADE SUIT + 0x2663, # BLACK CLUB SUIT + 0x2665, # BLACK HEART SUIT + 0x2666, # BLACK DIAMOND SUIT + 0x270C, # VICTORY HAND + 0x2744, # SNOWFLAKE + 0x2764, # HEAVY BLACK HEART +}) + LEGACY_ANDROID_EMOJI = { 0xFE4E5: flag_sequence('JP'), 0xFE4E6: flag_sequence('US'), @@ -502,7 +488,17 @@ ZWJ_IDENTICALS = { def is_fitzpatrick_modifier(cp): - return 0x1f3fb <= cp <= 0x1f3ff + return 0x1F3FB <= cp <= 0x1F3FF + + +def reverse_emoji(seq): + rev = list(reversed(seq)) + # if there are fitzpatrick modifiers in the sequence, keep them after + # the emoji they modify + for i in xrange(1, len(rev)): + if is_fitzpatrick_modifier(rev[i-1]): + rev[i], rev[i-1] = rev[i-1], rev[i] + return tuple(rev) def compute_expected_emoji(): @@ -511,26 +507,52 @@ def compute_expected_emoji(): all_sequences = set() all_sequences.update(_emoji_variation_sequences) + # add zwj sequences not in the current emoji-zwj-sequences.txt + adjusted_emoji_zwj_sequences = dict(_emoji_zwj_sequences) + adjusted_emoji_zwj_sequences.update(_emoji_zwj_sequences) + # single parent families + additional_emoji_zwj = ( + (0x1F468, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467), + (0x1F468, 0x200D, 0x1F466, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F466), + (0x1F468, 0x200D, 0x1F467, 0x200D, 0x1F467), + (0x1F469, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467), + (0x1F469, 0x200D, 0x1F466, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F466), + (0x1F469, 0x200D, 0x1F467, 0x200D, 0x1F467), + ) + # sequences formed from man and woman and optional fitzpatrick modifier + modified_extensions = ( + 0x2696, + 0x2708, + 0x1F3A8, + 0x1F680, + 0x1F692, + ) + for seq in additional_emoji_zwj: + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence' + for ext in modified_extensions: + for base in (0x1F468, 0x1F469): + seq = (base, 0x200D, ext) + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_Sequence' + for modifier in range(0x1F3FB, 0x1F400): + seq = (base, modifier, 0x200D, ext) + adjusted_emoji_zwj_sequences[seq] = 'Emoji_ZWJ_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) - for sequence in _emoji_zwj_sequences.keys(): + for sequence in adjusted_emoji_zwj_sequences.keys(): sequence = tuple(ch for ch in sequence if ch != EMOJI_VS) all_sequences.add(sequence) sequence_pieces.update(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. - reversed_seq = list(reversed(sequence)) - # if there are fitzpatrick modifiers in the sequence, keep them after - # the emoji they modify - for i in xrange(1, len(reversed_seq)): - if is_fitzpatrick_modifier(reversed_seq[i - 1]): - tmp = reversed_seq[i] - reversed_seq[i] = reversed_seq[i-1] - reversed_seq[i-1] = tmp - reversed_seq = tuple(reversed_seq) + reversed_seq = reverse_emoji(sequence) all_sequences.add(reversed_seq) equivalent_emoji[reversed_seq] = sequence @@ -549,6 +571,7 @@ def compute_expected_emoji(): set(LEGACY_ANDROID_EMOJI.keys())) default_emoji = ( _emoji_properties['Emoji_Presentation'] | + ANDROID_DEFAULT_EMOJI | all_sequences | set(LEGACY_ANDROID_EMOJI.keys())) diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 58df301b1cfc..76522f95fbd4 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -96,7 +96,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void clearForcedDisplayDensity(int displayId) throws RemoteException { + public void clearForcedDisplayDensityForUser(int displayId, int userId) throws RemoteException { // TODO Auto-generated method stub } @@ -397,7 +397,8 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setForcedDisplayDensity(int displayId, int density) throws RemoteException { + public void setForcedDisplayDensityForUser(int displayId, int density, int userId) + throws RemoteException { // TODO Auto-generated method stub } diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 9d0c20ce4c5d..d3d5ea05c1af 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -817,6 +817,7 @@ public class WifiConfiguration implements Parcelable { */ public static final int NETWORK_SELECTION_ENABLE = 0; /** + * @deprecated it is not used any more. * This network is disabled because higher layer (>2) network is bad */ public static final int DISABLED_BAD_LINK = 1; @@ -862,7 +863,7 @@ public class WifiConfiguration implements Parcelable { */ private static final String[] QUALITY_NETWORK_SELECTION_DISABLE_REASON = { "NETWORK_SELECTION_ENABLE", - "NETWORK_SELECTION_DISABLED_BAD_LINK", + "NETWORK_SELECTION_DISABLED_BAD_LINK", // deprecated "NETWORK_SELECTION_DISABLED_ASSOCIATION_REJECTION ", "NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE", "NETWORK_SELECTION_DISABLED_DHCP_FAILURE", diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index bbc3d2fd5927..1633bd9c914a 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -49,6 +49,8 @@ import java.util.concurrent.CountDownLatch; * This class provides the primary API for managing all aspects of Wi-Fi * connectivity. Get an instance of this class by calling * {@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE)}. + * On releases before NYC, it should only be obtained from an application context, and not from + * any other derived context to avoid memory leaks within the calling process. * It deals with several categories of items: * <ul> diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java index 716f1d32ec84..3190ead48da0 100644 --- a/wifi/java/android/net/wifi/WifiScanner.java +++ b/wifi/java/android/net/wifi/WifiScanner.java @@ -286,6 +286,12 @@ public class WifiScanner { * {@hide} */ private int mBucketsScanned; + /** + * Indicates that the scan results received are as a result of a scan of all available + * channels. This should only be expected to function for single scans. + * {@hide} + */ + private boolean mAllChannelsScanned; /** all scan results discovered in this scan, sorted by timestamp in ascending order */ private ScanResult mResults[]; @@ -298,10 +304,12 @@ public class WifiScanner { } /** {@hide} */ - public ScanData(int id, int flags, int bucketsScanned, ScanResult[] results) { + public ScanData(int id, int flags, int bucketsScanned, boolean allChannelsScanned, + ScanResult[] results) { mId = id; mFlags = flags; mBucketsScanned = bucketsScanned; + mAllChannelsScanned = allChannelsScanned; mResults = results; } @@ -309,6 +317,7 @@ public class WifiScanner { mId = s.mId; mFlags = s.mFlags; mBucketsScanned = s.mBucketsScanned; + mAllChannelsScanned = s.mAllChannelsScanned; mResults = new ScanResult[s.mResults.length]; for (int i = 0; i < s.mResults.length; i++) { ScanResult result = s.mResults[i]; @@ -330,6 +339,11 @@ public class WifiScanner { return mBucketsScanned; } + /** {@hide} */ + public boolean isAllChannelsScanned() { + return mAllChannelsScanned; + } + public ScanResult[] getResults() { return mResults; } @@ -345,6 +359,7 @@ public class WifiScanner { dest.writeInt(mId); dest.writeInt(mFlags); dest.writeInt(mBucketsScanned); + dest.writeInt(mAllChannelsScanned ? 1 : 0); dest.writeInt(mResults.length); for (int i = 0; i < mResults.length; i++) { ScanResult result = mResults[i]; @@ -362,12 +377,13 @@ public class WifiScanner { int id = in.readInt(); int flags = in.readInt(); int bucketsScanned = in.readInt(); + boolean allChannelsScanned = in.readInt() != 0; int n = in.readInt(); ScanResult results[] = new ScanResult[n]; for (int i = 0; i < n; i++) { results[i] = ScanResult.CREATOR.createFromParcel(in); } - return new ScanData(id, flags, bucketsScanned, results); + return new ScanData(id, flags, bucketsScanned, allChannelsScanned, results); } public ScanData[] newArray(int size) { |