X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=src%2Fcom%2Fhughes%2Fandroid%2Fdictionary%2FDictionaryManagerActivity.java;h=869bc335999ff9d953c27793d7fe347cd7672d06;hb=fd81d71fac2fa1c1a456ae4ab51783ebcd260b18;hp=6d76954eb3dc0e6c622746ff737b902c7bbfdf16;hpb=58807b7b22655608de8969fc9fe5fd5653eb731b;p=Dictionary.git diff --git a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java index 6d76954..869bc33 100644 --- a/src/com/hughes/android/dictionary/DictionaryManagerActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryManagerActivity.java @@ -70,6 +70,7 @@ import android.widget.ToggleButton; import com.hughes.android.dictionary.DictionaryInfo.IndexInfo; import com.hughes.android.util.IntentLauncher; +import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -78,6 +79,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -185,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; - OutputStream 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(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 + ": " + e.getMessage()); + 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); @@ -279,14 +288,16 @@ public class DictionaryManagerActivity extends ActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { - // This must be first, otherwise the actiona bar doesn't get + DictionaryApplication.INSTANCE.init(getApplicationContext()); + application = DictionaryApplication.INSTANCE; + // This must be first, otherwise the action bar doesn't get // styled properly. - setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId); + setTheme(application.getSelectedTheme().themeId); super.onCreate(savedInstanceState); Log.d(LOG, "onCreate:" + this); - application = (DictionaryApplication) getApplication(); + setTheme(application.getSelectedTheme().themeId); blockAutoLaunch = false; @@ -330,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() { @@ -385,16 +404,24 @@ public class DictionaryManagerActivity extends ActionBarActivity { unregisterReceiver(broadcastReceiver); } - private static int copyStream(final InputStream in, final OutputStream out) + private static void copyStream(final InputStream ins, final FileOutputStream outs) throws IOException { + ByteBuffer buf = ByteBuffer.allocateDirect(1024 * 64); + FileChannel out = outs.getChannel(); int bytesRead; - final byte[] bytes = new byte[1024 * 16]; - while ((bytesRead = in.read(bytes)) != -1) { - out.write(bytes, 0, bytesRead); - } - in.close(); - out.close(); - return bytesRead; + int pos = 0; + final byte[] bytes = new byte[1024 * 64]; + do { + bytesRead = ins.read(bytes, pos, bytes.length - pos); + if (bytesRead != -1) pos += bytesRead; + if (bytesRead == -1 ? pos != 0 : 2*pos >= bytes.length) { + buf.put(bytes, 0, pos); + pos = 0; + buf.flip(); + while (buf.hasRemaining()) out.write(buf); + buf.clear(); + } + } while (bytesRead != -1); } @Override @@ -650,8 +677,8 @@ public class DictionaryManagerActivity extends ActionBarActivity { builder.append(getString(R.string.updateAvailable)); } for (IndexInfo indexInfo : sortedIndexInfos) { - final View button = application.createButton(buttons.getContext(), dictionaryInfo, - indexInfo); + final View button = IsoUtils.INSTANCE.createButton(buttons.getContext(), dictionaryInfo, + indexInfo, application.languageButtonPixels); buttons.addView(button); if (canLaunch) { @@ -711,8 +738,9 @@ public class DictionaryManagerActivity extends ActionBarActivity { // 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, R.string.downloadManagerQueryFailed)) + .setMessage(getString(R.string.downloadFailed, msg)) .setNeutralButton("Close", null).show(); return; }