1717package com .android .systemui .media ;
1818
1919import android .content .Context ;
20+ import android .content .pm .PackageManager .NameNotFoundException ;
2021import android .media .IAudioService ;
2122import android .media .IRingtonePlayer ;
2223import android .media .Ringtone ;
2627import android .os .Process ;
2728import android .os .RemoteException ;
2829import android .os .ServiceManager ;
30+ import android .os .UserHandle ;
2931import android .util .Slog ;
3032
3133import com .android .systemui .SystemUI ;
@@ -70,9 +72,10 @@ private class Client implements IBinder.DeathRecipient {
7072 private final IBinder mToken ;
7173 private final Ringtone mRingtone ;
7274
73- public Client (IBinder token , Uri uri , int streamType ) {
75+ public Client (IBinder token , Uri uri , UserHandle user , int streamType ) {
7476 mToken = token ;
75- mRingtone = new Ringtone (mContext , false );
77+
78+ mRingtone = new Ringtone (getContextForUser (user ), false );
7679 mRingtone .setStreamType (streamType );
7780 mRingtone .setUri (uri );
7881 }
@@ -90,12 +93,16 @@ public void binderDied() {
9093 private IRingtonePlayer mCallback = new IRingtonePlayer .Stub () {
9194 @ Override
9295 public void play (IBinder token , Uri uri , int streamType ) throws RemoteException {
93- if (LOGD ) Slog .d (TAG , "play(token=" + token + ", uri=" + uri + ")" );
96+ if (LOGD ) {
97+ Slog .d (TAG , "play(token=" + token + ", uri=" + uri + ", uid="
98+ + Binder .getCallingUid () + ")" );
99+ }
94100 Client client ;
95101 synchronized (mClients ) {
96102 client = mClients .get (token );
97103 if (client == null ) {
98- client = new Client (token , uri , streamType );
104+ final UserHandle user = Binder .getCallingUserHandle ();
105+ client = new Client (token , uri , user , streamType );
99106 token .linkToDeath (client , 0 );
100107 mClients .put (token , client );
101108 }
@@ -131,12 +138,13 @@ public boolean isPlaying(IBinder token) {
131138 }
132139
133140 @ Override
134- public void playAsync (Uri uri , boolean looping , int streamType ) {
135- if (LOGD ) Slog .d (TAG , "playAsync(uri=" + uri + ")" );
141+ public void playAsync (Uri uri , UserHandle user , boolean looping , int streamType ) {
142+ if (LOGD ) Slog .d (TAG , "playAsync(uri=" + uri + ", user=" + user + " )" );
136143 if (Binder .getCallingUid () != Process .SYSTEM_UID ) {
137144 throw new SecurityException ("Async playback only available from system UID." );
138145 }
139- mAsyncPlayer .play (mContext , uri , looping , streamType );
146+
147+ mAsyncPlayer .play (getContextForUser (user ), uri , looping , streamType );
140148 }
141149
142150 @ Override
@@ -149,6 +157,14 @@ public void stopAsync() {
149157 }
150158 };
151159
160+ private Context getContextForUser (UserHandle user ) {
161+ try {
162+ return mContext .createPackageContextAsUser (mContext .getPackageName (), 0 , user );
163+ } catch (NameNotFoundException e ) {
164+ throw new RuntimeException (e );
165+ }
166+ }
167+
152168 @ Override
153169 public void dump (FileDescriptor fd , PrintWriter pw , String [] args ) {
154170 pw .println ("Clients:" );
0 commit comments