• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settingslib.metadata
18 
19 import android.content.Context
20 import android.os.Bundle
21 import android.util.Log
22 import com.android.settingslib.datastore.KeyValueStore
23 
24 /** Registry of all available preference screens in the app. */
25 object PreferenceScreenRegistry {
26     private const val TAG = "ScreenRegistry"
27 
28     /** Provider of key-value store. */
29     private lateinit var keyValueStoreProvider: KeyValueStoreProvider
30 
31     /** The default permit for external application to read preference values. */
32     var defaultReadPermit: @ReadWritePermit Int = ReadWritePermit.DISALLOW
33 
34     /** The default permit for external application to write preference values. */
35     var defaultWritePermit: @ReadWritePermit Int = ReadWritePermit.DISALLOW
36 
37     /**
38      * Factories of all available [PreferenceScreenMetadata]s.
39      *
40      * The map key is preference screen key.
41      */
42     var preferenceScreenMetadataFactories = FixedArrayMap<String, PreferenceScreenMetadataFactory>()
43 
44     /** Metrics logger for preference actions triggered by user interaction. */
45     var preferenceUiActionMetricsLogger: PreferenceUiActionMetricsLogger? = null
46 
47     /** Sets the [KeyValueStoreProvider]. */
setKeyValueStoreProvidernull48     fun setKeyValueStoreProvider(keyValueStoreProvider: KeyValueStoreProvider) {
49         this.keyValueStoreProvider = keyValueStoreProvider
50     }
51 
52     /**
53      * Returns the key-value store for given preference.
54      *
55      * Must call [setKeyValueStoreProvider] before invoking this method, otherwise
56      * [NullPointerException] is raised.
57      */
getKeyValueStorenull58     fun getKeyValueStore(context: Context, preference: PreferenceMetadata): KeyValueStore? =
59         keyValueStoreProvider.getKeyValueStore(context, preference)
60 
61     /** Creates [PreferenceScreenMetadata] of particular screen. */
62     fun create(context: Context, screenCoordinate: PreferenceScreenCoordinate) =
63         create(context, screenCoordinate.screenKey, screenCoordinate.args)
64 
65     /** Creates [PreferenceScreenMetadata] of particular screen key with given arguments. */
66     fun create(context: Context, screenKey: String?, args: Bundle?): PreferenceScreenMetadata? {
67         if (screenKey == null) return null
68         val factory = preferenceScreenMetadataFactories[screenKey] ?: return null
69         val appContext = context.applicationContext
70         if (factory is PreferenceScreenMetadataParameterizedFactory) {
71             if (args != null) return factory.create(appContext, args)
72             // In case the parameterized screen was a normal scree, it is expected to accept
73             // Bundle.EMPTY arguments and take care of backward compatibility.
74             if (factory.acceptEmptyArguments()) return factory.create(appContext)
75             Log.e(TAG, "screen $screenKey is parameterized but args is not provided")
76             return null
77         } else {
78             if (args == null) return factory.create(appContext)
79             Log.e(TAG, "screen $screenKey is not parameterized but args is provided")
80             return null
81         }
82     }
83 }
84 
85 /** Provider of [KeyValueStore]. */
interfacenull86 fun interface KeyValueStoreProvider {
87 
88     /**
89      * Returns the key-value store for given preference.
90      *
91      * Here are some use cases:
92      * - provide the default storage for all preferences
93      * - determine the storage per preference keys or the interfaces implemented by the preference
94      */
95     fun getKeyValueStore(context: Context, preference: PreferenceMetadata): KeyValueStore?
96 }
97