diff options
| author | 2017-04-13 20:26:12 +0000 | |
|---|---|---|
| committer | 2017-04-13 20:26:16 +0000 | |
| commit | d2b368a68dfd1447e6590606cf8231dcf00a5bdc (patch) | |
| tree | 9d423359e9fda5940c86aa8d6119064eca731165 | |
| parent | 80b7a214bac14d48c08abeeb4cdd9499a0f40117 (diff) | |
| parent | 359bb74a540ab57db159427d85ac562d56183df1 (diff) | |
Merge "Fix location status bar icon" into oc-dev
6 files changed, 68 insertions, 34 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index b11b15a73093..6522e10e4dfa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -22,7 +22,6 @@ import android.provider.Settings; import android.service.quicksettings.Tile; import android.widget.Switch; -import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.R; @@ -32,7 +31,7 @@ import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.LocationController; -import com.android.systemui.statusbar.policy.LocationController.LocationSettingsChangeCallback; +import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; /** Quick settings tile: Location **/ public class LocationTile extends QSTileImpl<BooleanState> { @@ -132,7 +131,7 @@ public class LocationTile extends QSTileImpl<BooleanState> { } } - private final class Callback implements LocationSettingsChangeCallback, + private final class Callback implements LocationChangeCallback, KeyguardMonitor.Callback { @Override public void onLocationSettingsChanged(boolean enabled) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java index a44493488cf6..c4996193dd2a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -81,7 +81,7 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode { } String location = args.getString("location"); if (location != null) { - int iconId = location.equals("show") ? LocationControllerImpl.LOCATION_STATUS_ICON_ID + int iconId = location.equals("show") ? PhoneStatusBarPolicy.LOCATION_STATUS_ICON_ID : 0; updateSlot("location", null, iconId); } 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 53ec8c5048ad..5910557b539b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -73,6 +73,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceProvisionedListener; import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.KeyguardMonitor; +import com.android.systemui.statusbar.policy.LocationController; +import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.RotationLockController; import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback; @@ -86,11 +88,13 @@ import com.android.systemui.util.NotificationChannels; * strictly doesn't need to. */ public class PhoneStatusBarPolicy implements Callback, Callbacks, - RotationLockControllerCallback, Listener, + RotationLockControllerCallback, Listener, LocationChangeCallback, ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback { private static final String TAG = "PhoneStatusBarPolicy"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + public static final int LOCATION_STATUS_ICON_ID = R.drawable.stat_sys_location; + private final String mSlotCast; private final String mSlotHotspot; private final String mSlotBluetooth; @@ -102,6 +106,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, private final String mSlotRotate; private final String mSlotHeadset; private final String mSlotDataSaver; + private final String mSlotLocation; private final Context mContext; private final Handler mHandler = new Handler(); @@ -117,6 +122,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, private final ZenModeController mZenController; private final DeviceProvisionedController mProvisionedController; private final KeyguardMonitor mKeyguardMonitor; + private final LocationController mLocationController; private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>(); // Assume it's all good unless we hear otherwise. We don't always seem @@ -147,6 +153,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mZenController = Dependency.get(ZenModeController.class); mProvisionedController = Dependency.get(DeviceProvisionedController.class); mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); + mLocationController = Dependency.get(LocationController.class); mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast); mSlotHotspot = context.getString(com.android.internal.R.string.status_bar_hotspot); @@ -160,7 +167,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mSlotRotate = context.getString(com.android.internal.R.string.status_bar_rotate); 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); // listen for broadcasts IntentFilter filter = new IntentFilter(); @@ -229,6 +236,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mNextAlarm.addCallback(mNextAlarmCallback); mDataSaver.addCallback(this); mKeyguardMonitor.addCallback(this); + mLocationController.addCallback(this); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this); SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskListener); @@ -252,6 +260,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, mNextAlarm.removeCallback(mNextAlarmCallback); mDataSaver.removeCallback(this); mKeyguardMonitor.removeCallback(this); + mLocationController.removeCallback(this); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this); mContext.unregisterReceiver(mIntentReceiver); @@ -265,6 +274,21 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, updateVolumeZen(); } + @Override + public void onLocationActiveChanged(boolean active) { + updateLocation(); + } + + // Updates the status view based on the current state of location requests. + private void updateLocation() { + if (mLocationController.isLocationActive()) { + mIconController.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID, + mContext.getString(R.string.accessibility_location_active)); + } else { + mIconController.removeIcon(mSlotLocation); + } + } + private void updateAlarm() { final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT); final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java index 9a5f1b8cbc63..8e8a285f7d45 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java @@ -16,22 +16,29 @@ package com.android.systemui.statusbar.policy; -import com.android.systemui.statusbar.policy.LocationController.LocationSettingsChangeCallback; +import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; -public interface LocationController extends CallbackController<LocationSettingsChangeCallback> { +public interface LocationController extends CallbackController<LocationChangeCallback> { + boolean isLocationActive(); boolean isLocationEnabled(); boolean setLocationEnabled(boolean enabled); /** * A callback for change in location settings (the user has enabled/disabled location). */ - public interface LocationSettingsChangeCallback { + public interface LocationChangeCallback { + /** + * Called whenever location's state changes. + * @param active + */ + default void onLocationActiveChanged(boolean active) {} + /** * Called whenever location settings change. * * @param locationEnabled A value of true indicates that at least one type of location * is enabled in settings. */ - void onLocationSettingsChanged(boolean locationEnabled); + default void onLocationSettingsChanged(boolean locationEnabled) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java index cc61605a5aa6..3f5f5a0ed5ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java @@ -41,9 +41,6 @@ import java.util.List; * A controller to manage changes of location related states and update the views accordingly. */ public class LocationControllerImpl extends BroadcastReceiver implements LocationController { - // The name of the placeholder corresponding to the location request status icon. - // This string corresponds to config_statusBarIcons in core/res/res/values/config.xml. - public static final int LOCATION_STATUS_ICON_ID = R.drawable.stat_sys_location; private static final int[] mHighPowerRequestAppOpArray = new int[] {AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION}; @@ -55,14 +52,12 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private boolean mAreActiveLocationRequests; - private ArrayList<LocationSettingsChangeCallback> mSettingsChangeCallbacks = - new ArrayList<LocationSettingsChangeCallback>(); + private ArrayList<LocationChangeCallback> mSettingsChangeCallbacks = + new ArrayList<LocationChangeCallback>(); private final H mHandler = new H(); - public final String mSlotLocation; public LocationControllerImpl(Context context, Looper bgLooper) { mContext = context; - mSlotLocation = mContext.getString(com.android.internal.R.string.status_bar_location); // Register to listen for changes in location settings. IntentFilter filter = new IntentFilter(); @@ -76,18 +71,17 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio // Examine the current location state and initialize the status view. updateActiveLocationRequests(); - refreshViews(); } /** * Add a callback to listen for changes in location settings. */ - public void addCallback(LocationSettingsChangeCallback cb) { + public void addCallback(LocationChangeCallback cb) { mSettingsChangeCallbacks.add(cb); mHandler.sendEmptyMessage(H.MSG_LOCATION_SETTINGS_CHANGED); } - public void removeCallback(LocationSettingsChangeCallback cb) { + public void removeCallback(LocationChangeCallback cb) { mSettingsChangeCallbacks.remove(cb); } @@ -130,6 +124,11 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio return mode != Settings.Secure.LOCATION_MODE_OFF; } + @Override + public boolean isLocationActive() { + return mAreActiveLocationRequests; + } + /** * Returns true if the current user is restricted from using location. */ @@ -170,22 +169,12 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio return false; } - // Updates the status view based on the current state of location requests. - private void refreshViews() { - if (mAreActiveLocationRequests) { - mStatusBarManager.setIcon(mSlotLocation, LOCATION_STATUS_ICON_ID, - 0, mContext.getString(R.string.accessibility_location_active)); - } else { - mStatusBarManager.removeIcon(mSlotLocation); - } - } - // Reads the active location requests and updates the status view if necessary. private void updateActiveLocationRequests() { boolean hadActiveLocationRequests = mAreActiveLocationRequests; mAreActiveLocationRequests = areActiveHighPowerLocationRequests(); if (mAreActiveLocationRequests != hadActiveLocationRequests) { - refreshViews(); + mHandler.sendEmptyMessage(H.MSG_LOCATION_ACTIVE_CHANGED); } } @@ -201,6 +190,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private final class H extends Handler { private static final int MSG_LOCATION_SETTINGS_CHANGED = 1; + private static final int MSG_LOCATION_ACTIVE_CHANGED = 2; @Override public void handleMessage(Message msg) { @@ -208,12 +198,21 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio case MSG_LOCATION_SETTINGS_CHANGED: locationSettingsChanged(); break; + case MSG_LOCATION_ACTIVE_CHANGED: + locationActiveChanged(); + break; + } + } + + private void locationActiveChanged() { + for (LocationChangeCallback cb : mSettingsChangeCallbacks) { + cb.onLocationActiveChanged(mAreActiveLocationRequests); } } private void locationSettingsChanged() { boolean isEnabled = isLocationEnabled(); - for (LocationSettingsChangeCallback cb : mSettingsChangeCallbacks) { + for (LocationChangeCallback cb : mSettingsChangeCallbacks) { cb.onLocationSettingsChanged(isEnabled); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeLocationController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeLocationController.java index 29d7f1ca85bc..838a2739f0b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeLocationController.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeLocationController.java @@ -17,15 +17,20 @@ package com.android.systemui.utils.leaks; import android.testing.LeakCheck; import com.android.systemui.statusbar.policy.LocationController; -import com.android.systemui.statusbar.policy.LocationController.LocationSettingsChangeCallback; +import com.android.systemui.statusbar.policy.LocationController.LocationChangeCallback; -public class FakeLocationController extends BaseLeakChecker<LocationSettingsChangeCallback> +public class FakeLocationController extends BaseLeakChecker<LocationChangeCallback> implements LocationController { public FakeLocationController(LeakCheck test) { super(test, "location"); } @Override + public boolean isLocationActive() { + return false; + } + + @Override public boolean isLocationEnabled() { return false; } |