From b7413bbcc7af97cdcf2be757a8c584ad8da55853 Mon Sep 17 00:00:00 2001 From: shivatejapeddi Date: Thu, 14 Nov 2019 11:20:56 +0000 Subject: [PATCH] Settings: Move Notch Cutout to Display Signed-off-by: minaripenguin --- res/xml/development_settings.xml | 5 - res/xml/display_settings.xml | 5 + src/com/android/settings/DisplaySettings.java | 2 + .../DevelopmentSettingsDashboardFragment.java | 1 - ...lateDisplayCutoutPreferenceController.java | 2 +- .../OverlayCategoryPreferenceController.java | 198 ++++++++++++++++++ 6 files changed, 206 insertions(+), 7 deletions(-) rename src/com/android/settings/{development => display}/EmulateDisplayCutoutPreferenceController.java (97%) create mode 100644 src/com/android/settings/display/OverlayCategoryPreferenceController.java diff --git a/res/xml/development_settings.xml b/res/xml/development_settings.xml index 370de7aec61..05a16315641 100644 --- a/res/xml/development_settings.xml +++ b/res/xml/development_settings.xml @@ -583,11 +583,6 @@ android:key="density" android:title="@string/developer_smallest_width" /> - - + + diff --git a/src/com/android/settings/DisplaySettings.java b/src/com/android/settings/DisplaySettings.java index 262c13ad946..a45ec4d871d 100644 --- a/src/com/android/settings/DisplaySettings.java +++ b/src/com/android/settings/DisplaySettings.java @@ -33,6 +33,7 @@ import com.android.settings.display.TapToWakePreferenceController; import com.android.settings.display.EnableBlursPreferenceController; import com.android.settings.display.ThemePreferenceController; import com.android.settings.display.VrDisplayPreferenceController; +import com.android.settings.display.EmulateDisplayCutoutPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -91,6 +92,7 @@ public class DisplaySettings extends DashboardFragment { controllers.add(new VrDisplayPreferenceController(context)); controllers.add(new ShowOperatorNamePreferenceController(context)); controllers.add(new ThemePreferenceController(context)); + controllers.add(new EmulateDisplayCutoutPreferenceController(context)); controllers.add(new BrightnessLevelPreferenceController(context, lifecycle)); return controllers; } diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java index 9dccede198d..c4fcd4298d0 100644 --- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java +++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java @@ -784,7 +784,6 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra controllers.add(new ShowRefreshRatePreferenceController(context)); controllers.add(new RtlLayoutPreferenceController(context)); controllers.add(new WindowAnimationScalePreferenceController(context)); - controllers.add(new EmulateDisplayCutoutPreferenceController(context)); controllers.add(new TransparentNavigationBarPreferenceController(context)); controllers.add(new TransitionAnimationScalePreferenceController(context)); controllers.add(new AnimatorDurationScalePreferenceController(context)); diff --git a/src/com/android/settings/development/EmulateDisplayCutoutPreferenceController.java b/src/com/android/settings/display/EmulateDisplayCutoutPreferenceController.java similarity index 97% rename from src/com/android/settings/development/EmulateDisplayCutoutPreferenceController.java rename to src/com/android/settings/display/EmulateDisplayCutoutPreferenceController.java index ef88baa134b..99c64627696 100644 --- a/src/com/android/settings/development/EmulateDisplayCutoutPreferenceController.java +++ b/src/com/android/settings/display/EmulateDisplayCutoutPreferenceController.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings.development; +package com.android.settings.display; import android.content.Context; import android.content.om.IOverlayManager; diff --git a/src/com/android/settings/display/OverlayCategoryPreferenceController.java b/src/com/android/settings/display/OverlayCategoryPreferenceController.java new file mode 100644 index 00000000000..9d22a8e65d3 --- /dev/null +++ b/src/com/android/settings/display/OverlayCategoryPreferenceController.java @@ -0,0 +1,198 @@ +/* + * 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.display; + +import static android.os.UserHandle.USER_SYSTEM; + +import android.content.Context; +import android.content.om.IOverlayManager; +import android.content.om.OverlayInfo; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Toast; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settings.core.PreferenceControllerMixin; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +/** + * Preference controller to allow users to choose an overlay from a list for a given category. + * The chosen overlay is enabled exclusively within its category. A default option is also + * exposed that disables all overlays in the given category. + */ +public class OverlayCategoryPreferenceController extends AbstractPreferenceController + implements Preference.OnPreferenceChangeListener, PreferenceControllerMixin { + private static final String TAG = "OverlayCategoryPC"; + @VisibleForTesting + static final String PACKAGE_DEVICE_DEFAULT = "package_device_default"; + private static final String OVERLAY_TARGET_PACKAGE = "android"; + private static final Comparator OVERLAY_INFO_COMPARATOR = + Comparator.comparing(OverlayInfo::getPackageName); + private final IOverlayManager mOverlayManager; + private final boolean mAvailable; + private final String mCategory; + private final PackageManager mPackageManager; + + private ListPreference mPreference; + + @VisibleForTesting + OverlayCategoryPreferenceController(Context context, PackageManager packageManager, + IOverlayManager overlayManager, String category) { + super(context); + mOverlayManager = overlayManager; + mPackageManager = packageManager; + mCategory = category; + mAvailable = overlayManager != null && !getOverlayInfos().isEmpty(); + } + + public OverlayCategoryPreferenceController(Context context, String category) { + this(context, context.getPackageManager(), IOverlayManager.Stub + .asInterface(ServiceManager.getService(Context.OVERLAY_SERVICE)), category); + } + + @Override + public boolean isAvailable() { + return mAvailable; + } + + @Override + public String getPreferenceKey() { + return mCategory; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + setPreference(screen.findPreference(getPreferenceKey())); + } + + @VisibleForTesting + void setPreference(ListPreference preference) { + mPreference = preference; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return setOverlay((String) newValue); + } + + private boolean setOverlay(String packageName) { + final String currentPackageName = getOverlayInfos().stream() + .filter(info -> info.isEnabled()) + .map(info -> info.packageName) + .findFirst() + .orElse(null); + + if (PACKAGE_DEVICE_DEFAULT.equals(packageName) && TextUtils.isEmpty(currentPackageName) + || TextUtils.equals(packageName, currentPackageName)) { + // Already set. + return true; + } + + new AsyncTask() { + @Override + protected Boolean doInBackground(Void... params) { + try { + if (PACKAGE_DEVICE_DEFAULT.equals(packageName)) { + return mOverlayManager.setEnabled(currentPackageName, false, USER_SYSTEM); + } else { + return mOverlayManager.setEnabledExclusiveInCategory(packageName, + USER_SYSTEM); + } + } catch (RemoteException re) { + Log.w(TAG, "Error enabling overlay.", re); + return false; + } + } + + @Override + protected void onPostExecute(Boolean success) { + updateState(mPreference); + if (!success) { + Toast.makeText( + mContext, R.string.overlay_toast_failed_to_apply, Toast.LENGTH_LONG) + .show(); + } + } + }.execute(); + + return true; // Assume success; toast on failure. + } + + @Override + public void updateState(Preference preference) { + final List pkgs = new ArrayList<>(); + final List labels = new ArrayList<>(); + + String selectedPkg = PACKAGE_DEVICE_DEFAULT; + String selectedLabel = mContext.getString(R.string.overlay_option_device_default); + + // Add the default package / label before all of the overlays + pkgs.add(selectedPkg); + labels.add(selectedLabel); + + for (OverlayInfo overlayInfo : getOverlayInfos()) { + pkgs.add(overlayInfo.packageName); + try { + labels.add(mPackageManager.getApplicationInfo(overlayInfo.packageName, 0) + .loadLabel(mPackageManager).toString()); + } catch (PackageManager.NameNotFoundException e) { + labels.add(overlayInfo.packageName); + } + if (overlayInfo.isEnabled()) { + selectedPkg = pkgs.get(pkgs.size() - 1); + selectedLabel = labels.get(labels.size() - 1); + } + } + + mPreference.setEntries(labels.toArray(new String[labels.size()])); + mPreference.setEntryValues(pkgs.toArray(new String[pkgs.size()])); + mPreference.setValue(selectedPkg); + mPreference.setSummary(selectedLabel); + } + + private List getOverlayInfos() { + final List filteredInfos = new ArrayList<>(); + try { + List overlayInfos = mOverlayManager + .getOverlayInfosForTarget(OVERLAY_TARGET_PACKAGE, USER_SYSTEM); + for (OverlayInfo overlayInfo : overlayInfos) { + if (mCategory.equals(overlayInfo.category)) { + filteredInfos.add(overlayInfo); + } + } + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + filteredInfos.sort(OVERLAY_INFO_COMPARATOR); + return filteredInfos; + } + +}