| /* |
| * 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.nano.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 |
| public 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); |
| } |
| |
| @Override |
| public int getDialogMetricsCategory(int dialogId) { |
| if (dialogId == DIALOG_WHEN_TO_DREAM) { |
| return MetricsEvent.DIALOG_DREAM_START_DELAY; |
| } |
| return 0; |
| } |
| |
| 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(); |
| } |
| } |
| } |