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 }