diff options
3 files changed, 50 insertions, 15 deletions
diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt new file mode 100644 index 000000000000..be086061f5cb --- /dev/null +++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settingslib.datastore + +import android.os.Handler +import android.os.Looper +import java.util.concurrent.Executor + +/** + * Adapter of [Handler] and [Executor], where the task is executed on handler with given looper. + * + * When current looper is same with the given looper, task passed to [Executor.execute] will be + * executed immediately to improve better performance. + * + * @param looper Looper of the handler. + */ +open class HandlerExecutor(looper: Looper) : Handler(looper), Executor { + + override fun execute(command: Runnable) { + if (looper == Looper.myLooper()) { + command.run() + } else { + post(command) + } + } + + companion object { + /** The main thread [HandlerExecutor]. */ + val main = HandlerExecutor(Looper.getMainLooper()) + } +} diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt index 62d3fc364d28..04d4bfe0741d 100644 --- a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt +++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt @@ -19,8 +19,6 @@ package com.android.settingslib.datastore import android.content.ContentResolver import android.database.ContentObserver import android.net.Uri -import android.os.Handler -import android.os.Looper import android.util.Log import java.util.concurrent.Executor import java.util.concurrent.atomic.AtomicInteger @@ -39,7 +37,7 @@ abstract class SettingsStore(protected val contentResolver: ContentResolver) : private val counter = AtomicInteger() private val contentObserver = - object : ContentObserver(Handler(Looper.getMainLooper())) { + object : ContentObserver(HandlerExecutor.main) { override fun onChange(selfChange: Boolean) { super.onChange(selfChange, null) } diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt index d99d470cc4c0..ad4cc33e5ecd 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt @@ -19,12 +19,11 @@ package com.android.settingslib.preference import android.content.Context import android.content.Intent import android.os.Bundle -import android.os.Handler -import android.os.Looper import androidx.preference.Preference import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceGroup import androidx.preference.PreferenceScreen +import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyedDataObservable import com.android.settingslib.datastore.KeyedObservable @@ -37,7 +36,6 @@ import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenRegistry import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMultimap -import java.util.concurrent.Executor /** * Helper to bind preferences on given [preferenceScreen]. @@ -54,13 +52,7 @@ class PreferenceScreenBindingHelper( private val preferenceHierarchy: PreferenceHierarchy, ) : KeyedDataObservable<String>() { - private val handler = Handler(Looper.getMainLooper()) - private val executor = - object : Executor { - override fun execute(command: Runnable) { - handler.post(command) - } - } + private val mainExecutor = HandlerExecutor.main private val preferenceLifecycleContext = object : PreferenceLifecycleContext(context) { @@ -121,8 +113,8 @@ class PreferenceScreenBindingHelper( this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } - addObserver(preferenceObserver, executor) - for (storage in storages) storage.addObserver(storageObserver, executor) + addObserver(preferenceObserver, mainExecutor) + for (storage in storages) storage.addObserver(storageObserver, mainExecutor) } private fun onPreferenceChange(key: String?, reason: Int) { |