diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 6ae183b99942f..d892ad2c44eed 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -55,6 +55,8 @@ @string/status_bar_hotspot @string/status_bar_mobile @string/status_bar_airplane + @string/status_bar_microphone + @string/status_bar_camera @string/status_bar_battery @@ -87,6 +89,8 @@ mobile vpn ethernet + microphone + camera airplane diff --git a/packages/SystemUI/res/drawable/stat_sys_camera.xml b/packages/SystemUI/res/drawable/stat_sys_camera.xml new file mode 100644 index 0000000000000..eb3e9632dd357 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_camera.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_mic_none.xml b/packages/SystemUI/res/drawable/stat_sys_mic_none.xml new file mode 100644 index 0000000000000..d6bdf9fbaa786 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_mic_none.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt index f4099021a0bd9..3d9aa0ff083fc 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItem.kt @@ -23,9 +23,9 @@ import com.android.systemui.R typealias Privacy = PrivacyType enum class PrivacyType(val nameId: Int, val iconId: Int) { - TYPE_CAMERA(R.string.privacy_type_camera, com.android.internal.R.drawable.ic_camera), + TYPE_CAMERA(R.string.privacy_type_camera, R.drawable.stat_sys_camera), TYPE_LOCATION(R.string.privacy_type_location, R.drawable.stat_sys_location), - TYPE_MICROPHONE(R.string.privacy_type_microphone, R.drawable.ic_mic_26dp); + TYPE_MICROPHONE(R.string.privacy_type_microphone, R.drawable.stat_sys_mic_none); fun getName(context: Context) = context.resources.getString(nameId) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 0e6efc8472b61..c84f3db8acb03 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -66,6 +66,8 @@ import com.android.systemui.DockedStackExistsListener; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.UiOffloadThread; +import com.android.systemui.privacy.PrivacyItem; +import com.android.systemui.privacy.PrivacyItemController; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.shared.system.ActivityManagerWrapper; @@ -101,7 +103,8 @@ import java.util.Locale; */ public class PhoneStatusBarPolicy implements Callback, Callbacks, RotationLockControllerCallback, Listener, LocationChangeCallback, - ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback { + ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback, + PrivacyItemController.Callback { private static final String TAG = "PhoneStatusBarPolicy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -120,6 +123,8 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, private final String mSlotHeadset; private final String mSlotDataSaver; private final String mSlotLocation; + private final String mSlotMicrophone; + private final String mSlotCamera; private final Context mContext; private final Handler mHandler = new Handler(); @@ -136,6 +141,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, private final DeviceProvisionedController mProvisionedController; private final KeyguardMonitor mKeyguardMonitor; private final LocationController mLocationController; + private final PrivacyItemController mPrivacyItemController; private final ArraySet> mCurrentNotifs = new ArraySet<>(); private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); @@ -169,6 +175,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mProvisionedController = Dependency.get(DeviceProvisionedController.class); mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); mLocationController = Dependency.get(LocationController.class); + mPrivacyItemController = new PrivacyItemController(mContext, this); mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast); mSlotHotspot = context.getString(com.android.internal.R.string.status_bar_hotspot); @@ -183,6 +190,8 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset); mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver); mSlotLocation = context.getString(com.android.internal.R.string.status_bar_location); + mSlotMicrophone = context.getString(com.android.internal.R.string.status_bar_microphone); + mSlotCamera = context.getString(com.android.internal.R.string.status_bar_camera); // listen for broadcasts IntentFilter filter = new IntentFilter(); @@ -241,6 +250,12 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, context.getString(R.string.accessibility_data_saver_on)); mIconController.setIconVisibility(mSlotDataSaver, false); + // privacy items + mIconController.setIcon(mSlotMicrophone, R.drawable.stat_sys_mic_none, null); + mIconController.setIconVisibility(mSlotMicrophone, false); + mIconController.setIcon(mSlotCamera, R.drawable.stat_sys_camera, null); + mIconController.setIconVisibility(mSlotCamera, false); + mRotationLockController.addCallback(this); mBluetooth.addCallback(this); mProvisionedController.addCallback(this); @@ -251,6 +266,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mDataSaver.addCallback(this); mKeyguardMonitor.addCallback(this); mLocationController.addCallback(this); + mPrivacyItemController.setListening(true); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this); ActivityManagerWrapper.getInstance().registerTaskStackListener(mTaskListener); @@ -279,6 +295,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mDataSaver.removeCallback(this); mKeyguardMonitor.removeCallback(this); mLocationController.removeCallback(this); + mPrivacyItemController.setListening(false); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this); mContext.unregisterReceiver(mIntentReceiver); @@ -798,6 +815,34 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mIconController.setIconVisibility(mSlotDataSaver, isDataSaving); } + @Override // PrivacyItemController.Callback + public void privacyChanged(List privacyItems) { + updatePrivacyItems(privacyItems); + } + + private void updatePrivacyItems(List items) { + boolean showCamera = false; + boolean showMicrophone = false; + boolean showLocation = false; + for (PrivacyItem item : items) { + switch (item.getPrivacyType()) { + case TYPE_CAMERA: + showCamera = true; + break; + case TYPE_LOCATION: + showLocation = true; + break; + case TYPE_MICROPHONE: + showMicrophone = true; + break; + } + } + + mIconController.setIconVisibility(mSlotCamera, showCamera); + mIconController.setIconVisibility(mSlotMicrophone, showMicrophone); + mIconController.setIconVisibility(mSlotLocation, showLocation); + } + private final TaskStackChangeListener mTaskListener = new TaskStackChangeListener() { @Override public void onTaskStackChanged() {