Snap for 5374457 from 93697136b7 to qt-release
Change-Id: Ia5370565cf09ab7e411a4e59b4b08d5eeb7e00ad
This commit is contained in:
96
res/layout/preference_single_target.xml
Normal file
96
res/layout/preference_single_target.xml
Normal file
@@ -0,0 +1,96 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2019 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.
|
||||
-->
|
||||
|
||||
<!-- Based off preference_two_target.xml with Material ripple moved to parent for full ripple. -->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:settings="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="?android:attr/listPreferredItemHeightSmall"
|
||||
android:gravity="center_vertical"
|
||||
android:background="?android:attr/selectableItemBackground"
|
||||
android:clipToPadding="false">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:gravity="start|center_vertical"
|
||||
android:clipToPadding="false"
|
||||
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
|
||||
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/icon_frame"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="start|center_vertical"
|
||||
android:minWidth="56dp"
|
||||
android:orientation="horizontal"
|
||||
android:clipToPadding="false"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="4dp">
|
||||
<androidx.preference.internal.PreferenceImageView
|
||||
android:id="@android:id/icon"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
settings:maxWidth="48dp"
|
||||
settings:maxHeight="48dp" />
|
||||
</LinearLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_weight="1"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="?android:attr/textAppearanceListItem"
|
||||
android:ellipsize="marquee" />
|
||||
|
||||
<TextView
|
||||
android:id="@android:id/summary"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@android:id/title"
|
||||
android:layout_alignStart="@android:id/title"
|
||||
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
|
||||
android:textColor="?android:attr/textColorSecondary"
|
||||
android:maxLines="10" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<include layout="@layout/preference_two_target_divider" />
|
||||
|
||||
<!-- Preference should place its actual preference widget here. -->
|
||||
<LinearLayout
|
||||
android:id="@android:id/widget_frame"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:minWidth="64dp"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical" />
|
||||
|
||||
</LinearLayout>
|
||||
@@ -2390,8 +2390,6 @@
|
||||
<string name="wifi_hotspot_configure_ap_text_summary">AndroidAP WPA2 PSK hotspot</string>
|
||||
<!-- Default access point SSID used for tethering -->
|
||||
<string name="wifi_tether_configure_ssid_default">AndroidHotspot</string>
|
||||
<!-- Summary text when hotspot is disabled because airplane mode is on [CHAR LIMIT=80]-->
|
||||
<string name="wifi_tether_disabled_by_airplane">Unavailable because airplane mode is turned on</string>
|
||||
|
||||
<!-- Do not translate. Used for diagnostic screens, precise translation is not necessary
|
||||
Wi-Fi Testing on the diagnostic screen-->
|
||||
@@ -5242,8 +5240,8 @@
|
||||
<string name="battery_tip_high_usage_title" product="tablet">Tablet used more than usual</string>
|
||||
<!-- Title for the battery high usage tip [CHAR LIMIT=NONE] -->
|
||||
<string name="battery_tip_high_usage_title" product="device">Device used more than usual</string>
|
||||
<!-- Summary for the battery high usage tip, which presents battery may run out soon [CHAR LIMIT=NONE] -->
|
||||
<string name="battery_tip_high_usage_summary">Battery may run out soon</string>
|
||||
<!-- Summary for the battery high usage tip, which presents battery may run out earlier [CHAR LIMIT=NONE] -->
|
||||
<string name="battery_tip_high_usage_summary">Battery may run out earlier than usual</string>
|
||||
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
|
||||
<string name="battery_tip_dialog_message" product="default">Your phone has been used more than usual. Your battery may run out sooner than expected.\n\nTop <xliff:g id="number">%1$d</xliff:g> apps you used since full charge:</string>
|
||||
<!-- Message for battery tip dialog to show the status about the battery [CHAR LIMIT=NONE] -->
|
||||
@@ -10686,6 +10684,9 @@
|
||||
<!-- Title for the Volume dialog (settings panel) with all volume streams[CHAR LIMIT=50] -->
|
||||
<string name="volume_connectivity_panel_title">Volume</string>
|
||||
|
||||
<!-- Subtitle explaining that mobile data cannot be used while airplane mode is on [CHAR LIMIT=50] -->
|
||||
<string name="mobile_data_ap_mode_disabled">Unavailable during airplane mode</string>
|
||||
|
||||
<!-- UI debug setting: force desktop mode [CHAR LIMIT=50] -->
|
||||
<string name="force_desktop_mode">Force desktop mode</string>
|
||||
<!-- UI debug setting: force desktop mode summary [CHAR LIMIT=NONE] -->
|
||||
@@ -10736,8 +10737,8 @@
|
||||
|
||||
<!-- Summary for the accessibility usage preference in the Privacy page. [CHAR LIMIT=NONE] -->
|
||||
<plurals name="accessibility_usage_summary">
|
||||
<item quantity="one">1 service has full access to your device</item>
|
||||
<item quantity="other"><xliff:g id="service_count">%1$d</xliff:g> services have full access to your device</item>
|
||||
<item quantity="one">1 app has full access to your device</item>
|
||||
<item quantity="other"><xliff:g id="service_count">%1$d</xliff:g> apps have full access to your device</item>
|
||||
</plurals>
|
||||
|
||||
<!-- Title for notification channel slice. [CHAR LIMIT=NONE] -->
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
android:title="@string/build_number"
|
||||
android:summary="@string/summary_placeholder"
|
||||
settings:enableCopying="true"
|
||||
settings:allowDynamicSummaryInSlice="true"
|
||||
settings:controller="com.android.settings.deviceinfo.firmwareversion.SimpleBuildNumberPreferenceController"/>
|
||||
|
||||
</PreferenceScreen>
|
||||
@@ -115,6 +115,7 @@
|
||||
android:title="@string/status_imei"
|
||||
settings:keywords="@string/keywords_imei_info"
|
||||
android:summary="@string/summary_placeholder"
|
||||
settings:allowDynamicSummaryInSlice="true"
|
||||
settings:controller="com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController"/>
|
||||
|
||||
<!-- Android version -->
|
||||
|
||||
@@ -50,6 +50,8 @@ import androidx.preference.PreferenceManager;
|
||||
import com.android.internal.util.ArrayUtils;
|
||||
import com.android.settings.Settings.WifiSettingsActivity;
|
||||
import com.android.settings.applications.manageapplications.ManageApplications;
|
||||
import com.android.settings.backup.BackupSettingsHelper;
|
||||
import com.android.settings.backup.UserBackupSettingsActivity;
|
||||
import com.android.settings.core.OnActivityResultListener;
|
||||
import com.android.settings.core.SettingsBaseActivity;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
@@ -630,6 +632,12 @@ public class SettingsActivity extends SettingsBaseActivity
|
||||
showDev, isAdmin)
|
||||
|| somethingChanged;
|
||||
|
||||
// Enable/disable backup settings depending on whether backup is activated for the user.
|
||||
boolean isBackupActive = new BackupSettingsHelper(this).isBackupServiceActive();
|
||||
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
|
||||
UserBackupSettingsActivity.class.getName()), isBackupActive, isAdmin)
|
||||
|| somethingChanged;
|
||||
|
||||
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
|
||||
Settings.WifiDisplaySettingsActivity.class.getName()),
|
||||
WifiDisplaySettings.isAvailable(this), isAdmin)
|
||||
|
||||
@@ -209,7 +209,7 @@ public class BackupSettingsHelper {
|
||||
}
|
||||
|
||||
/** Checks if backup service is enabled for this user. */
|
||||
private boolean isBackupServiceActive() {
|
||||
public boolean isBackupServiceActive() {
|
||||
boolean backupOkay;
|
||||
try {
|
||||
backupOkay = mBackupManager.isBackupServiceActive(UserHandle.myUserId());
|
||||
|
||||
@@ -16,12 +16,8 @@
|
||||
|
||||
package com.android.settings.deviceinfo;
|
||||
|
||||
import static android.content.Context.CLIPBOARD_SERVICE;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@@ -79,11 +75,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
try {
|
||||
return BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY);
|
||||
} catch (Exception e) {
|
||||
return mContext.getText(R.string.device_info_default);
|
||||
}
|
||||
return BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -99,29 +91,7 @@ public class BuildNumberPreferenceController extends BasePreferenceController im
|
||||
|
||||
@Override
|
||||
public int getAvailabilityStatus() {
|
||||
return AVAILABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSliceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCopyableSlice() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copy() {
|
||||
final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
|
||||
CLIPBOARD_SERVICE);
|
||||
final ClipData clip = ClipData.newPlainText("text", getSummary());
|
||||
clipboard.setPrimaryClip(clip);
|
||||
|
||||
final String toast = mContext.getString(R.string.copyable_slice_toast,
|
||||
mContext.getText(R.string.build_number));
|
||||
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
|
||||
return AVAILABLE_UNSEARCHABLE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,10 +16,16 @@
|
||||
|
||||
package com.android.settings.deviceinfo.firmwareversion;
|
||||
|
||||
import static android.content.Context.CLIPBOARD_SERVICE;
|
||||
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.text.BidiFormatter;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
|
||||
public class SimpleBuildNumberPreferenceController extends BasePreferenceController {
|
||||
@@ -38,4 +44,26 @@ public class SimpleBuildNumberPreferenceController extends BasePreferenceControl
|
||||
public CharSequence getSummary() {
|
||||
return BidiFormatter.getInstance().unicodeWrap(Build.DISPLAY);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSliceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCopyableSlice() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void copy() {
|
||||
final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
|
||||
CLIPBOARD_SERVICE);
|
||||
final ClipData clip = ClipData.newPlainText("text", getSummary());
|
||||
clipboard.setPrimaryClip(clip);
|
||||
|
||||
final String toast = mContext.getString(R.string.copyable_slice_toast,
|
||||
mContext.getText(R.string.build_number));
|
||||
Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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.settings.homepage.contextualcards.deviceinfo;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.net.Uri;
|
||||
import android.os.PowerManager;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.builders.ListBuilder;
|
||||
import androidx.slice.builders.SliceAction;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SubSettings;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.fuelgauge.BatteryInfo;
|
||||
import com.android.settings.fuelgauge.PowerUsageSummary;
|
||||
import com.android.settings.slices.CustomSliceRegistry;
|
||||
import com.android.settings.slices.CustomSliceable;
|
||||
import com.android.settings.slices.SliceBuilderUtils;
|
||||
|
||||
/**
|
||||
* Utility class to build a Battery Slice, and handle all associated actions.
|
||||
*/
|
||||
public class BatteryInfoSlice implements CustomSliceable {
|
||||
private static final String TAG = "BatteryInfoSlice";
|
||||
|
||||
private final Context mContext;
|
||||
|
||||
private BatteryInfo mBatteryInfo;
|
||||
private boolean mIsBatteryInfoLoading;
|
||||
|
||||
public BatteryInfoSlice(Context context) {
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Slice getSlice() {
|
||||
if (mBatteryInfo == null) {
|
||||
mIsBatteryInfoLoading = true;
|
||||
loadBatteryInfo();
|
||||
}
|
||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||
R.drawable.ic_settings_battery);
|
||||
final CharSequence title = mContext.getText(R.string.power_usage_summary_title);
|
||||
final SliceAction primarySliceAction = SliceAction.createDeeplink(getPrimaryAction(), icon,
|
||||
ListBuilder.ICON_IMAGE, title);
|
||||
final Slice slice = new ListBuilder(mContext, CustomSliceRegistry.BATTERY_INFO_SLICE_URI,
|
||||
ListBuilder.INFINITY)
|
||||
.setAccentColor(Utils.getColorAccentDefaultColor(mContext))
|
||||
.setHeader(new ListBuilder.HeaderBuilder().setTitle(title))
|
||||
.addRow(new ListBuilder.RowBuilder()
|
||||
.setTitle(getBatteryPercentString(), mIsBatteryInfoLoading)
|
||||
.setSubtitle(getSummary(), mIsBatteryInfoLoading)
|
||||
.setPrimaryAction(primarySliceAction))
|
||||
.build();
|
||||
mBatteryInfo = null;
|
||||
mIsBatteryInfoLoading = false;
|
||||
return slice;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri getUri() {
|
||||
return CustomSliceRegistry.BATTERY_INFO_SLICE_URI;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNotifyChange(Intent intent) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent getIntent() {
|
||||
final String screenTitle = mContext.getText(R.string.power_usage_summary_title).toString();
|
||||
return SliceBuilderUtils.buildSearchResultPageIntent(mContext,
|
||||
PowerUsageSummary.class.getName(), "" /* key */, screenTitle,
|
||||
SettingsEnums.SLICE)
|
||||
.setClassName(mContext.getPackageName(), SubSettings.class.getName())
|
||||
.setData(CustomSliceRegistry.BATTERY_INFO_SLICE_URI);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IntentFilter getIntentFilter() {
|
||||
final IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
|
||||
intentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
|
||||
intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
|
||||
intentFilter.addAction(Intent.ACTION_BATTERY_LEVEL_CHANGED);
|
||||
return intentFilter;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void loadBatteryInfo() {
|
||||
BatteryInfo.getBatteryInfo(mContext, info -> {
|
||||
mBatteryInfo = info;
|
||||
mContext.getContentResolver().notifyChange(getUri(), null);
|
||||
}, true);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
CharSequence getBatteryPercentString() {
|
||||
return mBatteryInfo == null ? null : mBatteryInfo.batteryPercentString;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
CharSequence getSummary() {
|
||||
if (mBatteryInfo == null) {
|
||||
return null;
|
||||
}
|
||||
return mBatteryInfo.remainingLabel == null ? mBatteryInfo.statusLabel
|
||||
: mBatteryInfo.remainingLabel;
|
||||
}
|
||||
|
||||
private PendingIntent getPrimaryAction() {
|
||||
final Intent intent = getIntent();
|
||||
return PendingIntent.getActivity(mContext, 0 /* requestCode */,
|
||||
intent, 0 /* flags */);
|
||||
}
|
||||
}
|
||||
@@ -74,8 +74,27 @@ public class MobileDataSlice implements CustomSliceable {
|
||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||
R.drawable.ic_network_cell);
|
||||
final String title = mContext.getText(R.string.mobile_data_settings_title).toString();
|
||||
final CharSequence summary = getSummary();
|
||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
|
||||
|
||||
// Return a Slice without the mobile data toggle when airplane mode is on.
|
||||
if (isAirplaneModeEnabled()) {
|
||||
final CharSequence summary = mContext.getText(R.string.mobile_data_ap_mode_disabled);
|
||||
// Intent does nothing, but we have to pass an intent to the Row.
|
||||
final PendingIntent intent = PendingIntent.getActivity(mContext, 0 /* requestCode */,
|
||||
new Intent(), 0 /* flags */);
|
||||
final SliceAction deadAction =
|
||||
SliceAction.create(intent, icon, ListBuilder.ICON_IMAGE, title);
|
||||
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
|
||||
ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
.addRow(new ListBuilder.RowBuilder()
|
||||
.setTitle(title)
|
||||
.setSubtitle(summary)
|
||||
.setPrimaryAction(deadAction));
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
final CharSequence summary = getSummary();
|
||||
final PendingIntent toggleAction = getBroadcastIntent(mContext);
|
||||
final PendingIntent primaryAction = getPrimaryAction();
|
||||
final SliceAction primarySliceAction = SliceAction.createDeeplink(primaryAction, icon,
|
||||
@@ -101,11 +120,6 @@ public class MobileDataSlice implements CustomSliceable {
|
||||
|
||||
@Override
|
||||
public void onNotifyChange(Intent intent) {
|
||||
// Don't make a change if we are in Airplane Mode.
|
||||
if (isAirplaneModeEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
final boolean newState = intent.getBooleanExtra(EXTRA_TOGGLE_STATE,
|
||||
isMobileDataEnabled());
|
||||
|
||||
|
||||
@@ -18,25 +18,6 @@ package com.android.settings.slices;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.Uri;
|
||||
import android.util.ArrayMap;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.flashlight.FlashlightSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.BatteryInfoSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
|
||||
import com.android.settings.location.LocationSlice;
|
||||
import com.android.settings.media.MediaOutputSlice;
|
||||
import com.android.settings.network.telephony.MobileDataSlice;
|
||||
import com.android.settings.wifi.slice.ContextualWifiSlice;
|
||||
import com.android.settings.wifi.slice.WifiSlice;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.WeakHashMap;
|
||||
@@ -47,17 +28,12 @@ import java.util.WeakHashMap;
|
||||
*/
|
||||
public class CustomSliceManager {
|
||||
|
||||
@VisibleForTesting
|
||||
final Map<Uri, Class<? extends CustomSliceable>> mUriMap;
|
||||
|
||||
private final Context mContext;
|
||||
private final Map<Uri, CustomSliceable> mSliceableCache;
|
||||
|
||||
public CustomSliceManager(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
mUriMap = new ArrayMap<>();
|
||||
mSliceableCache = new WeakHashMap<>();
|
||||
addSlices();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -67,12 +43,12 @@ public class CustomSliceManager {
|
||||
* the only thing that should be needed to create the object.
|
||||
*/
|
||||
public CustomSliceable getSliceableFromUri(Uri uri) {
|
||||
final Uri newUri = removeParameterFromUri(uri);
|
||||
final Uri newUri = CustomSliceRegistry.removeParameterFromUri(uri);
|
||||
if (mSliceableCache.containsKey(newUri)) {
|
||||
return mSliceableCache.get(newUri);
|
||||
}
|
||||
|
||||
final Class clazz = mUriMap.get(newUri);
|
||||
final Class clazz = CustomSliceRegistry.getSliceClassByUri(newUri);
|
||||
if (clazz == null) {
|
||||
throw new IllegalArgumentException("No Slice found for uri: " + uri);
|
||||
}
|
||||
@@ -82,9 +58,6 @@ public class CustomSliceManager {
|
||||
return sliceable;
|
||||
}
|
||||
|
||||
private Uri removeParameterFromUri(Uri uri) {
|
||||
return uri != null ? uri.buildUpon().clearQuery().build() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a {@link CustomSliceable} associated to the Action.
|
||||
@@ -95,39 +68,4 @@ public class CustomSliceManager {
|
||||
public CustomSliceable getSliceableFromIntentAction(String action) {
|
||||
return getSliceableFromUri(Uri.parse(action));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if {@param uri} is a valid Slice Uri handled by
|
||||
* {@link CustomSliceManager}.
|
||||
*/
|
||||
public boolean isValidUri(Uri uri) {
|
||||
return mUriMap.containsKey(removeParameterFromUri(uri));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if {@param action} is a valid intent action handled by
|
||||
* {@link CustomSliceManager}.
|
||||
*/
|
||||
public boolean isValidAction(String action) {
|
||||
return isValidUri(Uri.parse(action));
|
||||
}
|
||||
|
||||
private void addSlices() {
|
||||
mUriMap.put(CustomSliceRegistry.BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.BATTERY_INFO_SLICE_URI, BatteryInfoSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.DATA_USAGE_SLICE_URI, DataUsageSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.FLASHLIGHT_SLICE_URI, FlashlightSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.LOCATION_SLICE_URI, LocationSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.NOTIFICATION_CHANNEL_SLICE_URI,
|
||||
NotificationChannelSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.STORAGE_SLICE_URI, StorageSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.WIFI_SLICE_URI, WifiSlice.class);
|
||||
mUriMap.put(CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,11 +24,30 @@ import static com.android.settings.notification.ZenModePreferenceController.ZEN_
|
||||
import android.content.ContentResolver;
|
||||
import android.net.Uri;
|
||||
import android.provider.SettingsSlicesContract;
|
||||
import android.util.ArrayMap;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settings.flashlight.FlashlightSlice;
|
||||
import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice;
|
||||
import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.BatteryFixSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.BluetoothDevicesSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.LowStorageSlice;
|
||||
import com.android.settings.homepage.contextualcards.slices.NotificationChannelSlice;
|
||||
import com.android.settings.location.LocationSlice;
|
||||
import com.android.settings.media.MediaOutputSlice;
|
||||
import com.android.settings.network.telephony.MobileDataSlice;
|
||||
import com.android.settings.wifi.calling.WifiCallingSliceHelper;
|
||||
import com.android.settings.wifi.slice.ContextualWifiSlice;
|
||||
import com.android.settings.wifi.slice.WifiSlice;
|
||||
import com.android.settingslib.media.MediaOutputSliceConstants;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A registry of custom slice Uris.
|
||||
*/
|
||||
@@ -53,15 +72,7 @@ public class CustomSliceRegistry {
|
||||
.appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT)
|
||||
.appendPath(BatteryTipPreferenceController.PREF_NAME)
|
||||
.build();
|
||||
/**
|
||||
* Backing Uri for the Battery info Slice.
|
||||
*/
|
||||
public static final Uri BATTERY_INFO_SLICE_URI = new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(SettingsSliceProvider.SLICE_AUTHORITY)
|
||||
.appendEncodedPath(SettingsSlicesContract.PATH_SETTING_INTENT)
|
||||
.appendPath("battery_card")
|
||||
.build();
|
||||
|
||||
/**
|
||||
* Backing Uri for the Bluetooth Slice.
|
||||
*/
|
||||
@@ -287,4 +298,51 @@ public class CustomSliceRegistry {
|
||||
.appendPath(SettingsSlicesContract.PATH_SETTING_ACTION)
|
||||
.appendPath(MediaOutputSliceConstants.KEY_MEDIA_OUTPUT)
|
||||
.build();
|
||||
|
||||
@VisibleForTesting
|
||||
static final Map<Uri, Class<? extends CustomSliceable>> sUriToSlice;
|
||||
|
||||
static {
|
||||
sUriToSlice = new ArrayMap<>();
|
||||
|
||||
sUriToSlice.put(BATTERY_FIX_SLICE_URI, BatteryFixSlice.class);
|
||||
sUriToSlice.put(BLUETOOTH_DEVICES_SLICE_URI, BluetoothDevicesSlice.class);
|
||||
sUriToSlice.put(CONTEXTUAL_WIFI_SLICE_URI, ContextualWifiSlice.class);
|
||||
sUriToSlice.put(DATA_USAGE_SLICE_URI, DataUsageSlice.class);
|
||||
sUriToSlice.put(DEVICE_INFO_SLICE_URI, DeviceInfoSlice.class);
|
||||
sUriToSlice.put(EMERGENCY_INFO_SLICE_URI, EmergencyInfoSlice.class);
|
||||
sUriToSlice.put(FLASHLIGHT_SLICE_URI, FlashlightSlice.class);
|
||||
sUriToSlice.put(LOCATION_SLICE_URI, LocationSlice.class);
|
||||
sUriToSlice.put(LOW_STORAGE_SLICE_URI, LowStorageSlice.class);
|
||||
sUriToSlice.put(MOBILE_DATA_SLICE_URI, MobileDataSlice.class);
|
||||
sUriToSlice.put(NOTIFICATION_CHANNEL_SLICE_URI, NotificationChannelSlice.class);
|
||||
sUriToSlice.put(STORAGE_SLICE_URI, StorageSlice.class);
|
||||
sUriToSlice.put(WIFI_SLICE_URI, WifiSlice.class);
|
||||
sUriToSlice.put(MEDIA_OUTPUT_SLICE_URI, MediaOutputSlice.class);
|
||||
}
|
||||
|
||||
public static Class<? extends CustomSliceable> getSliceClassByUri(Uri uri) {
|
||||
return sUriToSlice.get(uri);
|
||||
}
|
||||
|
||||
public static Uri removeParameterFromUri(Uri uri) {
|
||||
return uri != null ? uri.buildUpon().clearQuery().build() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if {@param uri} is a valid Slice Uri handled by
|
||||
* {@link CustomSliceManager}.
|
||||
*/
|
||||
public static boolean isValidUri(Uri uri) {
|
||||
return sUriToSlice.containsKey(removeParameterFromUri(uri));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true} if {@param action} is a valid intent action handled by
|
||||
* {@link CustomSliceManager}.
|
||||
*/
|
||||
public static boolean isValidAction(String action) {
|
||||
return isValidUri(Uri.parse(action));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
|
||||
@Override
|
||||
public void onSlicePinned(Uri sliceUri) {
|
||||
if (mCustomSliceManager.isValidUri(sliceUri)) {
|
||||
if (CustomSliceRegistry.isValidUri(sliceUri)) {
|
||||
final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri(sliceUri);
|
||||
final IntentFilter filter = sliceable.getIntentFilter();
|
||||
if (filter != null) {
|
||||
@@ -194,7 +194,7 @@ public class SettingsSliceProvider extends SliceProvider {
|
||||
|
||||
// Before adding a slice to {@link CustomSliceManager}, please get approval
|
||||
// from the Settings team.
|
||||
if (mCustomSliceManager.isValidUri(sliceUri)) {
|
||||
if (CustomSliceRegistry.isValidUri(sliceUri)) {
|
||||
final CustomSliceable sliceable = mCustomSliceManager.getSliceableFromUri(
|
||||
sliceUri);
|
||||
return sliceable.getSlice();
|
||||
|
||||
@@ -63,7 +63,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
|
||||
|
||||
final CustomSliceManager mCustomSliceManager = FeatureFactory.getFactory(
|
||||
context).getSlicesFeatureProvider().getCustomSliceManager(context);
|
||||
if (mCustomSliceManager.isValidAction(action)) {
|
||||
if (CustomSliceRegistry.isValidAction(action)) {
|
||||
final CustomSliceable sliceable =
|
||||
mCustomSliceManager.getSliceableFromIntentAction(action);
|
||||
sliceable.onNotifyChange(intent);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class SliceDeepLinkSpringBoard extends Activity {
|
||||
// TODO (b/80263568) Avoid duplicating this list of Slice Uris.
|
||||
final CustomSliceManager customSliceManager = FeatureFactory.getFactory(this)
|
||||
.getSlicesFeatureProvider().getCustomSliceManager(this);
|
||||
if (customSliceManager.isValidUri(sliceUri)) {
|
||||
if (CustomSliceRegistry.isValidUri(sliceUri)) {
|
||||
final CustomSliceable sliceable =
|
||||
customSliceManager.getSliceableFromUri(sliceUri);
|
||||
launchIntent = sliceable.getIntent();
|
||||
|
||||
@@ -18,9 +18,10 @@ package com.android.settings.widget;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.core.content.res.TypedArrayUtils;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
@@ -28,23 +29,38 @@ import com.android.settings.R;
|
||||
* A preference with single target and a gear icon on the side.
|
||||
*/
|
||||
public class SingleTargetGearPreference extends Preference {
|
||||
|
||||
public SingleTargetGearPreference(Context context, AttributeSet attrs,
|
||||
int defStyleAttr, int defStyleRes) {
|
||||
public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr,
|
||||
int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
setWidgetLayoutResource(R.layout.preference_widget_gear_no_bg);
|
||||
init();
|
||||
}
|
||||
|
||||
public SingleTargetGearPreference(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
this(context, attrs, defStyleAttr, 0 /* defStyleRes */);
|
||||
super(context, attrs, defStyleAttr);
|
||||
init();
|
||||
}
|
||||
|
||||
public SingleTargetGearPreference(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.preferenceStyle,
|
||||
android.R.attr.preferenceStyle));
|
||||
super(context, attrs);
|
||||
init();
|
||||
}
|
||||
|
||||
public SingleTargetGearPreference(Context context) {
|
||||
this(context, null /* attrs */);
|
||||
super(context);
|
||||
init();
|
||||
}
|
||||
}
|
||||
|
||||
private void init() {
|
||||
setLayoutResource(R.layout.preference_single_target);
|
||||
setWidgetLayoutResource(R.layout.preference_widget_gear_optional_background);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||
super.onBindViewHolder(holder);
|
||||
final View divider = holder.findViewById(com.android.settingslib.R.id.two_target_divider);
|
||||
if (divider != null) {
|
||||
divider.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@ import android.widget.Switch;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.Preference.OnPreferenceClickListener;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
@@ -141,20 +140,17 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
* Launch carrier emergency address managemnent activity
|
||||
*/
|
||||
private final OnPreferenceClickListener mUpdateAddressListener =
|
||||
new OnPreferenceClickListener() {
|
||||
/*
|
||||
* Launch carrier emergency address managemnent activity
|
||||
*/
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
Intent carrierAppIntent = getCarrierActivityIntent();
|
||||
if (carrierAppIntent != null) {
|
||||
carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE);
|
||||
startActivity(carrierAppIntent);
|
||||
}
|
||||
return true;
|
||||
preference -> {
|
||||
Intent carrierAppIntent = getCarrierActivityIntent();
|
||||
if (carrierAppIntent != null) {
|
||||
carrierAppIntent.putExtra(EXTRA_LAUNCH_CARRIER_APP, LAUCH_APP_UPDATE);
|
||||
startActivity(carrierAppIntent);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
private final ProvisioningManager.Callback mProvisioningCallback =
|
||||
@@ -174,8 +170,6 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
|
||||
final SettingsActivity activity = (SettingsActivity) getActivity();
|
||||
|
||||
mEmptyView = getView().findViewById(android.R.id.empty);
|
||||
setEmptyView(mEmptyView);
|
||||
final Resources res = SubscriptionManager.getResourcesForSubId(getContext(), mSubId);
|
||||
@@ -265,14 +259,13 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
|
||||
mTelephonyManager = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE))
|
||||
.createForSubscriptionId(mSubId);
|
||||
|
||||
mButtonWfcMode = (ListWithEntrySummaryPreference) findPreference(BUTTON_WFC_MODE);
|
||||
mButtonWfcMode = findPreference(BUTTON_WFC_MODE);
|
||||
mButtonWfcMode.setOnPreferenceChangeListener(this);
|
||||
|
||||
mButtonWfcRoamingMode = (ListWithEntrySummaryPreference) findPreference(
|
||||
BUTTON_WFC_ROAMING_MODE);
|
||||
mButtonWfcRoamingMode = findPreference(BUTTON_WFC_ROAMING_MODE);
|
||||
mButtonWfcRoamingMode.setOnPreferenceChangeListener(this);
|
||||
|
||||
mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS);
|
||||
mUpdateAddress = findPreference(PREFERENCE_EMERGENCY_ADDRESS);
|
||||
mUpdateAddress.setOnPreferenceClickListener(mUpdateAddressListener);
|
||||
|
||||
mIntentFilter = new IntentFilter();
|
||||
|
||||
@@ -16,18 +16,14 @@
|
||||
|
||||
package com.android.settings.deviceinfo;
|
||||
|
||||
import static android.content.Context.CLIPBOARD_SERVICE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Answers.RETURNS_DEEP_STUBS;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Process;
|
||||
import android.os.UserManager;
|
||||
@@ -35,7 +31,6 @@ import android.provider.Settings;
|
||||
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
import com.android.settings.core.InstrumentedPreferenceFragment;
|
||||
@@ -62,13 +57,8 @@ import org.robolectric.shadows.ShadowUserManager;
|
||||
public class BuildNumberPreferenceControllerTest {
|
||||
|
||||
private static final String KEY_BUILD_NUMBER = "build_number";
|
||||
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private Activity mActivity;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private InstrumentedPreferenceFragment mFragment;
|
||||
@Mock(answer = RETURNS_DEEP_STUBS)
|
||||
private PreferenceScreen mScreen;
|
||||
|
||||
private ShadowUserManager mShadowUserManager;
|
||||
|
||||
@@ -200,14 +190,4 @@ public class BuildNumberPreferenceControllerTest {
|
||||
assertThat(activityResultHandled).isTrue();
|
||||
assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void copy_shouldCopyBuildNumberToClipboard() {
|
||||
mController.copy();
|
||||
|
||||
final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
|
||||
CLIPBOARD_SERVICE);
|
||||
final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText();
|
||||
assertThat(data.toString()).isEqualTo(mController.getSummary());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2019 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.settings.deviceinfo.firmwareversion;
|
||||
|
||||
import static android.content.Context.CLIPBOARD_SERVICE;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class SimpleBuildNumberPreferenceControllerTest {
|
||||
|
||||
private SimpleBuildNumberPreferenceController mController;
|
||||
private Context mContext;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = RuntimeEnvironment.application;
|
||||
|
||||
mController = new SimpleBuildNumberPreferenceController(mContext, "test");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void copy_shouldCopyBuildNumberToClipboard() {
|
||||
mController.copy();
|
||||
|
||||
final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(
|
||||
CLIPBOARD_SERVICE);
|
||||
final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText();
|
||||
assertThat(data.toString()).isEqualTo(mController.getSummary());
|
||||
}
|
||||
}
|
||||
@@ -229,11 +229,6 @@ public class ContextualCardLoaderTest {
|
||||
.setSliceUri(Uri.parse(
|
||||
"content://com.android.settings.test.slices/action/gesture_pick_up"))
|
||||
.build());
|
||||
cards.add(new ContextualCard.Builder()
|
||||
.setName("test_battery")
|
||||
.setCardType(ContextualCard.CardType.SLICE)
|
||||
.setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
|
||||
.build());
|
||||
return cards;
|
||||
}
|
||||
|
||||
@@ -262,11 +257,6 @@ public class ContextualCardLoaderTest {
|
||||
.setSliceUri(Uri.parse(
|
||||
"content://com.android.settings.test.slices/action/gesture_pick_up"))
|
||||
.build());
|
||||
cards.add(new ContextualCard.Builder()
|
||||
.setName("test_battery")
|
||||
.setCardType(ContextualCard.CardType.SLICE)
|
||||
.setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
|
||||
.build());
|
||||
return cards;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -460,7 +460,7 @@ public class ContextualCardManagerTest {
|
||||
cards.add(new ContextualCard.Builder()
|
||||
.setName("test_battery")
|
||||
.setCardType(ContextualCard.CardType.SLICE)
|
||||
.setSliceUri(CustomSliceRegistry.BATTERY_INFO_SLICE_URI)
|
||||
.setSliceUri(CustomSliceRegistry.BATTERY_FIX_SLICE_URI)
|
||||
.setViewType(VIEW_TYPE_FULL_WIDTH)
|
||||
.build());
|
||||
return cards;
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2018 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.settings.homepage.contextualcards.deviceinfo;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.SliceMetadata;
|
||||
import androidx.slice.SliceProvider;
|
||||
import androidx.slice.core.SliceAction;
|
||||
import androidx.slice.widget.SliceLiveData;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class BatteryInfoSliceTest {
|
||||
|
||||
private Context mContext;
|
||||
private BatteryInfoSlice mBatteryInfoSlice;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
|
||||
mBatteryInfoSlice = spy(new BatteryInfoSlice(mContext));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_shouldBeCorrectSliceContent() {
|
||||
doNothing().when(mBatteryInfoSlice).loadBatteryInfo();
|
||||
doReturn("10%").when(mBatteryInfoSlice).getBatteryPercentString();
|
||||
doReturn("test").when(mBatteryInfoSlice).getSummary();
|
||||
|
||||
final Slice slice = mBatteryInfoSlice.getSlice();
|
||||
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
|
||||
assertThat(metadata.getTitle()).isEqualTo(
|
||||
mContext.getString(R.string.power_usage_summary_title));
|
||||
|
||||
final SliceAction primaryAction = metadata.getPrimaryAction();
|
||||
final IconCompat expectedIcon = IconCompat.createWithResource(mContext,
|
||||
R.drawable.ic_settings_battery);
|
||||
assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedIcon.toString());
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.provider.Settings;
|
||||
@@ -162,4 +163,27 @@ public class MobileDataSliceTest {
|
||||
|
||||
assertThat(isMobileDataEnabled).isEqualTo(seed);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void airplaneModeEnabled_slicePrimaryActionIsEmpty() {
|
||||
doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled();
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
|
||||
final Slice mobileData = mMobileDataSlice.getSlice();
|
||||
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mobileData);
|
||||
assertThat(metadata.getTitle())
|
||||
.isEqualTo(mContext.getString(R.string.mobile_data_settings_title));
|
||||
|
||||
assertThat(metadata.getSubtitle())
|
||||
.isEqualTo(mContext.getString(R.string.mobile_data_ap_mode_disabled));
|
||||
|
||||
final List<SliceAction> toggles = metadata.getToggles();
|
||||
assertThat(toggles).hasSize(0);
|
||||
|
||||
final SliceAction primaryAction = metadata.getPrimaryAction();
|
||||
final PendingIntent pendingIntent = primaryAction.getAction();
|
||||
final Intent actionIntent = pendingIntent.getIntent();
|
||||
|
||||
assertThat(actionIntent).isNull();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,8 +47,8 @@ public class SpecialCaseSliceManagerTest {
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mCustomSliceManager = spy(new CustomSliceManager(mContext));
|
||||
mCustomSliceManager.mUriMap.clear();
|
||||
mCustomSliceManager.mUriMap.put(FakeSliceable.URI, FakeSliceable.class);
|
||||
CustomSliceRegistry.sUriToSlice.clear();
|
||||
CustomSliceRegistry.sUriToSlice.put(FakeSliceable.URI, FakeSliceable.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -69,14 +69,14 @@ public class SpecialCaseSliceManagerTest {
|
||||
|
||||
@Test
|
||||
public void isValidUri_validUri_returnsTrue() {
|
||||
final boolean isValidUri = mCustomSliceManager.isValidUri(FakeSliceable.URI);
|
||||
final boolean isValidUri = CustomSliceRegistry.isValidUri(FakeSliceable.URI);
|
||||
|
||||
assertThat(isValidUri).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isValidUri_invalidUri_returnsFalse() {
|
||||
final boolean isValidUri = mCustomSliceManager.isValidUri(null);
|
||||
final boolean isValidUri = CustomSliceRegistry.isValidUri(null);
|
||||
|
||||
assertThat(isValidUri).isFalse();
|
||||
}
|
||||
@@ -84,14 +84,14 @@ public class SpecialCaseSliceManagerTest {
|
||||
@Test
|
||||
public void isValidAction_validActions_returnsTrue() {
|
||||
final boolean isValidAction =
|
||||
mCustomSliceManager.isValidAction(FakeSliceable.URI.toString());
|
||||
CustomSliceRegistry.isValidAction(FakeSliceable.URI.toString());
|
||||
|
||||
assertThat(isValidAction).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isValidAction_invalidAction_returnsFalse() {
|
||||
final boolean isValidAction = mCustomSliceManager.isValidAction("action");
|
||||
final boolean isValidAction = CustomSliceRegistry.isValidAction("action");
|
||||
|
||||
assertThat(isValidAction).isFalse();
|
||||
}
|
||||
|
||||
@@ -33,8 +33,6 @@ import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class ListWithEntrySummaryPreferenceTest {
|
||||
|
||||
@@ -54,6 +52,7 @@ public class ListWithEntrySummaryPreferenceTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = RuntimeEnvironment.application;
|
||||
mContext.setTheme(R.style.Theme_Settings_Home);
|
||||
mPreference = new ListWithEntrySummaryPreference(mContext, null);
|
||||
mPreference.setEntries(mDefaultEntries);
|
||||
mPreference.setEntryValues(mDefaultEntryValues);
|
||||
|
||||
@@ -41,11 +41,9 @@ import android.telephony.ims.ProvisioningManager;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.ims.ImsConfig;
|
||||
import com.android.ims.ImsException;
|
||||
import com.android.ims.ImsManager;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
@@ -80,11 +78,11 @@ public class WifiCallingSettingsForSubTest {
|
||||
@Mock private ToggleSwitch mToggleSwitch;
|
||||
@Mock private View mView;
|
||||
@Mock private ImsConfig mImsConfig;
|
||||
@Mock private ListPreference mButtonWfcMode;
|
||||
@Mock private ListPreference mButtonWfcRoamingMode;
|
||||
@Mock private ListWithEntrySummaryPreference mButtonWfcMode;
|
||||
@Mock private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
|
||||
|
||||
@Before
|
||||
public void setUp() throws NoSuchFieldException, ImsException {
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mContext = RuntimeEnvironment.application;
|
||||
@@ -100,7 +98,7 @@ public class WifiCallingSettingsForSubTest {
|
||||
final Bundle bundle = new Bundle();
|
||||
when(mFragment.getArguments()).thenReturn(bundle);
|
||||
doNothing().when(mFragment).addPreferencesFromResource(anyInt());
|
||||
doReturn(mock(ListPreference.class)).when(mFragment).findPreference(any());
|
||||
doReturn(mock(ListWithEntrySummaryPreference.class)).when(mFragment).findPreference(any());
|
||||
doReturn(mButtonWfcMode).when(mFragment).findPreference(BUTTON_WFC_MODE);
|
||||
doReturn(mButtonWfcRoamingMode).when(mFragment).findPreference(BUTTON_WFC_ROAMING_MODE);
|
||||
doNothing().when(mFragment).finish();
|
||||
@@ -141,7 +139,7 @@ public class WifiCallingSettingsForSubTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onResume_provisioningAllowed_shouldNotFinish() throws ImsException {
|
||||
public void onResume_provisioningAllowed_shouldNotFinish() {
|
||||
// Call onResume while provisioning is allowed.
|
||||
mFragment.onResume();
|
||||
|
||||
@@ -160,7 +158,7 @@ public class WifiCallingSettingsForSubTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onResumeOnPause_provisioningCallbackRegistration() throws ImsException {
|
||||
public void onResumeOnPause_provisioningCallbackRegistration() throws Exception {
|
||||
// Verify that provisioning callback is registered after call to onResume().
|
||||
mFragment.onResume();
|
||||
verify(mImsConfig).addConfigCallback(any(ProvisioningManager.Callback.class));
|
||||
|
||||
Reference in New Issue
Block a user