blob: 2de2356d57cb185959fc490997248d62bf6e0447 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chromecast.base;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
import org.chromium.base.Log;
/**
* Manager for Cast settings.
*/
public final class CastSettingsManager {
private static final String TAG = "cr_CastSettingsManager";
private static final String PREFS_FILE_NAME = "CastSettings";
/** Key for the "send usage stats" boolean setting. */
private static final String SEND_USAGE_STATS_SETTING = "developer_support";
/** The default value for the "send usage stats" setting. */
private static final boolean SEND_USAGE_STATS_SETTING_DEFAULT = true;
/** The default device name, which is the model name. */
private static final String DEFAULT_DEVICE_NAME = Build.MODEL;
// TODO(gunsch): Switch to Settings.Global.DEVICE_NAME once it's in public SDK.
// private static final String DEVICE_NAME_SETTING_KEY = Settings.Global.DEVICE_NAME;
private static final String DEVICE_NAME_SETTING_KEY = "device_name";
private static final String DEVICE_PROVISIONED_SETTING_KEY = Settings.Global.DEVICE_PROVISIONED;
private final ContentResolver mContentResolver;
private final SharedPreferences mSettings;
private SharedPreferences.OnSharedPreferenceChangeListener mSharedPreferenceListener;
private ContentObserver mDeviceNameObserver;
private ContentObserver mIsDeviceProvisionedObserver;
/**
* Can be implemented to receive notifications from a CastSettingsManager instance when
* settings have changed.
*/
public static class OnSettingChangedListener {
public void onCastEnabledChanged(boolean enabled) {}
public void onSendUsageStatsChanged(boolean enabled) {}
public void onDeviceNameChanged(String deviceName) {}
}
private OnSettingChangedListener mListener;
/**
* Creates a fully-featured CastSettingsManager instance. Will fail if called from a
* sandboxed process.
*/
public static CastSettingsManager createCastSettingsManager(
Context context, OnSettingChangedListener listener) {
ContentResolver contentResolver = context.getContentResolver();
SharedPreferences settings = context.getSharedPreferences(PREFS_FILE_NAME, 0);
return new CastSettingsManager(contentResolver, listener, settings);
}
@SuppressLint("NewApi")
private CastSettingsManager(
ContentResolver contentResolver,
OnSettingChangedListener listener,
SharedPreferences settings) {
mContentResolver = contentResolver;
mSettings = settings;
mListener = listener;
mSharedPreferenceListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (mListener == null) {
return;
}
if (key.equals(SEND_USAGE_STATS_SETTING)) {
mListener.onSendUsageStatsChanged(prefs.getBoolean(key,
SEND_USAGE_STATS_SETTING_DEFAULT));
}
}
};
mSettings.registerOnSharedPreferenceChangeListener(mSharedPreferenceListener);
mDeviceNameObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
mListener.onDeviceNameChanged(getDeviceName());
}
};
// TODO(crbug.com/635567): Fix lint properly.
mContentResolver.registerContentObserver(
Settings.Global.getUriFor(DEVICE_NAME_SETTING_KEY), true, mDeviceNameObserver);
if (!isCastEnabled()) {
mIsDeviceProvisionedObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.d(TAG, "Device provisioned");
mListener.onCastEnabledChanged(isCastEnabled());
}
};
// TODO(crbug.com/635567): Fix lint properly.
mContentResolver.registerContentObserver(
Settings.Global.getUriFor(DEVICE_PROVISIONED_SETTING_KEY), true,
mIsDeviceProvisionedObserver);
}
}
public void dispose() {
mSettings.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceListener);
mSharedPreferenceListener = null;
mContentResolver.unregisterContentObserver(mDeviceNameObserver);
mDeviceNameObserver = null;
if (mIsDeviceProvisionedObserver != null) {
mContentResolver.unregisterContentObserver(mIsDeviceProvisionedObserver);
mIsDeviceProvisionedObserver = null;
}
}
@SuppressLint("NewApi")
public boolean isCastEnabled() {
// However, Cast is disabled until the device is provisioned (see b/18950240).
// TODO(crbug.com/635567): Fix lint properly.
return Settings.Global.getInt(
mContentResolver, DEVICE_PROVISIONED_SETTING_KEY, 0) == 1;
}
public boolean isSendUsageStatsEnabled() {
return mSettings.getBoolean(SEND_USAGE_STATS_SETTING, SEND_USAGE_STATS_SETTING_DEFAULT);
}
public void setSendUsageStatsEnabled(boolean enabled) {
mSettings.edit().putBoolean(SEND_USAGE_STATS_SETTING, enabled).apply();
}
@SuppressLint("NewApi")
public String getDeviceName() {
// TODO(crbug.com/635567): Fix lint properly.
String deviceName = Settings.Global.getString(mContentResolver, DEVICE_NAME_SETTING_KEY);
return (deviceName != null) ? deviceName : DEFAULT_DEVICE_NAME;
}
}