summaryrefslogtreecommitdiff
path: root/Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java')
-rw-r--r--Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java215
1 files changed, 215 insertions, 0 deletions
diff --git a/Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java b/Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java
new file mode 100644
index 000000000..18265cde6
--- /dev/null
+++ b/Settings/src/com/android/tv/settings/device/eco/EnergyModesContentProvider.java
@@ -0,0 +1,215 @@
+/*
+ * 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.
+ */
+
+package com.android.tv.settings.device.eco;
+
+import static android.Manifest.permission.MANAGE_LOW_POWER_STANDBY;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.graphics.drawable.Icon;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.tv.settings.device.eco.EnergyModesHelper.EnergyMode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ContentProvider that provides methods to query and set Energy Modes.
+ */
+public class EnergyModesContentProvider extends ContentProvider {
+ /** Method to get available energy modes, default mode, and selected mode */
+ private static final String METHOD_GET_ENERGY_MODES = "getEnergyModes";
+
+ /**
+ * Method to set the selected energy mode.
+ * Requires permission MANAGE_LOW_POWER_STANDBY.
+ */
+ private static final String METHOD_SET_ENERGY_MODE = "setEnergyMode";
+
+ /** Key for a String representing the identifier of the default mode (may be null). */
+ private static final String KEY_DEFAULT_MODE = "default_mode";
+
+ /** Key for a String representing the currently selected mode. */
+ private static final String KEY_SELECTED_MODE = "selected_mode";
+
+ /** Key for a List of Bundle representing the available energy modes. */
+ private static final String KEY_ENERGY_MODES = "energy_modes";
+
+ /** Key for a String representing the identifier for an energy mode. */
+ private static final String KEY_IDENTIFIER = "identifier";
+
+ /** Key for an Icon representing the icon of an energy mode. */
+ private static final String KEY_ICON = "icon";
+
+ /** Key for an int representing the color of an energy mode (in ARGB). */
+ private static final String KEY_COLOR = "color";
+
+ /** Key for a String representing the title of an energy mode. */
+ private static final String KEY_TITLE = "title";
+
+ /** Key for a String representing the subtitle of an energy mode. */
+ private static final String KEY_SUBTITLE = "subtitle";
+
+ /** Key for a String representing the description of an energy mode. */
+ private static final String KEY_DESCRIPTION = "description";
+
+ /** Key for a String representing a short description of an energy mode. */
+ private static final String KEY_SHORT_DESCRIPTION = "short_description";
+
+ /** Key for a String array representing the (human-friendly) features of an energy mode. */
+ private static final String KEY_FEATURES_LIST = "features_list";
+
+ /** Key for a String array representing the features of an energy mode. */
+ private static final String KEY_FEATURES = "features";
+
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+
+ @Nullable
+ @Override
+ public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
+ @Nullable String[] selectionArgs, @Nullable String sortOrder) {
+ throw new UnsupportedOperationException("query operation not supported currently.");
+ }
+
+ @Nullable
+ @Override
+ public String getType(@NonNull Uri uri) {
+ throw new UnsupportedOperationException("getType operation not supported currently.");
+ }
+
+ @Nullable
+ @Override
+ public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
+ throw new UnsupportedOperationException("insert operation not supported currently.");
+ }
+
+ @Override
+ public int delete(@NonNull Uri uri, @Nullable String selection,
+ @Nullable String[] selectionArgs) {
+ throw new UnsupportedOperationException("delete operation not supported currently.");
+ }
+
+ @Override
+ public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection,
+ @Nullable String[] selectionArgs) {
+ throw new UnsupportedOperationException("update operation not supported currently.");
+ }
+
+ @Override
+ public Bundle call(String method, String arg, Bundle extras) {
+ if (METHOD_GET_ENERGY_MODES.equals(method)) {
+ return getEnergyModesFromBinder();
+ } else if (METHOD_SET_ENERGY_MODE.equals(method)) {
+ return setEnergyModeFromBinder(arg);
+ }
+
+ throw new IllegalArgumentException("Unknown method name");
+ }
+
+ private Bundle getEnergyModesFromBinder() {
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ return getEnergyModes();
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ private Bundle getEnergyModes() {
+ EnergyModesHelper energyModesHelper = new EnergyModesHelper(getContext());
+
+ final EnergyMode defaultMode = energyModesHelper.getDefaultEnergyMode();
+ final EnergyMode currentMode = energyModesHelper.updateEnergyMode();
+
+ Bundle bundle = new Bundle();
+ bundle.putString(KEY_DEFAULT_MODE, getModeIdentifier(defaultMode));
+ bundle.putString(KEY_SELECTED_MODE, getModeIdentifier(currentMode));
+ bundle.putParcelableList(KEY_ENERGY_MODES, getModes(energyModesHelper));
+ return bundle;
+ }
+
+ private Bundle setEnergyModeFromBinder(String identifier) {
+ getContext().enforceCallingOrSelfPermission(MANAGE_LOW_POWER_STANDBY, null);
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ EnergyModesHelper energyModesHelper = new EnergyModesHelper(getContext());
+ EnergyMode energyMode = energyModesHelper.getEnergyMode(/* identifier= */ identifier);
+ if (energyMode == null) {
+ throw new IllegalArgumentException("Unknown energy mode: " + identifier);
+ }
+
+ energyModesHelper.setEnergyMode(energyMode);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+
+ return null;
+ }
+
+ @Nullable
+ private String getModeIdentifier(@Nullable EnergyMode mode) {
+ if (mode == null) {
+ return null;
+ }
+
+ return getContext().getString(mode.identifierRes);
+ }
+
+ @NonNull
+ private List<Bundle> getModes(@NonNull EnergyModesHelper helper) {
+ final List<Bundle> result = new ArrayList<>();
+ final List<EnergyMode> energyModes = helper.getEnergyModes();
+
+ for (EnergyMode mode : energyModes) {
+ result.add(convertEnergyModeToBundle(helper, mode));
+ }
+
+ return result;
+ }
+
+ @NonNull
+ private Bundle convertEnergyModeToBundle(
+ @NonNull EnergyModesHelper helper, @NonNull EnergyMode mode) {
+ Context context = getContext();
+ Bundle bundle = new Bundle();
+
+ bundle.putString(KEY_IDENTIFIER, getModeIdentifier(mode));
+ bundle.putParcelable(KEY_ICON, Icon.createWithResource(context, mode.iconRes));
+ bundle.putInt(KEY_COLOR, context.getColor(mode.colorRes));
+ bundle.putString(KEY_TITLE, context.getString(mode.titleRes));
+ bundle.putString(KEY_SUBTITLE, context.getString(mode.subtitleRes));
+ bundle.putString(KEY_DESCRIPTION, context.getString(mode.infoTextRes));
+ bundle.putString(KEY_SHORT_DESCRIPTION, context.getString(mode.infoTextRes));
+ bundle.putStringArray(KEY_FEATURES_LIST,
+ context.getResources().getStringArray(mode.featuresRes));
+ bundle.putStringArray(KEY_FEATURES,
+ helper.getAllowedFeatures(mode).toArray(new String[0]));
+
+ return bundle;
+ }
+}