X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryManagerActivity.java;h=8cbcb537a2dd955b1edf849d8e741701986d3801;hb=72600db6412b4be173c31a53b4e742dc586cffae;hp=3ca7a6d9a8b1c6a5826fcb92fbb3c7f636a5049a;hpb=83d497f704ad1f8ba85190255d46a3fbe0e3c353;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java index 3ca7a6d..8cbcb53 100644 --- a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java @@ -19,7 +19,6 @@ import android.app.AlertDialog; import android.app.DownloadManager; import android.app.DownloadManager.Request; import android.content.BroadcastReceiver; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -33,17 +32,17 @@ import android.os.Environment; import android.os.Handler; import android.preference.PreferenceManager; import android.provider.Settings; +import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBar; -import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; import android.support.v7.widget.SearchView.OnQueryTextListener; import android.support.v7.widget.Toolbar; import android.text.InputType; import android.util.Log; -import android.util.TypedValue; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; @@ -53,7 +52,6 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.BaseAdapter; import android.widget.Button; @@ -77,7 +75,6 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import java.nio.ByteBuffer; @@ -87,16 +84,15 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; // Right-click: // Delete, move to top. -public class DictionaryManagerActivity extends ActionBarActivity { +public class DictionaryManagerActivity extends AppCompatActivity { - static final String LOG = "QuickDic"; - static boolean blockAutoLaunch = false; + private static final String LOG = "QuickDic"; + private static boolean blockAutoLaunch = false; private ListView listView; private ListView getListView() { @@ -113,19 +109,19 @@ public class DictionaryManagerActivity extends ActionBarActivity { } // For DownloadManager bug workaround - private Set finishedDownloadIds = new HashSet(); + private final Set finishedDownloadIds = new HashSet<>(); - DictionaryApplication application; + private DictionaryApplication application; - SearchView filterSearchView; - ToggleButton showDownloadable; + private SearchView filterSearchView; + private ToggleButton showDownloadable; - LinearLayout dictionariesOnDeviceHeaderRow; - LinearLayout downloadableDictionariesHeaderRow; + private LinearLayout dictionariesOnDeviceHeaderRow; + private LinearLayout downloadableDictionariesHeaderRow; - Handler uiHandler; + private Handler uiHandler; - Runnable dictionaryUpdater = new Runnable() { + private final Runnable dictionaryUpdater = new Runnable() { @Override public void run() { if (uiHandler == null) { @@ -134,17 +130,20 @@ public class DictionaryManagerActivity extends ActionBarActivity { uiHandler.post(new Runnable() { @Override public void run() { - setMyListAdapater(); + setMyListAdapter(); } }); } }; - final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { + private final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public synchronized void onReceive(Context context, Intent intent) { final String action = intent.getAction(); + if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { + startActivity(DictionaryManagerActivity.getLaunchIntent(getApplicationContext()).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)); + } if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { final long downloadId = intent.getLongExtra( DownloadManager.EXTRA_DOWNLOAD_ID, 0); @@ -267,7 +266,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { return intent; } - public void readableCheckAndError(boolean requestPermission) { + private void readableCheckAndError(boolean requestPermission) { final File dictDir = application.getDictDir(); if (dictDir.canRead() && dictDir.canExecute()) return; blockAutoLaunch = true; @@ -292,12 +291,12 @@ public class DictionaryManagerActivity extends ActionBarActivity { } @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { readableCheckAndError(false); application.backgroundUpdateDictionaries(dictionaryUpdater); - setMyListAdapater(); + setMyListAdapter(); } @Override @@ -344,11 +343,11 @@ public class DictionaryManagerActivity extends ActionBarActivity { prefs.edit().putString(C.THANKS_FOR_UPDATING_VERSION, thanksForUpdatingLatestVersion) .commit(); } + IntentFilter downloadManagerIntents = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); + downloadManagerIntents.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED); + registerReceiver(broadcastReceiver, downloadManagerIntents); - registerReceiver(broadcastReceiver, new IntentFilter( - DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - - setMyListAdapater(); + setMyListAdapter(); registerForContextMenu(getListView()); getListView().setItemsCanFocus(true); @@ -398,7 +397,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { @Override public boolean onQueryTextChange(String filterText) { - setMyListAdapater(); + setMyListAdapter(); return true; } }); @@ -482,7 +481,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { application.backgroundUpdateDictionaries(dictionaryUpdater); - setMyListAdapater(); + setMyListAdapter(); } @Override @@ -496,7 +495,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { sort.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { public boolean onMenuItemClick(final MenuItem menuItem) { application.sortDictionaries(); - setMyListAdapater(); + setMyListAdapter(); return true; } }); @@ -540,7 +539,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { @Override public boolean onMenuItemClick(android.view.MenuItem item) { application.moveDictionaryToTop(row.dictionaryInfo); - setMyListAdapater(); + setMyListAdapter(); return true; } }); @@ -553,7 +552,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { @Override public boolean onMenuItemClick(android.view.MenuItem item) { application.deleteDictionary(row.dictionaryInfo); - setMyListAdapater(); + setMyListAdapter(); return true; } }); @@ -561,7 +560,7 @@ public class DictionaryManagerActivity extends ActionBarActivity { } private void onShowDownloadableChanged() { - setMyListAdapater(); + setMyListAdapter(); Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit(); prefs.putBoolean(C.SHOW_DOWNLOADABLE, showDownloadable.isChecked()); prefs.commit(); @@ -569,12 +568,12 @@ public class DictionaryManagerActivity extends ActionBarActivity { class MyListAdapter extends BaseAdapter { - List dictionariesOnDevice; - List downloadableDictionaries; + final List dictionariesOnDevice; + final List downloadableDictionaries; class Row { - DictionaryInfo dictionaryInfo; - boolean onDevice; + final DictionaryInfo dictionaryInfo; + final boolean onDevice; private Row(DictionaryInfo dictionaryInfo, boolean onDevice) { this.dictionaryInfo = dictionaryInfo; @@ -655,13 +654,53 @@ public class DictionaryManagerActivity extends ActionBarActivity { } - private void setMyListAdapater() { + private void setMyListAdapter() { final String filter = filterSearchView == null ? "" : filterSearchView.getQuery() .toString(); final String[] filters = filter.trim().toLowerCase().split("(\\s|-)+"); setListAdapter(new MyListAdapter(filters)); } + private boolean isDownloadActive(String downloadUrl, boolean cancel) { + 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) { + if (cancel) { + String msg = getString(R.string.downloadManagerQueryFailed); + new AlertDialog.Builder(DictionaryManagerActivity.this).setTitle(getString(R.string.error)) + .setMessage(getString(R.string.downloadFailed, msg)) + .setNeutralButton("Close", null).show(); + } + return cancel; + } + + String destFile; + try { + destFile = new File(new URL(downloadUrl).getPath()).getName(); + } catch (MalformedURLException e) { + throw new RuntimeException("Invalid download URL!", e); + } + while (cursor.moveToNext()) { + if (downloadUrl.equals(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)))) + break; + if (destFile.equals(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)))) + break; + } + boolean active = !cursor.isAfterLast(); + if (active && cancel) { + long downloadId = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)); + finishedDownloadIds.add(downloadId); + downloadManager.remove(downloadId); + } + cursor.close(); + return active; + } + private View createDictionaryRow(final DictionaryInfo dictionaryInfo, final ViewGroup parent, View row, boolean canLaunch) { @@ -694,6 +733,9 @@ public class DictionaryManagerActivity extends ActionBarActivity { } }); downloadButton.setVisibility(View.VISIBLE); + + if (isDownloadActive(downloadable.downloadUrl, false)) + downloadButton.setText("X"); } else { downloadButton.setVisibility(View.GONE); } @@ -716,8 +758,8 @@ public class DictionaryManagerActivity extends ActionBarActivity { continue; } final IndexInfo indexInfo = sortedIndexInfos.get(i); - final View button = IsoUtils.INSTANCE.setupButton(textButton, imageButton, dictionaryInfo, - indexInfo, application.languageButtonPixels); + final View button = IsoUtils.INSTANCE.setupButton(textButton, imageButton, + indexInfo); if (canLaunch) { button.setOnClickListener( @@ -760,49 +802,24 @@ public class DictionaryManagerActivity extends ActionBarActivity { } private synchronized void downloadDictionary(final String downloadUrl, long bytes, Button downloadButton) { - String destFile; - try { - destFile = new File(new URL(downloadUrl).getPath()).getName(); - } catch (MalformedURLException e) { - throw new RuntimeException("Invalid download URL!", e); - } - 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) { - String msg = getString(R.string.downloadManagerQueryFailed); - new AlertDialog.Builder(DictionaryManagerActivity.this).setTitle(getString(R.string.error)) - .setMessage(getString(R.string.downloadFailed, msg)) - .setNeutralButton("Close", null).show(); - return; - } - - while (cursor.moveToNext()) { - if (downloadUrl.equals(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_URI)))) - break; - if (destFile.equals(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)))) - break; - } - if (!cursor.isAfterLast()) { - downloadManager.remove(cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID))); + if (isDownloadActive(downloadUrl, true)) { downloadButton .setText(getString( R.string.downloadButton, bytes / 1024.0 / 1024.0)); - cursor.close(); return; } - cursor.close(); Request request = new Request( Uri.parse(downloadUrl)); + String destFile; + try { + destFile = new File(new URL(downloadUrl).getPath()).getName(); + } catch (MalformedURLException e) { + throw new RuntimeException("Invalid download URL!", e); + } Log.d(LOG, "Downloading to: " + destFile); request.setTitle(destFile); - File destFilePath = new File(application.getDictDir(), destFile); destFilePath.delete(); try { @@ -810,6 +827,8 @@ public class DictionaryManagerActivity extends ActionBarActivity { } catch (Exception e) { } + DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + try { downloadManager.enqueue(request); } catch (SecurityException e) {