diff options
251 files changed, 2490 insertions, 1794 deletions
diff --git a/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl b/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl index 3d50d14e1b83..fb3172b8c764 100644 --- a/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl +++ b/apex/media/aidl/private/android/media/IMediaCommunicationService.aidl @@ -15,7 +15,17 @@ */ package android.media; +import android.media.Session2Token; +import android.media.IMediaCommunicationServiceCallback; +import android.media.MediaParceledListSlice; + /** {@hide} */ interface IMediaCommunicationService { + void notifySession2Created(in Session2Token sessionToken); + boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid); + MediaParceledListSlice getSession2Tokens(int userId); + + void registerCallback(IMediaCommunicationServiceCallback callback, String packageName); + void unregisterCallback(IMediaCommunicationServiceCallback callback); } diff --git a/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl b/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl new file mode 100644 index 000000000000..3d5321c9d7d8 --- /dev/null +++ b/apex/media/aidl/private/android/media/IMediaCommunicationServiceCallback.aidl @@ -0,0 +1,26 @@ +/** + * Copyright 2021 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.media; + +import android.media.Session2Token; +import android.media.MediaParceledListSlice; + +/** {@hide} */ +interface IMediaCommunicationServiceCallback { + void onSession2Created(in Session2Token token); + void onSession2Changed(in MediaParceledListSlice tokens); +} + diff --git a/apex/media/framework/api/current.txt b/apex/media/framework/api/current.txt index a2366df0660a..1beef40b9e4f 100644 --- a/apex/media/framework/api/current.txt +++ b/apex/media/framework/api/current.txt @@ -26,6 +26,7 @@ package android.media { } public class MediaCommunicationManager { + method @NonNull public java.util.List<android.media.Session2Token> getSession2Tokens(); method @IntRange(from=1) public int getVersion(); } diff --git a/apex/media/framework/api/module-lib-current.txt b/apex/media/framework/api/module-lib-current.txt index ad9114fa23cf..eb6397a1826b 100644 --- a/apex/media/framework/api/module-lib-current.txt +++ b/apex/media/framework/api/module-lib-current.txt @@ -1,6 +1,16 @@ // Signature format: 2.0 package android.media { + public class MediaCommunicationManager { + method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void registerSessionCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.MediaCommunicationManager.SessionCallback); + method public void unregisterSessionCallback(@NonNull android.media.MediaCommunicationManager.SessionCallback); + } + + public static interface MediaCommunicationManager.SessionCallback { + method public default void onSession2TokenCreated(@NonNull android.media.Session2Token); + method public default void onSession2TokensChanged(@NonNull java.util.List<android.media.Session2Token>); + } + public class MediaFrameworkInitializer { method public static void registerServiceWrappers(); method public static void setMediaServiceManager(@NonNull android.media.MediaServiceManager); diff --git a/apex/media/framework/java/android/media/Controller2Link.java b/apex/media/framework/java/android/media/Controller2Link.java index 04185e79b0ad..8eefec73194c 100644 --- a/apex/media/framework/java/android/media/Controller2Link.java +++ b/apex/media/framework/java/android/media/Controller2Link.java @@ -26,7 +26,7 @@ import android.os.ResultReceiver; import java.util.Objects; /** - * Handles incoming commands from {@link MediaSession2} to both {@link MediaController2}. + * Handles incoming commands from {@link MediaSession2} to {@link MediaController2}. * @hide */ // @SystemApi diff --git a/apex/media/framework/java/android/media/MediaCommunicationManager.java b/apex/media/framework/java/android/media/MediaCommunicationManager.java index e686076c871c..9ec25fe48a2e 100644 --- a/apex/media/framework/java/android/media/MediaCommunicationManager.java +++ b/apex/media/framework/java/android/media/MediaCommunicationManager.java @@ -15,18 +15,36 @@ */ package android.media; +import static android.Manifest.permission.MEDIA_CONTENT_CONTROL; +import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; + +import android.annotation.CallbackExecutor; import android.annotation.IntRange; import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; +import android.media.session.MediaSession; +import android.media.session.MediaSessionManager; +import android.os.RemoteException; +import android.os.UserHandle; +import android.service.media.MediaBrowserService; +import android.util.Log; +import com.android.internal.annotations.GuardedBy; import com.android.modules.utils.build.SdkLevel; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Executor; + /** * Provides support for interacting with {@link android.media.MediaSession2 MediaSession2s} * that applications have published to express their ongoing media playback state. */ -// TODO: Add notifySession2Created() and sendMessage(). @SystemService(Context.MEDIA_COMMUNICATION_SERVICE) public class MediaCommunicationManager { private static final String TAG = "MediaCommunicationManager"; @@ -44,6 +62,13 @@ public class MediaCommunicationManager { private final Context mContext; private final IMediaCommunicationService mService; + private final Object mLock = new Object(); + private final CopyOnWriteArrayList<SessionCallbackRecord> mTokenCallbackRecords = + new CopyOnWriteArrayList<>(); + + @GuardedBy("mLock") + private MediaCommunicationServiceCallbackStub mCallbackStub; + /** * @hide */ @@ -64,4 +89,197 @@ public class MediaCommunicationManager { public @IntRange(from = 1) int getVersion() { return CURRENT_VERSION; } + + /** + * Notifies that a new {@link MediaSession2} with type {@link Session2Token#TYPE_SESSION} is + * created. + * @param token newly created session2 token + * @hide + */ + public void notifySession2Created(@NonNull Session2Token token) { + Objects.requireNonNull(token, "token shouldn't be null"); + if (token.getType() != Session2Token.TYPE_SESSION) { + throw new IllegalArgumentException("token's type should be TYPE_SESSION"); + } + try { + mService.notifySession2Created(token); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Checks whether the remote user is a trusted app. + * <p> + * An app is trusted if the app holds the + * {@link android.Manifest.permission#MEDIA_CONTENT_CONTROL} permission or has an enabled + * notification listener. + * + * @param userInfo The remote user info from either + * {@link MediaSession#getCurrentControllerInfo()} or + * {@link MediaBrowserService#getCurrentBrowserInfo()}. + * @return {@code true} if the remote user is trusted or {@code false} otherwise. + * @hide + */ + public boolean isTrustedForMediaControl(@NonNull MediaSessionManager.RemoteUserInfo userInfo) { + Objects.requireNonNull(userInfo, "userInfo shouldn't be null"); + if (userInfo.getPackageName() == null) { + return false; + } + try { + return mService.isTrusted( + userInfo.getPackageName(), userInfo.getPid(), userInfo.getUid()); + } catch (RemoteException e) { + Log.w(TAG, "Cannot communicate with the service.", e); + } + return false; + } + + /** + * This API is not generally intended for third party application developers. + * Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a> + * <a href="{@docRoot}reference/androidx/media2/session/package-summary.html">Media2 session + * Library</a> for consistent behavior across all devices. + * <p> + * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the + * current user. + * <p> + * Although this API can be used without any restriction, each session owners can accept or + * reject your uses of {@link MediaSession2}. + * + * @return A list of {@link Session2Token}. + */ + @NonNull + public List<Session2Token> getSession2Tokens() { + return getSession2Tokens(UserHandle.myUserId()); + } + + /** + * Adds a callback to be notified when the list of active sessions changes. + * <p> + * This requires the {@link android.Manifest.permission#MEDIA_CONTENT_CONTROL} permission be + * held by the calling app. + * </p> + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @RequiresPermission(MEDIA_CONTENT_CONTROL) + public void registerSessionCallback(@CallbackExecutor @NonNull Executor executor, + @NonNull SessionCallback callback) { + Objects.requireNonNull(executor, "executor must not be null"); + Objects.requireNonNull(callback, "callback must not be null"); + + if (!mTokenCallbackRecords.addIfAbsent( + new SessionCallbackRecord(executor, callback))) { + Log.w(TAG, "registerSession2TokenCallback: Ignoring the same callback"); + return; + } + synchronized (mLock) { + if (mCallbackStub == null) { + MediaCommunicationServiceCallbackStub callbackStub = + new MediaCommunicationServiceCallbackStub(); + try { + mService.registerCallback(callbackStub, mContext.getPackageName()); + mCallbackStub = callbackStub; + } catch (RemoteException ex) { + Log.e(TAG, "Failed to register callback.", ex); + } + } + } + } + + /** + * Stops receiving active sessions updates on the specified callback. + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public void unregisterSessionCallback(@NonNull SessionCallback callback) { + if (!mTokenCallbackRecords.remove( + new SessionCallbackRecord(null, callback))) { + Log.w(TAG, "unregisterSession2TokenCallback: Ignoring an unknown callback."); + return; + } + synchronized (mLock) { + if (mCallbackStub != null && mTokenCallbackRecords.isEmpty()) { + try { + mService.unregisterCallback(mCallbackStub); + } catch (RemoteException ex) { + Log.e(TAG, "Failed to unregister callback.", ex); + } + mCallbackStub = null; + } + } + } + + private List<Session2Token> getSession2Tokens(int userId) { + try { + MediaParceledListSlice slice = mService.getSession2Tokens(userId); + return slice == null ? Collections.emptyList() : slice.getList(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to get session tokens", e); + } + return Collections.emptyList(); + } + + /** + * Callback for listening to changes to the sessions. + * @see #registerSessionCallback(Executor, SessionCallback) + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public interface SessionCallback { + /** + * Called when a new {@link MediaSession2 media session2} is created. + * @param token the newly created token + */ + default void onSession2TokenCreated(@NonNull Session2Token token) {} + + /** + * Called when {@link #getSession2Tokens() session tokens} are changed. + */ + default void onSession2TokensChanged(@NonNull List<Session2Token> tokens) {} + } + + private static final class SessionCallbackRecord { + public final Executor executor; + public final SessionCallback callback; + + SessionCallbackRecord(Executor executor, SessionCallback callback) { + this.executor = executor; + this.callback = callback; + } + + @Override + public int hashCode() { + return Objects.hash(callback); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof SessionCallbackRecord)) { + return false; + } + return Objects.equals(this.callback, ((SessionCallbackRecord) obj).callback); + } + } + + class MediaCommunicationServiceCallbackStub extends IMediaCommunicationServiceCallback.Stub { + @Override + public void onSession2Created(Session2Token token) throws RemoteException { + for (SessionCallbackRecord record : mTokenCallbackRecords) { + record.executor.execute(() -> record.callback.onSession2TokenCreated(token)); + } + } + + @Override + public void onSession2Changed(MediaParceledListSlice tokens) throws RemoteException { + List<Session2Token> tokenList = tokens.getList(); + for (SessionCallbackRecord record : mTokenCallbackRecords) { + record.executor.execute(() -> record.callback.onSession2TokensChanged(tokenList)); + } + } + } } diff --git a/apex/media/framework/java/android/media/MediaSession2.java b/apex/media/framework/java/android/media/MediaSession2.java index 6560afedab0f..6397ba3996f3 100644 --- a/apex/media/framework/java/android/media/MediaSession2.java +++ b/apex/media/framework/java/android/media/MediaSession2.java @@ -32,7 +32,6 @@ import android.annotation.Nullable; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager.RemoteUserInfo; import android.os.BadParcelableException; import android.os.Bundle; @@ -87,7 +86,7 @@ public class MediaSession2 implements AutoCloseable { private final String mSessionId; private final PendingIntent mSessionActivity; private final Session2Token mSessionToken; - private final MediaSessionManager mSessionManager; + private final MediaCommunicationManager mCommunicationManager; private final Handler mResultHandler; //@GuardedBy("mLock") @@ -115,8 +114,7 @@ public class MediaSession2 implements AutoCloseable { mSessionStub = new Session2Link(this); mSessionToken = new Session2Token(Process.myUid(), TYPE_SESSION, context.getPackageName(), mSessionStub, tokenExtras); - mSessionManager = (MediaSessionManager) mContext.getSystemService( - Context.MEDIA_SESSION_SERVICE); + mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class); // NOTE: mResultHandler uses main looper, so this MUST NOT be blocked. mResultHandler = new Handler(context.getMainLooper()); mClosed = false; @@ -352,7 +350,7 @@ public class MediaSession2 implements AutoCloseable { final ControllerInfo controllerInfo = new ControllerInfo( remoteUserInfo, - mSessionManager.isTrustedForMediaControl(remoteUserInfo), + mCommunicationManager.isTrustedForMediaControl(remoteUserInfo), controller, connectionHints); mCallbackExecutor.execute(() -> { @@ -608,8 +606,8 @@ public class MediaSession2 implements AutoCloseable { // Notify framework about the newly create session after the constructor is finished. // Otherwise, framework may access the session before the initialization is finished. try { - MediaSessionManager manager = (MediaSessionManager) mContext.getSystemService( - Context.MEDIA_SESSION_SERVICE); + MediaCommunicationManager manager = + mContext.getSystemService(MediaCommunicationManager.class); manager.notifySession2Created(session2.getToken()); } catch (Exception e) { session2.close(); diff --git a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java b/apex/media/service/java/com/android/server/media/MediaCommunicationService.java index 0468fdf30ba8..06de3f8d27d0 100644 --- a/apex/media/service/java/com/android/server/media/MediaCommunicationService.java +++ b/apex/media/service/java/com/android/server/media/MediaCommunicationService.java @@ -15,27 +15,538 @@ */ package com.android.server.media; +import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; +import static android.os.UserHandle.ALL; +import static android.os.UserHandle.getUserHandleForUid; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.ActivityManager; +import android.app.NotificationManager; import android.content.Context; +import android.content.pm.PackageManager; import android.media.IMediaCommunicationService; +import android.media.IMediaCommunicationServiceCallback; +import android.media.MediaController2; +import android.media.MediaParceledListSlice; +import android.media.Session2CommandGroup; +import android.media.Session2Token; +import android.os.Binder; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Process; +import android.os.RemoteException; +import android.os.UserHandle; +import android.os.UserManager; +import android.util.Log; +import android.util.SparseArray; +import android.util.SparseIntArray; +import com.android.internal.annotations.GuardedBy; import com.android.server.SystemService; +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.stream.Collectors; + /** - * A system service that managers {@link android.media.MediaSession2} creations + * A system service that manages {@link android.media.MediaSession2} creations * and their ongoing media playback state. * @hide */ public class MediaCommunicationService extends SystemService { + private static final String TAG = "MediaCommunicationService"; + private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + + final Context mContext; + + private final Object mLock = new Object(); + private final Handler mHandler = new Handler(Looper.getMainLooper()); + + @GuardedBy("mLock") + private final SparseIntArray mFullUserIds = new SparseIntArray(); + @GuardedBy("mLock") + private final SparseArray<FullUserRecord> mUserRecords = new SparseArray<>(); + + private final Executor mRecordExecutor = Executors.newSingleThreadExecutor(); + @GuardedBy("mLock") + private final List<CallbackRecord> mCallbackRecords = new ArrayList<>(); + final NotificationManager mNotificationManager; public MediaCommunicationService(Context context) { super(context); + mContext = context; + mNotificationManager = context.getSystemService(NotificationManager.class); } @Override public void onStart() { publishBinderService(Context.MEDIA_COMMUNICATION_SERVICE, new Stub()); + updateUser(); + } + + @Override + public void onUserStarting(@NonNull TargetUser user) { + if (DEBUG) Log.d(TAG, "onUserStarting: " + user); + updateUser(); + } + + @Override + public void onUserSwitching(@Nullable TargetUser from, @NonNull TargetUser to) { + if (DEBUG) Log.d(TAG, "onUserSwitching: " + to); + updateUser(); + } + + @Override + public void onUserStopped(@NonNull TargetUser targetUser) { + int userId = targetUser.getUserHandle().getIdentifier(); + + if (DEBUG) Log.d(TAG, "onUserStopped: " + userId); + synchronized (mLock) { + FullUserRecord user = getFullUserRecordLocked(userId); + if (user != null) { + if (user.getFullUserId() == userId) { + user.destroySessionsForUserLocked(UserHandle.ALL.getIdentifier()); + mUserRecords.remove(userId); + } else { + user.destroySessionsForUserLocked(userId); + } + } + updateUser(); + } + } + + @Nullable + CallbackRecord findCallbackRecordLocked(@Nullable IMediaCommunicationServiceCallback callback) { + if (callback == null) { + return null; + } + for (CallbackRecord record : mCallbackRecords) { + if (Objects.equals(callback.asBinder(), record.mCallback.asBinder())) { + return record; + } + } + return null; + } + + private FullUserRecord getFullUserRecordLocked(int userId) { + int fullUserId = mFullUserIds.get(userId, -1); + if (fullUserId < 0) { + return null; + } + return mUserRecords.get(fullUserId); + } + + private boolean hasMediaControlPermission(int pid, int uid) { + // Check if it's system server or has MEDIA_CONTENT_CONTROL. + // Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra + // check here. + if (uid == Process.SYSTEM_UID || mContext.checkPermission( + android.Manifest.permission.MEDIA_CONTENT_CONTROL, pid, uid) + == PackageManager.PERMISSION_GRANTED) { + return true; + } else if (DEBUG) { + Log.d(TAG, "uid(" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL"); + } + return false; + } + + private void updateUser() { + UserManager manager = mContext.getSystemService(UserManager.class); + List<UserHandle> allUsers = manager.getUserHandles(/*excludeDying=*/false); + + synchronized (mLock) { + mFullUserIds.clear(); + if (allUsers != null) { + for (UserHandle user : allUsers) { + UserHandle parent = manager.getProfileParent(user); + if (parent != null) { + mFullUserIds.put(user.getIdentifier(), parent.getIdentifier()); + } else { + mFullUserIds.put(user.getIdentifier(), user.getIdentifier()); + if (mUserRecords.get(user.getIdentifier()) == null) { + mUserRecords.put(user.getIdentifier(), + new FullUserRecord(user.getIdentifier())); + } + } + } + } + // Ensure that the current full user exists. + int currentFullUserId = ActivityManager.getCurrentUser(); + FullUserRecord currentFullUserRecord = mUserRecords.get(currentFullUserId); + if (currentFullUserRecord == null) { + Log.w(TAG, "Cannot find FullUserInfo for the current user " + currentFullUserId); + currentFullUserRecord = new FullUserRecord(currentFullUserId); + mUserRecords.put(currentFullUserId, currentFullUserRecord); + } + mFullUserIds.put(currentFullUserId, currentFullUserId); + } + } + + void dispatchSessionCreated(Session2Token token) { + for (CallbackRecord record : mCallbackRecords) { + if (record.mUserId != ALL.getIdentifier() + && record.mUserId != getUserHandleForUid(token.getUid()).getIdentifier()) { + continue; + } + try { + record.mCallback.onSession2Created(token); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + } + + void onSessionDied(Session2Record record) { + synchronized (mLock) { + destroySessionLocked(record); + } + } + + private void destroySessionLocked(Session2Record session) { + if (DEBUG) { + Log.d(TAG, "Destroying " + session); + } + if (session.isClosed()) { + Log.w(TAG, "Destroying already destroyed session. Ignoring."); + return; + } + + FullUserRecord user = getFullUserRecordLocked(session.getUserId()); + + if (user != null) { + user.removeSession(session); + } + + session.close(); } private class Stub extends IMediaCommunicationService.Stub { + @Override + public void notifySession2Created(Session2Token sessionToken) { + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + + try { + if (DEBUG) { + Log.d(TAG, "Session2 is created " + sessionToken); + } + if (uid != sessionToken.getUid()) { + throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid + + " but actually=" + sessionToken.getUid()); + } + synchronized (mLock) { + int userId = getUserHandleForUid(sessionToken.getUid()).getIdentifier(); + FullUserRecord user = getFullUserRecordLocked(userId); + if (user == null) { + Log.w(TAG, "notifySession2Created: Ignore session of an unknown user"); + return; + } + user.addSession(new Session2Record(MediaCommunicationService.this, + sessionToken, mRecordExecutor)); + mHandler.post(() -> dispatchSessionCreated(sessionToken)); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + /** + * Returns if the controller's package is trusted (i.e. has either MEDIA_CONTENT_CONTROL + * permission or an enabled notification listener) + * + * @param controllerPackageName package name of the controller app + * @param controllerPid pid of the controller app + * @param controllerUid uid of the controller app + */ + @Override + public boolean isTrusted(String controllerPackageName, int controllerPid, + int controllerUid) { + final int uid = Binder.getCallingUid(); + final int userId = UserHandle.getUserHandleForUid(uid).getIdentifier(); + final long token = Binder.clearCallingIdentity(); + try { + // Don't perform check between controllerPackageName and controllerUid. + // When an (activity|service) runs on the another apps process by specifying + // android:process in the AndroidManifest.xml, then PID and UID would have the + // running process' information instead of the (activity|service) that has created + // MediaController. + // Note that we can use Context#getOpPackageName() instead of + // Context#getPackageName() for getting package name that matches with the PID/UID, + // but it doesn't tell which package has created the MediaController, so useless. + return hasMediaControlPermission(controllerPid, controllerUid) + || hasEnabledNotificationListener( + userId, controllerPackageName, controllerUid); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public MediaParceledListSlice getSession2Tokens(int userId) { + final int pid = Binder.getCallingPid(); + final int uid = Binder.getCallingUid(); + final long token = Binder.clearCallingIdentity(); + + try { + // Check that they can make calls on behalf of the user and get the final user id + int resolvedUserId = handleIncomingUser(pid, uid, userId, null); + List<Session2Token> result; + synchronized (mLock) { + FullUserRecord user = getFullUserRecordLocked(userId); + result = user.getSession2Tokens(resolvedUserId); + } + return new MediaParceledListSlice(result); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void registerCallback(IMediaCommunicationServiceCallback callback, + String packageName) throws RemoteException { + Objects.requireNonNull(callback, "callback should not be null"); + Objects.requireNonNull(packageName, "packageName should not be null"); + + synchronized (mLock) { + if (findCallbackRecordLocked(callback) == null) { + + CallbackRecord record = new CallbackRecord(callback, packageName, + Binder.getCallingUid(), Binder.getCallingPid()); + mCallbackRecords.add(record); + try { + callback.asBinder().linkToDeath(record, 0); + } catch (RemoteException e) { + Log.w(TAG, "Failed to register callback", e); + mCallbackRecords.remove(record); + } + } else { + Log.e(TAG, "registerCallback is called with already registered callback. " + + "packageName=" + packageName); + } + } + } + + @Override + public void unregisterCallback(IMediaCommunicationServiceCallback callback) + throws RemoteException { + synchronized (mLock) { + CallbackRecord existingRecord = findCallbackRecordLocked(callback); + if (existingRecord != null) { + mCallbackRecords.remove(existingRecord); + callback.asBinder().unlinkToDeath(existingRecord, 0); + } else { + Log.e(TAG, "unregisterCallback is called with unregistered callback."); + } + } + } + + private boolean hasEnabledNotificationListener(int callingUserId, + String controllerPackageName, int controllerUid) { + int controllerUserId = UserHandle.getUserHandleForUid(controllerUid).getIdentifier(); + if (callingUserId != controllerUserId) { + // Enabled notification listener only works within the same user. + return false; + } + + if (mNotificationManager.hasEnabledNotificationListener(controllerPackageName, + UserHandle.getUserHandleForUid(controllerUid))) { + return true; + } + if (DEBUG) { + Log.d(TAG, controllerPackageName + " (uid=" + controllerUid + + ") doesn't have an enabled notification listener"); + } + return false; + } + + // Handles incoming user by checking whether the caller has permission to access the + // given user id's information or not. Permission is not necessary if the given user id is + // equal to the caller's user id, but if not, the caller needs to have the + // INTERACT_ACROSS_USERS_FULL permission. Otherwise, a security exception will be thrown. + // The return value will be the given user id, unless the given user id is + // UserHandle.CURRENT, which will return the ActivityManager.getCurrentUser() value instead. + private int handleIncomingUser(int pid, int uid, int userId, String packageName) { + int callingUserId = UserHandle.getUserHandleForUid(uid).getIdentifier(); + if (userId == callingUserId) { + return userId; + } + + boolean canInteractAcrossUsersFull = mContext.checkPermission( + INTERACT_ACROSS_USERS_FULL, pid, uid) == PackageManager.PERMISSION_GRANTED; + if (canInteractAcrossUsersFull) { + if (userId == UserHandle.CURRENT.getIdentifier()) { + return ActivityManager.getCurrentUser(); + } + return userId; + } + + throw new SecurityException("Permission denied while calling from " + packageName + + " with user id: " + userId + "; Need to run as either the calling user id (" + + callingUserId + "), or with " + INTERACT_ACROSS_USERS_FULL + " permission"); + } + } + + final class CallbackRecord implements IBinder.DeathRecipient { + private final IMediaCommunicationServiceCallback mCallback; + private final String mPackageName; + private final int mUid; + private int mPid; + private final int mUserId; + + CallbackRecord(IMediaCommunicationServiceCallback callback, + String packageName, int uid, int pid) { + mCallback = callback; + mPackageName = packageName; + mUid = uid; + mPid = pid; + mUserId = (mContext.checkPermission( + INTERACT_ACROSS_USERS_FULL, pid, uid) == PackageManager.PERMISSION_GRANTED) + ? ALL.getIdentifier() : UserHandle.getUserHandleForUid(mUid).getIdentifier(); + } + + @Override + public String toString() { + return "CallbackRecord[callback=" + mCallback + ", pkg=" + mPackageName + + ", uid=" + mUid + ", pid=" + mPid + "]"; + } + + @Override + public void binderDied() { + synchronized (mLock) { + mCallbackRecords.remove(this); + } + } + } + + final class FullUserRecord { + private final int mFullUserId; + /** Sorted list of media sessions */ + private final List<Session2Record> mSessionRecords = new ArrayList<>(); + + FullUserRecord(int fullUserId) { + mFullUserId = fullUserId; + } + + public void addSession(Session2Record record) { + mSessionRecords.add(record); + } + + public void removeSession(Session2Record record) { + mSessionRecords.remove(record); + //TODO: Handle if the removed session was the media button session. + } + + public int getFullUserId() { + return mFullUserId; + } + + public List<Session2Token> getSession2Tokens(int userId) { + return mSessionRecords.stream() + .filter(record -> record.isActive() + && (userId == UserHandle.ALL.getIdentifier() + || record.getUserId() == userId)) + .map(Session2Record::getSessionToken) + .collect(Collectors.toList()); + } + + public void destroySessionsForUserLocked(int userId) { + synchronized (mLock) { + for (Session2Record record : mSessionRecords) { + if (userId == UserHandle.ALL.getIdentifier() + || record.getUserId() == userId) { + destroySessionLocked(record); + } + } + } + } + } + + static final class Session2Record { + private final Session2Token mSessionToken; + private final Object mLock = new Object(); + private final WeakReference<MediaCommunicationService> mServiceRef; + @GuardedBy("mLock") + private final MediaController2 mController; + + @GuardedBy("mLock") + private boolean mIsConnected; + @GuardedBy("mLock") + private boolean mIsClosed; + + Session2Record(MediaCommunicationService service, Session2Token token, + Executor controllerExecutor) { + mServiceRef = new WeakReference<>(service); + mSessionToken = token; + mController = new MediaController2.Builder(service.getContext(), token) + .setControllerCallback(controllerExecutor, new Controller2Callback()) + .build(); + } + + public int getUserId() { + return UserHandle.getUserHandleForUid(mSessionToken.getUid()).getIdentifier(); + } + + public boolean isActive() { + synchronized (mLock) { + return mIsConnected; + } + } + + public boolean isClosed() { + synchronized (mLock) { + return mIsClosed; + } + } + + public void close() { + synchronized (mLock) { + mIsClosed = true; + // Call close regardless of the mIsConnected. This may be called when it's not yet + // connected. + mController.close(); + } + } + + public Session2Token getSessionToken() { + return mSessionToken; + } + + private class Controller2Callback extends MediaController2.ControllerCallback { + @Override + public void onConnected(MediaController2 controller, + Session2CommandGroup allowedCommands) { + if (DEBUG) { + Log.d(TAG, "connected to " + mSessionToken + ", allowed=" + allowedCommands); + } + synchronized (mLock) { + mIsConnected = true; + } + MediaCommunicationService service = mServiceRef.get(); + if (service != null) { + //TODO: notify session state changed + } + } + + @Override + public void onDisconnected(MediaController2 controller) { + if (DEBUG) { + Log.d(TAG, "disconnected from " + mSessionToken); + } + synchronized (mLock) { + mIsConnected = false; + } + MediaCommunicationService service = mServiceRef.get(); + if (service != null) { + service.onSessionDied(Session2Record.this); + } + } + } } } diff --git a/api/Android.bp b/api/Android.bp index 1fdf1771bb13..1d4698e7c512 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -347,49 +347,3 @@ genrule { out: ["combined-removed-dex.txt"], cmd: "$(location gen_combined_removed_dex.sh) $(location metalava) $(genDir) $(in) > $(out)", } - -genrule { - name: "services-system-server-current.txt", - srcs: [ - ":service-permission{.system-server.api.txt}", - ":non-updatable-system-server-current.txt", - ], - out: ["system-server-current.txt"], - tools: ["metalava"], - cmd: "$(location metalava) --no-banner --format=v2 $(in) --api $(out)", - dists: [ - { - targets: ["droidcore"], - dir: "api", - dest: "system-server-current.txt", - }, - { - targets: ["sdk", "win_sdk"], - dir: "apistubs/android/system-server/api", - dest: "merge-android.txt", - }, - ], -} - -genrule { - name: "services-system-server-removed.txt", - srcs: [ - ":service-permission{.system-server.removed-api.txt}", - ":non-updatable-system-server-removed.txt", - ], - out: ["system-server-removed.txt"], - tools: ["metalava"], - cmd: "$(location metalava) --no-banner --format=v2 $(in) --api $(out)", - dists: [ - { - targets: ["droidcore"], - dir: "api", - dest: "system-server-removed.txt", - }, - { - targets: ["sdk", "win_sdk"], - dir: "apistubs/android/system-server/api", - dest: "merge-removed.txt", - }, - ], -} diff --git a/core/api/current.txt b/core/api/current.txt index fce3b61f7ed3..8733632a701c 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -19290,8 +19290,8 @@ package android.location { method @NonNull public android.location.GnssAntennaInfo.Builder setSignalGainCorrections(@Nullable android.location.GnssAntennaInfo.SphericalCorrections); } - @Deprecated public static interface GnssAntennaInfo.Listener { - method @Deprecated public void onGnssAntennaInfoReceived(@NonNull java.util.List<android.location.GnssAntennaInfo>); + public static interface GnssAntennaInfo.Listener { + method public void onGnssAntennaInfoReceived(@NonNull java.util.List<android.location.GnssAntennaInfo>); } public static final class GnssAntennaInfo.PhaseCenterOffset implements android.os.Parcelable { @@ -19680,7 +19680,7 @@ package android.location { method public boolean hasProvider(@NonNull String); method public boolean isLocationEnabled(); method public boolean isProviderEnabled(@NonNull String); - method @Deprecated public boolean registerAntennaInfoListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssAntennaInfo.Listener); + method public boolean registerAntennaInfoListener(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssAntennaInfo.Listener); method @Deprecated @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback); method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback, @Nullable android.os.Handler); method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public boolean registerGnssMeasurementsCallback(@NonNull java.util.concurrent.Executor, @NonNull android.location.GnssMeasurementsEvent.Callback); @@ -19717,13 +19717,11 @@ package android.location { method public void setTestProviderEnabled(@NonNull String, boolean); method public void setTestProviderLocation(@NonNull String, @NonNull android.location.Location); method @Deprecated public void setTestProviderStatus(@NonNull String, int, @Nullable android.os.Bundle, long); - method @Deprecated public void unregisterAntennaInfoListener(@NonNull android.location.GnssAntennaInfo.Listener); + method public void unregisterAntennaInfoListener(@NonNull android.location.GnssAntennaInfo.Listener); method public void unregisterGnssMeasurementsCallback(@NonNull android.location.GnssMeasurementsEvent.Callback); method public void unregisterGnssNavigationMessageCallback(@NonNull android.location.GnssNavigationMessage.Callback); method public void unregisterGnssStatusCallback(@NonNull android.location.GnssStatus.Callback); - field public static final String ACTION_GNSS_ANTENNA_INFOS_CHANGED = "android.location.action.GNSS_ANTENNA_INFOS_CHANGED"; field public static final String ACTION_GNSS_CAPABILITIES_CHANGED = "android.location.action.GNSS_CAPABILITIES_CHANGED"; - field public static final String EXTRA_GNSS_ANTENNA_INFOS = "android.location.extra.GNSS_ANTENNA_INFOS"; field public static final String EXTRA_GNSS_CAPABILITIES = "android.location.extra.GNSS_CAPABILITIES"; field public static final String EXTRA_LOCATION_ENABLED = "android.location.extra.LOCATION_ENABLED"; field public static final String EXTRA_PROVIDER_ENABLED = "android.location.extra.PROVIDER_ENABLED"; @@ -19866,7 +19864,6 @@ package android.media { method public int getFlags(); method public int getUsage(); method public int getVolumeControlStream(); - method @NonNull public static String usageToString(int); method public void writeToParcel(android.os.Parcel, int); field public static final int ALLOW_CAPTURE_BY_ALL = 1; // 0x1 field public static final int ALLOW_CAPTURE_BY_NONE = 3; // 0x3 @@ -21299,8 +21296,8 @@ package android.media { public static final class MediaCodecInfo.AudioCapabilities { method public android.util.Range<java.lang.Integer> getBitrateRange(); method @NonNull public android.util.Range<java.lang.Integer>[] getInputChannelCountRanges(); - method public int getMaxInputChannelCount(); - method public int getMinInputChannelCount(); + method @IntRange(from=1, to=255) public int getMaxInputChannelCount(); + method @IntRange(from=1, to=255) public int getMinInputChannelCount(); method public android.util.Range<java.lang.Integer>[] getSupportedSampleRateRanges(); method public int[] getSupportedSampleRates(); method public boolean isSampleRateSupported(int); @@ -24757,7 +24754,7 @@ package android.media.session { method @NonNull public java.util.List<android.media.session.MediaController> getActiveSessions(@Nullable android.content.ComponentName); method @NonNull public java.util.List<android.media.Session2Token> getSession2Tokens(); method public boolean isTrustedForMediaControl(@NonNull android.media.session.MediaSessionManager.RemoteUserInfo); - method public void notifySession2Created(@NonNull android.media.Session2Token); + method @Deprecated public void notifySession2Created(@NonNull android.media.Session2Token); method public void removeOnActiveSessionsChangedListener(@NonNull android.media.session.MediaSessionManager.OnActiveSessionsChangedListener); method public void removeOnSession2TokensChangedListener(@NonNull android.media.session.MediaSessionManager.OnSession2TokensChangedListener); } @@ -38079,6 +38076,7 @@ package android.service.notification { field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2 field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0 field public static final String META_DATA_DEFAULT_FILTER_TYPES = "android.service.notification.default_filter_types"; + field public static final String META_DATA_DISABLED_FILTER_TYPES = "android.service.notification.disabled_filter_types"; field public static final int NOTIFICATION_CHANNEL_OR_GROUP_ADDED = 1; // 0x1 field public static final int NOTIFICATION_CHANNEL_OR_GROUP_DELETED = 3; // 0x3 field public static final int NOTIFICATION_CHANNEL_OR_GROUP_UPDATED = 2; // 0x2 diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index f8c9a9ecf4c8..8167622ff13c 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -5013,6 +5013,7 @@ public class Notification implements Parcelable bindNotificationHeader(contentView, p); bindLargeIconAndApplyMargin(contentView, p, result); boolean showProgress = handleProgressBar(contentView, ex, p); + boolean hasSecondLine = showProgress; if (p.hasTitle()) { contentView.setViewVisibility(R.id.title, View.VISIBLE); contentView.setTextViewText(R.id.title, processTextSpans(p.title)); @@ -5028,11 +5029,27 @@ public class Notification implements Parcelable contentView.setTextViewText(textId, processTextSpans(p.text)); setTextViewColorSecondary(contentView, textId, p); contentView.setViewVisibility(textId, View.VISIBLE); + hasSecondLine = true; } + setHeaderlessVerticalMargins(contentView, p, hasSecondLine); return contentView; } + private static void setHeaderlessVerticalMargins(RemoteViews contentView, + StandardTemplateParams p, boolean hasSecondLine) { + if (!p.mHeaderless) { + return; + } + int marginDimen = hasSecondLine + ? R.dimen.notification_headerless_margin_twoline + : R.dimen.notification_headerless_margin_oneline; + contentView.setViewLayoutMarginDimen(R.id.notification_headerless_view_column, + RemoteViews.MARGIN_TOP, marginDimen); + contentView.setViewLayoutMarginDimen(R.id.notification_headerless_view_column, + RemoteViews.MARGIN_BOTTOM, marginDimen); + } + private CharSequence processTextSpans(CharSequence text) { if (hasForegroundColor() || mInNightMode) { return ContrastColorUtil.clearColorSpans(text); @@ -6851,26 +6868,13 @@ public class Notification implements Parcelable if (decorationType <= DevFlags.DECORATION_PARTIAL) { template.removeFromParent(R.id.notification_top_line); } - if (decorationType != DevFlags.DECORATION_FULL_COMPATIBLE) { - // Change the max content size from 60dp (the compatible size) to 48dp - // (the constrained size). This is done by increasing the minimum margin - // (implemented as top/bottom margins) and decreasing the extra margin - // (implemented as the height of shrinkable top/bottom views in the column). - template.setViewLayoutMarginDimen( - R.id.notification_headerless_view_column, - RemoteViews.MARGIN_TOP, - R.dimen.notification_headerless_margin_constrained_minimum); - template.setViewLayoutMarginDimen( - R.id.notification_headerless_view_column, - RemoteViews.MARGIN_BOTTOM, - R.dimen.notification_headerless_margin_constrained_minimum); - template.setViewLayoutHeightDimen( - R.id.notification_headerless_margin_extra_top, - R.dimen.notification_headerless_margin_constrained_extra); - template.setViewLayoutHeightDimen( - R.id.notification_headerless_margin_extra_bottom, - R.dimen.notification_headerless_margin_constrained_extra); - } + // The vertical margins are bigger in the "two-line" scenario than the "one-line" + // scenario, but the 'compatible' decoration state is intended to have 3 lines, + // (1 for the top line views and 2 for the custom views), so in that one case we + // use the smaller 1-line margins. This gives the compatible case 88-16*2=56 dp of + // height, 24dp of which goes to the top line, leaving 32dp for the custom view. + boolean hasSecondLine = decorationType != DevFlags.DECORATION_FULL_COMPATIBLE; + Builder.setHeaderlessVerticalMargins(template, p, hasSecondLine); } else { // also update the end margin to account for the large icon or expander Resources resources = context.getResources(); @@ -9435,11 +9439,16 @@ public class Notification implements Parcelable } private void bindCallerVerification(RemoteViews contentView, StandardTemplateParams p) { + String iconContentDescription = null; + boolean showDivider = true; if (mVerificationIcon != null) { contentView.setImageViewIcon(R.id.verification_icon, mVerificationIcon); contentView.setDrawableTint(R.id.verification_icon, false /* targetBackground */, mBuilder.getSecondaryTextColor(p), PorterDuff.Mode.SRC_ATOP); contentView.setViewVisibility(R.id.verification_icon, View.VISIBLE); + iconContentDescription = mBuilder.mContext.getString( + R.string.notification_verified_content_description); + showDivider = false; // the icon replaces the divider } else { contentView.setViewVisibility(R.id.verification_icon, View.GONE); } @@ -9447,8 +9456,17 @@ public class Notification implements Parcelable contentView.setTextViewText(R.id.verification_text, mVerificationText); mBuilder.setTextViewColorSecondary(contentView, R.id.verification_text, p); contentView.setViewVisibility(R.id.verification_text, View.VISIBLE); + iconContentDescription = null; // let the app's text take precedence } else { contentView.setViewVisibility(R.id.verification_text, View.GONE); + showDivider = false; // no divider if no text + } + contentView.setContentDescription(R.id.verification_icon, iconContentDescription); + if (showDivider) { + contentView.setViewVisibility(R.id.verification_divider, View.VISIBLE); + mBuilder.setTextViewColorSecondary(contentView, R.id.verification_divider, p); + } else { + contentView.setViewVisibility(R.id.verification_divider, View.GONE); } } diff --git a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java index 663a70452b24..51addc95ac79 100644 --- a/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java +++ b/core/java/android/hardware/fingerprint/FingerprintSensorPropertiesInternal.java @@ -85,8 +85,8 @@ public class FingerprintSensorPropertiesInternal extends SensorPropertiesInterna boolean resetLockoutRequiresHardwareAuthToken) { // TODO(b/179175438): Value should be provided from the HAL this(sensorId, strength, maxEnrollmentsPerUser, sensorType, - resetLockoutRequiresHardwareAuthToken, 0 /* sensorLocationX */, - 0 /* sensorLocationY */, 0 /* sensorRadius */); + resetLockoutRequiresHardwareAuthToken, 540 /* sensorLocationX */, + 1636 /* sensorLocationY */, 130 /* sensorRadius */); } /** diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index cf9b534fc29f..6901df7508ab 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -2179,12 +2179,6 @@ public abstract class BatteryStats implements Parcelable { public abstract void finishIteratingHistoryLocked(); - public abstract boolean startIteratingOldHistoryLocked(); - - public abstract boolean getNextOldHistoryLocked(HistoryItem out); - - public abstract void finishIteratingOldHistoryLocked(); - /** * Return the base time offset for the battery history. */ @@ -7061,24 +7055,6 @@ public abstract class BatteryStats implements Parcelable { finishIteratingHistoryLocked(); } } - - if (startIteratingOldHistoryLocked()) { - try { - final HistoryItem rec = new HistoryItem(); - pw.println("Old battery History:"); - HistoryPrinter hprinter = new HistoryPrinter(); - long baseTime = -1; - while (getNextOldHistoryLocked(rec)) { - if (baseTime < 0) { - baseTime = rec.time; - } - hprinter.printNextItem(pw, rec, baseTime, false, (flags&DUMP_VERBOSE) != 0); - } - pw.println(); - } finally { - finishIteratingOldHistoryLocked(); - } - } } if (filtering && (flags&(DUMP_CHARGED_ONLY|DUMP_DAILY_ONLY)) == 0) { diff --git a/core/java/android/permission/PermissionUsageHelper.java b/core/java/android/permission/PermissionUsageHelper.java index 0e35ef98f1b7..4c9e77c35135 100644 --- a/core/java/android/permission/PermissionUsageHelper.java +++ b/core/java/android/permission/PermissionUsageHelper.java @@ -57,6 +57,8 @@ import android.util.ArraySet; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import com.android.internal.R; + import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -186,6 +188,15 @@ public class PermissionUsageHelper { == PackageManager.PERMISSION_GRANTED; } + private boolean isSpeechRecognizerUsage(String op, String packageName) { + if (!OPSTR_RECORD_AUDIO.equals(op)) { + return false; + } + + return packageName.equals( + mContext.getString(R.string.config_systemSpeechRecognizer)); + } + /** * @see PermissionManager.getIndicatorAppOpUsageData */ @@ -317,7 +328,8 @@ public class PermissionUsageHelper { if (packageName.equals(SYSTEM_PKG) || (!isUserSensitive(packageName, user, op) && !isLocationProvider(packageName, user) - && !isAppPredictor(packageName, user))) { + && !isAppPredictor(packageName, user)) + && !isSpeechRecognizerUsage(op, packageName)) { continue; } diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 73e66d0212fa..7aa5bbc930fb 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -85,6 +85,10 @@ import java.util.Objects; * android:name="android.service.notification.default_filter_types" * android:value="1,2"> * </meta-data> + * <meta-data + * android:name="android.service.notification.disabled_filter_types" + * android:value="2"> + * </meta-data> * </service></pre> * * <p>The service should wait for the {@link #onListenerConnected()} event @@ -123,6 +127,19 @@ public abstract class NotificationListenerService extends Service { = "android.service.notification.default_filter_types"; /** + * The name of the {@code meta-data} tag containing a comma separated list of default + * integer notification types that this listener never wants to receive. See + * {@link #FLAG_FILTER_TYPE_ONGOING}, + * {@link #FLAG_FILTER_TYPE_CONVERSATIONS}, {@link #FLAG_FILTER_TYPE_ALERTING), + * and {@link #FLAG_FILTER_TYPE_SILENT}. + * <p>Types provided in this list will appear as 'off' and 'disabled' in the user interface, + * so users don't enable a type that the listener will never bridge to their paired devices.</p> + * + */ + public static final String META_DATA_DISABLED_FILTER_TYPES + = "android.service.notification.disabled_filter_types"; + + /** * {@link #getCurrentInterruptionFilter() Interruption filter} constant - * Normal interruption filter. */ diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS index c43c410ab995..e66b17aa4426 100644 --- a/core/java/android/view/OWNERS +++ b/core/java/android/view/OWNERS @@ -77,7 +77,3 @@ per-file SyncRtSurfaceTransactionApplier.java = file:/services/core/java/com/and per-file ViewRootInsetsControllerHost.java = file:/services/core/java/com/android/server/wm/OWNERS per-file Window*.java = file:/services/core/java/com/android/server/wm/OWNERS per-file Window*.aidl = file:/services/core/java/com/android/server/wm/OWNERS - -# Scroll Capture -per-file *ScrollCapture*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS -per-file *CaptureHelper*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 62e1ee19b25e..e4c8ddbbd256 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -81,7 +81,6 @@ import android.util.IndentingPrintWriter; import android.util.IntArray; import android.util.KeyValueListParser; import android.util.Log; -import android.util.LogWriter; import android.util.LongSparseArray; import android.util.LongSparseLongArray; import android.util.MutableInt; @@ -108,7 +107,6 @@ import com.android.internal.os.SystemServerCpuThreadReader.SystemServiceCpuThrea import com.android.internal.power.MeasuredEnergyStats; import com.android.internal.power.MeasuredEnergyStats.StandardEnergyBucket; import com.android.internal.util.ArrayUtils; -import com.android.internal.util.FastPrintWriter; import com.android.internal.util.FrameworkStatsLog; import com.android.internal.util.XmlUtils; import com.android.net.module.util.NetworkCapabilitiesUtils; @@ -164,7 +162,6 @@ public class BatteryStatsImpl extends BatteryStats { private static final boolean DEBUG_BINDER_STATS = false; private static final boolean DEBUG_MEMORY = false; private static final boolean DEBUG_HISTORY = false; - private static final boolean USE_OLD_HISTORY = false; // for debugging. // TODO: remove "tcp" from network methods, since we measure total stats. @@ -172,7 +169,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - static final int VERSION = 193 + (USE_OLD_HISTORY ? 1000 : 0); + static final int VERSION = 193; // The maximum number of names wakelocks we will keep track of // per uid; once the limit is reached, we batch the remaining wakelocks @@ -743,7 +740,6 @@ public class BatteryStatsImpl extends BatteryStats { final Parcel mHistoryBuffer = Parcel.obtain(); final HistoryItem mHistoryLastWritten = new HistoryItem(); final HistoryItem mHistoryLastLastWritten = new HistoryItem(); - final HistoryItem mHistoryReadTmp = new HistoryItem(); final HistoryItem mHistoryAddTmp = new HistoryItem(); final HashMap<HistoryTag, Integer> mHistoryTagPool = new HashMap<>(); String[] mReadHistoryStrings; @@ -3917,44 +3913,6 @@ public class BatteryStatsImpl extends BatteryStats { void addHistoryRecordInnerLocked(long elapsedRealtimeMs, long uptimeMs, HistoryItem cur) { addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, cur); - - if (!USE_OLD_HISTORY) { - return; - } - - if (!mHaveBatteryLevel || !mRecordingHistory) { - return; - } - - // If the current time is basically the same as the last time, - // and no states have since the last recorded entry changed and - // are now resetting back to their original value, then just collapse - // into one record. - if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE - && (mHistoryBaseTimeMs + elapsedRealtimeMs) < (mHistoryEnd.time + 1000) - && ((mHistoryEnd.states^cur.states)&mChangedStates&mActiveHistoryStates) == 0 - && ((mHistoryEnd.states2^cur.states2)&mChangedStates2&mActiveHistoryStates2) == 0) { - // If the current is the same as the one before, then we no - // longer need the entry. - if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE - && (mHistoryBaseTimeMs + elapsedRealtimeMs) < (mHistoryEnd.time + 500) - && mHistoryLastEnd.sameNonEvent(cur)) { - mHistoryLastEnd.next = null; - mHistoryEnd.next = mHistoryCache; - mHistoryCache = mHistoryEnd; - mHistoryEnd = mHistoryLastEnd; - mHistoryLastEnd = null; - } else { - mChangedStates |= mHistoryEnd.states^(cur.states&mActiveHistoryStates); - mChangedStates2 |= mHistoryEnd.states^(cur.states2&mActiveHistoryStates2); - mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, cur); - } - return; - } - - mChangedStates = 0; - mChangedStates2 = 0; - addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur); } public void addHistoryEventLocked(long elapsedRealtimeMs, long uptimeMs, int code, @@ -3992,15 +3950,6 @@ public class BatteryStatsImpl extends BatteryStats { void clearHistoryLocked() { if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!"); - if (USE_OLD_HISTORY) { - if (mHistory != null) { - mHistoryEnd.next = mHistoryCache; - mHistoryCache = mHistory; - mHistory = mHistoryLastEnd = mHistoryEnd = null; - } - mNumHistoryItems = 0; - } - mHistoryBaseTimeMs = 0; mLastHistoryElapsedRealtimeMs = 0; mTrackRunningHistoryElapsedRealtimeMs = 0; @@ -11220,60 +11169,6 @@ public class BatteryStatsImpl extends BatteryStats { return mNextMaxDailyDeadlineMs; } - @Override - public boolean startIteratingOldHistoryLocked() { - if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize() - + " pos=" + mHistoryBuffer.dataPosition()); - if ((mHistoryIterator = mHistory) == null) { - return false; - } - mHistoryBuffer.setDataPosition(0); - mHistoryReadTmp.clear(); - mReadOverflow = false; - mIteratingHistory = true; - return true; - } - - @Override - public boolean getNextOldHistoryLocked(HistoryItem out) { - boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize(); - if (!end) { - readHistoryDelta(mHistoryBuffer, mHistoryReadTmp); - mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW; - } - HistoryItem cur = mHistoryIterator; - if (cur == null) { - if (!mReadOverflow && !end) { - Slog.w(TAG, "Old history ends before new history!"); - } - return false; - } - out.setTo(cur); - mHistoryIterator = cur.next; - if (!mReadOverflow) { - if (end) { - Slog.w(TAG, "New history ends before old history!"); - } else if (!out.same(mHistoryReadTmp)) { - PrintWriter pw = new FastPrintWriter(new LogWriter(android.util.Log.WARN, TAG)); - pw.println("Histories differ!"); - pw.println("Old history:"); - (new HistoryPrinter()).printNextItem(pw, out, 0, false, true); - pw.println("New history:"); - (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, 0, false, - true); - pw.flush(); - } - } - return true; - } - - @Override - public void finishIteratingOldHistoryLocked() { - mIteratingHistory = false; - mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); - mHistoryIterator = null; - } - public int getHistoryTotalSize() { return mConstants.MAX_HISTORY_BUFFER * mConstants.MAX_HISTORY_FILES; } @@ -14635,7 +14530,7 @@ public class BatteryStatsImpl extends BatteryStats { Parcel p = Parcel.obtain(); final long start = SystemClock.uptimeMillis(); - writeHistoryBuffer(p, true, true); + writeHistoryBuffer(p, true); if (DEBUG) { Slog.d(TAG, "writeHistoryBuffer duration ms:" + (SystemClock.uptimeMillis() - start) + " bytes:" + p.dataSize()); @@ -14729,7 +14624,7 @@ public class BatteryStatsImpl extends BatteryStats { if (raw.length > 0) { history.unmarshall(raw, 0, raw.length); history.setDataPosition(0); - readHistoryBuffer(history, true); + readHistoryBuffer(history); } if (DEBUG) { Slog.d(TAG, "readLocked history file::" @@ -14753,10 +14648,6 @@ public class BatteryStatsImpl extends BatteryStats { mRecordingHistory = true; final long elapsedRealtimeMs = mClocks.elapsedRealtime(); final long uptimeMs = mClocks.uptimeMillis(); - if (USE_OLD_HISTORY) { - addHistoryRecordLocked(elapsedRealtimeMs, uptimeMs, - HistoryItem.CMD_START, mHistoryCur); - } addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_START, mHistoryCur); startRecordingHistory(elapsedRealtimeMs, uptimeMs, false); } @@ -14768,7 +14659,7 @@ public class BatteryStatsImpl extends BatteryStats { return 0; } - void readHistoryBuffer(Parcel in, boolean andOldHistory) throws ParcelFormatException { + void readHistoryBuffer(Parcel in) throws ParcelFormatException { final int version = in.readInt(); if (version != VERSION) { Slog.w("BatteryStats", "readHistoryBuffer: version got " + version @@ -14796,10 +14687,6 @@ public class BatteryStatsImpl extends BatteryStats { in.setDataPosition(curPos + bufSize); } - if (andOldHistory) { - readOldHistory(in); - } - if (DEBUG_HISTORY) { StringBuilder sb = new StringBuilder(128); sb.append("****************** OLD mHistoryBaseTimeMs: "); @@ -14828,18 +14715,7 @@ public class BatteryStatsImpl extends BatteryStats { } } - void readOldHistory(Parcel in) { - if (!USE_OLD_HISTORY) { - return; - } - mHistory = mHistoryEnd = mHistoryCache = null; - while (in.dataAvail() > 0) { - HistoryItem rec = new HistoryItem(in); - addHistoryRecordLocked(rec); - } - } - - void writeHistoryBuffer(Parcel out, boolean inclData, boolean andOldHistory) { + void writeHistoryBuffer(Parcel out, boolean inclData) { if (DEBUG_HISTORY) { StringBuilder sb = new StringBuilder(128); sb.append("****************** WRITING mHistoryBaseTimeMs: "); @@ -14860,22 +14736,6 @@ public class BatteryStatsImpl extends BatteryStats { if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: " + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition()); out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize()); - - if (andOldHistory) { - writeOldHistory(out); - } - } - - void writeOldHistory(Parcel out) { - if (!USE_OLD_HISTORY) { - return; - } - HistoryItem rec = mHistory; - while (rec != null) { - if (rec.time >= 0) rec.writeToParcel(out, 0); - rec = rec.next; - } - out.writeLong(-1); } public void readSummaryFromParcel(Parcel in) throws ParcelFormatException { @@ -14888,7 +14748,7 @@ public class BatteryStatsImpl extends BatteryStats { boolean inclHistory = in.readBoolean(); if (inclHistory) { - readHistoryBuffer(in, true); + readHistoryBuffer(in); mBatteryStatsHistory.readFromParcel(in); } @@ -15407,7 +15267,7 @@ public class BatteryStatsImpl extends BatteryStats { out.writeBoolean(inclHistory); if (inclHistory) { - writeHistoryBuffer(out, true, true); + writeHistoryBuffer(out, true); mBatteryStatsHistory.writeToParcel(out); } @@ -15920,7 +15780,7 @@ public class BatteryStatsImpl extends BatteryStats { throw new ParcelFormatException("Bad magic number: #" + Integer.toHexString(magic)); } - readHistoryBuffer(in, false); + readHistoryBuffer(in); mBatteryStatsHistory.readFromParcel(in); mStartCount = in.readInt(); @@ -16159,7 +16019,7 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(MAGIC); - writeHistoryBuffer(out, true, false); + writeHistoryBuffer(out, true); mBatteryStatsHistory.writeToParcel(out); out.writeInt(mStartCount); diff --git a/core/java/com/android/internal/view/OWNERS b/core/java/com/android/internal/view/OWNERS index eb2478f6550a..851d1f37522a 100644 --- a/core/java/com/android/internal/view/OWNERS +++ b/core/java/com/android/internal/view/OWNERS @@ -18,7 +18,3 @@ per-file AppearanceRegion = file:/services/core/java/com/android/server/wm/OWNER per-file BaseIWIndow.java = file:/services/core/java/com/android/server/wm/OWNERS per-file RotationPolicy.java = file:/services/core/java/com/android/server/wm/OWNERS per-file WindowManagerPolicyThread.java = file:/services/core/java/com/android/server/wm/OWNERS - -# Scroll Capture -per-file *ScrollCapture*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS -per-file *CaptureHelper*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS diff --git a/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java b/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java new file mode 100644 index 000000000000..742bdfdde756 --- /dev/null +++ b/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.widget; + +import android.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RemoteViews; + +/** + * This view will measure itself as having 0 size if all of its children are {@link #GONE}. + * Otherwise it acts like a normal {@link FrameLayout}. + */ +@RemoteViews.RemoteView +public class NotificationVanishingFrameLayout extends FrameLayout { + public NotificationVanishingFrameLayout(Context context) { + this(context, null, 0, 0); + } + + public NotificationVanishingFrameLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0, 0); + } + + public NotificationVanishingFrameLayout(Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public NotificationVanishingFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (allChildrenGone()) { + int zeroSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY); + super.onMeasure(zeroSpec, zeroSpec); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + private boolean allChildrenGone() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (child != null && child.getVisibility() != GONE) { + return false; + } + } + return true; + } +} diff --git a/core/jni/OWNERS b/core/jni/OWNERS index 19c6a625646e..35d1d7bd7946 100644 --- a/core/jni/OWNERS +++ b/core/jni/OWNERS @@ -42,9 +42,6 @@ per-file android_os_HwParcel* = file:platform/system/libhwbinder:/OWNERS per-file android_os_HwRemoteBinder* = file:platform/system/libhwbinder:/OWNERS per-file EphemeralStorage* = file:platform/system/libhwbinder:/OWNERS -# Sensor -per-file android_hardware_SensorManager* = arthuri@google.com, bduddie@google.com, stange@google.com - per-file *Zygote* = file:/ZYGOTE_OWNERS per-file Android.bp = file:platform/build/soong:/OWNERS per-file android_animation_* = file:/core/java/android/animation/OWNERS diff --git a/core/res/res/layout/notification_template_conversation_header.xml b/core/res/res/layout/notification_template_conversation_header.xml index 302a388cf1b2..e01d8035fe35 100644 --- a/core/res/res/layout/notification_template_conversation_header.xml +++ b/core/res/res/layout/notification_template_conversation_header.xml @@ -99,13 +99,26 @@ android:visibility="gone" /> + <TextView + android:id="@+id/verification_divider" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="@style/TextAppearance.DeviceDefault.Notification.Info" + android:layout_marginStart="@dimen/notification_conversation_header_separating_margin" + android:layout_marginEnd="@dimen/notification_conversation_header_separating_margin" + android:text="@string/notification_header_divider_symbol" + android:layout_gravity="center" + android:paddingTop="1sp" + android:singleLine="true" + android:visibility="gone" + /> + <ImageView android:id="@+id/verification_icon" android:layout_width="@dimen/notification_verification_icon_size" android:layout_height="@dimen/notification_verification_icon_size" android:layout_gravity="center" android:layout_marginStart="4dp" - android:contentDescription="@string/notification_alerted_content_description" android:paddingTop="2dp" android:scaleType="fitCenter" android:src="@drawable/ic_notifications_alerted" diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml index d79cb74a3d53..b83611bcc177 100644 --- a/core/res/res/layout/notification_template_material_base.xml +++ b/core/res/res/layout/notification_template_material_base.xml @@ -91,26 +91,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginBottom="@dimen/notification_headerless_margin_minimum" - android:layout_marginTop="@dimen/notification_headerless_margin_minimum" + android:layout_marginBottom="@dimen/notification_headerless_margin_twoline" + android:layout_marginTop="@dimen/notification_headerless_margin_twoline" android:orientation="vertical" > - <!-- - This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is - what causes this view (and it's counterpart at the opposite end) to collapse before the - actual content views do. - This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support - headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line - variant is 56dp and the 2- and 3-line variants are both 76dp. - --> - <FrameLayout - android:id="@+id/notification_headerless_margin_extra_top" - android:layout_width="match_parent" - android:layout_height="@dimen/notification_headerless_margin_extra" - android:layout_weight="1" - /> - <!-- extends ViewGroup --> <NotificationTopLineView android:id="@+id/notification_top_line" @@ -153,12 +138,20 @@ android:orientation="vertical" > - <include - layout="@layout/notification_template_text" + <com.android.internal.widget.NotificationVanishingFrameLayout android:layout_width="match_parent" android:layout_height="@dimen/notification_headerless_line_height" - android:layout_marginTop="0dp" - /> + > + <!-- This is the simplest way to keep this text vertically centered without using + gravity="center_vertical" which causes jumpiness in expansion animations. --> + <include + layout="@layout/notification_template_text" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_text_height" + android:layout_gravity="center_vertical" + android:layout_marginTop="0dp" + /> + </com.android.internal.widget.NotificationVanishingFrameLayout> <include layout="@layout/notification_template_progress" @@ -168,21 +161,6 @@ </LinearLayout> - <!-- - This invisible FrameLayout is here as a collapsible padding. Having a layout_weight=1 is - what causes this view (and it's counterpart at the opposite end) to collapse before the - actual content views do. - This pair of 10dp collapsible paddings (plus the 16dp fixed margins) allow us to support - headerless notifications of 1-3 lines (where each line is 20dp tall) where the 1-line - variant is 56dp and the 2- and 3-line variants are both 76dp. - --> - <FrameLayout - android:id="@+id/notification_headerless_margin_extra_bottom" - android:layout_width="match_parent" - android:layout_height="@dimen/notification_headerless_margin_extra" - android:layout_weight="1" - /> - </LinearLayout> </com.android.internal.widget.NotificationMaxHeightFrameLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index aa4baf3c94c0..b34c8764d157 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-versoek is na video-oproep toe verander"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-versoek is na USSD-versoek toe verander"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Na nuwe SS-versoek toe verander"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Uitvissingwaarskuwing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Werkprofiel"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Kennisgewing gegee"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Vou uit"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 9b11350ba686..e064a1e5c069 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"የSS ጥያቄ ወደ የቪዲዮ ጥሪ ተለውጧል"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"የSS ጥያቄ ወደ የUSSD ጥያቄ ተለውጧል"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"ወደ አዲስ የSS ጥያቄ ተለውጧል"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"የማስገር ማንቂያ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"የስራ መገለጫ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"ነቅተዋል"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"ዘርጋ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index bbf30fe42104..50cc8e183d42 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1995,8 +1995,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"تم تغيير طلب SS إلى مكالمة فيديو."</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"تم تغيير طلب SS إلى طلب USSD."</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"تم التغيير إلى طلب SS الجديد."</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"تنبيه بشأن تصيّد احتيالي"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"الملف الشخصي للعمل"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"تمّ تفعيل التنبيه"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"توسيع"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 549784d95765..0d5a0709dfa4 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS sorğusu video zəngə dəyişdirildi"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS sorğusu USSD sorğusuna dəyişdirildi"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Yeni SS sorğusuna dəyişdirildi"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Fişinq siqnalı"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"İş profili"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Xəbərdarlıq edildi"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Genişləndirin"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 880c9860b244..5ca809f03a37 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-запыт заменены на відэавыклік"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-запыт заменены на USSD-запыт"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Зроблена замена на новы SS-запыт"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Абвестка пра фішынг"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Працоўны профіль"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"З гукам"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Разгарнуць"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index dd38e9aac67f..e0b72fdc5b9a 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS অনুরোধ ভিডিও কলে পরিবর্তন করা হয়েছে"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS অনুরোধ USSD অনুরোধে পরিবর্তন করা হয়েছে"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"নতুন SS অনুরোধে পরিবর্তন করা হয়েছে"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ফিশিংয়ের সতর্কতা"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"কর্মস্থলের প্রোফাইল"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"সতর্ক করা হয়েছে"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"বড় করুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index d5b10d52db2d..5dd45545e111 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -689,7 +689,7 @@ <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"pokrenuti korištenje odobrenja za pregled"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Dozvoljava vlasniku da pokrene korištenje odobrenja za aplikaciju. Ne bi trebalo biti potrebno za obične aplikacije."</string> <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"pristup podacima senzora velikom brzinom uzorkovanja"</string> - <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Dozvoljava aplikaciji da uzorkuje podatke senzora većom brzinom od 200 Hz"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Dozvoljava aplikaciji da uzorkuje podatke senzora brzinom većom od 200 Hz"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Postavljanje pravila za lozinke"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontrolira dužinu i znakove koji su dozvoljeni u lozinkama za zaključavanje ekrana i PIN-ovima."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Prati pokušaje otključavanja ekrana"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 091ed836a37c..f5fb059abd51 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Požadavek SS byl změněn na videohovor"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Požadavek SS byl změněn na požadavek USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Změněno na nový požadavek SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Upozornění na phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Pracovní profil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Upozorněno"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Rozbalit"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 8e191003ca9d..3f9783b30382 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1873,8 +1873,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-anmodningen blev ændret til et videoopkald"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-anmodningen blev ændret til en USSD-anmodning"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Ændret til en SS-anmodning"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Phishingadvarsel"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Arbejdsprofil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Underrettet"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Udvid"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 358a1f192cd0..9efc69c2a917 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Το αίτημα SS τροποποιήθηκε σε βιντεοκλήση"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Το αίτημα SS τροποποιήθηκε σε αίτημα USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Τροποποιήθηκε σε νέο αίτημα SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Ειδοποίηση ηλεκτρονικού ψαρέματος (phishing)"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Προφίλ εργασίας"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Ειδοποιήθηκε"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Ανάπτυξη"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index e81d6d158fe6..c4b44a227fa9 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Se cambió la solicitud SS por una videollamada"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Se cambió la solicitud SS por una solicitud USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Se cambió a una nueva solicitud SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerta de suplantación de identidad (phishing)"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Perfil de trabajo"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alerta enviada"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Expandir"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 70cac4a58781..56717a7bad5c 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Se ha cambiado la solicitud de SS a una videollamada"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Se ha cambiado la solicitud de SS a una solicitud de USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Se ha cambiado a una nueva solicitud de SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerta de phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Perfil de trabajo"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Con sonido"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Mostrar"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 2a2db3af8f43..f73b62552bb6 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-taotlus muudeti videokõneks"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-taotlus muudeti USSD-taotluseks"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Muudeti uueks SS-taotluseks"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Andmepüügihoiatus"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Tööprofiil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Teavitatud"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Laienda"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 901d8661e411..9daa6a4ae2f0 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -451,7 +451,7 @@ <string name="permdesc_camera" msgid="5240801376168647151">"Aplikazioak abian den bitartean erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko."</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"Argazkiak atera eta bideoak grabatu atzeko planoan."</string> <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"Aplikazioak edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko."</string> - <string name="permlab_systemCamera" msgid="3642917457796210580">"onartu aplikazio edo zerbitzu bati sistemako kamerak atzitzea argazkiak eta bideoak ateratzeko"</string> + <string name="permlab_systemCamera" msgid="3642917457796210580">"eman sistemako kamerak atzitzeko baimena aplikazio edo zerbitzu bati argazkiak ateratzeko eta bideoak grabatzeko"</string> <string name="permdesc_systemCamera" msgid="5938360914419175986">"Pribilegioa duen edo sistemakoa den aplikazio honek edonoiz erabil dezake kamera argazkiak ateratzeko eta bideoak grabatzeko. Halaber, android.permission.CAMERA baimena izan behar du aplikazioak."</string> <string name="permlab_cameraOpenCloseListener" msgid="5548732769068109315">"eman jakinarazpenak jasotzeko baimena aplikazioari edo zerbitzuari kamerak ireki edo ixten direnean."</string> <string name="permdesc_cameraOpenCloseListener" msgid="2002636131008772908">"Kamera ireki edo itxi dela (eta zer aplikaziorekin) dioten jakinarazpenak jaso ditzake aplikazio honek."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index ec195e53364b..d93324ba59f4 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"درخواست SS به تماس تصویری تغییر کرد"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"درخواست SS به درخواست USSD تغییر کرد"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"به درخواست SS جدید تغییر کرد"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"هشدار رمزگیری"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"نمایه کاری"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"هشدار ارسال شد"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"بزرگ کردن"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 6773dde66de5..df224aa60334 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-pyyntö vaihdettu videopuheluksi"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-pyyntö vaihdettu USSD-pyynnöksi"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Vaihdettu uudeksi SS-pyynnöksi"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Varoitus tietojenkalastelusta"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Työprofiili"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Hälytti"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Laajenna"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 9c4f92a0bc44..ffd7fb61eef1 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"La demande SS a été remplacée par une demande d\'appel vidéo"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"La demande SS a été remplacée par une demande USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"La demande a été remplacée par une nouvelle demande SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerte d\'hameçonnage"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil professionnel"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alerté"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Développer"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 78af86f06b34..f3579a93ab50 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Requête SS transformée en appel vidéo"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Requête SS transformée en requête USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Remplacement par une nouvelle requête SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerte de hameçonnage"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil professionnel"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alerte envoyée"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Développer"</string> @@ -2068,7 +2067,7 @@ <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"Retour"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"Applications récentes"</string> <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"Notifications"</string> - <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"Configuration rapide"</string> + <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"Réglages rapides"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"Boîte de dialogue Marche/Arrêt"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"Verrouiller l\'écran"</string> <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"Capture d\'écran"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 949e48629d4f..fc7ba23b5a63 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"A solicitude SS transformouse nunha videochamada"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"A solicitude SS transformouse nunha solicitude USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Transformouse nunha nova solicitude SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerta de phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Perfil de traballo"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Con son"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Despregar"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 29ce76bd8e7c..ead389e22f7d 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS વિનંતીને વીડિઓ કૉલમાં બદલવામાં આવી છે"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS વિનંતીને USSD વિનંતીમાં બદલવામાં આવી છે"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"નવી SS વિનંતીમાં બદલવામાં આવી છે"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ફિશિંગ અલર્ટ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ઑફિસની પ્રોફાઇલ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"અલર્ટ કરેલ"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"વિસ્તૃત કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 15bb461fbb66..fbe9abc06c1b 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -685,7 +685,7 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ऐप को परेशान न करें कॉन्फ़िगरेशन पढ़ने और लिखने देती है."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"देखने की अनुमतियां चालू करें"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"इस्तेमाल करने वाले को किसी ऐप्लिकेशन के लिए अनुमतियों का इस्तेमाल शुरू करने देता है. सामान्य ऐप्लिकेशन के लिए इसकी ज़रूरत कभी नहीं पड़ती."</string> - <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"सेंसर डेटा को नमूने लेने की तेज़ दर पर ऐक्सेस करें"</string> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"सेंसर डेटा को, नमूने लेने की तेज़ दर पर ऐक्सेस करें"</string> <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"यह अनुमति मिलने पर ऐप्लिकेशन, 200 हर्ट्ज़ से ज़्यादा की दर पर सेंसर डेटा का नमूना ले पाएगा"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करना"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड और पिन की लंबाई और उनमें स्वीकृत वर्णों को नियंत्रित करना."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index d966249f7fb4..e79d6c280f6d 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Az SS-kérés módosítva videohívásra"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Az SS-kérés módosítva USSD-kérésre"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Új SS-kérésre módosítva"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Adathalászati figyelmeztetés"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Munkaprofil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Értesítve"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Kibontás"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 6110be3b91d9..ae6255120e47 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -686,7 +686,7 @@ <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"թույլտվությունների մասին տվյալների հասանելիություն"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"Հավելվածին հասանելի կդառնան թույլտվությունների մասին տվյալները։ Այս թույլտվությունն անհրաժեշտ չէ սովորական հավելվածներին։"</string> <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"օգտագործել սենսորների տվյալները բարձր հաճախականության վրա"</string> - <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Թույլ է տալիս հավելվածին փորձել սենսորների տվյալները 200 Հց-ից ավել հաճախականության վրա"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"Թույլ է տալիս հավելվածին փորձել սենսորների տվյալները 200 Հց-ից բարձր հաճախականության վրա"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Սահմանել գաղտնաբառի կանոնները"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Կառավարել էկրանի ապակողպման գաղտնաբառերի և PIN կոդերի թույլատրելի երկարությունն ու գրանշանները:"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"Վերահսկել էկրանի ապակողպման փորձերը"</string> @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS հարցումը փոխվել է տեսազանգի"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS հարցումը փոխվել է USSD հարցման"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Փոխվել է նոր SS հարցման"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Ֆիշինգի մասին զգուշացում"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Աշխատանքային պրոֆիլ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Ուղարկվել է զգուշացում"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Ընդարձակել"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 3335f599b50a..06b12f9afee3 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Permintaan SS diubah ke panggilan video"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Permintaan SS diubah ke permintaan USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Diubah ke permintaan SS baru"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Peringatan phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil kerja"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Diingatkan"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Luaskan"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 86a4638a6633..f68196b1b6f8 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-beiðni breytt í myndsímtal"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-beiðni breytt í USSD-beiðni"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Breytt í nýja SS-beiðni"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Viðvörun um vefveiðar"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Vinnusnið"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Tilkynnt"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Stækka"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index fa6b46110d4c..a3f72c6a19ec 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Richiesta SS modificata in videochiamata"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Richiesta SS modificata in richiesta USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Modificata in nuova richiesta SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Allerta phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profilo di lavoro"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Avviso inviato"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Espandi"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index d9b889ebe436..19364eba24f5 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"בקשת SS שונתה לשיחת וידאו"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"בקשת SS שונתה לבקשת USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"היה שינוי לבקשת SS חדשה"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"התראה על פישינג"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"פרופיל עבודה"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"נשלחה התראה"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"הרחב"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 68213defda29..2bbea8be7c04 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -538,10 +538,10 @@ <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"このアプリに画面ロックの複雑さレベル(高、中、低、なし)を認識することを許可します。複雑さレベルは、画面ロックの文字数の範囲やタイプを示すものです。アプリから一定レベルまで画面ロックを更新するよう推奨されることもありますが、ユーザーは無視したり別の操作を行ったりできます。画面ロックは平文で保存されないため、アプリが正確なパスワードを知ることはありません。"</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"生体認証ハードウェアの使用"</string> <string name="permdesc_useBiometric" msgid="7502858732677143410">"生体認証ハードウェアを認証に使用することをアプリに許可します"</string> - <string name="permlab_manageFingerprint" msgid="7432667156322821178">"指紋ハードウェアの管理"</string> + <string name="permlab_manageFingerprint" msgid="7432667156322821178">"指紋認証ハードウェアの管理"</string> <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"使用する指紋テンプレートの追加や削除を行う方法の呼び出しをアプリに許可します。"</string> - <string name="permlab_useFingerprint" msgid="1001421069766751922">"指紋ハードウェアの使用"</string> - <string name="permdesc_useFingerprint" msgid="412463055059323742">"指紋ハードウェアを認証に使用することをアプリに許可します"</string> + <string name="permlab_useFingerprint" msgid="1001421069766751922">"指紋認証ハードウェアの使用"</string> + <string name="permdesc_useFingerprint" msgid="412463055059323742">"指紋認証ハードウェアを認証に使用することをアプリに許可します"</string> <string name="permlab_audioWrite" msgid="8501705294265669405">"音楽コレクションの変更"</string> <string name="permdesc_audioWrite" msgid="8057399517013412431">"音楽コレクションの変更をアプリに許可します。"</string> <string name="permlab_videoWrite" msgid="5940738769586451318">"動画コレクションの変更"</string> @@ -567,7 +567,7 @@ <string name="fingerprint_authenticated" msgid="2024862866860283100">"指紋認証を完了しました"</string> <string name="face_authenticated_no_confirmation_required" msgid="8867889115112348167">"顔を認証しました"</string> <string name="face_authenticated_confirmation_required" msgid="6872632732508013755">"顔を認証しました。[確認] を押してください"</string> - <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"指紋ハードウェアは使用できません。"</string> + <string name="fingerprint_error_hw_not_available" msgid="4571700896929561202">"指紋認証ハードウェアは使用できません。"</string> <string name="fingerprint_error_no_space" msgid="6126456006769817485">"指紋を保存できません。既存の指紋を削除してください。"</string> <string name="fingerprint_error_timeout" msgid="2946635815726054226">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string> <string name="fingerprint_error_canceled" msgid="540026881380070750">"指紋の操作をキャンセルしました。"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 3c764544a5c4..bd444bdd5d7a 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS მოთხოვნა შეიცვალა ვიდეოზარის მოთხოვნით"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS მოთხოვნა შეიცვალა USSD მოთხოვნით"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"შეიცვალა ახალი SS მოთხოვნით"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"გაფრთხილება ფიშინგის შესახებ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"სამსახურის პროფილი"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"გაფრთხილებით"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"გაშლა"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 38f947524edc..abf4df4fa790 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS сұрауы бейне қоңырауға өзгертілді"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS сұрауы USSD сұрауына өзгертілді"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Жаңа SS сұрауына өзгертілді"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Фишинг ескертуі"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Жұмыс профилі"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Ескертілді"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Жаю"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index cf0f644cb27b..b8aae35b30bf 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS ವಿನಂತಿಯನ್ನು ವೀಡಿಯೊ ಕರೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS ವಿನಂತಿಯನ್ನು USSD ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"ಹೊಸ SS ವಿನಂತಿಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ಫಿಶಿಂಗ್ ಕುರಿತು ಎಚ್ಚರಿಕೆ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"ಎಚ್ಚರಿಕೆ ನೀಡಲಾಗಿದೆ"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"ವಿಸ್ತೃತಗೊಳಿಸಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 8fde34c190a3..1abdb1260a97 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS 요청이 화상 통화로 변경됨"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS 요청이 USSD 요청으로 변경됨"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"새 SS 요청으로 변경됨"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"피싱 알림"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"직장 프로필"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"알림 전송됨"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"펼치기"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index aa5d01c1a946..87d303b69420 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1206,7 +1206,7 @@ <string name="unsupported_compile_sdk_check_update" msgid="1103639989147664456">"Жаңыртууну издөө"</string> <string name="smv_application" msgid="3775183542777792638">"<xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосу (<xliff:g id="PROCESS">%2$s</xliff:g> процесси) өз алдынча иштеткен StrictMode саясатын бузду."</string> <string name="smv_process" msgid="1398801497130695446">"<xliff:g id="PROCESS">%1$s</xliff:g> процесси өзүнүн мажбурланган StrictMode саясатын бузуп койду."</string> - <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"Телефон жаңыртылууда…"</string> + <string name="android_upgrading_title" product="default" msgid="7279077384220829683">"Телефон жаңырууда…"</string> <string name="android_upgrading_title" product="tablet" msgid="4268417249079938805">"Планшет жаңыртылууда…"</string> <string name="android_upgrading_title" product="device" msgid="6774767702998149762">"Түзмөк жаңыртылууда…"</string> <string name="android_start_title" product="default" msgid="4036708252778757652">"Телефон күйгүзүлүүдө…"</string> @@ -1216,7 +1216,7 @@ <string name="android_upgrading_fstrim" msgid="3259087575528515329">"Сактагыч ыңгайлаштырылууда."</string> <string name="android_upgrading_notification_title" product="default" msgid="3509927005342279257">"Тутумду жаңыртуу аяктоодо…"</string> <string name="app_upgrading_toast" msgid="1016267296049455585">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңыртылууда..."</string> - <string name="android_upgrading_apk" msgid="1339564803894466737">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колдонмо ыңгайлаштырылууда."</string> + <string name="android_upgrading_apk" msgid="1339564803894466737">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колдонмо оптималдаштырылууда."</string> <string name="android_preparing_apk" msgid="589736917792300956">"<xliff:g id="APPNAME">%1$s</xliff:g> даярдалууда."</string> <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Колдонмолорду иштетип баштоо"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Жүктөлүүдө"</string> @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS сурамы видео чалууга өзгөртүлдү"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS сурамы USSD сурамына өзгөртүлдү"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Жаңы SS сурамына өзгөртүлдү"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Фишинг жөнүндө эскертүү"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Жумуш профили"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Эскертилди"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Жайып көрсөтүү"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 8f64bddc6bf0..9d11cc5ddd61 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS užklausa pakeista į vaizdo skambutį"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS užklausa pakeista į USSD užklausą"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Pakeista į naują SS užklausą"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Įspėjimas apie sukčiavimą"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Darbo profilis"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Įspėjimas išsiųstas"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Išskleisti"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 346ade469828..f0fd8a1e7372 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1902,8 +1902,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS pieprasījums mainīts uz videozvanu"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS pieprasījums mainīts uz USSD pieprasījumu"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Mainīts uz jaunu SS pieprasījumu"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Brīdinājums par pikšķerēšanu"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Darba profils"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Brīdināts"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Izvērst"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 8d176ad552a3..169ec4421ca6 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Барањето SS е изменето во видео повик"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Барањето SS е изменето во барање USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Променето на ново барање SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Предупредување за фишинг"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Работен профил"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Предупредено"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Прошири"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index fd61768347d3..cb4240d9d680 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -685,10 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"\'ശല്യപ്പെടുത്തരുത്\' കോൺഫിഗറേഷൻ വായിക്കുന്നതിനും എഴുതുന്നതിനും ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"അനുമതി ഉപയോഗം കാണാൻ ആരംഭിക്കുക"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ഒരു ആപ്പിനുള്ള അനുമതി ഉപയോഗം ആരംഭിക്കാൻ ഹോൾഡറിനെ അനുവദിക്കുന്നു. സാധാരണ ആപ്പുകൾക്ക് ഒരിക്കലും ആവശ്യമില്ല."</string> - <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> - <skip /> - <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> - <skip /> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ഉയർന്ന സാംപ്ലിംഗ് റേറ്റിൽ സെൻസർ ഡാറ്റ ആക്സസ് ചെയ്യുക"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz-നേക്കാൾ ഉയർന്ന റേറ്റിൽ സെൻസർ ഡാറ്റ സാമ്പിൾ ചെയ്യാൻ ആപ്പിനെ അനുവദിക്കുന്നു"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"പാസ്വേഡ് നിയമങ്ങൾ സജ്ജീകരിക്കുക"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"സ്ക്രീൻ ലോക്ക് പാസ്വേഡുകളിലും PIN-കളിലും അനുവദിച്ചിരിക്കുന്ന ദൈർഘ്യവും പ്രതീകങ്ങളും നിയന്ത്രിക്കുക."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"സ്ക്രീൻ അൺലോക്ക് ശ്രമങ്ങൾ നിരീക്ഷിക്കുക"</string> @@ -1873,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS അഭ്യർത്ഥന, വീഡിയോ കോളിലേക്ക് മാറ്റി"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS അഭ്യർത്ഥന, USSD അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"പുതിയ SS അഭ്യർത്ഥനയിലേക്ക് മാറ്റി"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ഫിഷിംഗ് മുന്നറിയിപ്പ്"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"മുന്നറിയിപ്പ് നൽകി"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"വികസിപ്പിക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index d5937d364788..939d5e56098a 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS хүсэлтийг видео дуудлага болгон өөрчилсөн"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS хүсэлтийг USSD хүсэлт болгон өөрчилсөн"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Шинэ SS хүсэлт болгон өөрчилсөн"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Фишинг сэрэмжлүүлэг"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Ажлын профайл"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Мэдэгдсэн"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Дэлгэх"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 5f4d5fd916f6..578999305357 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -685,10 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"व्यत्यय आणू नका कॉंफिगरेशन वाचण्यासाठी आणि लिहिण्यासाठी ॲपला अनुमती देते."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"व्ह्यू परवानगी वापर सुरू करा"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"धारकास अॅपसाठी परवानगी वापरणे सुरू करण्याची अनुमती देते. सामान्य अॅप्ससाठी कधीही आवश्यकता नसते."</string> - <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> - <skip /> - <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> - <skip /> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"उच्च नमुना दराने सेन्सर डेटा अॅक्सेस करते"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ॲपला २०० Hz पेक्षा जास्त दराने सेन्सर डेटाचा नमुना तयार करण्याची अनुमती देते"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करा"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांचे परीक्षण करा"</string> @@ -1873,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS विनंती व्हिडिओ कॉलवर बदलली"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS विनंती USSD विनंतीवर बदलली"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"नवीन SS विनंतीवर बदलली"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"फिशिंगशी संबंधित सूचना"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"कार्य प्रोफाईल"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"सूचना दिल्या"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"विस्तृत करा"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index c84670154549..d070908581ee 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-forespørsel endret til videoanrop"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-forespørsel endret til USSD-forespørsel"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Endret til ny SS-forespørsel"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Varsel om nettfisking"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Arbeidsprofil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Varslet"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Vis"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 9af472aa3322..59b1f753b830 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -685,10 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि एपलाई अनुमति दिनुहोस्।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै एपसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string> - <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> - <skip /> - <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> - <skip /> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"नमुना लिने उच्च दरमा सेन्सरसम्बन्धी डेटा प्रयोग गर्ने"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"यो अनुमति दिइएमा एपले २०० हर्जभन्दा बढी दरमा सेन्सरसम्बन्धी डेटाको नमुना लिन सक्छ"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string> @@ -1873,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS अनुरोधलाई भिडियो कलमा परिवर्तन गरियो"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS अनुरोधलाई USSD अनुरोधमा परिवर्तन गरियो"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"नयाँ SS अनुरोधमा परिवर्तन गरियो"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"फिसिङसम्बन्धी अलर्ट"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"कार्य प्रोफाइल"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"सतर्कता गरियो"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"विस्तृत गर्नुहोस्"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index f42d8abbcee2..3439cdde0648 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SSଙ୍କ ଅନୁରୋଧକୁ ଭିଡିଓ କଲ୍ରେ ପରିବର୍ତ୍ତନ କରାଗଲା"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS ଅନୁରୋଧ, USSD ଅନୁରୋଧକୁ ପରିବର୍ତ୍ତନ ହେଲା"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"ନୂତନ SS ଅନୁରୋଧରେ ପରିବର୍ତ୍ତନ ହେଲା"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ଫିସିଂ ଆଲର୍ଟ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"ଆଲର୍ଟ କରାଯାଇଛି"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"ବଢ଼ାନ୍ତୁ"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 17a4944c1b14..a2cae3582a07 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -685,10 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"ਐਪ ਨੂੰ ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ ਕੌਂਫਿਗਰੇਸ਼ਨ ਨੂੰ ਪੜ੍ਹਨ ਅਤੇ ਲਿਖਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਦੇਖਣਾ ਸ਼ੁਰੂ ਕਰੋ"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"ਧਾਰਕ ਨੂੰ ਕਿਸੇ ਹੋਰ ਐਪ ਲਈ ਇਜਾਜ਼ਤ ਵਰਤੋਂ ਨੂੰ ਸ਼ੁਰੂ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਸਧਾਰਨ ਐਪਾਂ ਲਈ ਕਦੇ ਵੀ ਲੋੜੀਂਦਾ ਨਹੀਂ ਹੋਵੇਗਾ।"</string> - <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> - <skip /> - <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> - <skip /> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"ਉੱਚ ਸੈਂਪਲਿੰਗ ਰੇਟ \'ਤੇ ਸੈਂਸਰ ਡਾਟਾ ਤੱਕ ਪਹੁੰਚ ਕਰੋ"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"ਐਪ ਨੂੰ 200 Hz ਤੋਂ ਵੱਧ ਦੀ ਦਰ \'ਤੇ ਸੈਂਸਰ ਡਾਟੇ ਦਾ ਨਮੂਨਾ ਲੈਣ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"ਪਾਸਵਰਡ ਨਿਯਮ ਸੈੱਟ ਕਰੋ"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"ਸਕ੍ਰੀਨ ਲਾਕ ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਿੰਨ ਵਿੱਚ ਆਗਿਆ ਦਿੱਤੀ ਲੰਮਾਈ ਅਤੇ ਅੱਖਰਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"ਸਕ੍ਰੀਨ ਅਣਲਾਕ ਕਰਨ ਦੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ \'ਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ"</string> @@ -1873,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS ਬੇਨਤੀ ਨੂੰ ਵੀਡੀਓ ਕਾਲ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS ਬੇਨਤੀ ਨੂੰ USSD ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"ਨਵੀਂ SS ਬੇਨਤੀ ਵਿੱਚ ਬਦਲਿਆ ਗਿਆ"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"ਫ਼ਿਸ਼ਿੰਗ ਸੰਬੰਧੀ ਸੁਚੇਤਨਾ"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"ਸੁਚੇਤਨਾਵਾਂ"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"ਵਿਸਤਾਰ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 14ca2b9d8a18..e937cb8495fc 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Żądanie SS zmienione na rozmowę wideo"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Żądanie SS zmienione na żądanie USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Zmieniono na nowe żądanie SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alert o phishingu"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profil służbowy"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alert"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Rozwiń"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 3fbfd7ebc075..e0ff63e22d42 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -867,7 +867,7 @@ <string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"Pausar"</string> <string name="lockscreen_transport_play_description" msgid="106868788691652733">"Reproduzir"</string> <string name="lockscreen_transport_stop_description" msgid="1449552232598355348">"Parar"</string> - <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"Retroceder"</string> + <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"Voltar"</string> <string name="lockscreen_transport_ffw_description" msgid="4763794746640196772">"Avançar"</string> <string name="emergency_calls_only" msgid="3057351206678279851">"Só chamadas de emergência"</string> <string name="lockscreen_network_locked_message" msgid="2814046965899249635">"Rede bloqueada"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index eb09af88f69a..3e94b70f9cbb 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"O pedido SS foi alterado para uma videochamada."</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"O pedido SS foi alterado para um novo pedido USSD."</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Foi alterado para um novo pedido SS."</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerta de phishing."</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Perfil de trabalho"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alertado"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Expandir"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index bad102e5e0b8..e0ff63e22d42 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -867,7 +867,7 @@ <string name="lockscreen_transport_pause_description" msgid="6705284702135372494">"Pausar"</string> <string name="lockscreen_transport_play_description" msgid="106868788691652733">"Reproduzir"</string> <string name="lockscreen_transport_stop_description" msgid="1449552232598355348">"Parar"</string> - <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"Retroceder"</string> + <string name="lockscreen_transport_rew_description" msgid="7680106856221622779">"Voltar"</string> <string name="lockscreen_transport_ffw_description" msgid="4763794746640196772">"Avançar"</string> <string name="emergency_calls_only" msgid="3057351206678279851">"Só chamadas de emergência"</string> <string name="lockscreen_network_locked_message" msgid="2814046965899249635">"Rede bloqueada"</string> @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Solicitação SS alterada para videochamada"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Solicitação SS alterada para solicitação USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Alterada para uma nova solicitação SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerta de phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Perfil de trabalho"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Alertado"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Expandir"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 5cb8a5087321..53cb6da561a7 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-запрос преобразован в видеовызов"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-запрос преобразован в USSD-запрос"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Преобразовано в SS-запрос"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Предупреждение о фишинге"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Рабочий профиль"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Отправлено оповещение"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Развернуть"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 825215b1fae1..2ba7caf212b4 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Žiadosť SS bola zmenená na videohovor"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Žiadosť SS bola zmenená na žiadosť USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Zmenené na novú žiadosť SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Upozornenie na phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Pracovný profil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Upozornené"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Rozbaliť"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 823b963c8b62..3ae51bb36128 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Kërkesa SS u ndryshua në telefonatë me video"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Kërkesa SS u ndryshua në kërkesë USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"U ndryshua në kërkesë të re SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Sinjalizim për mashtrim"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profili i punës"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Sinjalizuar"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Zgjero"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 47bfe0a00360..1fa5ef835f4c 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS-begäran har ändrats till videosamtal"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS-begäran har ändrats till en USSD-begäran"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Har ändrats till ny SS-begäran"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Varning om nätfiske"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Jobbprofil"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Aviserad"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Utöka"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 59d451abae2d..6a0ff3212d04 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -685,10 +685,8 @@ <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"అంతరాయం కలిగించవద్దు ఎంపిక కాన్ఫిగరేషన్ చదవడానికి మరియు వ్రాయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"వీక్షణ అనుమతి వినియోగాన్ని ప్రారంభించండి"</string> <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"యాప్నకు అనుమతి వినియోగాన్ని ప్రారంభించడానికి హోల్డర్ను అనుమతిస్తుంది. సాధారణ యాప్లకు ఎప్పటికీ ఇటువంటి అనుమతి అవసరం ఉండదు."</string> - <!-- no translation found for permlab_highSamplingRateSensors (3941068435726317070) --> - <skip /> - <!-- no translation found for permdesc_highSamplingRateSensors (8430061978931155995) --> - <skip /> + <string name="permlab_highSamplingRateSensors" msgid="3941068435726317070">"అధిక శాంపిల్ రేటు వద్ద సెన్సార్ డేటాను యాక్సెస్ చేయండి"</string> + <string name="permdesc_highSamplingRateSensors" msgid="8430061978931155995">"200 Hz కంటే ఎక్కువ రేట్ వద్ద శాంపిల్ సెన్సార్ డేటాకు యాప్ను అనుమతిస్తుంది"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"పాస్వర్డ్ నియమాలను సెట్ చేయండి"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"స్క్రీన్ లాక్ పాస్వర్డ్లు మరియు PINల్లో అనుమతించబడిన పొడవు మరియు అక్షరాలను నియంత్రిస్తుంది."</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"స్క్రీన్ అన్లాక్ ప్రయత్నాలను పర్యవేక్షించండి"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6f00ba8d3e5c..421fceff6db2 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Ginawang video call ang SS na kahilingan"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Ginawang USSD na kahilingan ang SS na kahilingan"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Ginawang bagong SS na kahilingan"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Alerto sa phishing"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Profile sa trabaho"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Naalertuhan"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Palawakin"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 67086d2e1fdc..d63ffe12a967 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS isteği görüntülü görüşme olarak değişti"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS isteği USSD isteği olarak değişti"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Yeni SS isteği olarak değişti"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Kimlik avı uyarısı"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"İş profili"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Sesli uyarıldı"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Genişlet"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index d6a3677b844b..604e1b93ad49 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1933,8 +1933,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Запит SS змінено на відеовиклик"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Запит SS змінено на запит USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Змінено на новий запит SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Попередження про фішинг"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Робочий профіль"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Зі звуком"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Розгорнути"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 60134a477b66..a63df91128ff 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"SS talabi video chaqiruvga almashtirildi"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"SS talabi USSD talabiga almashtirildi"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Yangi SS talabiga almashtirildi"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Fishing signali"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Ish profili"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Ogohlantirildi"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Yoyish"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 25f0644903b5..106940617bd8 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Yêu cầu SS đã thay đổi thành cuộc gọi video"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Yêu cầu SS đã thay đổi thành yêu cầu USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Đã thay đổi thành yêu cầu SS mới"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Cảnh báo về hành vi lừa đảo"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Hồ sơ công việc"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Đã phát âm báo"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Mở rộng"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 9a21e78361a4..fc28edfa5f75 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1871,8 +1871,7 @@ <string name="stk_cc_ss_to_dial_video" msgid="1324194624384312664">"Isicelo se-SS sishintshele kukholi yevidiyo"</string> <string name="stk_cc_ss_to_ussd" msgid="8417905193112944760">"Isicelo se-SS sishintshele kusicelo se-USSD"</string> <string name="stk_cc_ss_to_ss" msgid="132040645206514450">"Ishintshele kusicelo esisha se-SS"</string> - <!-- no translation found for notification_phishing_alert_content_description (494227305355958790) --> - <skip /> + <string name="notification_phishing_alert_content_description" msgid="494227305355958790">"Isexwayiso sobugebengu bokweba imininingwane ebucayi"</string> <string name="notification_work_profile_content_description" msgid="5296477955677725799">"Iphrofayela yomsebenzi"</string> <string name="notification_alerted_content_description" msgid="6139691253611265992">"Kuxwayisiwe"</string> <string name="expand_button_content_description_collapsed" msgid="3873368935659010279">"Nweba"</string> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 695a831faf97..c2b6b99dcc1c 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -319,26 +319,22 @@ <!-- The top padding for the notification expand button. --> <dimen name="notification_expand_button_padding_top">1dp</dimen> - <!-- minimum vertical margin for the headerless notification content, when cap = 60dp --> - <dimen name="notification_headerless_margin_minimum">8dp</dimen> + <!-- Vertical margin for the headerless notification content, when content has 1 line --> + <!-- 16 * 2 (margins) + 24 (1 line) = 56 (notification) --> + <dimen name="notification_headerless_margin_oneline">16dp</dimen> - <!-- extra vertical margin for the headerless notification content, when cap = 60dp --> - <dimen name="notification_headerless_margin_extra">10dp</dimen> - - <!-- minimum vertical margin for the headerless notification content, when cap = 48dp --> - <dimen name="notification_headerless_margin_constrained_minimum">14dp</dimen> - - <!-- extra vertical margin for the headerless notification content, when cap = 48dp --> - <dimen name="notification_headerless_margin_constrained_extra">4dp</dimen> + <!-- Vertical margin for the headerless notification content, when content has 2 lines --> + <!-- 20 * 2 (margins) + 24 * 2 (2 lines) = 88 (notification) --> + <dimen name="notification_headerless_margin_twoline">20dp</dimen> <!-- The height of each of the 1 or 2 lines in the headerless notification template --> - <dimen name="notification_headerless_line_height">20sp</dimen> + <dimen name="notification_headerless_line_height">24dp</dimen> <!-- vertical margin for the headerless notification content --> <dimen name="notification_headerless_min_height">56dp</dimen> <!-- Height of a small notification in the status bar --> - <dimen name="notification_min_height">76dp</dimen> + <dimen name="notification_min_height">88dp</dimen> <!-- The width of the big icons in notifications. --> <dimen name="notification_large_icon_width">64dp</dimen> @@ -738,10 +734,11 @@ <!-- The maximum width of a image in a media notification. The images will be reduced to that width in case they are bigger.--> <dimen name="notification_media_image_max_width">280dp</dimen> <!-- The size of the right icon --> - <dimen name="notification_right_icon_size">52dp</dimen> + <dimen name="notification_right_icon_size">48dp</dimen> <!-- The top and bottom margin of the right icon in the normal notification states --> - <dimen name="notification_right_icon_headerless_margin">12dp</dimen> + <dimen name="notification_right_icon_headerless_margin">20dp</dimen> <!-- The top margin of the right icon in the "big" notification states --> + <!-- TODO(b/181048615): Move the large icon below the expander in big states --> <dimen name="notification_right_icon_big_margin_top">16dp</dimen> <!-- The size of the left icon --> <dimen name="notification_left_icon_size">@dimen/notification_icon_circle_size</dimen> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 9eb2f145da38..71ba44b0ded1 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5011,6 +5011,9 @@ <!-- Content description of the alerting icon in the notification. [CHAR_LIMIT=NONE] --> <string name="notification_alerted_content_description">Alerted</string> + <!-- Default content description of the verification icon in the call notification. [CHAR_LIMIT=NONE] --> + <string name="notification_verified_content_description">Verified</string> + <!-- Content description of the expand button icon in the notification when collaped.--> <string name="expand_button_content_description_collapsed">Expand</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 7ad05de1bdd0..dbb584dfe293 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2895,8 +2895,6 @@ <java-symbol type="id" name="alternate_expand_target" /> <java-symbol type="id" name="notification_header" /> <java-symbol type="id" name="notification_top_line" /> - <java-symbol type="id" name="notification_headerless_margin_extra_top" /> - <java-symbol type="id" name="notification_headerless_margin_extra_bottom" /> <java-symbol type="id" name="time_divider" /> <java-symbol type="id" name="header_text_divider" /> <java-symbol type="id" name="header_text_secondary_divider" /> @@ -2918,8 +2916,8 @@ <java-symbol type="dimen" name="notification_header_icon_size" /> <java-symbol type="dimen" name="notification_header_app_name_margin_start" /> <java-symbol type="dimen" name="notification_header_separating_margin" /> - <java-symbol type="dimen" name="notification_headerless_margin_constrained_minimum" /> - <java-symbol type="dimen" name="notification_headerless_margin_constrained_extra" /> + <java-symbol type="dimen" name="notification_headerless_margin_oneline" /> + <java-symbol type="dimen" name="notification_headerless_margin_twoline" /> <java-symbol type="string" name="default_notification_channel_label" /> <java-symbol type="string" name="importance_from_user" /> <java-symbol type="string" name="importance_from_person" /> @@ -3112,8 +3110,10 @@ <java-symbol type="dimen" name="call_notification_collapsible_indent"/> <java-symbol type="drawable" name="ic_call_answer" /> <java-symbol type="drawable" name="ic_call_decline" /> + <java-symbol type="id" name="verification_divider" /> <java-symbol type="id" name="verification_icon" /> <java-symbol type="id" name="verification_text" /> + <java-symbol type="string" name="notification_verified_content_description" /> <!-- Notification handler / dashboard package --> <java-symbol type="string" name="config_notificationHandlerPackage" /> diff --git a/core/tests/coretests/src/android/view/OWNERS b/core/tests/coretests/src/android/view/OWNERS index fa1aa5eab26c..80165f065995 100644 --- a/core/tests/coretests/src/android/view/OWNERS +++ b/core/tests/coretests/src/android/view/OWNERS @@ -9,6 +9,3 @@ per-file *Focus* = file:/services/core/java/com/android/server/wm/OWNERS per-file *Insets* = file:/services/core/java/com/android/server/wm/OWNERS per-file *View* = file:/services/core/java/com/android/server/wm/OWNERS per-file *Visibility* = file:/services/core/java/com/android/server/wm/OWNERS - -# Scroll Capture -per-file *ScrollCapture*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS diff --git a/core/tests/coretests/src/com/android/internal/view/OWNERS b/core/tests/coretests/src/com/android/internal/view/OWNERS deleted file mode 100644 index 1dad10de5ac7..000000000000 --- a/core/tests/coretests/src/com/android/internal/view/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -# Scroll Capture -per-file *ScrollCapture*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS -per-file *CaptureHelper*.java = file:/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS diff --git a/location/java/android/location/GnssAntennaInfo.java b/location/java/android/location/GnssAntennaInfo.java index f1eb8fccdd3c..6633d24ebc35 100644 --- a/location/java/android/location/GnssAntennaInfo.java +++ b/location/java/android/location/GnssAntennaInfo.java @@ -39,11 +39,7 @@ public final class GnssAntennaInfo implements Parcelable { /** * Used for receiving GNSS antenna info from the GNSS engine. - * - * @deprecated Prefer to use a broadcast receiver for - * {@link LocationManager#ACTION_GNSS_ANTENNA_INFOS_CHANGED}. */ - @Deprecated public interface Listener { /** * Invoked on a change to GNSS antenna info. diff --git a/location/java/android/location/IGnssAntennaInfoListener.aidl b/location/java/android/location/IGnssAntennaInfoListener.aidl new file mode 100644 index 000000000000..3cceea3e6d26 --- /dev/null +++ b/location/java/android/location/IGnssAntennaInfoListener.aidl @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2020, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.location; + +import android.location.GnssAntennaInfo; + +/** + * {@hide} + */ +oneway interface IGnssAntennaInfoListener { + void onGnssAntennaInfoChanged(in List<GnssAntennaInfo> antennaInfos); +} diff --git a/location/java/android/location/ILocationManager.aidl b/location/java/android/location/ILocationManager.aidl index 38b48e97771a..6fa6536997c4 100644 --- a/location/java/android/location/ILocationManager.aidl +++ b/location/java/android/location/ILocationManager.aidl @@ -26,6 +26,7 @@ import android.location.GnssCapabilities; import android.location.GnssMeasurementCorrections; import android.location.GnssMeasurementRequest; import android.location.IGeocodeListener; +import android.location.IGnssAntennaInfoListener; import android.location.IGnssMeasurementsListener; import android.location.IGnssStatusListener; import android.location.IGnssNavigationMessageListener; @@ -92,6 +93,9 @@ interface ILocationManager void addGnssNavigationMessageListener(in IGnssNavigationMessageListener listener, String packageName, @nullable String attributionTag, String listenerId); void removeGnssNavigationMessageListener(in IGnssNavigationMessageListener listener); + void addGnssAntennaInfoListener(in IGnssAntennaInfoListener listener, String packageName, @nullable String attributionTag, String listenerId); + void removeGnssAntennaInfoListener(in IGnssAntennaInfoListener listener); + void addProviderRequestListener(in IProviderRequestListener listener); void removeProviderRequestListener(in IProviderRequestListener listener); diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 95bae5ae7aab..e73e915bf88b 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -43,10 +43,8 @@ import android.app.PropertyInvalidatedCache; import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; import android.location.provider.IProviderRequestListener; import android.location.provider.ProviderProperties; @@ -349,28 +347,6 @@ public class LocationManager { public static final String EXTRA_GNSS_CAPABILITIES = "android.location.extra.GNSS_CAPABILITIES"; /** - * Broadcast intent action when GNSS antenna infos change. Includes an intent extra, - * {@link #EXTRA_GNSS_ANTENNA_INFOS}, with an ArrayList of the new {@link GnssAntennaInfo}. This - * may be read via {@link android.content.Intent#getParcelableArrayListExtra(String)}. - * - * @see #EXTRA_GNSS_ANTENNA_INFOS - * @see #getGnssAntennaInfos() - */ - @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) - public static final String ACTION_GNSS_ANTENNA_INFOS_CHANGED = - "android.location.action.GNSS_ANTENNA_INFOS_CHANGED"; - - /** - * Intent extra included with {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED} broadcasts, containing - * the new ArrayList of {@link GnssAntennaInfo}. This may be read via - * {@link android.content.Intent#getParcelableArrayListExtra(String)}. - * - * @see #ACTION_GNSS_ANTENNA_INFOS_CHANGED - */ - public static final String EXTRA_GNSS_ANTENNA_INFOS = - "android.location.extra.GNSS_ANTENNA_INFOS"; - - /** * Broadcast intent action for Settings app to inject a footer at the bottom of location * settings. This is for use only by apps that are included in the system image. * @@ -1967,7 +1943,7 @@ public class LocationManager { * * @param provider the provider name * @param properties the provider properties - * @param locationTags the attribution tags for accessing location from the provider + * @param extraAttributionTags additional attribution tags associated with this provider * * @throws IllegalArgumentException if provider is null * @throws IllegalArgumentException if properties is null @@ -1976,13 +1952,14 @@ public class LocationManager { * allowed} for your app. */ public void addTestProvider(@NonNull String provider, @NonNull ProviderProperties properties, - @NonNull Set<String> locationTags) { + @NonNull Set<String> extraAttributionTags) { Preconditions.checkArgument(provider != null, "invalid null provider"); Preconditions.checkArgument(properties != null, "invalid null properties"); - Preconditions.checkArgument(locationTags != null, "invalid null location tags"); + Preconditions.checkArgument(extraAttributionTags != null, + "invalid null extra attribution tags"); try { - mService.addTestProvider(provider, properties, new ArrayList<>(locationTags), + mService.addTestProvider(provider, properties, new ArrayList<>(extraAttributionTags), mContext.getOpPackageName(), mContext.getFeatureId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -2659,10 +2636,11 @@ public class LocationManager { } /** - * Registers a GNSS antenna info listener. GNSS antenna info updates will only be received while - * the {@link #GPS_PROVIDER} is enabled, and while the client app is in the foreground. + * Registers a GNSS antenna info listener that will receive all changes to antenna info. Use + * {@link #getGnssAntennaInfos()} to get current antenna info. * - * <p>Not all GNSS chipsets support antenna info updates, see {@link #getGnssCapabilities()}. + * <p>Not all GNSS chipsets support antenna info updates, see {@link #getGnssCapabilities()}. If + * unsupported, the listener will never be invoked. * * <p>Prior to Android S, this requires the {@link Manifest.permission#ACCESS_FINE_LOCATION} * permission. @@ -2673,10 +2651,7 @@ public class LocationManager { * * @throws IllegalArgumentException if executor is null * @throws IllegalArgumentException if listener is null - * - * @deprecated Prefer to use a receiver for {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED}. */ - @Deprecated public boolean registerAntennaInfoListener( @NonNull @CallbackExecutor Executor executor, @NonNull GnssAntennaInfo.Listener listener) { @@ -2686,13 +2661,10 @@ public class LocationManager { } /** - * Unregisters a GNSS Antenna Info listener. + * Unregisters a GNSS antenna info listener. * * @param listener a {@link GnssAntennaInfo.Listener} object to remove - * - * @deprecated Prefer to use a receiver for {@link #ACTION_GNSS_ANTENNA_INFOS_CHANGED}. */ - @Deprecated public void unregisterAntennaInfoListener(@NonNull GnssAntennaInfo.Listener listener) { GnssLazyLoader.sGnssAntennaInfoListeners.removeListener(listener); } @@ -3009,14 +2981,17 @@ public class LocationManager { } @Override - protected void registerTransport(GnssAntennaInfoTransport transport) { - transport.getContext().registerReceiver(transport, - new IntentFilter(ACTION_GNSS_ANTENNA_INFOS_CHANGED)); + protected void registerTransport(GnssAntennaInfoTransport transport) + throws RemoteException { + getService().addGnssAntennaInfoListener(transport, transport.getPackage(), + transport.getAttributionTag(), + AppOpsManager.toReceiverId(transport.getListener())); } @Override - protected void unregisterTransport(GnssAntennaInfoTransport transport) { - transport.getContext().unregisterReceiver(transport); + protected void unregisterTransport(GnssAntennaInfoTransport transport) + throws RemoteException { + getService().removeGnssAntennaInfoListener(transport); } } @@ -3376,11 +3351,12 @@ public class LocationManager { } } - private static class GnssAntennaInfoTransport extends BroadcastReceiver implements + private static class GnssAntennaInfoTransport extends IGnssAntennaInfoListener.Stub implements ListenerTransport<GnssAntennaInfo.Listener> { private final Executor mExecutor; - private final Context mContext; + private final String mPackageName; + private final String mAttributionTag; private volatile @Nullable GnssAntennaInfo.Listener mListener; @@ -3389,12 +3365,17 @@ public class LocationManager { Preconditions.checkArgument(executor != null, "invalid null executor"); Preconditions.checkArgument(listener != null, "invalid null listener"); mExecutor = executor; - mContext = context; + mPackageName = context.getPackageName(); + mAttributionTag = context.getAttributionTag(); mListener = listener; } - public Context getContext() { - return mContext; + public String getPackage() { + return mPackageName; + } + + public String getAttributionTag() { + return mAttributionTag; } @Override @@ -3408,12 +3389,8 @@ public class LocationManager { } @Override - public void onReceive(Context context, Intent intent) { - ArrayList<GnssAntennaInfo> infos = intent.getParcelableArrayListExtra( - EXTRA_GNSS_ANTENNA_INFOS); - if (infos != null) { - execute(mExecutor, callback -> callback.onGnssAntennaInfoReceived(infos)); - } + public void onGnssAntennaInfoChanged(List<GnssAntennaInfo> antennaInfos) { + execute(mExecutor, callback -> callback.onGnssAntennaInfoReceived(antennaInfos)); } } diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java index bb1dbd436e0b..7e729d8c371f 100644 --- a/media/java/android/media/AudioAttributes.java +++ b/media/java/android/media/AudioAttributes.java @@ -1264,6 +1264,8 @@ public final class AudioAttributes implements Parcelable { * * @param usage one of the {@link AudioAttributes} usage constants * @return string representing the {@link AudioAttributes} usage constant passed as a parameter + * + * @hide */ @NonNull public static String usageToString(@AttributeSdkUsage int usage) { diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 4d7ed1145990..06d0eb0b5423 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -19,6 +19,7 @@ package android.media; import static android.media.Utils.intersectSortedDistinctRanges; import static android.media.Utils.sortDistinctRanges; +import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; @@ -1133,6 +1134,7 @@ public final class MediaCodecInfo { * in the ranges returned by {@link #getInputChannelCountRanges} * */ + @IntRange(from = 1, to = 255) public int getMaxInputChannelCount() { int overall_max = 0; for (int i = mInputChannelRanges.length - 1; i >= 0; i--) { @@ -1151,6 +1153,7 @@ public final class MediaCodecInfo { * This returns the lowest channel count in the ranges returned by * {@link #getInputChannelCountRanges}. */ + @IntRange(from = 1, to = 255) public int getMinInputChannelCount() { int overall_min = MAX_INPUT_CHANNEL_COUNT; for (int i = mInputChannelRanges.length - 1; i >= 0; i--) { diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index dc476b873786..96bffee117ea 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -38,9 +38,7 @@ import android.view.KeyEvent; interface ISessionManager { ISession createSession(String packageName, in ISessionCallback sessionCb, String tag, in Bundle sessionInfo, int userId); - void notifySession2Created(in Session2Token sessionToken); List<MediaSession.Token> getSessions(in ComponentName compName, int userId); - ParceledListSlice getSession2Tokens(int userId); void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent, boolean needWakeLock); boolean dispatchMediaKeyEventToSessionAsSystemService(String packageName, diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index aa0f7fdd70d5..98a13cfa6f3f 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -25,9 +25,9 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.ComponentName; import android.content.Context; -import android.content.pm.ParceledListSlice; import android.media.AudioManager; import android.media.IRemoteSessionCallback; +import android.media.MediaCommunicationManager; import android.media.MediaFrameworkPlatformInitializer; import android.media.MediaSession2; import android.media.Session2Token; @@ -84,6 +84,7 @@ public final class MediaSessionManager { public static final int RESULT_MEDIA_KEY_HANDLED = 1; private final ISessionManager mService; + private final MediaCommunicationManager mCommunicationManager; private final OnMediaKeyEventDispatchedListenerStub mOnMediaKeyEventDispatchedListenerStub = new OnMediaKeyEventDispatchedListenerStub(); private final OnMediaKeyEventSessionChangedListenerStub @@ -128,6 +129,8 @@ public final class MediaSessionManager { .getMediaServiceManager() .getMediaSessionServiceRegisterer() .get()); + mCommunicationManager = (MediaCommunicationManager) context + .getSystemService(Context.MEDIA_COMMUNICATION_SERVICE); } /** @@ -164,17 +167,11 @@ public final class MediaSessionManager { * {@link MediaSession2.Builder} instead. * * @param token newly created session2 token + * @deprecated Don't use this method. A new media session is notified automatically. */ + @Deprecated public void notifySession2Created(@NonNull Session2Token token) { - Objects.requireNonNull(token, "token shouldn't be null"); - if (token.getType() != Session2Token.TYPE_SESSION) { - throw new IllegalArgumentException("token's type should be TYPE_SESSION"); - } - try { - mService.notifySession2Created(token); - } catch (RemoteException e) { - e.rethrowFromSystemServer(); - } + // Does nothing } /** @@ -255,37 +252,7 @@ public final class MediaSessionManager { */ @NonNull public List<Session2Token> getSession2Tokens() { - return getSession2Tokens(UserHandle.myUserId()); - } - - /** - * Gets a list of {@link Session2Token} with type {@link Session2Token#TYPE_SESSION} for the - * given user. - * <p> - * The calling application needs to hold the - * {@link android.Manifest.permission#INTERACT_ACROSS_USERS_FULL} permission in order to - * retrieve session tokens for user ids that do not belong to current process. - * - * @param userHandle The user handle to fetch sessions for. - * @return A list of {@link Session2Token} - * @hide - */ - @NonNull - @SuppressLint("UserHandle") - public List<Session2Token> getSession2Tokens(@NonNull UserHandle userHandle) { - Objects.requireNonNull(userHandle, "userHandle shouldn't be null"); - return getSession2Tokens(userHandle.getIdentifier()); - - } - - private List<Session2Token> getSession2Tokens(int userId) { - try { - ParceledListSlice slice = mService.getSession2Tokens(userId); - return slice == null ? new ArrayList<>() : slice.getList(); - } catch (RemoteException e) { - Log.e(TAG, "Failed to get session tokens", e); - } - return new ArrayList<>(); + return mCommunicationManager.getSession2Tokens(); } /** @@ -534,8 +501,7 @@ public final class MediaSessionManager { } if (shouldRegisterCallback) { try { - mService.registerRemoteSessionCallback( - mRemoteSessionCallbackStub); + mService.registerRemoteSessionCallback(mRemoteSessionCallbackStub); } catch (RemoteException e) { Log.e(TAG, "Failed to register remote volume controller callback", e); } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/AudioAttributesUnitTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/AudioAttributesUnitTest.java new file mode 100644 index 000000000000..3a4bec046da9 --- /dev/null +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/AudioAttributesUnitTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2021 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.mediaframeworktest.unit; + +import static org.junit.Assert.assertEquals; + +import android.media.AudioAttributes; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class AudioAttributesUnitTest { + + @Test + public void testUsageToString_returnCorrectStrings() { + assertEquals("USAGE_UNKNOWN", AudioAttributes.usageToString(AudioAttributes.USAGE_UNKNOWN)); + assertEquals("USAGE_MEDIA", AudioAttributes.usageToString(AudioAttributes.USAGE_MEDIA)); + assertEquals("USAGE_VOICE_COMMUNICATION", + AudioAttributes.usageToString(AudioAttributes.USAGE_VOICE_COMMUNICATION)); + assertEquals("USAGE_VOICE_COMMUNICATION_SIGNALLING", + AudioAttributes.usageToString( + AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING)); + assertEquals("USAGE_ALARM", AudioAttributes.usageToString(AudioAttributes.USAGE_ALARM)); + assertEquals("USAGE_NOTIFICATION", + AudioAttributes.usageToString(AudioAttributes.USAGE_NOTIFICATION)); + assertEquals("USAGE_NOTIFICATION_RINGTONE", + AudioAttributes.usageToString(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)); + assertEquals("USAGE_NOTIFICATION_COMMUNICATION_REQUEST", + AudioAttributes.usageToString( + AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_REQUEST)); + assertEquals("USAGE_NOTIFICATION_COMMUNICATION_INSTANT", + AudioAttributes.usageToString( + AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT)); + assertEquals("USAGE_NOTIFICATION_COMMUNICATION_DELAYED", + AudioAttributes.usageToString( + AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_DELAYED)); + assertEquals("USAGE_NOTIFICATION_EVENT", + AudioAttributes.usageToString(AudioAttributes.USAGE_NOTIFICATION_EVENT)); + assertEquals("USAGE_ASSISTANCE_ACCESSIBILITY", + AudioAttributes.usageToString(AudioAttributes.USAGE_ASSISTANCE_ACCESSIBILITY)); + assertEquals("USAGE_ASSISTANCE_NAVIGATION_GUIDANCE", + AudioAttributes.usageToString( + AudioAttributes.USAGE_ASSISTANCE_NAVIGATION_GUIDANCE)); + assertEquals("USAGE_ASSISTANCE_SONIFICATION", + AudioAttributes.usageToString(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)); + assertEquals("USAGE_GAME", AudioAttributes.usageToString(AudioAttributes.USAGE_GAME)); + assertEquals("USAGE_ASSISTANT", + AudioAttributes.usageToString(AudioAttributes.USAGE_ASSISTANT)); + assertEquals("USAGE_CALL_ASSISTANT", + AudioAttributes.usageToString(AudioAttributes.USAGE_CALL_ASSISTANT)); + assertEquals("USAGE_EMERGENCY", + AudioAttributes.usageToString(AudioAttributes.USAGE_EMERGENCY)); + assertEquals("USAGE_SAFETY", AudioAttributes.usageToString(AudioAttributes.USAGE_SAFETY)); + assertEquals("USAGE_VEHICLE_STATUS", + AudioAttributes.usageToString(AudioAttributes.USAGE_VEHICLE_STATUS)); + assertEquals("USAGE_ANNOUNCEMENT", + AudioAttributes.usageToString(AudioAttributes.USAGE_ANNOUNCEMENT)); + } + + @Test + public void testUsageToString_unknownUsage() { + assertEquals("unknown usage -1", AudioAttributes.usageToString(-1)); + } +} diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 4b253c459b83..eafc6147fae8 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ignoreer kodewisselingverstekke"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Aktiveer kodewisseling"</string> <string name="transcode_default" msgid="3784803084573509491">"Aanvaar dat programme moderne formate steun"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Wys kodewisselingkennisgewings"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Lopende dienste"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Sien en beheer dienste wat tans aktief is"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 4982f820ff37..547d0af6200d 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"የትራንስኮዲንግ ነባሪዎችን ሻር"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ትራንስኮዲንግን ያንቁ"</string> <string name="transcode_default" msgid="3784803084573509491">"መተግበሪያዎች ዘመናዊ ቅርጸቶችን እንደሚደግፉ አድርገው ይቁጠሩ"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ትራንስኮዲንግ ማሳወቂያዎችን አሳይ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"አሂድ አገልግሎቶች"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"የWebView ትግበራ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 5eaefd02483b..c6a1d18f9c1e 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"إلغاء الإعدادات التلقائية لتحويل الترميز"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"تفعيل تحويل الترميز"</string> <string name="transcode_default" msgid="3784803084573509491">"افتراض أن التطبيق يتوافق مع التنسيقات الحديثة"</string> + <string name="transcode_notification" msgid="5560515979793436168">"إظهار إشعارات تحويل الترميز"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"الخدمات قيد التشغيل"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"تطبيق WebView"</string> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 571f7d00ef89..e9deb4641e46 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ট্ৰেন্সক’ডিং ডিফ’ল্ট অ’ভাৰৰাইড কৰক"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ট্ৰেন্সক’ডিং সক্ষম কৰক"</string> <string name="transcode_default" msgid="3784803084573509491">"এপে আধুনিক ফৰ্মেট সমৰ্থন কৰে বুলি ধৰি লওক"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ট্ৰান্সক\'ডিঙৰ জাননী দেখুৱাওক"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"চলিত সেৱা"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ৱেবভিউ প্ৰয়োগ"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 36a13f50fe11..d04409cd5e56 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Yenidən kodlaşdırma defoltlarını əvəzləyin"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Yenidən kodlaşdırmanı aktiv edin"</string> <string name="transcode_default" msgid="3784803084573509491">"Tətbiqlərin müasir formatları dəstəklədiyini qəbul edin"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Kod dəyişmə bildirişlərini göstərin"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"İşləyən xidmətlər"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Hazırda prosesdə olan xidmətləri görüntüləyin və onlara nəzarət edin"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView icrası"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index d7cc909fe15f..ecd70a285bd0 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Zameni podrazumevana podešavanja transkodiranja"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Omogući transkodiranje"</string> <string name="transcode_default" msgid="3784803084573509491">"Podrazumevaj da aplikacije podržavaju moderne formate"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Prikazuj obaveštenja o transkodiranju"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Primena WebView-a"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 01201b34f6a8..6a3b961d1c5c 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Перавызначыць стандартныя налады перакадзіравання"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Уключыць перакадзіраванне"</string> <string name="transcode_default" msgid="3784803084573509491">"Лічыца, што праграмы падтрымліваюць сучасныя фарматы"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Паказваць апавяшчэнні пра перакадзіраванне"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Запушчаныя службы"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Прагляд запушчаных службаў i кіраванне iмi"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Рэалізацыя WebView"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 00f5e710b727..d2bf70565be9 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Отмяна на стандартните настройки за прекодирането"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Активиране на прекодирането"</string> <string name="transcode_default" msgid="3784803084573509491">"Предполагане, че приложенията поддържат съвременни формати"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Показване на известията за прекодиране"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Изпълнявани услуги"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Внедряване на WebView"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 43bb7581026c..3ccf0e426b77 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ট্রান্সকোডিং ডিফল্ট সেটিংস ওভাররাইড করুন"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ট্রান্সকোডিং চালু করুন"</string> <string name="transcode_default" msgid="3784803084573509491">"অ্যাপ মর্ডার্ন ফর্ম্যাটে কাজ করবে বলে ধরে নিন"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ট্রান্সকোডিং বিজ্ঞপ্তি দেখুন"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"এখন চলছে যে পরিষেবাগুলি"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ওয়েবভিউ প্রয়োগ"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index dacacfbb142d..f01eef340abc 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Zaobiđi zadane postavke transkodiranja"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Omogući transkodiranje"</string> <string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavještenja o transkodiranju"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Prikaz i kontrola trenutno pokrenutih usluga"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Postavljanje WebViewa"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 17482ed18963..7069999fc8e7 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Substitueix els valors predeterminats de la transcodificació"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Activa la transcodificació"</string> <string name="transcode_default" msgid="3784803084573509491">"Assumeix que les aplicacions són compatibles amb formats moderns"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostra les notificacions de transcodificació"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Serveis en execució"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualitza i controla els serveis en execució"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementació de WebView"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index ddd5c523c8f9..c677feffc384 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Přepsat výchozí nastavení překódování"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Povolit překódování"</string> <string name="transcode_default" msgid="3784803084573509491">"Předpokládat, že aplikace podporují moderní formáty"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Zobrazit oznámení o překódování"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Spuštěné služby"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Umožňuje zobrazit a ovládat aktuálně spuštěné služby"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementace WebView"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 421ed742bd23..84247a622740 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Tilsidesæt standardindstillingerne for omkodning"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Aktivér omkodning"</string> <string name="transcode_default" msgid="3784803084573509491">"Gå ud fra, at apps understøtter moderne formater"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Vis notifikationer for omkodning"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Kørende tjenester"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vis og administrer kørende tjenester"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 7cb994cb06de..4cc79d32b797 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Standardeinstellungen für Transcodierung überschreiben"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Transcodierung aktivieren"</string> <string name="transcode_default" msgid="3784803084573509491">"Voraussetzen, dass Apps moderne Formate unterstützen"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Benachrichtigungen zur Transcodierung anzeigen"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive Dienste"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Momentan ausgeführte Dienste anzeigen und steuern"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-Implementierung"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 7a73ccdf2c63..30705a1f6f62 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Παράκαμψη προεπιλογών διακωδικοποίησης"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Ενεργοποίηση διακωδικοποίησης"</string> <string name="transcode_default" msgid="3784803084573509491">"Να θεωρείται ότι οι εφαρμογές χρησιμοποιούν σύγχρονες μορφές"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Εμφάνιση ειδοποιήσεων διακωδικοποίησης"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Υπηρεσίες που εκτελούνται"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Υλοποίηση WebView"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 62419538309b..b3d80abfc0a2 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Override transcoding defaults"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Enable transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 198fee4b58af..ecf97ad07c85 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Override transcoding defaults"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Enable transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 62419538309b..b3d80abfc0a2 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Override transcoding defaults"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Enable transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 62419538309b..b3d80abfc0a2 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Override transcoding defaults"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Enable transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string> diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml index 27cd8b34889e..c3a3f3f484fb 100644 --- a/packages/SettingsLib/res/values-en-rXC/strings.xml +++ b/packages/SettingsLib/res/values-en-rXC/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Override transcoding defaults"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Enable transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Assume apps support modern formats"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Show transcoding notifications"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Running services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"View and control currently running services"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView implementation"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 5e5b39a1bd0a..eb2a23b45e70 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Anular los valores predeterminados de transcodificación"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Habilitar la transcodificación"</string> <string name="transcode_default" msgid="3784803084573509491">"Suponer que las apps admiten formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"En ejecución"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar servicios actuales en ejecución"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 8d791771bf05..fe9984b701db 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Anular valores predeterminados de transcodificación"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Habilitar transcodificación"</string> <string name="transcode_default" msgid="3784803084573509491">"Considerar que las aplicaciones admiten formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificaciones de transcodificación"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicios en ejecución"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver y controlar los servicios en ejecución"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 18ee62371ef6..c70700ddc24c 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Alista transkodeerimise vaikeseaded"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Luba transkodeerimine"</string> <string name="transcode_default" msgid="3784803084573509491">"Oleta, et rakendused toetavad kaasaegseid vorminguid"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Kuva transkodeerimise märguanded"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Käitatud teenused"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Praegu käitatud teenuste vaatamine ja juhtimine"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView\' rakendamine"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index 71be593a055b..09c964aa9dd1 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ez erabili transkodetzearen balio lehenetsiak"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Gaitu transkodetzea"</string> <string name="transcode_default" msgid="3784803084573509491">"Arduratu aplikazioek formatu modernoak onartzeaz"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Erakutsi transkodetze-jakinarazpenak"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Abian diren zerbitzuak"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ikusi eta kontrolatu une honetan abian diren zerbitzuak"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView inplementazioa"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 81a2cf888d1f..22cd6ae68de2 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ملغی کردن پیشفرضهای تراتبدیل"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"فعال کردن تراتبدیل"</string> <string name="transcode_default" msgid="3784803084573509491">"فرض شود برنامهها از قالبهای مدرن پشتیبانی میکنند"</string> + <string name="transcode_notification" msgid="5560515979793436168">"نمایش اعلانهای تراتبدیل"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"سرویسهای در حال اجرا"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"اجرای وبنما"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 0703c450a2ed..22dde690c3cf 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ohita transkoodauksen oletukset"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Salli transkoodaus"</string> <string name="transcode_default" msgid="3784803084573509491">"Oleta, että sovellukset tukevat nykyaikaisia formaatteja"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Näytä transkoodausilmoituksia"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Käynnissä olevat palvelut"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tarkastele ja hallitse käynnissä olevia palveluita."</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-käyttöönotto"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 5b8c93880446..d189f72aad65 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Remplacer les valeurs par défaut de transcodage"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Activer le transcodage"</string> <string name="transcode_default" msgid="3784803084573509491">"Présumer que les applications prennent en charge les formats modernes"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index b025357a4642..49d7faa63a3b 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ignorer les paramètres de transcodage par défaut"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Activer le transcodage"</string> <string name="transcode_default" msgid="3784803084573509491">"Supposer que les applications sont compatibles avec les formats modernes"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Afficher les notifications de transcodage"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Services en cours d\'exécution"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Afficher et contrôler les services en cours d\'exécution"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Mise en œuvre WebView"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index d68595e98e04..0922c3dca3af 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Anular valores predeterminados de transcodificación"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Activar transcodificación"</string> <string name="transcode_default" msgid="3784803084573509491">"Considerar que as aplicacións admiten formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificacións de transcodificación"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizos en uso"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Comproba e controla os servizos actualmente en uso"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementación de WebView"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index e151ddb428d8..10c5cc87c6da 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ફૉર્મેટ બદલવાની પ્રક્રિયાના ડિફૉલ્ટ સેટિંગ ઓવરરાઇડ કરો"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ફૉર્મેટ બદલવાની પ્રક્રિયા ચાલુ કરો"</string> <string name="transcode_default" msgid="3784803084573509491">"ધારો કે ઍપ આધુનિક ફૉર્મેટ પર કામ કરે છે"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ફૉર્મેટ બદલવાની પ્રક્રિયાના નોટિફિકેશન બતાવો"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ચાલુ સેવાઓ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView અમલીકરણ"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index beab7bdcc08e..ea25406b1541 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ट्रांसकोडिंग की डिफ़ॉल्ट सेटिंग बदलें"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ट्रांसकोडिंग चालू करें"</string> <string name="transcode_default" msgid="3784803084573509491">"मानकर चलें कि ऐप्लिकेशन, नए फ़ॉर्मैट के साथ काम करेंगे"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ट्रांसकोडिंग की सूचनाएं दिखाएं"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"चल रही सेवाएं"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"इस समय चल रही सेवाओं को देखें और नियंत्रित करें"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबव्यू लागू करें"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index 8989cc9c69db..27a7a6e7891a 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Nadjačaj zadane postavke konvertiranja"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Omogući konvertiranje"</string> <string name="transcode_default" msgid="3784803084573509491">"Pretpostavi da aplikacije podržavaju moderne formate"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Prikaži obavijesti o konvertiranju"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Pokrenute usluge"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pregledajte i kontrolirajte pokrenute usluge"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacija WebViewa"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 7c5a1a004568..70a48b638506 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Az átkódolás alapértelmezett beállításainak felülbírálása"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Átkódolás engedélyezése"</string> <string name="transcode_default" msgid="3784803084573509491">"Annak feltételezése, hogy az alkalmazások támogatják a modern formátumokat"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Átkódolási értesítések megjelenítése"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Futó szolgáltatások"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-megvalósítás"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 6684d3507c77..c39e966d880a 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Չեղարկել վերակոդավորման կանխադրված կարգավորումները"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Միացնել վերակոդավորումը"</string> <string name="transcode_default" msgid="3784803084573509491">"Ենթադրել, որ հավելվածներն աջակցում են ժամանակակից ձևաչափեր"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Ցուցադրել անդրկոդավորման ծանուցումներ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Աշխատող ծառայություններ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Դիտել և վերահսկել ընթացիկ աշխատող ծառայությունները"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ծառայություն"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 075444cd04f8..037c1b3b3e76 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ganti default transcoding"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Aktifkan transcoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Asumsikan aplikasi mendukung format modern"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Tampilkan notifikasi transcoding"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Layanan yang sedang berjalan"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Melihat dan mengontrol layanan yang sedang berjalan"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Penerapan WebView"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index b079f4d9b75e..3f8783053ba3 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Hnekkja sjálfgefinni umkóðun"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Kveikja á umkóðun"</string> <string name="transcode_default" msgid="3784803084573509491">"Gera ráð fyrir að forrit styðji nútímasnið"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Sýna umkóðunartilkynningar"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Þjónustur í gangi"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Skoða og stjórna þjónustum í gangi"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Innleiðing WebView"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index bf525c535583..80ab57b66548 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Sostituisci impostazioni predefinite transcodifica"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Attiva transcodifica"</string> <string name="transcode_default" msgid="3784803084573509491">"Presupponi che le app supportino i formati moderni"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostra notifiche relative alla transcodifica"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servizi in esecuzione"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizza e controlla i servizi attualmente in esecuzione"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementazione di WebView"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 9055e77b08dd..4355f31e3ed1 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ביטול ברירות המחדל של המרת קידוד"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"הפעלת המרת קידוד"</string> <string name="transcode_default" msgid="3784803084573509491">"הנחת העבודה היא שאפליקציות תומכות בפורמטים מודרניים"</string> + <string name="transcode_notification" msgid="5560515979793436168">"הצגת התראות לגבי המרת קידוד"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"שירותים פועלים"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"הצגת השירותים הפועלים כעת ושליטה בהם"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"יישום WebView"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 7fa0df93e2ce..ea4a683dd283 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"デフォルトのコード変換をオーバーライド"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"コード変換を有効にする"</string> <string name="transcode_default" msgid="3784803084573509491">"アプリによる最新形式のサポートを想定"</string> + <string name="transcode_notification" msgid="5560515979793436168">"コード変換に関する通知の表示"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"実行中のサービス"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"現在実行中のサービスを表示して制御する"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView の実装"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 7dd1eee09f83..5798a46e7c99 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ტრანსკოდირების ნაგულისხმევების უგულებელყოფა"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ტრანსკოდირების ჩართვა"</string> <string name="transcode_default" msgid="3784803084573509491">"დაშვება, რომ აპებს აქვთ თანამედროვე ფორმატების მხარდაჭერა"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ტრანსკოდირების შეტყობინებების ჩვენება"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"მიმდინარე სერვისები"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView რეალიზაცია"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 59b1d63af04f..5ce4e3a8f1c8 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Қайта қодтаудың әдепкі параметрлерін қайта анықтау"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Қайта кодтауды қосу"</string> <string name="transcode_default" msgid="3784803084573509491">"Қолданбалар қазіргі заманғы форматтарды қолдайды делік"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Қайта кодтау хабарландыруларын көрсету"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Қосылып тұрған қызметтер"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Қазір істеп тұрған қызметтерді көру және басқару"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView қызметі"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index b01839d2280f..e6f2cb03439e 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"លុបពីលើលំនាំដើមនៃការបំប្លែងកូដ"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"បើកការបំប្លែងកូដ"</string> <string name="transcode_default" msgid="3784803084573509491">"សន្មតថាកម្មវិធីអាចប្រើទម្រង់ទំនើបបាន"</string> + <string name="transcode_notification" msgid="5560515979793436168">"បង្ហាញការជូនដំណឹងអំពីការបំប្លែងកូដ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"សេវាកម្មកំពុងដំណើរការ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ការអនុវត្ត WebView"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 217c917f1d2b..561e6bed887d 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -404,6 +404,8 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಡೀಫಾಲ್ಟ್ಗಳನ್ನು ಅತಿಕ್ರಮಿಸಿ"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ಟ್ರಾನ್ಸ್ಕೋಡಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="transcode_default" msgid="3784803084573509491">"ಆ್ಯಪ್ಗಳು ಆಧುನಿಕ ಫಾರ್ಮ್ಯಾಟ್ಗಳನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ ಎಂದು ಊಹಿಸಿ"</string> + <!-- no translation found for transcode_notification (5560515979793436168) --> + <skip /> <string name="runningservices_settings_title" msgid="6460099290493086515">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ಹೊಂದಿಸಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 0b8c71d0d9cd..cd3b8b842c66 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"트랜스코딩 기본값 재정의"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"트랜스코딩 사용"</string> <string name="transcode_default" msgid="3784803084573509491">"앱이 최신 형식을 지원하는 것으로 가정"</string> + <string name="transcode_notification" msgid="5560515979793436168">"트랜스코딩 알림 표시"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"실행 중인 서비스"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"현재 실행 중인 서비스 보기 및 제어"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 구현"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index cad00a38e89d..1990353f80b8 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Демейки жүргүзүлгөн транскоддоону өзгөртүп коюу"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Транскоддоо жүргүзүүнү иштетүү"</string> <string name="transcode_default" msgid="3784803084573509491">"Колдонмолордо заманбап форматтар колдоого алынат"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Транскоддоо билдирмелерин көрсөтүү"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Иштеп жаткан кызматтар"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Учурда иштеп жаткан кызматтарды көрүп, көзөмөлдөп турасыз"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView кызматы"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 5bd297e310f5..4997ea1a82c6 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ຍົກເລີກຄ່າເລີ່ມຕົ້ນການປ່ຽນຮູບແບບລະຫັດ"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ເປີດການນຳໃຊ້ການປ່ຽນຮູບແບບລະຫັດ"</string> <string name="transcode_default" msgid="3784803084573509491">"ສົມມຸດວ່າແອັບຮອງຮັບຮູບແບບສະໄໝໃໝ່"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ສະແດງການແຈ້ງເຕືອນການປ່ຽນຮູບແບບລະຫັດ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ເບິ່ງ ແລະຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 8c7485f29af7..ec3cb0d94a51 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Perkodavimo numatytųjų nustatymų nepaisymas"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Perkodavimo įgalinimas"</string> <string name="transcode_default" msgid="3784803084573509491">"Manoma, kad programos palaiko modernius formatus"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Rodyti perkodavimo pranešimus"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Vykdomos paslaugos"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Žiūrėti ir valdyti dabar vykdomas paslaugas"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"„WebView“ diegimas"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index d8020c7c1d05..ff9f0a1649f9 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ignorēt pārkodēšanas noklusējuma iestatījumus"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Iespējot pārkodēšanu"</string> <string name="transcode_default" msgid="3784803084573509491">"Pieņemt, ka lietotnēs tiek atbalstīti moderni formāti"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Rādīt paziņojumus par pārkodēšanu"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktīvie pakalpojumi"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Pašreiz darbojošos pakalpojumu skatīšana un vadība"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ieviešana"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index e4c8425495b7..507f65c641b2 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Отфрли стандардни вредности за транскодирање"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Овозможи транскодирање"</string> <string name="transcode_default" msgid="3784803084573509491">"Претпостави дека апликациите поддржуваат модерни формати"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Прикажувај известувања за транскодирање"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Активни услуги"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Погледнете и контролирајте услуги што се моментално активни"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Воведување WebView"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 28422c930683..8a09801502e1 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ട്രാൻസ്കോഡ് ചെയ്യൽ ഡിഫോൾട്ടുകൾ അസാധുവാക്കുക"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ട്രാൻസ്കോഡ് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="transcode_default" msgid="3784803084573509491">"ആപ്പുകൾ ആധുനിക ഫോർമാറ്റുകളെ പിന്തുണയ്ക്കുമെന്ന് കരുതുക"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ട്രാൻസ്കോഡ് ചെയ്യൽ അറിയിപ്പുകൾ കാണിക്കുക"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView നടപ്പാക്കൽ"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 0d78ea9ac2e3..27ca8f59739d 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Хөрвүүлгийн өгөгдмөлийг дарах"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Хөрвүүлгийг идэвхжүүлэх"</string> <string name="transcode_default" msgid="3784803084573509491">"Аппыг орчин үеийн форматыг дэмждэг гэж үздэг"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Хөрвүүлгийн мэдэгдэл харуулах"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Ажиллаж байгаа үйлчилгээнүүд"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView хэрэгжилт"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index d27f7051d1f1..b6c546072473 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -404,6 +404,8 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ट्रान्सकोडिंग डीफॉल्ट ओव्हरराइड करा"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ट्रान्सकोडिंग सुरू करा"</string> <string name="transcode_default" msgid="3784803084573509491">"असे गृहीत धरा की, ॲप्स आधुनिक फॉरमॅटना सपोर्ट करतात"</string> + <!-- no translation found for transcode_notification (5560515979793436168) --> + <skip /> <string name="runningservices_settings_title" msgid="6460099290493086515">"सुरू सेवा"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"सध्या सुरू असलेल्या सेवा पहा आणि नियंत्रित करा"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"वेबदृश्य अंमलबजावणी"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index c5a2c6276318..53a4398d1b90 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Batalkan transpengekodan lalai"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Dayakan transpengekodan"</string> <string name="transcode_default" msgid="3784803084573509491">"Mengambil alih sokongan apl format moden"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Tunjukkan pemberitahuan transpengekodan"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Perkhidmatan dijalankan"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Lihat dan kawal perkhidmatan yang sedang dijalankan"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Pelaksanaan WebView"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index ed34f7d3dd9e..0fef5abf782b 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -307,7 +307,7 @@ <string name="adb_keys_warning_message" msgid="2968555274488101220">"သင် ယခင်က ခွင့်ပြုခဲ့သော ကွန်ပျူတာအားလုံးမှ ယူအက်စ်ဘီ အမှားစစ်ခွင့်ကို ရုတ်သိမ်းမည်လား ?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"တည်ဆောက်ပြုပြင်ရန်ဆက်တင်များကို အသုံးပြုခွင့်ပေးမည်လား?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"ဤဆက်တင်းများကို တည်ဆောက်ပြုပြင်ရာတွင် သုံးရန်အတွက်သာ ရည်ရွယ်သည်။ ၎င်းတို့သည် သင်၏စက်နှင့် အပလီကေးရှင်းများကို ရပ်စေခြင်း သို့ လုပ်ဆောင်ချက်မမှန်ကန်ခြင်းများ ဖြစ်ပေါ်စေနိုင်သည်။"</string> - <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB ဖြင့် အက်ပ်များကို အတည်ပြုစိစစ်ရန်"</string> + <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB ဖြင့် အက်ပ်များစိစစ်ရန်"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ADB/ADT မှတစ်ဆင့် ထည့်သွင်းသော အက်ပ်များ အန္တရာယ်ဖြစ်နိုင်ခြင်း ရှိမရှိ စစ်ဆေးသည်။"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"အမည်မရှိသော (MAC လိပ်စာများသာပါသော) ဘလူးတုသ်စက်ပစ္စည်းများကို ပြသပါမည်"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ချိတ်ဆက်ထားသည့် ကိရိယာတွင် လက်မခံနိုင်လောက်အောင် ဆူညံ သို့မဟုတ် ထိန်းညှိမရနိုင်သော အသံပိုင်းပြဿနာ ရှိခဲ့လျှင် ဘလူးတုသ် ပကတိ အသံနှုန်းကို ပိတ်ပါ။"</string> @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"အမျိုးအစားပြောင်းခြင်း၏ မူရင်းဆက်တင်များကို အစားထိုးရန်"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"အမျိုးအစားပြောင်းခြင်းကို ဖွင့်ရန်"</string> <string name="transcode_default" msgid="3784803084573509491">"ဤအက်ပ်များက ဖော်မက်အသစ်များကို ပံ့ပိုးသည်"</string> + <string name="transcode_notification" msgid="5560515979793436168">"အမျိုးအစားပြောင်းခြင်း အကြောင်းကြားချက်များကို ပြရန်"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"လက်ရှိ ဝန်ဆောင်မှုများကို ကြည့်ရှု ထိန်းသိမ်းသည်"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView အကောင်အထည်ဖော်မှု"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 5366e7e13843..0ca8d51645e8 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Overstyr omkodingsstandarder"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Slå på omkoding"</string> <string name="transcode_default" msgid="3784803084573509491">"Anta at apper støtter moderne formater"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Vis omkodingsvarsler"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktive tjenester"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Se og kontrollér tjenester som kjører"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index cde7b8033509..75b4537f6a8f 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -404,6 +404,8 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ट्रान्सकोडिङसम्बन्धी पूर्वनिर्धारित सेटिङ परिवर्तन गर्नुहोस्"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ट्रान्सकोडिङ अन गर्नुहोस्"</string> <string name="transcode_default" msgid="3784803084573509491">"एपहरूमा आधुनिक फर्म्याट प्रयोग गर्न मिल्छ भनी मान्नुहोस्"</string> + <!-- no translation found for transcode_notification (5560515979793436168) --> + <skip /> <string name="runningservices_settings_title" msgid="6460099290493086515">"चलिरहेका सेवाहरू"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView कार्यान्वयन"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index bb1402a93227..71d6acc6a22b 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Standaardwaarden voor transcodering overschrijven"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Transcodering inschakelen"</string> <string name="transcode_default" msgid="3784803084573509491">"Aannemen dat apps moderne indelingen ondersteunen"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Transcoderingsmeldingen laten zien"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Actieve services"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Services die momenteel actief zijn, weergeven en beheren"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementatie"</string> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 90fc8bce9339..1d6e34f7af23 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ଟ୍ରାନ୍ସକୋଡିଂ ଡିଫଲ୍ଟଗୁଡ଼ିକୁ ଓଭରରାଇଡ୍ କରନ୍ତୁ"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ଟ୍ରାନ୍ସକୋଡିଂକୁ ସକ୍ଷମ କରନ୍ତୁ"</string> <string name="transcode_default" msgid="3784803084573509491">"ଧରିନିଅନ୍ତୁ ଆପଗୁଡ଼ିକ ଆଧୁନିକ ଫର୍ମାଟଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ଟ୍ରାନ୍ସକୋଡିଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଦେଖାନ୍ତୁ"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"ୱେବ୍ଭ୍ୟୁ ପ୍ରୟୋଗ"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 4c20e196b1bb..9d91aae0a982 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -404,6 +404,8 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਦੀਆਂ ਪੂਰਵ-ਨਿਰਧਾਰਤ ਸੈਟਿੰਗਾਂ ਨੂੰ ਓਵਰਰਾਈਡ ਕਰੋ"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ਟ੍ਰਾਂਸਕੋਡਿੰਗ ਚਾਲੂ ਕਰੋ"</string> <string name="transcode_default" msgid="3784803084573509491">"ਮੰਨ ਲਓ ਕਿ ਐਪਾਂ ਆਧੁਨਿਕ ਫਾਰਮੈਟਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦੀਆਂ ਹਨ"</string> + <!-- no translation found for transcode_notification (5560515979793436168) --> + <skip /> <string name="runningservices_settings_title" msgid="6460099290493086515">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ਅਮਲ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 6d037d8e0aaf..f48b05f01ddc 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Zastąp ustawienia domyślne transkodowania"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Włącz transkodowanie"</string> <string name="transcode_default" msgid="3784803084573509491">"Zakładaj, że aplikacje obsługują nowoczesne formaty"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Pokaż powiadomienia transkodowania"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Uruchomione usługi"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Wyświetl obecnie uruchomione usługi i nimi zarządzaj"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementacja WebView"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 3feed99762ef..b9c919129623 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Substituir os padrões de transcodificação"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Ativar transcodificação"</string> <string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index a886aa9d4cb4..57e38c078375 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Substituir as predefinições da transcodificação"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Ativar a transcodificação"</string> <string name="transcode_default" msgid="3784803084573509491">"Assumir que as apps suportam formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ver e controlar os serviços actualmente em execução"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação WebView"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 3feed99762ef..b9c919129623 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Substituir os padrões de transcodificação"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Ativar transcodificação"</string> <string name="transcode_default" msgid="3784803084573509491">"Considerar que os apps são compatíveis com formatos modernos"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Mostrar notificações de transcodificação"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Serviços em execução"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visualizar e controlar os serviços em execução no momento"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementação do WebView"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 7fbe6225bc9c..c2da73c5679c 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Modificați setările prestabilite de transcodare"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Activați transcodarea"</string> <string name="transcode_default" msgid="3784803084573509491">"Presupuneți că aplicațiile acceptă formatele moderne"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Vedeți notificările privind transcodarea"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Servicii în curs de funcționare"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Vedeți și controlați serviciile care funcționează în prezent"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementare WebView"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 1669df6136f0..efcce7556910 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Переопределять настройки транскодирования по умолчанию"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Включить перекодирование"</string> <string name="transcode_default" msgid="3784803084573509491">"Считать, что приложения поддерживают современные форматы кодирования"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Показывать уведомления о перекодировании"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Работающие службы"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Просмотр и управление работающими службами"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Сервис WebView"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 1fdd968c9b7e..590e0e4eded1 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ට්රාන්ස්කෝඩින් පෙරනිමි ප්රතික්ෂේප කරන්න"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ට්රාන්ස්කෝඩින් සබල කරන්න"</string> <string name="transcode_default" msgid="3784803084573509491">"යෙදුම් නවීන ආකෘති සඳහා සහාය දක්වයි යැයි උපකල්පනය කරමු"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ට්රාන්ස්කෝඩින් දැනුම්දීම් පෙන්වන්න"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"ධාවනය වන සේවා"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ක්රියාත්මක කිරීම"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 03b454ea6a14..c817ed0e200c 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Prepísať predvolené nastavenia prekódovania"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Povoliť prekódovanie"</string> <string name="transcode_default" msgid="3784803084573509491">"Prepdokladať, že aplikácie podporujú moderné formáty"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Zobraziť upozornenia prekódovania"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Spustené služby"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Zobrazovať a riadiť aktuálne spustené služby"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Implementácia WebView"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 73b48187747c..464b235e90da 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Preglasi privzete nastavitve prekodiranja"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Omogoči prekodiranje"</string> <string name="transcode_default" msgid="3784803084573509491">"Aplikacije naj bi podpirale sodobne oblike zapisov"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Prikaz obvestil o prekodiranju"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Zagnane storitve"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Preglejte in nadzorujte storitve, ki so trenutno zagnane"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Izvedba spletnega pogleda"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index a07bb2bc1cfd..a2a63e165a96 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Anulo parazgjedhjet e transkodimit"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Aktivizo transkodimin"</string> <string name="transcode_default" msgid="3784803084573509491">"Supozo se aplikacionet i mbështetin formatet moderne"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Shfaq njoftimet e transkodimit"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Shërbimet në ekzekutim"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Shiko dhe kontrollo shërbimet që po ekzekutohen aktualisht"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Zbatimi i WebView"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 0faaf83e65c9..2119303410e0 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Замени подразумевана подешавања транскодирања"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Омогући транскодирање"</string> <string name="transcode_default" msgid="3784803084573509491">"Подразумевај да апликације подржавају модерне формате"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Приказуј обавештења о транскодирању"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Покренуте услуге"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Приказ и контрола тренутно покренутих услуга"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Примена WebView-а"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 87606d0f7ed5..c7a21692fea6 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Åsidosätta standardinställningar för omkodning"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Aktivera omkodning"</string> <string name="transcode_default" msgid="3784803084573509491">"Anta att appar har stöd för moderna format"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Visa aviseringar för omkodning"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Aktiva tjänster"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Visa och styr aktiva tjänster"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView-implementering"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index d479b0b174b8..60014f437c4b 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Batilisha chaguomsingi za kubadilisha miundo ya faili"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Ruhusu ubadilishaji wa miundo ya faili"</string> <string name="transcode_default" msgid="3784803084573509491">"Chukulia kuwa programu zinatumia miundo ya kisasa"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Onyesha arifa za kubadilisha muundo wa faili"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Huduma zinazoendeshwa"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Onyesha na udhibiti huduma zinazoendeshwa kwa sasa"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Utekelezaji wa WebView"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 247889bb4e83..82cce1275b10 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"இயல்புநிலை குறிமாற்றங்களை மீறிச் செயல்படு"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"குறிமாற்றத்தை இயக்கு"</string> <string name="transcode_default" msgid="3784803084573509491">"ஆப்ஸ் மாடர்ன் வடிவங்களை ஆதரிக்கும்படி அமை"</string> + <string name="transcode_notification" msgid="5560515979793436168">"குறிமாற்ற அறிவிப்புகளைக் காட்டு"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"இயங்கும் சேவைகள்"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView செயல்படுத்தல்"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index b5d584f23d7e..3b04eb402585 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ట్రాన్స్కోడింగ్ ఆటోమేటిక్ సెట్టింగ్లను ఓవర్రైడ్ చేయండి"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ట్రాన్స్కోడింగ్ను ఎనేబుల్ చేయండి"</string> <string name="transcode_default" msgid="3784803084573509491">"యాప్లు ఆధునిక ఫార్మాట్లకు సపోర్ట్ చేస్తాయని అనుకోండి"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ట్రాన్స్కోడింగ్ నోటిఫికేషన్లను చూపండి"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"అమలులో ఉన్న సేవలు"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ప్రస్తుతం అమలులో ఉన్న సేవలను వీక్షించండి మరియు నియంత్రించండి"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"వెబ్ వీక్షణ అమలు"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index dc1514f2777b..a9703213813e 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ลบล้างค่าเริ่มต้นของการแปลง"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"เปิดใช้การแปลง"</string> <string name="transcode_default" msgid="3784803084573509491">"ถือว่าแอปรองรับรูปแบบสมัยใหม่"</string> + <string name="transcode_notification" msgid="5560515979793436168">"แสดงการแจ้งเตือนการแปลง"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"บริการที่ทำงานอยู่"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"ดูและควบคุมบริการที่ทำงานอยู่"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"การใช้งาน WebView"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 7c4ceec08dd1..bedd00511118 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"I-override ang mga default ng pagta-transcode"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"I-enable ang pagta-transcode"</string> <string name="transcode_default" msgid="3784803084573509491">"Ipagpalagay na sinusuportahan ng mga app ang mga modernong format"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Ipakita ang mga notification sa pag-transcode"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Mga tumatakbong serbisyo"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Pagpapatupad sa WebView"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 2b5dff15d101..2b2b44e0f9dc 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Kod dönüştürme varsayılanlarını geçersiz kıl"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Kod dönüştürmeyi etkinleştir"</string> <string name="transcode_default" msgid="3784803084573509491">"Uygulamaların modern biçimleri desteklediğini varsay"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Kod dönüştürme bildirimlerini göster"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Çalışan hizmetler"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Şu anda çalışan hizmetleri görüntüle ve denetle"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Web Görünümü kullanımı"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 6fff40dab7f2..9c5e2aa858aa 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Замінити стандартні налаштування перекодування"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Увімкнути перекодування"</string> <string name="transcode_default" msgid="3784803084573509491">"Вважати, що додатки підтримують сучасні формати"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Показувати сповіщення про перекодування"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Запущені сервіси"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Переглянути й налаштувати запущені сервіси"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Застосування WebView"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 055d9b86e3e0..ee06623240de 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"ٹرانسکوڈنگ ڈیفالٹس کو اوور رائیڈ کریں"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"ٹرانسکوڈنگ فعال کریں"</string> <string name="transcode_default" msgid="3784803084573509491">"فرض کریں کہ ایپس جدید فارمیٹس کو سپورٹ کرتی ہیں"</string> + <string name="transcode_notification" msgid="5560515979793436168">"ٹرانسکوڈنگ اطلاعات دکھائیں"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"چل رہی سروسز"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView کا نفاذ"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index d897ba697580..29c0f91c4e60 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Transkripsiya parametrlarini almashtirish"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Transkripsiyasini yoqish"</string> <string name="transcode_default" msgid="3784803084573509491">"Ilovalarda zamonaviy kodlash formatlari ishlaydi deb hisoblash"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Transkripsiya bildirishnomalarini chiqarish"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Ishlab turgan ilovalar"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Ishlab turgan ilovalarni ko‘rish va boshqarish"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView ta’minotchisi"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index c6b7915b927d..39beecd0a87a 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Ghi đè tùy chọn chuyển mã mặc định"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Bật tính năng chuyển mã"</string> <string name="transcode_default" msgid="3784803084573509491">"Giả định rằng các ứng dụng hỗ trợ định dạng hiện đại"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Hiển thị thông báo chuyển mã"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Các dịch vụ đang chạy"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Xem và kiểm soát các dịch vụ đang chạy"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Triển khai WebView"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 05b27d14c4f9..010a4dc9ea6c 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"覆盖转码默认设置"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"启用转码"</string> <string name="transcode_default" msgid="3784803084573509491">"假设应用支持现代格式"</string> + <string name="transcode_notification" msgid="5560515979793436168">"显示转码通知"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"正在运行的服务"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看和控制当前正在运行的服务"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 实现"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 13398d74588c..1e06a91859e2 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"覆寫轉碼預設設定"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"啟用轉碼功能"</string> <string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新型格式"</string> + <string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"執行中的服務"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並控制目前正在執行中的服務"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 設置"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index fead5e50f7e4..2c077e7991be 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"覆寫轉碼預設設定"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"啟用轉碼"</string> <string name="transcode_default" msgid="3784803084573509491">"假設應用程式支援新格式"</string> + <string name="transcode_notification" msgid="5560515979793436168">"顯示轉碼通知"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"正在運作的服務"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"查看並管理目前正在執行的服務"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"WebView 實作"</string> @@ -434,9 +435,9 @@ <skip /> <string name="power_discharge_by_enhanced" msgid="563438403581662942">"根據你的使用情形,目前電量為 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only_enhanced" msgid="3268796172652988877">"根據你的使用情形,預估可持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_discharge_by" msgid="4113180890060388350">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_discharge_by" msgid="4113180890060388350">"目前電量 <xliff:g id="LEVEL">%2$s</xliff:g>,預估可用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_discharge_by_only" msgid="92545648425937000">"預估電力大約可使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> - <string name="power_discharge_by_only_short" msgid="5883041507426914446">"還能持續使用到<xliff:g id="TIME">%1$s</xliff:g>"</string> + <string name="power_discharge_by_only_short" msgid="5883041507426914446">"可用到<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="power_suggestion_battery_run_out" msgid="6332089307827787087">"電池電力可能於<xliff:g id="TIME">%1$s</xliff:g> 前耗盡"</string> <string name="power_remaining_less_than_duration_only" msgid="8956656616031395152">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string> <string name="power_remaining_less_than_duration" msgid="318215464914990578">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g> (<xliff:g id="LEVEL">%2$s</xliff:g>)"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 79b8946f1e98..87cf75b0beaf 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -404,6 +404,7 @@ <string name="transcode_user_control" msgid="6176368544817731314">"Khipha okuzenzakalelayo kokudlulisela ikhodi"</string> <string name="transcode_enable_all" msgid="2411165920039166710">"Nika amandla ukudlulisela ikhodi"</string> <string name="transcode_default" msgid="3784803084573509491">"Kuthathe njengokungathi izinhlelo zokusebenza zisekela amafomethi esimanje"</string> + <string name="transcode_notification" msgid="5560515979793436168">"Bonisa izaziso zokudlulisela ikhodi"</string> <string name="runningservices_settings_title" msgid="6460099290493086515">"Amasevisi asebenzayo"</string> <string name="runningservices_settings_summary" msgid="1046080643262665743">"Buka futhi ulawule amasevisi asebenzayo okwamanje"</string> <string name="select_webview_provider_title" msgid="3917815648099445503">"Ukufakwa ke-WebView"</string> diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java index bcd28a6ab124..53f7e44bc25a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java @@ -50,6 +50,4 @@ public abstract class QSTileView extends LinearLayout { public abstract void onStateChanged(State state); public abstract int getDetailY(); - - public void setShowLabels(boolean show) {} } diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 0414de6eb7ca..5f8df5a13ad1 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1054,6 +1054,9 @@ <!-- Text on keyguard screen and in Quick Settings footer indicating that user's device belongs to their organization. [CHAR LIMIT=40] --> <string name="do_disclosure_with_name">This device belongs to <xliff:g id="organization_name" example="Foo, Inc.">%s</xliff:g></string> + <!-- Text on keyguard screen and in Quick Settings footer indicating that the user's device is provided by the Creditor. [CHAR LIMIT=60] --> + <string name="do_financed_disclosure_with_name">This device is provided by <xliff:g id="organization_name" example="Foo, Inc.">%s</xliff:g></string> + <!-- Shows when people have clicked on the phone icon [CHAR LIMIT=60] --> <string name="phone_hint">Swipe from icon for phone</string> diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index 79f0688db869..2040347de1b5 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -40,6 +40,7 @@ import android.util.SparseArray; import androidx.annotation.WorkerThread; +import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.Dumpable; @@ -78,6 +79,7 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon private static final boolean DEBUG = false; private final BroadcastDispatcher mDispatcher; + private final Context mContext; private final AppOpsManager mAppOps; private final AudioManager mAudioManager; private final LocationManager mLocationManager; @@ -141,6 +143,7 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon mCameraDisabled = mSensorPrivacyController.isSensorBlocked(CAMERA); mLocationManager = context.getSystemService(LocationManager.class); mPackageManager = context.getPackageManager(); + mContext = context; dumpManager.registerDumpable(TAG, this); } @@ -357,6 +360,15 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon return mLocationProviderPackages.contains(packageName); } + private boolean isSpeechRecognizerUsage(int opCode, String packageName) { + if (AppOpsManager.OP_RECORD_AUDIO != opCode) { + return false; + } + + return packageName.equals( + mContext.getString(R.string.config_systemSpeechRecognizer)); + } + // TODO ntmyren: remove after teamfood is finished private boolean shouldShowAppPredictor(String pkgName) { if (!DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, "permissions_hub_2_enabled", @@ -388,7 +400,8 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon } // TODO ntmyren: Replace this with more robust check if this moves beyond teamfood if ((appOpCode == AppOpsManager.OP_CAMERA && isLocationProvider(packageName)) - || shouldShowAppPredictor(packageName)) { + || shouldShowAppPredictor(packageName) + || isSpeechRecognizerUsage(appOpCode, packageName)) { return true; } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 6451ad9fd5d2..71fba3302abc 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -68,6 +68,7 @@ public class UdfpsController implements DozeReceiver, HbmCallback { private final Context mContext; private final FingerprintManager mFingerprintManager; + @NonNull private final LayoutInflater mInflater; private final WindowManager mWindowManager; private final DelayableExecutor mFgExecutor; private final StatusBarStateController mStatusBarStateController; @@ -75,10 +76,8 @@ public class UdfpsController implements DozeReceiver, HbmCallback { // sensors, this, in addition to a lot of the code here, will be updated. @VisibleForTesting final FingerprintSensorPropertiesInternal mSensorProps; private final WindowManager.LayoutParams mCoreLayoutParams; - private final UdfpsView mView; - // Indicates whether the overlay is currently showing. Even if it has been requested, it might - // not be showing. - private boolean mIsOverlayShowing; + + @Nullable private UdfpsView mView; // Indicates whether the overlay has been requested. private boolean mIsOverlayRequested; // Reason the overlay has been requested. See IUdfpsOverlayController for definitions. @@ -111,20 +110,48 @@ public class UdfpsController implements DozeReceiver, HbmCallback { @Override public void onEnrollmentProgress(int sensorId, int remaining) { + if (mView == null) { + return; + } mView.onEnrollmentProgress(remaining); } @Override public void onEnrollmentHelp(int sensorId) { + if (mView == null) { + return; + } mView.onEnrollmentHelp(); } @Override public void setDebugMessage(int sensorId, String message) { + if (mView == null) { + return; + } mView.setDebugMessage(message); } } + @VisibleForTesting + final StatusBar.ExpansionChangedListener mStatusBarExpansionListener = + (expansion, expanded) -> { + if (mView != null) { + mView.onExpansionChanged(expansion, expanded); + } + }; + + @VisibleForTesting + final StatusBarStateController.StateListener mStatusBarStateListener = + new StatusBarStateController.StateListener() { + @Override + public void onStateChanged(int newState) { + if (mView != null) { + mView.onStateChanged(newState); + } + } + }; + @SuppressLint("ClickableViewAccessibility") private final UdfpsView.OnTouchListener mOnTouchListener = (v, event) -> { UdfpsView view = (UdfpsView) v; @@ -157,13 +184,14 @@ public class UdfpsController implements DozeReceiver, HbmCallback { @Inject public UdfpsController(@NonNull Context context, @Main Resources resources, - LayoutInflater inflater, + @NonNull LayoutInflater inflater, @Nullable FingerprintManager fingerprintManager, WindowManager windowManager, @NonNull StatusBarStateController statusBarStateController, @Main DelayableExecutor fgExecutor, @Nullable StatusBar statusBar) { mContext = context; + mInflater = inflater; // The fingerprint manager is queried for UDFPS before this class is constructed, so the // fingerprint manager should never be null. mFingerprintManager = checkNotNull(fingerprintManager); @@ -189,15 +217,10 @@ public class UdfpsController implements DozeReceiver, HbmCallback { WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; mCoreLayoutParams.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY; - mView = (UdfpsView) inflater.inflate(R.layout.udfps_view, null, false); - mView.setSensorProperties(mSensorProps); - mView.setHbmCallback(this); - - statusBar.addExpansionChangedListener(mView); - statusBarStateController.addCallback(mView); + statusBar.addExpansionChangedListener(mStatusBarExpansionListener); + mStatusBarStateController.addCallback(mStatusBarStateListener); mFingerprintManager.setUdfpsOverlayController(new UdfpsOverlayController()); - mIsOverlayShowing = false; } @Nullable @@ -220,7 +243,13 @@ public class UdfpsController implements DozeReceiver, HbmCallback { * @return where the UDFPS exists on the screen in pixels. */ public RectF getSensorLocation() { - return mView.getSensorRect(); + // This is currently used to calculate the amount of space available for notifications + // on lockscreen. Keyguard is only shown in portrait mode for now, so this will need to + // be updated if that ever changes. + return new RectF(mSensorProps.sensorLocationX - mSensorProps.sensorRadius, + mSensorProps.sensorLocationY - mSensorProps.sensorRadius, + mSensorProps.sensorLocationX + mSensorProps.sensorRadius, + mSensorProps.sensorLocationY + mSensorProps.sensorRadius); } private void showOverlay(int reason) { @@ -298,14 +327,18 @@ public class UdfpsController implements DozeReceiver, HbmCallback { private void showUdfpsOverlay(int reason) { mFgExecutor.execute(() -> { - if (!mIsOverlayShowing) { + if (mView == null) { try { Log.v(TAG, "showUdfpsOverlay | adding window"); + + mView = (UdfpsView) mInflater.inflate(R.layout.udfps_view, null, false); + mView.setSensorProperties(mSensorProps); + mView.setHbmCallback(this); + final UdfpsAnimation animation = getUdfpsAnimationForReason(reason); mView.setExtras(animation, mEnrollHelper); mWindowManager.addView(mView, computeLayoutParams(animation)); mView.setOnTouchListener(mOnTouchListener); - mIsOverlayShowing = true; } catch (RuntimeException e) { Log.e(TAG, "showUdfpsOverlay | failed to add window", e); } @@ -334,14 +367,12 @@ public class UdfpsController implements DozeReceiver, HbmCallback { private void hideUdfpsOverlay() { mFgExecutor.execute(() -> { - if (mIsOverlayShowing) { + if (mView != null) { Log.v(TAG, "hideUdfpsOverlay | removing window"); - mView.setExtras(null, null); - mView.setOnTouchListener(null); // Reset the controller back to its starting state. onFingerUp(); mWindowManager.removeView(mView); - mIsOverlayShowing = false; + mView = null; } else { Log.v(TAG, "hideUdfpsOverlay | the overlay is already hidden"); } @@ -388,12 +419,20 @@ public class UdfpsController implements DozeReceiver, HbmCallback { // This method can be called from the UI thread. private void onFingerDown(int x, int y, float minor, float major) { + if (mView == null) { + Log.w(TAG, "Null view in onFingerDown"); + return; + } mView.startIllumination(() -> mFingerprintManager.onPointerDown(mSensorProps.sensorId, x, y, minor, major)); } // This method can be called from the UI thread. private void onFingerUp() { + if (mView == null) { + Log.w(TAG, "Null view in onFingerUp"); + return; + } mFingerprintManager.onPointerUp(mSensorProps.sensorId); mView.stopIllumination(); } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java index 6ffecdba883b..399794391700 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsView.java @@ -136,17 +136,13 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin } @Override - public void onExpandedChanged(boolean isExpanded) { - mNotificationShadeExpanded = isExpanded; - } - - @Override public void onStateChanged(int newState) { mStatusBarState = newState; } @Override public void onExpansionChanged(float expansion, boolean expanded) { + mNotificationShadeExpanded = expanded; mAnimationView.onExpansionChanged(expansion, expanded); } @@ -192,10 +188,6 @@ public class UdfpsView extends FrameLayout implements DozeReceiver, UdfpsIllumin } } - RectF getSensorRect() { - return new RectF(mSensorRect); - } - void setDebugMessage(String message) { mDebugMessage = message; postInvalidate(); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java index b1c85b5c530e..8ff7b7ae8e59 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/NearestTouchFrame.java @@ -84,19 +84,14 @@ public class NearestTouchFrame extends FrameLayout { } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); mClickableChildren.clear(); mAttachedChildren.clear(); mTouchableRegions.clear(); addClickableChildren(this); - cacheClosestChildLocations(); - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - super.onLayout(changed, left, top, right, bottom); getLocationInWindow(mOffset); + cacheClosestChildLocations(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java index eaf212362320..fcb56a4ec75d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java @@ -71,7 +71,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { private int mMinRows = 1; private int mMaxColumns = TileLayout.NO_MAX_COLUMNS; - private boolean mShowLabels = true; private final boolean mSideLabels; public PagedTileLayout(Context context, AttributeSet attrs) { @@ -91,16 +90,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { } private int mLastMaxHeight = -1; - @Override - public void setShowLabels(boolean show) { - mShowLabels = show; - for (TileLayout p : mPages) { - p.setShowLabels(show); - } - mDistributeTiles = true; - requestLayout(); - } - public void saveInstanceState(Bundle outState) { outState.putInt(CURRENT_PAGE, getCurrentItem()); } @@ -239,7 +228,6 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout { : R.layout.qs_paged_page, this, false); page.setMinRows(mMinRows); page.setMaxColumns(mMaxColumns); - page.setShowLabels(mShowLabels); return page; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 05633071be86..7657dcead583 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -847,8 +847,6 @@ public class QSPanel extends LinearLayout implements Tunable { default void setExpansion(float expansion) {} int getNumVisibleTiles(); - - default void setShowLabels(boolean show) {} } interface OnConfigurationChangedListener { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index d60801ef2d03..eda1abb0997e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -124,7 +124,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { updateMediaDisappearParameters(); mTunerService.addTunable(mView, QS_SHOW_BRIGHTNESS); - mTunerService.addTunable(mTunable, QS_REMOVE_LABELS); mView.updateResources(); if (mView.isListening()) { refreshAllTiles(); @@ -138,13 +137,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { } @Override - boolean switchTileLayout(boolean force) { - boolean result = super.switchTileLayout(force); - getTileLayout().setShowLabels(mShowLabels); - return result; - } - - @Override protected QSTileRevealController createTileRevealController() { return mQsTileRevealControllerFactory.create( this, (PagedTileLayout) mView.createRegularTileLayout()); @@ -152,7 +144,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { @Override protected void onViewDetached() { - mTunerService.removeTunable(mTunable); mTunerService.removeTunable(mView); mView.removeOnConfigurationChangedListener(mOnConfigurationChangedListener); if (mBrightnessMirrorController != null) { @@ -318,22 +309,5 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> { public boolean isExpanded() { return mView.isExpanded(); } - - private TunerService.Tunable mTunable = new TunerService.Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - if (QS_REMOVE_LABELS.equals(key)) { - if (!mQSLabelFlag) return; - boolean newShowLabels = newValue == null || "0".equals(newValue); - if (mShowLabels == newShowLabels) return; - mShowLabels = newShowLabels; - for (TileRecord t : mRecords) { - t.tileView.setShowLabels(mShowLabels); - } - getTileLayout().setShowLabels(mShowLabels); - mView.requestLayout(); - } - } - }; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index f1174fbe7aef..8ab17432524d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -198,7 +198,6 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr final TileRecord r = new TileRecord(); r.tile = tile; r.tileView = mHost.createTileView(tile, collapsedView); - r.tileView.setShowLabels(mShowLabels); mView.addTile(r); mRecords.add(r); mCachedSpecs = getTilesSpecs(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/SideLabelTileLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/SideLabelTileLayout.kt index 4de4a78e9e8a..c3cc3af10e83 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/SideLabelTileLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/SideLabelTileLayout.kt @@ -34,8 +34,6 @@ open class SideLabelTileLayout( } } - override fun setShowLabels(show: Boolean) { } - override fun isFull(): Boolean { return mRecords.size >= maxTiles() } diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java index 14cbf980df23..c1ce4a577dda 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java +++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java @@ -36,7 +36,6 @@ public class TileLayout extends ViewGroup implements QSTileLayout { private int mCellMarginTop; protected boolean mListening; protected int mMaxAllowedRows = 3; - private boolean mShowLabels = true; // Prototyping with less rows private final boolean mLessRows; @@ -57,12 +56,6 @@ public class TileLayout extends ViewGroup implements QSTileLayout { } @Override - public void setShowLabels(boolean show) { - mShowLabels = show; - updateResources(); - } - - @Override public int getOffsetTop(TileRecord tile) { return getTop(); } @@ -128,12 +121,9 @@ public class TileLayout extends ViewGroup implements QSTileLayout { mMaxCellHeight = mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_height); mCellMarginHorizontal = res.getDimensionPixelSize(R.dimen.qs_tile_margin_horizontal); mCellMarginVertical= res.getDimensionPixelSize(R.dimen.qs_tile_margin_vertical); - if (!mShowLabels && mCellMarginVertical == 0) { - mCellMarginVertical = mCellMarginHorizontal; - } mCellMarginTop = res.getDimensionPixelSize(R.dimen.qs_tile_margin_top); mMaxAllowedRows = Math.max(1, getResources().getInteger(R.integer.quick_settings_max_rows)); - if (mLessRows && mShowLabels) mMaxAllowedRows = Math.max(mMinRows, mMaxAllowedRows - 1); + if (mLessRows) mMaxAllowedRows = Math.max(mMinRows, mMaxAllowedRows - 1); if (updateColumns()) { requestLayout(); return true; @@ -194,9 +184,8 @@ public class TileLayout extends ViewGroup implements QSTileLayout { + mCellMarginVertical; final int previousRows = mRows; mRows = availableHeight / (getCellHeight() + mCellMarginVertical); - final int minRows = mShowLabels ? mMinRows : mMinRows + 1; - if (mRows < minRows) { - mRows = minRows; + if (mRows < mMinRows) { + mRows = mMinRows; } else if (mRows >= mMaxAllowedRows) { mRows = mMaxAllowedRows; } @@ -216,7 +205,7 @@ public class TileLayout extends ViewGroup implements QSTileLayout { } protected int getCellHeight() { - return mShowLabels ? mMaxCellHeight : mMaxCellHeight / 2; + return mMaxCellHeight; } protected void layoutTileRecords(int numRecords) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java index a567f512b204..0dc0b30748aa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/carrier/QSCarrierGroupController.java @@ -42,6 +42,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import java.util.function.Consumer; @@ -74,30 +75,25 @@ public class QSCarrierGroupController { private final NetworkController.SignalCallback mSignalCallback = new NetworkController.SignalCallback() { @Override - public void setMobileDataIndicators(NetworkController.IconState statusIcon, - NetworkController.IconState qsIcon, int statusType, int qsType, - boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, CharSequence description, - boolean isWide, int subId, boolean roaming, boolean showTriangle) { + public void setMobileDataIndicators(MobileDataIndicators indicators) { if (mProviderModel) { return; } - int slotIndex = getSlotIndex(subId); + int slotIndex = getSlotIndex(indicators.subId); if (slotIndex >= SIM_SLOTS) { Log.w(TAG, "setMobileDataIndicators - slot: " + slotIndex); return; } if (slotIndex == SubscriptionManager.INVALID_SIM_SLOT_INDEX) { - Log.e(TAG, "Invalid SIM slot index for subscription: " + subId); + Log.e(TAG, "Invalid SIM slot index for subscription: " + indicators.subId); return; } mInfos[slotIndex] = new CellSignalState( - statusIcon.visible, - statusIcon.icon, - statusIcon.contentDescription, - typeContentDescription.toString(), - roaming + indicators.statusIcon.visible, + indicators.statusIcon.icon, + indicators.statusIcon.contentDescription, + indicators.typeContentDescription.toString(), + indicators.roaming ); mMainHandler.obtainMessage(H.MSG_UPDATE_STATE).sendToTarget(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java index 9fe949b15933..dce081f21581 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java @@ -25,7 +25,6 @@ import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.Toolbar; @@ -48,7 +47,6 @@ import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; public class QSCustomizer extends LinearLayout { static final int MENU_RESET = Menu.FIRST; - static final int MENU_REMOVE_LABELS = Menu.FIRST + 1; static final String EXTRA_QS_CUSTOMIZING = "qs_customizing"; private final QSDetailClipper mClipper; @@ -77,10 +75,6 @@ public class QSCustomizer extends LinearLayout { toolbar.getMenu().add(Menu.NONE, MENU_RESET, 0, mContext.getString(com.android.internal.R.string.reset)); - // Prototype menu item - toolbar.getMenu() - .add(Menu.NONE, MENU_REMOVE_LABELS, Menu.NONE, R.string.qs_remove_labels) - .setCheckable(true); toolbar.setTitle(R.string.qs_edit); mRecyclerView = findViewById(android.R.id.list); mTransparentView = findViewById(R.id.customizer_transparent_view); @@ -89,11 +83,6 @@ public class QSCustomizer extends LinearLayout { mRecyclerView.setItemAnimator(animator); } - MenuItem getRemoveItem() { - return ((Toolbar) findViewById(com.android.internal.R.id.action_bar)) - .getMenu().findItem(MENU_REMOVE_LABELS); - } - void updateResources() { LayoutParams lp = (LayoutParams) mTransparentView.getLayoutParams(); lp.height = mContext.getResources().getDimensionPixelSize( diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java index d4bab2197249..f56a2bbefaf7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizerController.java @@ -17,9 +17,7 @@ package com.android.systemui.qs.customize; import static com.android.systemui.qs.customize.QSCustomizer.EXTRA_QS_CUSTOMIZING; -import static com.android.systemui.qs.customize.QSCustomizer.MENU_REMOVE_LABELS; import static com.android.systemui.qs.customize.QSCustomizer.MENU_RESET; -import static com.android.systemui.qs.dagger.QSFlagsModule.QS_LABELS_FLAG; import android.content.res.Configuration; import android.os.Bundle; @@ -38,7 +36,6 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSEditEvent; import com.android.systemui.qs.QSFragment; -import com.android.systemui.qs.QSPanelController; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.statusbar.phone.LightBarController; @@ -46,14 +43,12 @@ import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.KeyguardStateController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.ViewController; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; -import javax.inject.Named; /** {@link ViewController} for {@link QSCustomizer}. */ @QSScope @@ -67,8 +62,6 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { private final ConfigurationController mConfigurationController; private final UiEventLogger mUiEventLogger; private final Toolbar mToolbar; - private final TunerService mTunerService; - private final boolean mQsLabelsFlag; private final OnMenuItemClickListener mOnMenuItemClickListener = new OnMenuItemClickListener() { @Override @@ -76,11 +69,6 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { if (item.getItemId() == MENU_RESET) { mUiEventLogger.log(QSEditEvent.QS_EDIT_RESET); reset(); - } else if (item.getItemId() == MENU_REMOVE_LABELS) { - item.setChecked(!item.isChecked()); - mTunerService.setValue( - QSPanelController.QS_REMOVE_LABELS, item.isChecked() ? "1" : "0"); - return false; } return false; } @@ -111,20 +99,11 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { } }; - private final TunerService.Tunable mTunable = new TunerService.Tunable() { - @Override - public void onTuningChanged(String key, String newValue) { - mToolbar.getMenu().findItem(MENU_REMOVE_LABELS) - .setChecked(newValue != null && !("0".equals(newValue))); - } - }; - @Inject protected QSCustomizerController(QSCustomizer view, TileQueryHelper tileQueryHelper, QSTileHost qsTileHost, TileAdapter tileAdapter, ScreenLifecycle screenLifecycle, KeyguardStateController keyguardStateController, LightBarController lightBarController, - ConfigurationController configurationController, UiEventLogger uiEventLogger, - TunerService tunerService, @Named(QS_LABELS_FLAG) boolean qsLabelsFlag) { + ConfigurationController configurationController, UiEventLogger uiEventLogger) { super(view); mTileQueryHelper = tileQueryHelper; mQsTileHost = qsTileHost; @@ -136,21 +115,12 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { mUiEventLogger = uiEventLogger; mToolbar = mView.findViewById(com.android.internal.R.id.action_bar); - mQsLabelsFlag = qsLabelsFlag; - - mTunerService = tunerService; } - @Override - protected void onInit() { - super.onInit(); - mView.getRemoveItem().setVisible(mQsLabelsFlag); - } @Override protected void onViewAttached() { mView.updateNavBackDrop(getResources().getConfiguration(), mLightBarController); - mTunerService.addTunable(mTunable, QSPanelController.QS_REMOVE_LABELS); mConfigurationController.addCallback(mConfigurationListener); @@ -181,7 +151,6 @@ public class QSCustomizerController extends ViewController<QSCustomizer> { @Override protected void onViewDetached() { - mTunerService.removeTunable(mTunable); mTileQueryHelper.setListener(null); mToolbar.setOnMenuItemClickListener(null); mConfigurationController.removeCallback(mConfigurationListener); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java index 424aafac1f7a..207b25d001b9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java @@ -174,9 +174,4 @@ public class QSTileView extends QSTileBaseView { mLabelContainer.setClickable(false); mLabelContainer.setLongClickable(false); } - - @Override - public void setShowLabels(boolean show) { - mHandler.post(() -> mLabelContainer.setVisibility(show ? VISIBLE : GONE)); - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 1dddc452ec1d..f03ce2c0b267 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -54,6 +54,7 @@ import com.android.systemui.statusbar.policy.CastController.CastDevice; import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -269,13 +270,10 @@ public class CastTile extends QSTileImpl<BooleanState> { private final NetworkController.SignalCallback mSignalCallback = new NetworkController.SignalCallback() { @Override - public void setWifiIndicators(boolean enabled, - NetworkController.IconState statusIcon, - NetworkController.IconState qsIcon, boolean activityIn, boolean activityOut, - String description, boolean isTransient, String statusLabel) { + public void setWifiIndicators(WifiIndicators indicators) { // statusIcon.visible has the connected status information - boolean enabledAndConnected = - enabled && (qsIcon == null ? false : qsIcon.visible); + boolean enabledAndConnected = indicators.enabled + && (indicators.qsIcon == null ? false : indicators.qsIcon.visible); if (enabledAndConnected != mWifiConnected) { mWifiConnected = enabledAndConnected; // Hotspot is not connected, so changes here should update diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 720c5dc7026f..6a574d1d314b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -56,6 +56,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import javax.inject.Inject; @@ -264,21 +265,17 @@ public class CellularTile extends QSTileImpl<SignalState> { private final CallbackInfo mInfo = new CallbackInfo(); @Override - public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, CharSequence description, - boolean isWide, int subId, boolean roaming, boolean showTriangle) { - if (qsIcon == null) { + public void setMobileDataIndicators(MobileDataIndicators indicators) { + if (indicators.qsIcon == null) { // Not data sim, don't display. return; } mInfo.dataSubscriptionName = mController.getMobileDataNetworkName(); - mInfo.dataContentDescription = - (description != null) ? typeContentDescriptionHtml : null; - mInfo.activityIn = activityIn; - mInfo.activityOut = activityOut; - mInfo.roaming = roaming; + mInfo.dataContentDescription = indicators.description != null + ? indicators.typeContentDescriptionHtml : null; + mInfo.activityIn = indicators.activityIn; + mInfo.activityOut = indicators.activityOut; + mInfo.roaming = indicators.roaming; mInfo.multipleSubs = mController.getNumberSubscriptions() > 1; refreshState(mInfo); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index 946d041bdd93..e1a1fd2679c5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -51,7 +51,9 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import com.android.systemui.statusbar.policy.WifiIcons; import java.io.FileDescriptor; @@ -234,70 +236,44 @@ public class InternetTile extends QSTileImpl<SignalState> { @Override - public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description, boolean isTransient, - String statusLabel) { + public void setWifiIndicators(WifiIndicators indicators) { if (DEBUG) { - Log.d(TAG, "setWifiIndicators: " - + "enabled = " + enabled + "," - + "statusIcon = " + (statusIcon == null ? "" : statusIcon.toString()) + "," - + "qsIcon = " + (qsIcon == null ? "" : qsIcon.toString()) + "," - + "activityIn = " + activityIn + "," - + "activityOut = " + activityOut + "," - + "description = " + description + "," - + "isTransient = " + isTransient + "," - + "statusLabel = " + statusLabel); + Log.d(TAG, "setWifiIndicators: " + indicators); } - mWifiInfo.mEnabled = enabled; - if (qsIcon == null) { + mWifiInfo.mEnabled = indicators.enabled; + if (indicators.qsIcon == null) { return; } - mWifiInfo.mConnected = qsIcon.visible; - mWifiInfo.mWifiSignalIconId = qsIcon.icon; - mWifiInfo.mWifiSignalContentDescription = qsIcon.contentDescription; - mWifiInfo.mSsid = description; - mWifiInfo.mActivityIn = activityIn; - mWifiInfo.mActivityOut = activityOut; - mWifiInfo.mIsTransient = isTransient; - mWifiInfo.mStatusLabel = statusLabel; + mWifiInfo.mConnected = indicators.qsIcon.visible; + mWifiInfo.mWifiSignalIconId = indicators.qsIcon.icon; + mWifiInfo.mWifiSignalContentDescription = indicators.qsIcon.contentDescription; + mWifiInfo.mEnabled = indicators.enabled; + mWifiInfo.mSsid = indicators.description; + mWifiInfo.mActivityIn = indicators.activityIn; + mWifiInfo.mActivityOut = indicators.activityOut; + mWifiInfo.mIsTransient = indicators.isTransient; + mWifiInfo.mStatusLabel = indicators.statusLabel; refreshState(mWifiInfo); } @Override - public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, CharSequence description, - boolean isWide, int subId, boolean roaming, boolean showTriangle) { + public void setMobileDataIndicators(MobileDataIndicators indicators) { if (DEBUG) { - Log.d(TAG, "setMobileDataIndicators: " - + "statusIcon = " + (statusIcon == null ? "" : statusIcon.toString()) + "," - + "qsIcon = " + (qsIcon == null ? "" : qsIcon.toString()) + "," - + "statusType = " + statusType + "," - + "qsType = " + qsType + "," - + "activityIn = " + activityIn + "," - + "activityOut = " + activityOut + "," - + "typeContentDescription = " + typeContentDescription + "," - + "typeContentDescriptionHtml = " + typeContentDescriptionHtml + "," - + "description = " + description + "," - + "isWide = " + isWide + "," - + "subId = " + subId + "," - + "roaming = " + roaming + "," - + "showTriangle = " + showTriangle); + Log.d(TAG, "setMobileDataIndicators: " + indicators); } - if (qsIcon == null) { + if (indicators.qsIcon == null) { // Not data sim, don't display. return; } - mCellularInfo.mDataSubscriptionName = - description == null ? mController.getMobileDataNetworkName() : description; - mCellularInfo.mDataContentDescription = - (description != null) ? typeContentDescriptionHtml : null; - mCellularInfo.mMobileSignalIconId = qsIcon.icon; - mCellularInfo.mQsTypeIcon = qsType; - mCellularInfo.mActivityIn = activityIn; - mCellularInfo.mActivityOut = activityOut; - mCellularInfo.mRoaming = roaming; + mCellularInfo.mDataSubscriptionName = indicators.description == null + ? mController.getMobileDataNetworkName() : indicators.description; + mCellularInfo.mDataContentDescription = indicators.description != null + ? indicators.typeContentDescriptionHtml : null; + mCellularInfo.mMobileSignalIconId = indicators.qsIcon.icon; + mCellularInfo.mQsTypeIcon = indicators.qsType; + mCellularInfo.mActivityIn = indicators.activityIn; + mCellularInfo.mActivityOut = indicators.activityOut; + mCellularInfo.mRoaming = indicators.roaming; mCellularInfo.mMultipleSubs = mController.getNumberSubscriptions() > 1; refreshState(mCellularInfo); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index a6fd01108fad..341e67c9393f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -51,8 +51,8 @@ import com.android.systemui.qs.tileimpl.QSIconViewImpl; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.AccessPointController; -import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import com.android.systemui.statusbar.policy.WifiIcons; import com.android.wifitrackerlib.WifiEntry; @@ -303,22 +303,20 @@ public class WifiTile extends QSTileImpl<SignalState> { final CallbackInfo mInfo = new CallbackInfo(); @Override - public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description, boolean isTransient, - String statusLabel) { - if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled); - if (qsIcon == null) { + public void setWifiIndicators(WifiIndicators indicators) { + if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + indicators.enabled); + if (indicators.qsIcon == null) { return; } - mInfo.enabled = enabled; - mInfo.connected = qsIcon.visible; - mInfo.wifiSignalIconId = qsIcon.icon; - mInfo.ssid = description; - mInfo.activityIn = activityIn; - mInfo.activityOut = activityOut; - mInfo.wifiSignalContentDescription = qsIcon.contentDescription; - mInfo.isTransient = isTransient; - mInfo.statusLabel = statusLabel; + mInfo.enabled = indicators.enabled; + mInfo.connected = indicators.qsIcon.visible; + mInfo.wifiSignalIconId = indicators.qsIcon.icon; + mInfo.ssid = indicators.description; + mInfo.activityIn = indicators.activityIn; + mInfo.activityOut = indicators.activityOut; + mInfo.wifiSignalContentDescription = indicators.qsIcon.contentDescription; + mInfo.isTransient = indicators.isTransient; + mInfo.statusLabel = indicators.statusLabel; if (isShowingDetail()) { mDetailAdapter.updateItems(); } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS b/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS deleted file mode 100644 index 9b3e386bc0d8..000000000000 --- a/packages/SystemUI/src/com/android/systemui/screenshot/OWNERS +++ /dev/null @@ -1,12 +0,0 @@ -# Scroll Capture (Long Screenshots) -# Bug component: 801322 -# -# Referenced by: -# -# core/java/src/android/view/OWNERS -# core/java/src/com/android/internal/view/OWNERS -# core/tests/coretests/src/android/view/OWNERS -# core/tests/coretests/src/com/android/internal/view/OWNERS - -mrcasey@google.com -mrenouf@google.com diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 7e2d27ac728a..a4e97a1dc6d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static android.view.View.GONE; import static android.view.View.VISIBLE; @@ -41,6 +42,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.UserInfo; import android.content.res.ColorStateList; +import android.content.res.Resources; import android.graphics.Color; import android.hardware.biometrics.BiometricSourceType; import android.hardware.face.FaceManager; @@ -277,10 +279,7 @@ public class KeyguardIndicationController implements KeyguardStateController.Cal // avoid calling this method since it has an IPC if (whitelistIpcs(this::isOrganizationOwnedDevice)) { final CharSequence organizationName = getOrganizationOwnedDeviceOrganizationName(); - final CharSequence disclosure = organizationName != null - ? mContext.getResources().getString(R.string.do_disclosure_with_name, - organizationName) - : mContext.getResources().getText(R.string.do_disclosure_generic); + final CharSequence disclosure = getDisclosureText(organizationName); mRotateTextViewController.updateIndication( INDICATION_TYPE_DISCLOSURE, new KeyguardIndication.Builder() @@ -297,6 +296,22 @@ public class KeyguardIndicationController implements KeyguardStateController.Cal } } + private CharSequence getDisclosureText(@Nullable CharSequence organizationName) { + final Resources packageResources = mContext.getResources(); + if (organizationName == null) { + return packageResources.getText(R.string.do_disclosure_generic); + } else if (mDevicePolicyManager.isDeviceManaged() + && mDevicePolicyManager.getDeviceOwnerType( + mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()) + == DEVICE_OWNER_TYPE_FINANCED) { + return packageResources.getString(R.string.do_financed_disclosure_with_name, + organizationName); + } else { + return packageResources.getString(R.string.do_disclosure_with_name, + organizationName); + } + } + private void updateOwnerInfo() { if (!isKeyguardLayoutEnabled()) { mRotateTextViewController.hideIndication(INDICATION_TYPE_OWNER_INFO); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java index dacd9417b22a..9ee7b09589d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarSignalPolicy.java @@ -27,6 +27,8 @@ import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import com.android.systemui.statusbar.policy.NetworkControllerImpl; import com.android.systemui.statusbar.policy.SecurityController; import com.android.systemui.tuner.TunerService; @@ -143,24 +145,14 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description, boolean isTransient, - String statusLabel) { + public void setWifiIndicators(WifiIndicators indicators) { if (DEBUG) { - Log.d(TAG, "setWifiIndicators: " - + "enabled = " + enabled + "," - + "statusIcon = " + (statusIcon == null ? "" : statusIcon.toString()) + "," - + "qsIcon = " + (qsIcon == null ? "" : qsIcon.toString()) + "," - + "activityIn = " + activityIn + "," - + "activityOut = " + activityOut + "," - + "description = " + description + "," - + "isTransient = " + isTransient + "," - + "statusLabel = " + statusLabel); - } - boolean visible = statusIcon.visible && !mHideWifi; - boolean in = activityIn && mActivityEnabled && visible; - boolean out = activityOut && mActivityEnabled && visible; - mIsWifiEnabled = enabled; + Log.d(TAG, "setWifiIndicators: " + indicators); + } + boolean visible = indicators.statusIcon.visible && !mHideWifi; + boolean in = indicators.activityIn && mActivityEnabled && visible; + boolean out = indicators.activityOut && mActivityEnabled && visible; + mIsWifiEnabled = indicators.enabled; WifiIconState newState = mWifiIconState.copy(); @@ -174,10 +166,10 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba newState.resId = R.drawable.ic_qs_no_internet_available; } else { newState.visible = visible; - newState.resId = statusIcon.icon; + newState.resId = indicators.statusIcon.icon; newState.activityIn = in; newState.activityOut = out; - newState.contentDescription = statusIcon.contentDescription; + newState.contentDescription = indicators.statusIcon.contentDescription; MobileIconState first = getFirstMobileState(); newState.signalSpacerVisible = first != null && first.typeId != 0; } @@ -225,44 +217,28 @@ public class StatusBarSignalPolicy implements NetworkControllerImpl.SignalCallba } @Override - public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, CharSequence description, - boolean isWide, int subId, boolean roaming, boolean showTriangle) { + public void setMobileDataIndicators(MobileDataIndicators indicators) { if (DEBUG) { - Log.d(TAG, "setMobileDataIndicators: " - + "statusIcon = " + (statusIcon == null ? "" : statusIcon.toString()) + "," - + "qsIcon = " + (qsIcon == null ? "" : qsIcon.toString()) + "," - + "statusType = " + statusType + "," - + "qsType = " + qsType + "," - + "activityIn = " + activityIn + "," - + "activityOut = " + activityOut + "," - + "typeContentDescription = " + typeContentDescription + "," - + "typeContentDescriptionHtml = " + typeContentDescriptionHtml + "," - + "description = " + description + "," - + "isWide = " + isWide + "," - + "subId = " + subId + "," - + "roaming = " + roaming + "," - + "showTriangle = " + showTriangle); - } - MobileIconState state = getState(subId); + Log.d(TAG, "setMobileDataIndicators: " + indicators); + } + MobileIconState state = getState(indicators.subId); if (state == null) { return; } // Visibility of the data type indicator changed - boolean typeChanged = statusType != state.typeId && (statusType == 0 || state.typeId == 0); - - state.visible = statusIcon.visible && !mHideMobile; - state.strengthId = statusIcon.icon; - state.typeId = statusType; - state.contentDescription = statusIcon.contentDescription; - state.typeContentDescription = typeContentDescription; - state.showTriangle = showTriangle; - state.roaming = roaming; - state.activityIn = activityIn && mActivityEnabled; - state.activityOut = activityOut && mActivityEnabled; + boolean typeChanged = indicators.statusType != state.typeId + && (indicators.statusType == 0 || state.typeId == 0); + + state.visible = indicators.statusIcon.visible && !mHideMobile; + state.strengthId = indicators.statusIcon.icon; + state.typeId = indicators.statusType; + state.contentDescription = indicators.statusIcon.contentDescription; + state.typeContentDescription = indicators.typeContentDescription; + state.showTriangle = indicators.showTriangle; + state.roaming = indicators.roaming; + state.activityIn = indicators.activityIn && mActivityEnabled; + state.activityOut = indicators.activityOut && mActivityEnabled; if (DEBUG) { Log.d(TAG, "MobileIconStates: " diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 528c0cbae0dd..b96cb5e36c82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -23,7 +23,9 @@ import android.telephony.SubscriptionInfo; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import java.io.PrintWriter; import java.text.SimpleDateFormat; @@ -119,63 +121,29 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa } @Override - public void setWifiIndicators(final boolean enabled, final IconState statusIcon, - final IconState qsIcon, final boolean activityIn, final boolean activityOut, - final String description, boolean isTransient, String secondaryLabel) { + public void setWifiIndicators(final WifiIndicators indicators) { String log = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") - .append("setWifiIndicators: ") - .append("enabled=").append(enabled).append(",") - .append("statusIcon=").append(statusIcon).append(",") - .append("qsIcon=").append(qsIcon).append(",") - .append("activityIn=").append(activityIn).append(",") - .append("activityOut=").append(activityOut).append(",") - .append("description=").append(description).append(",") - .append("isTransient=").append(isTransient).append(",") - .append("secondaryLabel=").append(secondaryLabel) + .append(indicators) .toString(); recordLastCallback(log); post(() -> { for (SignalCallback callback : mSignalCallbacks) { - callback.setWifiIndicators(enabled, statusIcon, qsIcon, activityIn, activityOut, - description, isTransient, secondaryLabel); + callback.setWifiIndicators(indicators); } }); - - } @Override - public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, - final int statusType, final int qsType, final boolean activityIn, - final boolean activityOut, final CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, final CharSequence description, - final boolean isWide, final int subId, boolean roaming, boolean showTriangle) { + public void setMobileDataIndicators(final MobileDataIndicators indicators) { String log = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") - .append("setMobileDataIndicators: ") - .append("statusIcon=").append(statusIcon).append(",") - .append("qsIcon=").append(qsIcon).append(",") - .append("statusType=").append(statusType).append(",") - .append("qsType=").append(qsType).append(",") - .append("activityIn=").append(activityIn).append(",") - .append("activityOut=").append(activityOut).append(",") - .append("typeContentDescription=").append(typeContentDescription).append(",") - .append("typeContentDescriptionHtml=").append(typeContentDescriptionHtml) - .append(",") - .append("description=").append(description).append(",") - .append("isWide=").append(isWide).append(",") - .append("subId=").append(subId).append(",") - .append("roaming=").append(roaming).append(",") - .append("showTriangle=").append(showTriangle) + .append(indicators) .toString(); recordLastCallback(log); post(() -> { for (SignalCallback signalCluster : mSignalCallbacks) { - signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, - activityIn, activityOut, typeContentDescription, - typeContentDescriptionHtml, description, isWide, subId, roaming, - showTriangle); + signalCluster.setMobileDataIndicators(indicators); } }); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt index 4f69cd6a1367..4e5c461b9643 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/InflatedSmartReplyViewHolder.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 The Android Open Source Project + * Copyright (C) 2021 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. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 1ab7652d4280..6c097bdb08d3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -59,6 +59,7 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.SignalStrengthUtil; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import java.io.PrintWriter; @@ -402,10 +403,12 @@ public class MobileSignalController extends SignalController<MobileState, Mobile showDataIcon |= mCurrentState.roaming; IconState statusIcon = new IconState(showDataIcon && !mCurrentState.airplaneMode, getCurrentIconId(), contentDescription); - callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, + MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( + statusIcon, qsIcon, typeIcon, qsTypeIcon, activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, description, icons.isWide, mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming, showTriangle); + callback.setMobileDataIndicators(mobileDataIndicators); } else { boolean showDataIcon = mCurrentState.dataConnected || dataDisabled; IconState statusIcon = new IconState( @@ -432,10 +435,12 @@ public class MobileSignalController extends SignalController<MobileState, Mobile showDataIcon &= mCurrentState.isDefault || dataDisabled; int typeIcon = (showDataIcon || mConfig.alwaysShowDataRatIcon) ? icons.dataType : 0; boolean showTriangle = mCurrentState.enabled && !mCurrentState.airplaneMode; - callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, + MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( + statusIcon, qsIcon, typeIcon, qsTypeIcon, activityIn, activityOut, dataContentDescription, dataContentDescriptionHtml, description, icons.isWide, mSubscriptionInfo.getSubscriptionId(), mCurrentState.roaming, showTriangle); + callback.setMobileDataIndicators(mobileDataIndicators); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 0a9fead9cb64..ef2ca985858d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -46,34 +46,117 @@ public interface NetworkController extends CallbackController<SignalCallback>, D boolean isRadioOn(); + /** + * Wrapper class for all the WiFi signals used for WiFi indicators. + */ + final class WifiIndicators { + public boolean enabled; + public IconState statusIcon; + public IconState qsIcon; + public boolean activityIn; + public boolean activityOut; + public String description; + public boolean isTransient; + public String statusLabel; + + public WifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, + boolean activityIn, boolean activityOut, String description, + boolean isTransient, String statusLabel) { + this.enabled = enabled; + this.statusIcon = statusIcon; + this.qsIcon = qsIcon; + this.activityIn = activityIn; + this.activityOut = activityOut; + this.description = description; + this.isTransient = isTransient; + this.statusLabel = statusLabel; + } + + @Override + public String toString() { + return new StringBuilder("WifiIndicators[") + .append("enabled=").append(enabled) + .append(",statusIcon=").append(statusIcon == null ? "" : statusIcon.toString()) + .append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString()) + .append(",activityIn=").append(activityIn) + .append(",activityOut=").append(activityOut) + .append(",description=").append(description) + .append(",isTransient=").append(isTransient) + .append(",statusLabel=").append(statusLabel) + .append(']').toString(); + } + } + + /** + * Wrapper class for all the mobile signals used for mobile data indicators. + */ + final class MobileDataIndicators { + public IconState statusIcon; + public IconState qsIcon; + public int statusType; + public int qsType; + public boolean activityIn; + public boolean activityOut; + public CharSequence typeContentDescription; + public CharSequence typeContentDescriptionHtml; + public CharSequence description; + public boolean isWide; + public int subId; + public boolean roaming; + public boolean showTriangle; + + public MobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, + int qsType, boolean activityIn, boolean activityOut, + CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml, + CharSequence description, boolean isWide, int subId, boolean roaming, + boolean showTriangle) { + this.statusIcon = statusIcon; + this.qsIcon = qsIcon; + this.statusType = statusType; + this.qsType = qsType; + this.activityIn = activityIn; + this.activityOut = activityOut; + this.typeContentDescription = typeContentDescription; + this.typeContentDescriptionHtml = typeContentDescriptionHtml; + this.description = description; + this.isWide = isWide; + this.subId = subId; + this.roaming = roaming; + this.showTriangle = showTriangle; + } + + @Override + public String toString() { + return new StringBuilder("MobileDataIndicators[") + .append("statusIcon=").append(statusIcon == null ? "" : statusIcon.toString()) + .append(",qsIcon=").append(qsIcon == null ? "" : qsIcon.toString()) + .append(",statusType=").append(statusType) + .append(",qsType=").append(qsType) + .append(",activityIn=").append(activityIn) + .append(",activityOut=").append(activityOut) + .append(",typeContentDescription=").append(typeContentDescription) + .append(",typeContentDescriptionHtml=").append(typeContentDescriptionHtml) + .append(",description=").append(description) + .append(",isWide=").append(isWide) + .append(",subId=").append(subId) + .append(",roaming=").append(roaming) + .append(",showTriangle=").append(showTriangle) + .append(']').toString(); + } + } + public interface SignalCallback { - default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon, - boolean activityIn, boolean activityOut, String description, boolean isTransient, - String statusLabel) {} + /** + * Callback for listeners to be able to update the state of any UI tracking connectivity of + * WiFi networks. + */ + default void setWifiIndicators(WifiIndicators wifiIndicators) {} /** * Callback for listeners to be able to update the state of any UI tracking connectivity - * @param statusIcon the icon that should be shown in the status bar - * @param qsIcon the icon to show in Quick Settings - * @param statusType the resId of the data type icon (e.g. LTE) to show in the status bar - * @param qsType similar to above, the resId of the data type icon to show in Quick Settings - * @param activityIn indicates whether there is inbound activity - * @param activityOut indicates outbound activity - * @param typeContentDescription the contentDescription of the data type - * @param typeContentDescriptionHtml the (possibly HTML-styled) contentDescription of the - * data type. Suitable for display - * @param description description of the network (usually just the network name) - * @param isWide //TODO: unused? - * @param subId subscription ID for which to update the UI - * @param roaming indicates roaming - * @param showTriangle whether to show the mobile triangle the in status bar + * of Mobile networks. */ - default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, - CharSequence typeContentDescription, - CharSequence typeContentDescriptionHtml, CharSequence description, - boolean isWide, int subId, boolean roaming, boolean showTriangle) { - } + default void setMobileDataIndicators(MobileDataIndicators mobileDataIndicators) {} default void setSubs(List<SubscriptionInfo> subs) {} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 9f921429f7b8..8eb1e6487046 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -165,7 +165,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private int mCurrentUserId; private OnSubscriptionsChangedListener mSubscriptionListener; - + private NetworkCapabilities mLastDefaultNetworkCapabilities; // Handler that all broadcasts are received on. private final Handler mReceiverHandler; // Handler that all callbacks are made on. @@ -315,6 +315,7 @@ public class NetworkControllerImpl extends BroadcastReceiver public void onLost(Network network) { mLastNetwork = null; mLastNetworkCapabilities = null; + mLastDefaultNetworkCapabilities = null; String callback = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") .append("onLost: ") @@ -341,6 +342,7 @@ public class NetworkControllerImpl extends BroadcastReceiver } mLastNetwork = network; mLastNetworkCapabilities = networkCapabilities; + mLastDefaultNetworkCapabilities = networkCapabilities; String callback = new StringBuilder() .append(SSDF.format(System.currentTimeMillis())).append(",") .append("onCapabilitiesChanged: ") @@ -959,18 +961,17 @@ public class NetworkControllerImpl extends BroadcastReceiver private void updateConnectivity() { mConnectedTransports.clear(); mValidatedTransports.clear(); - for (NetworkCapabilities nc : - mConnectivityManager.getDefaultNetworkCapabilitiesForUser(mCurrentUserId)) { - for (int transportType : nc.getTransportTypes()) { + if (mLastDefaultNetworkCapabilities != null) { + for (int transportType : mLastDefaultNetworkCapabilities.getTransportTypes()) { if (transportType == NetworkCapabilities.TRANSPORT_CELLULAR - && Utils.tryGetWifiInfoForVcn(nc) != null) { + && Utils.tryGetWifiInfoForVcn(mLastDefaultNetworkCapabilities) != null) { mConnectedTransports.set(NetworkCapabilities.TRANSPORT_WIFI); - if (nc.hasCapability(NET_CAPABILITY_VALIDATED)) { + if (mLastDefaultNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { mValidatedTransports.set(NetworkCapabilities.TRANSPORT_WIFI); } } else { mConnectedTransports.set(transportType); - if (nc.hasCapability(NET_CAPABILITY_VALIDATED)) { + if (mLastDefaultNetworkCapabilities.hasCapability(NET_CAPABILITY_VALIDATED)) { mValidatedTransports.set(transportType); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index 16998d7be936..8d72c9c8810e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -38,7 +38,9 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.wifi.WifiStatusTracker; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import java.io.PrintWriter; import java.util.Objects; @@ -113,18 +115,24 @@ public class WifiSignalController extends mWifiTracker.isCaptivePortal ? R.drawable.ic_qs_wifi_disconnected : getQsCurrentIconId(), contentDescription); } - callback.setWifiIndicators(mCurrentState.enabled, statusIcon, qsIcon, + WifiIndicators wifiIndicators = new WifiIndicators( + mCurrentState.enabled, statusIcon, qsIcon, ssidPresent && mCurrentState.activityIn, ssidPresent && mCurrentState.activityOut, - wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel); + wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel + ); + callback.setWifiIndicators(wifiIndicators); } else { IconState qsIcon = new IconState(mCurrentState.connected, mWifiTracker.isCaptivePortal ? R.drawable.ic_qs_wifi_disconnected : getQsCurrentIconId(), contentDescription); - callback.setWifiIndicators(mCurrentState.enabled, statusIcon, qsIcon, + WifiIndicators wifiIndicators = new WifiIndicators( + mCurrentState.enabled, statusIcon, qsIcon, ssidPresent && mCurrentState.activityIn, ssidPresent && mCurrentState.activityOut, - wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel); + wifiDesc, mCurrentState.isTransient, mCurrentState.statusLabel + ); + callback.setWifiIndicators(wifiIndicators); } } @@ -149,10 +157,13 @@ public class WifiSignalController extends mCurrentState.connected, getQsCurrentIconIdForCarrierWifi(), contentDescription); CharSequence description = mNetworkController.getNetworkNameForCarrierWiFi(mCurrentState.subId); - callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, + MobileDataIndicators mobileDataIndicators = new MobileDataIndicators( + statusIcon, qsIcon, typeIcon, qsTypeIcon, mCurrentState.activityIn, mCurrentState.activityOut, dataContentDescription, dataContentDescriptionHtml, description, icons.isWide, - mCurrentState.subId, /* roaming= */ false, /* showTriangle= */ true); + mCurrentState.subId, /* roaming= */ false, /* showTriangle= */ true + ); + callback.setMobileDataIndicators(mobileDataIndicators); } private int getCurrentIconIdForCarrierWifi() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 3e873d1985fb..700f101e44b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -150,7 +150,10 @@ public class UdfpsControllerTest extends SysuiTestCase { } @Test - public void dozeTimeTick() { + public void dozeTimeTick() throws RemoteException { + mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID, + IUdfpsOverlayController.REASON_AUTH_FPM_KEYGUARD); + mFgExecutor.runAllReady(); mUdfpsController.dozeTimeTick(); verify(mUdfpsView).dozeTimeTick(); } @@ -240,7 +243,8 @@ public class UdfpsControllerTest extends SysuiTestCase { @Test public void registersViewForCallbacks() throws RemoteException { - verify(mStatusBarStateController).addCallback(mUdfpsView); - verify(mStatusBar).addExpansionChangedListener(mUdfpsView); + verify(mStatusBarStateController).addCallback(mUdfpsController.mStatusBarStateListener); + verify(mStatusBar).addExpansionChangedListener( + mUdfpsController.mStatusBarExpansionListener); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java index 5c179d4e46b6..c8f223bdd72f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/buttons/NearestTouchFrameTest.java @@ -69,7 +69,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 12 /* x */, 5 /* y */, 0); @@ -86,7 +86,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 12 /* x */, 5 /* y */, 0); @@ -105,7 +105,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); // Would go to left view if attached, but goes to right instead as left should be detached. MotionEvent ev = MotionEvent.obtain(0, 0, 0, @@ -122,7 +122,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 12 /* x */, 5 /* y */, 0); @@ -138,7 +138,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 18 /* x */, 5 /* y */, 0); @@ -154,7 +154,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.setIsVertical(true); mNearestTouchFrame.addView(top); mNearestTouchFrame.addView(bottom); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 5 /* x */, 12 /* y */, 0); @@ -170,7 +170,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.setIsVertical(true); mNearestTouchFrame.addView(top); mNearestTouchFrame.addView(bottom); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 5 /* x */, 18 /* y */, 0); @@ -184,7 +184,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { View view = mockViewAt(0, 20, 10, 10); when(view.isAttachedToWindow()).thenReturn(false); mNearestTouchFrame.addView(view); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 5 /* x */, 18 /* y */, 0); mNearestTouchFrame.onTouchEvent(ev); @@ -201,7 +201,7 @@ public class NearestTouchFrameTest extends SysuiTestCase { mNearestTouchFrame.addView(view1); mNearestTouchFrame.addView(view2); mNearestTouchFrame.addView(view3); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 30, 30); MotionEvent ev = MotionEvent.obtain(0, 0, 0, 5 /* x */, 18 /* y */, 0); mNearestTouchFrame.onTouchEvent(ev); @@ -213,11 +213,9 @@ public class NearestTouchFrameTest extends SysuiTestCase { public void testCachedRegionsSplit_horizontal() { View left = mockViewAt(0, 0, 5, 20); View right = mockViewAt(15, 0, 5, 20); - mNearestTouchFrame.layout(0, 0, 20, 20); - mNearestTouchFrame.addView(left); mNearestTouchFrame.addView(right); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.layout(0, 0, 20, 20); Map<View, Rect> childRegions = mNearestTouchFrame.getFullTouchableChildRegions(); assertEquals(2, childRegions.size()); @@ -231,12 +229,10 @@ public class NearestTouchFrameTest extends SysuiTestCase { public void testCachedRegionsSplit_vertical() { View top = mockViewAt(0, 0, 20, 5); View bottom = mockViewAt(0, 15, 20, 5); - mNearestTouchFrame.layout(0, 0, 20, 20); - mNearestTouchFrame.setIsVertical(true); - mNearestTouchFrame.addView(top); mNearestTouchFrame.addView(bottom); - mNearestTouchFrame.onMeasure(0, 0); + mNearestTouchFrame.setIsVertical(true); + mNearestTouchFrame.layout(0, 0, 20, 20); Map<View, Rect> childRegions = mNearestTouchFrame.getFullTouchableChildRegions(); assertEquals(2, childRegions.size()); @@ -256,6 +252,8 @@ public class NearestTouchFrameTest extends SysuiTestCase { }).when(v).getLocationInWindow(any()); when(v.isClickable()).thenReturn(true); when(v.isAttachedToWindow()).thenReturn(true); + when(v.getWidth()).thenReturn(width); + when(v.getHeight()).thenReturn(height); // Stupid final methods. v.setLeft(0); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java index 1ec1da44c0b5..5a1bd5f72a02 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/carrier/QSCarrierGroupControllerTest.java @@ -36,6 +36,7 @@ import androidx.test.filters.SmallTest; import com.android.keyguard.CarrierTextController; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.utils.leaks.LeakCheckedTest; import com.android.systemui.utils.os.FakeHandler; @@ -215,10 +216,11 @@ public class QSCarrierGroupControllerTest extends LeakCheckedTest { @Test // throws no Exception public void testSetMobileDataIndicators_invalidSim() { - mSignalCallback.setMobileDataIndicators( + MobileDataIndicators indicators = new MobileDataIndicators( mock(NetworkController.IconState.class), mock(NetworkController.IconState.class), 0, 0, true, true, "", "", "", true, 0, true, true); + mSignalCallback.setMobileDataIndicators(indicators); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java index faf43a21356e..1c29a8174359 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/CastTileTest.java @@ -46,6 +46,7 @@ import com.android.systemui.statusbar.policy.CastController.CastDevice; import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import org.junit.Before; import org.junit.Test; @@ -134,9 +135,11 @@ public class CastTileTest extends SysuiTestCase { public void testStateUnavailable_wifiDisabled() { NetworkController.IconState qsIcon = new NetworkController.IconState(false, 0, ""); - mSignalCallback.setWifiIndicators(false, mock(NetworkController.IconState.class), + WifiIndicators indicators = new WifiIndicators( + false, mock(NetworkController.IconState.class), qsIcon, false,false, "", false, ""); + mSignalCallback.setWifiIndicators(indicators); mTestableLooper.processAllMessages(); assertEquals(Tile.STATE_UNAVAILABLE, mCastTile.getState().state); @@ -146,9 +149,11 @@ public class CastTileTest extends SysuiTestCase { public void testStateUnavailable_wifiNotConnected() { NetworkController.IconState qsIcon = new NetworkController.IconState(false, 0, ""); - mSignalCallback.setWifiIndicators(true, mock(NetworkController.IconState.class), + WifiIndicators indicators = new WifiIndicators( + true, mock(NetworkController.IconState.class), qsIcon, false,false, "", false, ""); + mSignalCallback.setWifiIndicators(indicators); mTestableLooper.processAllMessages(); assertEquals(Tile.STATE_UNAVAILABLE, mCastTile.getState().state); @@ -157,9 +162,11 @@ public class CastTileTest extends SysuiTestCase { private void enableWifiAndProcessMessages() { NetworkController.IconState qsIcon = new NetworkController.IconState(true, 0, ""); - mSignalCallback.setWifiIndicators(true, mock(NetworkController.IconState.class), + WifiIndicators indicators = new WifiIndicators( + true, mock(NetworkController.IconState.class), qsIcon, false,false, "", false, ""); + mSignalCallback.setWifiIndicators(indicators); mTestableLooper.processAllMessages(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index ce14bca081ab..7ff056ead653 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_DEFAULT; +import static android.app.admin.DevicePolicyManager.DEVICE_OWNER_TYPE_FINANCED; import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE; import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_DISCLOSURE; @@ -40,6 +42,7 @@ import android.app.Instrumentation; 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.pm.UserInfo; @@ -94,8 +97,12 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { private static final String ORGANIZATION_NAME = "organization"; + private static final ComponentName DEVICE_OWNER_COMPONENT = new ComponentName("com.android.foo", + "bar"); + private String mDisclosureWithOrganization; private String mDisclosureGeneric; + private String mFinancedDisclosureWithOrganization; @Mock private DevicePolicyManager mDevicePolicyManager; @@ -156,6 +163,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { mDisclosureWithOrganization = mContext.getString(R.string.do_disclosure_with_name, ORGANIZATION_NAME); mDisclosureGeneric = mContext.getString(R.string.do_disclosure_generic); + mFinancedDisclosureWithOrganization = mContext.getString( + R.string.do_financed_disclosure_with_name, ORGANIZATION_NAME); when(mKeyguardUpdateMonitor.isUnlockingWithBiometricAllowed(anyBoolean())).thenReturn(true); when(mKeyguardUpdateMonitor.isScreenOn()).thenReturn(true); @@ -165,6 +174,11 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { .thenReturn(mIndicationAreaBottom); when(mIndicationArea.findViewById(R.id.keyguard_indication_text)).thenReturn(mTextView); + when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()) + .thenReturn(DEVICE_OWNER_COMPONENT); + when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT)) + .thenReturn(DEVICE_OWNER_TYPE_DEFAULT); + mWakeLock = new WakeLockFake(); mWakeLockBuilder = new WakeLockFake.Builder(mContext); mWakeLockBuilder.setWakeLock(mWakeLock); @@ -372,6 +386,22 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase { } @Test + public void disclosure_deviceOwner_financedDeviceWithOrganizationName() { + createController(); + + when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true); + when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME); + when(mDevicePolicyManager.getDeviceOwnerType(DEVICE_OWNER_COMPONENT)) + .thenReturn(DEVICE_OWNER_TYPE_FINANCED); + sendUpdateDisclosureBroadcast(); + + verify(mRotateTextViewController).updateIndication(eq(INDICATION_TYPE_DISCLOSURE), + mKeyguardIndicationCaptor.capture(), eq(false)); + assertThat(mKeyguardIndicationCaptor.getValue().getMessage()) + .isEqualTo(mFinancedDisclosureWithOrganization); + } + + @Test public void transientIndication_holdsWakeLock_whenDozing() { createController(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 67c1a086bb33..24182434f1ba 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -30,7 +30,9 @@ import com.android.settingslib.mobile.TelephonyIcons; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import com.android.systemui.tests.R; import org.junit.Before; @@ -86,28 +88,24 @@ public class CallbackHandlerTest extends SysuiTestCase { boolean out = true; String description = "Test"; String secondaryLabel = "Secondary label"; - mHandler.setWifiIndicators(enabled, status, qs, in, out, description, true, secondaryLabel); + WifiIndicators indicators = new WifiIndicators( + enabled, status, qs, in, out, description, true, secondaryLabel); + mHandler.setWifiIndicators(indicators); waitForCallbacks(); - ArgumentCaptor<Boolean> enableArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class); - ArgumentCaptor<Boolean> isTransient = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<String> secondary = ArgumentCaptor.forClass(String.class); - Mockito.verify(mSignalCallback).setWifiIndicators(enableArg.capture(), - statusArg.capture(), qsArg.capture(), inArg.capture(), outArg.capture(), - descArg.capture(), isTransient.capture(), secondary.capture()); - assertEquals(enabled, (boolean) enableArg.getValue()); - assertEquals(status, statusArg.getValue()); - assertEquals(qs, qsArg.getValue()); - assertEquals(in, (boolean) inArg.getValue()); - assertEquals(out, (boolean) outArg.getValue()); - assertEquals(description, descArg.getValue()); - assertTrue(isTransient.getValue()); - assertEquals(secondaryLabel, secondary.getValue()); + ArgumentCaptor<WifiIndicators> indicatorArg = + ArgumentCaptor.forClass(WifiIndicators.class); + Mockito.verify(mSignalCallback).setWifiIndicators(indicatorArg.capture()); + WifiIndicators expected = indicatorArg.getValue(); + + assertEquals(enabled, expected.enabled); + assertEquals(status, expected.statusIcon); + assertEquals(qs, expected.qsIcon); + assertEquals(in, expected.activityIn); + assertEquals(out, expected.activityOut); + assertEquals(description, expected.description); + assertTrue(expected.isTransient); + assertEquals(secondaryLabel, expected.statusLabel); } @Test @@ -124,37 +122,30 @@ public class CallbackHandlerTest extends SysuiTestCase { boolean wide = true; int subId = 5; boolean roaming = true; - mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription, + MobileDataIndicators indicators = new MobileDataIndicators( + status, qs, type, qsType, in, out, typeDescription, typeDescriptionHtml, description, wide, subId, roaming, true); + mHandler.setMobileDataIndicators(indicators); waitForCallbacks(); - ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); - ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class); - ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<CharSequence> typeContentArg = ArgumentCaptor.forClass(CharSequence.class); - ArgumentCaptor<CharSequence> typeContentHtmlArg = - ArgumentCaptor.forClass(CharSequence.class); - ArgumentCaptor<CharSequence> descArg = ArgumentCaptor.forClass(CharSequence.class); - ArgumentCaptor<Boolean> wideArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<Integer> subIdArg = ArgumentCaptor.forClass(Integer.class); - Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(), - qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(), - outArg.capture(), typeContentArg.capture(), typeContentHtmlArg.capture(), - descArg.capture(), wideArg.capture(), subIdArg.capture(), eq(roaming), eq(true)); - assertEquals(status, statusArg.getValue()); - assertEquals(qs, qsArg.getValue()); - assertEquals(type, (int) typeIconArg.getValue()); - assertEquals(qsType, (int) qsTypeIconArg.getValue()); - assertEquals(in, (boolean) inArg.getValue()); - assertEquals(out, (boolean) outArg.getValue()); - assertEquals(typeDescription, typeContentArg.getValue()); - assertEquals(typeDescriptionHtml, typeContentHtmlArg.getValue()); - assertEquals(description, descArg.getValue()); - assertEquals(wide, (boolean) wideArg.getValue()); - assertEquals(subId, (int) subIdArg.getValue()); + ArgumentCaptor<MobileDataIndicators> indicatorArg = + ArgumentCaptor.forClass(MobileDataIndicators.class); + Mockito.verify(mSignalCallback).setMobileDataIndicators(indicatorArg.capture()); + MobileDataIndicators expected = indicatorArg.getValue(); + + assertEquals(status, expected.statusIcon); + assertEquals(qs, expected.qsIcon); + assertEquals(type, expected.statusType); + assertEquals(qsType, expected.qsType); + assertEquals(in, expected.activityIn); + assertEquals(out, expected.activityOut); + assertEquals(typeDescription, expected.typeContentDescription); + assertEquals(typeDescriptionHtml, expected.typeContentDescriptionHtml); + assertEquals(description, expected.description); + assertEquals(wide, expected.isWide); + assertEquals(subId, expected.subId); + assertTrue(expected.roaming); + assertTrue(expected.showTriangle); } @SuppressWarnings("unchecked") diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 89cc2b574398..e52b92648670 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -21,9 +21,9 @@ import static android.telephony.NetworkRegistrationInfo.DOMAIN_PS; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isA; @@ -76,6 +76,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.MobileDataIndicators; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; import org.junit.After; @@ -173,8 +174,6 @@ public class NetworkControllerBaseTest extends SysuiTestCase { mMockSubDefaults = mock(SubscriptionDefaults.class); mNetCapabilities = new NetworkCapabilities(); when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(true); - when(mMockCm.getDefaultNetworkCapabilitiesForUser(0)).thenReturn( - new NetworkCapabilities[] { mNetCapabilities }); when(mMockTm.createForSubscriptionId(anyInt())).thenReturn(mMockTm); doAnswer(invocation -> { int rssi = invocation.getArgument(0); @@ -257,8 +256,11 @@ public class NetworkControllerBaseTest extends SysuiTestCase { ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); verify(mMockCm, atLeastOnce()) .registerDefaultNetworkCallback(callbackArg.capture(), isA(Handler.class)); - mDefaultCallbackInWifiTracker = callbackArg.getAllValues().get(0); - mDefaultCallbackInNetworkController = callbackArg.getAllValues().get(1); + int captureSize = callbackArg.getAllValues().size(); + assertTrue(captureSize > 1); + assertEquals(captureSize % 2, 0); + mDefaultCallbackInWifiTracker = callbackArg.getAllValues().get(captureSize - 2); + mDefaultCallbackInNetworkController = callbackArg.getAllValues().get(captureSize - 1); assertNotNull(mDefaultCallbackInWifiTracker); assertNotNull(mDefaultCallbackInNetworkController); verify(mMockCm, atLeastOnce()).registerNetworkCallback( @@ -307,14 +309,18 @@ public class NetworkControllerBaseTest extends SysuiTestCase { setLevel(DEFAULT_LEVEL); updateDataConnectionState(TelephonyManager.DATA_CONNECTED, TelephonyManager.NETWORK_TYPE_UMTS); + setConnectivityViaCallbackInNetworkController( + NetworkCapabilities.TRANSPORT_CELLULAR, true, true, null); setConnectivityViaBroadcast( - NetworkCapabilities.TRANSPORT_CELLULAR, true, true); + NetworkCapabilities.TRANSPORT_CELLULAR, true, true); } public void setConnectivityViaBroadcastForVcn( int networkType, boolean validated, boolean isConnected, VcnTransportInfo info) { mNetCapabilities.setTransportInfo(info); setConnectivityCommon(networkType, validated, isConnected); + mDefaultCallbackInNetworkController.onCapabilitiesChanged( + mock(Network.class), new NetworkCapabilities(mNetCapabilities)); Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION); mNetworkController.onReceive(mContext, i); } @@ -322,6 +328,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { public void setConnectivityViaBroadcast( int networkType, boolean validated, boolean isConnected) { setConnectivityCommon(networkType, validated, isConnected); + mDefaultCallbackInNetworkController.onCapabilitiesChanged( + mock(Network.class), new NetworkCapabilities(mNetCapabilities)); Intent i = new Intent(ConnectivityManager.INET_CONDITION_ACTION); mNetworkController.onReceive(mContext, i); } @@ -487,28 +495,21 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean dataIn, boolean dataOut) { - ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); - ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class); + ArgumentCaptor<MobileDataIndicators> indicatorsArg = + ArgumentCaptor.forClass(MobileDataIndicators.class); verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( - any(), - iconArg.capture(), - anyInt(), - typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), - any(CharSequence.class), any(CharSequence.class), any(CharSequence.class), - anyBoolean(), anyInt(), anyBoolean(), anyBoolean()); - IconState iconState = iconArg.getValue(); + indicatorsArg.capture()); + MobileDataIndicators expected = indicatorsArg.getValue(); int state = SignalDrawable.getState(icon, CellSignalStrength.getNumSignalStrengthLevels(), false); - assertEquals("Visibility in, quick settings", visible, iconState.visible); - assertEquals("Signal icon in, quick settings", state, iconState.icon); - assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue()); + assertEquals("Visibility in, quick settings", visible, expected.qsIcon.visible); + assertEquals("Signal icon in, quick settings", state, expected.qsIcon.icon); + assertEquals("Data icon in, quick settings", typeIcon, expected.qsType); assertEquals("Data direction in, in quick settings", dataIn, - (boolean) dataInArg.getValue()); + expected.activityIn); assertEquals("Data direction out, in quick settings", dataOut, - (boolean) dataOutArg.getValue()); + expected.activityOut); } protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon) { @@ -522,44 +523,35 @@ public class NetworkControllerBaseTest extends SysuiTestCase { protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean roaming, boolean inet) { - ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor<MobileDataIndicators> indicatorsArg = + ArgumentCaptor.forClass(MobileDataIndicators.class); // TODO: Verify all fields. verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( - iconArg.capture(), - any(), - typeIconArg.capture(), - anyInt(), anyBoolean(), anyBoolean(), - any(CharSequence.class), any(CharSequence.class), any(), - anyBoolean(), anyInt(), eq(roaming), anyBoolean()); - IconState iconState = iconArg.getValue(); + indicatorsArg.capture()); + MobileDataIndicators expected = indicatorsArg.getValue(); int state = icon == -1 ? 0 : SignalDrawable.getState(icon, CellSignalStrength.getNumSignalStrengthLevels(), !inet); - assertEquals("Signal icon in status bar", state, iconState.icon); - assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); - assertEquals("Visibility in status bar", visible, iconState.visible); + assertEquals("Signal icon in status bar", state, expected.statusIcon.icon); + assertEquals("Data icon in status bar", typeIcon, expected.statusType); + assertEquals("Visibility in status bar", visible, expected.statusIcon.visible); } protected void verifyLastMobileDataIndicatorsForVcn(boolean visible, int level, int typeIcon, boolean inet) { - ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); + ArgumentCaptor<MobileDataIndicators> indicatorsArg = + ArgumentCaptor.forClass(MobileDataIndicators.class); verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( - iconArg.capture(), - any(), - typeIconArg.capture(), - anyInt(), anyBoolean(), anyBoolean(), - any(CharSequence.class), any(CharSequence.class), any(), - anyBoolean(), anyInt(), anyBoolean(), anyBoolean()); - IconState iconState = iconArg.getValue(); + indicatorsArg.capture()); + + MobileDataIndicators expected = indicatorsArg.getValue(); int state = SignalDrawable.getState( level, CellSignalStrength.getNumSignalStrengthLevels(), !inet); - assertEquals("Signal icon in status bar", state, iconState.icon); - assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); - assertEquals("Visibility in status bar", visible, iconState.visible); + assertEquals("Signal icon in status bar", state, expected.statusIcon.icon); + assertEquals("Data icon in status bar", typeIcon, expected.statusType); + assertEquals("Visibility in status bar", visible, expected.statusIcon.visible); } protected void verifyLastMobileDataIndicators(boolean visible, int icon, int typeIcon, @@ -580,6 +572,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { boolean qsVisible, int qsIcon, int qsTypeIcon, boolean dataIn, boolean dataOut, boolean cutOut, CharSequence typeContentDescription, CharSequence typeContentDescriptionHtml) { + ArgumentCaptor<MobileDataIndicators> indicatorsArg = + ArgumentCaptor.forClass(MobileDataIndicators.class); ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class); ArgumentCaptor<IconState> qsIconArg = ArgumentCaptor.forClass(IconState.class); @@ -592,17 +586,9 @@ public class NetworkControllerBaseTest extends SysuiTestCase { ArgumentCaptor.forClass(CharSequence.class); verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators( - iconArg.capture(), - qsIconArg.capture(), - typeIconArg.capture(), - qsTypeIconArg.capture(), - dataInArg.capture(), - dataOutArg.capture(), - typeContentDescriptionArg.capture(), - typeContentDescriptionHtmlArg.capture(), - any(), anyBoolean(), anyInt(), anyBoolean(), anyBoolean()); + indicatorsArg.capture()); - IconState iconState = iconArg.getValue(); + MobileDataIndicators expected = indicatorsArg.getValue(); int numSignalStrengthBins = CellSignalStrength.getNumSignalStrengthLevels(); if (mMobileSignalController.mInflateSignalStrengths) { @@ -610,29 +596,28 @@ public class NetworkControllerBaseTest extends SysuiTestCase { icon++; } int state = SignalDrawable.getState(icon, numSignalStrengthBins, cutOut); - assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue()); - assertEquals("Signal icon in status bar", state, iconState.icon); - assertEquals("Visibility in status bar", visible, iconState.visible); + assertEquals("Data icon in status bar", typeIcon, expected.statusType); + assertEquals("Signal icon in status bar", state, expected.statusIcon.icon); + assertEquals("Visibility in status bar", visible, expected.statusIcon.visible); - iconState = qsIconArg.getValue(); if (visible) { - assertEquals("Visibility in quick settings", qsVisible, iconState.visible); - assertEquals("Signal icon in quick settings", state, iconState.icon); + assertEquals("Visibility in quick settings", qsVisible, expected.qsIcon.visible); + assertEquals("Signal icon in quick settings", state, expected.qsIcon.icon); } else { - assertEquals("Cellular is not default", null, iconState); + assertEquals("Cellular is not default", null, expected.qsIcon); } - assertEquals("Data icon in quick settings", qsTypeIcon, (int) qsTypeIconArg.getValue()); + assertEquals("Data icon in quick settings", qsTypeIcon, expected.qsType); assertEquals("Data direction in in quick settings", dataIn, - (boolean) dataInArg.getValue()); + expected.activityIn); assertEquals("Data direction out in quick settings", dataOut, - (boolean) dataOutArg.getValue()); + expected.activityOut); if (typeContentDescription != null) { // Only check if it was provided assertEquals("Type content description", typeContentDescription, - typeContentDescriptionArg.getValue()); + expected.typeContentDescription); } if (typeContentDescriptionHtml != null) { // Only check if it was provided assertEquals("Type content description (html)", typeContentDescriptionHtml, - typeContentDescriptionHtmlArg.getValue()); + expected.typeContentDescriptionHtml); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java index fc1a08ac3874..c6812a26c20b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java @@ -3,7 +3,6 @@ package com.android.systemui.statusbar.policy; import static junit.framework.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -21,7 +20,7 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import com.android.settingslib.mobile.TelephonyIcons; -import com.android.systemui.statusbar.policy.NetworkController.IconState; +import com.android.systemui.statusbar.policy.NetworkController.WifiIndicators; import org.junit.Before; import org.junit.Test; @@ -316,44 +315,42 @@ public class NetworkControllerWifiTest extends NetworkControllerBaseTest { } protected void verifyLastQsDataDirection(boolean in, boolean out) { - ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class); + ArgumentCaptor<WifiIndicators> indicatorsArg = + ArgumentCaptor.forClass(WifiIndicators.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( - anyBoolean(), any(), any(), inArg.capture(), outArg.capture(), any(), anyBoolean(), - any()); - assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue()); - assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue()); + indicatorsArg.capture()); + WifiIndicators expected = indicatorsArg.getValue(); + assertEquals("WiFi data in, in quick settings", in, expected.activityIn); + assertEquals("WiFi data out, in quick settings", out, expected.activityOut); } protected void verifyLastQsWifiIcon(boolean enabled, boolean connected, int icon, String description) { - ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); - ArgumentCaptor<Boolean> enabledArg = ArgumentCaptor.forClass(Boolean.class); - ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class); + ArgumentCaptor<WifiIndicators> indicatorsArg = + ArgumentCaptor.forClass(WifiIndicators.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( - enabledArg.capture(), any(), iconArg.capture(), anyBoolean(), - anyBoolean(), descArg.capture(), anyBoolean(), any()); - IconState iconState = iconArg.getValue(); - assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue()); - assertEquals("WiFI desc (ssid), in quick settings", description, descArg.getValue()); + indicatorsArg.capture()); + WifiIndicators expected = indicatorsArg.getValue(); + assertEquals("WiFi enabled, in quick settings", enabled, expected.enabled); + assertEquals("WiFI desc (ssid), in quick settings", description, expected.description); if (enabled && connected) { - assertEquals("WiFi connected, in quick settings", connected, iconState.visible); - assertEquals("WiFi signal, in quick settings", icon, iconState.icon); + assertEquals("WiFi connected, in quick settings", connected, expected.qsIcon.visible); + assertEquals("WiFi signal, in quick settings", icon, expected.qsIcon.icon); } else { - assertEquals("WiFi is not default", null, iconState); + assertEquals("WiFi is not default", null, expected.qsIcon); } } protected void verifyLastWifiIcon(boolean visible, int icon) { - ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class); + ArgumentCaptor<WifiIndicators> indicatorsArg = + ArgumentCaptor.forClass(WifiIndicators.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators( - anyBoolean(), iconArg.capture(), any(), anyBoolean(), anyBoolean(), - any(), anyBoolean(), any()); - IconState iconState = iconArg.getValue(); - assertEquals("WiFi visible, in status bar", visible, iconState.visible); - assertEquals("WiFi signal, in status bar", icon, iconState.icon); + indicatorsArg.capture()); + WifiIndicators expected = indicatorsArg.getValue(); + assertEquals("WiFi visible, in status bar", visible, expected.statusIcon.visible); + assertEquals("WiFi signal, in status bar", icon, expected.statusIcon.icon); } } diff --git a/services/api/Android.bp b/services/api/Android.bp deleted file mode 100644 index b8ca5488c5cd..000000000000 --- a/services/api/Android.bp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (C) 2021 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 { - default_visibility: ["//visibility:private"], -} - -filegroup { - name: "non-updatable-system-server-current.txt", - srcs: ["non-updatable-current.txt"], - visibility: ["//frameworks/base/api"], -} - -filegroup { - name: "non-updatable-system-server-removed.txt", - srcs: ["non-updatable-removed.txt"], - visibility: ["//frameworks/base/api"], -}
\ No newline at end of file diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index a09dbc7e599d..95af84293377 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -21,9 +21,7 @@ } ], "file_patterns": ["NotificationManagerService\\.java"] - } - ], - "presubmit-large": [ + }, { "name": "CtsScopedStorageCoreHostTest", "file_patterns": ["StorageManagerService\\.java"] diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 8363c9d203d5..f5b94177a2d9 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -6958,10 +6958,7 @@ public class AudioService extends IAudioService.Stub private void onSetVolumeIndexOnDevice(@NonNull DeviceVolumeUpdate update) { final VolumeStreamState streamState = mStreamStates[update.mStreamType]; if (update.hasVolumeIndex()) { - int index = update.getVolumeIndex(); - if (!checkSafeMediaVolume(update.mStreamType, index, update.mDevice)) { - index = safeMediaVolumeIndex(update.mDevice); - } + final int index = update.getVolumeIndex(); streamState.setIndex(index, update.mDevice, update.mCaller, // trusted as index is always validated before message is posted true /*hasModifyAudioSettings*/); diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 57e9fc9cb719..2920ddb2d76d 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -52,6 +52,7 @@ import android.location.GnssCapabilities; import android.location.GnssMeasurementCorrections; import android.location.GnssMeasurementRequest; import android.location.IGeocodeListener; +import android.location.IGnssAntennaInfoListener; import android.location.IGnssMeasurementsListener; import android.location.IGnssNavigationMessageListener; import android.location.IGnssNmeaListener; @@ -463,7 +464,7 @@ public class LocationManagerService extends ILocationManager.Stub { .build(); final LocationProviderManager manager = getOrAddLocationProviderManager(name); manager.setMockProvider(new MockLocationProvider(properties, - CallerIdentity.fromContext(mContext), /*locationTags*/ null)); + CallerIdentity.fromContext(mContext), Collections.emptySet())); } } @@ -930,6 +931,22 @@ public class LocationManagerService extends ILocationManager.Stub { } @Override + public void addGnssAntennaInfoListener(IGnssAntennaInfoListener listener, String packageName, + @Nullable String attributionTag, String listenerId) { + if (mGnssManagerService != null) { + mGnssManagerService.addGnssAntennaInfoListener(listener, packageName, attributionTag, + listenerId); + } + } + + @Override + public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) { + if (mGnssManagerService != null) { + mGnssManagerService.removeGnssAntennaInfoListener(listener); + } + } + + @Override public void addProviderRequestListener(IProviderRequestListener listener) { for (LocationProviderManager manager : mProviderManagers) { manager.addProviderRequestListener(listener); @@ -1153,7 +1170,7 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public void addTestProvider(String provider, ProviderProperties properties, - List<String> locationTags, String packageName, String attributionTag) { + List<String> extraAttributionTags, String packageName, String attributionTag) { // unsafe is ok because app ops will verify the package name CallerIdentity identity = CallerIdentity.fromBinderUnsafe(packageName, attributionTag); if (!mInjector.getAppOpsHelper().noteOp(AppOpsManager.OP_MOCK_LOCATION, identity)) { @@ -1162,7 +1179,7 @@ public class LocationManagerService extends ILocationManager.Stub { final LocationProviderManager manager = getOrAddLocationProviderManager(provider); manager.setMockProvider(new MockLocationProvider(properties, identity, - (locationTags != null) ? new ArraySet<>(locationTags) : null)); + new ArraySet<>(extraAttributionTags))); } @Override diff --git a/services/core/java/com/android/server/location/LocationShellCommand.java b/services/core/java/com/android/server/location/LocationShellCommand.java index 21a9b0442b74..5dc3ed8c47bd 100644 --- a/services/core/java/com/android/server/location/LocationShellCommand.java +++ b/services/core/java/com/android/server/location/LocationShellCommand.java @@ -26,6 +26,8 @@ import com.android.modules.utils.BasicShellCommandHandler; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Objects; /** @@ -50,15 +52,11 @@ class LocationShellCommand extends BasicShellCommandHandler { switch (cmd) { case "is-location-enabled": { - int userId = parseUserId(); - boolean enabled = mService.isLocationEnabledForUser(userId); - getOutPrintWriter().println(enabled); + handleIsLocationEnabled(); return 0; } case "set-location-enabled": { - int userId = parseUserId(); - boolean enabled = Boolean.parseBoolean(getNextArgRequired()); - mService.setLocationEnabledForUser(enabled, userId); + handleSetLocationEnabled(); return 0; } case "providers": { @@ -73,36 +71,23 @@ class LocationShellCommand extends BasicShellCommandHandler { private int parseProvidersCommand(String cmd) { switch (cmd) { case "add-test-provider": { - String provider = getNextArgRequired(); - ProviderProperties properties = parseTestProviderProviderProperties(); - mService.addTestProvider(provider, properties, /*locationTags*/ null, - mContext.getOpPackageName(), mContext.getFeatureId()); + handleAddTestProvider(); return 0; } case "remove-test-provider": { - String provider = getNextArgRequired(); - mService.removeTestProvider(provider, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleRemoveTestProvider(); return 0; } case "set-test-provider-enabled": { - String provider = getNextArgRequired(); - boolean enabled = Boolean.parseBoolean(getNextArgRequired()); - mService.setTestProviderEnabled(provider, enabled, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleSetTestProviderEnabled(); return 0; } case "set-test-provider-location": { - String provider = getNextArgRequired(); - Location location = parseTestProviderLocation(provider); - mService.setTestProviderLocation(provider, location, mContext.getOpPackageName(), - mContext.getFeatureId()); + handleSetTestProviderLocation(); return 0; } case "send-extra-command": { - String provider = getNextArgRequired(); - String command = getNextArgRequired(); - mService.sendExtraCommand(provider, command, null); + handleSendExtraCommand(); return 0; } default: @@ -110,21 +95,47 @@ class LocationShellCommand extends BasicShellCommandHandler { } } - private int parseUserId() { - final String option = getNextOption(); - if (option != null) { - if (option.equals("--user")) { - return UserHandle.parseUserArg(getNextArgRequired()); + private void handleIsLocationEnabled() { + int userId = UserHandle.USER_CURRENT_OR_SELF; + + do { + String option = getNextOption(); + if (option == null) { + break; + } + if ("--user".equals(option)) { + userId = UserHandle.parseUserArg(getNextArgRequired()); } else { - throw new IllegalArgumentException( - "Expected \"--user\" option, but got \"" + option + "\" instead"); + throw new IllegalArgumentException("Unknown option: " + option); } - } + } while (true); - return UserHandle.USER_CURRENT_OR_SELF; + getOutPrintWriter().println(mService.isLocationEnabledForUser(userId)); } - private ProviderProperties parseTestProviderProviderProperties() { + private void handleSetLocationEnabled() { + boolean enabled = Boolean.parseBoolean(getNextArgRequired()); + + int userId = UserHandle.USER_CURRENT_OR_SELF; + + do { + String option = getNextOption(); + if (option == null) { + break; + } + if ("--user".equals(option)) { + userId = UserHandle.parseUserArg(getNextArgRequired()); + } else { + throw new IllegalArgumentException("Unknown option: " + option); + } + } while (true); + + mService.setLocationEnabledForUser(enabled, userId); + } + + private void handleAddTestProvider() { + String provider = getNextArgRequired(); + boolean requiresNetwork = false; boolean requiresSatellite = false; boolean requiresCell = false; @@ -135,8 +146,13 @@ class LocationShellCommand extends BasicShellCommandHandler { int powerRequirement = Criteria.POWER_LOW; int accuracy = Criteria.ACCURACY_FINE; - String option = getNextOption(); - while (option != null) { + List<String> extraAttributionTags = Collections.emptyList(); + + do { + String option = getNextOption(); + if (option == null) { + break; + } switch (option) { case "--requiresNetwork": { requiresNetwork = true; @@ -174,12 +190,15 @@ class LocationShellCommand extends BasicShellCommandHandler { accuracy = Integer.parseInt(getNextArgRequired()); break; } + case "--extraAttributionTags": { + extraAttributionTags = Arrays.asList(getNextArgRequired().split(",")); + break; + } default: throw new IllegalArgumentException( "Received unexpected option: " + option); } - option = getNextOption(); - } + } while(true); ProviderProperties properties = new ProviderProperties.Builder() .setHasNetworkRequirement(requiresNetwork) @@ -192,30 +211,50 @@ class LocationShellCommand extends BasicShellCommandHandler { .setPowerUsage(powerRequirement) .setAccuracy(accuracy) .build(); + mService.addTestProvider(provider, properties, extraAttributionTags, + mContext.getOpPackageName(), mContext.getAttributionTag()); + } - return properties; + private void handleRemoveTestProvider() { + String provider = getNextArgRequired(); + mService.removeTestProvider(provider, mContext.getOpPackageName(), + mContext.getAttributionTag()); } - private Location parseTestProviderLocation(String provider) { - boolean hasLatitude = false; - boolean hasLongitude = false; + private void handleSetTestProviderEnabled() { + String provider = getNextArgRequired(); + boolean enabled = Boolean.parseBoolean(getNextArgRequired()); + mService.setTestProviderEnabled(provider, enabled, mContext.getOpPackageName(), + mContext.getAttributionTag()); + } + + private void handleSetTestProviderLocation() { + String provider = getNextArgRequired(); + + boolean hasLatLng = false; Location location = new Location(provider); location.setAccuracy(DEFAULT_TEST_LOCATION_ACCURACY); location.setTime(System.currentTimeMillis()); + location.setElapsedRealtimeNanos(System.nanoTime()); - String option = getNextOption(); - while (option != null) { + do { + String option = getNextOption(); + if (option == null) { + break; + } switch (option) { case "--location": { String[] locationInput = getNextArgRequired().split(","); if (locationInput.length != 2) { - throw new IllegalArgumentException( - "Unexpected location format: " + Arrays.toString(locationInput)); + throw new IllegalArgumentException("Location argument must be in the form " + + "of \"<LATITUDE>,<LONGITUDE>\", not " + + Arrays.toString(locationInput)); } location.setLatitude(Double.parseDouble(locationInput[0])); location.setLongitude(Double.parseDouble(locationInput[1])); + hasLatLng = true; break; } case "--accuracy": { @@ -227,15 +266,22 @@ class LocationShellCommand extends BasicShellCommandHandler { break; } default: - throw new IllegalArgumentException( - "Received unexpected option: " + option); + throw new IllegalArgumentException("Unknown option: " + option); } - option = getNextOption(); + } while (true); + + if (!hasLatLng) { + throw new IllegalArgumentException("Option \"--location\" is required"); } - location.setElapsedRealtimeNanos(System.nanoTime()); + mService.setTestProviderLocation(provider, location, mContext.getOpPackageName(), + mContext.getAttributionTag()); + } - return location; + private void handleSendExtraCommand() { + String provider = getNextArgRequired(); + String command = getNextArgRequired(); + mService.sendExtraCommand(provider, command, null); } @Override @@ -245,24 +291,29 @@ class LocationShellCommand extends BasicShellCommandHandler { pw.println(" help or -h"); pw.println(" Print this help text."); pw.println(" is-location-enabled [--user <USER_ID>]"); - pw.println(" Gets the master location switch enabled state."); - pw.println(" set-location-enabled [--user <USER_ID>] true|false"); - pw.println(" Sets the master location switch enabled state."); + pw.println(" Gets the master location switch enabled state. If no user is specified,"); + pw.println(" the current user is assumed."); + pw.println(" set-location-enabled true|false [--user <USER_ID>]"); + pw.println(" Sets the master location switch enabled state. If no user is specified,"); + pw.println(" the current user is assumed."); pw.println(" providers"); + pw.println(" The providers command is followed by a subcommand, as listed below:"); + pw.println(); pw.println(" add-test-provider <PROVIDER> [--requiresNetwork] [--requiresSatellite]"); pw.println(" [--requiresCell] [--hasMonetaryCost] [--supportsAltitude]"); pw.println(" [--supportsSpeed] [--supportsBearing]"); pw.println(" [--powerRequirement <POWER_REQUIREMENT>]"); + pw.println(" [--extraAttributionTags <TAG>,<TAG>,...]"); pw.println(" Add the given test provider. Requires MOCK_LOCATION permissions which"); pw.println(" can be enabled by running \"adb shell appops set <uid>"); pw.println(" android:mock_location allow\". There are optional flags that can be"); - pw.println(" used to configure the provider properties. If no flags are included,"); - pw.println(" then default values will be used."); + pw.println(" used to configure the provider properties and additional arguments. If"); + pw.println(" no flags are included, then default values will be used."); pw.println(" remove-test-provider <PROVIDER>"); pw.println(" Remove the given test provider."); pw.println(" set-test-provider-enabled <PROVIDER> true|false"); pw.println(" Sets the given test provider enabled state."); - pw.println(" set-test-provider-location <PROVIDER> [--location <LATITUDE>,<LONGITUDE>]"); + pw.println(" set-test-provider-location <PROVIDER> --location <LATITUDE>,<LONGITUDE>"); pw.println(" [--accuracy <ACCURACY>] [--time <TIME>]"); pw.println(" Set location for given test provider. Accuracy and time are optional."); pw.println(" send-extra-command <PROVIDER> <COMMAND>"); diff --git a/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java b/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java new file mode 100644 index 000000000000..1967e026e46c --- /dev/null +++ b/services/core/java/com/android/server/location/gnss/GnssAntennaInfoProvider.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.location.gnss; + +import static com.android.server.location.gnss.GnssManagerService.TAG; + +import android.annotation.Nullable; +import android.location.GnssAntennaInfo; +import android.location.IGnssAntennaInfoListener; +import android.location.util.identity.CallerIdentity; +import android.os.Binder; +import android.os.IBinder; + +import com.android.server.location.gnss.hal.GnssNative; +import com.android.server.location.listeners.BinderListenerRegistration; +import com.android.server.location.listeners.ListenerMultiplexer; +import com.android.server.location.listeners.ListenerRegistration; + +import java.util.Collection; +import java.util.List; + +/** + * Antenna info HAL module and listener multiplexer. + */ +public class GnssAntennaInfoProvider extends + ListenerMultiplexer<IBinder, IGnssAntennaInfoListener, + ListenerRegistration<IGnssAntennaInfoListener>, Void> implements + GnssNative.BaseCallbacks, GnssNative.AntennaInfoCallbacks { + + /** + * Registration object for GNSS listeners. + */ + protected class AntennaInfoListenerRegistration extends + BinderListenerRegistration<Void, IGnssAntennaInfoListener> { + + protected AntennaInfoListenerRegistration(CallerIdentity callerIdentity, + IGnssAntennaInfoListener listener) { + super(null, callerIdentity, listener); + } + + @Override + protected GnssAntennaInfoProvider getOwner() { + return GnssAntennaInfoProvider.this; + } + } + + private final GnssNative mGnssNative; + + private volatile @Nullable List<GnssAntennaInfo> mAntennaInfos; + + GnssAntennaInfoProvider(GnssNative gnssNative) { + mGnssNative = gnssNative; + mGnssNative.addBaseCallbacks(this); + mGnssNative.addAntennaInfoCallbacks(this); + } + + @Nullable List<GnssAntennaInfo> getAntennaInfos() { + return mAntennaInfos; + } + + @Override + public String getTag() { + return TAG; + } + + public boolean isSupported() { + return mGnssNative.isAntennaInfoSupported(); + } + + public void addListener(CallerIdentity callerIdentity, IGnssAntennaInfoListener listener) { + long identity = Binder.clearCallingIdentity(); + try { + putRegistration(listener.asBinder(), + new AntennaInfoListenerRegistration(callerIdentity, listener)); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + public void removeListener(IGnssAntennaInfoListener listener) { + long identity = Binder.clearCallingIdentity(); + try { + removeRegistration(listener.asBinder()); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override + protected boolean registerWithService(Void merged, + Collection<ListenerRegistration<IGnssAntennaInfoListener>> listenerRegistrations) { + return true; + } + + @Override + protected void unregisterWithService() {} + + @Override + protected boolean isActive(ListenerRegistration<IGnssAntennaInfoListener> registration) { + return true; + } + + @Override + protected Void mergeRegistrations( + Collection<ListenerRegistration<IGnssAntennaInfoListener>> listenerRegistrations) { + return null; + } + + @Override + public void onHalStarted() { + mGnssNative.startAntennaInfoListening(); + } + + @Override + public void onHalRestarted() { + mGnssNative.startAntennaInfoListening(); + } + + @Override + public void onReportAntennaInfo(List<GnssAntennaInfo> antennaInfos) { + if (antennaInfos.equals(mAntennaInfos)) { + return; + } + + mAntennaInfos = antennaInfos; + deliverToListeners(listener -> { + listener.onGnssAntennaInfoChanged(antennaInfos); + }); + } +} diff --git a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java index 87e6ef4110ee..5e6ae68c02f2 100644 --- a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java +++ b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java @@ -229,7 +229,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter * registrations will be treated as inactive and the backing service will never be registered. * */ - protected boolean isServiceSupported() { + public boolean isSupported() { return true; } @@ -276,7 +276,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter @Override protected boolean isActive(GnssListenerRegistration registration) { - if (!isServiceSupported()) { + if (!isSupported()) { return false; } @@ -339,7 +339,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter @Override protected void onRegister() { - if (!isServiceSupported()) { + if (!isSupported()) { return; } @@ -356,7 +356,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter @Override protected void onUnregister() { - if (!isServiceSupported()) { + if (!isSupported()) { return; } @@ -404,7 +404,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter @Override protected String getServiceState() { - if (!isServiceSupported()) { + if (!isSupported()) { return "unsupported"; } else { return super.getServiceState(); diff --git a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java index 29da177ee4a1..1df29ab5791f 100644 --- a/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssLocationProvider.java @@ -103,6 +103,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -372,7 +373,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements public GnssLocationProvider(Context context, Injector injector, GnssNative gnssNative, GnssMetrics gnssMetrics) { super(FgThread.getExecutor(), CallerIdentity.fromContext(context), PROPERTIES, - /*locationTags*/ null); + Collections.emptySet()); mContext = context; mGnssNative = gnssNative; diff --git a/services/core/java/com/android/server/location/gnss/GnssManagerService.java b/services/core/java/com/android/server/location/gnss/GnssManagerService.java index 8312c6361835..bcdfed45bd9c 100644 --- a/services/core/java/com/android/server/location/gnss/GnssManagerService.java +++ b/services/core/java/com/android/server/location/gnss/GnssManagerService.java @@ -27,6 +27,7 @@ import android.location.GnssAntennaInfo; import android.location.GnssCapabilities; import android.location.GnssMeasurementCorrections; import android.location.GnssMeasurementRequest; +import android.location.IGnssAntennaInfoListener; import android.location.IGnssMeasurementsListener; import android.location.IGnssNavigationMessageListener; import android.location.IGnssNmeaListener; @@ -49,7 +50,6 @@ import com.android.server.location.gnss.hal.GnssNative; import com.android.server.location.injector.Injector; import java.io.FileDescriptor; -import java.util.ArrayList; import java.util.List; /** Manages Gnss providers and related Gnss functions for LocationManagerService. */ @@ -68,11 +68,11 @@ public class GnssManagerService { private final GnssNmeaProvider mGnssNmeaProvider; private final GnssMeasurementsProvider mGnssMeasurementsProvider; private final GnssNavigationMessageProvider mGnssNavigationMessageProvider; + private final GnssAntennaInfoProvider mGnssAntennaInfoProvider; private final IGpsGeofenceHardware mGnssGeofenceProxy; private final GnssGeofenceHalModule mGeofenceHalModule; private final GnssCapabilitiesHalModule mCapabilitiesHalModule; - private final GnssAntennaInfoHalModule mAntennaInfoHalModule; private final GnssMetrics mGnssMetrics; @@ -89,11 +89,11 @@ public class GnssManagerService { mGnssNmeaProvider = new GnssNmeaProvider(injector, mGnssNative); mGnssMeasurementsProvider = new GnssMeasurementsProvider(injector, mGnssNative); mGnssNavigationMessageProvider = new GnssNavigationMessageProvider(injector, mGnssNative); + mGnssAntennaInfoProvider = new GnssAntennaInfoProvider(mGnssNative); mGnssGeofenceProxy = new GnssGeofenceProxy(mGnssNative); mGeofenceHalModule = new GnssGeofenceHalModule(mGnssNative); mCapabilitiesHalModule = new GnssCapabilitiesHalModule(mGnssNative); - mAntennaInfoHalModule = new GnssAntennaInfoHalModule(mGnssNative); // allow gnss access to begin - we must assume that callbacks can start immediately mGnssNative.register(); @@ -140,7 +140,7 @@ public class GnssManagerService { * Get GNSS antenna information. */ public @Nullable List<GnssAntennaInfo> getGnssAntennaInfos() { - return mAntennaInfoHalModule.getAntennaInfos(); + return mGnssAntennaInfoProvider.getAntennaInfos(); } /** @@ -242,6 +242,24 @@ public class GnssManagerService { } /** + * Adds a GNSS antenna info listener. + */ + public void addGnssAntennaInfoListener(IGnssAntennaInfoListener listener, String packageName, + @Nullable String attributionTag, String listenerId) { + + CallerIdentity identity = CallerIdentity.fromBinder(mContext, packageName, attributionTag, + listenerId); + mGnssAntennaInfoProvider.addListener(identity, listener); + } + + /** + * Removes a GNSS antenna info listener. + */ + public void removeGnssAntennaInfoListener(IGnssAntennaInfoListener listener) { + mGnssAntennaInfoProvider.removeListener(listener); + } + + /** * Send Ni Response, indicating a location request initiated by a network carrier. */ public void sendNiResponse(int notifId, int userResponse) { @@ -263,25 +281,34 @@ public class GnssManagerService { ipw.println("Capabilities: " + mGnssNative.getCapabilities()); - List<GnssAntennaInfo> infos = mAntennaInfoHalModule.getAntennaInfos(); - if (infos != null) { - ipw.println("Antenna Infos: " + infos); + if (mGnssStatusProvider.isSupported()) { + ipw.println("Status Provider:"); + ipw.increaseIndent(); + mGnssStatusProvider.dump(fd, ipw, args); + ipw.decreaseIndent(); } - ipw.println("Measurements Provider:"); - ipw.increaseIndent(); - mGnssMeasurementsProvider.dump(fd, ipw, args); - ipw.decreaseIndent(); + if (mGnssMeasurementsProvider.isSupported()) { + ipw.println("Measurements Provider:"); + ipw.increaseIndent(); + mGnssMeasurementsProvider.dump(fd, ipw, args); + ipw.decreaseIndent(); + } - ipw.println("Navigation Message Provider:"); - ipw.increaseIndent(); - mGnssNavigationMessageProvider.dump(fd, ipw, args); - ipw.decreaseIndent(); + if (mGnssNavigationMessageProvider.isSupported()) { + ipw.println("Navigation Message Provider:"); + ipw.increaseIndent(); + mGnssNavigationMessageProvider.dump(fd, ipw, args); + ipw.decreaseIndent(); + } - ipw.println("Status Provider:"); - ipw.increaseIndent(); - mGnssStatusProvider.dump(fd, ipw, args); - ipw.decreaseIndent(); + if (mGnssAntennaInfoProvider.isSupported()) { + ipw.println("Navigation Message Provider:"); + ipw.increaseIndent(); + ipw.println("Antenna Infos: " + mGnssAntennaInfoProvider.getAntennaInfos()); + mGnssAntennaInfoProvider.dump(fd, ipw, args); + ipw.decreaseIndent(); + } GnssPowerStats powerStats = mGnssNative.getPowerStats(); if (powerStats != null) { @@ -399,53 +426,4 @@ public class GnssManagerService { } } } - - private class GnssAntennaInfoHalModule implements GnssNative.BaseCallbacks, - GnssNative.AntennaInfoCallbacks { - - private final GnssNative mGnssNative; - - private volatile @Nullable List<GnssAntennaInfo> mAntennaInfos; - - GnssAntennaInfoHalModule(GnssNative gnssNative) { - mGnssNative = gnssNative; - mGnssNative.addBaseCallbacks(this); - mGnssNative.addAntennaInfoCallbacks(this); - } - - @Nullable List<GnssAntennaInfo> getAntennaInfos() { - return mAntennaInfos; - } - - @Override - public void onHalStarted() { - mGnssNative.startAntennaInfoListening(); - } - - @Override - public void onHalRestarted() { - mGnssNative.startAntennaInfoListening(); - } - - @Override - public void onReportAntennaInfo(List<GnssAntennaInfo> antennaInfos) { - if (antennaInfos.equals(mAntennaInfos)) { - return; - } - - mAntennaInfos = antennaInfos; - - long ident = Binder.clearCallingIdentity(); - try { - Intent intent = new Intent(LocationManager.ACTION_GNSS_ANTENNA_INFOS_CHANGED) - .putParcelableArrayListExtra(LocationManager.EXTRA_GNSS_ANTENNA_INFOS, - new ArrayList<>(antennaInfos)) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) - .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - } } diff --git a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java index 305bc9b69e39..b3119d7aa53e 100644 --- a/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssMeasurementsProvider.java @@ -99,7 +99,7 @@ public final class GnssMeasurementsProvider extends } @Override - protected boolean isServiceSupported() { + public boolean isSupported() { return mGnssNative.isMeasurementSupported(); } diff --git a/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java b/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java index ff9ad65b4ca5..e9fce0514a18 100644 --- a/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java +++ b/services/core/java/com/android/server/location/gnss/GnssNavigationMessageProvider.java @@ -70,7 +70,7 @@ public class GnssNavigationMessageProvider extends } @Override - protected boolean isServiceSupported() { + public boolean isSupported() { return mGnssNative.isNavigationMessageCollectionSupported(); } diff --git a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java index 7e2f089d32c9..f275663a1309 100644 --- a/services/core/java/com/android/server/location/gnss/hal/GnssNative.java +++ b/services/core/java/com/android/server/location/gnss/hal/GnssNative.java @@ -699,11 +699,11 @@ public class GnssNative { } /** - * Returns true if antenna info listening is supported. + * Returns true if antenna info is supported. */ - public boolean isAntennaInfoListeningSupported() { + public boolean isAntennaInfoSupported() { Preconditions.checkState(mRegistered); - return mGnssHal.isAntennaInfoListeningSupported(); + return mGnssHal.isAntennaInfoSupported(); } /** @@ -1259,7 +1259,7 @@ public class GnssNative { return native_stop_navigation_message_collection(); } - protected boolean isAntennaInfoListeningSupported() { + protected boolean isAntennaInfoSupported() { return native_is_antenna_info_supported(); } diff --git a/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java b/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java index 9ff6e6bc8e32..ba7f44f2818b 100644 --- a/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/AbstractLocationProvider.java @@ -28,6 +28,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; @@ -66,9 +67,10 @@ public abstract class AbstractLocationProvider { /** * Default state value for a location provider that is disabled with no properties and an - * empty provider package list. + * empty extra attribution tag set. */ - public static final State EMPTY_STATE = new State(false, null, null, null); + public static final State EMPTY_STATE = new State(false, null, null, + Collections.emptySet()); /** * The provider's allowed state. @@ -85,14 +87,18 @@ public abstract class AbstractLocationProvider { */ @Nullable public final CallerIdentity identity; - @Nullable public final Set<String> locationTags; + /** + * A set of attribution tags also associated with this provider - these attribution tags may + * be afforded special privileges. + */ + public final Set<String> extraAttributionTags; private State(boolean allowed, ProviderProperties properties, CallerIdentity identity, - Set<String> locationTags) { + Set<String> extraAttributionTags) { this.allowed = allowed; this.properties = properties; this.identity = identity; - this.locationTags = locationTags; + this.extraAttributionTags = Objects.requireNonNull(extraAttributionTags); } /** @@ -102,7 +108,7 @@ public abstract class AbstractLocationProvider { if (allowed == this.allowed) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -113,7 +119,7 @@ public abstract class AbstractLocationProvider { if (Objects.equals(properties, this.properties)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -124,18 +130,18 @@ public abstract class AbstractLocationProvider { if (Objects.equals(identity, this.identity)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } /** - * Returns a state the same as the current but with location tags set as specified. + * Returns a state the same as the current but with extra attribution tags set as specified. */ - public State withLocationTags(@Nullable Set<String> locationTags) { - if (Objects.equals(locationTags, this.locationTags)) { + public State withExtraAttributionTags(Set<String> extraAttributionTags) { + if (extraAttributionTags.equals(this.extraAttributionTags)) { return this; } else { - return new State(allowed, properties, identity, locationTags); + return new State(allowed, properties, identity, extraAttributionTags); } } @@ -151,12 +157,12 @@ public abstract class AbstractLocationProvider { State state = (State) o; return allowed == state.allowed && properties == state.properties && Objects.equals(identity, state.identity) - && Objects.equals(locationTags, state.locationTags); + && extraAttributionTags.equals(state.extraAttributionTags); } @Override public int hashCode() { - return Objects.hash(allowed, properties, identity, locationTags); + return Objects.hash(allowed, properties, identity, extraAttributionTags); } } @@ -213,14 +219,14 @@ public abstract class AbstractLocationProvider { * An optional identity and properties may be provided to initialize the location provider. */ protected AbstractLocationProvider(Executor executor, @Nullable CallerIdentity identity, - @Nullable ProviderProperties properties, @Nullable Set<String> locationTags) { + @Nullable ProviderProperties properties, Set<String> extraAttributionTags) { Preconditions.checkArgument(identity == null || identity.getListenerId() == null); - mExecutor = executor; + mExecutor = Objects.requireNonNull(executor); mInternalState = new AtomicReference<>(new InternalState(null, State.EMPTY_STATE .withIdentity(identity) - .withProperties(properties).withLocationTags(locationTags)) - ); + .withProperties(properties) + .withExtraAttributionTags(extraAttributionTags))); mController = new Controller(); } @@ -292,7 +298,7 @@ public abstract class AbstractLocationProvider { } /** - * Call this method to report a change in provider packages. + * Call this method to report a change in the provider's identity. */ protected void setIdentity(@Nullable CallerIdentity identity) { Preconditions.checkArgument(identity == null || identity.getListenerId() == null); @@ -300,10 +306,10 @@ public abstract class AbstractLocationProvider { } /** - * Call this method to report a change in provider location tags. + * Call this method to report a change in the provider's extra attribution tags. */ - protected void setLocationTags(@Nullable Set<String> locationTags) { - setState(state -> state.withLocationTags(locationTags)); + protected void setExtraAttributionTags(Set<String> extraAttributionTags) { + setState(state -> state.withExtraAttributionTags(extraAttributionTags)); } /** diff --git a/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java b/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java index 49f6e64a1e0c..423f833bf7e0 100644 --- a/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/DelegateLocationProvider.java @@ -24,6 +24,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; import java.util.concurrent.Executor; /** @@ -40,7 +41,7 @@ class DelegateLocationProvider extends AbstractLocationProvider private boolean mInitialized = false; DelegateLocationProvider(Executor executor, AbstractLocationProvider delegate) { - super(executor, null, null, null); + super(executor, null, null, Collections.emptySet()); mDelegate = delegate; } diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index c600663173a8..fef30f9ea811 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -29,8 +29,6 @@ import static android.os.PowerManager.LOCATION_MODE_ALL_DISABLED_WHEN_SCREEN_OFF import static android.os.PowerManager.LOCATION_MODE_FOREGROUND_ONLY; import static android.os.PowerManager.LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF; import static android.os.PowerManager.LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF; -import static android.os.PowerWhitelistManager.REASON_LOCATION_PROVIDER; -import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED; import static com.android.server.location.LocationManagerService.D; import static com.android.server.location.LocationManagerService.TAG; @@ -229,10 +227,7 @@ public class LocationProviderManager extends BroadcastOptions options = BroadcastOptions.makeBasic(); options.setDontSendToRestrictedApps(true); // allows apps to start a fg service in response to a location PI - options.setTemporaryAppAllowlist(TEMPORARY_APP_ALLOWLIST_DURATION_MS, - TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, - REASON_LOCATION_PROVIDER, - ""); + options.setTemporaryAppWhitelistDuration(TEMPORARY_APP_ALLOWLIST_DURATION_MS); Intent intent = new Intent().putExtra(KEY_LOCATION_CHANGED, locationResult.getLastLocation()); @@ -2270,8 +2265,8 @@ public class LocationProviderManager extends onEnabledChanged(UserHandle.USER_ALL); } - if (!Objects.equals(oldState.locationTags, newState.locationTags)) { - if (mOnLocationTagsChangeListener != null) { + if (mOnLocationTagsChangeListener != null) { + if (!oldState.extraAttributionTags.equals(newState.extraAttributionTags)) { if (oldState.identity != null) { FgThread.getHandler().sendMessage(PooledLambda.obtainMessage( OnProviderLocationTagsChangeListener::onLocationTagsChanged, @@ -2285,7 +2280,7 @@ public class LocationProviderManager extends OnProviderLocationTagsChangeListener::onLocationTagsChanged, mOnLocationTagsChangeListener, new LocationTagInfo( newState.identity.getUid(), newState.identity.getPackageName(), - newState.locationTags) + newState.extraAttributionTags) )); } } diff --git a/services/core/java/com/android/server/location/provider/MockLocationProvider.java b/services/core/java/com/android/server/location/provider/MockLocationProvider.java index 7660f56f1580..52b04d4bab14 100644 --- a/services/core/java/com/android/server/location/provider/MockLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/MockLocationProvider.java @@ -40,9 +40,9 @@ public class MockLocationProvider extends AbstractLocationProvider { @Nullable private Location mLocation; public MockLocationProvider(ProviderProperties properties, CallerIdentity identity, - @Nullable Set<String> locationTags) { + Set<String> extraAttributionTags) { // using a direct executor is ok because this class has no locks that could deadlock - super(DIRECT_EXECUTOR, identity, properties, locationTags); + super(DIRECT_EXECUTOR, identity, properties, extraAttributionTags); } /** Sets the allowed state of this mock provider. */ diff --git a/services/core/java/com/android/server/location/provider/MockableLocationProvider.java b/services/core/java/com/android/server/location/provider/MockableLocationProvider.java index 4ffa9a509a23..81936440f6a7 100644 --- a/services/core/java/com/android/server/location/provider/MockableLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/MockableLocationProvider.java @@ -31,6 +31,7 @@ import com.android.internal.util.Preconditions; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; /** * Represents a location provider that may switch between a mock implementation and a real @@ -75,7 +76,7 @@ public class MockableLocationProvider extends AbstractLocationProvider { public MockableLocationProvider(Object ownerLock) { // using a direct executor is acceptable because all inbound calls are delegated to the // actual provider implementations which will use their own executors - super(DIRECT_EXECUTOR, null, null, null); + super(DIRECT_EXECUTOR, null, null, Collections.emptySet()); mOwnerLock = ownerLock; mRequest = ProviderRequest.EMPTY_REQUEST; } diff --git a/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java b/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java index ee9d35d21798..68ede88c6a4a 100644 --- a/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/PassiveLocationProvider.java @@ -30,6 +30,7 @@ import android.os.Bundle; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; /** * A passive location provider reports locations received from other providers @@ -48,7 +49,7 @@ public class PassiveLocationProvider extends AbstractLocationProvider { public PassiveLocationProvider(Context context) { // using a direct executor is ok because this class has no locks that could deadlock super(DIRECT_EXECUTOR, CallerIdentity.fromContext(context), PROPERTIES, - /*locationTags*/ null); + Collections.emptySet()); setAllowed(true); } diff --git a/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java b/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java index f00478a3488a..44b62b3659dc 100644 --- a/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java +++ b/services/core/java/com/android/server/location/provider/proxy/ProxyLocationProvider.java @@ -18,7 +18,6 @@ package com.android.server.location.provider.proxy; import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; @@ -44,6 +43,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -52,8 +52,8 @@ import java.util.Objects; */ public class ProxyLocationProvider extends AbstractLocationProvider { - private static final String KEY_LOCATION_TAGS = "android:location_allow_listed_tags"; - private static final String LOCATION_TAGS_SEPARATOR = ";"; + private static final String KEY_EXTRA_ATTRIBUTION_TAGS = "android:location_allow_listed_tags"; + private static final String EXTRA_ATTRIBUTION_TAGS_SEPARATOR = ";"; /** * Creates and registers this proxy. If no suitable service is available for the proxy, returns @@ -90,7 +90,7 @@ public class ProxyLocationProvider extends AbstractLocationProvider { int nonOverlayPackageResId) { // safe to use direct executor since our locks are not acquired in a code path invoked by // our owning provider - super(DIRECT_EXECUTOR, null, null, null); + super(DIRECT_EXECUTOR, null, null, Collections.emptySet()); mContext = context; mServiceWatcher = new ServiceWatcher(context, action, this::onBind, @@ -100,16 +100,6 @@ public class ProxyLocationProvider extends AbstractLocationProvider { mRequest = ProviderRequest.EMPTY_REQUEST; } - private void updateLocationTagInfo(@NonNull BoundService boundService) { - if (boundService.metadata != null) { - final String tagsList = boundService.metadata.getString(KEY_LOCATION_TAGS); - if (tagsList != null) { - final String[] tags = tagsList.split(LOCATION_TAGS_SEPARATOR); - setLocationTags(new ArraySet<>(tags)); - } - } - } - private boolean checkServiceResolves() { return mServiceWatcher.checkServiceResolves(); } @@ -120,14 +110,22 @@ public class ProxyLocationProvider extends AbstractLocationProvider { synchronized (mLock) { mProxy = new Proxy(); mService = boundService.component; + + // update extra attribution tag info from manifest + if (boundService.metadata != null) { + String tagsList = boundService.metadata.getString(KEY_EXTRA_ATTRIBUTION_TAGS); + if (tagsList != null) { + setExtraAttributionTags( + new ArraySet<>(tagsList.split(EXTRA_ATTRIBUTION_TAGS_SEPARATOR))); + } + } + provider.setLocationProviderManager(mProxy); ProviderRequest request = mRequest; if (!request.equals(ProviderRequest.EMPTY_REQUEST)) { provider.setRequest(request); } - - updateLocationTagInfo(boundService); } } diff --git a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java index cb0a668871e0..87e170ad12df 100644 --- a/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java +++ b/services/core/java/com/android/server/media/MediaButtonReceiverHolder.java @@ -29,7 +29,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Handler; -import android.os.PowerWhitelistManager; import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -196,9 +195,8 @@ final class MediaButtonReceiverHolder { mediaButtonIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, callingPackageName); final BroadcastOptions options = BroadcastOptions.makeBasic(); - options.setTemporaryAppAllowlist(FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS, - PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, - PowerWhitelistManager.REASON_MEDIA_BUTTON, ""); + options.setTemporaryAppWhitelistDuration( + FGS_STARTS_TEMP_ALLOWLIST_DURATION_MS); if (mPendingIntent != null) { if (DEBUG_KEY_EVENT) { Log.d(TAG, "Sending " + keyEvent + " to the last known PendingIntent " diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 18f2d8450246..23d84298b41e 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -40,10 +40,10 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; -import android.content.pm.ParceledListSlice; import android.media.AudioManager; import android.media.AudioPlaybackConfiguration; import android.media.IRemoteSessionCallback; +import android.media.MediaCommunicationManager; import android.media.Session2Token; import android.media.session.IActiveSessionsListener; import android.media.session.IOnMediaKeyEventDispatchedListener; @@ -151,6 +151,25 @@ public class MediaSessionService extends SystemService implements Monitor { private MediaSessionPolicyProvider mCustomMediaSessionPolicyProvider; private MediaKeyDispatcher mCustomMediaKeyDispatcher; + private MediaCommunicationManager mCommunicationManager; + private final MediaCommunicationManager.SessionCallback mSession2TokenCallback = + new MediaCommunicationManager.SessionCallback() { + @Override + public void onSession2TokenCreated(Session2Token token) { + if (DEBUG) { + Log.d(TAG, "Session2 is created " + token); + } + MediaSession2Record record = new MediaSession2Record(token, + MediaSessionService.this, mRecordThread.getLooper(), 0); + synchronized (mLock) { + FullUserRecord user = getFullUserRecordLocked(record.getUserId()); + if (user != null) { + user.mPriorityStack.addSession(record); + } + } + } + }; + public MediaSessionService(Context context) { super(context); mContext = context; @@ -202,6 +221,19 @@ public class MediaSessionService extends SystemService implements Monitor { mContext.registerReceiver(mNotificationListenerEnabledChangedReceiver, filter); } + @Override + public void onBootPhase(int phase) { + super.onBootPhase(phase); + switch (phase) { + // This ensures MediaCommunicationService is started + case PHASE_BOOT_COMPLETED: + mCommunicationManager = mContext.getSystemService(MediaCommunicationManager.class); + mCommunicationManager.registerSessionCallback(new HandlerExecutor(mHandler), + mSession2TokenCallback); + break; + } + } + private final BroadcastReceiver mNotificationListenerEnabledChangedReceiver = new BroadcastReceiver() { @Override @@ -1139,31 +1171,6 @@ public class MediaSessionService extends SystemService implements Monitor { } @Override - public void notifySession2Created(Session2Token sessionToken) throws RemoteException { - final int pid = Binder.getCallingPid(); - final int uid = Binder.getCallingUid(); - final long token = Binder.clearCallingIdentity(); - try { - if (DEBUG) { - Log.d(TAG, "Session2 is created " + sessionToken); - } - if (uid != sessionToken.getUid()) { - throw new SecurityException("Unexpected Session2Token's UID, expected=" + uid - + " but actually=" + sessionToken.getUid()); - } - MediaSession2Record record = new MediaSession2Record(sessionToken, - MediaSessionService.this, mRecordThread.getLooper(), 0); - synchronized (mLock) { - FullUserRecord user = getFullUserRecordLocked(record.getUserId()); - user.mPriorityStack.addSession(record); - } - // Do not immediately notify changes -- do so when framework can dispatch command - } finally { - Binder.restoreCallingIdentity(token); - } - } - - @Override public List<MediaSession.Token> getSessions(ComponentName componentName, int userId) { final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); @@ -1185,26 +1192,6 @@ public class MediaSessionService extends SystemService implements Monitor { } @Override - public ParceledListSlice getSession2Tokens(int userId) { - final int pid = Binder.getCallingPid(); - final int uid = Binder.getCallingUid(); - final long token = Binder.clearCallingIdentity(); - - try { - // Check that they can make calls on behalf of the user and get the final user id - int resolvedUserId = handleIncomingUser(pid, uid, userId, null); - List<Session2Token> result; - synchronized (mLock) { - FullUserRecord user = getFullUserRecordLocked(userId); - result = user.mPriorityStack.getSession2Tokens(resolvedUserId); - } - return new ParceledListSlice(result); - } finally { - Binder.restoreCallingIdentity(token); - } - } - - @Override public void addSessionsListener(IActiveSessionsListener listener, ComponentName componentName, int userId) throws RemoteException { final int pid = Binder.getCallingPid(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 274344a445c3..73db7054cec5 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -75,6 +75,8 @@ import static android.service.notification.NotificationListenerService.FLAG_FILT import static android.service.notification.NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS; import static android.service.notification.NotificationListenerService.HINT_HOST_DISABLE_EFFECTS; import static android.service.notification.NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS; +import static android.service.notification.NotificationListenerService.META_DATA_DEFAULT_FILTER_TYPES; +import static android.service.notification.NotificationListenerService.META_DATA_DISABLED_FILTER_TYPES; import static android.service.notification.NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_ADDED; import static android.service.notification.NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_DELETED; import static android.service.notification.NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED; @@ -9866,33 +9868,54 @@ public class NotificationManagerService extends SystemService { Pair listener = Pair.create(si.getComponentName(), userId); NotificationListenerFilter existingNlf = mRequestedNotificationListeners.get(listener); - if (existingNlf == null) { - // no stored filters for this listener; see if they provided a default - if (si.metaData != null) { - String typeList = si.metaData.getString( - NotificationListenerService.META_DATA_DEFAULT_FILTER_TYPES); - if (typeList != null) { - int types = 0; - String[] typeStrings = typeList.split(XML_SEPARATOR); - for (int i = 0; i < typeStrings.length; i++) { - if (TextUtils.isEmpty(typeStrings[i])) { - continue; - } - try { - types |= Integer.parseInt(typeStrings[i]); - } catch (NumberFormatException e) { - // skip - } + if (si.metaData != null) { + if (existingNlf == null) { + // no stored filters for this listener; see if they provided a default + if (si.metaData.containsKey(META_DATA_DEFAULT_FILTER_TYPES)) { + String typeList = + si.metaData.get(META_DATA_DEFAULT_FILTER_TYPES).toString(); + if (typeList != null) { + int types = getTypesFromStringList(typeList); + NotificationListenerFilter nlf = + new NotificationListenerFilter(types, new ArraySet<>()); + mRequestedNotificationListeners.put(listener, nlf); } + } + } - NotificationListenerFilter nlf = - new NotificationListenerFilter(types, new ArraySet<>()); + // also check the types they never want bridged + if (si.metaData.containsKey(META_DATA_DISABLED_FILTER_TYPES)) { + int neverBridge = getTypesFromStringList(si.metaData.get( + META_DATA_DISABLED_FILTER_TYPES).toString()); + if (neverBridge != 0) { + NotificationListenerFilter nlf = + mRequestedNotificationListeners.getOrDefault( + listener, new NotificationListenerFilter()); + nlf.setTypes(nlf.getTypes() & ~neverBridge); mRequestedNotificationListeners.put(listener, nlf); } } } } + private int getTypesFromStringList(String typeList) { + int types = 0; + if (typeList != null) { + String[] typeStrings = typeList.split(XML_SEPARATOR); + for (int i = 0; i < typeStrings.length; i++) { + if (TextUtils.isEmpty(typeStrings[i])) { + continue; + } + try { + types |= Integer.parseInt(typeStrings[i]); + } catch (NumberFormatException e) { + // skip + } + } + } + return types; + } + @GuardedBy("mNotificationLock") public void setOnNotificationPostedTrimLocked(ManagedServiceInfo info, int trim) { if (trim == TRIM_LIGHT) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ec424f03ed75..a4c06557ca8e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -5104,23 +5104,12 @@ public class PackageManagerService extends IPackageManager.Stub InstallArgs args = data.args; PackageInstalledInfo parentRes = data.res; - final boolean grantPermissions = (args.installFlags - & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0; final boolean killApp = (args.installFlags & PackageManager.INSTALL_DONT_KILL_APP) == 0; final boolean virtualPreload = ((args.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0); - final String[] grantedPermissions = args.installGrantPermissions; - final List<String> whitelistedRestrictedPermissions = ((args.installFlags - & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0 - && parentRes.pkg != null) - ? parentRes.pkg.getRequestedPermissions() - : args.whitelistedRestrictedPermissions; - int autoRevokePermissionsMode = args.autoRevokePermissionsMode; - - handlePackagePostInstall(parentRes, grantPermissions, - killApp, virtualPreload, grantedPermissions, - whitelistedRestrictedPermissions, autoRevokePermissionsMode, + + handlePackagePostInstall(parentRes, killApp, virtualPreload, didRestore, args.installSource.installerPackageName, args.observer, args.mDataLoaderType); @@ -5399,11 +5388,8 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void handlePackagePostInstall(PackageInstalledInfo res, boolean grantPermissions, - boolean killApp, boolean virtualPreload, - String[] grantedPermissions, List<String> allowlistedRestrictedPermissions, - int autoRevokePermissionsMode, - boolean launchedForRestore, String installerPackage, + private void handlePackagePostInstall(PackageInstalledInfo res, boolean killApp, + boolean virtualPreload, boolean launchedForRestore, String installerPackage, IPackageInstallObserver2 installObserver, int dataLoaderType) { boolean succeeded = res.returnCode == PackageManager.INSTALL_SUCCEEDED; final boolean update = res.removedInfo != null && res.removedInfo.removedPackage != null; @@ -5434,29 +5420,6 @@ public class PackageManagerService extends IPackageManager.Stub res.removedInfo.sendPackageRemovedBroadcasts(killApp, false /*removedBySystem*/); } - final PermissionManagerServiceInternal.PackageInstalledParams.Builder - permissionParamsBuilder = - new PermissionManagerServiceInternal.PackageInstalledParams.Builder(); - final List<String> grantedPermissionsList; - if (grantPermissions) { - if (grantedPermissions != null) { - permissionParamsBuilder.setGrantedPermissions(Arrays.asList( - grantedPermissions)); - } else { - permissionParamsBuilder.setGrantedPermissions( - res.pkg.getRequestedPermissions()); - } - } - if (allowlistedRestrictedPermissions != null) { - permissionParamsBuilder.setAllowlistedRestrictedPermissions( - allowlistedRestrictedPermissions); - } - permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode); - for (final int userId : res.newUsers) { - mPermissionManager.onPackageInstalled(res.pkg, permissionParamsBuilder.build(), - userId); - } - final String installerPackageName = res.installerPackageName != null ? res.installerPackageName @@ -18457,6 +18420,37 @@ public class PackageManagerService extends IPackageManager.Stub } mSettings.writeKernelMappingLPr(ps); + + final PermissionManagerServiceInternal.PackageInstalledParams.Builder + permissionParamsBuilder = + new PermissionManagerServiceInternal.PackageInstalledParams.Builder(); + final boolean grantPermissions = (installArgs.installFlags + & PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0; + if (grantPermissions) { + final List<String> grantedPermissions = + installArgs.installGrantPermissions != null + ? Arrays.asList(installArgs.installGrantPermissions) + : pkg.getRequestedPermissions(); + permissionParamsBuilder.setGrantedPermissions(grantedPermissions); + } + final boolean allowlistAllRestrictedPermissions = + (installArgs.installFlags + & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0; + final List<String> allowlistedRestrictedPermissions = + allowlistAllRestrictedPermissions ? pkg.getRequestedPermissions() + : installArgs.whitelistedRestrictedPermissions; + if (allowlistedRestrictedPermissions != null) { + permissionParamsBuilder.setAllowlistedRestrictedPermissions( + allowlistedRestrictedPermissions); + } + final int autoRevokePermissionsMode = installArgs.autoRevokePermissionsMode; + permissionParamsBuilder.setAutoRevokePermissionsMode(autoRevokePermissionsMode); + for (int currentUserId : allUsersList) { + if (ps.getInstalled(currentUserId)) { + mPermissionManager.onPackageInstalled(pkg, permissionParamsBuilder.build(), + currentUserId); + } + } } res.name = pkgName; res.uid = pkg.getUid(); diff --git a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java index 2580a9725cb3..a80406548719 100644 --- a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java +++ b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1.java @@ -16,9 +16,6 @@ package com.android.server.pm.verify.domain.proxy; -import static android.os.PowerWhitelistManager.REASON_DOMAIN_VERIFICATION_V1; -import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED; - import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; @@ -241,8 +238,7 @@ public class DomainVerificationProxyV1 implements DomainVerificationProxy { final long allowListTimeout = mConnection.getPowerSaveTempWhitelistAppDuration(); mConnection.getDeviceIdleInternal().addPowerSaveTempWhitelistApp(Process.myUid(), mVerifierComponent.getPackageName(), allowListTimeout, - UserHandle.USER_SYSTEM, true, REASON_DOMAIN_VERIFICATION_V1, - "domain verification agent"); + UserHandle.USER_SYSTEM, true, "domain verification agent"); int size = verifications.size(); for (int index = 0; index < size; index++) { @@ -265,9 +261,7 @@ public class DomainVerificationProxyV1 implements DomainVerificationProxy { .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); final BroadcastOptions options = BroadcastOptions.makeBasic(); - options.setTemporaryAppAllowlist(allowListTimeout, - TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, - REASON_DOMAIN_VERIFICATION_V1, ""); + options.setTemporaryAppWhitelistDuration(allowListTimeout); mContext.sendBroadcastAsUser(intent, UserHandle.SYSTEM, null, options.toBundle()); } } diff --git a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2.java b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2.java index 2ba17d3a86a5..1ef06036021e 100644 --- a/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2.java +++ b/services/core/java/com/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2.java @@ -16,9 +16,6 @@ package com.android.server.pm.verify.domain.proxy; -import static android.os.PowerWhitelistManager.REASON_DOMAIN_VERIFICATION_V2; -import static android.os.PowerWhitelistManager.TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED; - import android.annotation.NonNull; import android.annotation.Nullable; import android.app.BroadcastOptions; @@ -72,14 +69,11 @@ public class DomainVerificationProxyV2 implements DomainVerificationProxy { final long allowListTimeout = mConnection.getPowerSaveTempWhitelistAppDuration(); final BroadcastOptions options = BroadcastOptions.makeBasic(); - options.setTemporaryAppAllowlist(allowListTimeout, - TEMPORARY_ALLOWLIST_TYPE_FOREGROUND_SERVICE_ALLOWED, - REASON_DOMAIN_VERIFICATION_V2, ""); + options.setTemporaryAppWhitelistDuration(allowListTimeout); mConnection.getDeviceIdleInternal().addPowerSaveTempWhitelistApp(Process.myUid(), mVerifierComponent.getPackageName(), allowListTimeout, - UserHandle.USER_SYSTEM, true, REASON_DOMAIN_VERIFICATION_V2, - "domain verification agent"); + UserHandle.USER_SYSTEM, true, "domain verification agent"); Intent intent = new Intent(Intent.ACTION_DOMAINS_NEED_VERIFICATION) .setComponent(mVerifierComponent) diff --git a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java index 106db0b15c46..82d9c214ece7 100644 --- a/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/wm/TaskLaunchParamsModifier.java @@ -234,19 +234,28 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { } } - // STEP 2.3: Adjust launch parameters as needed for freeform display. We enforce the policy - // that legacy (pre-D) apps and those apps that can't handle multiple screen density well - // are forced to be maximized. The rest of this step is to define the default policy when - // there is no initial bounds or a fully resolved current params from callers. + // STEP 2.3: Adjust launch parameters as needed for freeform display. We enforce the + // policies related to unresizable apps here. If an app is unresizable and the freeform + // size-compat mode is enabled, it can be launched in freeform depending on other properties + // such as orientation. Otherwise, the app is forcefully launched in maximized. The rest of + // this step is to define the default policy when there is no initial bounds or a fully + // resolved current params from callers. if (display.inFreeformWindowingMode()) { if (launchMode == WINDOWING_MODE_PINNED) { if (DEBUG) appendLog("picture-in-picture"); - } else if (!mSupervisor.mService.mSizeCompatFreeform && !root.isResizeable()) { - // We're launching an activity in size-compat mode and they aren't allowed in - // freeform, so force it to be maximized. - launchMode = WINDOWING_MODE_FULLSCREEN; - outParams.mBounds.setEmpty(); - if (DEBUG) appendLog("forced-maximize"); + } else if (!root.isResizeable()) { + if (shouldLaunchUnresizableAppInFreeform(root, suggestedDisplayArea)) { + launchMode = WINDOWING_MODE_FREEFORM; + if (outParams.mBounds.isEmpty()) { + getTaskBounds(root, display, layout, launchMode, hasInitialBounds, + outParams.mBounds); + } + if (DEBUG) appendLog("unresizable-freeform"); + } else { + launchMode = WINDOWING_MODE_FULLSCREEN; + outParams.mBounds.setEmpty(); + if (DEBUG) appendLog("unresizable-forced-maximize"); + } } } else { if (DEBUG) appendLog("non-freeform-display"); @@ -322,7 +331,6 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { } getTaskBounds(root, display, layout, resolvedMode, hasInitialBounds, outParams.mBounds); } - return RESULT_CONTINUE; } @@ -562,6 +570,28 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { outBounds.offset(xOffset, yOffset); } + private boolean shouldLaunchUnresizableAppInFreeform(ActivityRecord activity, + TaskDisplayArea displayArea) { + // TODO(176061101): Migrate |mSizeCompatFreeform| to |mSupportsNonResizableMultiWindow|. + if (!mSupervisor.mService.mSizeCompatFreeform || activity.isResizeable()) { + return false; + } + final DisplayContent display = displayArea.getDisplayContent(); + if (display == null) { + return false; + } + + final int displayOrientation = orientationFromBounds(displayArea.getBounds()); + final int activityOrientation = resolveOrientation(activity, display, + displayArea.getBounds()); + if (displayArea.getWindowingMode() == WINDOWING_MODE_FREEFORM + && displayOrientation != activityOrientation) { + return true; + } + + return false; + } + /** * Resolves activity requested orientation to 4 categories: * 1) {@link ActivityInfo#SCREEN_ORIENTATION_LOCKED} indicating app wants to lock down diff --git a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java index 69fe140a7863..e0c8b09aae88 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/gnss/hal/FakeGnssHal.java @@ -500,7 +500,7 @@ public final class FakeGnssHal extends GnssNative.GnssHal { } @Override - protected boolean isAntennaInfoListeningSupported() { + protected boolean isAntennaInfoSupported() { return mIsAntennaInfoListeningSupported; } diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java index c4c9ad088e45..1b58e924dd6a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/LocationProviderManagerTest.java @@ -353,7 +353,7 @@ public class LocationProviderManagerTest { @Test public void testGetLastLocation_ClearOnMockRemoval() { MockLocationProvider mockProvider = new MockLocationProvider(PROPERTIES, PROVIDER_IDENTITY, - null); + Collections.emptySet()); mockProvider.setAllowed(true); mManager.setMockProvider(mockProvider); @@ -1049,7 +1049,7 @@ public class LocationProviderManagerTest { private final ArrayList<Runnable> mFlushCallbacks = new ArrayList<>(); TestProvider(ProviderProperties properties, CallerIdentity identity) { - super(DIRECT_EXECUTOR, identity, properties, null); + super(DIRECT_EXECUTOR, identity, properties, Collections.emptySet()); } public void setProviderAllowed(boolean allowed) { diff --git a/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java b/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java index e8a0bb51e20f..cf5db2e0db98 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/provider/MockableLocationProviderTest.java @@ -43,6 +43,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Collections; + @Presubmit @SmallTest @RunWith(AndroidJUnit4.class) @@ -72,7 +74,7 @@ public class MockableLocationProviderTest { .setAccuracy(ACCURACY_FINE) .build(), CallerIdentity.forTest(0, 1, "testpackage", "test"), - null); + Collections.emptySet()); mProvider = new MockableLocationProvider(lock); mProvider.getController().setListener(mListener); diff --git a/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java b/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java index a1eadbe4a64f..2bc1268f1b85 100644 --- a/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java +++ b/services/tests/mockingservicestests/src/com/android/server/location/test/FakeProvider.java @@ -23,6 +23,7 @@ import com.android.server.location.provider.AbstractLocationProvider; import java.io.FileDescriptor; import java.io.PrintWriter; +import java.util.Collections; public class FakeProvider extends AbstractLocationProvider { @@ -40,7 +41,7 @@ public class FakeProvider extends AbstractLocationProvider { private final FakeProviderInterface mFakeInterface; public FakeProvider(FakeProviderInterface fakeInterface) { - super(Runnable::run, null, null, null); + super(Runnable::run, null, null, Collections.emptySet()); mFakeInterface = fakeInterface; } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java index 80a046a1e8bb..9ac755f78a06 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationListenersTest.java @@ -17,6 +17,8 @@ package com.android.server.notification; import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ALERTING; import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_CONVERSATIONS; +import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_ONGOING; +import static android.service.notification.NotificationListenerService.FLAG_FILTER_TYPE_SILENT; import static com.android.server.notification.NotificationManagerService.NotificationListeners.TAG_REQUESTED_LISTENERS; @@ -205,6 +207,52 @@ public class NotificationListenersTest extends UiServiceTestCase { } @Test + public void testEnsureFilters_newServiceWithMetadata_onlyOneListed() { + ServiceInfo si = new ServiceInfo(); + si.packageName = "new"; + si.name = "comp"; + si.metaData = new Bundle(); + si.metaData.putInt(NotificationListenerService.META_DATA_DEFAULT_FILTER_TYPES, 2); + + mListeners.ensureFilters(si, 0); + + assertThat(mListeners.getNotificationListenerFilter( + Pair.create(si.getComponentName(), 0)).getTypes()) + .isEqualTo(FLAG_FILTER_TYPE_ALERTING); + } + + @Test + public void testEnsureFilters_newServiceWithMetadata_disabledTypes() { + ServiceInfo si = new ServiceInfo(); + si.packageName = "new"; + si.name = "comp"; + si.metaData = new Bundle(); + si.metaData.putString(NotificationListenerService.META_DATA_DISABLED_FILTER_TYPES, "1,2"); + + mListeners.ensureFilters(si, 0); + + assertThat(mListeners.getNotificationListenerFilter( + Pair.create(si.getComponentName(), 0)).getTypes()) + .isEqualTo(FLAG_FILTER_TYPE_SILENT | FLAG_FILTER_TYPE_ONGOING); + } + + @Test + public void testEnsureFilters_newServiceWithMetadata_metaDataDisagrees() { + ServiceInfo si = new ServiceInfo(); + si.packageName = "new"; + si.name = "comp"; + si.metaData = new Bundle(); + si.metaData.putString(NotificationListenerService.META_DATA_DEFAULT_FILTER_TYPES, "1,2"); + si.metaData.putInt(NotificationListenerService.META_DATA_DISABLED_FILTER_TYPES, 1); + + mListeners.ensureFilters(si, 0); + + assertThat(mListeners.getNotificationListenerFilter( + Pair.create(si.getComponentName(), 0)).getTypes()) + .isEqualTo(FLAG_FILTER_TYPE_ALERTING); + } + + @Test public void testEnsureFilters_newServiceWithEmptyMetadata() { ServiceInfo si = new ServiceInfo(); si.packageName = "new"; diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java index 49847992125e..f8346efba06d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskLaunchParamsModifierTests.java @@ -683,12 +683,12 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { } @Test - public void testLaunchesAppInWindowOnFreeformDisplay() { + public void testLaunchesPortraitSizeCompatOnFreeformLandscapeDisplayWithFreeformSizeCompat() { mAtm.mSizeCompatFreeform = true; final TestDisplayContent freeformDisplay = createNewDisplayContent( WINDOWING_MODE_FREEFORM); - Rect expectedLaunchBounds = new Rect(0, 0, 200, 100); + Rect expectedLaunchBounds = new Rect(0, 0, 100, 200); final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM); @@ -699,6 +699,7 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { mCurrent.mBounds.set(expectedLaunchBounds); mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + mActivity.info.screenOrientation = SCREEN_ORIENTATION_PORTRAIT; assertEquals(RESULT_CONTINUE, new CalculateRequestBuilder().setOptions(options).calculate()); @@ -710,6 +711,38 @@ public class TaskLaunchParamsModifierTests extends WindowTestsBase { } @Test + public void testLaunchesLandscapeSizeCompatOnFreeformLandscapeDisplayWithFreeformSizeCompat() { + mAtm.mSizeCompatFreeform = true; + final TestDisplayContent freeformDisplay = createNewDisplayContent( + WINDOWING_MODE_FREEFORM); + final ActivityOptions options = ActivityOptions.makeBasic(); + mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); + mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + mActivity.info.screenOrientation = SCREEN_ORIENTATION_LANDSCAPE; + assertEquals(RESULT_CONTINUE, + new CalculateRequestBuilder().setOptions(options).calculate()); + + assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode, + WINDOWING_MODE_FREEFORM); + } + + @Test + public void testLaunchesPortraitUnresizableOnFreeformDisplayWithFreeformSizeCompat() { + mAtm.mSizeCompatFreeform = true; + final TestDisplayContent freeformDisplay = createNewDisplayContent( + WINDOWING_MODE_FREEFORM); + final ActivityOptions options = ActivityOptions.makeBasic(); + mCurrent.mPreferredTaskDisplayArea = freeformDisplay.getDefaultTaskDisplayArea(); + mActivity.info.resizeMode = RESIZE_MODE_UNRESIZEABLE; + mActivity.info.screenOrientation = SCREEN_ORIENTATION_PORTRAIT; + assertEquals(RESULT_CONTINUE, + new CalculateRequestBuilder().setOptions(options).calculate()); + + assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, + WINDOWING_MODE_FREEFORM); + } + + @Test public void testSkipsForceMaximizingAppsOnNonFreeformDisplay() { final ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchWindowingMode(WINDOWING_MODE_FREEFORM); diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java index cc050becfb25..34984e05e181 100644 --- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java @@ -37,6 +37,7 @@ import com.android.internal.telephony.util.RemoteCallbackListExt; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.ref.WeakReference; +import java.util.Arrays; import java.util.HashMap; /** @@ -368,7 +369,13 @@ public class ImsConfigImplBase { } private void onNotifyRcsAutoConfigurationReceived(byte[] config, boolean isCompressed) { - mRcsConfigData = isCompressed ? RcsConfig.decompressGzip(config) : config; + // cache uncompressed config + config = isCompressed ? RcsConfig.decompressGzip(config) : config; + if (Arrays.equals(mRcsConfigData, config)) { + return; + } + mRcsConfigData = config; + // can be null in testing if (mRcsCallbacks != null) { mRcsCallbacks.broadcastAction(c -> { diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 0048d53f9172..e87f3d9aec76 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2325,6 +2325,16 @@ interface ITelephony { void triggerRcsReconfiguration(int subId); /** + * Enables or disables the test mode for RCS VoLTE single registration. + */ + void setRcsSingleRegistrationTestModeEnabled(boolean enabled); + + /** + * Gets the test mode for RCS VoLTE single registration. + */ + boolean getRcsSingleRegistrationTestModeEnabled(); + + /** * Overrides the config of RCS VoLTE single registration enabled for the device. */ void setDeviceSingleRegistrationEnabledOverride(String enabled); diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index ad87567843c7..1cfc3f9f9e5c 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -407,8 +407,6 @@ public class ConnectivityServiceTest { private QosCallbackMockHelper mQosCallbackMockHelper; private QosCallbackTracker mQosCallbackTracker; private VpnManagerService mVpnManagerService; - private TestNetworkCallback mDefaultNetworkCallback; - private TestNetworkCallback mSystemDefaultNetworkCallback; // State variables required to emulate NetworkPolicyManagerService behaviour. private int mUidRules = RULE_NONE; @@ -1549,7 +1547,6 @@ public class ConnectivityServiceTest { @After public void tearDown() throws Exception { - unregisterDefaultNetworkCallbacks(); setAlwaysOnNetworks(false); if (mCellNetworkAgent != null) { mCellNetworkAgent.disconnect(); @@ -9470,10 +9467,6 @@ public class ConnectivityServiceTest { fail("TOO_MANY_REQUESTS never thrown"); } - private UidRange createUidRange(int userId) { - return UidRange.createForUser(UserHandle.of(userId)); - } - private void mockGetApplicationInfo(@NonNull final String packageName, @NonNull final int uid) throws Exception { final ApplicationInfo applicationInfo = new ApplicationInfo(); @@ -9808,54 +9801,6 @@ public class ConnectivityServiceTest { assertEquals(expectedPerAppNetwork, defaultNetwork); assertEquals(expectedOemRequestsSize, defaultRequest.mRequests.size()); } - verifyMultipleDefaultCallbacks(expectedDefaultNetwork, expectedPerAppNetwork); - } - - /** - * Verify default callbacks for 'available' fire as expected. This will only run if - * registerDefaultNetworkCallbacks() was executed prior and will only be different if the - * setOemNetworkPreference() per-app API was used for the current process. - * @param expectedSystemDefault the expected network for the system default. - * @param expectedPerAppDefault the expected network for the current process's default. - */ - private void verifyMultipleDefaultCallbacks( - @NonNull final Network expectedSystemDefault, - @NonNull final Network expectedPerAppDefault) { - if (null != mSystemDefaultNetworkCallback && null != expectedSystemDefault - && mService.mNoServiceNetwork.network() != expectedSystemDefault) { - // getLastAvailableNetwork() is used as this method can be called successively with - // the same network to validate therefore expectAvailableThenValidatedCallbacks - // can't be used. - assertEquals(mSystemDefaultNetworkCallback.getLastAvailableNetwork(), - expectedSystemDefault); - } - if (null != mDefaultNetworkCallback && null != expectedPerAppDefault - && mService.mNoServiceNetwork.network() != expectedPerAppDefault) { - assertEquals(mDefaultNetworkCallback.getLastAvailableNetwork(), - expectedPerAppDefault); - } - } - - private void registerDefaultNetworkCallbacks() { - // Using Manifest.permission.NETWORK_SETTINGS for registerSystemDefaultNetworkCallback() - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED); - mSystemDefaultNetworkCallback = new TestNetworkCallback(); - mDefaultNetworkCallback = new TestNetworkCallback(); - mCm.registerSystemDefaultNetworkCallback(mSystemDefaultNetworkCallback, - new Handler(ConnectivityThread.getInstanceLooper())); - mCm.registerDefaultNetworkCallback(mDefaultNetworkCallback); - mServiceContext.setPermission( - Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED); - } - - private void unregisterDefaultNetworkCallbacks() { - if (null != mDefaultNetworkCallback) { - mCm.unregisterNetworkCallback(mDefaultNetworkCallback); - } - if (null != mSystemDefaultNetworkCallback) { - mCm.unregisterNetworkCallback(mSystemDefaultNetworkCallback); - } } private void setupMultipleDefaultNetworksForOemNetworkPreferenceNotCurrentUidTest( @@ -9939,7 +9884,6 @@ public class ConnectivityServiceTest { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; final int expectedOemPrefRequestSize = 1; - registerDefaultNetworkCallbacks(); // Setup the test process to use networkPref for their default network. setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); @@ -9954,7 +9898,6 @@ public class ConnectivityServiceTest { // Verify that the active network is correct verifyActiveNetwork(TRANSPORT_ETHERNET); - // default NCs will be unregistered in tearDown } @Test @@ -9962,7 +9905,6 @@ public class ConnectivityServiceTest { @OemNetworkPreferences.OemNetworkPreference final int networkPref = OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; final int expectedOemPrefRequestSize = 1; - registerDefaultNetworkCallbacks(); // Setup the test process to use networkPref for their default network. setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); @@ -9983,7 +9925,6 @@ public class ConnectivityServiceTest { mEthernetNetworkAgent.getNetwork()); assertFalse(mCm.isActiveNetworkMetered()); - // default NCs will be unregistered in tearDown } @Test @@ -10140,6 +10081,7 @@ public class ConnectivityServiceTest { /** * Test the tracked default requests clear previous OEM requests on setOemNetworkPreference(). + * @throws Exception */ @Test public void testSetOemNetworkPreferenceClearPreviousOemValues() throws Exception { @@ -10167,8 +10109,9 @@ public class ConnectivityServiceTest { } /** - * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID in the following order: + * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID following in order: * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback + * @throws Exception */ @Test public void testMultilayerForPreferenceOemPaidEvaluatesCorrectly() @@ -10234,8 +10177,9 @@ public class ConnectivityServiceTest { } /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK in the following order: + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK following in order: * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID + * @throws Exception */ @Test public void testMultilayerForPreferenceOemPaidNoFallbackEvaluatesCorrectly() @@ -10296,9 +10240,10 @@ public class ConnectivityServiceTest { } /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY in the following order: + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY following in order: * NET_CAPABILITY_OEM_PAID * This preference should only apply to OEM_PAID networks. + * @throws Exception */ @Test public void testMultilayerForPreferenceOemPaidOnlyEvaluatesCorrectly() @@ -10349,9 +10294,10 @@ public class ConnectivityServiceTest { } /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY in the following order: + * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY following in order: * NET_CAPABILITY_OEM_PRIVATE * This preference should only apply to OEM_PRIVATE networks. + * @throws Exception */ @Test public void testMultilayerForPreferenceOemPrivateOnlyEvaluatesCorrectly() @@ -10401,235 +10347,7 @@ public class ConnectivityServiceTest { true /* shouldDestroyNetwork */); } - /** - * Test network priority for preference OEM_NETWORK_PREFERENCE_OEM_PAID in the following order: - * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID -> fallback - */ - @Test - public void testMultipleDefaultNetworksTracksOemNetworkPreferenceOemPaidCorrectly() - throws Exception { - @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID; - setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); - final int expectedDefaultRequestSize = 2; - final int expectedOemPrefRequestSize = 3; - registerDefaultNetworkCallbacks(); - - // The fallback as well as the OEM preference should now be tracked. - assertEquals(expectedDefaultRequestSize, mService.mDefaultNetworkRequests.size()); - - // Test lowest to highest priority requests. - // Bring up metered cellular. This will satisfy the fallback network. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mCellNetworkAgent.getNetwork()); - - // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Bring up unmetered Wi-Fi. This will satisfy NET_CAPABILITY_NOT_METERED. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mWiFiNetworkAgent.getNetwork(), - mWiFiNetworkAgent.getNetwork()); - - // Disconnecting unmetered Wi-Fi will put the pref on OEM_PAID and fallback on cellular. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting cellular should keep OEM network on OEM_PAID and fallback will be null. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting OEM_PAID will put both on null as it is the last network. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - null); - - // default NCs will be unregistered in tearDown - } - - /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK in the following order: - * NET_CAPABILITY_NOT_METERED -> NET_CAPABILITY_OEM_PAID - */ - @Test - public void testMultipleDefaultNetworksTracksOemNetworkPreferenceOemPaidNoFallbackCorrectly() - throws Exception { - @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_NO_FALLBACK; - setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); - final int expectedDefaultRequestSize = 2; - final int expectedOemPrefRequestSize = 2; - registerDefaultNetworkCallbacks(); - - // The fallback as well as the OEM preference should now be tracked. - assertEquals(expectedDefaultRequestSize, mService.mDefaultNetworkRequests.size()); - - // Test lowest to highest priority requests. - // Bring up metered cellular. This will satisfy the fallback network but not the pref. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mService.mNoServiceNetwork.network()); - - // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Bring up unmetered Wi-Fi. This will satisfy NET_CAPABILITY_NOT_METERED. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mWiFiNetworkAgent.getNetwork(), - mWiFiNetworkAgent.getNetwork()); - - // Disconnecting unmetered Wi-Fi will put the OEM pref on OEM_PAID and fallback on cellular. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting cellular should keep OEM network on OEM_PAID and fallback will be null. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting OEM_PAID puts the fallback on null and the pref on the disconnected net. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - mService.mNoServiceNetwork.network()); - - // default NCs will be unregistered in tearDown - } - - /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY in the following order: - * NET_CAPABILITY_OEM_PAID - * This preference should only apply to OEM_PAID networks. - */ - @Test - public void testMultipleDefaultNetworksTracksOemNetworkPreferenceOemPaidOnlyCorrectly() - throws Exception { - @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PAID_ONLY; - setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); - final int expectedDefaultRequestSize = 2; - final int expectedOemPrefRequestSize = 1; - registerDefaultNetworkCallbacks(); - - // The fallback as well as the OEM preference should now be tracked. - assertEquals(expectedDefaultRequestSize, mService.mDefaultNetworkRequests.size()); - - // Test lowest to highest priority requests. - // Bring up metered cellular. This will satisfy the fallback network. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mService.mNoServiceNetwork.network()); - - // Bring up ethernet with OEM_PAID. This will satisfy NET_CAPABILITY_OEM_PAID. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Bring up unmetered Wi-Fi. The OEM network shouldn't change, the fallback will take Wi-Fi. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mWiFiNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting unmetered Wi-Fi shouldn't change the OEM network with fallback on cellular. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting OEM_PAID will keep the fallback on cellular and nothing for OEM_PAID. - // OEM_PAID_ONLY not supporting a fallback now uses the disconnected network. - setOemNetworkPreferenceAgentConnected(TRANSPORT_ETHERNET, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mService.mNoServiceNetwork.network()); - - // Disconnecting cellular will put the fallback on null and the pref on disconnected. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - mService.mNoServiceNetwork.network()); - - // default NCs will be unregistered in tearDown - } - - /** - * Test network priority for OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY in the following order: - * NET_CAPABILITY_OEM_PRIVATE - * This preference should only apply to OEM_PRIVATE networks. - */ - @Test - public void testMultipleDefaultNetworksTracksOemNetworkPreferenceOemPrivateOnlyCorrectly() - throws Exception { - @OemNetworkPreferences.OemNetworkPreference final int networkPref = - OemNetworkPreferences.OEM_NETWORK_PREFERENCE_OEM_PRIVATE_ONLY; - setupMultipleDefaultNetworksForOemNetworkPreferenceCurrentUidTest(networkPref); - final int expectedDefaultRequestSize = 2; - final int expectedOemPrefRequestSize = 1; - registerDefaultNetworkCallbacks(); - - // The fallback as well as the OEM preference should now be tracked. - assertEquals(expectedDefaultRequestSize, mService.mDefaultNetworkRequests.size()); - - // Test lowest to highest priority requests. - // Bring up metered cellular. This will satisfy the fallback network. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mService.mNoServiceNetwork.network()); - - // Bring up ethernet with OEM_PRIVATE. This will satisfy NET_CAPABILITY_OEM_PRIVATE. - startOemManagedNetwork(false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Bring up unmetered Wi-Fi. The OEM network shouldn't change, the fallback will take Wi-Fi. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, true); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mWiFiNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting unmetered Wi-Fi shouldn't change the OEM network with fallback on cellular. - setOemNetworkPreferenceAgentConnected(TRANSPORT_WIFI, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mEthernetNetworkAgent.getNetwork()); - - // Disconnecting OEM_PRIVATE will keep the fallback on cellular. - // OEM_PRIVATE_ONLY not supporting a fallback now uses to the disconnected network. - stopOemManagedNetwork(); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - mCellNetworkAgent.getNetwork(), - mService.mNoServiceNetwork.network()); - - // Disconnecting cellular will put the fallback on null and pref on disconnected. - setOemNetworkPreferenceAgentConnected(TRANSPORT_CELLULAR, false); - verifyMultipleDefaultNetworksTracksCorrectly(expectedOemPrefRequestSize, - null, - mService.mNoServiceNetwork.network()); - - // default NCs will be unregistered in tearDown + private UidRange createUidRange(int userId) { + return UidRange.createForUser(UserHandle.of(userId)); } } |