package com.svox.pico.voice.ita.ita; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.app.Activity; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class InstallerActivity extends Activity { private static final int DATA_ROOT_DIRECTORY_REQUEST_CODE = 42; private String rootDirectory = ""; private InstallerActivity self; private static boolean sInstallationSuccess = false; private static boolean sIsInstalling = false; private final static Object sInstallerStateLock = new Object(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); self = this; Intent getRootDirectoryIntent = new Intent(); getRootDirectoryIntent.setClassName("com.svox.pico", "com.svox.pico.CheckVoiceData"); startActivityForResult(getRootDirectoryIntent, DATA_ROOT_DIRECTORY_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ super.onActivityResult(requestCode, resultCode, data); if (requestCode == DATA_ROOT_DIRECTORY_REQUEST_CODE) { rootDirectory = data.getStringExtra(TextToSpeech.Engine.EXTRA_VOICE_DATA_ROOT_DIRECTORY); // only run the installer if there isn't another one running synchronized (sInstallerStateLock) { if (!sIsInstalling && !sInstallationSuccess) { sIsInstalling = true; runInstaller(); } } } } private void runInstaller(){ try { Resources res = getResources(); AssetFileDescriptor langPackFd = res .openRawResourceFd(R.raw.svoxlangpack); InputStream stream = langPackFd.createInputStream(); (new Thread(new unzipper(stream))).start(); } catch (IOException e) { Log.e("PicoLangInstaller", "Unable to open langpack resource."); e.printStackTrace(); } setContentView(R.layout.installing); } private boolean unzipLangPack(InputStream stream) { FileOutputStream out; byte buf[] = new byte[16384]; try { ZipInputStream zis = new ZipInputStream(stream); ZipEntry entry = zis.getNextEntry(); while (entry != null) { if (entry.isDirectory()) { File newDir = new File(rootDirectory + entry.getName()); newDir.mkdir(); } else { String name = entry.getName(); File outputFile = new File(rootDirectory + name); String outputPath = outputFile.getCanonicalPath(); name = outputPath .substring(outputPath.lastIndexOf("/") + 1); outputPath = outputPath.substring(0, outputPath .lastIndexOf("/")); File outputDir = new File(outputPath); outputDir.mkdirs(); outputFile = new File(outputPath, name); outputFile.createNewFile(); out = new FileOutputStream(outputFile); int numread = 0; do { numread = zis.read(buf); if (numread <= 0) { break; } else { out.write(buf, 0, numread); } } while (true); out.close(); } entry = zis.getNextEntry(); } return true; } catch (IOException e) { e.printStackTrace(); return false; } } private class unzipper implements Runnable { public InputStream stream; public unzipper(InputStream is) { stream = is; } public void run() { boolean result = unzipLangPack(stream); synchronized (sInstallerStateLock) { sInstallationSuccess = result; sIsInstalling = false; } if (sInstallationSuccess) { // installation completed: signal success (extra set to SUCCESS) Intent installCompleteIntent = new Intent(TextToSpeech.Engine.ACTION_TTS_DATA_INSTALLED); installCompleteIntent.putExtra(TextToSpeech.Engine.EXTRA_TTS_DATA_INSTALLED, TextToSpeech.SUCCESS); self.sendBroadcast(installCompleteIntent); finish(); } else { // installation failed // signal install error if the activity is finishing (can't ask the user to retry) if (self.isFinishing()) { Intent installCompleteIntent = new Intent(TextToSpeech.Engine.ACTION_TTS_DATA_INSTALLED); installCompleteIntent.putExtra(TextToSpeech.Engine.EXTRA_TTS_DATA_INSTALLED, TextToSpeech.ERROR); self.sendBroadcast(installCompleteIntent); } else { // the activity is still running, ask the user to retry. runOnUiThread(new retryDisplayer()); } } } } public class retryDisplayer implements Runnable { public void run() { setContentView(R.layout.retry); Button retryButton = (Button) findViewById(R.id.retryButton); retryButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // only run the installer if there isn't another one running // (we only get here if the installer couldn't complete successfully before) synchronized (sInstallerStateLock) { if (!sIsInstalling) { sIsInstalling = true; runInstaller(); } } } }); } } }