Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19c79d6a authored by Jacky Wang's avatar Jacky Wang
Browse files

[Catalyst] Introduce HandlerExecutor class

Bug: 332201912
Flag: EXEMPT framework
Test: N/A
Change-Id: I267569fca388e28973f657d91e3f8a4e09c64f79
parent df2b4213
Loading
Loading
Loading
Loading
+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())
    }
}
+1 −3
Original line number Original line Diff line number Diff line
@@ -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
@@ -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)
            }
            }
+4 −12
Original line number Original line Diff line number Diff line
@@ -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
@@ -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].
@@ -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) {
@@ -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) {