[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
This commit is contained in:
Jin Seok Park
2021-01-29 17:56:53 +09:00
parent 59536a1edb
commit e3e72b34ff
12 changed files with 96 additions and 43 deletions

View File

@@ -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

View File

@@ -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>

View File

@@ -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">

View File

@@ -4114,8 +4114,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"/>

View File

@@ -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);
}

View File

@@ -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}.
*

View File

@@ -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.
*

View File

@@ -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
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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,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) {

View File

@@ -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;