/* * Copyright (C) 2012 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; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceViewHolder; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.RadioButton; import android.widget.Switch; import android.widget.TextView; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.settings.widget.SwitchBar; import com.android.settingslib.dream.DreamBackend; import com.android.settingslib.dream.DreamBackend.DreamInfo; import java.util.List; public class DreamSettings extends SettingsPreferenceFragment implements SwitchBar.OnSwitchChangeListener { private static final String TAG = DreamSettings.class.getSimpleName(); static final boolean DEBUG = false; private static final int DIALOG_WHEN_TO_DREAM = 1; private static final String PACKAGE_SCHEME = "package"; private final PackageReceiver mPackageReceiver = new PackageReceiver(); private Context mContext; private DreamBackend mBackend; private SwitchBar mSwitchBar; private MenuItem[] mMenuItemsWhenEnabled; private boolean mRefreshing; @Override public int getHelpResource() { return R.string.help_url_dreams; } @Override public void onAttach(Activity activity) { logd("onAttach(%s)", activity.getClass().getSimpleName()); super.onAttach(activity); mContext = activity; } @Override protected int getMetricsCategory() { return MetricsEvent.DREAM; } @Override public void onCreate(Bundle icicle) { logd("onCreate(%s)", icicle); super.onCreate(icicle); mBackend = new DreamBackend(getActivity()); setHasOptionsMenu(true); } @Override public void onSwitchChanged(Switch switchView, boolean isChecked) { if (!mRefreshing) { mBackend.setEnabled(isChecked); refreshFromBackend(); } } @Override public void onStart() { logd("onStart()"); super.onStart(); } @Override public void onDestroyView() { logd("onDestroyView()"); super.onDestroyView(); mSwitchBar.removeOnSwitchChangeListener(this); mSwitchBar.hide(); } @Override public void onActivityCreated(Bundle savedInstanceState) { logd("onActivityCreated(%s)", savedInstanceState); super.onActivityCreated(savedInstanceState); TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); emptyView.setText(R.string.screensaver_settings_disabled_prompt); setEmptyView(emptyView); final SettingsActivity sa = (SettingsActivity) getActivity(); mSwitchBar = sa.getSwitchBar(); mSwitchBar.addOnSwitchChangeListener(this); mSwitchBar.show(); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { logd("onCreateOptionsMenu()"); boolean isEnabled = mBackend.isEnabled(); // create "start" action MenuItem start = createMenuItem(menu, R.string.screensaver_settings_dream_start, MenuItem.SHOW_AS_ACTION_NEVER, isEnabled, new Runnable(){ @Override public void run() { mBackend.startDreaming(); }}); // create "when to dream" overflow menu item MenuItem whenToDream = createMenuItem(menu, R.string.screensaver_settings_when_to_dream, MenuItem.SHOW_AS_ACTION_NEVER, isEnabled, new Runnable() { @Override public void run() { showDialog(DIALOG_WHEN_TO_DREAM); }}); // create "help" overflow menu item (make sure it appears last) super.onCreateOptionsMenu(menu, inflater); mMenuItemsWhenEnabled = new MenuItem[] { start, whenToDream }; } private MenuItem createMenuItem(Menu menu, int titleRes, int actionEnum, boolean isEnabled, final Runnable onClick) { MenuItem item = menu.add(titleRes); item.setShowAsAction(actionEnum); item.setEnabled(isEnabled); item.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { onClick.run(); return true; } }); return item; } @Override public Dialog onCreateDialog(int dialogId) { logd("onCreateDialog(%s)", dialogId); if (dialogId == DIALOG_WHEN_TO_DREAM) return createWhenToDreamDialog(); return super.onCreateDialog(dialogId); } private Dialog createWhenToDreamDialog() { final CharSequence[] items = { mContext.getString(R.string.screensaver_settings_summary_dock), mContext.getString(R.string.screensaver_settings_summary_sleep), mContext.getString(R.string.screensaver_settings_summary_either_short) }; int initialSelection = mBackend.isActivatedOnDock() && mBackend.isActivatedOnSleep() ? 2 : mBackend.isActivatedOnDock() ? 0 : mBackend.isActivatedOnSleep() ? 1 : -1; return new AlertDialog.Builder(mContext) .setTitle(R.string.screensaver_settings_when_to_dream) .setSingleChoiceItems(items, initialSelection, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { mBackend.setActivatedOnDock(item == 0 || item == 2); mBackend.setActivatedOnSleep(item == 1 || item == 2); dialog.dismiss(); } }) .create(); } @Override public void onPause() { logd("onPause()"); super.onPause(); mContext.unregisterReceiver(mPackageReceiver); } @Override public void onResume() { logd("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); mContext.registerReceiver(mPackageReceiver , filter); } public static int getSummaryResource(Context context) { DreamBackend backend = new DreamBackend(context); boolean isEnabled = backend.isEnabled(); boolean activatedOnSleep = backend.isActivatedOnSleep(); boolean activatedOnDock = backend.isActivatedOnDock(); boolean activatedOnEither = activatedOnSleep && activatedOnDock; return !isEnabled ? R.string.screensaver_settings_summary_off : activatedOnEither ? R.string.screensaver_settings_summary_either_long : activatedOnSleep ? R.string.screensaver_settings_summary_sleep : activatedOnDock ? R.string.screensaver_settings_summary_dock : 0; } public static CharSequence getSummaryTextWithDreamName(Context context) { DreamBackend backend = new DreamBackend(context); boolean isEnabled = backend.isEnabled(); if (!isEnabled) { return context.getString(R.string.screensaver_settings_summary_off); } else { return backend.getActiveDreamName(); } } private void refreshFromBackend() { logd("refreshFromBackend()"); mRefreshing = true; boolean dreamsEnabled = mBackend.isEnabled(); if (mSwitchBar.isChecked() != dreamsEnabled) { mSwitchBar.setChecked(dreamsEnabled); } if (getPreferenceScreen() == null) { setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext())); } getPreferenceScreen().removeAll(); if (dreamsEnabled) { List<DreamBackend.DreamInfo> dreamInfos = mBackend.getDreamInfos(); final int N = dreamInfos.size(); for (int i = 0; i < N; i++) { getPreferenceScreen().addPreference( new DreamInfoPreference(getPrefContext(), dreamInfos.get(i))); } } if (mMenuItemsWhenEnabled != null) { for (MenuItem menuItem : mMenuItemsWhenEnabled) { menuItem.setEnabled(dreamsEnabled); } } mRefreshing = false; } private static void logd(String msg, Object... args) { if (DEBUG) Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); } private class DreamInfoPreference extends Preference { private final DreamInfo mInfo; public DreamInfoPreference(Context context, DreamInfo info) { super(context); mInfo = info; setLayoutResource(R.layout.dream_info_row); setTitle(mInfo.caption); setIcon(mInfo.icon); } public void onBindViewHolder(final PreferenceViewHolder holder) { super.onBindViewHolder(holder); // bind radio button RadioButton radioButton = (RadioButton) holder.findViewById(android.R.id.button1); radioButton.setChecked(mInfo.isActive); radioButton.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { holder.itemView.onTouchEvent(event); return false; } }); // bind settings button + divider boolean showSettings = mInfo.settingsComponentName != null; View settingsDivider = holder.findViewById(R.id.divider); settingsDivider.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); ImageView settingsButton = (ImageView) holder.findViewById(android.R.id.button2); settingsButton.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); settingsButton.setAlpha(mInfo.isActive ? 1f : Utils.DISABLED_ALPHA); settingsButton.setEnabled(mInfo.isActive); settingsButton.setFocusable(mInfo.isActive); settingsButton.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { mBackend.launchSettings(mInfo); } }); } @Override public void performClick() { if (mInfo.isActive) return; for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { DreamInfoPreference preference = (DreamInfoPreference) getPreferenceScreen().getPreference(i); preference.mInfo.isActive = false; preference.notifyChanged(); } mInfo.isActive = true; mBackend.setActiveDream(mInfo.componentName); notifyChanged(); } } private class PackageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { logd("PackageReceiver.onReceive"); refreshFromBackend(); } } }