blob: 82beda66c35934dcbd8484e959325b365b8e0250 [file] [log] [blame]
/*
* Copyright (C) 2015 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.display.daydream;
import static android.provider.Settings.Secure.SLEEP_TIMEOUT;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.provider.Settings;
import androidx.preference.ListPreference;
import androidx.preference.Preference;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settingslib.dream.DreamBackend;
import com.android.tv.settings.R;
import com.android.tv.settings.SettingsPreferenceFragment;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* The screen saver screen in TV settings.
*/
public class DaydreamFragment extends SettingsPreferenceFragment
implements Preference.OnPreferenceChangeListener {
private static final String TAG = "DaydreamFragment";
private static final String KEY_ACTIVE_DREAM = "activeDream";
private static final String KEY_DREAM_TIME = "dreamTime";
private static final String KEY_SLEEP_TIME = "sleepTime";
private static final String KEY_DREAM_NOW = "dreamNow";
private static final String DREAM_COMPONENT_NONE = "NONE";
private static final String PACKAGE_SCHEME = "package";
private static final int DEFAULT_DREAM_TIME_MS = (int) (30 * DateUtils.MINUTE_IN_MILLIS);
private static final int DEFAULT_SLEEP_TIME_MS = (int) (3 * DateUtils.HOUR_IN_MILLIS);
private final PackageReceiver mPackageReceiver = new PackageReceiver();
private DreamBackend mBackend;
private final Map<String, DreamBackend.DreamInfo> mDreamInfos = new ArrayMap<>();
public static DaydreamFragment newInstance() {
return new DaydreamFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
mBackend = new DreamBackend(getActivity());
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
refreshFromBackend();
// listen for package changes
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_ADDED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addDataScheme(PACKAGE_SCHEME);
getActivity().registerReceiver(mPackageReceiver, filter);
}
@Override
public void onPause() {
super.onPause();
getActivity().unregisterReceiver(mPackageReceiver);
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.daydream, null);
final ListPreference activeDreamPref = (ListPreference) findPreference(KEY_ACTIVE_DREAM);
refreshActiveDreamPref(activeDreamPref);
activeDreamPref.setOnPreferenceChangeListener(this);
final ListPreference dreamTimePref = (ListPreference) findPreference(KEY_DREAM_TIME);
dreamTimePref.setValue(Integer.toString(getDreamTime()));
dreamTimePref.setOnPreferenceChangeListener(this);
final ListPreference sleepTimePref = (ListPreference) findPreference(KEY_SLEEP_TIME);
sleepTimePref.setValue(Integer.toString(getSleepTime()));
sleepTimePref.setOnPreferenceChangeListener(this);
final Preference dreamNowPref = findPreference(KEY_DREAM_NOW);
dreamNowPref.setEnabled(mBackend.isEnabled());
}
private void refreshActiveDreamPref(ListPreference activeDreamPref) {
final List<DreamBackend.DreamInfo> infos = mBackend.getDreamInfos();
final CharSequence[] dreamEntries = new CharSequence[infos.size() + 1];
final CharSequence[] dreamEntryValues = new CharSequence[infos.size() + 1];
refreshDreamInfoMap(infos, dreamEntries, dreamEntryValues);
activeDreamPref.setEntries(dreamEntries);
activeDreamPref.setEntryValues(dreamEntryValues);
final ComponentName currentDreamComponent = mBackend.getActiveDream();
activeDreamPref.setValue(mBackend.isEnabled() && currentDreamComponent != null
? currentDreamComponent.toShortString() : DREAM_COMPONENT_NONE);
}
private void refreshDreamInfoMap(List<DreamBackend.DreamInfo> infos,
CharSequence[] listEntries, CharSequence[] listEntryValues) {
mDreamInfos.clear();
listEntries[0] = getString(R.string.device_daydreams_none);
listEntryValues[0] = DREAM_COMPONENT_NONE;
int index = 1;
for (final DreamBackend.DreamInfo info : infos) {
final String componentNameString = info.componentName.toShortString();
mDreamInfos.put(componentNameString, info);
listEntries[index] = info.caption;
listEntryValues[index] = componentNameString;
index++;
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
switch (preference.getKey()) {
case KEY_ACTIVE_DREAM:
setActiveDream((String) newValue);
break;
case KEY_DREAM_TIME:
setDreamTime(Integer.parseInt((String) newValue));
break;
case KEY_SLEEP_TIME:
setSleepTime(Integer.parseInt((String) newValue));
break;
}
return true;
}
private void setActiveDream(String componentNameString) {
final DreamBackend.DreamInfo dreamInfo = mDreamInfos.get(componentNameString);
if (dreamInfo != null) {
if (dreamInfo.settingsComponentName != null) {
startActivity(new Intent().setComponent(dreamInfo.settingsComponentName));
}
if (!mBackend.isEnabled()) {
mBackend.setEnabled(true);
}
if (!Objects.equals(mBackend.getActiveDream(), dreamInfo.componentName)) {
mBackend.setActiveDream(dreamInfo.componentName);
}
} else {
if (mBackend.isEnabled()) {
mBackend.setActiveDream(null);
mBackend.setEnabled(false);
}
}
}
private int getDreamTime() {
return Settings.System.getInt(getActivity().getContentResolver(), SCREEN_OFF_TIMEOUT,
DEFAULT_DREAM_TIME_MS);
}
private void setDreamTime(int ms) {
Settings.System.putInt(getActivity().getContentResolver(), SCREEN_OFF_TIMEOUT, ms);
}
private int getSleepTime() {
return Settings.Secure.getInt(getActivity().getContentResolver(), SLEEP_TIMEOUT,
DEFAULT_SLEEP_TIME_MS);
}
private void setSleepTime(int ms) {
Settings.Secure.putInt(getActivity().getContentResolver(), SLEEP_TIMEOUT, ms);
}
@Override
public boolean onPreferenceTreeClick(Preference preference) {
switch (preference.getKey()) {
case KEY_DREAM_NOW:
mBackend.startDreaming();
return true;
default:
return super.onPreferenceTreeClick(preference);
}
}
private void refreshFromBackend() {
if (getActivity() == null) {
Log.d(TAG, "No activity, not refreshing");
return;
}
final ListPreference activeDreamPref = (ListPreference) findPreference(KEY_ACTIVE_DREAM);
if (activeDreamPref != null) {
refreshActiveDreamPref(activeDreamPref);
}
final ListPreference dreamTimePref = (ListPreference) findPreference(KEY_DREAM_TIME);
if (dreamTimePref != null) {
dreamTimePref.setValue(Integer.toString(getDreamTime()));
}
final ListPreference sleepTimePref = (ListPreference) findPreference(KEY_SLEEP_TIME);
if (sleepTimePref != null) {
sleepTimePref.setValue(Integer.toString(getSleepTime()));
}
final Preference dreamNowPref = findPreference(KEY_DREAM_NOW);
if (dreamNowPref != null) {
dreamNowPref.setEnabled(mBackend.isEnabled());
}
}
@Override
public int getMetricsCategory() {
return MetricsProto.MetricsEvent.DREAM;
}
private class PackageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
refreshFromBackend();
}
}
}