diff options
| author | 2021-02-21 11:27:39 +0000 | |
|---|---|---|
| committer | 2021-02-21 11:27:39 +0000 | |
| commit | ee9b56d9bca5b1e0a996198cea040fc74e0b1c0f (patch) | |
| tree | e1a4dfa21e019b60a5f0abc594457adcbfb2aba8 | |
| parent | e502fe683a0153a6aea6d604e8ba27430798d406 (diff) | |
| parent | e3e72b34ffe4fd4dba822bce3853fd1121a0b7a2 (diff) | |
Merge "[Media ML] Expose config values for OEMs to set custom classes" into sc-dev
| -rw-r--r-- | core/api/system-current.txt | 2 | ||||
| -rw-r--r-- | core/res/res/values/config.xml | 7 | ||||
| -rw-r--r-- | core/res/res/values/public.xml | 4 | ||||
| -rw-r--r-- | core/res/res/values/symbols.xml | 2 | ||||
| -rw-r--r-- | media/java/android/media/session/ISessionManager.aidl | 6 | ||||
| -rw-r--r-- | media/java/android/media/session/MediaSessionManager.java | 50 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaKeyDispatcher.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionPolicyProvider.java (renamed from services/core/java/com/android/server/media/SessionPolicyProvider.java) | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionRecord.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionRecordImpl.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionService.java | 54 | ||||
| -rw-r--r-- | services/core/java/com/android/server/media/MediaSessionStack.java | 2 |
12 files changed, 96 insertions, 43 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 80c22e1a4222..7b7518d05345 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 59285d794045..9a917b72a5fd 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4592,11 +4592,12 @@ <item>com.android.systemui</item> </string-array> - <!-- Package name of custom media key dispatcher class used by MediaSessionService. --> + <!-- Component name of custom media key dispatcher class used by MediaSessionService. --> <string name="config_customMediaKeyDispatcher"></string> - <!-- Package name of custom session policy provider class used by MediaSessionService. --> - <string name="config_customSessionPolicyProvider"></string> + <!-- Component name of custom media session policy provider class used by + MediaSessionService. --> + <string name="config_customMediaSessionPolicyProvider"></string> <!-- The max scale for the wallpaper when it's zoomed in --> <item name="config_wallpaperMaxScale" format="float" type="dimen">1.10</item> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 22dce9b9935c..a1ea61c447c0 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -3153,6 +3153,10 @@ <public name="config_systemShell" /> <!-- @hide @SystemApi --> <public name="config_systemContacts" /> + <!-- @hide @SystemApi --> + <public name="config_customMediaKeyDispatcher" /> + <!-- @hide @SystemApi --> + <public name="config_customMediaSessionPolicyProvider" /> </public-group> <public-group type="id" first-id="0x01020055"> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 70b358fd4d77..b5af5240b843 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4115,8 +4115,6 @@ <java-symbol type="string" name="notification_history_title_placeholder" /> - <java-symbol type="string" name="config_customMediaKeyDispatcher" /> - <java-symbol type="string" name="config_customSessionPolicyProvider" /> <!-- The max scale for the wallpaper when it's zoomed in --> <java-symbol type="dimen" name="config_wallpaperMaxScale"/> diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index 66d579408db0..dc476b873786 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 13a3436569aa..8de5e42e93b2 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,22 +968,58 @@ 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}. * * @hide diff --git a/services/core/java/com/android/server/media/MediaKeyDispatcher.java b/services/core/java/com/android/server/media/MediaKeyDispatcher.java index 7ef4924879bf..55511ad637ac 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 index 332c85adec01..ceadb596dd42 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 c462a9274117..0a074e1e7c50 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 032523ef9694..3c50597b8cfc 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 6c1d3991c4e9..18f2d8450246 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<IRemoteSessionCallback> 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,16 +1929,30 @@ 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) { MediaSessionRecord record = getMediaSessionRecordLocked(token); diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java index f8ff5b5f8e66..50eed19389dc 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; |