Loading packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt 0 → 100644 +45 −0 Original line number Original line Diff line number Diff line /* * 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()) } } packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,6 @@ package com.android.settingslib.datastore import android.content.ContentResolver import android.content.ContentResolver import android.database.ContentObserver import android.database.ContentObserver import android.net.Uri import android.net.Uri import android.os.Handler import android.os.Looper import android.util.Log import android.util.Log import java.util.concurrent.Executor import java.util.concurrent.Executor import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger Loading @@ -39,7 +37,7 @@ abstract class SettingsStore(protected val contentResolver: ContentResolver) : private val counter = AtomicInteger() private val counter = AtomicInteger() private val contentObserver = private val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) { object : ContentObserver(HandlerExecutor.main) { override fun onChange(selfChange: Boolean) { override fun onChange(selfChange: Boolean) { super.onChange(selfChange, null) super.onChange(selfChange, null) } } Loading packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +4 −12 Original line number Original line Diff line number Diff line Loading @@ -19,12 +19,11 @@ package com.android.settingslib.preference import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.os.Bundle import android.os.Bundle import android.os.Handler import android.os.Looper import androidx.preference.Preference import androidx.preference.Preference import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceGroup import androidx.preference.PreferenceGroup import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyedDataObservable import com.android.settingslib.datastore.KeyedDataObservable import com.android.settingslib.datastore.KeyedObservable import com.android.settingslib.datastore.KeyedObservable Loading @@ -37,7 +36,6 @@ import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenRegistry import com.android.settingslib.metadata.PreferenceScreenRegistry import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMultimap import com.google.common.collect.ImmutableMultimap import java.util.concurrent.Executor /** /** * Helper to bind preferences on given [preferenceScreen]. * Helper to bind preferences on given [preferenceScreen]. Loading @@ -54,13 +52,7 @@ class PreferenceScreenBindingHelper( private val preferenceHierarchy: PreferenceHierarchy, private val preferenceHierarchy: PreferenceHierarchy, ) : KeyedDataObservable<String>() { ) : KeyedDataObservable<String>() { private val handler = Handler(Looper.getMainLooper()) private val mainExecutor = HandlerExecutor.main private val executor = object : Executor { override fun execute(command: Runnable) { handler.post(command) } } private val preferenceLifecycleContext = private val preferenceLifecycleContext = object : PreferenceLifecycleContext(context) { object : PreferenceLifecycleContext(context) { Loading Loading @@ -121,8 +113,8 @@ class PreferenceScreenBindingHelper( this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } addObserver(preferenceObserver, executor) addObserver(preferenceObserver, mainExecutor) for (storage in storages) storage.addObserver(storageObserver, executor) for (storage in storages) storage.addObserver(storageObserver, mainExecutor) } } private fun onPreferenceChange(key: String?, reason: Int) { private fun onPreferenceChange(key: String?, reason: Int) { Loading Loading
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/HandlerExecutor.kt 0 → 100644 +45 −0 Original line number Original line Diff line number Diff line /* * 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()) } }
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SettingsStore.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -19,8 +19,6 @@ package com.android.settingslib.datastore import android.content.ContentResolver import android.content.ContentResolver import android.database.ContentObserver import android.database.ContentObserver import android.net.Uri import android.net.Uri import android.os.Handler import android.os.Looper import android.util.Log import android.util.Log import java.util.concurrent.Executor import java.util.concurrent.Executor import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger Loading @@ -39,7 +37,7 @@ abstract class SettingsStore(protected val contentResolver: ContentResolver) : private val counter = AtomicInteger() private val counter = AtomicInteger() private val contentObserver = private val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) { object : ContentObserver(HandlerExecutor.main) { override fun onChange(selfChange: Boolean) { override fun onChange(selfChange: Boolean) { super.onChange(selfChange, null) super.onChange(selfChange, null) } } Loading
packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +4 −12 Original line number Original line Diff line number Diff line Loading @@ -19,12 +19,11 @@ package com.android.settingslib.preference import android.content.Context import android.content.Context import android.content.Intent import android.content.Intent import android.os.Bundle import android.os.Bundle import android.os.Handler import android.os.Looper import androidx.preference.Preference import androidx.preference.Preference import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceGroup import androidx.preference.PreferenceGroup import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen import com.android.settingslib.datastore.HandlerExecutor import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyValueStore import com.android.settingslib.datastore.KeyedDataObservable import com.android.settingslib.datastore.KeyedDataObservable import com.android.settingslib.datastore.KeyedObservable import com.android.settingslib.datastore.KeyedObservable Loading @@ -37,7 +36,6 @@ import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenRegistry import com.android.settingslib.metadata.PreferenceScreenRegistry import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMultimap import com.google.common.collect.ImmutableMultimap import java.util.concurrent.Executor /** /** * Helper to bind preferences on given [preferenceScreen]. * Helper to bind preferences on given [preferenceScreen]. Loading @@ -54,13 +52,7 @@ class PreferenceScreenBindingHelper( private val preferenceHierarchy: PreferenceHierarchy, private val preferenceHierarchy: PreferenceHierarchy, ) : KeyedDataObservable<String>() { ) : KeyedDataObservable<String>() { private val handler = Handler(Looper.getMainLooper()) private val mainExecutor = HandlerExecutor.main private val executor = object : Executor { override fun execute(command: Runnable) { handler.post(command) } } private val preferenceLifecycleContext = private val preferenceLifecycleContext = object : PreferenceLifecycleContext(context) { object : PreferenceLifecycleContext(context) { Loading Loading @@ -121,8 +113,8 @@ class PreferenceScreenBindingHelper( this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } addObserver(preferenceObserver, executor) addObserver(preferenceObserver, mainExecutor) for (storage in storages) storage.addObserver(storageObserver, executor) for (storage in storages) storage.addObserver(storageObserver, mainExecutor) } } private fun onPreferenceChange(key: String?, reason: Int) { private fun onPreferenceChange(key: String?, reason: Int) { Loading