Loading AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Required to determine source of ongoing audio recordings. --> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> Loading src/com/android/server/telecom/Call.java +6 −1 Original line number Diff line number Diff line Loading @@ -891,12 +891,17 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, */ public boolean setState(int newState, String tag) { if (mState != newState) { Log.v(this, "setState %s -> %s", mState, newState); Log.v(this, "setState %s -> %s", CallState.toString(mState), CallState.toString(newState)); if (newState == CallState.DISCONNECTED && shouldContinueProcessingAfterDisconnect()) { Log.w(this, "continuing processing disconnected call with another service"); mCreateConnectionProcessor.continueProcessingIfPossible(this, mDisconnectCause); return false; } else if (newState == CallState.ANSWERED && mState == CallState.ACTIVE) { Log.w(this, "setState %s -> %s; call already active.", CallState.toString(mState), CallState.toString(newState)); return false; } updateVideoHistoryViaState(mState, newState); Loading src/com/android/server/telecom/DefaultDialerCache.java +13 −7 Original line number Diff line number Diff line Loading @@ -133,13 +133,16 @@ public class DefaultDialerCache { private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter; private final TelecomSystem.SyncRoot mLock; private final String mSystemDialerName; private final RoleManagerAdapter mRoleManagerAdapter; private SparseArray<String> mCurrentDefaultDialerPerUser = new SparseArray<>(); public DefaultDialerCache(Context context, DefaultDialerManagerAdapter defaultDialerManagerAdapter, RoleManagerAdapter roleManagerAdapter, TelecomSystem.SyncRoot lock) { mContext = context; mDefaultDialerManagerAdapter = defaultDialerManagerAdapter; mRoleManagerAdapter = roleManagerAdapter; mLock = lock; mSystemDialerName = TelecomServiceImpl.getSystemDialerPackage(mContext); Loading Loading @@ -173,12 +176,15 @@ public class DefaultDialerCache { return null; } synchronized (mLock) { String defaultDialer = mCurrentDefaultDialerPerUser.get(userId); if (defaultDialer != null) { return defaultDialer; } } // TODO: Re-enable this when we are able to use the cache once more. RoleManager does not // provide a means for being informed when the role holder changes at the current time. // //synchronized (mLock) { // String defaultDialer = mCurrentDefaultDialerPerUser.get(userId); // if (defaultDialer != null) { // return defaultDialer; // } //} return refreshCacheForUser(userId); } Loading Loading @@ -206,7 +212,7 @@ public class DefaultDialerCache { private String refreshCacheForUser(int userId) { String currentDefaultDialer = mDefaultDialerManagerAdapter.getDefaultDialerApplication(mContext, userId); mRoleManagerAdapter.getDefaultDialerApp(userId); synchronized (mLock) { mCurrentDefaultDialerPerUser.put(userId, currentDefaultDialer); } Loading src/com/android/server/telecom/RoleManagerAdapter.java +15 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,21 @@ public interface RoleManagerAdapter { */ void setTestDefaultCallScreeningApp(String packageName); /** * Returns the package name of the app which fills the {@link android.app.role.RoleManager} * {@link android.app.role.RoleManager#ROLE_DIALER} role. * @return the package name of the app filling the role, {@code null} otherwise}. */ String getDefaultDialerApp(int user); /** * Override the {@link android.app.role.RoleManager} default dialer app with another value. * Used for testing purposes only. * @param packageName Package name of the app to fill the default dialer role. Where * {@code null}, the override is removed. */ void setTestDefaultDialer(String packageName); /** * @return List of package names of companion apps, or empty list if there are none. */ Loading src/com/android/server/telecom/RoleManagerAdapterImpl.java +24 −0 Original line number Diff line number Diff line Loading @@ -32,10 +32,12 @@ import java.util.stream.Collectors; public class RoleManagerAdapterImpl implements RoleManagerAdapter { private static final String ROLE_CALL_REDIRECTION_APP = RoleManager.ROLE_CALL_REDIRECTION; private static final String ROLE_CALL_SCREENING = RoleManager.ROLE_CALL_SCREENING; private static final String ROLE_DIALER = RoleManager.ROLE_DIALER; private String mOverrideDefaultCallRedirectionApp = null; private String mOverrideDefaultCallScreeningApp = null; private String mOverrideDefaultCarModeApp = null; private String mOverrideDefaultDialerApp = null; private List<String> mOverrideCallCompanionApps = new ArrayList<>(); private Context mContext; private RoleManager mRoleManager; Loading Loading @@ -72,6 +74,19 @@ public class RoleManagerAdapterImpl implements RoleManagerAdapter { mOverrideDefaultCallScreeningApp = packageName; } @Override public String getDefaultDialerApp(int user) { if (mOverrideDefaultDialerApp != null) { return mOverrideDefaultDialerApp; } return getRoleManagerDefaultDialerApp(user); } @Override public void setTestDefaultDialer(String packageName) { mOverrideDefaultDialerApp = packageName; } @Override public List<String> getCallCompanionApps() { List<String> callCompanionApps = new ArrayList<>(); Loading Loading @@ -115,6 +130,15 @@ public class RoleManagerAdapterImpl implements RoleManagerAdapter { return roleHolders.get(0); } private String getRoleManagerDefaultDialerApp(int user) { List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(ROLE_DIALER, new UserHandle(user)); if (roleHolders == null || roleHolders.isEmpty()) { return null; } return roleHolders.get(0); } // TODO in R: query and return car mode apps private String getRoleManagerCarModeDialerApp() { return null; Loading Loading
AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" /> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" /> <uses-permission android:name="android.permission.MANAGE_USERS" /> <uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- Required to determine source of ongoing audio recordings. --> <uses-permission android:name="android.permission.MODIFY_AUDIO_ROUTING" /> Loading
src/com/android/server/telecom/Call.java +6 −1 Original line number Diff line number Diff line Loading @@ -891,12 +891,17 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, */ public boolean setState(int newState, String tag) { if (mState != newState) { Log.v(this, "setState %s -> %s", mState, newState); Log.v(this, "setState %s -> %s", CallState.toString(mState), CallState.toString(newState)); if (newState == CallState.DISCONNECTED && shouldContinueProcessingAfterDisconnect()) { Log.w(this, "continuing processing disconnected call with another service"); mCreateConnectionProcessor.continueProcessingIfPossible(this, mDisconnectCause); return false; } else if (newState == CallState.ANSWERED && mState == CallState.ACTIVE) { Log.w(this, "setState %s -> %s; call already active.", CallState.toString(mState), CallState.toString(newState)); return false; } updateVideoHistoryViaState(mState, newState); Loading
src/com/android/server/telecom/DefaultDialerCache.java +13 −7 Original line number Diff line number Diff line Loading @@ -133,13 +133,16 @@ public class DefaultDialerCache { private final DefaultDialerManagerAdapter mDefaultDialerManagerAdapter; private final TelecomSystem.SyncRoot mLock; private final String mSystemDialerName; private final RoleManagerAdapter mRoleManagerAdapter; private SparseArray<String> mCurrentDefaultDialerPerUser = new SparseArray<>(); public DefaultDialerCache(Context context, DefaultDialerManagerAdapter defaultDialerManagerAdapter, RoleManagerAdapter roleManagerAdapter, TelecomSystem.SyncRoot lock) { mContext = context; mDefaultDialerManagerAdapter = defaultDialerManagerAdapter; mRoleManagerAdapter = roleManagerAdapter; mLock = lock; mSystemDialerName = TelecomServiceImpl.getSystemDialerPackage(mContext); Loading Loading @@ -173,12 +176,15 @@ public class DefaultDialerCache { return null; } synchronized (mLock) { String defaultDialer = mCurrentDefaultDialerPerUser.get(userId); if (defaultDialer != null) { return defaultDialer; } } // TODO: Re-enable this when we are able to use the cache once more. RoleManager does not // provide a means for being informed when the role holder changes at the current time. // //synchronized (mLock) { // String defaultDialer = mCurrentDefaultDialerPerUser.get(userId); // if (defaultDialer != null) { // return defaultDialer; // } //} return refreshCacheForUser(userId); } Loading Loading @@ -206,7 +212,7 @@ public class DefaultDialerCache { private String refreshCacheForUser(int userId) { String currentDefaultDialer = mDefaultDialerManagerAdapter.getDefaultDialerApplication(mContext, userId); mRoleManagerAdapter.getDefaultDialerApp(userId); synchronized (mLock) { mCurrentDefaultDialerPerUser.put(userId, currentDefaultDialer); } Loading
src/com/android/server/telecom/RoleManagerAdapter.java +15 −0 Original line number Diff line number Diff line Loading @@ -64,6 +64,21 @@ public interface RoleManagerAdapter { */ void setTestDefaultCallScreeningApp(String packageName); /** * Returns the package name of the app which fills the {@link android.app.role.RoleManager} * {@link android.app.role.RoleManager#ROLE_DIALER} role. * @return the package name of the app filling the role, {@code null} otherwise}. */ String getDefaultDialerApp(int user); /** * Override the {@link android.app.role.RoleManager} default dialer app with another value. * Used for testing purposes only. * @param packageName Package name of the app to fill the default dialer role. Where * {@code null}, the override is removed. */ void setTestDefaultDialer(String packageName); /** * @return List of package names of companion apps, or empty list if there are none. */ Loading
src/com/android/server/telecom/RoleManagerAdapterImpl.java +24 −0 Original line number Diff line number Diff line Loading @@ -32,10 +32,12 @@ import java.util.stream.Collectors; public class RoleManagerAdapterImpl implements RoleManagerAdapter { private static final String ROLE_CALL_REDIRECTION_APP = RoleManager.ROLE_CALL_REDIRECTION; private static final String ROLE_CALL_SCREENING = RoleManager.ROLE_CALL_SCREENING; private static final String ROLE_DIALER = RoleManager.ROLE_DIALER; private String mOverrideDefaultCallRedirectionApp = null; private String mOverrideDefaultCallScreeningApp = null; private String mOverrideDefaultCarModeApp = null; private String mOverrideDefaultDialerApp = null; private List<String> mOverrideCallCompanionApps = new ArrayList<>(); private Context mContext; private RoleManager mRoleManager; Loading Loading @@ -72,6 +74,19 @@ public class RoleManagerAdapterImpl implements RoleManagerAdapter { mOverrideDefaultCallScreeningApp = packageName; } @Override public String getDefaultDialerApp(int user) { if (mOverrideDefaultDialerApp != null) { return mOverrideDefaultDialerApp; } return getRoleManagerDefaultDialerApp(user); } @Override public void setTestDefaultDialer(String packageName) { mOverrideDefaultDialerApp = packageName; } @Override public List<String> getCallCompanionApps() { List<String> callCompanionApps = new ArrayList<>(); Loading Loading @@ -115,6 +130,15 @@ public class RoleManagerAdapterImpl implements RoleManagerAdapter { return roleHolders.get(0); } private String getRoleManagerDefaultDialerApp(int user) { List<String> roleHolders = mRoleManager.getRoleHoldersAsUser(ROLE_DIALER, new UserHandle(user)); if (roleHolders == null || roleHolders.isEmpty()) { return null; } return roleHolders.get(0); } // TODO in R: query and return car mode apps private String getRoleManagerCarModeDialerApp() { return null; Loading