测试描述:
前提条件:设置-系统-时间和日期,调节时间为(夜间模式时间大约17:45-6:35)
操作步骤:设置-显示-夜间模式,设定时间在日落到日出期间开启,调节时间
问题点:调节时间为(夜间模式时间大约17:45-6:35),没有成功开启夜间模式
预期结果:调节时间为(夜间模式时间大约17:45-6:35),成功开启夜间模式
备注:谷歌机11.0可以成功开启
分析过程:
(1) 对代码添加log:
1)frameworks/base/services/core/java/com/android/server/display/color/ColorDisplayService.java
if (autoMode == AUTO_MODE_CUSTOM_TIME) {
mNightDisplayAutoMode = new CustomNightDisplayAutoMode();
+ Slog.d(TAG, "onNightDisplayAutoModeChanged: autoMode= AUTO_MODE_CUSTOM_TIME");
} else if (autoMode == AUTO_MODE_TWILIGHT) {
+ Slog.d(TAG, "onNightDisplayAutoModeChanged: autoMode= AUTO_MODE_TWILIGHT");
mNightDisplayAutoMode = new TwilightNightDisplayAutoMode();
}
@@ -969,6 +971,7 @@ public final class ColorDisplayService extends SystemService {
mTimeChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
+ Slog.d(TAG, "mAlarmManager onReceive");
updateActivated();
}
};
@@ -1018,6 +1021,7 @@ public final class ColorDisplayService extends SystemService {
mLastActivatedTime = getNightDisplayLastActivatedTimeSetting();
// Force an update to initialize state.
+ Slog.d(TAG, "onStart");
updateActivated();
}
@@ -1039,6 +1043,7 @@ public final class ColorDisplayService extends SystemService {
public void onCustomStartTimeChanged(LocalTime startTime) {
mStartTime = startTime;
mLastActivatedTime = null;
+ Slog.d(TAG, "onCustomStartTimeChanged");
updateActivated();
}
@@ -1046,6 +1051,7 @@ public final class ColorDisplayService extends SystemService {
public void onCustomEndTimeChanged(LocalTime endTime) {
mEndTime = endTime;
mLastActivatedTime = null;
+ Slog.d(TAG, "onCustomEndTimeChanged");
updateActivated();
}
@@ -1070,10 +1076,12 @@ public final class ColorDisplayService extends SystemService {
if (state == null) {
// If there isn't a valid TwilightState then just keep the current activated
// state.
+ Slog.d(TAG, "TwilightNightDisplayAutoMode ::updateActivated state == null");
return;
}
boolean activate = state.isNight();
+ Slog.d(TAG, "updateActivated activate =" + activate);
if (mLastActivatedTime != null) {
final LocalDateTime now = LocalDateTime.now();
final LocalDateTime sunrise = state.sunrise();
@@ -1094,10 +1102,12 @@ public final class ColorDisplayService extends SystemService {
@Override
public void onActivated(boolean activated) {
mLastActivatedTime = getNightDisplayLastActivatedTimeSetting();
+ Slog.d(TAG, "TwilightNightDisplayAutoMode :: onActivated =" + activated +",mLastActivatedTime = " + mLastActivatedTime);
}
@Override
public void onStart() {
+ Slog.d(TAG, "TwilightNightDisplayAutoMode :: onStart");
mTwilightManager.registerListener(this, mHandler);
mLastActivatedTime = getNightDisplayLastActivatedTimeSetting();
@@ -1107,6 +1117,7 @@ public final class ColorDisplayService extends SystemService {
@Override
public void onStop() {
+ Slog.d(TAG, "TwilightNightDisplayAutoMode :: onStop");
mTwilightManager.unregisterListener(this);
mLastActivatedTime = null;
}
2)frameworks/base/services/core/java/com/android/server/twilight/TwilightService.java
private static final String TAG = "TwilightService";
private static final String ATTRIBUTION_TAG = "TwilightService";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private static final int MSG_START_LISTENING = 1;
private static final int MSG_STOP_LISTENING = 2;
@@ -212,13 +212,14 @@ public final class TwilightService extends SystemService
final long currentTimeMillis = System.currentTimeMillis();
final Location location = mLastLocation != null ? mLastLocation
: mLocationManager.getLastLocation();
+ Slog.d(TAG, "updateTwilightState: mLastLocation = " + mLastLocation +",location = " + location);
final TwilightState state = calculateTwilightState(location, currentTimeMillis);
- if (DEBUG) {
- Slog.d(TAG, "updateTwilightState: " + state);
- }
+
+ Slog.d(TAG, "updateTwilightState: " + state);
// Notify listeners if the state has changed.
synchronized (mListeners) {
+ Slog.d(TAG, "updateTwilightState: (Objects.equals(mLastTwilightState, state)) = " + (Objects.equals(mLastTwilightState, state)));
if (!Objects.equals(mLastTwilightState, state)) {
mLastTwilightState = state;
@@ -232,8 +233,10 @@ public final class TwilightService extends SystemService
// Schedule an alarm to update the state at the next sunrise or sunset.
if (state != null) {
+
final long triggerAtMillis = state.isNight()
? state.sunriseTimeMillis() : state.sunsetTimeMillis();
+ Slog.d(TAG, "updateTwilightState::triggerAtMillis = " + triggerAtMillis +",state.sunriseTimeMillis = " + state.sunriseTimeMillis() +",state.sunsetTimeMillis
mAlarmManager.setExact(AlarmManager.RTC, triggerAtMillis, TAG, this, mHandler);
}
}
@@ -277,6 +280,7 @@ public final class TwilightService extends SystemService
*/
private static TwilightState calculateTwilightState(Location location, long timeMillis) {
if (location == null) {
+ Slog.d(TAG, "calculateTwilightState:: location == null ");
return null;
}
(2) 编译代码,分析log.
从log中看到有: calculateTwilightState:: location == null .
认真分析代码,发现若location 为null 的话,就会中断流程.若获取不到location ,mLastTwilightState 也一直未null,所以条件不能被触发.
(0 frameworks/base/services/core/java/com/android/server/twilight/TwilightService.java
private void updateTwilightState() {
211 // Calculate the twilight state based on the current time and location.
212 final long currentTimeMillis = System.currentTimeMillis();
213 final Location location = mLastLocation != null ? mLastLocation
214 : mLocationManager.getLastLocation();
215 final TwilightState state = calculateTwilightState(location, currentTimeMillis);
216 if (DEBUG) {
217 Slog.d(TAG, "updateTwilightState: " + state);
218 }
219
220 // Notify listeners if the state has changed.
221 synchronized (mListeners) {
222 if (!Objects.equals(mLastTwilightState, state)) {
223 mLastTwilightState = state;
224
225 for (int i = mListeners.size() - 1; i >= 0; --i) {
226 final TwilightListener listener = mListeners.keyAt(i);
227 final Handler handler = mListeners.valueAt(i);
228 handler.post(() -> listener.onTwilightStateChanged(state));
229 }
230 }
231 }
(3)分析为什么获取不到location. 一般获取location的方式是,wifi 和 GPS 。 而在室内测试获取不到GPS 是正常的。 只有连接wifi 获取location了。 然后尝试测试。
测试成功,并打印log如下:
01-05 15:50:00.042 1146 1204 D TwilightState: sunrise zoneId = Asia/Shanghai,sunrise = 2021-01-05T06:55:35.366
01-05 15:50:00.042 1146 1204 D TwilightState: sunset zoneId = Asia/Shanghai,sunset = 2021-01-05T17:07:52.999
重新测试:
(1)google 参考机测试正常,已经和测试同事通过,在测试时,google 参考机已经连接上wifi。 而且测试机在测试时,未连接wifi。 重新测试连接上wifi ,测试成功。
(2)google 参考机断开wifi 测试也正常。 因为之前已经连接上wifi了,获取了location 信息进行了保存, 下次获取location 若取不到,则获取上次的location 作为本次location。 所以是正常的。 可以恢复设置再进行测试比较。
总结,在测试护眼模式选择选择日落到日出期间功能时,要获取到location 信息,才能知道日出和日落 ,此功能才能起作用。 若使用翻墙网络,则需要知道翻墙网络对方的,日出和日落时间方可测试。