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;
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;
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);
+ 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);
@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;
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() {
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
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) {
// 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;
}