X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryManagerActivity.java;h=dacc6d75cd2c806fc72317d2c96b78cec0a9731c;hb=4f0e2b9302b6c3921e444467bb295f0ed6db1b99;hp=c1f276675ad7b31785419fd451bc7b274ea9b603;hpb=b0c56efc2f415f82e717b59c7aa2218785bf02f0;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java index c1f2766..dacc6d7 100644 --- a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java @@ -14,6 +14,7 @@ package com.hughes.android.dictionary; +import android.app.AlertDialog; import android.app.DownloadManager; import android.app.DownloadManager.Request; import android.content.BroadcastReceiver; @@ -28,24 +29,33 @@ 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; +import android.view.inputmethod.EditorInfo; +import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.BaseAdapter; import android.widget.Button; 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.SherlockListActivity; -import com.actionbarsherlock.view.Menu; -import com.actionbarsherlock.view.MenuInflater; -import com.actionbarsherlock.widget.SearchView; -import com.actionbarsherlock.widget.SearchView.OnQueryTextListener; import com.hughes.android.dictionary.DictionaryInfo.IndexInfo; import com.hughes.android.util.IntentLauncher; @@ -61,19 +71,30 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -// Filters // 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; -// Adapter adapter; - // EditText filterText; SearchView filterSearchView; ToggleButton showDownloadable; @@ -81,7 +102,7 @@ public class DictionaryManagerActivity extends SherlockListActivity { LinearLayout downloadableDictionariesHeaderRow; Handler uiHandler; - + Runnable dictionaryUpdater = new Runnable() { @Override public void run() { @@ -91,21 +112,97 @@ public class DictionaryManagerActivity extends SherlockListActivity { uiHandler.post(new Runnable() { @Override public void run() { - setListAdapater(); + setMyListAdapater(); } }); } }; - public static Intent getLaunchIntent() { - final Intent intent = new Intent(); - intent.setClassName(DictionaryManagerActivity.class.getPackage().getName(), - DictionaryManagerActivity.class.getName()); + final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + + if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { + final long downloadId = intent.getLongExtra( + DownloadManager.EXTRA_DOWNLOAD_ID, 0); + final DownloadManager.Query query = new DownloadManager.Query(); + query.setFilterById(downloadId); + final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + final Cursor cursor = downloadManager.query(query); + + if (cursor == null || !cursor.moveToFirst()) { + Log.e(LOG, "Couldn't find download."); + return; + } + + final String dest = cursor + .getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); + final int status = cursor + .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=" + 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; + } + + Log.w(LOG, "Download finished: " + dest); + Toast.makeText(context, getString(R.string.unzippingDictionary, dest), + Toast.LENGTH_LONG).show(); + + + final File localZipFile = new File(Uri.parse(dest).getPath()); + try { + ZipFile zipFile = new ZipFile(localZipFile); + final ZipEntry zipEntry = zipFile.entries().nextElement(); + Log.d(LOG, "Unzipping entry: " + zipEntry.getName()); + 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 = new File(application.getDictDir(), zipEntry.getName()); + } + final OutputStream zipOut = new FileOutputStream(targetFile); + copyStream(zipIn, zipOut); + zipFile.close(); + application.backgroundUpdateDictionaries(dictionaryUpdater); + Toast.makeText(context, getString(R.string.installationFinished, dest), + Toast.LENGTH_LONG).show(); + } catch (Exception e) { + 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(); + } + } + } + }; + + 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); @@ -113,119 +210,110 @@ public class DictionaryManagerActivity extends SherlockListActivity { application = (DictionaryApplication) getApplication(); + blockAutoLaunch = false; + // UI init. setContentView(R.layout.dictionary_manager_activity); - dictionariesOnDeviceHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate( - R.layout.dictionaries_on_device_header_row, getListView(), false); - - downloadableDictionariesHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate( - R.layout.downloadable_dictionaries_header_row, getListView(), false); - - // filterText = (EditText) findViewById(R.id.filterText); - // - // filterText.addTextChangedListener(new TextWatcher() { - // @Override - // public void onTextChanged(CharSequence s, int start, int before, int - // count) { - // } - // - // @Override - // public void beforeTextChanged(CharSequence s, int start, int count, - // int after) { - // } - // - // @Override - // public void afterTextChanged(Editable s) { - // onFilterTextChanged(); - // } - // }); - - // final ImageButton clearSearchText = (ImageButton) - // findViewById(R.id.ClearSearchTextButton); - // clearSearchText.setOnClickListener(new View.OnClickListener() { - // @Override - // public void onClick(View arg0) { - // filterText.setText(""); - // filterText.requestFocus(); - // } - // }); - - showDownloadable = (ToggleButton) downloadableDictionariesHeaderRow.findViewById(R.id.hideDownloadable); + dictionariesOnDeviceHeaderRow = (LinearLayout) LayoutInflater.from( + getListView().getContext()).inflate( + R.layout.dictionary_manager_header_row_on_device, getListView(), false); + + downloadableDictionariesHeaderRow = (LinearLayout) LayoutInflater.from( + getListView().getContext()).inflate( + R.layout.dictionary_manager_header_row_downloadable, getListView(), false); + + showDownloadable = (ToggleButton) downloadableDictionariesHeaderRow + .findViewById(R.id.hideDownloadable); showDownloadable.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - onShowLocalChanged(); + onShowDownloadableChanged(); } }); - // ContextMenu. - // registerForContextMenu(getListView()); - - blockAutoLaunch = false; final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); final String thanksForUpdatingLatestVersion = getString(R.string.thanksForUpdatingVersion); 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(); } - - BroadcastReceiver receiver = new BroadcastReceiver() { + + registerReceiver(broadcastReceiver, new IntentFilter( + DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + + setMyListAdapater(); + registerForContextMenu(getListView()); + + final File dictDir = application.getDictDir(); + if (!dictDir.canRead() || !dictDir.canExecute()) { + blockAutoLaunch = true; + + AlertDialog.Builder builder = new AlertDialog.Builder(getListView().getContext()); + builder.setTitle(getString(R.string.error)); + builder.setMessage(getString( + R.string.unableToReadDictionaryDir, + dictDir.getAbsolutePath(), + Environment.getExternalStorageDirectory())); + builder.setNeutralButton("Close", null); + builder.create().show(); + } + + onCreateSetupActionBar(); + } + + private void onCreateSetupActionBar() { + ActionBar actionBar = getSupportActionBar(); + actionBar.setDisplayShowTitleEnabled(false); + + filterSearchView = new SearchView(getSupportActionBar().getThemedContext()); + filterSearchView.setIconifiedByDefault(false); + // filterSearchView.setIconified(false); // puts the magnifying glass in + // the + // wrong place. + filterSearchView.setQueryHint(getString(R.string.searchText)); + filterSearchView.setSubmitButtonEnabled(false); + final int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, + getResources().getDisplayMetrics()); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(width, + FrameLayout.LayoutParams.WRAP_CONTENT); + filterSearchView.setLayoutParams(lp); + filterSearchView.setImeOptions( + EditorInfo.IME_ACTION_SEARCH | + EditorInfo.IME_FLAG_NO_EXTRACT_UI | + EditorInfo.IME_FLAG_NO_ENTER_ACTION | + // EditorInfo.IME_FLAG_NO_FULLSCREEN | // Requires API + // 11 + EditorInfo.IME_MASK_ACTION | + EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS); + + filterSearchView.setOnQueryTextListener(new OnQueryTextListener() { @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { - final long downloadId = intent.getLongExtra( - DownloadManager.EXTRA_DOWNLOAD_ID, 0); - final DownloadManager.Query query = new DownloadManager.Query(); - query.setFilterById(downloadId); - final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); - final Cursor cursor = downloadManager.query(query); - - if (!cursor.moveToFirst()) { - Log.e(LOG, "Couldn't find download."); - return; - } - - final int status = cursor - .getInt(cursor - .getColumnIndex(DownloadManager.COLUMN_STATUS)); - if (DownloadManager.STATUS_SUCCESSFUL != status){ - Log.w(LOG, "Download failed: status=" + status + ", reason=" + cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_REASON))); - return; - } + public boolean onQueryTextSubmit(String query) { + return true; + } - final String dest = cursor - .getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); - Log.w(LOG, "Download finished: " + dest); - final File destFile = new File(Uri.parse(dest).getPath()); - - try { - ZipFile zipFile = new ZipFile(destFile); - final ZipEntry zipEntry = zipFile.entries().nextElement(); - Log.d(LOG, "Unzipping entry: " + zipEntry.getName()); - final InputStream zipIn = zipFile.getInputStream(zipEntry); - final OutputStream zipOut = new FileOutputStream(new File(application.getDictDir(), zipEntry.getName())); - copyStream(zipIn, zipOut); - destFile.delete(); - zipFile.close(); - application.backgroundUpdateDictionaries(dictionaryUpdater); - } catch (Exception e) { - Log.e(LOG, "Failed to unzip.", e); - } - } + @Override + public boolean onQueryTextChange(String filterText) { + setMyListAdapater(); + return true; } - }; - - registerReceiver(receiver, new IntentFilter( - DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - - setListAdapater(); + }); + filterSearchView.setFocusable(true); + + actionBar.setCustomView(filterSearchView); + actionBar.setDisplayShowCustomEnabled(true); + } + + @Override + public void onDestroy() { + super.onDestroy(); + unregisterReceiver(broadcastReceiver); } - + private static int copyStream(final InputStream in, final OutputStream out) throws IOException { int bytesRead; @@ -261,20 +349,21 @@ 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( - new File(prefs.getString(C.DICT_FILE, "")), prefs.getString(C.INDEX_SHORT_NAME, ""), + startActivity(DictionaryActivity.getLaunchIntent(getApplicationContext(), + new File(prefs.getString(C.DICT_FILE, "")), + prefs.getString(C.INDEX_SHORT_NAME, ""), prefs.getString(C.SEARCH_TOKEN, ""))); finish(); return; } - + // Remove the active dictionary from the prefs so we won't autolaunch // next time. final Editor editor = prefs.edit(); @@ -285,121 +374,80 @@ public class DictionaryManagerActivity extends SherlockListActivity { application.backgroundUpdateDictionaries(dictionaryUpdater); - setListAdapater(); + setMyListAdapater(); } @Override public boolean onCreateOptionsMenu(final Menu menu) { - MenuInflater inflater = getSupportMenuInflater(); - inflater.inflate(R.menu.dictionary_manager_options_menu, menu); - - filterSearchView = (SearchView) menu.findItem(R.id.filterText).getActionView(); - filterSearchView.setOnQueryTextListener(new OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String query) { - return true; - } - - @Override - public boolean onQueryTextChange(String filterText) { - setListAdapater(); - return true; - } - }); - filterSearchView.setIconifiedByDefault(false); - application.onCreateGlobalOptionsMenu(this, menu); return true; } - // @Override - // public void onCreateContextMenu(final ContextMenu menu, final View - // view, - // final ContextMenuInfo menuInfo) { - // super.onCreateContextMenu(menu, view, menuInfo); - // - // final AdapterContextMenuInfo adapterContextMenuInfo = - // (AdapterContextMenuInfo) menuInfo; - // final int position = adapterContextMenuInfo.position; - // final DictionaryInfo dictionaryInfo = adapter.getItem(position); - // - // if (position > 0 && - // application.isDictionaryOnDevice(dictionaryInfo.uncompressedFilename)) - // { - // final android.view.MenuItem moveToTopMenuItem = - // menu.add(R.string.moveToTop); - // moveToTopMenuItem.setOnMenuItemClickListener(new - // android.view.MenuItem.OnMenuItemClickListener() { - // @Override - // public boolean onMenuItemClick(android.view.MenuItem item) { - // application.moveDictionaryToTop(dictionaryInfo); - // setListAdapter(adapter = new Adapter()); - // return true; - // } - // }); - // } -// -// final android.view.MenuItem deleteMenuItem = menu.add(R.string.deleteDictionary); -// deleteMenuItem -// .setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { -// @Override -// public boolean onMenuItemClick(android.view.MenuItem item) { -// application.deleteDictionary(dictionaryInfo); -// setListAdapter(adapter = new Adapter()); -// return true; -// } -// }); -// -// final DictionaryInfo downloadable = application -// .getDownloadable(dictionaryInfo.uncompressedFilename); -// if (downloadable != null) { -// final android.view.MenuItem downloadMenuItem = menu.add(getString( -// R.string.downloadButton, downloadable.zipBytes / 1024.0 / 1024.0)); -// downloadMenuItem -// .setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { -// @Override -// public boolean onMenuItemClick(android.view.MenuItem item) { -// final Intent intent = getDownloadIntent(downloadable); -// startActivity(intent); -// setListAdapter(adapter = new Adapter()); -// return true; -// } -// }); -// } -// -// } + @Override + public void onCreateContextMenu(final ContextMenu menu, final View view, + final ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, view, menuInfo); + Log.d(LOG, "onCreateContextMenu, " + menuInfo); + + final AdapterContextMenuInfo adapterContextMenuInfo = + (AdapterContextMenuInfo) menuInfo; + final int position = adapterContextMenuInfo.position; + final MyListAdapter.Row row = (MyListAdapter.Row) getListAdapter().getItem(position); + + if (row.dictionaryInfo == null) { + return; + } + + if (position > 0 && row.onDevice) { + final android.view.MenuItem moveToTopMenuItem = + menu.add(R.string.moveToTop); + moveToTopMenuItem.setOnMenuItemClickListener(new + android.view.MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + application.moveDictionaryToTop(row.dictionaryInfo); + setMyListAdapater(); + return true; + } + }); + } + + if (row.onDevice) { + final android.view.MenuItem deleteMenuItem = menu.add(R.string.deleteDictionary); + deleteMenuItem + .setOnMenuItemClickListener(new android.view.MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + application.deleteDictionary(row.dictionaryInfo); + setMyListAdapater(); + return true; + } + }); + } + } - private void onShowLocalChanged() { -// downloadableDictionaries.setVisibility(showDownloadable.isChecked() ? View.GONE -// : View.VISIBLE); - setListAdapater(); + private void onShowDownloadableChanged() { + setMyListAdapater(); Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit(); prefs.putBoolean(C.SHOW_DOWNLOADABLE, showDownloadable.isChecked()); prefs.commit(); } - // private void onClick(int index) { - // final DictionaryInfo dictionaryInfo = adapter.getItem(index); - // final DictionaryInfo downloadable = - // application.getDownloadable(dictionaryInfo.uncompressedFilename); - // if - // (!application.isDictionaryOnDevice(dictionaryInfo.uncompressedFilename) - // && downloadable != null) { - // final Intent intent = getDownloadIntent(downloadable); - // startActivity(intent); - // } else { - // final Intent intent = - // DictionaryActivity.getLaunchIntent(application.getPath(dictionaryInfo.uncompressedFilename), - // 0, ""); - // startActivity(intent); - // } - // } - class MyListAdapter extends BaseAdapter { - + List dictionariesOnDevice; List downloadableDictionaries; - + + class Row { + DictionaryInfo dictionaryInfo; + boolean onDevice; + + private Row(DictionaryInfo dictinoaryInfo, boolean onDevice) { + this.dictionaryInfo = dictinoaryInfo; + this.onDevice = onDevice; + } + } + private MyListAdapter(final String[] filters) { dictionariesOnDevice = application.getDictionariesOnDevice(filters); if (showDownloadable.isChecked()) { @@ -415,8 +463,24 @@ public class DictionaryManagerActivity extends SherlockListActivity { } @Override - public Object getItem(int position) { - return Integer.valueOf(position); + public Row getItem(int position) { + if (position == 0) { + return new Row(null, true); + } + position -= 1; + + if (position < dictionariesOnDevice.size()) { + return new Row(dictionariesOnDevice.get(position), true); + } + position -= dictionariesOnDevice.size(); + + if (position == 0) { + return new Row(null, false); + } + position -= 1; + + assert position < downloadableDictionaries.size(); + return new Row(downloadableDictionaries.get(position), false); } @Override @@ -426,88 +490,91 @@ public class DictionaryManagerActivity extends SherlockListActivity { @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView instanceof LinearLayout && - convertView != dictionariesOnDeviceHeaderRow && + if (convertView instanceof LinearLayout && + convertView != dictionariesOnDeviceHeaderRow && convertView != downloadableDictionariesHeaderRow) { - ((LinearLayout)convertView).removeAllViews(); + /* + * This is done to try to avoid leaking memory that used to + * happen on Android 4.0.3 + */ + ((LinearLayout) convertView).removeAllViews(); } - // Dictionaries on device. - if (position == 0) { - return dictionariesOnDeviceHeaderRow; - } - --position; - - if (position < dictionariesOnDevice.size()) { - return createDictionaryRow(dictionariesOnDevice.get(position), - parent, R.layout.dictionaries_on_device_row, true); + + final Row row = getItem(position); + + if (row.onDevice) { + if (row.dictionaryInfo == null) { + return dictionariesOnDeviceHeaderRow; + } + return createDictionaryRow(row.dictionaryInfo, parent, true); } - position -= dictionariesOnDevice.size(); - - // Downloadable dictionaries. - if (position == 0) { + + if (row.dictionaryInfo == null) { return downloadableDictionariesHeaderRow; } - --position; - - assert position < downloadableDictionaries.size(); - return createDictionaryRow(downloadableDictionaries.get(position), - parent, R.layout.downloadable_dictionary_row, false); + return createDictionaryRow(row.dictionaryInfo, parent, false); } - + } - - private void setListAdapater() { - final String filter = filterSearchView == null ? "" : filterSearchView.getQuery().toString(); + private void setMyListAdapater() { + final String filter = filterSearchView == null ? "" : filterSearchView.getQuery() + .toString(); final String[] filters = filter.trim().toLowerCase().split("(\\s|-)+"); setListAdapter(new MyListAdapter(filters)); } - private View createDictionaryRow(final DictionaryInfo dictionaryInfo, final ViewGroup parent, - final int viewResource, final boolean canLaunch) { - + private View createDictionaryRow(final DictionaryInfo dictionaryInfo, + final ViewGroup parent, boolean canLaunch) { + View row = LayoutInflater.from(parent.getContext()).inflate( - viewResource, parent, false); + R.layout.dictionary_manager_row, parent, false); final TextView name = (TextView) row.findViewById(R.id.dictionaryName); final TextView details = (TextView) row.findViewById(R.id.dictionaryDetails); name.setText(application.getDictionaryName(dictionaryInfo.uncompressedFilename)); - if (!canLaunch) { - final Button downloadButton = (Button) row.findViewById(R.id.downloadButton); - downloadButton.setText(getString(R.string.downloadButton, dictionaryInfo.zipBytes / 1024.0 / 1024.0)); + final boolean updateAvailable = application.updateAvailable(dictionaryInfo); + final Button downloadButton = (Button) row.findViewById(R.id.downloadButton); + 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, + downloadable.zipBytes / 1024.0 / 1024.0)); downloadButton.setMinWidth(application.languageButtonPixels * 3 / 2); downloadButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { - DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); - Request request = new Request( - Uri.parse(dictionaryInfo.downloadUrl)); - try { - final String destFile = new File(new URL(dictionaryInfo.downloadUrl).getFile()).getName(); - Log.d(LOG, "Downloading to: " + destFile); - - request.setDestinationUri(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), destFile))); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - downloadManager.enqueue(request); + downloadDictionary(downloadable.downloadUrl, downloadable.zipBytes, downloadButton); } }); + } else { + downloadButton.setVisibility(View.INVISIBLE); } - final StringBuilder builder = new StringBuilder(); LinearLayout buttons = (LinearLayout) row.findViewById(R.id.dictionaryLauncherButtons); - final List sortedIndexInfos = application.sortedIndexInfos(dictionaryInfo.indexInfos); + final List sortedIndexInfos = application + .sortedIndexInfos(dictionaryInfo.indexInfos); + final StringBuilder builder = new StringBuilder(); + if (updateAvailable) { + builder.append(getString(R.string.updateAvailable)); + } for (IndexInfo indexInfo : sortedIndexInfos) { - final View button = application.createButton(buttons.getContext(), dictionaryInfo, indexInfo); + final View button = application.createButton(buttons.getContext(), dictionaryInfo, + indexInfo); buttons.addView(button); - + if (canLaunch) { button.setOnClickListener( - new IntentLauncher(buttons.getContext(), - DictionaryActivity.getLaunchIntent( - application.getPath(dictionaryInfo.uncompressedFilename), - indexInfo.shortName, ""))); + new IntentLauncher(buttons.getContext(), + DictionaryActivity.getLaunchIntent(getApplicationContext(), + application.getPath(dictionaryInfo.uncompressedFilename), + indexInfo.shortName, ""))); } else { button.setEnabled(false); @@ -515,11 +582,82 @@ public class DictionaryManagerActivity extends SherlockListActivity { if (builder.length() != 0) { builder.append("; "); } - builder.append(getString(R.string.indexInfo, indexInfo.shortName, indexInfo.mainTokenCount)); + 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(getApplicationContext(), + application.getPath(dictionaryInfo.uncompressedFilename), + dictionaryInfo.indexInfos.get(0).shortName, ""))); + row.setFocusable(true); + row.setLongClickable(true); + } + row.setBackgroundResource(android.R.drawable.menuitem_background); + return row; } + 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(downloadUrl)); + try { + final String destFile = new File(new URL(downloadUrl).getFile()) + .getName(); + Log.d(LOG, "Downloading to: " + 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"); + } + }