From 7bdc6d80efe0176d5c708a310ce756bc3c42b6f7 Mon Sep 17 00:00:00 2001 From: Andre Lago Date: Thu, 22 Sep 2016 18:00:41 +0100 Subject: [PATCH] [SettingsProvider] Auto disable ringtone sync Disable the SYNC_PARENT_SOUNDS setting if a work profile ringtone is set Test: cts-tradefed --test com.android.cts.devicepolicy.ManagedProfileTest Bug: 30658854 Change-Id: I172f5396b47f03ac8afa365db0ec90f3a2dd0e29 --- media/java/android/media/IAudioService.aidl | 2 ++ media/java/android/media/RingtoneManager.java | 15 ++++++++++ .../android/server/audio/AudioService.java | 29 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 432e77ccd720c..a76a328e2274e 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -192,5 +192,7 @@ interface IAudioService { oneway void releasePlayer(in int piid); + void disableRingtoneSync(); + // WARNING: read warning at top of file, it is recommended to add new methods at the end } diff --git a/media/java/android/media/RingtoneManager.java b/media/java/android/media/RingtoneManager.java index 7614999074c62..8a1027b83033a 100644 --- a/media/java/android/media/RingtoneManager.java +++ b/media/java/android/media/RingtoneManager.java @@ -33,8 +33,11 @@ import android.database.Cursor; import android.media.MediaScannerConnection.MediaScannerConnectionClient; import android.net.Uri; import android.os.Environment; +import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.Process; +import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.provider.MediaStore; @@ -850,6 +853,18 @@ public class RingtoneManager { public static void setActualDefaultRingtoneUri(Context context, int type, Uri ringtoneUri) { final ContentResolver resolver = context.getContentResolver(); + if (Settings.Secure.getString(resolver, Settings.Secure.SYNC_PARENT_SOUNDS).equals("1")) { + // Sync is enabled, so we need to disable it + IBinder b = ServiceManager.getService(Context.AUDIO_SERVICE); + IAudioService audioService = IAudioService.Stub.asInterface(b); + try { + audioService.disableRingtoneSync(); + } catch (RemoteException e) { + Log.e(TAG, "Unable to disable ringtone sync."); + return; + } + } + String setting = getSettingForType(type); if (setting == null) return; if(!isInternalRingtoneUri(ringtoneUri)) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 0f3f9ce6bfb4c..bd319b9db1524 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -6479,6 +6479,35 @@ public class AudioService extends IAudioService.Stub return mRecordMonitor.getActiveRecordingConfigurations(); } + public void disableRingtoneSync() { + final int callingUserId = UserHandle.getCallingUserId(); + final long token = Binder.clearCallingIdentity(); + try { + UserManager userManager = UserManager.get(mContext); + + // Disable the sync setting + Settings.Secure.putIntForUser(mContentResolver, + Settings.Secure.SYNC_PARENT_SOUNDS, 0 /* false */, callingUserId); + + UserInfo parentInfo = userManager.getProfileParent(callingUserId); + if (parentInfo != null && parentInfo.id != callingUserId) { + // This is a managed profile, so we clone the ringtones from the parent profile + cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.RINGTONE); + cloneRingtoneSetting(callingUserId, parentInfo.id, + Settings.System.NOTIFICATION_SOUND); + cloneRingtoneSetting(callingUserId, parentInfo.id, Settings.System.ALARM_ALERT); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private void cloneRingtoneSetting(int userId, int parentId, String ringtoneSetting) { + String parentSetting = Settings.System.getStringForUser(mContentResolver, ringtoneSetting, + parentId); + Settings.System.putStringForUser(mContentResolver, ringtoneSetting, parentSetting, userId); + } + //====================== // Audio playback notification //======================