From 2552fd5fee12af72b798ce0b13a0152781c2e749 Mon Sep 17 00:00:00 2001 From: thadh Date: Sun, 19 Apr 2009 04:34:15 -0700 Subject: [PATCH] go --- AndroidManifest.xml | 1 + res/layout/about.xml | 25 +++-- res/layout/download.xml | 33 +++++++ res/layout/main.xml | 2 +- .../android/dictionary/AboutActivity.java | 9 ++ .../dictionary/DictionaryActivity.java | 93 ++++++++++++++++--- .../android/dictionary/DownloadActivity.java | 81 ++++++++++++++++ src/com/hughes/android/dictionary/Entry.java | 10 +- src/com/hughes/android/dictionary/R.java | 29 ++++-- 9 files changed, 251 insertions(+), 32 deletions(-) create mode 100755 res/layout/download.xml create mode 100755 src/com/hughes/android/dictionary/DownloadActivity.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5b132d5..77e5c70 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/res/layout/about.xml b/res/layout/about.xml index d3c130d..d6c3440 100755 --- a/res/layout/about.xml +++ b/res/layout/about.xml @@ -1,22 +1,23 @@ - - + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center_horizontal"> + - + - + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_gravity="center_vertical|fill_vertical"> + - + + + + + + diff --git a/res/layout/download.xml b/res/layout/download.xml new file mode 100755 index 0000000..7b1e43b --- /dev/null +++ b/res/layout/download.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/main.xml b/res/layout/main.xml index 2de3e1a..3e19caa 100755 --- a/res/layout/main.xml +++ b/res/layout/main.xml @@ -12,7 +12,7 @@ + android:choiceMode="singleChoice" android:clickable="true" android:focusableInTouchMode="true" android:focusable="true"> diff --git a/src/com/hughes/android/dictionary/AboutActivity.java b/src/com/hughes/android/dictionary/AboutActivity.java index 8317084..065b0c4 100755 --- a/src/com/hughes/android/dictionary/AboutActivity.java +++ b/src/com/hughes/android/dictionary/AboutActivity.java @@ -1,15 +1,24 @@ package com.hughes.android.dictionary; import android.app.Activity; +import android.content.Intent; import android.os.Bundle; +import android.widget.TextView; public final class AboutActivity extends Activity { + public static final String CURRENT_DICT_INFO = "currentDictInfo"; + /** Called when the activity is first created. */ @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.about); + + final Intent intent = getIntent(); + + final TextView currentDictInfo = (TextView) findViewById(R.id.currentDictInfo); + currentDictInfo.setText(intent.getStringExtra(CURRENT_DICT_INFO)); } } diff --git a/src/com/hughes/android/dictionary/DictionaryActivity.java b/src/com/hughes/android/dictionary/DictionaryActivity.java index cb58797..c6d3972 100755 --- a/src/com/hughes/android/dictionary/DictionaryActivity.java +++ b/src/com/hughes/android/dictionary/DictionaryActivity.java @@ -1,16 +1,19 @@ package com.hughes.android.dictionary; import java.io.File; -import java.io.FileOutputStream; +import java.io.FileWriter; import java.io.IOException; -import java.io.OutputStream; +import java.io.PrintWriter; import java.io.RandomAccessFile; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import android.app.AlertDialog; import android.app.ListActivity; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Typeface; @@ -26,7 +29,6 @@ import android.view.ContextMenu; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; -import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; @@ -48,8 +50,11 @@ import com.hughes.android.dictionary.Dictionary.LanguageData; import com.hughes.android.dictionary.Dictionary.Row; public class DictionaryActivity extends ListActivity { + + String WORD_LIST_FILE; + String DICT_FILE; + String DICT_FETCH_URL; - static final Intent aboutIntent = new Intent().setClassName(AboutActivity.class.getPackage().getName(), AboutActivity.class.getCanonicalName()); static final Intent preferencesIntent = new Intent().setClassName(PreferenceActivity.class.getPackage().getName(), PreferenceActivity.class.getCanonicalName()); private final Handler uiHandler = new Handler(); @@ -73,23 +78,40 @@ public class DictionaryActivity extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { - Log.d("THAD", "onCreate"); super.onCreate(savedInstanceState); + WORD_LIST_FILE = getResources().getString(R.string.wordListFile); + DICT_FILE = getResources().getString(R.string.dictFile); + DICT_FETCH_URL = getResources().getString(R.string.dictFetchUrl); + + Log.d("THAD", "onCreate"); + + } @Override public void onResume() { super.onResume(); + // Have to close, because we might have downloaded a new copy of the dictionary. closeCurrentDictionary(); final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); - wordList = new File(settings.getString(getResources().getString(R.string.wordListFile), wordList.getAbsolutePath())); - dictFile = new File(settings.getString(getResources().getString(R.string.dictFile), "/sdcard/de-en.dict")); + wordList = new File(settings.getString(WORD_LIST_FILE, wordList.getAbsolutePath())); + final File newDictFile = new File(settings.getString(DICT_FILE, "/sdcard/de-en.dict")); + dictFile = newDictFile; Log.d("THAD", "wordList=" + wordList); Log.d("THAD", "dictFile=" + dictFile); if (!dictFile.canRead()) { + dictionaryListAdapter.notifyDataSetChanged(); + Log.d("THAD", "Unable to read dictionary file."); + final AlertDialog alert = new AlertDialog.Builder(DictionaryActivity.this).create(); + alert.setMessage("Unable to read dictionary file: " + wordList.getAbsolutePath()); + alert.setButton("Download dictionary from Internet", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + startDownloadDictActivity(); + }}); + alert.show(); return; } @@ -97,6 +119,7 @@ public class DictionaryActivity extends ListActivity { dictRaf = new RandomAccessFile(dictFile, "r"); dictionary = new Dictionary(dictRaf); activeLangaugeData = dictionary.languageDatas[Entry.LANG1]; + dictionaryListAdapter.notifyDataSetChanged(); } catch (Exception e) { throw new RuntimeException(e); } @@ -193,7 +216,7 @@ public class DictionaryActivity extends ListActivity { dictRaf = null; } - public String getSelectedRowText() { + public String getSelectedRowRawText() { return activeLangaugeData.rowToString(activeLangaugeData.rows.get(selectedRowIndex)); } @@ -227,7 +250,28 @@ public class DictionaryActivity extends ListActivity { final MenuItem about = menu.add("About..."); about.setOnMenuItemClickListener(new OnMenuItemClickListener(){ public boolean onMenuItemClick(final MenuItem menuItem) { - startActivity(aboutIntent); + final Intent intent = new Intent().setClassName(AboutActivity.class.getPackage().getName(), AboutActivity.class.getCanonicalName()); + final StringBuilder currentDictInfo = new StringBuilder(); + if (dictionary == null) { + currentDictInfo.append("No dictionary loaded."); + } else { + currentDictInfo.append("Entry count: " + dictionary.entries.size()).append("\n"); + for (int i = 0; i < 2; ++i) { + final LanguageData languageData = dictionary.languageDatas[i]; + currentDictInfo.append(languageData.language.symbol).append(":\n"); + currentDictInfo.append(" Unique token count: " + languageData.sortedIndex.size()).append("\n"); + currentDictInfo.append(" Row count: " + languageData.rows.size()).append("\n"); + } + } + intent.putExtra(AboutActivity.CURRENT_DICT_INFO, currentDictInfo.toString()); + startActivity(intent); + return false; + }}); + + final MenuItem download = menu.add("Download dictionary..."); + download.setOnMenuItemClickListener(new OnMenuItemClickListener(){ + public boolean onMenuItemClick(final MenuItem menuItem) { + startDownloadDictActivity(); return false; }}); @@ -270,13 +314,19 @@ public class DictionaryActivity extends ListActivity { final MenuItem addToWordlist = menu.add("Add to wordlist: " + wordList.getName()); addToWordlist.setOnMenuItemClickListener(new OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { - final String rawText = getSelectedRowText(); + final StringBuilder rawText = new StringBuilder(); + final String word = activeLangaugeData.getIndexEntryForRow(selectedRowIndex).word; + rawText.append(new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date())).append("\t"); + rawText.append(word).append("\t"); + rawText.append(getSelectedRowRawText()); Log.d("THAD", "Writing : " + rawText); try { - final OutputStream out = new FileOutputStream(wordList, true); - out.write((rawText + "\n").getBytes()); + wordList.getParentFile().mkdirs(); + final PrintWriter out = new PrintWriter(new FileWriter(wordList, true)); + out.println(rawText.toString()); out.close(); } catch (IOException e) { + Log.e("THAD", "Unable to append to " + wordList.getAbsolutePath(), e); final AlertDialog alert = new AlertDialog.Builder(DictionaryActivity.this).create(); alert.setMessage("Failed to append to file: " + wordList.getAbsolutePath()); alert.show(); @@ -303,7 +353,7 @@ public class DictionaryActivity extends ListActivity { @Override protected void onListItemClick(ListView l, View v, int row, long id) { selectedRowIndex = row; - Log.d("THAD", "Clicked: " + getSelectedRowText()); + Log.d("THAD", "Clicked: " + getSelectedRowRawText()); openContextMenu(getListView()); } @@ -336,6 +386,18 @@ public class DictionaryActivity extends ListActivity { } } + private void startDownloadDictActivity() { + final Intent intent = new Intent().setClassName( + DownloadActivity.class.getPackage().getName(), + DownloadActivity.class.getCanonicalName()); + final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(DictionaryActivity.this); + final String dictFetchUrl = settings.getString(DICT_FETCH_URL, null); + final String dictFileName = settings.getString(DICT_FILE, null); + intent.putExtra(DownloadActivity.SOURCE, dictFetchUrl); + intent.putExtra(DownloadActivity.DEST, dictFileName); + startActivity(intent); + } + private final class SearchOperation implements Runnable { final String searchText; final AtomicBoolean interrupted = new AtomicBoolean(false); @@ -445,8 +507,9 @@ public class DictionaryActivity extends ListActivity { } // DictionaryListAdapter private class DictionaryTextWatcher implements TextWatcher { - public void afterTextChanged(Editable searchText) { + public void afterTextChanged(final Editable searchText) { if (getSearchText().hasFocus()) { + // If they were typing to cause the change, update the UI. onSearchTextChange(searchText.toString()); } } @@ -458,5 +521,5 @@ public class DictionaryActivity extends ListActivity { public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } } - + } \ No newline at end of file diff --git a/src/com/hughes/android/dictionary/DownloadActivity.java b/src/com/hughes/android/dictionary/DownloadActivity.java new file mode 100755 index 0000000..385933b --- /dev/null +++ b/src/com/hughes/android/dictionary/DownloadActivity.java @@ -0,0 +1,81 @@ +package com.hughes.android.dictionary; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +public class DownloadActivity extends Activity { + + public static final String SOURCE = "source"; + public static final String DEST = "dest"; + + String source; + String dest; + + private final Executor downloadExecutor = Executors.newSingleThreadExecutor(); + private final Handler uiHandler = new Handler(); + + /** Called when the activity is first created. */ + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final Intent intent = getIntent(); + source = intent.getStringExtra(SOURCE); + dest = intent.getStringExtra(DEST); + if (source == null || dest == null) { + throw new RuntimeException("null source or dest."); + } + setContentView(R.layout.download); + + final TextView sourceTextView = (TextView) findViewById(R.id.source); + sourceTextView.setText(source); + + final TextView destTextView = (TextView) findViewById(R.id.dest); + destTextView.setText(dest); + + final ProgressBar progressBar = (ProgressBar) findViewById(R.id.downloadProgressBar); + progressBar.setIndeterminate(false); + progressBar.setMax(100); + + final Runnable runnable = new Runnable() { + public void run() { + + for (int i = 0; i < 100; ++i) { + + final int progress = i; + uiHandler.post(new Runnable() { + public void run() { + Log.d("THAD", "Setting progress: " + progress); + progressBar.setProgress(progress); + } + }); + + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + final TextView downloadComplete = (TextView) findViewById(R.id.downloadComplete); + uiHandler.post(new Runnable() { + public void run() { + progressBar.setProgress(100); + downloadComplete.setVisibility(View.VISIBLE); + } + }); + + }}; + downloadExecutor.execute(runnable); + + } + +} diff --git a/src/com/hughes/android/dictionary/Entry.java b/src/com/hughes/android/dictionary/Entry.java index d8cd9a6..cd62f06 100755 --- a/src/com/hughes/android/dictionary/Entry.java +++ b/src/com/hughes/android/dictionary/Entry.java @@ -88,7 +88,15 @@ public final class Entry implements RAFSerializable { } String getRawText() { - return Arrays.asList(getAllText(LANG1)) + "\t" + Arrays.asList(getAllText(LANG2)); + final StringBuilder result = new StringBuilder(); + for (int i = 0; i < lang1.length; ++i) { + result.append(i == 0 ? "" : " | ").append(lang1[i]); + } + result.append(" :: "); + for (int i = 0; i < lang2.length; ++i) { + result.append(i == 0 ? "" : " | ").append(lang2[i]); + } + return result.toString(); } static byte otherLang(final byte lang) { diff --git a/src/com/hughes/android/dictionary/R.java b/src/com/hughes/android/dictionary/R.java index 19ea99e..667eeba 100755 --- a/src/com/hughes/android/dictionary/R.java +++ b/src/com/hughes/android/dictionary/R.java @@ -14,25 +14,38 @@ public final class R { public static final int icon=0x7f020000; } public static final class id { - public static final int DownButton=0x7f06000d; + public static final int DownButton=0x7f060019; public static final int ImageView01=0x7f060002; - public static final int LangButton=0x7f06000c; + public static final int LangButton=0x7f060018; public static final int LinearLayout01=0x7f060000; public static final int LinearLayout02=0x7f060001; - public static final int SearchBarLinearLayout=0x7f060008; - public static final int SearchBarTableLayout=0x7f060009; - public static final int SearchBarTableRow=0x7f06000a; - public static final int SearchText=0x7f06000b; - public static final int UpButton=0x7f06000e; + public static final int SearchBarLinearLayout=0x7f060014; + public static final int SearchBarTableLayout=0x7f060015; + public static final int SearchBarTableRow=0x7f060016; + public static final int SearchText=0x7f060017; + public static final int TextView01=0x7f06000b; + public static final int UpButton=0x7f06001a; public static final int author=0x7f060006; public static final int copyright=0x7f060005; + public static final int currentDictInfo=0x7f06000a; + public static final int currentDictInfoTitle=0x7f060009; + public static final int dest=0x7f060011; + public static final int destLayout=0x7f06000f; + public static final int destTitle=0x7f060010; + public static final int downloadComplete=0x7f060013; + public static final int downloadProgressBar=0x7f060012; public static final int email=0x7f060007; + public static final int source=0x7f06000e; + public static final int sourceLayout=0x7f06000c; + public static final int sourceTitle=0x7f06000d; public static final int space1=0x7f060004; + public static final int space2=0x7f060008; public static final int title=0x7f060003; } public static final class layout { public static final int about=0x7f030000; - public static final int main=0x7f030001; + public static final int download=0x7f030001; + public static final int main=0x7f030002; } public static final class string { public static final int about_text=0x7f050001; -- 2.43.0