android 源码 修改默认开启时区中自动设置

293 阅读1分钟

1.找到setting 中的 android:key="auto_zone" 控件 对应控制器AutoTimeZonePreferenceController

路径 : packages\apps\Settings\res\xml\date_time_prefs.xml packages\apps\Settings\src\com\android\settings\datetime\AutoTimeZonePreferenceController.java

<com.android.settingslib.RestrictedSwitchPreference 
android:key="auto_zone" 
android:title="@string/zone_auto_title" 
settings:userRestriction="no_config_date_time" settings:controller="com.android.settings.datetime.AutoTimeZonePreferenceController" /> 

在AutoTimeZonePreferenceController中可以看到isChecked()

TimeZoneConfiguration config = mTimeManager.getTimeZoneCapabilitiesAndConfig().getConfiguration(); 
config.isAutoDetectionEnabled(); 

setChecked()

TimeZoneConfiguration configuration = new TimeZoneConfiguration.Builder() .setAutoDetectionEnabled(isChecked) .build(); 
mTimeManager.updateTimeZoneConfiguration(configuration); 
相关源码路径: 
frameworks\base\core\java\android\app\time\TimeZoneConfiguration.java 
frameworks\base\core\java\android\app\time\TimeManager.java 
frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorService.java 
frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorStrategy.java 
frameworks\base\services\core\java\com\android\server\timezonedetector\TimeZoneDetectorStrategyImpl.java 
frameworks\base\services\core\java\com\android\server\timedetector\ServiceConfigAccessor.java 
frameworks\base\services\core\java\com\android\server\timedetector\ServiceConfigAccessor.java 
frameworks\base\services\core\java\com\android\server\timedetector\ServiceConfigAccessorImpl.java 
frameworks\base\core\java\android\app\time\TimeZoneCapabilities.java 

2.从TimeManager的updateTimeZoneConfiguration方法入手:

mITimeZoneDetectorService.updateConfiguration(configuration); 
- - - > 
mTimeZoneDetectorStrategy.updateConfiguration( resolvedUserId, configuration, bypassUserPolicyChecks); 
其中 mTimeZoneDetectorStrategy 是一个接口,由TimeZoneDetectorStrategyImpl具体实现 
- - - > 
mServiceConfigAccessor.updateConfiguration( userId, configuration, bypassUserPolicyChecks); 
其中 mServiceConfigAccessor是一个接口,由ServiceConfigAccessorImpl具体实现 
- - - > 
TimeZoneCapabilities.tryApplyConfigChanges(oldConfiguration, requestedConfigurationUpdates); storeConfiguration(userId, requestedConfigurationUpdates, newConfiguration); 
- - - > 
setAutoDetectionEnabledIfRequired(autoDetectionEnabled);
- - - >
最终由这个值来控制是否开启 
Settings.Global.putInt(mCr, Settings.Global.AUTO_TIME_ZONE, enabled ? 1 : 0); 

3.设置默认值,设置def_auto_time_zone该值即可

源码路径:
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 
loadBooleanSetting(stmt, Settings.Global.AUTO_TIME_ZONE, R.bool.def_auto_time_zone);