12943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler/* 26df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock * Copyright (C) 2012 The Android Open Source Project 32943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * 42943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * Licensed under the Apache License, Version 2.0 (the "License"); 52943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * you may not use this file except in compliance with the License. 62943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * You may obtain a copy of the License at 72943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * 82943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * http://www.apache.org/licenses/LICENSE-2.0 92943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * 102943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * Unless required by applicable law or agreed to in writing, software 112943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * distributed under the License is distributed on an "AS IS" BASIS, 122943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * See the License for the specific language governing permissions and 142943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler * limitations under the License. 152943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler */ 162943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 172943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandlerpackage com.android.settings; 182943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 196f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandlerimport android.app.Activity; 206df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.app.AlertDialog; 216df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.app.Dialog; 227af2aa52ac2e458969abeaefec217f6a4f976767John Spurlockimport android.content.BroadcastReceiver; 232943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandlerimport android.content.Context; 246df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.content.DialogInterface; 257af2aa52ac2e458969abeaefec217f6a4f976767John Spurlockimport android.content.Intent; 267af2aa52ac2e458969abeaefec217f6a4f976767John Spurlockimport android.content.IntentFilter; 272943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandlerimport android.os.Bundle; 287af2aa52ac2e458969abeaefec217f6a4f976767John Spurlockimport android.util.Log; 296df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.LayoutInflater; 306df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.Menu; 316df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.MenuInflater; 326df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.MenuItem; 336df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.MenuItem.OnMenuItemClickListener; 346df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.MotionEvent; 356df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.View; 366df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.View.OnClickListener; 376df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.View.OnTouchListener; 386df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.view.ViewGroup; 396df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.widget.ArrayAdapter; 406df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.widget.ImageView; 416df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.widget.ListView; 426df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.widget.RadioButton; 436f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandlerimport android.widget.Switch; 446df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport android.widget.TextView; 456df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 468a963babe2e36b7a41f77b8d2598c97658196e58Chris Wrenimport com.android.internal.logging.MetricsLogger; 476df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport com.android.settings.DreamBackend.DreamInfo; 48c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglioimport com.android.settings.widget.SwitchBar; 492943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 506df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport java.util.List; 512943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 52c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Megliopublic class DreamSettings extends SettingsPreferenceFragment implements 53c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio SwitchBar.OnSwitchChangeListener { 547af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static final String TAG = DreamSettings.class.getSimpleName(); 557af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock static final boolean DEBUG = false; 566df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private static final int DIALOG_WHEN_TO_DREAM = 1; 577af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static final String PACKAGE_SCHEME = "package"; 587af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 597af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private final PackageReceiver mPackageReceiver = new PackageReceiver(); 602943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 616df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private Context mContext; 626df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private DreamBackend mBackend; 636df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private DreamInfoAdapter mAdapter; 64c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio private SwitchBar mSwitchBar; 651537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock private MenuItem[] mMenuItemsWhenEnabled; 666df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private boolean mRefreshing; 672943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 686df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 697af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public int getHelpResource() { 707af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return R.string.help_url_dreams; 717af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 727af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 737af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 746df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onAttach(Activity activity) { 757af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onAttach(%s)", activity.getClass().getSimpleName()); 766df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super.onAttach(activity); 776df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext = activity; 786df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 796f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 806df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 818a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren protected int getMetricsCategory() { 828a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren return MetricsLogger.DREAM; 838a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren } 848a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren 858a963babe2e36b7a41f77b8d2598c97658196e58Chris Wren @Override 866df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onCreate(Bundle icicle) { 877af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreate(%s)", icicle); 886df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super.onCreate(icicle); 89e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 9028ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio mBackend = new DreamBackend(getActivity()); 91e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 92e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio setHasOptionsMenu(true); 93e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio } 94e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 95c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio @Override 96c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio public void onSwitchChanged(Switch switchView, boolean isChecked) { 97c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio if (!mRefreshing) { 98c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio mBackend.setEnabled(isChecked); 99c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio refreshFromBackend(); 100c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio } 101c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio } 102c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio 103e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio @Override 104e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio public void onStart() { 105e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio logd("onStart()"); 106e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio super.onStart(); 1076df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1082943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1092943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler @Override 11063707af94a8ceb23f39f35454025c94e10d52397Chris Wren public void onDestroyView() { 111e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio logd("onDestroyView()"); 11263707af94a8ceb23f39f35454025c94e10d52397Chris Wren super.onDestroyView(); 113138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio 114138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.removeOnSwitchChangeListener(this); 115138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.hide(); 11663707af94a8ceb23f39f35454025c94e10d52397Chris Wren } 11763707af94a8ceb23f39f35454025c94e10d52397Chris Wren 11863707af94a8ceb23f39f35454025c94e10d52397Chris Wren @Override 1196f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler public void onActivityCreated(Bundle savedInstanceState) { 1207af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onActivityCreated(%s)", savedInstanceState); 1216f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler super.onActivityCreated(savedInstanceState); 1222943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1236df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock ListView listView = getListView(); 124797805909b4852169c1e884a0a458ec1443dab84Chris Wren listView.setItemsCanFocus(true); 125797805909b4852169c1e884a0a458ec1443dab84Chris Wren 1266df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); 1276df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock emptyView.setText(R.string.screensaver_settings_disabled_prompt); 1286df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock listView.setEmptyView(emptyView); 1296f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 1306df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter = new DreamInfoAdapter(mContext); 1316df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock listView.setAdapter(mAdapter); 13228ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio 13328ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) getActivity(); 13428ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio mSwitchBar = sa.getSwitchBar(); 135138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.addOnSwitchChangeListener(this); 136138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.show(); 1372943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 1382943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1396df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1406df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1417af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreateOptionsMenu()"); 1427af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 1436df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean isEnabled = mBackend.isEnabled(); 1446df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1451537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "start" action 1461537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock MenuItem start = createMenuItem(menu, R.string.screensaver_settings_dream_start, 14735062d6983e352f5cb6c4a6bbf3c1e4e214d44a9Fabrice Di Meglio MenuItem.SHOW_AS_ACTION_NEVER, 1481537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock isEnabled, new Runnable(){ 1491537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock @Override 1501537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock public void run() { 1511537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mBackend.startDreaming(); 1521537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock }}); 1531537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1541537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "when to dream" overflow menu item 1551537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock MenuItem whenToDream = createMenuItem(menu, 1561537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock R.string.screensaver_settings_when_to_dream, 15735062d6983e352f5cb6c4a6bbf3c1e4e214d44a9Fabrice Di Meglio MenuItem.SHOW_AS_ACTION_NEVER, 1586df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock isEnabled, 1596df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock new Runnable() { 1606df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1616df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void run() { 1626df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock showDialog(DIALOG_WHEN_TO_DREAM); 1636df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 1641537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1651537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "help" overflow menu item (make sure it appears last) 1661537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock super.onCreateOptionsMenu(menu, inflater); 1671537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1681537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mMenuItemsWhenEnabled = new MenuItem[] { start, whenToDream }; 1696f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler } 1706f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 1716df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private MenuItem createMenuItem(Menu menu, 1726df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock int titleRes, int actionEnum, boolean isEnabled, final Runnable onClick) { 1736df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock MenuItem item = menu.add(titleRes); 1746df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setShowAsAction(actionEnum); 1756df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setEnabled(isEnabled); 1766df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setOnMenuItemClickListener(new OnMenuItemClickListener() { 1776df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1786df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public boolean onMenuItemClick(MenuItem item) { 1796df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock onClick.run(); 1806df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return true; 1816df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1826df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }); 1836df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return item; 1846df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1856df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1866df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1876df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public Dialog onCreateDialog(int dialogId) { 1887af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreateDialog(%s)", dialogId); 1896df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock if (dialogId == DIALOG_WHEN_TO_DREAM) 1906df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return createWhenToDreamDialog(); 1916df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return super.onCreateDialog(dialogId); 1926df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1936df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1946df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private Dialog createWhenToDreamDialog() { 1956df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final CharSequence[] items = { 1966df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_dock), 1976df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_sleep), 1986df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_either_short) 1996df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }; 2006df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2016df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock int initialSelection = mBackend.isActivatedOnDock() && mBackend.isActivatedOnSleep() ? 2 2026df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : mBackend.isActivatedOnDock() ? 0 2036df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : mBackend.isActivatedOnSleep() ? 1 2046df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : -1; 2056df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2066df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return new AlertDialog.Builder(mContext) 2076df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .setTitle(R.string.screensaver_settings_when_to_dream) 2086df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .setSingleChoiceItems(items, initialSelection, new DialogInterface.OnClickListener() { 2096df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(DialogInterface dialog, int item) { 2106df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActivatedOnDock(item == 0 || item == 2); 2116df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActivatedOnSleep(item == 1 || item == 2); 2126251d707b11b9031f2cd2d5ef5c39cc8056745c0Per Allard dialog.dismiss(); 2136df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 2146df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }) 2156df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .create(); 2162943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2172943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2182943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler @Override 2197af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public void onPause() { 2207af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onPause()"); 2217af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock super.onPause(); 222c2e2f77739ade726832c433063a075626ba316c4Fabrice Di Meglio 2237af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock mContext.unregisterReceiver(mPackageReceiver); 2247af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 2257af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2267af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 2272943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler public void onResume() { 2287af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onResume()"); 2292943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler super.onResume(); 2306df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock refreshFromBackend(); 2317af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2327af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock // listen for package changes 2337af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock IntentFilter filter = new IntentFilter(); 2347af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_ADDED); 2357af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 2367af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 2377af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_REPLACED); 2387af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addDataScheme(PACKAGE_SCHEME); 2397af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock mContext.registerReceiver(mPackageReceiver , filter); 2402943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2412943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2426df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public static int getSummaryResource(Context context) { 2436df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock DreamBackend backend = new DreamBackend(context); 2446df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean isEnabled = backend.isEnabled(); 2456df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnSleep = backend.isActivatedOnSleep(); 2466df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnDock = backend.isActivatedOnDock(); 2476df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnEither = activatedOnSleep && activatedOnDock; 2486df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return !isEnabled ? R.string.screensaver_settings_summary_off 2496df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnEither ? R.string.screensaver_settings_summary_either_long 2506df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnSleep ? R.string.screensaver_settings_summary_sleep 2516df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnDock ? R.string.screensaver_settings_summary_dock 2526df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : 0; 253d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 2546f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 255c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler public static CharSequence getSummaryTextWithDreamName(Context context) { 256c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler DreamBackend backend = new DreamBackend(context); 257c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler boolean isEnabled = backend.isEnabled(); 258c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler if (!isEnabled) { 259c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler return context.getString(R.string.screensaver_settings_summary_off); 260c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } else { 261c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler return backend.getActiveDreamName(); 262c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } 263c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } 264c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler 2656df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private void refreshFromBackend() { 2667af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("refreshFromBackend()"); 2676df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mRefreshing = true; 2686df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean dreamsEnabled = mBackend.isEnabled(); 269138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio if (mSwitchBar.isChecked() != dreamsEnabled) 270138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.setChecked(dreamsEnabled); 2716df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2726df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter.clear(); 2736df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock if (dreamsEnabled) { 2746df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock List<DreamInfo> dreamInfos = mBackend.getDreamInfos(); 2756df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter.addAll(dreamInfos); 2766df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 2771537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock if (mMenuItemsWhenEnabled != null) 2781537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock for (MenuItem menuItem : mMenuItemsWhenEnabled) 2791537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock menuItem.setEnabled(dreamsEnabled); 2806df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mRefreshing = false; 2812943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2822943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2837af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static void logd(String msg, Object... args) { 2847af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (DEBUG) 2857af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); 2867af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 2877af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2886df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private class DreamInfoAdapter extends ArrayAdapter<DreamInfo> { 2896df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private final LayoutInflater mInflater; 2906df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2916df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public DreamInfoAdapter(Context context) { 2926df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super(context, 0); 2936df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 294d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 2956df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2966df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 2976df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public View getView(int position, View convertView, ViewGroup parent) { 2986df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock DreamInfo dreamInfo = getItem(position); 2997af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("getView(%s)", dreamInfo.caption); 3006df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final View row = convertView != null ? convertView : createDreamInfoRow(parent); 3016df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock row.setTag(dreamInfo); 3026df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3036df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind icon 3046df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock ((ImageView) row.findViewById(android.R.id.icon)).setImageDrawable(dreamInfo.icon); 3056df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3066df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind caption 3071537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock ((TextView) row.findViewById(android.R.id.title)).setText(dreamInfo.caption); 3086df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3096df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind radio button 3107af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock RadioButton radioButton = (RadioButton) row.findViewById(android.R.id.button1); 3117af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock radioButton.setChecked(dreamInfo.isActive); 3127af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock radioButton.setOnTouchListener(new OnTouchListener() { 3136df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3146df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public boolean onTouch(View v, MotionEvent event) { 3156df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock row.onTouchEvent(event); 3166df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return false; 3176df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3186df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3191537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // bind settings button + divider 3201537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock boolean showSettings = dreamInfo.settingsComponentName != null; 3211537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock View settingsDivider = row.findViewById(R.id.divider); 3221537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock settingsDivider.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); 3236df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3241537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock ImageView settingsButton = (ImageView) row.findViewById(android.R.id.button2); 3251537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock settingsButton.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); 32696577681a298b44be2e1133b10bc637623be3b87Shuhrat Dehkanov settingsButton.setAlpha(dreamInfo.isActive ? 1f : Utils.DISABLED_ALPHA); 3270abbc1ede13e851e9f1107ad8b67346546bc76caJohn Spurlock settingsButton.setEnabled(dreamInfo.isActive); 328797805909b4852169c1e884a0a458ec1443dab84Chris Wren settingsButton.setFocusable(dreamInfo.isActive); 3297af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock settingsButton.setOnClickListener(new OnClickListener(){ 3306df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3316df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(View v) { 3321537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mBackend.launchSettings((DreamInfo) row.getTag()); 3336df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3346df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3356df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return row; 336d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 3376df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3386df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private View createDreamInfoRow(ViewGroup parent) { 3396df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final View row = mInflater.inflate(R.layout.dream_info_row, parent, false); 340797805909b4852169c1e884a0a458ec1443dab84Chris Wren final View header = row.findViewById(android.R.id.widget_frame); 341797805909b4852169c1e884a0a458ec1443dab84Chris Wren header.setOnClickListener(new OnClickListener(){ 3426df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3436df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(View v) { 3446df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock v.setPressed(true); 3456df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock activate((DreamInfo) row.getTag()); 3466df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3476df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return row; 348d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 3496df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3507af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private DreamInfo getCurrentSelection() { 3517af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock for (int i = 0; i < getCount(); i++) { 3527af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock DreamInfo dreamInfo = getItem(i); 3537af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (dreamInfo.isActive) 3547af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return dreamInfo; 3557af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3567af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return null; 3577af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3586df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private void activate(DreamInfo dreamInfo) { 3597af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (dreamInfo.equals(getCurrentSelection())) 3607af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return; 3616df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock for (int i = 0; i < getCount(); i++) { 3626df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock getItem(i).isActive = false; 3636df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 3646df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock dreamInfo.isActive = true; 3656df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActiveDream(dreamInfo.componentName); 3666df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock notifyDataSetChanged(); 3672943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 3682943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 3697af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 3707af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private class PackageReceiver extends BroadcastReceiver { 3717af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 3727af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public void onReceive(Context context, Intent intent) { 3737af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("PackageReceiver.onReceive"); 3747af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock refreshFromBackend(); 3757af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3767af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3772943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler} 378