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

Commit 19949a27 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Catalyst] Introduce HandlerExecutor class" into main

parents 66d04b47 19c79d6a
Loading
Loading
Loading
Loading
+45 −0
Original line number 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 Diff line number Diff line
@@ -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)
            }
+4 −12
Original line number Diff line number Diff line
@@ -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) {