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.settings.service
18 
19 import android.content.ComponentName
20 import android.content.Context
21 import android.content.Intent
22 import android.platform.test.annotations.RequiresFlagsEnabled
23 import android.platform.test.flag.junit.CheckFlagsRule
24 import android.platform.test.flag.junit.DeviceFlagsValueProvider
25 import android.service.settings.preferences.GetValueRequest
26 import android.service.settings.preferences.GetValueResult
27 import android.service.settings.preferences.SetValueRequest
28 import android.service.settings.preferences.SetValueResult
29 import android.service.settings.preferences.SettingsPreferenceMetadata
30 import android.service.settings.preferences.SettingsPreferenceValue
31 import androidx.test.core.app.ApplicationProvider
32 import androidx.test.ext.junit.runners.AndroidJUnit4
33 import com.android.settings.homepage.SettingsHomepageActivity
34 import com.android.settingslib.flags.Flags.FLAG_SETTINGS_CATALYST
35 import com.android.settingslib.graph.PreferenceCoordinate
36 import com.android.settingslib.graph.PreferenceGetterErrorCode
37 import com.android.settingslib.graph.PreferenceGetterFlags
38 import com.android.settingslib.graph.PreferenceGetterResponse
39 import com.android.settingslib.graph.PreferenceSetterResult
40 import com.android.settingslib.graph.proto.PreferenceProto
41 import com.android.settingslib.graph.proto.PreferenceValueProto
42 import com.android.settingslib.graph.proto.TextProto
43 import com.android.settingslib.graph.toProto
44 import com.android.settingslib.metadata.SensitivityLevel
45 import com.google.common.truth.Truth.assertThat
46 import org.junit.Rule
47 import org.junit.Test
48 import org.junit.runner.RunWith
49 
50 @RunWith(AndroidJUnit4::class)
51 @RequiresFlagsEnabled(FLAG_SETTINGS_CATALYST)
52 class PreferenceServiceRequestTransformerTest {
53 
54     @get:Rule
55     val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
56 
57     @Test
transformFrameworkGetValueRequest_returnsValidCatalystRequestnull58     fun transformFrameworkGetValueRequest_returnsValidCatalystRequest() {
59         val fRequest = GetValueRequest.Builder("screen", "pref").build()
60         val cRequest = transformFrameworkGetValueRequest(fRequest)
61         with(cRequest) {
62             assertThat(preferences).hasLength(1)
63             assertThat(preferences.first().screenKey).isEqualTo(fRequest.screenKey)
64             assertThat(preferences.first().key).isEqualTo(fRequest.preferenceKey)
65             assertThat(flags).isEqualTo(PreferenceGetterFlags.ALL)
66         }
67     }
68 
69     @Test
transformCatalystGetValueResponse_success_returnsValidFrameworkResponsenull70     fun transformCatalystGetValueResponse_success_returnsValidFrameworkResponse() {
71         val context: Context = ApplicationProvider.getApplicationContext()
72         val fRequest = GetValueRequest.Builder("screen", "key").build()
73         val cResult = PreferenceGetterResponse(
74             emptyMap(),
75             mapOf(
76                 PreferenceCoordinate(fRequest.screenKey, fRequest.preferenceKey) to
77                         PreferenceProto.newBuilder()
78                             .setKey("key")
79                             .setTitle(TextProto.newBuilder().setString("title"))
80                             .setSummary(TextProto.newBuilder().setString("summary"))
81                             .setEnabled(true)
82                             .setAvailable(true)
83                             .setRestricted(true)
84                             .setPersistent(true)
85                             .setSensitivityLevel(SensitivityLevel.LOW_SENSITIVITY)
86                             .setLaunchIntent(
87                                 Intent(context, SettingsHomepageActivity::class.java).toProto()
88                             )
89                             .setValue(PreferenceValueProto.newBuilder().setBooleanValue(true))
90                             .build()
91             )
92         )
93         val fResult = transformCatalystGetValueResponse(context, fRequest, cResult)
94         assertThat(fResult!!.resultCode).isEqualTo(GetValueResult.RESULT_OK)
95         with(fResult.metadata!!) {
96             assertThat(title).isEqualTo("title")
97             assertThat(summary).isEqualTo("summary")
98             assertThat(isEnabled).isTrue()
99             assertThat(isAvailable).isTrue()
100             assertThat(isRestricted).isTrue()
101             assertThat(isWritable).isTrue()
102             assertThat(writeSensitivity)
103                 .isEqualTo(SettingsPreferenceMetadata.EXPECT_POST_CONFIRMATION)
104             assertThat(launchIntent).isNotNull()
105             assertThat(launchIntent!!.component!!.className)
106                 .isEqualTo(SettingsHomepageActivity::class.java.name)
107         }
108         with(fResult.value!!) {
109             assertThat(type).isEqualTo(SettingsPreferenceValue.TYPE_BOOLEAN)
110             assertThat(booleanValue).isTrue()
111         }
112     }
113 
114     @Test
transformCatalystGetValueResponse_failure_returnsValidFrameworkResponsenull115     fun transformCatalystGetValueResponse_failure_returnsValidFrameworkResponse() {
116         val context: Context = ApplicationProvider.getApplicationContext()
117         val fRequest = GetValueRequest.Builder("screen", "key").build()
118         val cResult = PreferenceGetterResponse(
119             mapOf(
120                 PreferenceCoordinate(fRequest.screenKey, fRequest.preferenceKey) to
121                         PreferenceGetterErrorCode.NOT_FOUND
122             ),
123             emptyMap()
124         )
125         val fResult = transformCatalystGetValueResponse(context, fRequest, cResult)
126         with(fResult!!) {
127             assertThat(resultCode).isEqualTo(GetValueResult.RESULT_UNSUPPORTED)
128             assertThat(metadata).isNull()
129             assertThat(value).isNull()
130         }
131     }
132 
133     @Test
transformCatalystGetValueResponse_invalidResponse_returnsNullnull134     fun transformCatalystGetValueResponse_invalidResponse_returnsNull() {
135         val context: Context = ApplicationProvider.getApplicationContext()
136         val fRequest = GetValueRequest.Builder("screen", "key").build()
137         val cResult = PreferenceGetterResponse(emptyMap(), emptyMap())
138         val fResult = transformCatalystGetValueResponse(context, fRequest, cResult)
139         assertThat(fResult).isNull()
140     }
141 
142     @Test
transformFrameworkSetValueRequest_typeBoolean_returnsValidCatalystRequestnull143     fun transformFrameworkSetValueRequest_typeBoolean_returnsValidCatalystRequest() {
144         val fRequest = SetValueRequest.Builder(
145             "screen",
146             "pref",
147             SettingsPreferenceValue.Builder(SettingsPreferenceValue.TYPE_BOOLEAN)
148                 .setBooleanValue(true)
149                 .build()
150         ).build()
151         val cRequest = transformFrameworkSetValueRequest(fRequest)
152         with(cRequest!!) {
153             assertThat(screenKey).isEqualTo(fRequest.screenKey)
154             assertThat(key).isEqualTo(fRequest.preferenceKey)
155             assertThat(value.hasBooleanValue()).isTrue()
156             assertThat(value.booleanValue).isTrue()
157         }
158     }
159 
160     @Test
transformFrameworkSetValueRequest_typeInt_returnsValidCatalystRequestnull161     fun transformFrameworkSetValueRequest_typeInt_returnsValidCatalystRequest() {
162         val fRequest = SetValueRequest.Builder(
163             "screen",
164             "pref",
165             SettingsPreferenceValue.Builder(SettingsPreferenceValue.TYPE_INT)
166                 .setIntValue(5)
167                 .build()
168         ).build()
169         val cRequest = transformFrameworkSetValueRequest(fRequest)
170         with(cRequest!!) {
171             assertThat(screenKey).isEqualTo(fRequest.screenKey)
172             assertThat(key).isEqualTo(fRequest.preferenceKey)
173             assertThat(value.hasIntValue()).isTrue()
174             assertThat(value.intValue).isEqualTo(5)
175         }
176     }
177 
178     @Test
transformFrameworkSetValueRequest_typeString_returnsNullnull179     fun transformFrameworkSetValueRequest_typeString_returnsNull() {
180         val fRequest = SetValueRequest.Builder(
181             "screen",
182             "pref",
183             SettingsPreferenceValue.Builder(SettingsPreferenceValue.TYPE_STRING)
184                 .setStringValue("value")
185                 .build()
186         ).build()
187         val cRequest = transformFrameworkSetValueRequest(fRequest)
188         assertThat(cRequest).isNull()
189     }
190 
191     @Test
transformCatalystSetValueResponse_returnsValidFrameworkResponsenull192     fun transformCatalystSetValueResponse_returnsValidFrameworkResponse() {
193         assertThat(
194             transformCatalystSetValueResponse(PreferenceSetterResult.OK).resultCode
195         ).isEqualTo(SetValueResult.RESULT_OK)
196 
197         assertThat(
198             transformCatalystSetValueResponse(PreferenceSetterResult.UNAVAILABLE).resultCode
199         ).isEqualTo(SetValueResult.RESULT_UNAVAILABLE)
200 
201         assertThat(
202             transformCatalystSetValueResponse(PreferenceSetterResult.DISABLED).resultCode
203         ).isEqualTo(SetValueResult.RESULT_DISABLED)
204 
205         assertThat(
206             transformCatalystSetValueResponse(PreferenceSetterResult.UNSUPPORTED).resultCode
207         ).isEqualTo(SetValueResult.RESULT_UNSUPPORTED)
208 
209         assertThat(
210             transformCatalystSetValueResponse(PreferenceSetterResult.DISALLOW).resultCode
211         ).isEqualTo(SetValueResult.RESULT_DISALLOW)
212 
213         assertThat(
214             transformCatalystSetValueResponse(PreferenceSetterResult.REQUIRE_APP_PERMISSION)
215                 .resultCode
216         ).isEqualTo(SetValueResult.RESULT_REQUIRE_APP_PERMISSION)
217 
218         assertThat(
219             transformCatalystSetValueResponse(PreferenceSetterResult.REQUIRE_USER_AGREEMENT)
220                 .resultCode
221         ).isEqualTo(SetValueResult.RESULT_REQUIRE_USER_CONSENT)
222 
223         assertThat(
224             transformCatalystSetValueResponse(PreferenceSetterResult.RESTRICTED).resultCode
225         ).isEqualTo(SetValueResult.RESULT_RESTRICTED)
226 
227         assertThat(
228             transformCatalystSetValueResponse(PreferenceSetterResult.INVALID_REQUEST).resultCode
229         ).isEqualTo(SetValueResult.RESULT_INVALID_REQUEST)
230 
231         assertThat(
232             transformCatalystSetValueResponse(PreferenceSetterResult.INTERNAL_ERROR).resultCode
233         ).isEqualTo(SetValueResult.RESULT_INTERNAL_ERROR)
234     }
235 }