Merge "Update strings for battery settings"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b708471..92a1066 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2622,6 +2622,8 @@
android:name=".wifi.NetworkRequestDialogActivity"
android:theme="@style/Transparent"
android:excludeFromRecents="true"
+ android:launchMode="singleTop"
+ android:taskAffinity=".wifi.NetworkRequestDialogActivity"
android:exported="true"
android:permission="android.permission.NETWORK_SETTINGS">
<intent-filter>
@@ -2971,6 +2973,17 @@
</intent-filter>
</service>
+ <service
+ android:name=".development.qstile.DevelopmentTiles$SensorsOff"
+ android:label="@string/sensors_off_quick_settings_title"
+ android:icon="@drawable/tile_icon_sensors_off"
+ android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
+ android:enabled="false">
+ <intent-filter>
+ <action android:name="android.service.quicksettings.action.QS_TILE" />
+ </intent-filter>
+ </service>
+
<activity
android:name=".HelpTrampoline"
android:exported="true"
diff --git a/res/drawable/tile_icon_sensors_off.xml b/res/drawable/tile_icon_sensors_off.xml
new file mode 100644
index 0000000..890fa83
--- /dev/null
+++ b/res/drawable/tile_icon_sensors_off.xml
@@ -0,0 +1,39 @@
+<!--
+ 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.
+-->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:pathData="M21.966,2 L2,22"
+ android:strokeLineCap="round"
+ android:strokeColor="#000000"
+ android:fillColor="#00000000"
+ android:strokeWidth="1.6521436"
+ android:strokeLineJoin="miter"
+ android:strokeAlpha="1"/>
+ <path
+ android:pathData="M0.752,12L4.496,12l2.496,-6.25 2.496,12.5 2.496,-15 2.496,12.5 2.496,-7.5 1.248,3.75h4.992"
+ android:strokeLineCap="round"
+ android:strokeColor="#000000"
+ android:fillColor="#00000000"
+ android:strokeWidth="1.25090861"
+ android:strokeLineJoin="round"
+ android:strokeAlpha="1"/>
+</vector>
+
diff --git a/res/layout/settings_homepage.xml b/res/layout/settings_homepage.xml
index e04b372..6e2b302 100644
--- a/res/layout/settings_homepage.xml
+++ b/res/layout/settings_homepage.xml
@@ -21,7 +21,7 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <androidx.recyclerview.widget.RecyclerView
+ <com.android.settings.homepage.contextualcards.FocusRecyclerView
android:id="@+id/card_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b51d311..194b6c5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2997,6 +2997,8 @@
<string name="device_status_summary" product="default">Phone number, signal, etc.</string>
<!-- Main settings screen item's title to go into the storage settings screen [CHAR LIMIT=25] -->
<string name="storage_settings" >Storage</string>
+ <!-- Settings title that shows user how much storage and cache space an App is taking [CHAR LIMIT=50] -->
+ <string name="storage_settings_for_app" >Storage & cache</string>
<!-- Main settings screen item's title to go into the storage & USB settings screen [CHAR LIMIT=25] -->
<string name="storage_usb_settings" >Storage</string>
<!-- Storage settings screen title -->
@@ -7167,7 +7169,7 @@
<string name="keywords_screen_timeout">screen, lock time, timeout, lockscreen</string>
<!-- List of synonyms for Storage settings (everything related to storage on the device), used to match in settings search [CHAR LIMIT=NONE] -->
- <string name="keywords_storage_settings">memory, data, delete, clear, free, space</string>
+ <string name="keywords_storage_settings">memory, cache, data, delete, clear, free, space</string>
<!-- List of synonyms for the Bluetooth setting, used to match in settings search [CHAR LIMIT=NONE] -->
<string name="keywords_bluetooth_settings">connected, device, headphones, headset, speaker, wireless, pair, earbuds, music, media </string>
@@ -9801,6 +9803,9 @@
<!-- [CHAR LIMIT=25] Title of developer tile to toggle winscope trace -->
<string name="winscope_trace_quick_settings_title">Winscope Trace</string>
+ <!-- [CHAR LIMIT=25] Title of developer tile to toggle sensors -->
+ <string name="sensors_off_quick_settings_title">Sensors Off</string>
+
<!-- [CHAR LIMIT=60] Title of work profile setting page -->
<string name="managed_profile_settings_title">Work profile settings</string>
<!-- [CHAR LIMIT=60] The preference title for enabling cross-profile remote contact search -->
diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 506686a..435a7ef 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -55,7 +55,7 @@
<Preference
android:key="storage_settings"
- android:title="@string/storage_settings"
+ android:title="@string/storage_settings_for_app"
android:summary="@string/summary_placeholder"
settings:controller="com.android.settings.applications.appinfo.AppStoragePreferenceController" />
diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml
index 032f622..a9af2d4 100644
--- a/res/xml/development_settings.xml
+++ b/res/xml/development_settings.xml
@@ -113,7 +113,8 @@
<Preference
android:key="quick_settings_tiles"
android:title="@string/quick_settings_developer_tiles"
- android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment" />
+ android:fragment="com.android.settings.development.qstile.DevelopmentTileConfigFragment"
+ settings:searchable="false" />
<!-- Configure trust agent behavior -->
<SwitchPreference
diff --git a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
index e46f294..bd08236 100644
--- a/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
+++ b/src/com/android/settings/applications/manageapplications/ApplicationViewHolder.java
@@ -19,7 +19,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
-import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -41,10 +40,6 @@
private final TextView mAppName;
private final ImageView mAppIcon;
- private final boolean mKeepStableHeight;
-
- @VisibleForTesting
- View mSummaryContainer;
@VisibleForTesting
final TextView mSummary;
@VisibleForTesting
@@ -54,20 +49,18 @@
@VisibleForTesting
final Switch mSwitch;
- ApplicationViewHolder(View itemView, boolean keepStableHeight) {
+ ApplicationViewHolder(View itemView) {
super(itemView);
mAppName = itemView.findViewById(android.R.id.title);
mAppIcon = itemView.findViewById(android.R.id.icon);
- mSummaryContainer = itemView.findViewById(R.id.summary_container);
mSummary = itemView.findViewById(android.R.id.summary);
mDisabled = itemView.findViewById(R.id.appendix);
- mKeepStableHeight = keepStableHeight;
mSwitch = itemView.findViewById(R.id.switchWidget);
mWidgetContainer = itemView.findViewById(android.R.id.widget_frame);
}
static View newView(ViewGroup parent) {
- return newView(parent, false);
+ return newView(parent, false /* twoTarget */);
}
static View newView(ViewGroup parent, boolean twoTarget) {
@@ -76,13 +69,13 @@
final ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame);
if (twoTarget) {
if (widgetFrame != null) {
- LayoutInflater.from(parent.getContext())
- .inflate(R.layout.preference_widget_master_switch, widgetFrame, true);
+ LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.preference_widget_master_switch, widgetFrame, true);
- View divider = LayoutInflater.from(parent.getContext()).inflate(
- R.layout.preference_two_target_divider, view, false);
- // second to last, before widget frame
- view.addView(divider, view.getChildCount() - 1);
+ View divider = LayoutInflater.from(parent.getContext()).inflate(
+ R.layout.preference_two_target_divider, view, false);
+ // second to last, before widget frame
+ view.addView(divider, view.getChildCount() - 1);
}
} else if (widgetFrame != null) {
widgetFrame.setVisibility(View.GONE);
@@ -92,12 +85,10 @@
void setSummary(CharSequence summary) {
mSummary.setText(summary);
- updateSummaryContainer();
}
void setSummary(@StringRes int summary) {
mSummary.setText(summary);
- updateSummaryContainer();
}
void setEnabled(boolean isEnabled) {
@@ -133,17 +124,6 @@
} else {
mDisabled.setVisibility(View.GONE);
}
- updateSummaryContainer();
- }
-
- void updateSummaryContainer() {
- if (mKeepStableHeight) {
- mSummaryContainer.setVisibility(View.VISIBLE);
- return;
- }
- final boolean hasContent =
- !TextUtils.isEmpty(mDisabled.getText()) || !TextUtils.isEmpty(mSummary.getText());
- mSummaryContainer.setVisibility(hasContent ? View.VISIBLE : View.GONE);
}
void updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize) {
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 9586be0..9839934 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -33,7 +33,6 @@
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.app.Activity;
-import android.app.ActivityManager;
import android.app.settings.SettingsEnums;
import android.app.usage.IUsageStatsManager;
import android.content.Context;
@@ -50,22 +49,18 @@
import android.util.ArraySet;
import android.util.IconDrawableFactory;
import android.util.Log;
-import android.util.TypedValue;
-import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Filter;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Spinner;
-import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -1059,14 +1054,13 @@
@Override
public ApplicationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- View view;
+ final View view;
if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) {
view = ApplicationViewHolder.newView(parent, true /* twoTarget */);
} else {
view = ApplicationViewHolder.newView(parent, false /* twoTarget */);
}
- return new ApplicationViewHolder(view,
- shouldUseStableItemHeight(mManageApplications.mListType));
+ return new ApplicationViewHolder(view);
}
@Override
@@ -1153,11 +1147,6 @@
mSearchFilter.filter(query);
}
- @VisibleForTesting
- static boolean shouldUseStableItemHeight(int listType) {
- return true;
- }
-
private static boolean packageNameEquals(PackageItemInfo info1, PackageItemInfo info2) {
if (info1 == null || info2 == null) {
return false;
diff --git a/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java b/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
index 94d2818..bc7b855 100644
--- a/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
+++ b/src/com/android/settings/applications/managedomainurls/DomainAppPreference.java
@@ -47,12 +47,6 @@
setState();
}
- @Override
- public void onBindViewHolder(PreferenceViewHolder holder) {
- super.onBindViewHolder(holder);
- holder.itemView.findViewById(R.id.appendix).setVisibility(View.GONE);
- }
-
public void reuse() {
setState();
notifyChanged();
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 097ffe2..81b70b5 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -140,7 +140,7 @@
if (!mHasPassword) {
// No password registered, launch into enrollment wizard.
launchChooseLock();
- } else {
+ } else if (!mLaunchedConfirmLock || mToken == null) {
launchConfirmLock(getConfirmLockTitleResId(), getChallenge());
}
}
diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java
index 5edbc70..bb791ab 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTiles.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java
@@ -16,9 +16,12 @@
package com.android.settings.development.qstile;
+import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.hardware.SensorPrivacyManager;
+import android.app.KeyguardManager;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
@@ -38,6 +41,8 @@
import com.android.internal.app.LocalePicker;
import com.android.internal.statusbar.IStatusBarService;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.development.DevelopmentSettingsEnabler;
import com.android.settingslib.development.SystemPropPoker;
@@ -273,4 +278,45 @@
}
}
}
-}
\ No newline at end of file
+
+ /**
+ * Tile to toggle sensors off to control camera, mic, and sensors managed by the SensorManager.
+ */
+ public static class SensorsOff extends DevelopmentTiles {
+ private Context mContext;
+ private SensorPrivacyManager mSensorPrivacyManager;
+ private KeyguardManager mKeyguardManager;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
+ private boolean mIsEnabled;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mContext = getApplicationContext();
+ mSensorPrivacyManager = (SensorPrivacyManager) mContext.getSystemService(
+ Context.SENSOR_PRIVACY_SERVICE);
+ mIsEnabled = mSensorPrivacyManager.isSensorPrivacyEnabled();
+ mMetricsFeatureProvider = FeatureFactory.getFactory(
+ mContext).getMetricsFeatureProvider();
+ mKeyguardManager = (KeyguardManager) mContext.getSystemService(
+ Context.KEYGUARD_SERVICE);
+ }
+
+ @Override
+ protected boolean isEnabled() {
+ return mIsEnabled;
+ }
+
+ @Override
+ public void setIsEnabled(boolean isEnabled) {
+ // Don't allow sensors to be reenabled from the lock screen.
+ if (mIsEnabled && mKeyguardManager.isKeyguardLocked()) {
+ return;
+ }
+ mMetricsFeatureProvider.action(getApplicationContext(), SettingsEnums.QS_SENSOR_PRIVACY,
+ isEnabled);
+ mIsEnabled = isEnabled;
+ mSensorPrivacyManager.setSensorPrivacy(isEnabled);
+ }
+ }
+}
diff --git a/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java b/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java
deleted file mode 100644
index e9d03d7..0000000
--- a/src/com/android/settings/gestures/WakeScreenGesturePreferenceController.java
+++ /dev/null
@@ -1,103 +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.gestures;
-
-import static android.provider.Settings.Secure.DOZE_WAKE_SCREEN_GESTURE;
-
-import android.annotation.UserIdInt;
-import android.content.Context;
-import android.hardware.display.AmbientDisplayConfiguration;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.text.TextUtils;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.aware.AwareFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-
-public class WakeScreenGesturePreferenceController extends GesturePreferenceController {
-
- private static final int ON = 1;
- private static final int OFF = 0;
-
- private static final String PREF_KEY_VIDEO = "gesture_wake_screen_video";
-
- private final AwareFeatureProvider mFeatureProvider;
- private AmbientDisplayConfiguration mAmbientConfig;
- @UserIdInt
- private final int mUserId;
-
- public WakeScreenGesturePreferenceController(Context context, String key) {
- super(context, key);
- mUserId = UserHandle.myUserId();
- mFeatureProvider = FeatureFactory.getFactory(context).getAwareFeatureProvider();
- }
-
- @Override
- public int getAvailabilityStatus() {
- if (!getAmbientConfig().wakeScreenGestureAvailable()
- || !mFeatureProvider.isSupported(mContext)) {
- return UNSUPPORTED_ON_DEVICE;
- }
-
- if (!mFeatureProvider.isEnabled(mContext)) {
- return CONDITIONALLY_UNAVAILABLE;
- }
-
- return getAmbientConfig().alwaysOnEnabled(mUserId)
- ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
- }
-
- @Override
- protected boolean canHandleClicks() {
- return getAmbientConfig().alwaysOnEnabled(mUserId);
- }
-
- @Override
- public boolean isSliceable() {
- return TextUtils.equals(getPreferenceKey(), "gesture_wake_screen");
- }
-
- @Override
- protected String getVideoPrefKey() {
- return PREF_KEY_VIDEO;
- }
-
- @Override
- public boolean isChecked() {
- return getAmbientConfig().wakeScreenGestureEnabled(mUserId);
- }
-
- @Override
- public boolean setChecked(boolean isChecked) {
- return Settings.Secure.putInt(mContext.getContentResolver(), DOZE_WAKE_SCREEN_GESTURE,
- isChecked ? ON : OFF);
- }
-
- private AmbientDisplayConfiguration getAmbientConfig() {
- if (mAmbientConfig == null) {
- mAmbientConfig = new AmbientDisplayConfiguration(mContext);
- }
-
- return mAmbientConfig;
- }
-
- @VisibleForTesting
- public void setConfig(AmbientDisplayConfiguration config) {
- mAmbientConfig = config;
- }
-}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
index 7df322d..92108f0 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardManager.java
@@ -43,6 +43,8 @@
import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.ArrayList;
import java.util.List;
@@ -98,7 +100,6 @@
mLifecycleObservers = new ArrayList<>();
mControllerRendererPool = new ControllerRendererPool();
mLifecycle.addObserver(this);
-
if (savedInstanceState == null) {
mIsFirstLaunch = true;
mSavedCards = null;
@@ -240,6 +241,21 @@
outState.putStringArrayList(KEY_CONTEXTUAL_CARDS, cards);
}
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ // Duplicate a list to avoid java.util.ConcurrentModificationException.
+ final List<ContextualCard> cards = new ArrayList<>(mContextualCards);
+ for (ContextualCard card : cards) {
+ final ContextualCardController controller = mControllerRendererPool
+ .getController(mContext, card.getCardType());
+ if (hasWindowFocus && controller instanceof OnStart) {
+ ((OnStart) controller).onStart();
+ }
+ if (!hasWindowFocus && controller instanceof OnStop) {
+ ((OnStop) controller).onStop();
+ }
+ }
+ }
+
public ControllerRendererPool getControllerRendererPool() {
return mControllerRendererPool;
}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
index 72ddb50..bd25866 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardsFragment.java
@@ -27,17 +27,17 @@
import androidx.loader.app.LoaderManager;
import androidx.recyclerview.widget.GridLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.android.settings.core.InstrumentedFragment;
import com.android.settings.overlay.FeatureFactory;
-public class ContextualCardsFragment extends InstrumentedFragment {
+public class ContextualCardsFragment extends InstrumentedFragment implements
+ FocusRecyclerView.FocusListener {
private static final String TAG = "ContextualCardsFragment";
- private RecyclerView mCardsContainer;
+ private FocusRecyclerView mCardsContainer;
private GridLayoutManager mLayoutManager;
private ContextualCardsAdapter mContextualCardsAdapter;
private ContextualCardManager mContextualCardManager;
@@ -72,11 +72,17 @@
this /* lifecycleOwner */, mContextualCardManager);
mCardsContainer.setAdapter(mContextualCardsAdapter);
mContextualCardManager.setListener(mContextualCardsAdapter);
+ mCardsContainer.setListener(this);
return rootView;
}
@Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ mContextualCardManager.onWindowFocusChanged(hasWindowFocus);
+ }
+
+ @Override
public int getMetricsCategory() {
return SettingsEnums.SETTINGS_HOMEPAGE;
}
diff --git a/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java b/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java
new file mode 100644
index 0000000..a2ec9af
--- /dev/null
+++ b/src/com/android/settings/homepage/contextualcards/FocusRecyclerView.java
@@ -0,0 +1,36 @@
+package com.android.settings.homepage.contextualcards;
+
+import android.content.Context;
+import android.util.AttributeSet;
+
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.RecyclerView;
+
+public class FocusRecyclerView extends RecyclerView {
+
+ private FocusListener mListener;
+
+ public FocusRecyclerView(Context context) {
+ super(context);
+ }
+
+ public FocusRecyclerView(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasWindowFocus) {
+ super.onWindowFocusChanged(hasWindowFocus);
+ if (mListener != null) {
+ mListener.onWindowFocusChanged(hasWindowFocus);
+ }
+ }
+
+ public void setListener(FocusListener listener) {
+ mListener = listener;
+ }
+
+ public interface FocusListener {
+ void onWindowFocusChanged(boolean hasWindowFocus);
+ }
+}
diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java
index 3187d10..3bdcb13 100644
--- a/src/com/android/settings/slices/SettingsSliceProvider.java
+++ b/src/com/android/settings/slices/SettingsSliceProvider.java
@@ -28,12 +28,12 @@
import android.provider.SettingsSlicesContract;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.VisibleForTesting;
+import androidx.collection.ArraySet;
import androidx.slice.Slice;
import androidx.slice.SliceProvider;
@@ -53,7 +53,6 @@
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
/**
* A {@link SliceProvider} for Settings to enabled inline results in system apps.
@@ -123,9 +122,6 @@
@VisibleForTesting
Map<Uri, SliceData> mSliceWeakDataCache;
- @VisibleForTesting
- Map<Uri, SliceData> mSliceDataCache;
-
final Map<Uri, SliceBackgroundWorker> mPinnedWorkers = new ArrayMap<>();
public SettingsSliceProvider() {
@@ -135,7 +131,6 @@
@Override
public boolean onCreateSliceProvider() {
mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(getContext());
- mSliceDataCache = new ConcurrentHashMap<>();
mSliceWeakDataCache = new WeakHashMap<>();
return true;
}
@@ -170,7 +165,6 @@
public void onSliceUnpinned(Uri sliceUri) {
SliceBroadcastRelay.unregisterReceivers(getContext(), sliceUri);
ThreadUtils.postOnMainThread(() -> stopBackgroundWorker(sliceUri));
- mSliceDataCache.remove(sliceUri);
}
@Override
@@ -226,7 +220,7 @@
}
// Remove the SliceData from the cache after it has been used to prevent a memory-leak.
- if (!mSliceDataCache.containsKey(sliceUri)) {
+ if (!getPinnedSlices().contains(sliceUri)) {
mSliceWeakDataCache.remove(sliceUri);
}
return SliceBuilderUtils.buildSlice(getContext(), cachedSliceData);
@@ -396,11 +390,6 @@
ThreadUtils.postOnMainThread(() -> startBackgroundWorker(controller, uri));
- final List<Uri> pinnedSlices = getContext().getSystemService(
- SliceManager.class).getPinnedSlices();
- if (pinnedSlices.contains(uri)) {
- mSliceDataCache.put(uri, sliceData);
- }
mSliceWeakDataCache.put(uri, sliceData);
getContext().getContentResolver().notifyChange(uri, null /* content observer */);
diff --git a/src/com/android/settings/widget/AppCheckBoxPreference.java b/src/com/android/settings/widget/AppCheckBoxPreference.java
index e56efd9..3ce67eb 100644
--- a/src/com/android/settings/widget/AppCheckBoxPreference.java
+++ b/src/com/android/settings/widget/AppCheckBoxPreference.java
@@ -21,7 +21,6 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
-import android.widget.TextView;
import androidx.preference.CheckBoxPreference;
import androidx.preference.PreferenceViewHolder;
@@ -46,11 +45,6 @@
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
- final TextView appendix = (TextView) holder.findViewById(R.id.appendix);
- if (appendix != null) {
- appendix.setVisibility(View.GONE);
- }
-
final LinearLayout layout = (LinearLayout) holder.findViewById(R.id.summary_container);
if (layout != null) {
// If summary doesn't exist, make it gone
diff --git a/src/com/android/settings/widget/AppSwitchPreference.java b/src/com/android/settings/widget/AppSwitchPreference.java
index 288096e..506ab76 100644
--- a/src/com/android/settings/widget/AppSwitchPreference.java
+++ b/src/com/android/settings/widget/AppSwitchPreference.java
@@ -17,10 +17,7 @@
package com.android.settings.widget;
import android.content.Context;
-import android.text.TextUtils;
-import android.view.View;
-import androidx.preference.PreferenceViewHolder;
import androidx.preference.SwitchPreference;
import com.android.settings.R;
@@ -31,12 +28,4 @@
super(context);
setLayoutResource(R.layout.preference_app);
}
-
- @Override
- public void onBindViewHolder(PreferenceViewHolder view) {
- super.onBindViewHolder(view);
-
- view.findViewById(R.id.summary_container)
- .setVisibility(TextUtils.isEmpty(getSummary()) ? View.GONE : View.VISIBLE);
- }
}
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
index b8d0f20..c3ae904 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ApplicationViewHolderTest.java
@@ -46,7 +46,7 @@
public void seUp() {
mContext = RuntimeEnvironment.application;
mView = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(mView);
}
@Test
@@ -67,10 +67,6 @@
mHolder.setSummary(R.string.disabled);
assertThat(mHolder.mSummary.getText()).isEqualTo(mContext.getText(R.string.disabled));
- assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.VISIBLE);
-
- mHolder.setSummary(null);
- assertThat(mHolder.mSummaryContainer.getVisibility()).isEqualTo(View.GONE);
}
@Test
@@ -104,7 +100,7 @@
@Test
public void twoTouchTarget() {
mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true);
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(mView);
assertThat(mHolder.mSwitch).isNotNull();
assertThat(mHolder.mWidgetContainer.getChildCount()).isEqualTo(1);
}
@@ -112,8 +108,9 @@
@Test
public void updateSwitch() {
mView = ApplicationViewHolder.newView(new FrameLayout(mContext), true);
- mHolder = new ApplicationViewHolder(mView, false /* useStableHeight */);
- mHolder.updateSwitch(v -> {}, true, true);
+ mHolder = new ApplicationViewHolder(mView);
+ mHolder.updateSwitch(v -> {
+ } /* listener */, true, true);
assertThat(mHolder.mSwitch.isChecked()).isTrue();
assertThat(mHolder.mSwitch.isEnabled()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index 419fc49..27c3e7d 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -235,16 +235,6 @@
}
@Test
- public void shouldUseStableItemHeight() {
- assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
- LIST_TYPE_MAIN))
- .isTrue();
- assertThat(ManageApplications.ApplicationsAdapter.shouldUseStableItemHeight(
- LIST_TYPE_NOTIFICATION))
- .isTrue();
- }
-
- @Test
public void onRebuildComplete_shouldHideLoadingView() {
final Context context = RuntimeEnvironment.application;
final RecyclerView recyclerView = mock(RecyclerView.class);
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
index 8f5b0ab..74fb98f 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/MusicViewHolderControllerTest.java
@@ -64,7 +64,7 @@
mController = new MusicViewHolderController(mContext, mSource, fsUuid, new UserHandle(0));
View view = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(view, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(view);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
index c453474..5475b9c 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/PhotosViewHolderControllerTest.java
@@ -63,7 +63,7 @@
mController = new PhotosViewHolderController(mContext, mSource, fsUuid, new UserHandle(0));
final View view = ApplicationViewHolder.newView(new FrameLayout(mContext));
- mHolder = new ApplicationViewHolder(view, false /* useStableHeight */);
+ mHolder = new ApplicationViewHolder(view);
}
@Test
@@ -71,19 +71,19 @@
mController.setupView(mHolder);
assertThat(mHolder.mSummary.getText().toString())
- .isEqualTo(Formatter.formatFileSize(mContext, 0));
+ .isEqualTo(Formatter.formatFileSize(mContext, 0));
}
@Test
public void storageShouldRepresentStorageStatsQuery() throws Exception {
when(mSource.getExternalStorageStats(nullable(String.class), nullable(UserHandle.class)))
- .thenReturn(new StorageStatsSource.ExternalStorageStats(1, 0, 1, 10, 0));
+ .thenReturn(new StorageStatsSource.ExternalStorageStats(1, 0, 1, 10, 0));
mController.queryStats();
mController.setupView(mHolder);
assertThat(mHolder.mSummary.getText().toString())
- .isEqualTo(Formatter.formatFileSize(mContext, 11));
+ .isEqualTo(Formatter.formatFileSize(mContext, 11));
}
@Test
diff --git a/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java
deleted file mode 100644
index 471914a..0000000
--- a/tests/robotests/src/com/android/settings/gestures/WakeScreenGesturePreferenceControllerTest.java
+++ /dev/null
@@ -1,130 +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.gestures;
-
-import static com.android.settings.core.BasePreferenceController.AVAILABLE;
-import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
-import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.hardware.display.AmbientDisplayConfiguration;
-
-import com.android.settings.aware.AwareFeatureProvider;
-import com.android.settings.testutils.FakeFeatureFactory;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-
-@RunWith(RobolectricTestRunner.class)
-public class WakeScreenGesturePreferenceControllerTest {
-
- private static final String KEY_WAKE_SCREEN = "gesture_wake_screen";
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Context mContext;
- @Mock
- private AmbientDisplayConfiguration mAmbientDisplayConfiguration;
- private WakeScreenGesturePreferenceController mController;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- AwareFeatureProvider featureProvider =
- FakeFeatureFactory.setupForTest().getAwareFeatureProvider();
- when(featureProvider.isSupported(any())).thenReturn(true);
- when(featureProvider.isEnabled(any())).thenReturn(true);
- mController = new WakeScreenGesturePreferenceController(mContext, KEY_WAKE_SCREEN);
- mController.setConfig(mAmbientDisplayConfiguration);
- }
-
- @Test
- public void testIsChecked_configIsSet_shouldReturnTrue() {
- // Set the setting to be enabled.
- when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(true);
- assertThat(mController.isChecked()).isTrue();
- }
-
- @Test
- public void testIsChecked_configIsNotSet_shouldReturnFalse() {
- // Set the setting to be disabled.
- when(mAmbientDisplayConfiguration.wakeScreenGestureEnabled(anyInt())).thenReturn(false);
- assertThat(mController.isChecked()).isFalse();
- }
-
- @Test
- public void getAvailabilityStatus_gestureNotSupported_UNSUPPORTED_ON_DEVICE() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(false);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(UNSUPPORTED_ON_DEVICE);
- }
-
- @Test
- public void getAvailabilityStatus_gestureSupported_AVAILABLE() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(true);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(AVAILABLE);
- }
-
- @Test
- public void getAvailabilityStatus_gestureSupported_DISABLED_DEPENDENT_SETTING() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
- when(mAmbientDisplayConfiguration.wakeScreenGestureAvailable()).thenReturn(true);
- final int availabilityStatus = mController.getAvailabilityStatus();
-
- assertThat(availabilityStatus).isEqualTo(DISABLED_DEPENDENT_SETTING);
- }
-
- @Test
- public void canHandleClicks_onlyWhenAlwaysOn() {
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(false);
- assertThat(mController.canHandleClicks()).isEqualTo(false);
-
- reset(mAmbientDisplayConfiguration);
- when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
- assertThat(mController.canHandleClicks()).isEqualTo(true);
- }
-
- @Test
- public void isSliceableCorrectKey_returnsTrue() {
- final WakeScreenGesturePreferenceController controller =
- new WakeScreenGesturePreferenceController(mContext, "gesture_wake_screen");
- assertThat(controller.isSliceable()).isTrue();
- }
-
- @Test
- public void isSliceableIncorrectKey_returnsFalse() {
- final WakeScreenGesturePreferenceController controller =
- new WakeScreenGesturePreferenceController(mContext, "bad_key");
- assertThat(controller.isSliceable()).isFalse();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
index 23025b2..005ffbe 100644
--- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
+++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java
@@ -133,7 +133,6 @@
mProvider = spy(new SettingsSliceProvider());
ShadowStrictMode.reset();
mProvider.mSliceWeakDataCache = new HashMap<>();
- mProvider.mSliceDataCache = new HashMap<>();
mProvider.mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(mContext);
when(mProvider.getContext()).thenReturn(mContext);
@@ -198,30 +197,6 @@
}
@Test
- public void testLoadSlice_doesNotCacheWithoutPin() {
- insertSpecialCase(KEY);
- final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false);
-
- mProvider.loadSlice(uri);
- SliceData data = mProvider.mSliceDataCache.get(uri);
-
- assertThat(data).isNull();
- }
-
- @Test
- public void testLoadSlice_cachesWithPin() {
- insertSpecialCase(KEY);
- final Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false);
- when(mManager.getPinnedSlices()).thenReturn(Arrays.asList(uri));
-
- mProvider.loadSlice(uri);
- SliceData data = mProvider.mSliceDataCache.get(uri);
-
- assertThat(data.getKey()).isEqualTo(KEY);
- assertThat(data.getTitle()).isEqualTo(TITLE);
- }
-
- @Test
public void testLoadSlice_cachedEntryRemovedOnBuild() {
SliceData data = getDummyData();
mProvider.mSliceWeakDataCache.put(data.getUri(), data);
@@ -277,18 +252,6 @@
}
@Test
- public void testLoadSlice_cachedEntryRemovedOnUnpin() {
- SliceData data = getDummyData();
- mProvider.mSliceDataCache.put(data.getUri(), data);
- mProvider.onSliceUnpinned(data.getUri());
- insertSpecialCase(data.getKey());
-
- SliceData cachedData = mProvider.mSliceWeakDataCache.get(data.getUri());
-
- assertThat(cachedData).isNull();
- }
-
- @Test
public void getDescendantUris_fullActionUri_returnsSelf() {
final Uri uri = SliceBuilderUtils.getUri(
SettingsSlicesContract.PATH_SETTING_ACTION + "/key", true);