summaryrefslogtreecommitdiffstats
path: root/media/java/android/media/FocusRequester.java
diff options
context:
space:
mode:
Diffstat (limited to 'media/java/android/media/FocusRequester.java')
-rw-r--r--media/java/android/media/FocusRequester.java328
1 files changed, 0 insertions, 328 deletions
diff --git a/media/java/android/media/FocusRequester.java b/media/java/android/media/FocusRequester.java
deleted file mode 100644
index bbe5fd2..0000000
--- a/media/java/android/media/FocusRequester.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.NonNull;
-import android.media.MediaFocusControl.AudioFocusDeathHandler;
-import android.os.IBinder;
-import android.util.Log;
-
-import java.io.PrintWriter;
-
-/**
- * @hide
- * Class to handle all the information about a user of audio focus. The lifecycle of each
- * instance is managed by android.media.MediaFocusControl, from its addition to the audio focus
- * stack to its release.
- */
-class FocusRequester {
-
- // on purpose not using this classe's name, as it will only be used from MediaFocusControl
- private static final String TAG = "MediaFocusControl";
- private static final boolean DEBUG = false;
-
- private AudioFocusDeathHandler mDeathHandler;
- private final IAudioFocusDispatcher mFocusDispatcher; // may be null
- private final IBinder mSourceRef;
- private final String mClientId;
- private final String mPackageName;
- private final int mCallingUid;
- private final MediaFocusControl mFocusController; // never null
- /**
- * the audio focus gain request that caused the addition of this object in the focus stack.
- */
- private final int mFocusGainRequest;
- /**
- * the flags associated with the gain request that qualify the type of grant (e.g. accepting
- * delay vs grant must be immediate)
- */
- private final int mGrantFlags;
- /**
- * the audio focus loss received my mFocusDispatcher, is AudioManager.AUDIOFOCUS_NONE if
- * it never lost focus.
- */
- private int mFocusLossReceived;
- /**
- * the audio attributes associated with the focus request
- */
- private final AudioAttributes mAttributes;
-
- /**
- * Class constructor
- * @param aa
- * @param focusRequest
- * @param grantFlags
- * @param afl
- * @param source
- * @param id
- * @param hdlr
- * @param pn
- * @param uid
- * @param ctlr cannot be null
- */
- FocusRequester(AudioAttributes aa, int focusRequest, int grantFlags,
- IAudioFocusDispatcher afl, IBinder source, String id, AudioFocusDeathHandler hdlr,
- String pn, int uid, @NonNull MediaFocusControl ctlr) {
- mAttributes = aa;
- mFocusDispatcher = afl;
- mSourceRef = source;
- mClientId = id;
- mDeathHandler = hdlr;
- mPackageName = pn;
- mCallingUid = uid;
- mFocusGainRequest = focusRequest;
- mGrantFlags = grantFlags;
- mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE;
- mFocusController = ctlr;
- }
-
-
- boolean hasSameClient(String otherClient) {
- try {
- return mClientId.compareTo(otherClient) == 0;
- } catch (NullPointerException e) {
- return false;
- }
- }
-
- boolean isLockedFocusOwner() {
- return ((mGrantFlags & AudioManager.AUDIOFOCUS_FLAG_LOCK) != 0);
- }
-
- boolean hasSameBinder(IBinder ib) {
- return (mSourceRef != null) && mSourceRef.equals(ib);
- }
-
- boolean hasSamePackage(String pack) {
- try {
- return mPackageName.compareTo(pack) == 0;
- } catch (NullPointerException e) {
- return false;
- }
- }
-
- boolean hasSameUid(int uid) {
- return mCallingUid == uid;
- }
-
- String getClientId() {
- return mClientId;
- }
-
- int getGainRequest() {
- return mFocusGainRequest;
- }
-
- int getGrantFlags() {
- return mGrantFlags;
- }
-
- AudioAttributes getAudioAttributes() {
- return mAttributes;
- }
-
-
- private static String focusChangeToString(int focus) {
- switch(focus) {
- case AudioManager.AUDIOFOCUS_NONE:
- return "none";
- case AudioManager.AUDIOFOCUS_GAIN:
- return "GAIN";
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
- return "GAIN_TRANSIENT";
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
- return "GAIN_TRANSIENT_MAY_DUCK";
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
- return "GAIN_TRANSIENT_EXCLUSIVE";
- case AudioManager.AUDIOFOCUS_LOSS:
- return "LOSS";
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
- return "LOSS_TRANSIENT";
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
- return "LOSS_TRANSIENT_CAN_DUCK";
- default:
- return "[invalid focus change" + focus + "]";
- }
- }
-
- private String focusGainToString() {
- return focusChangeToString(mFocusGainRequest);
- }
-
- private String focusLossToString() {
- return focusChangeToString(mFocusLossReceived);
- }
-
- private static String flagsToString(int flags) {
- String msg = new String();
- if ((flags & AudioManager.AUDIOFOCUS_FLAG_DELAY_OK) != 0) {
- msg += "DELAY_OK";
- }
- if ((flags & AudioManager.AUDIOFOCUS_FLAG_LOCK) != 0) {
- if (!msg.isEmpty()) { msg += "|"; }
- msg += "LOCK";
- }
- if ((flags & AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS) != 0) {
- if (!msg.isEmpty()) { msg += "|"; }
- msg += "PAUSES_ON_DUCKABLE_LOSS";
- }
- return msg;
- }
-
- void dump(PrintWriter pw) {
- pw.println(" source:" + mSourceRef
- + " -- pack: " + mPackageName
- + " -- client: " + mClientId
- + " -- gain: " + focusGainToString()
- + " -- flags: " + flagsToString(mGrantFlags)
- + " -- loss: " + focusLossToString()
- + " -- uid: " + mCallingUid
- + " -- attr: " + mAttributes);
- }
-
-
- void release() {
- try {
- if (mSourceRef != null && mDeathHandler != null) {
- mSourceRef.unlinkToDeath(mDeathHandler, 0);
- mDeathHandler = null;
- }
- } catch (java.util.NoSuchElementException e) {
- Log.e(TAG, "FocusRequester.release() hit ", e);
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- release();
- super.finalize();
- }
-
- /**
- * For a given audio focus gain request, return the audio focus loss type that will result
- * from it, taking into account any previous focus loss.
- * @param gainRequest
- * @return the audio focus loss type that matches the gain request
- */
- private int focusLossForGainRequest(int gainRequest) {
- switch(gainRequest) {
- case AudioManager.AUDIOFOCUS_GAIN:
- switch(mFocusLossReceived) {
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
- case AudioManager.AUDIOFOCUS_LOSS:
- case AudioManager.AUDIOFOCUS_NONE:
- return AudioManager.AUDIOFOCUS_LOSS;
- }
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
- switch(mFocusLossReceived) {
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
- case AudioManager.AUDIOFOCUS_NONE:
- return AudioManager.AUDIOFOCUS_LOSS_TRANSIENT;
- case AudioManager.AUDIOFOCUS_LOSS:
- return AudioManager.AUDIOFOCUS_LOSS;
- }
- case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
- switch(mFocusLossReceived) {
- case AudioManager.AUDIOFOCUS_NONE:
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
- return AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK;
- case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
- return AudioManager.AUDIOFOCUS_LOSS_TRANSIENT;
- case AudioManager.AUDIOFOCUS_LOSS:
- return AudioManager.AUDIOFOCUS_LOSS;
- }
- default:
- Log.e(TAG, "focusLossForGainRequest() for invalid focus request "+ gainRequest);
- return AudioManager.AUDIOFOCUS_NONE;
- }
- }
-
- /**
- * Called synchronized on MediaFocusControl.mAudioFocusLock
- */
- void handleExternalFocusGain(int focusGain) {
- int focusLoss = focusLossForGainRequest(focusGain);
- handleFocusLoss(focusLoss);
- }
-
- /**
- * Called synchronized on MediaFocusControl.mAudioFocusLock
- */
- void handleFocusGain(int focusGain) {
- try {
- mFocusLossReceived = AudioManager.AUDIOFOCUS_NONE;
- mFocusController.notifyExtPolicyFocusGrant_syncAf(toAudioFocusInfo(),
- AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
- if (mFocusDispatcher != null) {
- if (DEBUG) {
- Log.v(TAG, "dispatching " + focusChangeToString(focusGain) + " to "
- + mClientId);
- }
- mFocusDispatcher.dispatchAudioFocusChange(focusGain, mClientId);
- }
- } catch (android.os.RemoteException e) {
- Log.e(TAG, "Failure to signal gain of audio focus due to: ", e);
- }
- }
-
- /**
- * Called synchronized on MediaFocusControl.mAudioFocusLock
- */
- void handleFocusLoss(int focusLoss) {
- try {
- if (focusLoss != mFocusLossReceived) {
- mFocusLossReceived = focusLoss;
- // before dispatching a focus loss, check if the following conditions are met:
- // 1/ the framework is not supposed to notify the focus loser on a DUCK loss
- // 2/ it is a DUCK loss
- // 3/ the focus loser isn't flagged as pausing in a DUCK loss
- // if they are, do not notify the focus loser
- if (!mFocusController.mustNotifyFocusOwnerOnDuck()
- && mFocusLossReceived == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
- && (mGrantFlags
- & AudioManager.AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS) == 0) {
- if (DEBUG) {
- Log.v(TAG, "NOT dispatching " + focusChangeToString(mFocusLossReceived)
- + " to " + mClientId + ", to be handled externally");
- }
- mFocusController.notifyExtPolicyFocusLoss_syncAf(
- toAudioFocusInfo(), false /* wasDispatched */);
- return;
- }
- if (mFocusDispatcher != null) {
- if (DEBUG) {
- Log.v(TAG, "dispatching " + focusChangeToString(mFocusLossReceived) + " to "
- + mClientId);
- }
- mFocusController.notifyExtPolicyFocusLoss_syncAf(
- toAudioFocusInfo(), true /* wasDispatched */);
- mFocusDispatcher.dispatchAudioFocusChange(mFocusLossReceived, mClientId);
- }
- }
- } catch (android.os.RemoteException e) {
- Log.e(TAG, "Failure to signal loss of audio focus due to:", e);
- }
- }
-
- AudioFocusInfo toAudioFocusInfo() {
- return new AudioFocusInfo(mAttributes, mClientId, mPackageName,
- mFocusGainRequest, mFocusLossReceived, mGrantFlags);
- }
-}