diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 7e83426dc7cd6..9c31435f78e69 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -333,6 +333,8 @@ package android { } public static final class R.string { + field public static final int config_customMediaKeyDispatcher = 17039404; // 0x104002c + field public static final int config_customMediaSessionPolicyProvider = 17039405; // 0x104002d field public static final int config_defaultAssistant = 17039393; // 0x1040021 field public static final int config_defaultBrowser = 17039394; // 0x1040022 field public static final int config_defaultCallRedirection = 17039397; // 0x1040025 diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 59285d7940451..9a917b72a5fdb 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4592,11 +4592,12 @@ com.android.systemui - + - - + + 1.10 diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 22dce9b9935c6..a1ea61c447c02 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3153,6 +3153,10 @@ + + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index f0304dd43dd78..fe33749031ab6 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4114,8 +4114,6 @@ - - diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index 66d579408db00..dc476b873786e 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -73,8 +73,10 @@ interface ISessionManager { void setOnMediaKeyListener(in IOnMediaKeyListener listener); boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid); - void setCustomMediaKeyDispatcherForTesting(String name); - void setCustomSessionPolicyProviderForTesting(String name); + void setCustomMediaKeyDispatcher(String name); + void setCustomMediaSessionPolicyProvider(String name); + boolean hasCustomMediaKeyDispatcher(String componentName); + boolean hasCustomMediaSessionPolicyProvider(String componentName); int getSessionPolicies(in MediaSession.Token token); void setSessionPolicies(in MediaSession.Token token, int policies); } diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 13a3436569aa5..8de5e42e93b2c 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -958,9 +958,9 @@ public final class MediaSessionManager { * @hide */ @VisibleForTesting - public void setCustomMediaKeyDispatcherForTesting(@Nullable String name) { + public void setCustomMediaKeyDispatcher(@Nullable String name) { try { - mService.setCustomMediaKeyDispatcherForTesting(name); + mService.setCustomMediaKeyDispatcher(name); } catch (RemoteException e) { Log.e(TAG, "Failed to set custom media key dispatcher name", e); } @@ -968,21 +968,57 @@ public final class MediaSessionManager { /** * Set the component name for the custom - * {@link com.android.server.media.SessionPolicyProvider} class. Set to null to restore to the - * custom {@link com.android.server.media.SessionPolicyProvider} class name retrieved from the - * config value. + * {@link com.android.server.media.MediaSessionPolicyProvider} class. Set to null to restore to + * the custom {@link com.android.server.media.MediaSessionPolicyProvider} class name retrieved + * from the config value. * * @hide */ @VisibleForTesting - public void setCustomSessionPolicyProviderForTesting(@Nullable String name) { + public void setCustomMediaSessionPolicyProvider(@Nullable String name) { try { - mService.setCustomSessionPolicyProviderForTesting(name); + mService.setCustomMediaSessionPolicyProvider(name); } catch (RemoteException e) { Log.e(TAG, "Failed to set custom session policy provider name", e); } } + /** + * Get the component name for the custom {@link com.android.server.media.MediaKeyDispatcher} + * class. + * + * @hide + */ + @VisibleForTesting + public boolean hasCustomMediaKeyDispatcher(@NonNull String componentName) { + Objects.requireNonNull(componentName, "componentName shouldn't be null"); + try { + return mService.hasCustomMediaKeyDispatcher(componentName); + } catch (RemoteException e) { + Log.e(TAG, "Failed to check if custom media key dispatcher with given component" + + " name exists", e); + } + return false; + } + + /** + * Get the component name for the custom + * {@link com.android.server.media.MediaSessionPolicyProvider} class. + * + * @hide + */ + @VisibleForTesting + public boolean hasCustomMediaSessionPolicyProvider(@NonNull String componentName) { + Objects.requireNonNull(componentName, "componentName shouldn't be null"); + try { + return mService.hasCustomMediaSessionPolicyProvider(componentName); + } catch (RemoteException e) { + Log.e(TAG, "Failed to check if custom media session policy provider with given" + + " component name exists", e); + } + return false; + } + /** * Get session policies of the specified {@link MediaSession.Token}. * diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java index 7ef4924879bfe..55511ad637ac0 100644 --- a/services/core/java/com/android/server/media/MediaKeyDispatcher.java +++ b/services/core/java/com/android/server/media/MediaKeyDispatcher.java @@ -77,7 +77,7 @@ public abstract class MediaKeyDispatcher { mOverriddenKeyEvents.put(KeyEvent.KEYCODE_VOLUME_MUTE, 0); } - // TODO: Move this method into SessionPolicyProvider.java for better readability. + // TODO: Move this method into MediaSessionPolicyProvider.java for better readability. /** * Implement this to customize the logic for which MediaSession should consume which key event. * diff --git a/services/core/java/com/android/server/media/SessionPolicyProvider.java b/services/core/java/com/android/server/media/MediaSessionPolicyProvider.java similarity index 95% rename from services/core/java/com/android/server/media/SessionPolicyProvider.java rename to services/core/java/com/android/server/media/MediaSessionPolicyProvider.java index 332c85adec015..ceadb596dd422 100644 --- a/services/core/java/com/android/server/media/SessionPolicyProvider.java +++ b/services/core/java/com/android/server/media/MediaSessionPolicyProvider.java @@ -31,7 +31,7 @@ import java.lang.annotation.RetentionPolicy; * without any parameters. */ // TODO: Move this class to apex/media/ -public abstract class SessionPolicyProvider { +public abstract class MediaSessionPolicyProvider { @IntDef(value = { SESSION_POLICY_IGNORE_BUTTON_RECEIVER, SESSION_POLICY_IGNORE_BUTTON_SESSION @@ -55,7 +55,7 @@ public abstract class SessionPolicyProvider { */ static final int SESSION_POLICY_IGNORE_BUTTON_SESSION = 1 << 1; - public SessionPolicyProvider(Context context) { + public MediaSessionPolicyProvider(Context context) { // Constructor used for reflection } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index c462a92741174..0a074e1e7c500 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -895,7 +895,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR throws RemoteException { final long token = Binder.clearCallingIdentity(); try { - if ((mPolicies & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) + if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) != 0) { return; } @@ -911,7 +911,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient, MediaSessionR public void setMediaButtonBroadcastReceiver(ComponentName receiver) throws RemoteException { final long token = Binder.clearCallingIdentity(); try { - if ((mPolicies & SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) + if ((mPolicies & MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_RECEIVER) != 0) { return; } diff --git a/services/core/java/com/android/server/media/MediaSessionRecordImpl.java b/services/core/java/com/android/server/media/MediaSessionRecordImpl.java index 032523ef96948..3c50597b8cfc8 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecordImpl.java +++ b/services/core/java/com/android/server/media/MediaSessionRecordImpl.java @@ -20,7 +20,7 @@ import android.media.AudioManager; import android.os.ResultReceiver; import android.view.KeyEvent; -import com.android.server.media.SessionPolicyProvider.SessionPolicy; +import com.android.server.media.MediaSessionPolicyProvider.SessionPolicy; import java.io.PrintWriter; diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 6c1d3991c4e95..18f2d8450246e 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -148,7 +148,7 @@ public class MediaSessionService extends SystemService implements Monitor { final RemoteCallbackList mRemoteVolumeControllers = new RemoteCallbackList<>(); - private SessionPolicyProvider mCustomSessionPolicyProvider; + private MediaSessionPolicyProvider mCustomMediaSessionPolicyProvider; private MediaKeyDispatcher mCustomMediaKeyDispatcher; public MediaSessionService(Context context) { @@ -191,8 +191,10 @@ public class MediaSessionService extends SystemService implements Monitor { updateUser(); - instantiateCustomProvider(null); - instantiateCustomDispatcher(null); + instantiateCustomProvider(mContext.getResources().getString( + R.string.config_customMediaSessionPolicyProvider)); + instantiateCustomDispatcher(mContext.getResources().getString( + R.string.config_customMediaKeyDispatcher)); mRecordThread.start(); final IntentFilter filter = new IntentFilter( @@ -589,8 +591,8 @@ public class MediaSessionService extends SystemService implements Monitor { String callerPackageName, ISessionCallback cb, String tag, Bundle sessionInfo) { synchronized (mLock) { int policies = 0; - if (mCustomSessionPolicyProvider != null) { - policies = mCustomSessionPolicyProvider.getSessionPoliciesForApplication( + if (mCustomMediaSessionPolicyProvider != null) { + policies = mCustomMediaSessionPolicyProvider.getSessionPoliciesForApplication( callerUid, callerPackageName); } @@ -778,16 +780,13 @@ public class MediaSessionService extends SystemService implements Monitor { return null; } - private void instantiateCustomDispatcher(String nameFromTesting) { + private void instantiateCustomDispatcher(String componentName) { synchronized (mLock) { mCustomMediaKeyDispatcher = null; - String customDispatcherClassName = (nameFromTesting == null) - ? mContext.getResources().getString(R.string.config_customMediaKeyDispatcher) - : nameFromTesting; try { - if (!TextUtils.isEmpty(customDispatcherClassName)) { - Class customDispatcherClass = Class.forName(customDispatcherClassName); + if (componentName != null && !TextUtils.isEmpty(componentName)) { + Class customDispatcherClass = Class.forName(componentName); Constructor constructor = customDispatcherClass.getDeclaredConstructor(Context.class); mCustomMediaKeyDispatcher = @@ -801,20 +800,17 @@ public class MediaSessionService extends SystemService implements Monitor { } } - private void instantiateCustomProvider(String nameFromTesting) { + private void instantiateCustomProvider(String componentName) { synchronized (mLock) { - mCustomSessionPolicyProvider = null; + mCustomMediaSessionPolicyProvider = null; - String customProviderClassName = (nameFromTesting == null) - ? mContext.getResources().getString(R.string.config_customSessionPolicyProvider) - : nameFromTesting; try { - if (!TextUtils.isEmpty(customProviderClassName)) { - Class customProviderClass = Class.forName(customProviderClassName); + if (componentName != null && !TextUtils.isEmpty(componentName)) { + Class customProviderClass = Class.forName(componentName); Constructor constructor = customProviderClass.getDeclaredConstructor(Context.class); - mCustomSessionPolicyProvider = - (SessionPolicyProvider) constructor.newInstance(mContext); + mCustomMediaSessionPolicyProvider = + (MediaSessionPolicyProvider) constructor.newInstance(mContext); } } catch (ClassNotFoundException | InstantiationException | InvocationTargetException | IllegalAccessException | NoSuchMethodException e) { @@ -1933,15 +1929,29 @@ public class MediaSessionService extends SystemService implements Monitor { } @Override - public void setCustomMediaKeyDispatcherForTesting(String name) { + public void setCustomMediaKeyDispatcher(String name) { instantiateCustomDispatcher(name); } @Override - public void setCustomSessionPolicyProviderForTesting(String name) { + public void setCustomMediaSessionPolicyProvider(String name) { instantiateCustomProvider(name); } + @Override + public boolean hasCustomMediaKeyDispatcher(String componentName) { + return mCustomMediaKeyDispatcher == null ? false + : TextUtils.equals(componentName, + mCustomMediaKeyDispatcher.getClass().getName()); + } + + @Override + public boolean hasCustomMediaSessionPolicyProvider(String componentName) { + return mCustomMediaSessionPolicyProvider == null ? false + : TextUtils.equals(componentName, + mCustomMediaSessionPolicyProvider.getClass().getName()); + } + @Override public int getSessionPolicies(MediaSession.Token token) { synchronized (mLock) { diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java index f8ff5b5f8e664..50eed19389dc1 100644 --- a/services/core/java/com/android/server/media/MediaSessionStack.java +++ b/services/core/java/com/android/server/media/MediaSessionStack.java @@ -16,7 +16,7 @@ package com.android.server.media; -import static com.android.server.media.SessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION; +import static com.android.server.media.MediaSessionPolicyProvider.SESSION_POLICY_IGNORE_BUTTON_SESSION; import android.media.Session2Token; import android.media.session.MediaSession;