Snap for 6470414 from 30a4d31d6b to mainline-release
Change-Id: I759e3fd931e2482d06d09b9d2d8b47d457d68a24
This commit is contained in:
@@ -55,6 +55,7 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center_vertical"
|
||||
android:layoutDirection="ltr"
|
||||
android:paddingTop="8dp">
|
||||
|
||||
<ImageView
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
-->
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/slice_slider_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
@@ -427,4 +427,7 @@
|
||||
|
||||
<!-- Developer options shared data screens related dimensions -->
|
||||
<dimen name="list_preferred_item_padding">16dp</dimen>
|
||||
|
||||
<!-- Output switcher panel related dimensions -->
|
||||
<dimen name="output_switcher_slice_padding_top">12dp</dimen>
|
||||
</resources>
|
||||
|
||||
@@ -7485,14 +7485,6 @@
|
||||
<string name="connected_devices_dashboard_no_driving_mode_summary">Bluetooth, NFC</string>
|
||||
<!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="connected_devices_dashboard_no_driving_mode_no_nfc_summary">Bluetooth</string>
|
||||
<!--Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="connected_devices_dashboard_android_auto_summary">Bluetooth, Android Auto, driving mode, NFC</string><!--
|
||||
Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="connected_devices_dashboard_android_auto_no_nfc_summary">Bluetooth, Android Auto, driving mode</string>
|
||||
<!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="connected_devices_dashboard_android_auto_no_driving_mode_summary">Bluetooth, Android Auto, NFC</string>
|
||||
<!-- Summary for Connected devices settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="connected_devices_dashboard_android_auto_no_nfc_no_driving_mode">Bluetooth, Android Auto</string>
|
||||
<!-- Summary for Tap & pay settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
<string name="nfc_and_payment_settings_payment_off_nfc_off_summary">Unavailable because NFC is off</string>
|
||||
<!-- Summary for Tap & pay settings, explaning a few important settings under it [CHAR LIMIT=NONE]-->
|
||||
@@ -9250,10 +9242,10 @@
|
||||
\t\n3.\tTap the app icon at the top of the screen, then tap Pin
|
||||
</string>
|
||||
<!-- [CHAR LIMIT=none] Screen pinning description -->
|
||||
<string name="screen_pinning_guest_mode_description">
|
||||
<string name="screen_pinning_guest_user_description">
|
||||
App pinning allows you to keep the current app in view until you unpin it. This feature can be used, for example, to let a trusted friend play a specific game.
|
||||
\n\nWhen an app is pinned, the pinned app may open other apps and personal data may be accessible.
|
||||
\n\nIf you want to securely share your device with someone, try using a guest profile instead.
|
||||
\n\nIf you want to securely share your device with someone, try using a guest user instead.
|
||||
\n\nTo use app pinning:
|
||||
\t\n1.\tTurn on app pinning
|
||||
\t\n2.\tOpen Overview
|
||||
@@ -12074,4 +12066,7 @@
|
||||
<string name="no_5g_in_dsds_text" product="device">When using 2 SIMs, this device will be limited to 4G. <annotation id="url">Learn more</annotation>.</string>
|
||||
<!-- Help URI, 5G limitation in DSDS condition. [DO NOT TRANSLATE] -->
|
||||
<string name="help_uri_5g_dsds" translatable="false"></string>
|
||||
|
||||
<!-- Developer settings: app freezer title [CHAR LIMIT=50]-->
|
||||
<string name="cached_apps_freezer">Suspend execution for cached apps</string>
|
||||
</resources>
|
||||
|
||||
@@ -584,6 +584,12 @@
|
||||
android:title="@string/show_all_anrs"
|
||||
android:summary="@string/show_all_anrs_summary" />
|
||||
|
||||
<ListPreference
|
||||
android:key="cached_apps_freezer"
|
||||
android:title="@string/cached_apps_freezer"
|
||||
android:entries="@array/cached_apps_freezer_entries"
|
||||
android:entryValues="@array/cached_apps_freezer_values" />
|
||||
|
||||
<SwitchPreference
|
||||
android:key="show_notification_channel_warnings"
|
||||
android:title="@string/show_notification_channel_warnings"
|
||||
|
||||
@@ -387,11 +387,11 @@ public final class AccessibilityGestureNavigationTutorial {
|
||||
private static CharSequence getSoftwareTitle(Context context) {
|
||||
final boolean isGestureNavigationEnabled =
|
||||
AccessibilityUtil.isGestureNavigateEnabled(context);
|
||||
final boolean isTouchExploreEnabled = AccessibilityUtil.isTouchExploreEnabled(context);
|
||||
final int resId = isGestureNavigationEnabled
|
||||
? R.string.accessibility_tutorial_dialog_title_gesture
|
||||
: R.string.accessibility_tutorial_dialog_title_button;
|
||||
|
||||
return (isGestureNavigationEnabled || isTouchExploreEnabled)
|
||||
? context.getText(R.string.accessibility_tutorial_dialog_title_gesture)
|
||||
: context.getText(R.string.accessibility_tutorial_dialog_title_button);
|
||||
return context.getText(resId);
|
||||
}
|
||||
|
||||
private static ImageView createSoftwareImage(Context context) {
|
||||
|
||||
@@ -15,10 +15,7 @@
|
||||
*/
|
||||
package com.android.settings.connecteddevice;
|
||||
|
||||
import static com.android.settingslib.drawer.TileUtils.IA_SETTINGS_ACTION;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.provider.Settings;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -34,7 +31,6 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController
|
||||
|
||||
private static final String DRIVING_MODE_SETTINGS_ENABLED =
|
||||
"gearhead:driving_mode_settings_enabled";
|
||||
private static final String GEARHEAD_PACKAGE = "com.google.android.projection.gearhead";
|
||||
|
||||
public AdvancedConnectedDeviceController(Context context, String preferenceKey) {
|
||||
super(context, preferenceKey);
|
||||
@@ -59,7 +55,7 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController
|
||||
new NfcPreferenceController(context, NfcPreferenceController.KEY_TOGGLE_NFC);
|
||||
|
||||
return getConnectedDevicesSummaryResourceId(nfcPreferenceController,
|
||||
isDrivingModeAvailable(context), isAndroidAutoSettingAvailable(context));
|
||||
isDrivingModeAvailable(context));
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
@@ -68,57 +64,26 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController
|
||||
getInt(context.getContentResolver(), DRIVING_MODE_SETTINGS_ENABLED, 0) == 1;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static boolean isAndroidAutoSettingAvailable(Context context) {
|
||||
final Intent intent = new Intent(IA_SETTINGS_ACTION);
|
||||
intent.setPackage(GEARHEAD_PACKAGE);
|
||||
return intent.resolveActivity(context.getPackageManager()) != null;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static int getConnectedDevicesSummaryResourceId(NfcPreferenceController
|
||||
nfcPreferenceController,
|
||||
boolean isDrivingModeAvailable,
|
||||
boolean isAndroidAutoAvailable) {
|
||||
nfcPreferenceController, boolean isDrivingModeAvailable) {
|
||||
final int resId;
|
||||
|
||||
if (isAndroidAutoAvailable) {
|
||||
if (nfcPreferenceController.isAvailable()) {
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_android_auto_summary;
|
||||
} else {
|
||||
// NFC available, driving mode not available
|
||||
resId =
|
||||
R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary;
|
||||
}
|
||||
if (nfcPreferenceController.isAvailable()) {
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_summary;
|
||||
} else {
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC not available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_android_auto_no_nfc_summary;
|
||||
} else {
|
||||
// NFC not available, driving mode not available
|
||||
resId =
|
||||
R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode;
|
||||
}
|
||||
// NFC available, driving mode not available
|
||||
resId = R.string.connected_devices_dashboard_no_driving_mode_summary;
|
||||
}
|
||||
} else {
|
||||
if (nfcPreferenceController.isAvailable()) {
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_summary;
|
||||
} else {
|
||||
// NFC available, driving mode not available
|
||||
resId = R.string.connected_devices_dashboard_no_driving_mode_summary;
|
||||
}
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC not available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_no_nfc_summary;
|
||||
} else {
|
||||
if (isDrivingModeAvailable) {
|
||||
// NFC not available, driving mode available
|
||||
resId = R.string.connected_devices_dashboard_no_nfc_summary;
|
||||
} else {
|
||||
// NFC not available, driving mode not available
|
||||
resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary;
|
||||
}
|
||||
// NFC not available, driving mode not available
|
||||
resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -89,6 +89,9 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
@Override
|
||||
protected void refresh(boolean connected, long functions, int powerRole, int dataRole) {
|
||||
if (!connected || dataRole != DATA_ROLE_DEVICE) {
|
||||
if (mPreviousFunction == UsbManager.FUNCTION_RNDIS) {
|
||||
mConnectivityManager.stopTethering(TETHERING_USB);
|
||||
}
|
||||
mProfilesContainer.setEnabled(false);
|
||||
} else {
|
||||
// Functions are only available in device mode
|
||||
@@ -129,6 +132,9 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */,
|
||||
mOnStartTetheringCallback);
|
||||
} else {
|
||||
if (mPreviousFunction == UsbManager.FUNCTION_RNDIS) {
|
||||
mConnectivityManager.stopTethering(TETHERING_USB);
|
||||
}
|
||||
mUsbBackend.setCurrentFunctions(function);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (C) 2020 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.development;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.PowerManager;
|
||||
import android.os.RemoteException;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.preference.ListPreference;
|
||||
import androidx.preference.Preference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.PreferenceControllerMixin;
|
||||
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
|
||||
|
||||
|
||||
public class CachedAppsFreezerPreferenceController extends DeveloperOptionsPreferenceController
|
||||
implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin {
|
||||
|
||||
@VisibleForTesting
|
||||
private static final String CACHED_APPS_FREEZER_KEY = "cached_apps_freezer";
|
||||
|
||||
private final String[] mListValues;
|
||||
private final String[] mListSummaries;
|
||||
|
||||
public CachedAppsFreezerPreferenceController(Context context) {
|
||||
super(context);
|
||||
|
||||
mListValues = context.getResources().getStringArray(R.array.cached_apps_freezer_values);
|
||||
mListSummaries = context.getResources().getStringArray(
|
||||
R.array.cached_apps_freezer_entries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
boolean available = false;
|
||||
|
||||
try {
|
||||
available = ActivityManager.getService().isAppFreezerSupported();
|
||||
} catch (RemoteException e) {
|
||||
Log.w(TAG, "Unable to obtain freezer support status from ActivityManager");
|
||||
}
|
||||
|
||||
return available;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return CACHED_APPS_FREEZER_KEY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
final String currentValue = Settings.Global.getString(mContext.getContentResolver(),
|
||||
Settings.Global.CACHED_APPS_FREEZER_ENABLED);
|
||||
|
||||
if (!newValue.equals(currentValue)) {
|
||||
final AlertDialog dialog = new AlertDialog.Builder(mContext)
|
||||
.setMessage(R.string.cached_apps_freezer_reboot_dialog_text)
|
||||
.setPositiveButton(android.R.string.ok, getRebootDialogOkListener(newValue))
|
||||
.setNegativeButton(android.R.string.cancel, getRebootDialogCancelListener())
|
||||
.create();
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private DialogInterface.OnClickListener getRebootDialogOkListener(Object newValue) {
|
||||
return (dialog, which) -> {
|
||||
Settings.Global.putString(mContext.getContentResolver(),
|
||||
Settings.Global.CACHED_APPS_FREEZER_ENABLED,
|
||||
newValue.toString());
|
||||
|
||||
updateState(mPreference);
|
||||
|
||||
PowerManager pm = mContext.getSystemService(PowerManager.class);
|
||||
pm.reboot(null);
|
||||
};
|
||||
}
|
||||
|
||||
private DialogInterface.OnClickListener getRebootDialogCancelListener() {
|
||||
return (dialog, which) -> {
|
||||
updateState(mPreference);
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(Preference preference) {
|
||||
final ListPreference listPreference = (ListPreference) preference;
|
||||
final String currentValue = Settings.Global.getString(mContext.getContentResolver(),
|
||||
Settings.Global.CACHED_APPS_FREEZER_ENABLED);
|
||||
|
||||
int index = 0; // Defaults to device default
|
||||
for (int i = 0; i < mListValues.length; i++) {
|
||||
if (TextUtils.equals(currentValue, mListValues[i])) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
listPreference.setValue(mListValues[index]);
|
||||
listPreference.setSummary(mListSummaries[index]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeveloperOptionsDisabled() {
|
||||
super.onDeveloperOptionsDisabled();
|
||||
|
||||
Settings.Global.putString(mContext.getContentResolver(),
|
||||
Settings.Global.CACHED_APPS_FREEZER_ENABLED,
|
||||
mListValues[0].toString());
|
||||
}
|
||||
}
|
||||
@@ -505,6 +505,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
|
||||
controllers.add(new ProfileGpuRenderingPreferenceController(context));
|
||||
controllers.add(new KeepActivitiesPreferenceController(context));
|
||||
controllers.add(new BackgroundProcessLimitPreferenceController(context));
|
||||
controllers.add(new CachedAppsFreezerPreferenceController(context));
|
||||
controllers.add(new ShowFirstCrashDialogPreferenceController(context));
|
||||
controllers.add(new AppsNotRespondingPreferenceController(context));
|
||||
controllers.add(new NotificationChannelWarningsPreferenceController(context));
|
||||
|
||||
@@ -60,18 +60,26 @@ public class BackGestureIndicatorView extends LinearLayout {
|
||||
mLeftIndicator.setImageDrawable(mLeftDrawable);
|
||||
mRightIndicator.setImageDrawable(mRightDrawable);
|
||||
|
||||
int visibility = getSystemUiVisibility()
|
||||
| View.SYSTEM_UI_FLAG_IMMERSIVE
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
||||
| View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
|
||||
TypedArray a = context.obtainStyledAttributes(new int[] {
|
||||
android.R.attr.windowLightNavigationBar,
|
||||
android.R.attr.windowLightStatusBar});
|
||||
if (a.getBoolean(0, false)) {
|
||||
setSystemUiVisibility(
|
||||
getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
|
||||
visibility |= View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
|
||||
}
|
||||
if (a.getBoolean(1, false)) {
|
||||
setSystemUiVisibility(
|
||||
getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
|
||||
visibility |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
|
||||
}
|
||||
a.recycle();
|
||||
|
||||
setSystemUiVisibility(visibility);
|
||||
}
|
||||
|
||||
public void setIndicatorWidth(int width, boolean leftIndicator) {
|
||||
|
||||
@@ -58,7 +58,8 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
|
||||
}
|
||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||
com.android.internal.R.drawable.ic_settings_bluetooth);
|
||||
final CharSequence title = mContext.getText(R.string.media_output_title);
|
||||
final CharSequence title = mContext.getString(R.string.media_output_label_title,
|
||||
Utils.getApplicationLabel(mContext, getWorker().getPackageName()));
|
||||
final PendingIntent primaryActionIntent = PendingIntent.getActivity(mContext,
|
||||
0 /* requestCode */, getMediaOutputSliceIntent(), 0 /* flags */);
|
||||
final SliceAction primarySliceAction = SliceAction.createDeeplink(
|
||||
|
||||
@@ -58,6 +58,7 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
|
||||
private final Collection<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
|
||||
|
||||
private LocalBluetoothManager mLocalBluetoothManager;
|
||||
private String mPackageName;
|
||||
|
||||
@VisibleForTesting
|
||||
LocalMediaManager mLocalMediaManager;
|
||||
@@ -82,11 +83,10 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
|
||||
|
||||
if (mLocalMediaManager == null) {
|
||||
final MediaController controller = getActiveLocalMediaController();
|
||||
String packageName = null;
|
||||
if (controller != null) {
|
||||
packageName = controller.getPackageName();
|
||||
mPackageName = controller.getPackageName();
|
||||
}
|
||||
mLocalMediaManager = new LocalMediaManager(mContext, packageName, null);
|
||||
mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
|
||||
}
|
||||
|
||||
mLocalMediaManager.registerCallback(this);
|
||||
@@ -168,6 +168,10 @@ public class MediaOutputIndicatorWorker extends SliceBackgroundWorker implements
|
||||
return mLocalMediaManager.getCurrentConnectedDevice();
|
||||
}
|
||||
|
||||
String getPackageName() {
|
||||
return mPackageName;
|
||||
}
|
||||
|
||||
private class DevicesChangedBroadcastReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
|
||||
@@ -37,6 +37,7 @@ import androidx.slice.builders.SliceAction;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SubSettings;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.notification.SoundSettings;
|
||||
import com.android.settings.slices.CustomSliceable;
|
||||
import com.android.settings.slices.SliceBackgroundWorker;
|
||||
@@ -86,7 +87,6 @@ public class RemoteMediaSlice implements CustomSliceable {
|
||||
return listBuilder.build();
|
||||
}
|
||||
final CharSequence castVolume = mContext.getText(R.string.remote_media_volume_option_title);
|
||||
final CharSequence outputTitle = mContext.getText(R.string.media_output_title);
|
||||
final IconCompat icon = IconCompat.createWithResource(mContext,
|
||||
R.drawable.ic_volume_remote);
|
||||
// To create an empty icon to indent the row
|
||||
@@ -99,6 +99,8 @@ public class RemoteMediaSlice implements CustomSliceable {
|
||||
+ maxVolume);
|
||||
continue;
|
||||
}
|
||||
final CharSequence outputTitle = mContext.getString(R.string.media_output_label_title,
|
||||
Utils.getApplicationLabel(mContext, info.getClientPackageName()));
|
||||
listBuilder.addInputRange(new InputRangeBuilder()
|
||||
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
||||
.setTitle(castVolume)
|
||||
@@ -154,7 +156,8 @@ public class RemoteMediaSlice implements CustomSliceable {
|
||||
0 /* requestCode */, intent, 0 /* flags */);
|
||||
final SliceAction primarySliceAction = SliceAction.createDeeplink(
|
||||
primaryActionIntent, icon, ListBuilder.ICON_IMAGE,
|
||||
mContext.getText(R.string.media_output_title));
|
||||
mContext.getString(R.string.media_output_label_title,
|
||||
Utils.getApplicationLabel(mContext, packageName)));
|
||||
return primarySliceAction;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.media.LocalMediaManager;
|
||||
@@ -108,7 +109,6 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
|
||||
mPreferenceCategory.setVisible(false);
|
||||
return;
|
||||
}
|
||||
final CharSequence outputTitle = mContext.getText(R.string.media_output_title);
|
||||
final CharSequence castVolume = mContext.getText(R.string.remote_media_volume_option_title);
|
||||
mPreferenceCategory.setVisible(true);
|
||||
|
||||
@@ -116,6 +116,8 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
|
||||
if (mPreferenceCategory.findPreference(info.getId()) != null) {
|
||||
continue;
|
||||
}
|
||||
final CharSequence outputTitle = mContext.getString(R.string.media_output_label_title,
|
||||
Utils.getApplicationLabel(mContext, info.getClientPackageName()));
|
||||
// Add slider
|
||||
final RemoteVolumeSeekBarPreference seekBarPreference =
|
||||
new RemoteVolumeSeekBarPreference(mContext);
|
||||
|
||||
@@ -16,7 +16,9 @@
|
||||
|
||||
package com.android.settings.panel;
|
||||
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
@@ -24,6 +26,7 @@ import android.net.Uri;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -81,7 +84,7 @@ public class PanelSlicesAdapter
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull SliceRowViewHolder sliceRowViewHolder, int position) {
|
||||
sliceRowViewHolder.onBind(mSliceLiveData.get(position));
|
||||
sliceRowViewHolder.onBind(mSliceLiveData.get(position), position);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -116,15 +119,21 @@ public class PanelSlicesAdapter
|
||||
|
||||
@VisibleForTesting
|
||||
final SliceView sliceView;
|
||||
@VisibleForTesting
|
||||
final LinearLayout mSliceSliderLayout;
|
||||
|
||||
public SliceRowViewHolder(View view) {
|
||||
super(view);
|
||||
sliceView = view.findViewById(R.id.slice_view);
|
||||
sliceView.setMode(SliceView.MODE_LARGE);
|
||||
sliceView.setShowTitleItems(true);
|
||||
mSliceSliderLayout = view.findViewById(R.id.slice_slider_layout);
|
||||
}
|
||||
|
||||
public void onBind(LiveData<Slice> sliceLiveData) {
|
||||
/**
|
||||
* Called when the view is displayed.
|
||||
*/
|
||||
public void onBind(LiveData<Slice> sliceLiveData, int position) {
|
||||
sliceLiveData.observe(mPanelFragment.getViewLifecycleOwner(), sliceView);
|
||||
|
||||
// Do not show the divider above media devices switcher slice per request
|
||||
@@ -133,6 +142,16 @@ public class PanelSlicesAdapter
|
||||
mDividerAllowedAbove = false;
|
||||
}
|
||||
|
||||
// Customize output switcher slice top padding
|
||||
if (position == 0 && (slice.getUri().equals(MEDIA_OUTPUT_SLICE_URI)
|
||||
|| slice.getUri().equals(MEDIA_OUTPUT_GROUP_SLICE_URI))) {
|
||||
final int paddingTop = mPanelFragment.getResources().getDimensionPixelSize(
|
||||
R.dimen.output_switcher_slice_padding_top);
|
||||
mSliceSliderLayout.setPadding(mSliceSliderLayout.getPaddingLeft(), paddingTop,
|
||||
mSliceSliderLayout.getPaddingRight(),
|
||||
mSliceSliderLayout.getPaddingBottom());
|
||||
}
|
||||
|
||||
// Log Panel interaction
|
||||
sliceView.setOnSliceActionListener(
|
||||
((eventInfo, sliceItem) -> {
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
import android.provider.SearchIndexableResource;
|
||||
import android.provider.Settings;
|
||||
import android.widget.Switch;
|
||||
@@ -61,6 +62,7 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
|
||||
private SwitchPreference mUseScreenLock;
|
||||
private FooterPreference mFooterPreference;
|
||||
private LockPatternUtils mLockPatternUtils;
|
||||
private UserManager mUserManager;
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
@@ -74,6 +76,7 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
|
||||
final SettingsActivity activity = (SettingsActivity) getActivity();
|
||||
activity.setTitle(R.string.screen_pinning_title);
|
||||
mLockPatternUtils = new LockPatternUtils(activity);
|
||||
mUserManager = activity.getSystemService(UserManager.class);
|
||||
|
||||
addPreferencesFromResource(R.xml.screen_pinning_settings);
|
||||
final PreferenceScreen root = getPreferenceScreen();
|
||||
@@ -224,10 +227,22 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment
|
||||
mUseScreenLock.setTitle(getCurrentSecurityTitle());
|
||||
} else {
|
||||
mFooterPreference.setVisible(true);
|
||||
mFooterPreference.setSummary(getAppPinningContent());
|
||||
mUseScreenLock.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isGuestModeSupported() {
|
||||
return UserManager.supportsMultipleUsers()
|
||||
&& !mUserManager.hasUserRestriction(UserManager.DISALLOW_USER_SWITCH);
|
||||
}
|
||||
|
||||
private CharSequence getAppPinningContent() {
|
||||
return isGuestModeSupported()
|
||||
? getActivity().getText(R.string.screen_pinning_guest_user_description)
|
||||
: getActivity().getText(R.string.screen_pinning_description);
|
||||
}
|
||||
|
||||
/**
|
||||
* For search
|
||||
*/
|
||||
|
||||
@@ -23,9 +23,6 @@ import static org.mockito.Mockito.spy;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.nfc.NfcAdapter;
|
||||
import android.provider.Settings;
|
||||
|
||||
@@ -41,7 +38,6 @@ import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.Shadows;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowNfcAdapter;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
import org.robolectric.util.ReflectionHelpers;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -51,13 +47,11 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
private static final String KEY = "test_key";
|
||||
private static final String DRIVING_MODE_SETTINGS_ENABLED =
|
||||
"gearhead:driving_mode_settings_enabled";
|
||||
private static final String ANDROID_AUTO_PACKAGE = "com.google.android.projection.gearhead";
|
||||
|
||||
private Context mContext;
|
||||
private NfcPreferenceController mNfcController;
|
||||
private ShadowNfcAdapter mShadowNfcAdapter;
|
||||
private ContentResolver mContentResolver;
|
||||
private ShadowPackageManager mShadowPackageManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -68,7 +62,6 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
mNfcController = new NfcPreferenceController(mContext,
|
||||
NfcPreferenceController.KEY_TOGGLE_NFC);
|
||||
mShadowNfcAdapter = Shadows.shadowOf(NfcAdapter.getNfcAdapter(mContext));
|
||||
mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -83,41 +76,14 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
public void isDrivingModeAvailable_returnTrue() {
|
||||
Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 1);
|
||||
|
||||
assertThat(
|
||||
AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue();
|
||||
assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isDrivingModeAvailable_returnFalse() {
|
||||
Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 0);
|
||||
|
||||
assertThat(
|
||||
AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAndroidAutoSettingAvailable_returnTrue() {
|
||||
final ActivityInfo activityInfo = new ActivityInfo();
|
||||
activityInfo.packageName = ANDROID_AUTO_PACKAGE;
|
||||
final ResolveInfo resolveInfo = new ResolveInfo();
|
||||
resolveInfo.activityInfo = activityInfo;
|
||||
mShadowPackageManager.addResolveInfoForIntent(
|
||||
buildAndroidAutoSettingsIntent(),
|
||||
resolveInfo);
|
||||
|
||||
assertThat(
|
||||
AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAndroidAutoSettingAvailable_returnFalse() {
|
||||
ResolveInfo resolveInfo = null; // Needed to disambiguate method
|
||||
mShadowPackageManager.addResolveInfoForIntent(
|
||||
buildAndroidAutoSettingsIntent(),
|
||||
resolveInfo);
|
||||
|
||||
assertThat(
|
||||
AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isFalse();
|
||||
assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -125,7 +91,7 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
// NFC available, driving mode available
|
||||
mShadowNfcAdapter.setEnabled(true);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true, false))
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_summary);
|
||||
}
|
||||
|
||||
@@ -134,7 +100,7 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
// NFC is available, driving mode not available
|
||||
mShadowNfcAdapter.setEnabled(true);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false, false))
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_summary);
|
||||
}
|
||||
|
||||
@@ -143,7 +109,7 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
// NFC not available, driving mode available
|
||||
ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true, false))
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_no_nfc_summary);
|
||||
}
|
||||
|
||||
@@ -152,52 +118,7 @@ public class AdvancedConnectedDeviceControllerTest {
|
||||
// NFC not available, driving mode not available
|
||||
ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false, false))
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedDevicesSummaryResourceId_Auto_NFC_DrivingMode_Available() {
|
||||
// NFC available, driving mode available
|
||||
mShadowNfcAdapter.setEnabled(true);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true, true))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_android_auto_summary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedDevicesSummaryResourceId_Auto_NFC_Available() {
|
||||
// NFC is available, driving mode not available
|
||||
mShadowNfcAdapter.setEnabled(true);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false, true))
|
||||
.isEqualTo(
|
||||
R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedDevicesSummaryResourceId_Auto_DrivingMode_Available() {
|
||||
// NFC not available, driving mode available
|
||||
ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, true, true))
|
||||
.isEqualTo(R.string.connected_devices_dashboard_android_auto_no_nfc_summary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedDevicesSummaryResourceId_Auto_Available() {
|
||||
// NFC not available, driving mode not available
|
||||
ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
|
||||
assertThat(AdvancedConnectedDeviceController
|
||||
.getConnectedDevicesSummaryResourceId(mNfcController, false, true))
|
||||
.isEqualTo(
|
||||
R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode);
|
||||
}
|
||||
|
||||
private Intent buildAndroidAutoSettingsIntent() {
|
||||
final Intent intent = new Intent("com.android.settings.action.IA_SETTINGS");
|
||||
intent.setPackage(ANDROID_AUTO_PACKAGE);
|
||||
return intent;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -270,4 +270,42 @@ public class UsbDetailsFunctionsControllerTest {
|
||||
|
||||
verify(mUsbBackend).setCurrentFunctions(UsbManager.FUNCTION_PTP);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void refresh_previousFunctionIsRndis_stopTethering() {
|
||||
mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_RNDIS;
|
||||
|
||||
mDetailsFunctionsController.refresh(false, 0, 0, 0);
|
||||
|
||||
verify(mConnectivityManager).stopTethering(TETHERING_USB);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void refresh_previousFunctionIsNotRndis_doNothing() {
|
||||
mDetailsFunctionsController.mPreviousFunction = UsbManager.FUNCTION_MIDI;
|
||||
|
||||
mDetailsFunctionsController.refresh(false, 0, 0, 0);
|
||||
|
||||
verify(mConnectivityManager, never()).stopTethering(TETHERING_USB);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRadioButtonClicked_previousFunctionIsRndis_stopTethering() {
|
||||
mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_PTP));
|
||||
doReturn(UsbManager.FUNCTION_RNDIS).when(mUsbBackend).getCurrentFunctions();
|
||||
|
||||
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
|
||||
|
||||
verify(mConnectivityManager).stopTethering(TETHERING_USB);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onRadioButtonClicked_previousFunctionIsNotRndis_doNothing() {
|
||||
mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_PTP));
|
||||
doReturn(UsbManager.FUNCTION_MIDI).when(mUsbBackend).getCurrentFunctions();
|
||||
|
||||
mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference);
|
||||
|
||||
verify(mConnectivityManager, never()).stopTethering(TETHERING_USB);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,9 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageStats;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.media.AudioManager;
|
||||
import android.media.session.MediaController;
|
||||
@@ -55,9 +58,11 @@ import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.Shadows;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.annotation.Implementation;
|
||||
import org.robolectric.annotation.Implements;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -70,6 +75,7 @@ public class MediaOutputIndicatorSliceTest {
|
||||
private static final String TEST_DEVICE_1_NAME = "test_device_1_name";
|
||||
private static final String TEST_DEVICE_2_NAME = "test_device_2_name";
|
||||
private static final String TEST_PACKAGE_NAME = "com.test";
|
||||
private static final String TEST_APPLICATION_LABEL = "APP Test Label";
|
||||
|
||||
private static MediaOutputIndicatorWorker sMediaOutputIndicatorWorker;
|
||||
|
||||
@@ -90,6 +96,10 @@ public class MediaOutputIndicatorSliceTest {
|
||||
private MediaOutputIndicatorSlice mMediaOutputIndicatorSlice;
|
||||
private AudioManager mAudioManager;
|
||||
private MediaSession.Token mToken;
|
||||
private ShadowPackageManager mShadowPackageManager;
|
||||
private ApplicationInfo mAppInfo;
|
||||
private PackageInfo mPackageInfo;
|
||||
private PackageStats mPackageStats;
|
||||
|
||||
@Before
|
||||
public void setUp() throws Exception {
|
||||
@@ -118,8 +128,11 @@ public class MediaOutputIndicatorSliceTest {
|
||||
|
||||
@Test
|
||||
public void getSlice_withConnectedDevice_verifyMetadata() {
|
||||
initPackage();
|
||||
mShadowPackageManager.addPackage(mPackageInfo, mPackageStats);
|
||||
mDevices.add(mDevice1);
|
||||
when(sMediaOutputIndicatorWorker.getMediaDevices()).thenReturn(mDevices);
|
||||
when(sMediaOutputIndicatorWorker.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
|
||||
.getActiveLocalMediaController();
|
||||
doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
|
||||
@@ -128,7 +141,9 @@ public class MediaOutputIndicatorSliceTest {
|
||||
final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice();
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mediaSlice);
|
||||
|
||||
assertThat(metadata.getTitle()).isEqualTo(mContext.getText(R.string.media_output_title));
|
||||
assertThat(metadata.getTitle()).isEqualTo(mContext.getString(
|
||||
R.string.media_output_label_title, Utils.getApplicationLabel(mContext,
|
||||
TEST_PACKAGE_NAME)));
|
||||
assertThat(metadata.getSubtitle()).isEqualTo(TEST_DEVICE_1_NAME);
|
||||
assertThat(metadata.isErrorSlice()).isFalse();
|
||||
}
|
||||
@@ -241,6 +256,18 @@ public class MediaOutputIndicatorSliceTest {
|
||||
assertThat(mMediaOutputIndicatorSlice.isVisible()).isFalse();
|
||||
}
|
||||
|
||||
private void initPackage() {
|
||||
mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
|
||||
mAppInfo = new ApplicationInfo();
|
||||
mAppInfo.flags = ApplicationInfo.FLAG_INSTALLED;
|
||||
mAppInfo.packageName = TEST_PACKAGE_NAME;
|
||||
mAppInfo.name = TEST_APPLICATION_LABEL;
|
||||
mPackageInfo = new PackageInfo();
|
||||
mPackageInfo.packageName = TEST_PACKAGE_NAME;
|
||||
mPackageInfo.applicationInfo = mAppInfo;
|
||||
mPackageStats = new PackageStats(TEST_PACKAGE_NAME);
|
||||
}
|
||||
|
||||
@Implements(SliceBackgroundWorker.class)
|
||||
public static class ShadowSliceBackgroundWorker {
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageStats;
|
||||
import android.media.RoutingSessionInfo;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
@@ -35,6 +38,7 @@ import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
|
||||
import com.android.settings.widget.SeekBarPreference;
|
||||
import com.android.settingslib.media.LocalMediaManager;
|
||||
@@ -46,7 +50,9 @@ import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.Shadows;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadows.ShadowPackageManager;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -58,6 +64,8 @@ public class RemoteVolumeGroupControllerTest {
|
||||
private static final String KEY_REMOTE_VOLUME_GROUP = "remote_media_group";
|
||||
private static final String TEST_SESSION_1_ID = "test_session_1_id";
|
||||
private static final String TEST_SESSION_1_NAME = "test_session_1_name";
|
||||
private static final String TEST_PACKAGE_NAME = "com.test";
|
||||
private static final String TEST_APPLICATION_LABEL = "APP Test Label";
|
||||
private static final int CURRENT_VOLUME = 30;
|
||||
private static final int MAX_VOLUME = 100;
|
||||
|
||||
@@ -75,6 +83,10 @@ public class RemoteVolumeGroupControllerTest {
|
||||
private Context mContext;
|
||||
private RemoteVolumeGroupController mController;
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private ShadowPackageManager mShadowPackageManager;
|
||||
private ApplicationInfo mAppInfo;
|
||||
private PackageInfo mPackageInfo;
|
||||
private PackageStats mPackageStats;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -94,6 +106,7 @@ public class RemoteVolumeGroupControllerTest {
|
||||
when(remoteSessionInfo.getName()).thenReturn(TEST_SESSION_1_NAME);
|
||||
when(remoteSessionInfo.getVolumeMax()).thenReturn(MAX_VOLUME);
|
||||
when(remoteSessionInfo.getVolume()).thenReturn(CURRENT_VOLUME);
|
||||
when(remoteSessionInfo.getClientPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
when(remoteSessionInfo.isSystemSession()).thenReturn(false);
|
||||
mRoutingSessionInfos.add(remoteSessionInfo);
|
||||
when(mLocalMediaManager.getActiveMediaSession()).thenReturn(mRoutingSessionInfos);
|
||||
@@ -156,11 +169,15 @@ public class RemoteVolumeGroupControllerTest {
|
||||
|
||||
@Test
|
||||
public void displayPreference_withActiveSession_checkSwitcherPreferenceTitle() {
|
||||
initPackage();
|
||||
mShadowPackageManager.addPackage(mPackageInfo, mPackageStats);
|
||||
mController.displayPreference(mScreen);
|
||||
final Preference preference = mPreferenceCategory.findPreference(
|
||||
RemoteVolumeGroupController.SWITCHER_PREFIX + TEST_SESSION_1_ID);
|
||||
|
||||
assertThat(preference.getTitle()).isEqualTo(mContext.getText(R.string.media_output_title));
|
||||
assertThat(preference.getTitle()).isEqualTo(mContext.getString(
|
||||
R.string.media_output_label_title, Utils.getApplicationLabel(mContext,
|
||||
TEST_PACKAGE_NAME)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -171,4 +188,16 @@ public class RemoteVolumeGroupControllerTest {
|
||||
|
||||
assertThat(preference.getSummary()).isEqualTo(TEST_SESSION_1_NAME);
|
||||
}
|
||||
|
||||
private void initPackage() {
|
||||
mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
|
||||
mAppInfo = new ApplicationInfo();
|
||||
mAppInfo.flags = ApplicationInfo.FLAG_INSTALLED;
|
||||
mAppInfo.packageName = TEST_PACKAGE_NAME;
|
||||
mAppInfo.name = TEST_APPLICATION_LABEL;
|
||||
mPackageInfo = new PackageInfo();
|
||||
mPackageInfo.packageName = TEST_PACKAGE_NAME;
|
||||
mPackageInfo.applicationInfo = mAppInfo;
|
||||
mPackageStats = new PackageStats(TEST_PACKAGE_NAME);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,9 @@ package com.android.settings.panel;
|
||||
|
||||
import static com.android.settings.panel.PanelContent.VIEW_TYPE_SLIDER;
|
||||
import static com.android.settings.panel.PanelSlicesAdapter.MAX_NUM_OF_SLICES;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_GROUP_SLICE_URI;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;
|
||||
import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_SLICE_URI;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
@@ -139,6 +141,58 @@ public class PanelSlicesAdapterTest {
|
||||
assertThat(viewHolder.isDividerAllowedAbove()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outputSwitcherSlice_shouldAddFirstItemPadding() {
|
||||
addTestLiveData(MEDIA_OUTPUT_SLICE_URI);
|
||||
|
||||
final PanelSlicesAdapter adapter =
|
||||
new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
|
||||
final int position = 0;
|
||||
final ViewGroup view = new FrameLayout(mContext);
|
||||
final SliceRowViewHolder viewHolder =
|
||||
adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER);
|
||||
|
||||
adapter.onBindViewHolder(viewHolder, position);
|
||||
|
||||
assertThat(viewHolder.mSliceSliderLayout.getPaddingTop()).isEqualTo(
|
||||
mPanelFragment.getResources().getDimensionPixelSize(
|
||||
R.dimen.output_switcher_slice_padding_top));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void outputSwitcherGroupSlice_shouldAddFirstItemPadding() {
|
||||
addTestLiveData(MEDIA_OUTPUT_GROUP_SLICE_URI);
|
||||
|
||||
final PanelSlicesAdapter adapter =
|
||||
new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
|
||||
final int position = 0;
|
||||
final ViewGroup view = new FrameLayout(mContext);
|
||||
final SliceRowViewHolder viewHolder =
|
||||
adapter.onCreateViewHolder(view, PanelContent.VIEW_TYPE_SLIDER);
|
||||
|
||||
adapter.onBindViewHolder(viewHolder, position);
|
||||
|
||||
assertThat(viewHolder.mSliceSliderLayout.getPaddingTop()).isEqualTo(
|
||||
mPanelFragment.getResources().getDimensionPixelSize(
|
||||
R.dimen.output_switcher_slice_padding_top));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void mediaOutputIndicatorSlice_notSliderPanel_noSliderLayout() {
|
||||
addTestLiveData(MEDIA_OUTPUT_INDICATOR_SLICE_URI);
|
||||
|
||||
final PanelSlicesAdapter adapter =
|
||||
new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */);
|
||||
final int position = 0;
|
||||
final ViewGroup view = new FrameLayout(mContext);
|
||||
final SliceRowViewHolder viewHolder =
|
||||
adapter.onCreateViewHolder(view, 0 /* view type*/);
|
||||
|
||||
adapter.onBindViewHolder(viewHolder, position);
|
||||
|
||||
assertThat(viewHolder.mSliceSliderLayout).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onCreateViewHolder_viewTypeSlider_verifyLayout() {
|
||||
final PanelSlicesAdapter adapter =
|
||||
|
||||
Reference in New Issue
Block a user