Android R 护眼模式 选择日落到日出期间开启失败

测试描述:

前提条件:设置-系统-时间和日期,调节时间为(夜间模式时间大约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 信息,才能知道日出和日落 ,此功能才能起作用。 若使用翻墙网络,则需要知道翻墙网络对方的,日出和日落时间方可测试。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值