Cleanup TwilightService
TwilightService now just reports the current twilight state, it's up to
clients to provide their own locking mechanism (e.g. always day or
night).
Bug: 29620105
Change-Id: I2a8bb544eab0f44d269c59f36a53fbdf842b423a
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3eb2ac3..7242043 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -6173,44 +6173,6 @@
public static final String NIGHT_DISPLAY_CUSTOM_END_TIME = "night_display_custom_end_time";
/**
- * Behavior of twilight on the device.
- * One of {@link #TWILIGHT_MODE_LOCKED_OFF}, {@link #TWILIGHT_MODE_LOCKED_ON}
- * or {@link #TWILIGHT_MODE_AUTO}.
- * @hide
- */
- public static final String TWILIGHT_MODE = "twilight_mode";
-
- /**
- * Twilight mode always off.
- * @hide
- */
- public static final int TWILIGHT_MODE_LOCKED_OFF = 0;
-
- /**
- * Twilight mode always on.
- * @hide
- */
- public static final int TWILIGHT_MODE_LOCKED_ON = 1;
-
- /**
- * Twilight mode auto.
- * @hide
- */
- public static final int TWILIGHT_MODE_AUTO = 2;
-
- /**
- * Twilight mode auto, temporarily overriden to on.
- * @hide
- */
- public static final int TWILIGHT_MODE_AUTO_OVERRIDE_OFF = 3;
-
- /**
- * Twilight mode auto, temporarily overriden to off.
- * @hide
- */
- public static final int TWILIGHT_MODE_AUTO_OVERRIDE_ON = 4;
-
- /**
* Whether brightness should automatically adjust based on twilight state.
* @hide
*/
diff --git a/services/core/java/com/android/server/twilight/TwilightService.java b/services/core/java/com/android/server/twilight/TwilightService.java
index 89e5e58..ee7a4a0 100644
--- a/services/core/java/com/android/server/twilight/TwilightService.java
+++ b/services/core/java/com/android/server/twilight/TwilightService.java
@@ -16,18 +16,12 @@
package com.android.server.twilight;
-import com.android.server.SystemService;
-import com.android.server.TwilightCalculator;
-
-import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.database.ContentObserver;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
@@ -36,64 +30,52 @@
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.provider.Settings.Secure;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
+import com.android.server.SystemService;
+import com.android.server.TwilightCalculator;
+
import java.util.ArrayList;
import java.util.Iterator;
-
-import libcore.util.Objects;
+import java.util.List;
+import java.util.Objects;
/**
* Figures out whether it's twilight time based on the user's location.
- *
+ * <p>
* Used by the UI mode manager and other components to adjust night mode
* effects based on sunrise and sunset.
*/
public final class TwilightService extends SystemService {
- static final String TAG = "TwilightService";
- static final boolean DEBUG = false;
- static final String ACTION_UPDATE_TWILIGHT_STATE =
+
+ private static final String TAG = "TwilightService";
+ private static final boolean DEBUG = false;
+
+ private static final String ACTION_UPDATE_TWILIGHT_STATE =
"com.android.server.action.UPDATE_TWILIGHT_STATE";
- // The amount of time after or before sunrise over which to start adjusting
- // twilight affected things. We want the change to happen gradually so that
- // it is below the threshold of perceptibility and so that the adjustment has
- // maximum effect well after dusk.
+ /**
+ * The amount of time after or before sunrise over which to start adjusting twilight affected
+ * things. We want the change to happen gradually so that it is below the threshold of
+ * perceptibility and so that the adjustment has and so that the adjustment has
+ * maximum effect well after dusk.
+ */
private static final long TWILIGHT_ADJUSTMENT_TIME = DateUtils.HOUR_IN_MILLIS * 2;
- // Broadcast when twilight changes.
- public static final String ACTION_TWILIGHT_CHANGED = "android.intent.action.TWILIGHT_CHANGED";
+ private final Object mLock = new Object();
- public static final String EXTRA_IS_NIGHT = "isNight";
- public static final String EXTRA_AMOUNT = "amount";
+ @GuardedBy("mLock")
+ private final List<TwilightListenerRecord> mListeners = new ArrayList<>();
- // Amount of time the TwilightService will stay locked in an override state before switching
- // back to auto.
- private static final long RESET_TIME = DateUtils.HOUR_IN_MILLIS * 2;
- private static final String EXTRA_RESET_USER = "user";
+ private AlarmManager mAlarmManager;
+ private LocationManager mLocationManager;
+ private LocationHandler mLocationHandler;
- private static final String ACTION_RESET_TWILIGHT_AUTO =
- "com.android.server.action.RESET_TWILIGHT_AUTO";
-
- final Object mLock = new Object();
-
- AlarmManager mAlarmManager;
- LocationManager mLocationManager;
- LocationHandler mLocationHandler;
-
- final ArrayList<TwilightListenerRecord> mListeners =
- new ArrayList<TwilightListenerRecord>();
-
- TwilightState mTwilightState;
-
- private int mCurrentUser;
- private boolean mLocked;
- private boolean mBootCompleted;
+ @GuardedBy("mLock")
+ private TwilightState mTwilightState;
public TwilightService(Context context) {
super(context);
@@ -105,13 +87,11 @@
mLocationManager = (LocationManager) getContext().getSystemService(
Context.LOCATION_SERVICE);
mLocationHandler = new LocationHandler();
- mCurrentUser = ActivityManager.getCurrentUser();
IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED);
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
- filter.addAction(ACTION_UPDATE_TWILIGHT_STATE);
getContext().registerReceiver(mReceiver, filter);
publishLocalService(TwilightManager.class, mService);
@@ -120,81 +100,29 @@
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_BOOT_COMPLETED) {
- getContext().getContentResolver().registerContentObserver(
- Secure.getUriFor(Secure.TWILIGHT_MODE), false, mContentObserver, mCurrentUser);
- mContentObserver.onChange(true);
- mBootCompleted = true;
- sendBroadcast();
- }
- }
-
- private void reregisterSettingObserver() {
- final ContentResolver contentResolver = getContext().getContentResolver();
- contentResolver.unregisterContentObserver(mContentObserver);
- contentResolver.registerContentObserver(Secure.getUriFor(Secure.TWILIGHT_MODE), false,
- mContentObserver, mCurrentUser);
- mContentObserver.onChange(true);
- }
-
- private void setLockedState(TwilightState state) {
- synchronized (mLock) {
- // Make sure we aren't locked so we can set the state.
- mLocked = false;
- setTwilightState(state);
- // Make sure we leave the state locked, so it cant be changed.
- mLocked = true;
- // TODO: Don't bother updating state when locked.
+ // Initialize the current twilight state.
+ mLocationHandler.requestTwilightUpdate();
}
}
private void setTwilightState(TwilightState state) {
synchronized (mLock) {
- if (mLocked) {
- // State has been locked by secure setting, shouldn't be changed.
- return;
- }
- if (!Objects.equal(mTwilightState, state)) {
+ if (!Objects.equals(mTwilightState, state)) {
if (DEBUG) {
Slog.d(TAG, "Twilight state changed: " + state);
}
mTwilightState = state;
- final int listenerLen = mListeners.size();
- for (int i = 0; i < listenerLen; i++) {
- mListeners.get(i).postUpdate();
+ for (TwilightListenerRecord mListener : mListeners) {
+ mListener.postUpdate();
}
}
}
- sendBroadcast();
- }
-
- private void sendBroadcast() {
- synchronized (mLock) {
- if (mTwilightState == null) {
- return;
- }
- if (mBootCompleted) {
- Intent intent = new Intent(ACTION_TWILIGHT_CHANGED);
- intent.putExtra(EXTRA_IS_NIGHT, mTwilightState.isNight());
- intent.putExtra(EXTRA_AMOUNT, mTwilightState.getAmount());
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- }
- }
- }
-
- private void scheduleReset() {
- long resetTime = System.currentTimeMillis() + RESET_TIME;
- Intent resetIntent = new Intent(ACTION_RESET_TWILIGHT_AUTO);
- resetIntent.putExtra(EXTRA_RESET_USER, mCurrentUser);
- PendingIntent pendingIntent = PendingIntent.getBroadcast(
- getContext(), 0, resetIntent, 0);
- mAlarmManager.cancel(pendingIntent);
- mAlarmManager.setExact(AlarmManager.RTC, resetTime, pendingIntent);
}
private static class TwilightListenerRecord implements Runnable {
+
private final TwilightListener mListener;
private final Handler mHandler;
@@ -211,15 +139,9 @@
public void run() {
mListener.onTwilightStateChanged();
}
-
}
private final TwilightManager mService = new TwilightManager() {
- /**
- * Gets the current twilight state.
- *
- * @return The current twilight state, or null if no information is available.
- */
@Override
public TwilightState getCurrentState() {
synchronized (mLock) {
@@ -227,11 +149,6 @@
}
}
- /**
- * Listens for twilight time.
- *
- * @param listener The listener.
- */
@Override
public void registerListener(TwilightListener listener, Handler handler) {
synchronized (mLock) {
@@ -286,6 +203,7 @@
}
private final class LocationHandler extends Handler {
+
private static final int MSG_ENABLE_LOCATION_UPDATES = 1;
private static final int MSG_GET_NEW_LOCATION_UPDATE = 2;
private static final int MSG_PROCESS_NEW_LOCATION = 3;
@@ -301,13 +219,14 @@
private static final double FACTOR_GMT_OFFSET_LONGITUDE =
1000.0 * 360.0 / DateUtils.DAY_IN_MILLIS;
+ private final TwilightCalculator mTwilightCalculator = new TwilightCalculator();
+
private boolean mPassiveListenerEnabled;
private boolean mNetworkListenerEnabled;
private boolean mDidFirstInit;
private long mLastNetworkRegisterTime = -MIN_LOCATION_UPDATE_MS;
private long mLastUpdateInterval;
private Location mLocation;
- private final TwilightCalculator mTwilightCalculator = new TwilightCalculator();
public void processNewLocation(Location location) {
Message msg = obtainMessage(MSG_PROCESS_NEW_LOCATION, location);
@@ -334,14 +253,14 @@
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_PROCESS_NEW_LOCATION: {
- final Location location = (Location)msg.obj;
+ final Location location = (Location) msg.obj;
final boolean hasMoved = hasMoved(mLocation, location);
final boolean hasBetterAccuracy = mLocation == null
|| location.getAccuracy() < mLocation.getAccuracy();
if (DEBUG) {
Slog.d(TAG, "Processing new location: " + location
- + ", hasMoved=" + hasMoved
- + ", hasBetterAccuracy=" + hasBetterAccuracy);
+ + ", hasMoved=" + hasMoved
+ + ", hasBetterAccuracy=" + hasBetterAccuracy);
}
if (hasMoved || hasBetterAccuracy) {
setLocation(location);
@@ -373,8 +292,8 @@
// distance.
boolean networkLocationEnabled;
try {
- networkLocationEnabled =
- mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
+ networkLocationEnabled = mLocationManager.isProviderEnabled(
+ LocationManager.NETWORK_PROVIDER);
} catch (Exception e) {
// we may get IllegalArgumentException if network location provider
// does not exist or is not yet installed.
@@ -398,8 +317,8 @@
// and network).
boolean passiveLocationEnabled;
try {
- passiveLocationEnabled =
- mLocationManager.isProviderEnabled(LocationManager.PASSIVE_PROVIDER);
+ passiveLocationEnabled = mLocationManager.isProviderEnabled(
+ LocationManager.PASSIVE_PROVIDER);
} catch (Exception e) {
// we may get IllegalArgumentException if passive location provider
// does not exist or is not yet installed.
@@ -409,7 +328,7 @@
if (!mPassiveListenerEnabled && passiveLocationEnabled) {
mPassiveListenerEnabled = true;
mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER,
- 0, LOCATION_UPDATE_DISTANCE_METER , mLocationListener);
+ 0, LOCATION_UPDATE_DISTANCE_METER, mLocationListener);
}
if (!(mNetworkListenerEnabled && mPassiveListenerEnabled)) {
@@ -444,14 +363,14 @@
// pick the most recent location
if (location == null || (lastKnownLocation != null &&
location.getElapsedRealtimeNanos() <
- lastKnownLocation.getElapsedRealtimeNanos())) {
+ lastKnownLocation.getElapsedRealtimeNanos())) {
location = lastKnownLocation;
}
}
// In the case there is no location available (e.g. GPS fix or network location
- // is not available yet), the longitude of the location is estimated using the timezone,
- // latitude and accuracy are set to get a good average.
+ // is not available yet), the longitude of the location is estimated using the
+ // timezone, latitude and accuracy are set to get a good average.
if (location == null) {
Time currentTime = new Time();
currentTime.set(System.currentTimeMillis());
@@ -543,58 +462,22 @@
Slog.d(TAG, "Next update in " + (nextUpdate - now) + " ms");
}
- Intent updateIntent = new Intent(ACTION_UPDATE_TWILIGHT_STATE);
- PendingIntent pendingIntent = PendingIntent.getBroadcast(
- getContext(), 0, updateIntent, 0);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ getContext(), 0, new Intent(ACTION_UPDATE_TWILIGHT_STATE), 0);
mAlarmManager.cancel(pendingIntent);
mAlarmManager.setExact(AlarmManager.RTC, nextUpdate, pendingIntent);
}
}
- private final ContentObserver mContentObserver = new ContentObserver(new Handler()) {
- @Override
- public void onChange(boolean selfChange) {
- super.onChange(selfChange);
- int value = Secure.getIntForUser(getContext().getContentResolver(),
- Secure.TWILIGHT_MODE, Secure.TWILIGHT_MODE_AUTO, mCurrentUser);
- if (value == Secure.TWILIGHT_MODE_LOCKED_OFF) {
- setLockedState(new TwilightState(false, 0));
- } else if (value == Secure.TWILIGHT_MODE_LOCKED_ON) {
- setLockedState(new TwilightState(true, 1));
- } else if (value == Secure.TWILIGHT_MODE_AUTO_OVERRIDE_OFF) {
- setLockedState(new TwilightState(false, 0));
- scheduleReset();
- } else if (value == Secure.TWILIGHT_MODE_AUTO_OVERRIDE_ON) {
- setLockedState(new TwilightState(true, 1));
- scheduleReset();
- } else {
- mLocked = false;
- mLocationHandler.requestTwilightUpdate();
- }
- }
- };
-
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_USER_SWITCHED.equals(intent.getAction())) {
- mCurrentUser = ActivityManager.getCurrentUser();
- reregisterSettingObserver();
- return;
- }
if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction())
&& !intent.getBooleanExtra("state", false)) {
// Airplane mode is now off!
mLocationHandler.requestLocationUpdate();
return;
}
-
- if (ACTION_RESET_TWILIGHT_AUTO.equals(intent.getAction())) {
- int user = intent.getIntExtra(EXTRA_RESET_USER, 0);
- Settings.Secure.putIntForUser(getContext().getContentResolver(),
- Secure.TWILIGHT_MODE, Secure.TWILIGHT_MODE_AUTO, user);
- return;
- }
// Time zone has changed or alarm expired.
mLocationHandler.requestTwilightUpdate();
}
@@ -602,32 +485,40 @@
// A LocationListener to initialize the network location provider. The location updates
// are handled through the passive location provider.
- private final LocationListener mEmptyLocationListener = new LocationListener() {
+ private final LocationListener mEmptyLocationListener = new LocationListener() {
+ @Override
public void onLocationChanged(Location location) {
}
- public void onProviderDisabled(String provider) {
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
}
+ @Override
public void onProviderEnabled(String provider) {
}
- public void onStatusChanged(String provider, int status, Bundle extras) {
+ @Override
+ public void onProviderDisabled(String provider) {
}
};
private final LocationListener mLocationListener = new LocationListener() {
+ @Override
public void onLocationChanged(Location location) {
mLocationHandler.processNewLocation(location);
}
- public void onProviderDisabled(String provider) {
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
}
+ @Override
public void onProviderEnabled(String provider) {
}
- public void onStatusChanged(String provider, int status, Bundle extras) {
+ @Override
+ public void onProviderDisabled(String provider) {
}
};
}
diff --git a/services/core/java/com/android/server/twilight/TwilightState.java b/services/core/java/com/android/server/twilight/TwilightState.java
index 81abc13..dec053b 100644
--- a/services/core/java/com/android/server/twilight/TwilightState.java
+++ b/services/core/java/com/android/server/twilight/TwilightState.java
@@ -24,6 +24,7 @@
* This object is immutable.
*/
public class TwilightState {
+
private final boolean mIsNight;
private final float mAmount;