From ca0becd6bc2bb0fa98925ffc6fa1b26964129c89 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Reimar=20D=C3=B6ffinger?= Date: Sun, 20 Aug 2017 15:51:45 +0200 Subject: [PATCH] Support installing local dictionary zip files. Has app show up as an open option from e.g. browser. --- AndroidManifest.xml | 67 +++++++++++ Util | 2 +- .../dictionary/DictionaryManagerActivity.java | 106 ++++++++++-------- 3 files changed, 128 insertions(+), 47 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 945d192..b57203f 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -44,6 +44,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -94,13 +149,25 @@ android:host="*" android:mimeType="application/octet-stream" android:pathPattern=".*\\.quickdic" /> + + + + + + + + + + + + diff --git a/Util b/Util index 1f1b243..a7bfc9e 160000 --- a/Util +++ b/Util @@ -1 +1 @@ -Subproject commit 1f1b243cb81d95167abba1c9005d7ae61f6d70fe +Subproject commit a7bfc9e9fe94486a358662b650078c5a2b9d73ea diff --git a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java index 1b27dbe..833429a 100644 --- a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java @@ -188,59 +188,65 @@ public class DictionaryManagerActivity extends ActionBarActivity { Toast.makeText(context, getString(R.string.unzippingDictionary, dest), Toast.LENGTH_LONG).show(); - - final Uri zipUri = Uri.parse(dest); - File localZipFile = null; - InputStream zipFileStream = null; - ZipInputStream zipFile = null; - FileOutputStream zipOut = null; - try { - if (zipUri.getScheme().equals("content")) { - zipFileStream = context.getContentResolver().openInputStream(zipUri); - localZipFile = null; - } else { - localZipFile = new File(zipUri.getPath()); - zipFileStream = new FileInputStream(localZipFile); - } - zipFile = new ZipInputStream(new BufferedInputStream(zipFileStream)); - final ZipEntry zipEntry = zipFile.getNextEntry(); - Log.d(LOG, "Unzipping entry: " + zipEntry.getName()); - 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()); - } - zipOut = new FileOutputStream(targetFile); - copyStream(zipFile, zipOut); - application.backgroundUpdateDictionaries(dictionaryUpdater); - Toast.makeText(context, getString(R.string.installationFinished, dest), - Toast.LENGTH_LONG).show(); + if (unzipInstall(context, Uri.parse(dest), dest)) { finishedDownloadIds.add(downloadId); Log.w(LOG, "Unzipping finished: " + dest + " Id: " + downloadId); - } 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 { - try { - if (zipOut != null) zipOut.close(); - } catch (IOException e) {} - try { - if (zipFile != null) zipFile.close(); - } catch (IOException e) {} - try { - if (zipFileStream != null) zipFileStream.close(); - } catch (IOException e) {} - if (localZipFile != null) localZipFile.delete(); } } } }; + private boolean unzipInstall(Context context, Uri zipUri, String dest) { + File localZipFile = null; + InputStream zipFileStream = null; + ZipInputStream zipFile = null; + FileOutputStream zipOut = null; + boolean result = false; + try { + if (zipUri.getScheme().equals("content")) { + zipFileStream = context.getContentResolver().openInputStream(zipUri); + localZipFile = null; + } else { + localZipFile = new File(zipUri.getPath()); + zipFileStream = new FileInputStream(localZipFile); + } + zipFile = new ZipInputStream(new BufferedInputStream(zipFileStream)); + final ZipEntry zipEntry = zipFile.getNextEntry(); + Log.d(LOG, "Unzipping entry: " + zipEntry.getName()); + 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()); + } + zipOut = new FileOutputStream(targetFile); + copyStream(zipFile, zipOut); + application.backgroundUpdateDictionaries(dictionaryUpdater); + Toast.makeText(context, getString(R.string.installationFinished, dest), + Toast.LENGTH_LONG).show(); + result = true; + } 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 { + try { + if (zipOut != null) zipOut.close(); + } catch (IOException e) {} + try { + if (zipFile != null) zipFile.close(); + } catch (IOException e) {} + try { + if (zipFileStream != null) zipFileStream.close(); + } catch (IOException e) {} + if (localZipFile != null) localZipFile.delete(); + } + return result; + } + public static Intent getLaunchIntent(Context c) { final Intent intent = new Intent(c, DictionaryManagerActivity.class); intent.putExtra(C.CAN_AUTO_LAUNCH_DICT, false); @@ -335,6 +341,14 @@ public class DictionaryManagerActivity extends ActionBarActivity { readableCheckAndError(true); onCreateSetupActionBar(); + + final Intent intent = getIntent(); + if (intent != null && intent.getAction() != null && + intent.getAction().equals(Intent.ACTION_VIEW)) { + blockAutoLaunch = true; + Uri uri = intent.getData(); + unzipInstall(this, uri, uri.getLastPathSegment()); + } } private void onCreateSetupActionBar() { -- 2.43.0