X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryManagerActivity.java;h=dacc6d75cd2c806fc72317d2c96b78cec0a9731c;hb=4f0e2b9302b6c3921e444467bb295f0ed6db1b99;hp=30a4e3b9fec4d9bc211c4bcc1441adc824003138;hpb=095ccc66afb856849cc36d85d64f87547308d6fb;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java index 30a4e3b..dacc6d7 100644 --- a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java @@ -29,11 +29,16 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.preference.PreferenceManager; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.support.v7.widget.SearchView; +import android.support.v7.widget.SearchView.OnQueryTextListener; import android.util.Log; import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -45,15 +50,12 @@ import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.FrameLayout; import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton; -import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.SherlockListActivity; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.widget.SearchView; -import com.actionbarsherlock.widget.SearchView.OnQueryTextListener; import com.hughes.android.dictionary.DictionaryInfo.IndexInfo; import com.hughes.android.util.IntentLauncher; @@ -72,11 +74,25 @@ import java.util.zip.ZipFile; // Right-click: // Delete, move to top. -public class DictionaryManagerActivity extends SherlockListActivity { +public class DictionaryManagerActivity extends ActionBarActivity { static final String LOG = "QuickDic"; static boolean blockAutoLaunch = false; + private ListView listView; + private ListView getListView() { + if (listView == null) { + listView = (ListView)findViewById(android.R.id.list); + } + return listView; + } + private void setListAdapter(ListAdapter adapter) { + getListView().setAdapter(adapter); + } + private ListAdapter getListAdapter() { + return getListView().getAdapter(); + } + DictionaryApplication application; SearchView filterSearchView; @@ -96,7 +112,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { uiHandler.post(new Runnable() { @Override public void run() { - setListAdapater(); + setMyListAdapater(); } }); } @@ -115,7 +131,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); final Cursor cursor = downloadManager.query(query); - if (!cursor.moveToFirst()) { + if (cursor == null || !cursor.moveToFirst()) { Log.e(LOG, "Couldn't find download."); return; } @@ -126,12 +142,17 @@ public class DictionaryManagerActivity extends SherlockListActivity { .getInt(cursor .getColumnIndex(DownloadManager.COLUMN_STATUS)); if (DownloadManager.STATUS_SUCCESSFUL != status) { + final int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); Log.w(LOG, "Download failed: status=" + status + - ", reason=" + cursor.getString(cursor - .getColumnIndex(DownloadManager.COLUMN_REASON))); - Toast.makeText(context, getString(R.string.downloadFailed, dest), - Toast.LENGTH_LONG).show(); + ", reason=" + reason); + String msg = Integer.toString(reason); + switch (reason) { + case DownloadManager.ERROR_FILE_ALREADY_EXISTS: msg = "File exists"; break; + case DownloadManager.ERROR_FILE_ERROR: msg = "File error"; break; + case DownloadManager.ERROR_INSUFFICIENT_SPACE: msg = "Not enough space"; break; + } + new AlertDialog.Builder(context).setTitle(getString(R.string.error)).setMessage(getString(R.string.downloadFailed, reason)).setNeutralButton("Close", null).show(); return; } @@ -148,7 +169,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { final InputStream zipIn = zipFile.getInputStream(zipEntry); File targetFile = new File(application.getDictDir(), zipEntry.getName()); if (targetFile.exists()) { - targetFile.renameTo(new File(targetFile.getAbsolutePath().replace(".quickdic", "bak.quickdic"))); + targetFile.renameTo(new File(targetFile.getAbsolutePath().replace(".quickdic", ".bak.quickdic"))); targetFile = new File(application.getDictDir(), zipEntry.getName()); } final OutputStream zipOut = new FileOutputStream(targetFile); @@ -158,8 +179,12 @@ public class DictionaryManagerActivity extends SherlockListActivity { Toast.makeText(context, getString(R.string.installationFinished, dest), Toast.LENGTH_LONG).show(); } catch (Exception e) { - Toast.makeText(context, getString(R.string.unzippingFailed, dest), - Toast.LENGTH_LONG).show(); + String msg = getString(R.string.unzippingFailed, dest); + File dir = application.getDictDir(); + if (!dir.canWrite() || !application.checkFileCreate(dir)) { + msg = getString(R.string.notWritable, dir.getAbsolutePath()); + } + new AlertDialog.Builder(context).setTitle(getString(R.string.error)).setMessage(msg).setNeutralButton("Close", null).show(); Log.e(LOG, "Failed to unzip.", e); } finally { localZipFile.delete(); @@ -168,16 +193,16 @@ public class DictionaryManagerActivity extends SherlockListActivity { } }; - public static Intent getLaunchIntent() { - final Intent intent = new Intent(); - intent.setClassName(DictionaryManagerActivity.class.getPackage().getName(), - DictionaryManagerActivity.class.getName()); + public static Intent getLaunchIntent(Context c) { + final Intent intent = new Intent(c, DictionaryManagerActivity.class); intent.putExtra(C.CAN_AUTO_LAUNCH_DICT, false); return intent; } @Override public void onCreate(Bundle savedInstanceState) { + // This must be first, otherwise the actiona bar doesn't get + // styled properly. setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId); super.onCreate(savedInstanceState); @@ -203,7 +228,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { showDownloadable.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - onShowLocalChanged(); + onShowDownloadableChanged(); } }); @@ -212,7 +237,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { if (!prefs.getString(C.THANKS_FOR_UPDATING_VERSION, "").equals( thanksForUpdatingLatestVersion)) { blockAutoLaunch = true; - startActivity(HtmlDisplayActivity.getWhatsNewLaunchIntent()); + startActivity(HtmlDisplayActivity.getWhatsNewLaunchIntent(getApplicationContext())); prefs.edit().putString(C.THANKS_FOR_UPDATING_VERSION, thanksForUpdatingLatestVersion) .commit(); } @@ -220,7 +245,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { registerReceiver(broadcastReceiver, new IntentFilter( DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - setListAdapater(); + setMyListAdapater(); registerForContextMenu(getListView()); final File dictDir = application.getDictDir(); @@ -233,6 +258,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { R.string.unableToReadDictionaryDir, dictDir.getAbsolutePath(), Environment.getExternalStorageDirectory())); + builder.setNeutralButton("Close", null); builder.create().show(); } @@ -272,7 +298,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { @Override public boolean onQueryTextChange(String filterText) { - setListAdapater(); + setMyListAdapater(); return true; } }); @@ -323,14 +349,14 @@ public class DictionaryManagerActivity extends SherlockListActivity { } final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - showDownloadable.setChecked(prefs.getBoolean(C.SHOW_DOWNLOADABLE, false)); + showDownloadable.setChecked(prefs.getBoolean(C.SHOW_DOWNLOADABLE, true)); if (!blockAutoLaunch && getIntent().getBooleanExtra(C.CAN_AUTO_LAUNCH_DICT, true) && prefs.contains(C.DICT_FILE) && prefs.contains(C.INDEX_SHORT_NAME)) { Log.d(LOG, "Skipping DictionaryManager, going straight to dictionary."); - startActivity(DictionaryActivity.getLaunchIntent( + startActivity(DictionaryActivity.getLaunchIntent(getApplicationContext(), new File(prefs.getString(C.DICT_FILE, "")), prefs.getString(C.INDEX_SHORT_NAME, ""), prefs.getString(C.SEARCH_TOKEN, ""))); @@ -348,7 +374,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { application.backgroundUpdateDictionaries(dictionaryUpdater); - setListAdapater(); + setMyListAdapater(); } @Override @@ -380,7 +406,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { @Override public boolean onMenuItemClick(android.view.MenuItem item) { application.moveDictionaryToTop(row.dictionaryInfo); - setListAdapater(); + setMyListAdapater(); return true; } }); @@ -393,15 +419,15 @@ public class DictionaryManagerActivity extends SherlockListActivity { @Override public boolean onMenuItemClick(android.view.MenuItem item) { application.deleteDictionary(row.dictionaryInfo); - setListAdapater(); + setMyListAdapater(); return true; } }); } } - private void onShowLocalChanged() { - setListAdapater(); + private void onShowDownloadableChanged() { + setMyListAdapater(); Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit(); prefs.putBoolean(C.SHOW_DOWNLOADABLE, showDownloadable.isChecked()); prefs.commit(); @@ -491,7 +517,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { } - private void setListAdapater() { + private void setMyListAdapater() { final String filter = filterSearchView == null ? "" : filterSearchView.getQuery() .toString(); final String[] filters = filter.trim().toLowerCase().split("(\\s|-)+"); @@ -499,7 +525,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { } private View createDictionaryRow(final DictionaryInfo dictionaryInfo, - final ViewGroup parent, final boolean canLaunch) { + final ViewGroup parent, boolean canLaunch) { View row = LayoutInflater.from(parent.getContext()).inflate( R.layout.dictionary_manager_row, parent, false); @@ -509,16 +535,22 @@ public class DictionaryManagerActivity extends SherlockListActivity { final boolean updateAvailable = application.updateAvailable(dictionaryInfo); final Button downloadButton = (Button) row.findViewById(R.id.downloadButton); - if (!canLaunch || updateAvailable) { + final DictionaryInfo downloadable = application.getDownloadable(dictionaryInfo.uncompressedFilename); + boolean broken = false; + if (!dictionaryInfo.isValid()) { + broken = true; + canLaunch = false; + } + if (downloadable != null && (!canLaunch || updateAvailable)) { downloadButton .setText(getString( R.string.downloadButton, - application.getDownloadable(dictionaryInfo.uncompressedFilename).zipBytes / 1024.0 / 1024.0)); + downloadable.zipBytes / 1024.0 / 1024.0)); downloadButton.setMinWidth(application.languageButtonPixels * 3 / 2); downloadButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { - downloadDictionary(dictionaryInfo); + downloadDictionary(downloadable.downloadUrl, downloadable.zipBytes, downloadButton); } }); } else { @@ -530,7 +562,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { .sortedIndexInfos(dictionaryInfo.indexInfos); final StringBuilder builder = new StringBuilder(); if (updateAvailable) { - builder.append(getString(R.string.updateButton)); + builder.append(getString(R.string.updateAvailable)); } for (IndexInfo indexInfo : sortedIndexInfos) { final View button = application.createButton(buttons.getContext(), dictionaryInfo, @@ -540,7 +572,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { if (canLaunch) { button.setOnClickListener( new IntentLauncher(buttons.getContext(), - DictionaryActivity.getLaunchIntent( + DictionaryActivity.getLaunchIntent(getApplicationContext(), application.getPath(dictionaryInfo.uncompressedFilename), indexInfo.shortName, ""))); @@ -553,12 +585,22 @@ public class DictionaryManagerActivity extends SherlockListActivity { builder.append(getString(R.string.indexInfo, indexInfo.shortName, indexInfo.mainTokenCount)); } + if (downloadable != null || dictionaryInfo != null) { + builder.append("; "); + builder.append(getString(R.string.downloadButton, (dictionaryInfo != null ? dictionaryInfo.uncompressedBytes : downloadable.uncompressedBytes) / 1024.0 / 1024.0)); + } + if (broken) { + name.setText("Broken: " + application.getDictionaryName(dictionaryInfo.uncompressedFilename)); + builder.append("; Cannot be used, redownload, check hardware/file system"); + // Allow deleting, but cannot open + row.setLongClickable(true); + } details.setText(builder.toString()); if (canLaunch) { row.setClickable(true); row.setOnClickListener(new IntentLauncher(parent.getContext(), - DictionaryActivity.getLaunchIntent( + DictionaryActivity.getLaunchIntent(getApplicationContext(), application.getPath(dictionaryInfo.uncompressedFilename), dictionaryInfo.indexInfos.get(0).shortName, ""))); row.setFocusable(true); @@ -569,21 +611,53 @@ public class DictionaryManagerActivity extends SherlockListActivity { return row; } - private void downloadDictionary(final DictionaryInfo dictionaryInfo) { + private void downloadDictionary(final String downloadUrl, long bytes, Button downloadButton) { DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + final DownloadManager.Query query = new DownloadManager.Query(); + query.setFilterByStatus(DownloadManager.STATUS_PAUSED | DownloadManager.STATUS_PENDING | DownloadManager.STATUS_RUNNING); + final Cursor cursor = downloadManager.query(query); + + // Due to a bug, cursor is null instead of empty when + // the download manager is disabled. + if (cursor == null) { + new AlertDialog.Builder(DictionaryManagerActivity.this).setTitle(getString(R.string.error)) + .setMessage(getString(R.string.downloadFailed, R.string.downloadManagerQueryFailed)) + .setNeutralButton("Close", null).show(); + return; + } + + while (cursor.moveToNext()) { + if (downloadUrl.equals(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)))) + break; + } + if (!cursor.isAfterLast()) { + downloadManager.remove(cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID))); + downloadButton + .setText(getString( + R.string.downloadButton, + bytes / 1024.0 / 1024.0)); + cursor.close(); + return; + } + cursor.close(); Request request = new Request( - Uri.parse(dictionaryInfo.downloadUrl)); + Uri.parse(downloadUrl)); try { - final String destFile = new File(new URL(dictionaryInfo.downloadUrl).getFile()) + final String destFile = new File(new URL(downloadUrl).getFile()) .getName(); Log.d(LOG, "Downloading to: " + destFile); - request.setDestinationUri(Uri.fromFile(new File(Environment - .getExternalStorageDirectory(), destFile))); + try { + request.setDestinationInExternalFilesDir(getApplicationContext(), null, destFile); + } catch (IllegalStateException e) { + request.setDestinationUri(Uri.fromFile(new File(Environment + .getExternalStorageDirectory(), destFile))); + } } catch (MalformedURLException e) { throw new RuntimeException(e); } downloadManager.enqueue(request); + downloadButton.setText("X"); } }