Merge "Fix location status bar icon" into oc-dev

am: d2b368a68d

Change-Id: Ibe7699d1ad05a5c261620838a270faf99ba66697
This commit is contained in:
Jason Monk
2017-04-13 20:35:37 +00:00
committed by android-build-merger
6 changed files with 68 additions and 34 deletions

View File

@@ -22,7 +22,6 @@ import android.provider.Settings;
import android.service.quicksettings.Tile; import android.service.quicksettings.Tile;
import android.widget.Switch; import android.widget.Switch;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.R; 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.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.LocationController; 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 **/ /** Quick settings tile: Location **/
public class LocationTile extends QSTileImpl<BooleanState> { 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 { KeyguardMonitor.Callback {
@Override @Override
public void onLocationSettingsChanged(boolean enabled) { public void onLocationSettingsChanged(boolean enabled) {

View File

@@ -81,7 +81,7 @@ public class DemoStatusIcons extends LinearLayout implements DemoMode {
} }
String location = args.getString("location"); String location = args.getString("location");
if (location != null) { if (location != null) {
int iconId = location.equals("show") ? LocationControllerImpl.LOCATION_STATUS_ICON_ID int iconId = location.equals("show") ? PhoneStatusBarPolicy.LOCATION_STATUS_ICON_ID
: 0; : 0;
updateSlot("location", null, iconId); updateSlot("location", null, iconId);
} }

View File

@@ -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.DeviceProvisionedController.DeviceProvisionedListener;
import com.android.systemui.statusbar.policy.HotspotController; import com.android.systemui.statusbar.policy.HotspotController;
import com.android.systemui.statusbar.policy.KeyguardMonitor; 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.NextAlarmController;
import com.android.systemui.statusbar.policy.RotationLockController; import com.android.systemui.statusbar.policy.RotationLockController;
import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback; import com.android.systemui.statusbar.policy.RotationLockController.RotationLockControllerCallback;
@@ -86,11 +88,13 @@ import com.android.systemui.util.NotificationChannels;
* strictly doesn't need to. * strictly doesn't need to.
*/ */
public class PhoneStatusBarPolicy implements Callback, Callbacks, public class PhoneStatusBarPolicy implements Callback, Callbacks,
RotationLockControllerCallback, Listener, RotationLockControllerCallback, Listener, LocationChangeCallback,
ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback { ZenModeController.Callback, DeviceProvisionedListener, KeyguardMonitor.Callback {
private static final String TAG = "PhoneStatusBarPolicy"; private static final String TAG = "PhoneStatusBarPolicy";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 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 mSlotCast;
private final String mSlotHotspot; private final String mSlotHotspot;
private final String mSlotBluetooth; private final String mSlotBluetooth;
@@ -102,6 +106,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
private final String mSlotRotate; private final String mSlotRotate;
private final String mSlotHeadset; private final String mSlotHeadset;
private final String mSlotDataSaver; private final String mSlotDataSaver;
private final String mSlotLocation;
private final Context mContext; private final Context mContext;
private final Handler mHandler = new Handler(); private final Handler mHandler = new Handler();
@@ -117,6 +122,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
private final ZenModeController mZenController; private final ZenModeController mZenController;
private final DeviceProvisionedController mProvisionedController; private final DeviceProvisionedController mProvisionedController;
private final KeyguardMonitor mKeyguardMonitor; private final KeyguardMonitor mKeyguardMonitor;
private final LocationController mLocationController;
private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>(); private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>();
// Assume it's all good unless we hear otherwise. We don't always seem // 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); mZenController = Dependency.get(ZenModeController.class);
mProvisionedController = Dependency.get(DeviceProvisionedController.class); mProvisionedController = Dependency.get(DeviceProvisionedController.class);
mKeyguardMonitor = Dependency.get(KeyguardMonitor.class); mKeyguardMonitor = Dependency.get(KeyguardMonitor.class);
mLocationController = Dependency.get(LocationController.class);
mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast); mSlotCast = context.getString(com.android.internal.R.string.status_bar_cast);
mSlotHotspot = context.getString(com.android.internal.R.string.status_bar_hotspot); 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); mSlotRotate = context.getString(com.android.internal.R.string.status_bar_rotate);
mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset); mSlotHeadset = context.getString(com.android.internal.R.string.status_bar_headset);
mSlotDataSaver = context.getString(com.android.internal.R.string.status_bar_data_saver); 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 // listen for broadcasts
IntentFilter filter = new IntentFilter(); IntentFilter filter = new IntentFilter();
@@ -229,6 +236,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
mNextAlarm.addCallback(mNextAlarmCallback); mNextAlarm.addCallback(mNextAlarmCallback);
mDataSaver.addCallback(this); mDataSaver.addCallback(this);
mKeyguardMonitor.addCallback(this); mKeyguardMonitor.addCallback(this);
mLocationController.addCallback(this);
SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).addCallbacks(this);
SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskListener); SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskListener);
@@ -252,6 +260,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
mNextAlarm.removeCallback(mNextAlarmCallback); mNextAlarm.removeCallback(mNextAlarmCallback);
mDataSaver.removeCallback(this); mDataSaver.removeCallback(this);
mKeyguardMonitor.removeCallback(this); mKeyguardMonitor.removeCallback(this);
mLocationController.removeCallback(this);
SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this); SysUiServiceProvider.getComponent(mContext, CommandQueue.class).removeCallbacks(this);
mContext.unregisterReceiver(mIntentReceiver); mContext.unregisterReceiver(mIntentReceiver);
@@ -265,6 +274,21 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks,
updateVolumeZen(); 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() { private void updateAlarm() {
final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT); final AlarmClockInfo alarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0; final boolean hasAlarm = alarm != null && alarm.getTriggerTime() > 0;

View File

@@ -16,22 +16,29 @@
package com.android.systemui.statusbar.policy; 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 isLocationEnabled();
boolean setLocationEnabled(boolean enabled); boolean setLocationEnabled(boolean enabled);
/** /**
* A callback for change in location settings (the user has enabled/disabled location). * 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. * Called whenever location settings change.
* *
* @param locationEnabled A value of true indicates that at least one type of location * @param locationEnabled A value of true indicates that at least one type of location
* is enabled in settings. * is enabled in settings.
*/ */
void onLocationSettingsChanged(boolean locationEnabled); default void onLocationSettingsChanged(boolean locationEnabled) {}
} }
} }

