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 466df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport com.android.settings.DreamBackend.DreamInfo; 47c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglioimport com.android.settings.widget.SwitchBar; 482943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 496df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlockimport java.util.List; 502943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 51c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Megliopublic class DreamSettings extends SettingsPreferenceFragment implements 52c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio SwitchBar.OnSwitchChangeListener { 537af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static final String TAG = DreamSettings.class.getSimpleName(); 547af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock static final boolean DEBUG = false; 556df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private static final int DIALOG_WHEN_TO_DREAM = 1; 567af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static final String PACKAGE_SCHEME = "package"; 577af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 587af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private final PackageReceiver mPackageReceiver = new PackageReceiver(); 592943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 606df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private Context mContext; 616df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private DreamBackend mBackend; 626df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private DreamInfoAdapter mAdapter; 63c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio private SwitchBar mSwitchBar; 641537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock private MenuItem[] mMenuItemsWhenEnabled; 656df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private boolean mRefreshing; 662943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 676df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 687af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public int getHelpResource() { 697af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return R.string.help_url_dreams; 707af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 717af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 727af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 736df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onAttach(Activity activity) { 747af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onAttach(%s)", activity.getClass().getSimpleName()); 756df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super.onAttach(activity); 766df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext = activity; 776df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 786f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 796df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 806df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onCreate(Bundle icicle) { 817af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreate(%s)", icicle); 826df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super.onCreate(icicle); 83e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 8428ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio mBackend = new DreamBackend(getActivity()); 85e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 86e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio setHasOptionsMenu(true); 87e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio } 88e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio 89c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio @Override 90c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio public void onSwitchChanged(Switch switchView, boolean isChecked) { 91c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio if (!mRefreshing) { 92c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio mBackend.setEnabled(isChecked); 93c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio refreshFromBackend(); 94c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio } 95c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio } 96c32b0eff7123482b0a879bda1e19959de83a8995Fabrice Di Meglio 97e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio @Override 98e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio public void onStart() { 99e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio logd("onStart()"); 100e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio super.onStart(); 1016df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1022943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1032943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler @Override 10463707af94a8ceb23f39f35454025c94e10d52397Chris Wren public void onDestroyView() { 105e2b9e07e5f40b64bbdd7984b6d61cda6c1be060bFabrice Di Meglio logd("onDestroyView()"); 10663707af94a8ceb23f39f35454025c94e10d52397Chris Wren super.onDestroyView(); 107138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio 108138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.removeOnSwitchChangeListener(this); 109138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.hide(); 11063707af94a8ceb23f39f35454025c94e10d52397Chris Wren } 11163707af94a8ceb23f39f35454025c94e10d52397Chris Wren 11263707af94a8ceb23f39f35454025c94e10d52397Chris Wren @Override 1136f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler public void onActivityCreated(Bundle savedInstanceState) { 1147af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onActivityCreated(%s)", savedInstanceState); 1156f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler super.onActivityCreated(savedInstanceState); 1162943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1176df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock ListView listView = getListView(); 118797805909b4852169c1e884a0a458ec1443dab84Chris Wren listView.setItemsCanFocus(true); 119797805909b4852169c1e884a0a458ec1443dab84Chris Wren 1206df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); 1216df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock emptyView.setText(R.string.screensaver_settings_disabled_prompt); 1226df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock listView.setEmptyView(emptyView); 1236f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 1246df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter = new DreamInfoAdapter(mContext); 1256df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock listView.setAdapter(mAdapter); 12628ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio 12728ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio final SettingsActivity sa = (SettingsActivity) getActivity(); 12828ffbd3ba7b47cf38ff33d45b35906ea73171ad8Fabrice Di Meglio mSwitchBar = sa.getSwitchBar(); 129138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.addOnSwitchChangeListener(this); 130138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.show(); 1312943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 1322943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 1336df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1346df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 1357af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreateOptionsMenu()"); 1367af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 1376df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean isEnabled = mBackend.isEnabled(); 1386df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1391537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "start" action 1401537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock MenuItem start = createMenuItem(menu, R.string.screensaver_settings_dream_start, 14135062d6983e352f5cb6c4a6bbf3c1e4e214d44a9Fabrice Di Meglio MenuItem.SHOW_AS_ACTION_NEVER, 1421537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock isEnabled, new Runnable(){ 1431537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock @Override 1441537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock public void run() { 1451537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mBackend.startDreaming(); 1461537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock }}); 1471537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1481537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "when to dream" overflow menu item 1491537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock MenuItem whenToDream = createMenuItem(menu, 1501537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock R.string.screensaver_settings_when_to_dream, 15135062d6983e352f5cb6c4a6bbf3c1e4e214d44a9Fabrice Di Meglio MenuItem.SHOW_AS_ACTION_NEVER, 1526df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock isEnabled, 1536df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock new Runnable() { 1546df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1556df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void run() { 1566df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock showDialog(DIALOG_WHEN_TO_DREAM); 1576df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 1581537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1591537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // create "help" overflow menu item (make sure it appears last) 1601537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock super.onCreateOptionsMenu(menu, inflater); 1611537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock 1621537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mMenuItemsWhenEnabled = new MenuItem[] { start, whenToDream }; 1636f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler } 1646f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 1656df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private MenuItem createMenuItem(Menu menu, 1666df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock int titleRes, int actionEnum, boolean isEnabled, final Runnable onClick) { 1676df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock MenuItem item = menu.add(titleRes); 1686df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setShowAsAction(actionEnum); 1696df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setEnabled(isEnabled); 1706df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock item.setOnMenuItemClickListener(new OnMenuItemClickListener() { 1716df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1726df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public boolean onMenuItemClick(MenuItem item) { 1736df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock onClick.run(); 1746df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return true; 1756df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1766df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }); 1776df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return item; 1786df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1796df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1806df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 1816df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public Dialog onCreateDialog(int dialogId) { 1827af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onCreateDialog(%s)", dialogId); 1836df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock if (dialogId == DIALOG_WHEN_TO_DREAM) 1846df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return createWhenToDreamDialog(); 1856df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return super.onCreateDialog(dialogId); 1866df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 1876df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1886df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private Dialog createWhenToDreamDialog() { 1896df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final CharSequence[] items = { 1906df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_dock), 1916df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_sleep), 1926df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mContext.getString(R.string.screensaver_settings_summary_either_short) 1936df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }; 1946df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 1956df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock int initialSelection = mBackend.isActivatedOnDock() && mBackend.isActivatedOnSleep() ? 2 1966df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : mBackend.isActivatedOnDock() ? 0 1976df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : mBackend.isActivatedOnSleep() ? 1 1986df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : -1; 1996df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2006df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return new AlertDialog.Builder(mContext) 2016df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .setTitle(R.string.screensaver_settings_when_to_dream) 2026df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .setSingleChoiceItems(items, initialSelection, new DialogInterface.OnClickListener() { 2036df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(DialogInterface dialog, int item) { 2046df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActivatedOnDock(item == 0 || item == 2); 2056df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActivatedOnSleep(item == 1 || item == 2); 2066251d707b11b9031f2cd2d5ef5c39cc8056745c0Per Allard dialog.dismiss(); 2076df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 2086df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }) 2096df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock .create(); 2102943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2112943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2122943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler @Override 2137af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public void onPause() { 2147af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onPause()"); 2157af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock super.onPause(); 216c2e2f77739ade726832c433063a075626ba316c4Fabrice Di Meglio 2177af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock mContext.unregisterReceiver(mPackageReceiver); 2187af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 2197af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2207af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 2212943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler public void onResume() { 2227af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("onResume()"); 2232943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler super.onResume(); 2246df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock refreshFromBackend(); 2257af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2267af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock // listen for package changes 2277af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock IntentFilter filter = new IntentFilter(); 2287af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_ADDED); 2297af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_CHANGED); 2307af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_REMOVED); 2317af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addAction(Intent.ACTION_PACKAGE_REPLACED); 2327af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock filter.addDataScheme(PACKAGE_SCHEME); 2337af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock mContext.registerReceiver(mPackageReceiver , filter); 2342943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2352943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2366df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public static int getSummaryResource(Context context) { 2376df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock DreamBackend backend = new DreamBackend(context); 2386df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean isEnabled = backend.isEnabled(); 2396df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnSleep = backend.isActivatedOnSleep(); 2406df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnDock = backend.isActivatedOnDock(); 2416df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean activatedOnEither = activatedOnSleep && activatedOnDock; 2426df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return !isEnabled ? R.string.screensaver_settings_summary_off 2436df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnEither ? R.string.screensaver_settings_summary_either_long 2446df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnSleep ? R.string.screensaver_settings_summary_sleep 2456df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : activatedOnDock ? R.string.screensaver_settings_summary_dock 2466df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock : 0; 247d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 2486f0ea441e465a0af646f8952f820a92f6902c8d9Daniel Sandler 249c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler public static CharSequence getSummaryTextWithDreamName(Context context) { 250c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler DreamBackend backend = new DreamBackend(context); 251c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler boolean isEnabled = backend.isEnabled(); 252c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler if (!isEnabled) { 253c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler return context.getString(R.string.screensaver_settings_summary_off); 254c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } else { 255c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler return backend.getActiveDreamName(); 256c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } 257c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler } 258c825bc8e17cb60cae88397ab77d1e2711c086624Daniel Sandler 2596df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private void refreshFromBackend() { 2607af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("refreshFromBackend()"); 2616df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mRefreshing = true; 2626df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock boolean dreamsEnabled = mBackend.isEnabled(); 263138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio if (mSwitchBar.isChecked() != dreamsEnabled) 264138ff8c0457c6e1345015973668d652fa17c7c3bFabrice Di Meglio mSwitchBar.setChecked(dreamsEnabled); 2656df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2666df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter.clear(); 2676df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock if (dreamsEnabled) { 2686df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock List<DreamInfo> dreamInfos = mBackend.getDreamInfos(); 2696df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mAdapter.addAll(dreamInfos); 2706df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 2711537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock if (mMenuItemsWhenEnabled != null) 2721537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock for (MenuItem menuItem : mMenuItemsWhenEnabled) 2731537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock menuItem.setEnabled(dreamsEnabled); 2746df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mRefreshing = false; 2752943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 2762943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler 2777af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private static void logd(String msg, Object... args) { 2787af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (DEBUG) 2797af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock Log.d(TAG, args == null || args.length == 0 ? msg : String.format(msg, args)); 2807af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 2817af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 2826df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private class DreamInfoAdapter extends ArrayAdapter<DreamInfo> { 2836df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private final LayoutInflater mInflater; 2846df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2856df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public DreamInfoAdapter(Context context) { 2866df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock super(context, 0); 2876df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 288d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 2896df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2906df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 2916df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public View getView(int position, View convertView, ViewGroup parent) { 2926df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock DreamInfo dreamInfo = getItem(position); 2937af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("getView(%s)", dreamInfo.caption); 2946df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final View row = convertView != null ? convertView : createDreamInfoRow(parent); 2956df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock row.setTag(dreamInfo); 2966df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 2976df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind icon 2986df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock ((ImageView) row.findViewById(android.R.id.icon)).setImageDrawable(dreamInfo.icon); 2996df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3006df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind caption 3011537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock ((TextView) row.findViewById(android.R.id.title)).setText(dreamInfo.caption); 3026df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3036df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock // bind radio button 3047af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock RadioButton radioButton = (RadioButton) row.findViewById(android.R.id.button1); 3057af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock radioButton.setChecked(dreamInfo.isActive); 3067af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock radioButton.setOnTouchListener(new OnTouchListener() { 3076df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3086df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public boolean onTouch(View v, MotionEvent event) { 3096df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock row.onTouchEvent(event); 3106df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return false; 3116df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3126df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3131537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock // bind settings button + divider 3141537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock boolean showSettings = dreamInfo.settingsComponentName != null; 3151537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock View settingsDivider = row.findViewById(R.id.divider); 3161537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock settingsDivider.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); 3176df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3181537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock ImageView settingsButton = (ImageView) row.findViewById(android.R.id.button2); 3191537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock settingsButton.setVisibility(showSettings ? View.VISIBLE : View.INVISIBLE); 32096577681a298b44be2e1133b10bc637623be3b87Shuhrat Dehkanov settingsButton.setAlpha(dreamInfo.isActive ? 1f : Utils.DISABLED_ALPHA); 3210abbc1ede13e851e9f1107ad8b67346546bc76caJohn Spurlock settingsButton.setEnabled(dreamInfo.isActive); 322797805909b4852169c1e884a0a458ec1443dab84Chris Wren settingsButton.setFocusable(dreamInfo.isActive); 3237af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock settingsButton.setOnClickListener(new OnClickListener(){ 3246df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3256df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(View v) { 3261537e8b3e8d81bf404f6aa70c8ca514f3ff62dd5John Spurlock mBackend.launchSettings((DreamInfo) row.getTag()); 3276df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3286df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3296df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return row; 330d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 3316df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3326df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private View createDreamInfoRow(ViewGroup parent) { 3336df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock final View row = mInflater.inflate(R.layout.dream_info_row, parent, false); 334797805909b4852169c1e884a0a458ec1443dab84Chris Wren final View header = row.findViewById(android.R.id.widget_frame); 335797805909b4852169c1e884a0a458ec1443dab84Chris Wren header.setOnClickListener(new OnClickListener(){ 3366df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock @Override 3376df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock public void onClick(View v) { 3386df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock v.setPressed(true); 3396df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock activate((DreamInfo) row.getTag()); 3406df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock }}); 3416df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock return row; 342d541b6fd1c2c93df83dcc169a300202c677bb8cdJohn Spurlock } 3436df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock 3447af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private DreamInfo getCurrentSelection() { 3457af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock for (int i = 0; i < getCount(); i++) { 3467af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock DreamInfo dreamInfo = getItem(i); 3477af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (dreamInfo.isActive) 3487af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return dreamInfo; 3497af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3507af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return null; 3517af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3526df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock private void activate(DreamInfo dreamInfo) { 3537af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock if (dreamInfo.equals(getCurrentSelection())) 3547af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock return; 3556df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock for (int i = 0; i < getCount(); i++) { 3566df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock getItem(i).isActive = false; 3576df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock } 3586df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock dreamInfo.isActive = true; 3596df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock mBackend.setActiveDream(dreamInfo.componentName); 3606df18e2713a15a52567ac1a833953ac4bfa38f15John Spurlock notifyDataSetChanged(); 3612943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 3622943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler } 3637af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock 3647af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock private class PackageReceiver extends BroadcastReceiver { 3657af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock @Override 3667af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock public void onReceive(Context context, Intent intent) { 3677af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock logd("PackageReceiver.onReceive"); 3687af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock refreshFromBackend(); 3697af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3707af2aa52ac2e458969abeaefec217f6a4f976767John Spurlock } 3712943cfa60670c1fc0d11d3cb4d0b67ec87e4181bDaniel Sandler} 372