summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt45
-rw-r--r--packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt4
-rw-r--r--packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt16
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) {