From e3e72b34ffe4fd4dba822bce3853fd1121a0b7a2 Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Fri, 29 Jan 2021 17:56:53 +0900 Subject: [PATCH] [Media ML] Expose config values for OEMs to set custom classes Expose internal config values that OEMs can use to customize media service code as SystemApi in order to access it from mainline module. Bug: 178774406 Test: Cherry-pick ag/9881175, build/flash, and call R.string.config_customMediaKeyDispatcher to test that config value has been overlayed. Change-Id: Ia23af4ce4fa20b06f70fc3d964c7f3db0bd35325 --- core/api/system-current.txt | 2 + core/res/res/values/config.xml | 7 +-- core/res/res/values/public.xml | 4 ++ core/res/res/values/symbols.xml | 2 - .../media/session/ISessionManager.aidl | 6 ++- .../media/session/MediaSessionManager.java | 50 ++++++++++++++--- .../server/media/MediaKeyDispatcher.java | 2 +- ...r.java => MediaSessionPolicyProvider.java} | 4 +- .../server/media/MediaSessionRecord.java | 4 +- .../server/media/MediaSessionRecordImpl.java | 2 +- .../server/media/MediaSessionService.java | 54 +++++++++++-------- .../server/media/MediaSessionStack.java | 2 +- 12 files changed, 96 insertions(+), 43 deletions(-) rename services/core/java/com/android/server/media/{SessionPolicyProvider.java => MediaSessionPolicyProvider.java} (95%) 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;