View File

@@ -41,9 +41,6 @@ import java.util.List;
* A controller to manage changes of location related states and update the views accordingly. * A controller to manage changes of location related states and update the views accordingly.
*/ */
public class LocationControllerImpl extends BroadcastReceiver implements LocationController { 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 private static final int[] mHighPowerRequestAppOpArray
= new int[] {AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION}; = new int[] {AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION};
@@ -55,14 +52,12 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
private boolean mAreActiveLocationRequests; private boolean mAreActiveLocationRequests;
private ArrayList<LocationSettingsChangeCallback> mSettingsChangeCallbacks = private ArrayList<LocationChangeCallback> mSettingsChangeCallbacks =
new ArrayList<LocationSettingsChangeCallback>(); new ArrayList<LocationChangeCallback>();
private final H mHandler = new H(); private final H mHandler = new H();
public final String mSlotLocation;
public LocationControllerImpl(Context context, Looper bgLooper) { public LocationControllerImpl(Context context, Looper bgLooper) {
mContext = context; mContext = context;
mSlotLocation = mContext.getString(com.android.internal.R.string.status_bar_location);
// Register to listen for changes in location settings. // Register to listen for changes in location settings.
IntentFilter filter = new IntentFilter(); 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. // Examine the current location state and initialize the status view.
updateActiveLocationRequests(); updateActiveLocationRequests();
refreshViews();
} }
/** /**
* Add a callback to listen for changes in location settings. * Add a callback to listen for changes in location settings.
*/ */
public void addCallback(LocationSettingsChangeCallback cb) { public void addCallback(LocationChangeCallback cb) {
mSettingsChangeCallbacks.add(cb); mSettingsChangeCallbacks.add(cb);
mHandler.sendEmptyMessage(H.MSG_LOCATION_SETTINGS_CHANGED); mHandler.sendEmptyMessage(H.MSG_LOCATION_SETTINGS_CHANGED);
} }
public void removeCallback(LocationSettingsChangeCallback cb) { public void removeCallback(LocationChangeCallback cb) {
mSettingsChangeCallbacks.remove(cb); mSettingsChangeCallbacks.remove(cb);
} }
@@ -130,6 +124,11 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
return mode != Settings.Secure.LOCATION_MODE_OFF; return mode != Settings.Secure.LOCATION_MODE_OFF;
} }
@Override
public boolean isLocationActive() {
return mAreActiveLocationRequests;
}
/** /**
* Returns true if the current user is restricted from using location. * Returns true if the current user is restricted from using location.
*/ */
@@ -170,22 +169,12 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
return false; 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. // Reads the active location requests and updates the status view if necessary.
private void updateActiveLocationRequests() { private void updateActiveLocationRequests() {
boolean hadActiveLocationRequests = mAreActiveLocationRequests; boolean hadActiveLocationRequests = mAreActiveLocationRequests;
mAreActiveLocationRequests = areActiveHighPowerLocationRequests(); mAreActiveLocationRequests = areActiveHighPowerLocationRequests();
if (mAreActiveLocationRequests != hadActiveLocationRequests) { 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 final class H extends Handler {
private static final int MSG_LOCATION_SETTINGS_CHANGED = 1; private static final int MSG_LOCATION_SETTINGS_CHANGED = 1;
private static final int MSG_LOCATION_ACTIVE_CHANGED = 2;
@Override @Override
public void handleMessage(Message msg) { public void handleMessage(Message msg) {
@@ -208,12 +198,21 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio
case MSG_LOCATION_SETTINGS_CHANGED: case MSG_LOCATION_SETTINGS_CHANGED:
locationSettingsChanged(); locationSettingsChanged();
break; break;
case MSG_LOCATION_ACTIVE_CHANGED:
locationActiveChanged();
break;
}
}
private void locationActiveChanged() {
for (LocationChangeCallback cb : mSettingsChangeCallbacks) {
cb.onLocationActiveChanged(mAreActiveLocationRequests);
} }
} }
private void locationSettingsChanged() { private void locationSettingsChanged() {
boolean isEnabled = isLocationEnabled(); boolean isEnabled = isLocationEnabled();
for (LocationSettingsChangeCallback cb : mSettingsChangeCallbacks) { for (LocationChangeCallback cb : mSettingsChangeCallbacks) {
cb.onLocationSettingsChanged(isEnabled); cb.onLocationSettingsChanged(isEnabled);
} }
} }

View File

@@ -17,14 +17,19 @@ package com.android.systemui.utils.leaks;
import android.testing.LeakCheck; import android.testing.LeakCheck;
import com.android.systemui.statusbar.policy.LocationController; 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 { implements LocationController {
public FakeLocationController(LeakCheck test) { public FakeLocationController(LeakCheck test) {
super(test, "location"); super(test, "location");
} }
@Override
public boolean isLocationActive() {
return false;
}
@Override @Override
public boolean isLocationEnabled() { public boolean isLocationEnabled() {
return false; return false;