/CVox/src/com/cvox/browser/ScriptListActivity.java

http://eyes-free.googlecode.com/ · Java · 196 lines · 133 code · 34 blank · 29 comment · 6 complexity · 301e76348077505d496adfb9598c362b MD5 · raw file

  1. /*
  2. * Copyright (C) 2008 Google Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.cvox.browser;
  17. import java.io.File;
  18. import java.io.FileFilter;
  19. import java.io.FilenameFilter;
  20. import java.util.Collections;
  21. import java.util.LinkedList;
  22. import java.util.List;
  23. import android.app.Activity;
  24. import android.app.AlertDialog;
  25. import android.app.ListActivity;
  26. import android.app.SearchManager;
  27. import android.content.DialogInterface;
  28. import android.content.Intent;
  29. import android.content.DialogInterface.OnClickListener;
  30. import android.database.Cursor;
  31. import android.net.Uri;
  32. import android.os.Bundle;
  33. import android.os.Environment;
  34. import android.util.Log;
  35. import android.view.ContextMenu;
  36. import android.view.Menu;
  37. import android.view.MenuItem;
  38. import android.view.View;
  39. import android.view.MenuItem.OnMenuItemClickListener;
  40. import android.widget.AdapterView;
  41. import android.widget.CheckBox;
  42. import android.widget.SimpleCursorAdapter;
  43. import android.widget.Toast;
  44. import android.widget.AdapterView.OnItemClickListener;
  45. import android.widget.SimpleCursorAdapter.ViewBinder;
  46. public class ScriptListActivity extends ListActivity {
  47. public final static String TAG = ScriptListActivity.class.toString();
  48. private ScriptDatabase scriptdb = null;
  49. private SimpleCursorAdapter adapter = null;
  50. public void onCreate(Bundle icicle) {
  51. super.onCreate(icicle);
  52. setContentView(R.layout.act_scriptlist);
  53. this.scriptdb = new ScriptDatabase(this);
  54. final Cursor cur = scriptdb.getScripts();
  55. this.startManagingCursor(cur);
  56. adapter = new SimpleCursorAdapter(this, R.layout.item_script, cur,
  57. new String[] { ScriptDatabase.FIELD_SCRIPT_NAME, ScriptDatabase.FIELD_SCRIPT_DESCRIP, ScriptDatabase.FIELD_SCRIPT_ENABLED },
  58. new int[] { R.id.script_title, R.id.script_descrip, R.id.script_enabled });
  59. adapter.setViewBinder(new ViewBinder() {
  60. public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
  61. switch(view.getId()) {
  62. case R.id.script_enabled: {
  63. if(!(view instanceof CheckBox)) return false;
  64. int value = cursor.getInt(columnIndex);
  65. ((CheckBox)view).setChecked((value == 1));
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. });
  72. this.getListView().setOnItemClickListener(new OnItemClickListener() {
  73. public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
  74. // toggle checked status and refresh our cursor
  75. scriptdb.toggleEnabled(id);
  76. cur.requery();
  77. }
  78. });
  79. this.setListAdapter(adapter);
  80. this.registerForContextMenu(this.getListView());
  81. }
  82. public void onDestroy() {
  83. super.onDestroy();
  84. this.scriptdb.close();
  85. }
  86. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
  87. final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
  88. MenuItem delete = menu.add(R.string.manage_delete);
  89. delete.setOnMenuItemClickListener(new OnMenuItemClickListener() {
  90. public boolean onMenuItemClick(MenuItem item) {
  91. scriptdb.deleteScript(info.id);
  92. adapter.getCursor().requery();
  93. return true;
  94. }
  95. });
  96. }
  97. /**
  98. * File filter to show only user scripts (*.user.js)
  99. */
  100. protected FilenameFilter userScriptFilter = new FilenameFilter() {
  101. public boolean accept(File path, String filename) {
  102. return filename.endsWith(BrowserActivity.USERSCRIPT_EXTENSION);
  103. }
  104. };
  105. public boolean onCreateOptionsMenu(Menu menu) {
  106. super.onCreateOptionsMenu(menu);
  107. MenuItem find = menu.add(R.string.manage_find);
  108. find.setIcon(android.R.drawable.ic_menu_add);
  109. find.setOnMenuItemClickListener(new OnMenuItemClickListener() {
  110. public boolean onMenuItemClick(MenuItem item) {
  111. // launch back around to specific url
  112. Intent intent = new Intent(ScriptListActivity.this, BrowserActivity.class);
  113. intent.putExtra(SearchManager.QUERY, "http://userscripts.org/scripts/search?q=android");
  114. ScriptListActivity.this.startActivity(intent);
  115. return true;
  116. }
  117. });
  118. MenuItem imp = menu.add(R.string.manage_import);
  119. imp.setIcon(android.R.drawable.ic_menu_upload);
  120. imp.setOnMenuItemClickListener(new OnMenuItemClickListener() {
  121. public boolean onMenuItemClick(MenuItem item) {
  122. // show file browser to pick script
  123. // code adapted from connectbot project:
  124. // http://connectbot.googlecode.com/svn/trunk/connectbot/src/org/connectbot/PubkeyListActivity.java
  125. // TODO: replace this with well-known intent over to file browser
  126. // TODO: if browser not installed (?) then fallback to this simple method?
  127. // build list of all files in sdcard root
  128. final File sdcard = Environment.getExternalStorageDirectory();
  129. // Don't show a dialog if the SD card is completely absent.
  130. final String state = Environment.getExternalStorageState();
  131. if (Environment.MEDIA_REMOVED.equals(state)
  132. || Environment.MEDIA_BAD_REMOVAL.equals(state)
  133. || Environment.MEDIA_UNMOUNTABLE.equals(state)
  134. || Environment.MEDIA_UNMOUNTED.equals(state)) {
  135. Toast.makeText(ScriptListActivity.this, R.string.manage_pick_error, Toast.LENGTH_SHORT).show();
  136. return true;
  137. }
  138. final String[] namesList = sdcard.list(userScriptFilter);
  139. // prompt user to select any file from the sdcard root
  140. new AlertDialog.Builder(ScriptListActivity.this)
  141. .setTitle(R.string.manage_pick)
  142. .setItems(namesList, new OnClickListener() {
  143. public void onClick(DialogInterface arg0, int arg1) {
  144. // find the exact file selected
  145. String name = namesList[arg1];
  146. try {
  147. String raw = Util.getFileString(new File(sdcard, name));
  148. scriptdb.insertScript(null, raw);
  149. Toast.makeText(ScriptListActivity.this, R.string.manage_import_success, Toast.LENGTH_SHORT).show();
  150. } catch(Exception e) {
  151. Log.e(TAG, "Problem while trying to import script", e);
  152. Toast.makeText(ScriptListActivity.this, R.string.manage_import_fail, Toast.LENGTH_SHORT).show();
  153. }
  154. }
  155. })
  156. .setNegativeButton(android.R.string.cancel, null).create().show();
  157. return true;
  158. }
  159. });
  160. return true;
  161. }
  162. }