165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze/* 22078bc2358031ef3a191900d9036daf4251911c1Matthew Fritze * Copyright (C) 2017 The Android Open Source Project 365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * 465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Licensed under the Apache License, Version 2.0 (the "License"); 565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * you may not use this file except in compliance with the License. 665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * You may obtain a copy of the License at 765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * 865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * http://www.apache.org/licenses/LICENSE-2.0 965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * 1065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Unless required by applicable law or agreed to in writing, software 1165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * distributed under the License is distributed on an "AS IS" BASIS, 1265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * See the License for the specific language governing permissions and 1465fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * limitations under the License. 152078bc2358031ef3a191900d9036daf4251911c1Matthew Fritze * 1665fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze */ 1765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze 182078bc2358031ef3a191900d9036daf4251911c1Matthew Fritzepackage com.android.settings.search; 1965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze 203746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritzeimport android.content.Intent; 213746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze 222b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport android.content.Context; 232b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport android.os.Parcel; 24694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritzeimport android.provider.Settings; 252b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritzeimport com.android.internal.annotations.VisibleForTesting; 262b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 2765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze/** 2865fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Abstract Payload for inline settings results. 2965fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze */ 3065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritzepublic abstract class InlinePayload extends ResultPayload { 312b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 322b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze public static final int FALSE = 0; 332b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze public static final int TRUE = 1; 342b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 3565fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze /** 362b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * Defines the key to access and store the Setting the inline result represents. 3765fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze */ 382b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze @VisibleForTesting 392b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze final String mSettingKey; 4065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze 4165fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze /** 4265fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze * Defines where the Setting is stored. 4365fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze */ 442b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze @SettingsSource final int mSettingSource; 452b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 462b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze /** 472b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * True when the setting is available for the device. 482b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze */ 492b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze final boolean mIsDeviceSupported; 5065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze 512b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze /** 52458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze * The default value for the setting. 53458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze */ 54458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze final int mDefaultvalue; 55458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze 56458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze /** 572b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @param key uniquely identifies the stored setting. 582b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @param source of the setting. Used to determine where to get and set the setting. 592b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @param intent to the setting page. 602b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @param isDeviceSupported is true when the setting is valid for the given device. 612b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze */ 62694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze public InlinePayload(String key, @SettingsSource int source, Intent intent, 63458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze boolean isDeviceSupported, int defaultValue) { 643746d9e25f2805b16b69eb7420a629fc66f6a788Matthew Fritze super(intent); 652b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mSettingKey = key; 662b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mSettingSource = source; 672b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mIsDeviceSupported = isDeviceSupported; 68458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze mDefaultvalue = defaultValue; 692b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze } 702b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 712b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze InlinePayload(Parcel parcel) { 72458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze super(parcel.readParcelable(Intent.class.getClassLoader())); 732b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mSettingKey = parcel.readString(); 742b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mSettingSource = parcel.readInt(); 752b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze mIsDeviceSupported = parcel.readInt() == TRUE; 76458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze mDefaultvalue = parcel.readInt(); 772b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze } 782b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 792b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze @Override 802b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze public void writeToParcel(Parcel dest, int flags) { 812b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze super.writeToParcel(dest, flags); 822b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze dest.writeString(mSettingKey); 832b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze dest.writeInt(mSettingSource); 842b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze dest.writeInt(mIsDeviceSupported ? TRUE : FALSE); 85458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze dest.writeInt(mDefaultvalue); 862b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze } 872b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 88694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze @Override 89694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze @PayloadType public abstract int getType(); 90694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 912b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze /** 922b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @returns the status of the underlying setting. See {@link ResultPayload.Availability} for 932b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * possible values. 942b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze */ 952b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze @Availability public int getAvailability() { 962b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze if (mIsDeviceSupported) { 972b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze return Availability.AVAILABLE; 982b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze } 992b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze return Availability.DISABLED_UNSUPPORTED; 10065fb01b520a8eace6c5670c06e6ba5f81ab609afMatthew Fritze } 1012b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 1022b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze /** 103694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * Checks if the input is valid for the given setting. 104694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * 105694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * @param input The number to be get or set for the setting. 106694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * @return {@param input} mapped to the public-facing API for settings. 107694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * @throws IllegalArgumentException when the input is not valid for the given inline type. 108694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze */ 109694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze protected abstract int standardizeInput(int input) throws IllegalArgumentException; 110694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 111694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze /** 1122b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @returns the current value of the setting. 1132b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze */ 114694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze public int getValue(Context context) { 115694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze int settingsValue = -1; 116694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze switch(mSettingSource) { 117694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.SECURE: 118694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze settingsValue = Settings.Secure.getInt(context.getContentResolver(), 119458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze mSettingKey, mDefaultvalue); 120694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze break; 121694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.SYSTEM: 122694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze settingsValue = Settings.System.getInt(context.getContentResolver(), 123458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze mSettingKey, mDefaultvalue); 124694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze break; 125694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 126694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.GLOBAL: 127694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze settingsValue = Settings.Global.getInt(context.getContentResolver(), 128458bb887e130926f36d8926ea8462ecfbfd1e0efMatthew Fritze mSettingKey, mDefaultvalue); 129694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze break; 130694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze } 131694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 132694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return standardizeInput(settingsValue); 133694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze } 1342b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze 1352b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze /** 1362b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * Attempts to set the setting value. 1372b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * 138694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze * @param newValue is the requested value for the setting. 1392b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze * @returns true when the setting was changed, and false otherwise. 1402b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze */ 141694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze public boolean setValue(Context context, int newValue) { 142694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze newValue = standardizeInput(newValue); 143694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 144694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze switch(mSettingSource) { 145694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.GLOBAL: 146694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return Settings.Global.putInt(context.getContentResolver(), mSettingKey, newValue); 147694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.SECURE: 148694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return Settings.Secure.putInt(context.getContentResolver(), mSettingKey, newValue); 149694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.SYSTEM: 150694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return Settings.System.putInt(context.getContentResolver(), mSettingKey, newValue); 151694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze case SettingsSource.UNKNOWN: 152694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return false; 153694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze } 154694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze 155694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze return false; 156694088075e57f031a36a1000d6c69e356fe52d51Matthew Fritze } 1572b1a88da3df42e4ec1cb2fb9814f7a440b3735f2Matthew Fritze}