pw.println(prefix + mTag + " " + this);
final String indent = prefix + " ";
- // We print the hashcode for matching with the list in user records
pw.println(indent + "ownerPid=" + mOwnerPid + ", ownerUid=" + mOwnerUid
+ ", userId=" + mUserId);
pw.println(indent + "package=" + mPackageName);
+ pw.println(indent + "launchIntent=" + mLaunchIntent);
+ pw.println(indent + "mediaButtonReceiver=" + mMediaButtonReceiver);
pw.println(indent + "active=" + mIsActive);
pw.println(indent + "flags=" + mFlags);
pw.println(indent + "rating type=" + mRatingType);
pw.println(indent + "controllers: " + mControllerCallbacks.size());
pw.println(indent + "state=" + (mPlaybackState == null ? null : mPlaybackState.toString()));
+ pw.println(indent + "audioAttrs=" + mAudioAttrs);
+ pw.println(indent + "volumeType=" + mVolumeType + ", controlType=" + mVolumeControlType
+ + ", max=" + mMaxVolume + ", current=" + mCurrentVolume);
pw.println(indent + "metadata:" + getShortMetadataString());
+ pw.println(indent + "queueTitle=" + mQueueTitle + ", size="
+ + (mQueue == null ? 0 : mQueue.getList().size()));
}
@Override
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.database.ContentObserver;
import android.media.AudioManager;
import android.media.IAudioService;
import android.media.IRemoteVolumeController;
import android.media.session.ISessionCallback;
import android.media.session.ISessionManager;
import android.media.session.MediaSession;
+import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
private KeyguardManager mKeyguardManager;
private IAudioService mAudioService;
private ContentResolver mContentResolver;
+ private SettingsObserver mSettingsObserver;
private MediaSessionRecord mPrioritySession;
private int mCurrentUserId = -1;
(KeyguardManager) getContext().getSystemService(Context.KEYGUARD_SERVICE);
mAudioService = getAudioService();
mContentResolver = getContext().getContentResolver();
+ mSettingsObserver = new SettingsObserver();
+ mSettingsObserver.observe();
}
private IAudioService getAudioService() {
}
}
+ private void updateActiveSessionListeners() {
+ synchronized (mLock) {
+ for (int i = mSessionsListeners.size() - 1; i >= 0; i--) {
+ SessionsListenerRecord listener = mSessionsListeners.get(i);
+ try {
+ enforceMediaPermissions(listener.mComponentName, listener.mPid, listener.mUid,
+ listener.mUserId);
+ } catch (SecurityException e) {
+ Log.i(TAG, "ActiveSessionsListener " + listener.mComponentName
+ + " is no longer authorized. Disconnecting.");
+ mSessionsListeners.remove(i);
+ try {
+ listener.mListener
+ .onActiveSessionsChanged(new ArrayList<MediaSession.Token>());
+ } catch (Exception e1) {
+ // ignore
+ }
+ }
+ }
+ }
+ }
+
/**
* Stop the user and unbind from everything.
*
final class SessionsListenerRecord implements IBinder.DeathRecipient {
private final IActiveSessionsListener mListener;
+ private final ComponentName mComponentName;
private final int mUserId;
+ private final int mPid;
+ private final int mUid;
- public SessionsListenerRecord(IActiveSessionsListener listener, int userId) {
+ public SessionsListenerRecord(IActiveSessionsListener listener,
+ ComponentName componentName,
+ int userId, int pid, int uid) {
mListener = listener;
+ mComponentName = componentName;
mUserId = userId;
+ mPid = pid;
+ mUid = uid;
}
@Override
}
}
+ final class SettingsObserver extends ContentObserver {
+ private final Uri mSecureSettingsUri = Settings.Secure.getUriFor(
+ Settings.Secure.ENABLED_NOTIFICATION_LISTENERS);
+
+ private SettingsObserver() {
+ super(null);
+ }
+
+ private void observe() {
+ mContentResolver.registerContentObserver(mSecureSettingsUri,
+ false, this, UserHandle.USER_ALL);
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateActiveSessionListeners();
+ }
+ }
+
class SessionManagerImpl extends ISessionManager.Stub {
private static final String EXTRA_WAKELOCK_ACQUIRED =
"android.media.AudioService.WAKELOCK_ACQUIRED";
return;
}
SessionsListenerRecord record = new SessionsListenerRecord(listener,
- resolvedUserId);
+ componentName, resolvedUserId, pid, uid);
try {
listener.asBinder().linkToDeath(record, 0);
} catch (RemoteException e) {