Loading packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/BackupRestoreStorageManager.kt +3 −3 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ class BackupRestoreStorageManager private constructor(private val application: A private fun notifyBackupManager(key: Any?, reason: Int) { val name = storage.name // prefer not triggering backup immediately after restore if (reason == ChangeReason.RESTORE) { if (reason == DataChangeReason.RESTORE) { Log.d( LOG_TAG, "Notify BackupManager dataChanged ignored for restore: storage=$name key=$key" Loading @@ -161,8 +161,8 @@ class BackupRestoreStorageManager private constructor(private val application: A fun notifyRestoreFinished() { when (storage) { is KeyedObservable<*> -> storage.notifyChange(ChangeReason.RESTORE) is Observable -> storage.notifyChange(ChangeReason.RESTORE) is KeyedObservable<*> -> storage.notifyChange(DataChangeReason.RESTORE) is Observable -> storage.notifyChange(DataChangeReason.RESTORE) } } } Loading packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/DataChangeReason.kt 0 → 100644 +43 −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 androidx.annotation.IntDef /** The reason of data change. */ @IntDef( DataChangeReason.UNKNOWN, DataChangeReason.UPDATE, DataChangeReason.DELETE, DataChangeReason.RESTORE, DataChangeReason.SYNC_ACROSS_PROFILES, ) @Retention(AnnotationRetention.SOURCE) annotation class DataChangeReason { companion object { /** Unknown reason of the change. */ const val UNKNOWN = 0 /** Data is updated. */ const val UPDATE = 1 /** Data is deleted. */ const val DELETE = 2 /** Data is restored from backup/restore framework. */ const val RESTORE = 3 /** Data is synced from another profile (e.g. personal profile to work profile). */ const val SYNC_ACROSS_PROFILES = 4 } } packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt +5 −5 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ fun interface KeyedObserver<in K> { * @param reason the reason of change * @see KeyedObservable.addObserver */ fun onKeyChanged(key: K, @ChangeReason reason: Int) fun onKeyChanged(key: K, reason: Int) } /** Loading Loading @@ -89,7 +89,7 @@ interface KeyedObservable<K> { * * @param reason reason of the change */ fun notifyChange(@ChangeReason reason: Int) fun notifyChange(reason: Int) /** * Notifies observers that a change occurs on given key. Loading @@ -99,7 +99,7 @@ interface KeyedObservable<K> { * @param key key of the change * @param reason reason of the change */ fun notifyChange(key: K, @ChangeReason reason: Int) fun notifyChange(key: K, reason: Int) } /** A thread safe implementation of [KeyedObservable]. */ Loading Loading @@ -141,7 +141,7 @@ class KeyedDataObservable<K> : KeyedObservable<K> { } } override fun notifyChange(@ChangeReason reason: Int) { override fun notifyChange(reason: Int) { // make a copy to avoid potential ConcurrentModificationException val observers = synchronized(observers) { observers.entries.toTypedArray() } val keyedObservers = synchronized(keyedObservers) { keyedObservers.copy() } Loading @@ -165,7 +165,7 @@ class KeyedDataObservable<K> : KeyedObservable<K> { return result } override fun notifyChange(key: K, @ChangeReason reason: Int) { override fun notifyChange(key: K, reason: Int) { // make a copy to avoid potential ConcurrentModificationException val observers = synchronized(observers) { observers.entries.toTypedArray() } val keyedObservers = Loading packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/Observer.kt +3 −28 Original line number Diff line number Diff line Loading @@ -18,34 +18,9 @@ package com.android.settingslib.datastore import androidx.annotation.AnyThread import androidx.annotation.GuardedBy import androidx.annotation.IntDef import java.util.WeakHashMap import java.util.concurrent.Executor /** The reason of a change. */ @IntDef( ChangeReason.UNKNOWN, ChangeReason.UPDATE, ChangeReason.DELETE, ChangeReason.RESTORE, ChangeReason.SYNC_ACROSS_PROFILES, ) @Retention(AnnotationRetention.SOURCE) annotation class ChangeReason { companion object { /** Unknown reason of the change. */ const val UNKNOWN = 0 /** Data is updated. */ const val UPDATE = 1 /** Data is deleted. */ const val DELETE = 2 /** Data is restored from backup/restore framework. */ const val RESTORE = 3 /** Data is synced from another profile (e.g. personal profile to work profile). */ const val SYNC_ACROSS_PROFILES = 4 } } /** * Callback to be informed of changes in [Observable] object. * Loading @@ -60,7 +35,7 @@ fun interface Observer { * @param reason the reason of change * @see [Observable.addObserver] for the notices. */ fun onChanged(@ChangeReason reason: Int) fun onChanged(reason: Int) } /** An observable object allows to observe change with [Observer]. */ Loading Loading @@ -90,7 +65,7 @@ interface Observable { * * @param reason reason of the change */ fun notifyChange(@ChangeReason reason: Int) fun notifyChange(reason: Int) } /** A thread safe implementation of [Observable]. */ Loading @@ -110,7 +85,7 @@ class DataObservable : Observable { synchronized(observers) { observers.remove(observer) } } override fun notifyChange(@ChangeReason reason: Int) { override fun notifyChange(reason: Int) { // make a copy to avoid potential ConcurrentModificationException val entries = synchronized(observers) { observers.entries.toTypedArray() } for (entry in entries) { Loading packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SharedPreferencesStorage.kt +2 −2 Original line number Diff line number Diff line Loading @@ -83,10 +83,10 @@ constructor( private val sharedPreferencesListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> if (key != null) { notifyChange(key, ChangeReason.UPDATE) notifyChange(key, DataChangeReason.UPDATE) } else { // On Android >= R, SharedPreferences.Editor.clear() will trigger this case notifyChange(ChangeReason.DELETE) notifyChange(DataChangeReason.DELETE) } } Loading Loading
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/BackupRestoreStorageManager.kt +3 −3 Original line number Diff line number Diff line Loading @@ -138,7 +138,7 @@ class BackupRestoreStorageManager private constructor(private val application: A private fun notifyBackupManager(key: Any?, reason: Int) { val name = storage.name // prefer not triggering backup immediately after restore if (reason == ChangeReason.RESTORE) { if (reason == DataChangeReason.RESTORE) { Log.d( LOG_TAG, "Notify BackupManager dataChanged ignored for restore: storage=$name key=$key" Loading @@ -161,8 +161,8 @@ class BackupRestoreStorageManager private constructor(private val application: A fun notifyRestoreFinished() { when (storage) { is KeyedObservable<*> -> storage.notifyChange(ChangeReason.RESTORE) is Observable -> storage.notifyChange(ChangeReason.RESTORE) is KeyedObservable<*> -> storage.notifyChange(DataChangeReason.RESTORE) is Observable -> storage.notifyChange(DataChangeReason.RESTORE) } } } Loading
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/DataChangeReason.kt 0 → 100644 +43 −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 androidx.annotation.IntDef /** The reason of data change. */ @IntDef( DataChangeReason.UNKNOWN, DataChangeReason.UPDATE, DataChangeReason.DELETE, DataChangeReason.RESTORE, DataChangeReason.SYNC_ACROSS_PROFILES, ) @Retention(AnnotationRetention.SOURCE) annotation class DataChangeReason { companion object { /** Unknown reason of the change. */ const val UNKNOWN = 0 /** Data is updated. */ const val UPDATE = 1 /** Data is deleted. */ const val DELETE = 2 /** Data is restored from backup/restore framework. */ const val RESTORE = 3 /** Data is synced from another profile (e.g. personal profile to work profile). */ const val SYNC_ACROSS_PROFILES = 4 } }
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt +5 −5 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ fun interface KeyedObserver<in K> { * @param reason the reason of change * @see KeyedObservable.addObserver */ fun onKeyChanged(key: K, @ChangeReason reason: Int) fun onKeyChanged(key: K, reason: Int) } /** Loading Loading @@ -89,7 +89,7 @@ interface KeyedObservable<K> { * * @param reason reason of the change */ fun notifyChange(@ChangeReason reason: Int) fun notifyChange(reason: Int) /** * Notifies observers that a change occurs on given key. Loading @@ -99,7 +99,7 @@ interface KeyedObservable<K> { * @param key key of the change * @param reason reason of the change */ fun notifyChange(key: K, @ChangeReason reason: Int) fun notifyChange(key: K, reason: Int) } /** A thread safe implementation of [KeyedObservable]. */ Loading Loading @@ -141,7 +141,7 @@ class KeyedDataObservable<K> : KeyedObservable<K> { } } override fun notifyChange(@ChangeReason reason: Int) { override fun notifyChange(reason: Int) { // make a copy to avoid potential ConcurrentModificationException val observers = synchronized(observers) { observers.entries.toTypedArray() } val keyedObservers = synchronized(keyedObservers) { keyedObservers.copy() } Loading @@ -165,7 +165,7 @@ class KeyedDataObservable<K> : KeyedObservable<K> { return result } override fun notifyChange(key: K, @ChangeReason reason: Int) { override fun notifyChange(key: K, reason: Int) { // make a copy to avoid potential ConcurrentModificationException val observers = synchronized(observers) { observers.entries.toTypedArray() } val keyedObservers = Loading
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/Observer.kt +3 −28 Original line number Diff line number Diff line Loading @@ -18,34 +18,9 @@ package com.android.settingslib.datastore import androidx.annotation.AnyThread import androidx.annotation.GuardedBy import androidx.annotation.IntDef import java.util.WeakHashMap import java.util.concurrent.Executor /** The reason of a change. */ @IntDef( ChangeReason.UNKNOWN, ChangeReason.UPDATE, ChangeReason.DELETE, ChangeReason.RESTORE, ChangeReason.SYNC_ACROSS_PROFILES, ) @Retention(AnnotationRetention.SOURCE) annotation class ChangeReason { companion object { /** Unknown reason of the change. */ const val UNKNOWN = 0 /** Data is updated. */ const val UPDATE = 1 /** Data is deleted. */ const val DELETE = 2 /** Data is restored from backup/restore framework. */ const val RESTORE = 3 /** Data is synced from another profile (e.g. personal profile to work profile). */ const val SYNC_ACROSS_PROFILES = 4 } } /** * Callback to be informed of changes in [Observable] object. * Loading @@ -60,7 +35,7 @@ fun interface Observer { * @param reason the reason of change * @see [Observable.addObserver] for the notices. */ fun onChanged(@ChangeReason reason: Int) fun onChanged(reason: Int) } /** An observable object allows to observe change with [Observer]. */ Loading Loading @@ -90,7 +65,7 @@ interface Observable { * * @param reason reason of the change */ fun notifyChange(@ChangeReason reason: Int) fun notifyChange(reason: Int) } /** A thread safe implementation of [Observable]. */ Loading @@ -110,7 +85,7 @@ class DataObservable : Observable { synchronized(observers) { observers.remove(observer) } } override fun notifyChange(@ChangeReason reason: Int) { override fun notifyChange(reason: Int) { // make a copy to avoid potential ConcurrentModificationException val entries = synchronized(observers) { observers.entries.toTypedArray() } for (entry in entries) { Loading
packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/SharedPreferencesStorage.kt +2 −2 Original line number Diff line number Diff line Loading @@ -83,10 +83,10 @@ constructor( private val sharedPreferencesListener = SharedPreferences.OnSharedPreferenceChangeListener { _, key -> if (key != null) { notifyChange(key, ChangeReason.UPDATE) notifyChange(key, DataChangeReason.UPDATE) } else { // On Android >= R, SharedPreferences.Editor.clear() will trigger this case notifyChange(ChangeReason.DELETE) notifyChange(DataChangeReason.DELETE) } } Loading