Merge "Log app special permission change for SPA" into udc-dev
diff --git a/res/drawable/ic_enterprise.xml b/res/drawable/ic_enterprise.xml
index c2d9df6..231f706 100644
--- a/res/drawable/ic_enterprise.xml
+++ b/res/drawable/ic_enterprise.xml
@@ -17,9 +17,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportWidth="960"
+ android:viewportHeight="960">
<path
- android:pathData="M20,6h-4L16,4c0,-1.11 -0.89,-2 -2,-2h-4c-1.11,0 -2,0.89 -2,2v2L4,6c-1.11,0 -1.99,0.89 -1.99,2L2,19c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,8c0,-1.11 -0.89,-2 -2,-2zM12,15c-1.1,0 -2,-0.9 -2,-2s0.9,-2 2,-2 2,0.9 2,2 -0.9,2 -2,2zM14,6h-4L10,4h4v2z"
+ android:pathData="M140,840Q116,840 98,822Q80,804 80,780L80,300Q80,276 98,258Q116,240 140,240L320,240L320,140Q320,116 338,98Q356,80 380,80L580,80Q604,80 622,98Q640,116 640,140L640,240L820,240Q844,240 862,258Q880,276 880,300L880,780Q880,804 862,822Q844,840 820,840L140,840ZM380,240L580,240L580,140Q580,140 580,140Q580,140 580,140L380,140Q380,140 380,140Q380,140 380,140L380,240Z"
android:fillColor="?android:attr/colorPrimary"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/trackpad_bordered.xml b/res/drawable/trackpad_bordered.xml
new file mode 100644
index 0000000..940be8f
--- /dev/null
+++ b/res/drawable/trackpad_bordered.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="24dp" />
+ <solid android:color="@android:color/transparent"/>
+ <stroke
+ android:width="1dp"
+ android:color="?androidprv:attr/materialColorPrimary"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/drawable/trackpad_button_done_colored.xml b/res/drawable/trackpad_button_done_colored.xml
new file mode 100644
index 0000000..995d733
--- /dev/null
+++ b/res/drawable/trackpad_button_done_colored.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2022 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.
+-->
+
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+ <ripple
+ android:color="?android:attr/colorControlHighlight">
+ <item>
+ <shape android:shape="rectangle">
+ <corners android:radius="24dp"/>
+ <solid android:color="?androidprv:attr/materialColorPrimary"/>
+ </shape>
+ </item>
+ </ripple>
+</inset>
\ No newline at end of file
diff --git a/res/layout/dream_preference_layout.xml b/res/layout/dream_preference_layout.xml
index aff8ad3..05b7b6e 100644
--- a/res/layout/dream_preference_layout.xml
+++ b/res/layout/dream_preference_layout.xml
@@ -79,6 +79,7 @@
android:textSize="@dimen/dream_item_title_text_size"
android:textColor="@color/dream_card_text_color_state_list"
android:drawablePadding="@dimen/dream_item_icon_padding"
+ android:drawableTint="@color/dream_card_icon_color_state_list"
app:layout_constraintTop_toBottomOf="@+id/preview"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/res/layout/trackpad_gesture_preview.xml b/res/layout/trackpad_gesture_preview.xml
index be2b6a0..15cc743 100644
--- a/res/layout/trackpad_gesture_preview.xml
+++ b/res/layout/trackpad_gesture_preview.xml
@@ -29,11 +29,11 @@
<RelativeLayout
android:layout_width="match_parent"
- android:layout_height="48dp"
+ android:layout_height="wrap_content"
android:layout_marginStart="8dip"
android:layout_marginEnd="8dip"
android:layout_marginTop="6dip"
- android:layout_marginBottom="6dip"
+ android:layout_marginBottom="48dip"
android:layout_weight="1">
<Button
@@ -46,7 +46,7 @@
android:layout_alignParentStart="true"
android:paddingVertical="14dp"
android:drawablePadding="9dp"
- style="@style/ModifierKeyButtonCancel"
+ style="@style/TrackpadButtonCancel"
android:textColor="?android:attr/textColorPrimary"
android:text="@string/gesture_button_skip"/>
@@ -60,15 +60,16 @@
android:layout_alignParentStart="true"
android:paddingVertical="14dp"
android:drawablePadding="9dp"
- style="@style/ModifierKeyButtonCancel"
+ style="@style/TrackpadButtonCancel"
android:textColor="?android:attr/textColorPrimary"
android:text="@string/gesture_button_restart"/>
<LinearLayout
android:id="@+id/viewGroup"
- android:layout_width="fill_parent"
- android:layout_height="48dp"
- android:gravity="center"/>
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_centerHorizontal="true"/>
<Button
android:id="@+id/button_next"
@@ -80,7 +81,7 @@
android:layout_alignParentEnd="true"
android:paddingVertical="14dp"
android:drawablePadding="9dp"
- style="@style/ModifierKeyButtonDone"
+ style="@style/TrackpadButtonDone"
android:textColor="?androidprv:attr/materialColorOnPrimary"
android:text="@string/gesture_button_next"/>
@@ -94,7 +95,7 @@
android:layout_alignParentEnd="true"
android:paddingVertical="14dp"
android:drawablePadding="9dp"
- style="@style/ModifierKeyButtonDone"
+ style="@style/TrackpadButtonDone"
android:textColor="?androidprv:attr/materialColorOnPrimary"
android:text="@string/gesture_button_done"/>
</RelativeLayout>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5618ed1..53766e7 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -380,6 +380,20 @@
<item name="android:padding">4dp</item>
</style>
+ <style name="TrackpadButtonDone" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/trackpad_button_done_colored</item>
+ <item name="android:stateListAnimator">@null</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:padding">4dp</item>
+ </style>
+
+ <style name="TrackpadButtonCancel" parent="@android:style/Widget.Material.Button">
+ <item name="android:background">@drawable/trackpad_bordered</item>
+ <item name="android:stateListAnimator">@null</item>
+ <item name="android:textSize">16sp</item>
+ <item name="android:padding">4dp</item>
+ </style>
+
<style name="LockPatternContainerStyle">
<item name="android:gravity">center</item>
<item name="android:maxHeight">@dimen/biometric_auth_pattern_view_max_size</item>
diff --git a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
index af06a01..0446c20 100644
--- a/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
+++ b/src/com/android/settings/applications/credentials/CombinedProviderInfo.java
@@ -43,18 +43,18 @@
private final List<CredentialProviderInfo> mCredentialProviderInfos;
private final @Nullable AutofillServiceInfo mAutofillServiceInfo;
private final boolean mIsDefaultAutofillProvider;
- private final boolean mIsDefaultCredmanProvider;
+ private final boolean mIsPrimaryCredmanProvider;
/** Constructs an information instance from both autofill and credential provider. */
public CombinedProviderInfo(
@Nullable List<CredentialProviderInfo> cpis,
@Nullable AutofillServiceInfo asi,
boolean isDefaultAutofillProvider,
- boolean isDefaultCredmanProvider) {
+ boolean IsPrimaryCredmanProvider) {
mCredentialProviderInfos = new ArrayList<>(cpis);
mAutofillServiceInfo = asi;
mIsDefaultAutofillProvider = isDefaultAutofillProvider;
- mIsDefaultCredmanProvider = isDefaultCredmanProvider;
+ mIsPrimaryCredmanProvider = IsPrimaryCredmanProvider;
}
/** Returns the credential provider info. */
@@ -149,8 +149,8 @@
}
/** Returns whether the provider is the default credman provider. */
- public boolean isDefaultCredmanProvider() {
- return mIsDefaultCredmanProvider;
+ public boolean isPrimaryCredmanProvider() {
+ return mIsPrimaryCredmanProvider;
}
/** Returns the settings subtitle. */
@@ -192,7 +192,13 @@
}
}
- // TODO(280454916): Add logic here.
+ // If there is a primary cred man provider then return that.
+ for (CombinedProviderInfo cpi : providers) {
+ if (cpi.isPrimaryCredmanProvider()) {
+ return cpi;
+ }
+ }
+
return null;
}
@@ -250,14 +256,14 @@
}
// Check if we have any enabled cred man services.
- boolean isDefaultCredmanProvider = false;
+ boolean isPrimaryCredmanProvider = false;
if (!cpi.isEmpty()) {
- isDefaultCredmanProvider = cpi.get(0).isEnabled();
+ isPrimaryCredmanProvider = cpi.get(0).isPrimary();
}
cmpi.add(
new CombinedProviderInfo(
- cpi, selectedAsi, isDefaultAutofillProvider, isDefaultCredmanProvider));
+ cpi, selectedAsi, isDefaultAutofillProvider, isPrimaryCredmanProvider));
}
return cmpi;
diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
index 069336e..bd7c485 100644
--- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java
@@ -321,7 +321,7 @@
mEnabledPackageNames.clear();
for (CredentialProviderInfo cpi : availableServices) {
- if (cpi.isEnabled()) {
+ if (cpi.isEnabled() && !cpi.isPrimary()) {
mEnabledPackageNames.add(cpi.getServiceInfo().packageName);
}
}
@@ -560,15 +560,25 @@
return;
}
- List<String> enabledServices = getEnabledSettings();
+ // Get the existing primary providers since we don't touch them in
+ // this part of the UI we should just copy them over.
+ Set<String> primaryServices = new HashSet<>();
+ for (CredentialProviderInfo service : mServices) {
+ if (service.isPrimary()) {
+ primaryServices.add(service.getServiceInfo().getComponentName().flattenToString());
+ }
+ }
+
mCredentialManager.setEnabledProviders(
- enabledServices,
+ new ArrayList<>(primaryServices),
+ getEnabledSettings(),
getUser(),
mExecutor,
new OutcomeReceiver<Void, SetEnabledProvidersException>() {
@Override
public void onResult(Void result) {
Log.i(TAG, "setEnabledProviders success");
+ updateFromExternal();
}
@Override
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
index cfaf7a2..793aa3c 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
@@ -47,7 +47,9 @@
import com.android.settingslib.widget.CandidateInfo;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
public class DefaultCombinedPicker extends DefaultAppPickerFragment {
@@ -338,9 +340,9 @@
return true;
}
- private void setProviders(String autofillProvider, List<String> credManProviders) {
+ private void setProviders(String autofillProvider, List<String> primaryCredManProviders) {
if (TextUtils.isEmpty(autofillProvider)) {
- if (credManProviders.size() > 0) {
+ if (primaryCredManProviders.size() > 0) {
autofillProvider =
CredentialManagerPreferenceController
.AUTOFILL_CREDMAN_ONLY_PROVIDER_PLACEHOLDER;
@@ -350,12 +352,25 @@
Settings.Secure.putStringForUser(
getContext().getContentResolver(), AUTOFILL_SETTING, autofillProvider, mUserId);
- CredentialManager service = getCredentialProviderService();
+ final CredentialManager service = getCredentialProviderService();
if (service == null) {
return;
}
+ // Get the existing secondary providers since we don't touch them in
+ // this part of the UI we should just copy them over.
+ final List<String> credManProviders = new ArrayList<>();
+ for (CredentialProviderInfo cpi :
+ service.getCredentialProviderServices(
+ mUserId, CredentialManager.PROVIDER_FILTER_USER_PROVIDERS_ONLY)) {
+
+ if (cpi.isEnabled()) {
+ credManProviders.add(cpi.getServiceInfo().getComponentName().flattenToString());
+ }
+ }
+
service.setEnabledProviders(
+ primaryCredManProviders,
credManProviders,
mUserId,
ContextCompat.getMainExecutor(getContext()),
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index ca049bc..64d4f0d 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -135,12 +135,12 @@
/** Provides Intent to setting activity for the specified autofill service. */
static final class AutofillSettingIntentProvider {
- private final String mSelectedKey;
+ private final String mKey;
private final Context mContext;
private final int mUserId;
public AutofillSettingIntentProvider(Context context, int userId, String key) {
- mSelectedKey = key;
+ mKey = key;
mContext = context;
mUserId = userId;
}
@@ -153,10 +153,9 @@
for (ResolveInfo resolveInfo : resolveInfos) {
final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
- final String flattenKey =
- new ComponentName(serviceInfo.packageName, serviceInfo.name)
- .flattenToString();
- if (TextUtils.equals(mSelectedKey, flattenKey)) {
+
+ // If there are multiple autofill services then pick the first one.
+ if (mKey.startsWith(serviceInfo.packageName)) {
final String settingsActivity;
try {
settingsActivity =
@@ -164,7 +163,7 @@
.getSettingsActivity();
} catch (SecurityException e) {
// Service does not declare the proper permission, ignore it.
- Log.w(TAG, "Error getting info for " + serviceInfo + ": " + e);
+ Log.e(TAG, "Error getting info for " + serviceInfo + ": " + e);
return null;
}
if (TextUtils.isEmpty(settingsActivity)) {
diff --git a/src/com/android/settings/dream/DreamAdapter.java b/src/com/android/settings/dream/DreamAdapter.java
index aa71aab..1d1c3bd 100644
--- a/src/com/android/settings/dream/DreamAdapter.java
+++ b/src/com/android/settings/dream/DreamAdapter.java
@@ -19,7 +19,6 @@
import android.annotation.LayoutRes;
import android.content.Context;
import android.graphics.drawable.Drawable;
-import android.graphics.drawable.VectorDrawable;
import android.text.TextUtils;
import android.util.SparseIntArray;
import android.view.LayoutInflater;
@@ -86,10 +85,6 @@
final Drawable icon = item.isActive()
? mContext.getDrawable(R.drawable.ic_dream_check_circle)
: item.getIcon().mutate();
- if (icon instanceof VectorDrawable) {
- icon.setTintList(
- mContext.getColorStateList(R.color.dream_card_icon_color_state_list));
- }
final int iconSize = mContext.getResources().getDimensionPixelSize(
R.dimen.dream_item_icon_size);
icon.setBounds(0, 0, iconSize, iconSize);
diff --git a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
index 6c79287..c910e69 100644
--- a/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceController.java
@@ -11,8 +11,6 @@
* 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.fuelgauge;
@@ -25,6 +23,7 @@
import android.os.BatteryManager;
import android.os.PowerManager;
import android.text.TextUtils;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceFragmentCompat;
@@ -48,6 +47,8 @@
public class BatteryHeaderPreferenceController extends BasePreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnStart,
BatteryPreferenceController {
+ private static final String TAG = "BatteryHeaderPreferenceController";
+
@VisibleForTesting
static final String KEY_BATTERY_HEADER = "battery_header";
private static final int BATTERY_MAX_LEVEL = 100;
@@ -86,7 +87,7 @@
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
mBatteryUsageProgressBarPref = screen.findPreference(getPreferenceKey());
- //Set up loading text first to prevent layout flaky before info loaded.
+ // Set up loading text first to prevent layout flaky before info loaded.
mBatteryUsageProgressBarPref.setBottomSummary(
mContext.getString(R.string.settings_license_activity_loading));
@@ -109,7 +110,9 @@
}
private CharSequence generateLabel(BatteryInfo info) {
- if (BatteryUtils.isBatteryDefenderOn(info)) {
+ if (Utils.containsIncompatibleChargers(mContext, TAG)) {
+ return mContext.getString(R.string.battery_info_status_not_charging);
+ } else if (BatteryUtils.isBatteryDefenderOn(info)) {
return null;
} else if (info.remainingLabel == null
|| info.batteryStatus == BatteryManager.BATTERY_STATUS_NOT_CHARGING) {
@@ -151,12 +154,14 @@
* Callback which receives text for the summary line.
*/
public void updateBatteryStatus(String label, BatteryInfo info) {
- mBatteryUsageProgressBarPref.setBottomSummary(label != null ? label : generateLabel(info));
+ final CharSequence summary = label != null ? label : generateLabel(info);
+ mBatteryUsageProgressBarPref.setBottomSummary(summary);
+ Log.d(TAG, "updateBatteryStatus: " + label + " summary: " + summary);
}
public void quickUpdateHeaderPreference() {
- Intent batteryBroadcast = mContext.registerReceiver(null,
- new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+ Intent batteryBroadcast = com.android.settingslib.fuelgauge.BatteryUtils
+ .getBatteryIntent(mContext);
final int batteryLevel = Utils.getBatteryLevel(batteryBroadcast);
final boolean discharging =
batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) == 0;
diff --git a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
index d686594..254cf04 100644
--- a/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceController.java
@@ -164,6 +164,7 @@
if (summary != null) {
mPreference.setSummary(summary);
}
+ Log.d(TAG, "updateBatteryStatus: " + label + " summary: " + summary);
}
@VisibleForTesting
diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index a51e084..6914c30 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -1754,7 +1754,7 @@
private static Set<String> getSystemAppsPackageNames(Context context) {
return sTestSystemAppsPackageNames != null ? sTestSystemAppsPackageNames
- : AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId(), false);
+ : AppListRepositoryUtil.getSystemPackageNames(context, context.getUserId());
}
private static Set<Integer> getSystemAppsUids(Context context) {
diff --git a/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java b/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
index b644eb1..1a90376 100644
--- a/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
+++ b/src/com/android/settings/inputmethod/TrackpadGestureDialogFragment.java
@@ -17,17 +17,21 @@
package com.android.settings.inputmethod;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG;
+import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
+import android.graphics.Color;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
import android.view.Window;
+import android.view.WindowInsets;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
@@ -87,6 +91,7 @@
if (window == null) {
return;
}
+ setLayoutEdgeToEdge(window);
final Point size = getScreenSize();
final WindowManager.LayoutParams attributes = window.getAttributes();
attributes.width = (int) (size.x * 0.75);
@@ -94,14 +99,28 @@
}
@Override
+ public void onPause() {
+ super.onPause();
+ dismiss();
+ }
+
+ private static void setLayoutEdgeToEdge(Window window) {
+ View windowDecorView = window.getDecorView();
+ windowDecorView.setSystemUiVisibility(
+ windowDecorView.getSystemUiVisibility()
+ | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
+ window.setNavigationBarColor(Color.TRANSPARENT);
+ }
+
+ @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
+
mInflater = mContext.getSystemService(LayoutInflater.class);
-
- View gestureEducationView = mInflater.inflate(R.layout.trackpad_gesture_preview, null);
- addViewPager(gestureEducationView);
- dialog.setContentView(gestureEducationView);
-
+ View contentView = mInflater.inflate(R.layout.trackpad_gesture_preview, null);
+ addViewPager(contentView);
+ dialog.setContentView(contentView);
Window gestureDialogWindow = dialog.getWindow();
gestureDialogWindow.setType(TYPE_SYSTEM_DIALOG);
@@ -109,8 +128,40 @@
FrameLayout bottomSheet = (FrameLayout)
dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet);
bottomSheet.setBackgroundResource(android.R.color.transparent);
- BottomSheetBehavior.from(bottomSheet)
- .setState(BottomSheetBehavior.STATE_EXPANDED);
+ BottomSheetBehavior<FrameLayout> behavior = BottomSheetBehavior.from(bottomSheet);
+ if (!isGestureNavigationEnabled()) {
+ behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+ }
+ ViewTreeObserver observer = contentView.getViewTreeObserver();
+ observer.addOnGlobalLayoutListener(
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+ int contentViewHeight = contentView.getMeasuredHeight();
+ int navigationBarHeight = getNavigationBarHeight();
+ behavior.setPeekHeight(contentViewHeight - navigationBarHeight);
+ }
+ });
+
+ // The gesture education view shouldn't be draggable."
+ behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
+ @Override
+ public void onStateChanged(View bottomSheet, int newState) {
+ if (newState == BottomSheetBehavior.STATE_DRAGGING) {
+ if (isGestureNavigationEnabled()) {
+ behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
+ } else {
+ behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
+ }
+ }
+ }
+
+ @Override
+ public void onSlide(View bottomSheet, float slideOffset) {
+ // Do nothing.
+ }
+ });
return dialog;
}
@@ -263,4 +314,16 @@
display.getSize(size);
return size;
}
+
+ private int getNavigationBarHeight() {
+ final Activity activity = (Activity) mContext;
+ WindowInsets insets =
+ activity.getWindowManager().getCurrentWindowMetrics().getWindowInsets();
+ return insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
+ }
+
+ private boolean isGestureNavigationEnabled() {
+ return NAV_BAR_MODE_GESTURAL == mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_navBarInteractionMode);
+ }
}
diff --git a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
index 0bbfb98..10d3013 100644
--- a/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
+++ b/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceController.java
@@ -30,12 +30,12 @@
@Override
public boolean isChecked() {
- return InputSettings.useTouchpadNaturalScrolling(mContext);
+ return !InputSettings.useTouchpadNaturalScrolling(mContext);
}
@Override
public boolean setChecked(boolean isChecked) {
- InputSettings.setTouchpadNaturalScrolling(mContext, isChecked);
+ InputSettings.setTouchpadNaturalScrolling(mContext, !isChecked);
return true;
}
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index 02455a1..38f6596 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -940,28 +940,11 @@
* Copied from WifiCallingPreferenceController#isWifiCallingEnabled()
*/
public static boolean isWifiCallingEnabled(Context context, int subId,
- @Nullable WifiCallingQueryImsState queryImsState,
- @Nullable PhoneAccountHandle phoneAccountHandle) {
- if (phoneAccountHandle == null){
- phoneAccountHandle = context.getSystemService(TelecomManager.class)
- .getSimCallManagerForSubscription(subId);
+ @Nullable WifiCallingQueryImsState queryImsState) {
+ if (queryImsState == null) {
+ queryImsState = new WifiCallingQueryImsState(context, subId);
}
- boolean isWifiCallingEnabled;
- if (phoneAccountHandle != null) {
- final Intent intent = buildPhoneAccountConfigureIntent(context, phoneAccountHandle);
- if (intent == null) {
- Log.d(TAG, "Can not get phoneAccount configure intent.");
- isWifiCallingEnabled = false;
- } else {
- isWifiCallingEnabled = true;
- }
- } else {
- if (queryImsState == null) {
- queryImsState = new WifiCallingQueryImsState(context, subId);
- }
- isWifiCallingEnabled = queryImsState.isReadyToWifiCalling();
- }
- return isWifiCallingEnabled;
+ return queryImsState.isReadyToWifiCalling();
}
/**
diff --git a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
index 7ad9e03..ebfb283 100644
--- a/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
+++ b/src/com/android/settings/network/telephony/NetworkProviderWifiCallingGroup.java
@@ -22,7 +22,6 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.os.PersistableBundle;
import android.provider.Settings;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
@@ -314,8 +313,7 @@
@VisibleForTesting
protected boolean shouldShowWifiCallingForSub(int subId) {
if (SubscriptionManager.isValidSubscriptionId(subId)
- && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, queryImsState(subId),
- null)) {
+ && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, queryImsState(subId))) {
return true;
}
return false;
diff --git a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
index 1bc2f90..03cc23f 100644
--- a/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
+++ b/src/com/android/settings/network/telephony/WifiCallingPreferenceController.java
@@ -71,7 +71,7 @@
@Override
public int getAvailabilityStatus(int subId) {
return SubscriptionManager.isValidSubscriptionId(subId)
- && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, null, null)
+ && MobileNetworkUtils.isWifiCallingEnabled(mContext, subId, null)
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index e35b0d8..0bf13b1 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -854,6 +854,19 @@
}
@Override
+ public void onStop() {
+ super.onStop();
+ // hasCredential checks to see if user chooses a password for screen lock. If the
+ // screen lock is None or Swipe, we do not want to call getActivity().finish().
+ // Otherwise, bugs would be caused. (e.g. b/278488549, b/278530059)
+ final boolean hasCredential = mLockPatternUtils.isSecure(mUserId);
+ if (!getActivity().isChangingConfigurations()
+ && !mWaitingForConfirmation && hasCredential) {
+ getActivity().finish();
+ }
+ }
+
+ @Override
public void onDestroy() {
super.onDestroy();
if (mUserPassword != null) {
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettings.java b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
index 42ce1b1..0c3457c 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettings.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettings.java
@@ -257,8 +257,10 @@
for (SubscriptionInfo subInfo : subInfoList) {
int subId = subInfo.getSubscriptionId();
try {
- if (MobileNetworkUtils.isWifiCallingEnabled(getContext(), subId,
- queryImsState(subId), null)) {
+ if (MobileNetworkUtils.isWifiCallingEnabled(
+ getContext(),
+ subId,
+ queryImsState(subId))) {
selectedList.add(subInfo);
}
} catch (Exception exception) {}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
index 78534e1..f94e5bf 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java
@@ -11,10 +11,7 @@
* 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.fuelgauge;
import static com.google.common.truth.Truth.assertThat;
@@ -29,6 +26,9 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
import android.icu.text.NumberFormat;
import android.os.BatteryManager;
import android.os.PowerManager;
@@ -43,6 +43,7 @@
import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip;
import com.android.settings.fuelgauge.batterytip.tips.SmartBatteryTip;
+import com.android.settings.testutils.BatteryTestUtils;
import com.android.settings.testutils.shadow.ShadowEntityHeaderController;
import com.android.settings.testutils.shadow.ShadowUtils;
import com.android.settings.widget.EntityHeaderController;
@@ -85,6 +86,13 @@
private UsageProgressBarPreference mBatteryUsageProgressBarPref;
@Mock
private BatteryStatusFeatureProvider mBatteryStatusFeatureProvider;
+ @Mock
+ private UsbPort mUsbPort;
+ @Mock
+ private UsbManager mUsbManager;
+ @Mock
+ private UsbPortStatus mUsbPortStatus;
+
private BatteryHeaderPreferenceController mController;
private Context mContext;
private ShadowPowerManager mShadowPowerManager;
@@ -99,6 +107,7 @@
mLifecycleOwner = () -> mLifecycle;
mLifecycle = new Lifecycle(mLifecycleOwner);
mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getSystemService(UsbManager.class)).thenReturn(mUsbManager);
ShadowEntityHeaderController.setUseMock(mEntityHeaderController);
mBatteryIntent = new Intent();
@@ -290,6 +299,16 @@
}
@Test
+ public void updatePreference_incompatibleCharger_showNotChargingState() {
+ BatteryTestUtils.setupIncompatibleEvent(mUsbPort, mUsbManager, mUsbPortStatus);
+
+ mController.updateHeaderPreference(mBatteryInfo);
+
+ verify(mBatteryUsageProgressBarPref).setBottomSummary(
+ mContext.getString(R.string.battery_info_status_not_charging));
+ }
+
+ @Test
public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() {
mController.quickUpdateHeaderPreference();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
index 5f825ae..b444309 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/TopLevelBatteryPreferenceControllerTest.java
@@ -36,6 +36,7 @@
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
+import com.android.settings.testutils.BatteryTestUtils;
import org.junit.Before;
import org.junit.Ignore;
@@ -136,7 +137,7 @@
@Test
public void getDashboardLabel_incompatibleCharger_returnsCorrectLabel() {
- setupIncompatibleEvent();
+ BatteryTestUtils.setupIncompatibleEvent(mUsbPort, mUsbManager, mUsbPortStatus);
mController.mPreference = new Preference(mContext);
BatteryInfo info = new BatteryInfo();
@@ -150,14 +151,4 @@
assertThat(mController.getSummary())
.isEqualTo(mContext.getString(R.string.battery_missing_message));
}
-
- private void setupIncompatibleEvent() {
- final List<UsbPort> usbPorts = new ArrayList<>();
- usbPorts.add(mUsbPort);
- when(mUsbManager.getPorts()).thenReturn(usbPorts);
- when(mUsbPort.getStatus()).thenReturn(mUsbPortStatus);
- when(mUsbPort.supportsComplianceWarnings()).thenReturn(true);
- when(mUsbPortStatus.isConnected()).thenReturn(true);
- when(mUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
- }
}
diff --git a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
index b4cb862..a99abb8 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/TrackpadReverseScrollingPreferenceControllerTest.java
@@ -61,7 +61,7 @@
}
@Test
- public void setChecked_true_shouldReturn1() {
+ public void setChecked_true_shouldReturn0() {
mController.setChecked(true);
int result = Settings.System.getIntForUser(
@@ -70,24 +70,24 @@
0,
UserHandle.USER_CURRENT);
- assertThat(result).isEqualTo(1);
- }
-
- @Test
- public void setChecked_false_shouldReturn0() {
- mController.setChecked(false);
-
- int result = Settings.System.getIntForUser(
- mContext.getContentResolver(),
- SETTING_KEY,
- 0,
- UserHandle.USER_CURRENT);
-
assertThat(result).isEqualTo(0);
}
@Test
- public void isChecked_providerPutInt1_returnTrue() {
+ public void setChecked_false_shouldReturn1() {
+ mController.setChecked(false);
+
+ int result = Settings.System.getIntForUser(
+ mContext.getContentResolver(),
+ SETTING_KEY,
+ 0,
+ UserHandle.USER_CURRENT);
+
+ assertThat(result).isEqualTo(1);
+ }
+
+ @Test
+ public void isChecked_providerPutInt1_returnFalse() {
Settings.System.putIntForUser(
mContext.getContentResolver(),
SETTING_KEY,
@@ -96,11 +96,11 @@
boolean result = mController.isChecked();
- assertThat(result).isTrue();
+ assertThat(result).isFalse();
}
@Test
- public void isChecked_providerPutInt0_returnFalse() {
+ public void isChecked_providerPutInt0_returnTrue() {
Settings.System.putIntForUser(
mContext.getContentResolver(),
SETTING_KEY,
@@ -109,6 +109,6 @@
boolean result = mController.isChecked();
- assertThat(result).isFalse();
+ assertThat(result).isTrue();
}
}
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index c7680b5..b75fa8c 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -16,11 +16,15 @@
package com.android.settings.testutils;
+import static org.mockito.Mockito.when;
+
import android.content.Context;
import android.content.Intent;
+import android.hardware.usb.UsbManager;
+import android.hardware.usb.UsbPort;
+import android.hardware.usb.UsbPortStatus;
import android.os.BatteryManager;
import android.os.UserManager;
-
import androidx.room.Room;
import com.android.settings.fuelgauge.batteryusage.BatteryInformation;
@@ -36,6 +40,9 @@
import org.robolectric.Shadows;
+import java.util.ArrayList;
+import java.util.List;
+
public class BatteryTestUtils {
public static Intent getChargingIntent() {
@@ -163,6 +170,7 @@
}
}
+ /** Gets customized battery changed intent. */
public static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
Intent intent = new Intent();
intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
@@ -172,4 +180,16 @@
return intent;
}
+
+ /** Configures the incompatible charger environment. */
+ public static void setupIncompatibleEvent(
+ UsbPort mockUsbPort, UsbManager mockUsbManager, UsbPortStatus mockUsbPortStatus) {
+ final List<UsbPort> usbPorts = new ArrayList<>();
+ usbPorts.add(mockUsbPort);
+ when(mockUsbManager.getPorts()).thenReturn(usbPorts);
+ when(mockUsbPort.getStatus()).thenReturn(mockUsbPortStatus);
+ when(mockUsbPort.supportsComplianceWarnings()).thenReturn(true);
+ when(mockUsbPortStatus.isConnected()).thenReturn(true);
+ when(mockUsbPortStatus.getComplianceWarnings()).thenReturn(new int[]{1});
+ }
}
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
index f954ea4..1043fdf 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkUtilsTest.java
@@ -385,35 +385,19 @@
}
@Test
- public void isWifiCallingEnabled_hasPhoneAccountHandleAndHasActivityHandleIntent_returnTrue() {
- buildPhoneAccountConfigureIntent(true);
-
- assertTrue(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
- null, mPhoneAccountHandle));
- }
-
- @Test
- public void isWifiCallingEnabled_hasPhoneAccountHandleAndNoActivityHandleIntent_returnFalse() {
- buildPhoneAccountConfigureIntent(false);
-
- assertFalse(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
- null, mPhoneAccountHandle));
- }
-
- @Test
- public void isWifiCallingEnabled_noPhoneAccountHandleAndWifiCallingIsReady_returnTrue() {
+ public void isWifiCallingEnabled_wifiCallingIsReady_returnTrue() {
setWifiCallingEnabled(true);
assertTrue(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
- mMockQueryWfcState, null));
+ mMockQueryWfcState));
}
@Test
- public void isWifiCallingEnabled_noPhoneAccountHandleAndWifiCallingNotReady_returnFalse() {
+ public void isWifiCallingEnabled_wifiCallingNotReady_returnFalse() {
setWifiCallingEnabled(false);
assertFalse(MobileNetworkUtils.isWifiCallingEnabled(mContext, SUB_ID_1,
- mMockQueryWfcState, null));
+ mMockQueryWfcState));
}
private void setWifiCallingEnabled(boolean enabled){