Merge "Observe mic mute changes, consider recordingss paused when muted" into rvc-qpr-dev am: b2bf4c16d1
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12602903 Change-Id: I239515cf2201da9190269e29f8887e27404536b1
This commit is contained in:
@@ -16,8 +16,13 @@
|
||||
|
||||
package com.android.systemui.appops;
|
||||
|
||||
import static android.media.AudioManager.ACTION_MICROPHONE_MUTE_CHANGED;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.location.LocationManager;
|
||||
import android.media.AudioManager;
|
||||
@@ -35,6 +40,7 @@ import androidx.annotation.WorkerThread;
|
||||
import com.android.internal.annotations.GuardedBy;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.systemui.Dumpable;
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
|
||||
@@ -54,7 +60,7 @@ import javax.inject.Singleton;
|
||||
* NotificationPresenter to be displayed to the user.
|
||||
*/
|
||||
@Singleton
|
||||
public class AppOpsControllerImpl implements AppOpsController,
|
||||
public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsController,
|
||||
AppOpsManager.OnOpActiveChangedInternalListener,
|
||||
AppOpsManager.OnOpNotedListener, Dumpable {
|
||||
|
||||
@@ -65,6 +71,7 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
private static final String TAG = "AppOpsControllerImpl";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
private final BroadcastDispatcher mDispatcher;
|
||||
private final AppOpsManager mAppOps;
|
||||
private final AudioManager mAudioManager;
|
||||
private final LocationManager mLocationManager;
|
||||
@@ -79,6 +86,7 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
private final ArrayMap<Integer, Set<Callback>> mCallbacksByCode = new ArrayMap<>();
|
||||
private final PermissionFlagsCache mFlagsCache;
|
||||
private boolean mListening;
|
||||
private boolean mMicMuted;
|
||||
|
||||
@GuardedBy("mActiveItems")
|
||||
private final List<AppOpItem> mActiveItems = new ArrayList<>();
|
||||
@@ -104,8 +112,10 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
@Background Looper bgLooper,
|
||||
DumpManager dumpManager,
|
||||
PermissionFlagsCache cache,
|
||||
AudioManager audioManager
|
||||
AudioManager audioManager,
|
||||
BroadcastDispatcher dispatcher
|
||||
) {
|
||||
mDispatcher = dispatcher;
|
||||
mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
|
||||
mFlagsCache = cache;
|
||||
mBGHandler = new H(bgLooper);
|
||||
@@ -114,6 +124,7 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
mCallbacksByCode.put(OPS[i], new ArraySet<>());
|
||||
}
|
||||
mAudioManager = audioManager;
|
||||
mMicMuted = audioManager.isMicrophoneMute();
|
||||
mLocationManager = context.getSystemService(LocationManager.class);
|
||||
dumpManager.registerDumpable(TAG, this);
|
||||
}
|
||||
@@ -132,6 +143,8 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
mAudioManager.registerAudioRecordingCallback(mAudioRecordingCallback, mBGHandler);
|
||||
mBGHandler.post(() -> mAudioRecordingCallback.onRecordingConfigChanged(
|
||||
mAudioManager.getActiveRecordingConfigurations()));
|
||||
mDispatcher.registerReceiverWithHandler(this,
|
||||
new IntentFilter(ACTION_MICROPHONE_MUTE_CHANGED), mBGHandler);
|
||||
|
||||
} else {
|
||||
mAppOps.stopWatchingActive(this);
|
||||
@@ -139,6 +152,7 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
mAudioManager.unregisterAudioRecordingCallback(mAudioRecordingCallback);
|
||||
|
||||
mBGHandler.removeCallbacksAndMessages(null); // null removes all
|
||||
mDispatcher.unregisterReceiver(this);
|
||||
synchronized (mActiveItems) {
|
||||
mActiveItems.clear();
|
||||
mRecordingsByUid.clear();
|
||||
@@ -466,6 +480,9 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
}
|
||||
|
||||
private boolean isAnyRecordingPausedLocked(int uid) {
|
||||
if (mMicMuted) {
|
||||
return true;
|
||||
}
|
||||
List<AudioRecordingConfiguration> configs = mRecordingsByUid.get(uid);
|
||||
if (configs == null) return false;
|
||||
int configsNum = configs.size();
|
||||
@@ -520,6 +537,12 @@ public class AppOpsControllerImpl implements AppOpsController,
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
mMicMuted = mAudioManager.isMicrophoneMute();
|
||||
updateRecordingPausedStatus();
|
||||
}
|
||||
|
||||
protected class H extends Handler {
|
||||
H(Looper looper) {
|
||||
super(looper);
|
||||
|
||||
@@ -47,6 +47,7 @@ import android.testing.TestableLooper;
|
||||
import androidx.test.filters.SmallTest;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
import com.android.systemui.dump.DumpManager;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -82,6 +83,8 @@ public class AppOpsControllerTest extends SysuiTestCase {
|
||||
private PackageManager mPackageManager;
|
||||
@Mock(stubOnly = true)
|
||||
private AudioManager mAudioManager;
|
||||
@Mock()
|
||||
private BroadcastDispatcher mDispatcher;
|
||||
@Mock(stubOnly = true)
|
||||
private AudioManager.AudioRecordingCallback mRecordingCallback;
|
||||
@Mock(stubOnly = true)
|
||||
@@ -120,7 +123,8 @@ public class AppOpsControllerTest extends SysuiTestCase {
|
||||
mTestableLooper.getLooper(),
|
||||
mDumpManager,
|
||||
mFlagsCache,
|
||||
mAudioManager
|
||||
mAudioManager,
|
||||
mDispatcher
|
||||
);
|
||||
}
|
||||
|
||||
@@ -128,12 +132,14 @@ public class AppOpsControllerTest extends SysuiTestCase {
|
||||
public void testOnlyListenForFewOps() {
|
||||
mController.setListening(true);
|
||||
verify(mAppOpsManager, times(1)).startWatchingActive(AppOpsControllerImpl.OPS, mController);
|
||||
verify(mDispatcher, times(1)).registerReceiverWithHandler(eq(mController), any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStopListening() {
|
||||
mController.setListening(false);
|
||||
verify(mAppOpsManager, times(1)).stopWatchingActive(mController);
|
||||
verify(mDispatcher, times(1)).unregisterReceiver(mController);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user