android:clickable="true"
android:layout_gravity="left"
android:paddingBottom="10dip"/>
+
+ <TextView
+ android:id="@+id/webPage"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/webPage"/>
+
+ <TextView
+ android:id="@+id/webPageUrl"
+ android:text="@string/webPageUrl"
+ android:autoLink="web"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:layout_gravity="left"
+ android:paddingBottom="10dip"/>
+
</LinearLayout>
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
- <!-- Local file. -->
- <TextView
- android:id="@+id/wordListFileTitle"
- android:text="@string/wordListFile"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingTop="5dip" />
- <EditText
- android:id="@+id/wordListFile"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
-
<!-- Download URL. -->
<TextView
android:id="@+id/downloadUrlTitle"
<string name="about_text">QuickDic\nby Thad Hughes</string>
<!-- DictionaryListActivity -->
+ <string name="dictionaryList">Dictionary list</string>
<string name="selectADictionary"><![CDATA[Select a dictionary.
\nLong-press to edit the dictionary. Press "menu" to add a new dictionary.]]></string>
<string name="addDictionary">Add dictionary</string>
<string name="deleteDictionary">Delete dictionary</string>
<string name="moveUp">Move up</string>
<string name="newDictionary">New Dictionary</string>
+
+ <string name="thanksForUpdating"><![CDATA[
+<html>
+<body>
+ Thanks for updating QuickDic.
+ <p> New features:
+ <ul>
+ <li> Easily work with multiple dictionaries.
+ <li> Wiktionary-based dictionaries for French, Italian, German, Spanish, Swedish.
+ <li> Create your own dictionaries. Look in Menu...About for details.
+ </ul>
+ <p>The new version requires you to re-download any dictionaries you want.<br/>
+</body>
+</html>
+]]>
+ </string>
<!-- DictionaryEditActivity -->
+ <string name="dictionaryEdit">Edit dictionary config</string>
<string name="dictionaryName">Dictionary name</string>
<string name="downloadUrl">Dictionary download URL</string>
<string name="dictionaryInfo">Dictionary info:</string>
<string name="numPairEntries">Entries: %d</string>
<string name="numTokens">Tokens: %d</string>
<string name="numRows">Rows: %d</string>
+
<!-- Main -->
<string name="searchText">Search Text</string>
<string name="thadHughes">Thad Hughes</string>
<string name="contactMe">If you\'re using QuickDic, I\'d love to hear from you. Please send comments, suggestions, bug reports, or just a quick hello to:</string>
<string name="myEmail">thad.hughes\+quickdic@gmail.com</string>
-
+ <string name="webPage">For more information, including how to make your own QuickDic dictionaries, see:</string>
+ <string name="webPageUrl">http://sites.google.com/site/quickdic/home</string>
+
<!-- Download. -->
<string name="downloading">Downloading, %d of %d bytes.</string>
<string name="downloadFinished">Download finished, %d bytes downloaded.</string>
<string name="wordListFileKey">wordListFile</string>
<string name="wordListFileTitle">Word list file</string>
<string name="wordListFileSummary">The local file where the word list will be appended.</string>
- <string name="wordListFileDefault">/sdcard/wordList.txt</string>
+ <string name="wordListFileDefault">/sdcard/quickDic/wordList.txt</string>
<string name="saveOnlyFirstSubentryKey">saveOnlyFirstSubentry</string>
<string name="saveOnlyFirstSubentryTitle">Save only first sub-entry</string>
<string name="showClearSearchTextButtonTitle">Show \'clear search text\' button</string>
<string name="showClearSearchTextButtonSummary">Show the button to clear the search text. You can also just move focus away from search text and start typing.</string>
- <string name="dictFileKey">dictFile</string>
- <string name="dictFileTitle">Dictionary file</string>
- <string name="dictFileSummary">The local filename where the dictionary is stored (and downloaded to).</string>
- <string name="dictFileDefault">/sdcard/de-en.dict</string>
-
- <string name="dictFetchUrlKey">dictFetchUrl</string>
- <string name="dictFetchUrlTitle">Dictionary fetch URL</string>
- <string name="dictFetchUrlSummary">URL to use to download the dictionary from the Internet.</string>
- <string name="dictFetchUrlDefault">http://www.stanford.edu/~egirard/dict/de-en.dict</string>
-
<string name="vibrateOnFailedSearchKey">vibrateOnFailedSearch</string>
<string name="vibrateOnFailedSearchTitle">Vibrate on failed search.</string>
<string name="vibrateOnFailedSearchSummary">Vibrate the phone when invalid search text is entered.</string>
static final String INDEX_INDEX = "indexIndex";
static final String SEARCH_TOKEN = "searchToken";
+ public static final String INTRO_MESSAGE_SHOWN = "introMessageShown";
+
}
package com.hughes.android.dictionary;\r
\r
import java.io.File;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+import java.io.PrintWriter;\r
import java.io.RandomAccessFile;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\r
import java.util.concurrent.Executor;\r
import java.util.concurrent.Executors;\r
import java.util.concurrent.atomic.AtomicBoolean;\r
import android.os.Handler;\r
import android.os.Vibrator;\r
import android.preference.PreferenceManager;\r
+import android.text.ClipboardManager;\r
import android.text.Editable;\r
import android.text.Spannable;\r
import android.text.TextWatcher;\r
import android.text.style.StyleSpan;\r
import android.util.Log;\r
+import android.view.ContextMenu;\r
+import android.view.KeyEvent;\r
+import android.view.Menu;\r
+import android.view.MenuItem;\r
import android.view.View;\r
import android.view.ViewGroup;\r
+import android.view.ContextMenu.ContextMenuInfo;\r
+import android.view.MenuItem.OnMenuItemClickListener;\r
import android.view.View.OnClickListener;\r
import android.view.inputmethod.InputMethodManager;\r
+import android.widget.AdapterView;\r
import android.widget.BaseAdapter;\r
import android.widget.Button;\r
import android.widget.EditText;\r
import android.widget.ListAdapter;\r
+import android.widget.ListView;\r
import android.widget.TableLayout;\r
import android.widget.TableRow;\r
import android.widget.TextView;\r
+import android.widget.Toast;\r
+import android.widget.AdapterView.AdapterContextMenuInfo;\r
\r
import com.hughes.android.dictionary.engine.Dictionary;\r
import com.hughes.android.dictionary.engine.Index;\r
\r
static final int VIBRATE_MILLIS = 100;\r
\r
+ int dictIndex = 0;\r
RandomAccessFile dictRaf = null;\r
Dictionary dictionary = null;\r
int indexIndex = 0;\r
public DictionaryActivity() {\r
}\r
\r
- public static Intent getIntent(final int dictIndex, final int indexIndex, final String searchToken) {\r
+ public static Intent getIntent(final Context context, final int dictIndex, final int indexIndex, final String searchToken) {\r
+ setDictionaryPrefs(context, dictIndex, indexIndex, searchToken);\r
+ \r
final Intent intent = new Intent();\r
intent.setClassName(DictionaryActivity.class.getPackage().getName(), DictionaryActivity.class.getName());\r
- intent.putExtra(C.DICT_INDEX, dictIndex);\r
- intent.putExtra(C.INDEX_INDEX, indexIndex);\r
- intent.putExtra(C.SEARCH_TOKEN, searchToken);\r
return intent;\r
}\r
\r
+ public static void setDictionaryPrefs(final Context context,\r
+ final int dictIndex, final int indexIndex, final String searchToken) {\r
+ final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(context).edit();\r
+ prefs.putInt(C.DICT_INDEX, dictIndex);\r
+ prefs.putInt(C.INDEX_INDEX, indexIndex);\r
+ prefs.putString(C.SEARCH_TOKEN, searchToken);\r
+ prefs.commit();\r
+ }\r
+\r
+ public static void clearDictionaryPrefs(final Context context) {\r
+ final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(context).edit();\r
+ prefs.remove(C.DICT_INDEX);\r
+ prefs.remove(C.INDEX_INDEX);\r
+ prefs.remove(C.SEARCH_TOKEN);\r
+ prefs.commit();\r
+ }\r
+\r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
super.onCreate(savedInstanceState);\r
\r
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);\r
\r
- PersistentObjectCache.init(this);\r
- QuickDicConfig quickDicConfig = PersistentObjectCache.init(\r
- this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);\r
- \r
- final Intent intent = getIntent();\r
- \r
- final int dictIndex = intent.getIntExtra(C.DICT_INDEX, 0);\r
try {\r
+ PersistentObjectCache.init(this);\r
+ QuickDicConfig quickDicConfig = PersistentObjectCache.init(\r
+ this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);\r
+ dictIndex = prefs.getInt(C.DICT_INDEX, 0) ;\r
final DictionaryConfig dictionaryConfig = quickDicConfig.dictionaryConfigs.get(dictIndex);\r
dictRaf = new RandomAccessFile(dictionaryConfig.localFile, "r");\r
dictionary = new Dictionary(dictRaf); \r
} catch (Exception e) {\r
Log.e(LOG, "Unable to load dictionary.", e);\r
- DictionaryEditActivity.getIntent(dictIndex);\r
+ Toast.makeText(this, getString(R.string.invalidDictionary, "", e.getMessage()), Toast.LENGTH_LONG);\r
+ startActivity(DictionaryEditActivity.getIntent(dictIndex));\r
finish();\r
return;\r
}\r
}\r
});\r
\r
- indexIndex = intent.getIntExtra(C.INDEX_INDEX, 0) % dictionary.indices.size();\r
+ indexIndex = prefs.getInt(C.INDEX_INDEX, 0) % dictionary.indices.size();\r
index = dictionary.indices.get(indexIndex);\r
setListAdapter(new IndexAdapter(index));\r
\r
searchText = (EditText) findViewById(R.id.SearchText);\r
langButton = (Button) findViewById(R.id.LangButton);\r
\r
+ searchText.requestFocus();\r
searchText.addTextChangedListener(new SearchTextWatcher());\r
- \r
+ searchText.setText(prefs.getString(C.SEARCH_TOKEN, ""));\r
+ Log.d(LOG, "Trying to restore searchText=" + searchText.getText());\r
\r
final Button clearSearchTextButton = (Button) findViewById(R.id.ClearSearchTextButton);\r
clearSearchTextButton.setOnClickListener(new OnClickListener() {\r
onLanguageButton();\r
}\r
});\r
+ updateLangButton();\r
\r
final Button upButton = (Button) findViewById(R.id.UpButton);\r
upButton.setOnClickListener(new OnClickListener() {\r
}\r
});\r
\r
+ getListView().setOnItemSelectedListener(new ListView.OnItemSelectedListener() {\r
+ @Override\r
+ public void onItemSelected(AdapterView<?> adapterView, View arg1, final int position,\r
+ long id) {\r
+ if (!searchText.isFocused()) {\r
+ // TODO: don't do this if multi words are entered.\r
+ final RowBase row = (RowBase) getListAdapter().getItem(position);\r
+ final TokenRow tokenRow = row.getTokenRow(true);\r
+ searchText.setText(tokenRow.getToken());\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onNothingSelected(AdapterView<?> arg0) {\r
+ }\r
+ });\r
+\r
// ContextMenu.\r
registerForContextMenu(getListView());\r
- \r
+\r
+ // Prefs.\r
+ wordList = new File(prefs.getString(getString(R.string.wordListFileKey),\r
+ getString(R.string.wordListFileDefault)));\r
+ saveOnlyFirstSubentry = prefs.getBoolean(getString(R.string.saveOnlyFirstSubentryKey), false);\r
if (prefs.getBoolean(getString(R.string.vibrateOnFailedSearchKey), true)) {\r
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);\r
}\r
+ Log.d(LOG, "wordList=" + wordList + ", saveOnlyFirstSubentry=" + saveOnlyFirstSubentry);\r
+ }\r
+ \r
+ \r
+ @Override\r
+ protected void onResume() {\r
+ super.onResume();\r
+ }\r
\r
- updateLangButton();\r
+ @Override\r
+ protected void onPause() {\r
+ super.onPause();\r
+ }\r
\r
+ @Override\r
+ protected void onDestroy() {\r
+ super.onDestroy();\r
+ setDictionaryPrefs(this, dictIndex, indexIndex, searchText.getText().toString());\r
+ try {\r
+ dictRaf.close();\r
+ } catch (IOException e) {\r
+ Log.e(LOG, "Failed to close dictionary", e);\r
+ }\r
}\r
\r
// --------------------------------------------------------------------------\r
destIndexEntry = Math.min(tokenRow.referenceIndex + 1, index.sortedIndexEntries.size());\r
}\r
\r
- Log.d(LOG, "onUpDownButton, destIndexEntry=" + destIndexEntry);\r
- jumpToRow(index.sortedIndexEntries.get(destIndexEntry).startRow);\r
+ final Index.IndexEntry dest = index.sortedIndexEntries.get(destIndexEntry);\r
+ searchText.setText(dest.token);\r
+ Log.d(LOG, "onUpDownButton, destIndexEntry=" + dest.token);\r
+ //jumpToRow(index.sortedIndexEntries.get(destIndexEntry).startRow);\r
}\r
\r
// --------------------------------------------------------------------------\r
- // Menu\r
+ // Options Menu\r
// --------------------------------------------------------------------------\r
+ \r
+ @Override\r
+ public boolean onCreateOptionsMenu(final Menu menu) {\r
+ \r
+ {\r
+ final MenuItem preferences = menu.add(getString(R.string.preferences));\r
+ preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
+ public boolean onMenuItemClick(final MenuItem menuItem) {\r
+ startActivity(new Intent(DictionaryActivity.this,\r
+ PreferenceActivity.class));\r
+ return false;\r
+ }\r
+ });\r
+ }\r
+\r
+ {\r
+ final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryList));\r
+ dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
+ public boolean onMenuItemClick(final MenuItem menuItem) {\r
+ startActivity(DictionaryListActivity.getIntent(DictionaryActivity.this));\r
+ startActivity(DictionaryListActivity.getIntent(DictionaryActivity.this));\r
+ return false;\r
+ }\r
+ });\r
+ }\r
+\r
+ {\r
+ final MenuItem dictionaryList = menu.add(getString(R.string.editDictionary));\r
+ dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
+ public boolean onMenuItemClick(final MenuItem menuItem) {\r
+ final Intent intent = DictionaryEditActivity.getIntent(dictIndex);\r
+ startActivity(intent);\r
+ return false;\r
+ }\r
+ });\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+\r
+ // --------------------------------------------------------------------------\r
+ // Context Menu + clicks\r
+ // --------------------------------------------------------------------------\r
+\r
+ @Override\r
+ public void onCreateContextMenu(ContextMenu menu, View v,\r
+ ContextMenuInfo menuInfo) {\r
+ AdapterContextMenuInfo adapterContextMenuInfo = (AdapterContextMenuInfo) menuInfo;\r
+ final RowBase row = (RowBase) getListAdapter().getItem(adapterContextMenuInfo.position);\r
+\r
+ final MenuItem addToWordlist = menu.add(getString(R.string.addToWordList, wordList.getName()));\r
+ addToWordlist.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
+ public boolean onMenuItemClick(MenuItem item) {\r
+ onAppendToWordList(row);\r
+ return false;\r
+ }\r
+ });\r
+\r
+ final MenuItem copy = menu.add(android.R.string.copy);\r
+ copy.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
+ public boolean onMenuItemClick(MenuItem item) {\r
+ onCopy(row);\r
+ return false;\r
+ }\r
+ });\r
+\r
+ }\r
+ \r
+ @Override\r
+ protected void onListItemClick(ListView l, View v, int row, long id) {\r
+ openContextMenu(v);\r
+ }\r
+ \r
+ void onAppendToWordList(final RowBase row) {\r
+ final StringBuilder rawText = new StringBuilder();\r
+ rawText.append(\r
+ new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date()))\r
+ .append("\t");\r
+ rawText.append(index.longName).append("\t");\r
+ rawText.append(row.getTokenRow(true).getToken()).append("\t");\r
+ rawText.append(row.getRawText(saveOnlyFirstSubentry));\r
+ Log.d(LOG, "Writing : " + rawText);\r
+ try {\r
+ wordList.getParentFile().mkdirs();\r
+ final PrintWriter out = new PrintWriter(\r
+ new FileWriter(wordList, true));\r
+ out.println(rawText.toString());\r
+ out.close();\r
+ } catch (IOException e) {\r
+ Log.e(LOG, "Unable to append to " + wordList.getAbsolutePath(), e);\r
+ Toast.makeText(this, getString(R.string.failedAddingToWordList, wordList.getAbsolutePath()), Toast.LENGTH_LONG);\r
+ }\r
+ return;\r
+ }\r
+\r
+ void onCopy(final RowBase row) {\r
+ Log.d(LOG, "Copy, row=" + row);\r
+ final StringBuilder result = new StringBuilder();\r
+ result.append(row.getRawText(false));\r
+ final ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);\r
+ clipboardManager.setText(result.toString());\r
+ Log.d(LOG, "Copied: " + result);\r
+ }\r
+\r
+ @Override\r
+ public boolean onKeyDown(final int keyCode, final KeyEvent event) {\r
+ if (event.getUnicodeChar() != 0) {\r
+ if (!searchText.hasFocus()) {\r
+ searchText.setText("" + (char) event.getUnicodeChar());\r
+ onSearchTextChange(searchText.getText().toString());\r
+ searchText.requestFocus();\r
+ }\r
+ return true;\r
+ }\r
+ return super.onKeyDown(keyCode, event);\r
+ }\r
+\r
\r
// --------------------------------------------------------------------------\r
// SearchOperation\r
// --------------------------------------------------------------------------\r
\r
private void searchFinished(final SearchOperation searchOperation) {\r
+ if (searchOperation.interrupted.get()) {\r
+ Log.d(LOG, "Search operation was interrupted: " + searchOperation);\r
+ return;\r
+ }\r
if (searchOperation != this.currentSearchOperation) {\r
+ Log.d(LOG, "Stale searchOperation finished: " + searchOperation);\r
return;\r
}\r
\r
final Index.SearchResult searchResult = searchOperation.searchResult;\r
- Log.d(LOG, "searchFinished, " + searchResult.longestPrefixString + ", success=" + searchResult.success);\r
+ Log.d(LOG, "searchFinished: " + searchOperation + ", searchResult=" + searchResult);\r
\r
jumpToRow(searchResult.longestPrefix.startRow);\r
\r
this.searchText = searchText.trim();\r
this.index = index;\r
}\r
+ \r
+ public String toString() {\r
+ return String.format("SearchOperation(%s,%s)", searchText, interrupted.toString());\r
+ }\r
\r
@Override\r
public void run() {\r
}\r
\r
@Override\r
- public Object getItem(int position) {\r
+ public RowBase getItem(int position) {\r
return index.rows.get(position);\r
}\r
\r
@Override\r
public long getItemId(int position) {\r
- return position;\r
+ return getItem(position).index();\r
}\r
\r
@Override\r
// SearchText\r
// --------------------------------------------------------------------------\r
\r
- void onSearchTextChange(final String searchText) {\r
- Log.d(LOG, "onSearchTextChange: " + searchText);\r
+ void onSearchTextChange(final String text) {\r
+ if (!searchText.isFocused()) {\r
+ return;\r
+ }\r
+ Log.d(LOG, "onSearchTextChange: " + text); \r
if (currentSearchOperation != null) {\r
+ Log.d(LOG, "Interrupting currentSearchOperation.");\r
currentSearchOperation.interrupted.set(true);\r
}\r
- currentSearchOperation = new SearchOperation(searchText, index);\r
+ currentSearchOperation = new SearchOperation(text, index);\r
searchExecutor.execute(currentSearchOperation);\r
}\r
\r
private class SearchTextWatcher implements TextWatcher {\r
public void afterTextChanged(final Editable searchTextEditable) {\r
- Log.d(LOG, "Search text changed: " + searchText.getText());\r
if (searchText.hasFocus()) {\r
+ Log.d(LOG, "Search text changed with focus: " + searchText.getText());\r
// If they were typing to cause the change, update the UI.\r
onSearchTextChange(searchText.getText().toString());\r
}\r
String name = "";
String localFile = "/sdcard/quickDic/";
- String wordList = "/sdcard/quickDic/";
String downloadUrl = "http://";
int openIndex = 0;
result.name = "DE<->EN";
result.downloadUrl = "http://www.stanford.edu/~egirard/dict/de-en.2.dict";
result.localFile = "/sdcard/quickDic/de-en.dict";
- result.wordList = "/sdcard/quickDict/wordlist_de-en.txt";
return result;
}
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
+import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
public class DictionaryEditActivity extends Activity {
+ static final String LOG = "QuickDic";
+
QuickDicConfig quickDicConfig;
private DictionaryConfig dictionaryConfig;
-
public static Intent getIntent(final int dictIndex) {
final Intent intent = new Intent();
- intent.setClassName(DictionaryEditActivity.class.getPackage().getName(), DictionaryEditActivity.class.getName());
+ intent.setClassName(DictionaryEditActivity.class.getPackage().getName(),
+ DictionaryEditActivity.class.getName());
intent.putExtra(C.DICT_INDEX, dictIndex);
return intent;
}
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);
- PersistentObjectCache.init(this);
- quickDicConfig = PersistentObjectCache.init(
- this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);
-
final Intent intent = getIntent();
- dictionaryConfig = quickDicConfig.dictionaryConfigs.get(intent.getIntExtra(C.DICT_INDEX, 0));
- // Write stuff from object into fields.
-
- ((EditText) findViewById(R.id.dictionaryName)).setText(dictionaryConfig.name);
- ((EditText) findViewById(R.id.localFile)).setText(dictionaryConfig.localFile);
- ((EditText) findViewById(R.id.wordListFile)).setText(dictionaryConfig.wordList);
- ((EditText) findViewById(R.id.downloadUrl)).setText(dictionaryConfig.downloadUrl);
+ PersistentObjectCache.init(this);
+ try {
+ quickDicConfig = PersistentObjectCache.init(this).read(
+ C.DICTIONARY_CONFIGS, QuickDicConfig.class);
+ dictionaryConfig = quickDicConfig.dictionaryConfigs.get(intent
+ .getIntExtra(C.DICT_INDEX, 0));
+ } catch (Exception e) {
+ Log.e(LOG, "Failed to read QuickDicConfig.", e);
+ quickDicConfig = new QuickDicConfig();
+ dictionaryConfig = quickDicConfig.dictionaryConfigs.get(0);
+ }
+ // Write stuff from object into fields.
+
+ ((EditText) findViewById(R.id.dictionaryName))
+ .setText(dictionaryConfig.name);
+ ((EditText) findViewById(R.id.localFile))
+ .setText(dictionaryConfig.localFile);
+ ((EditText) findViewById(R.id.downloadUrl))
+ .setText(dictionaryConfig.downloadUrl);
+
updateDictInfo();
- ((EditText) findViewById(R.id.localFile)).addTextChangedListener(new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {
- }
-
- @Override
- public void afterTextChanged(Editable s) {
- updateDictInfo();
- }
- });
-
+ ((EditText) findViewById(R.id.localFile))
+ .addTextChangedListener(new TextWatcher() {
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ updateDictInfo();
+ }
+ });
+
}
@Override
protected void onPause() {
super.onPause();
-
+
// Read stuff from fields into object.
- dictionaryConfig.name = ((EditText) findViewById(R.id.dictionaryName)).getText().toString();
- dictionaryConfig.localFile = ((EditText) findViewById(R.id.localFile)).getText().toString();
- dictionaryConfig.wordList = ((EditText) findViewById(R.id.wordListFile)).getText().toString();
- dictionaryConfig.downloadUrl = ((EditText) findViewById(R.id.downloadUrl)).getText().toString();
-
- PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS, quickDicConfig);
+ dictionaryConfig.name = ((EditText) findViewById(R.id.dictionaryName))
+ .getText().toString();
+ dictionaryConfig.localFile = ((EditText) findViewById(R.id.localFile))
+ .getText().toString();
+ dictionaryConfig.downloadUrl = ((EditText) findViewById(R.id.downloadUrl))
+ .getText().toString();
+
+ PersistentObjectCache.getInstance().write(C.DICTIONARY_CONFIGS,
+ quickDicConfig);
}
-
+
public boolean onCreateOptionsMenu(final Menu menu) {
- final MenuItem newDictionaryMenuItem = menu.add(R.string.downloadDictionary);
- newDictionaryMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
+ final MenuItem newDictionaryMenuItem = menu
+ .add(R.string.downloadDictionary);
+ newDictionaryMenuItem
+ .setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
- startDownloadDictActivity(DictionaryEditActivity.this, dictionaryConfig);
+ startDownloadDictActivity(DictionaryEditActivity.this,
+ dictionaryConfig);
return false;
}
});
-
+
return true;
}
-
+
void updateDictInfo() {
final TextView dictInfo = (TextView) findViewById(R.id.dictionaryInfo);
- final String localFile = ((EditText) findViewById(R.id.localFile)).getText().toString();
-
+ final String localFile = ((EditText) findViewById(R.id.localFile))
+ .getText().toString();
+
if (!new File(localFile).canRead()) {
dictInfo.setText(getString(R.string.fileNotFound, localFile));
return;
}
-
+
try {
final RandomAccessFile raf = new RandomAccessFile(localFile, "r");
final Dictionary dict = new Dictionary(raf);
final StringBuilder builder = new StringBuilder();
builder.append(dict.dictInfo).append("\n");
- builder.append(getString(R.string.numPairEntries, dict.pairEntries.size())).append("\n");
+ builder.append(
+ getString(R.string.numPairEntries, dict.pairEntries.size())).append(
+ "\n");
for (final Index index : dict.indices) {
builder.append("\n");
builder.append(index.longName).append("\n");
- builder.append(" ").append(getString(R.string.numTokens, index.sortedIndexEntries.size())).append("\n");
- builder.append(" ").append(getString(R.string.numRows, index.rows.size())).append("\n");
+ builder.append(" ").append(
+ getString(R.string.numTokens, index.sortedIndexEntries.size()))
+ .append("\n");
+ builder.append(" ").append(
+ getString(R.string.numRows, index.rows.size())).append("\n");
}
raf.close();
dictInfo.setText(builder.toString());
} catch (IOException e) {
- dictInfo.setText(getString(R.string.invalidDictionary, localFile, e.toString()));
+ dictInfo.setText(getString(R.string.invalidDictionary, localFile, e
+ .toString()));
}
}
- static void startDownloadDictActivity(final Context context, final DictionaryConfig dictionaryConfig) {
+ static void startDownloadDictActivity(final Context context,
+ final DictionaryConfig dictionaryConfig) {
final Intent intent = new Intent(context, DownloadActivity.class);
intent.putExtra(DownloadActivity.SOURCE, dictionaryConfig.downloadUrl);
intent.putExtra(DownloadActivity.DEST, dictionaryConfig.localFile);
package com.hughes.android.dictionary;
+import android.app.AlertDialog;
import android.app.ListActivity;
+import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
+import android.content.SharedPreferences;
import android.os.Bundle;
+import android.preference.PreferenceManager;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem.OnMenuItemClickListener;
+import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.TableLayout;
// UI init.
setContentView(R.layout.list_activity);
- /*
- getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
- public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int row,
- long arg3) {
- return false;
- }
- });
- */
-
getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int index,
// ContextMenu.
registerForContextMenu(getListView());
-
+
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ final int introMessageId = 0;
+ if (prefs.getInt(C.INTRO_MESSAGE_SHOWN, 0) < introMessageId) {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setCancelable(false);
+ final WebView webView = new WebView(getApplicationContext());
+ webView.loadData(getString(R.string.thanksForUpdating), "text/html", "utf-8");
+ builder.setView(webView);
+ builder.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ dialog.cancel();
+ }
+ });
+ final AlertDialog alert = builder.create();
+ alert.show();
+ prefs.edit().putInt(C.INTRO_MESSAGE_SHOWN, introMessageId).commit();
+ }
}
private void onClick(int dictIndex) {
- final Intent intent = DictionaryActivity.getIntent(dictIndex, 0, "");
+ final Intent intent = DictionaryActivity.getIntent(this, dictIndex, 0, "");
startActivity(intent);
}
@Override
protected void onResume() {
super.onResume();
+
+ final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ if (prefs.contains(C.DICT_INDEX) && prefs.contains(C.INDEX_INDEX)) {
+ startActivity(DictionaryActivity.getIntent(this, prefs.getInt(C.DICT_INDEX, 0), prefs.getInt(C.INDEX_INDEX, 0), prefs.getString(C.SEARCH_TOKEN, "")));
+ finish();
+ return;
+ }
quickDicConfig = PersistentObjectCache.init(this).read(C.DICTIONARY_CONFIGS, QuickDicConfig.class);
if (quickDicConfig == null) {
}
setListAdapter(new Adapter());
+
}
public boolean onCreateOptionsMenu(final Menu menu) {
}
+ public static Intent getIntent(final Context context) {
+ DictionaryActivity.clearDictionaryPrefs(context);
+ final Intent intent = new Intent();
+ intent.setClassName(DictionaryListActivity.class.getPackage().getName(),
+ DictionaryListActivity.class.getName());
+ return intent;
+ }
}
// persisted
final int dictFileVersion;
+ final long creationMillis;
public final String dictInfo;
public final List<PairEntry> pairEntries;
public final List<TextEntry> textEntries;
public Dictionary(final String dictInfo) {
this.dictFileVersion = 0;
+ this.creationMillis = System.currentTimeMillis();
this.dictInfo = dictInfo;
pairEntries = new ArrayList<PairEntry>();
textEntries = new ArrayList<TextEntry>();
if (dictFileVersion != 0) {
throw new IOException("Invalid dictionary version: " + dictFileVersion);
}
+ creationMillis = raf.readLong();
dictInfo = raf.readUTF();
sources = CachingList.createFullyCached(RAFList.create(raf, EntrySource.SERIALIZER, raf.getFilePointer()));
pairEntries = CachingList.create(RAFList.create(raf, PairEntry.SERIALIZER, raf.getFilePointer()), CACHE_SIZE);
@Override
public void write(RandomAccessFile raf) throws IOException {
raf.writeInt(dictFileVersion);
+ raf.writeLong(creationMillis);
raf.writeUTF(dictInfo);
RAFList.write(raf, sources, EntrySource.SERIALIZER);
RAFList.write(raf, pairEntries, PairEntry.SERIALIZER);
public static final class IndexEntry implements RAFSerializable<Index.IndexEntry> {
public final String token;
public final int startRow;
+ public final int numRows;
static final RAFSerializer<IndexEntry> SERIALIZER = new RAFSerializer<IndexEntry> () {
@Override
t.write(raf);
}};
- public IndexEntry(final String token, final int startRow) {
+ public IndexEntry(final String token, final int startRow, final int numRows) {
assert token.equals(token.trim());
assert token.length() > 0;
this.token = token;
this.startRow = startRow;
+ this.numRows = numRows;
}
public IndexEntry(final RandomAccessFile raf) throws IOException {
token = raf.readUTF();
startRow = raf.readInt();
+ numRows = raf.readInt();
}
public void write(RandomAccessFile raf) throws IOException {
raf.writeUTF(token);
raf.writeInt(startRow);
+ raf.writeInt(numRows);
}
public String toString() {
- return token + "@" + startRow;
+ return String.format("%s@%d(%d)", token, startRow, numRows);
}
}
this.longestPrefixString = longestPrefixString;
this.success = success;
}
+
+ @Override
+ public String toString() {
+ return String.format("inerstionPoint=%s,longestPrefix=%s,longestPrefixString=%s,success=%b", insertionPoint.toString(), longestPrefix.toString(), longestPrefixString, success);
+ }
}
public SearchResult findLongestSubstring(String token, final AtomicBoolean interrupted) {
public String toString() {
return lang1 + " :: " + lang2;
}
+
+ public String toStringTab() {
+ return lang1 + "\t" + lang2;
+ }
+
}
public final Pair[] pairs;
out.println();
}
}
+
+ @Override
+ public String getRawText(boolean compact) {
+ final PairEntry pairEntry = getEntry();
+ if (compact) {
+ return pairEntry.pairs[0].toStringTab();
+ }
+ final StringBuilder builder = new StringBuilder();
+ for (int i = 0; i < pairEntry.pairs.length; ++i) {
+ if (i > 0) {
+ builder.append(" | ");
+ }
+ builder.append(pairEntry.pairs[i].lang1);
+ }
+ builder.append("\t");
+ for (int i = 0; i < pairEntry.pairs.length; ++i) {
+ if (i > 0) {
+ builder.append(" | ");
+ }
+ builder.append(pairEntry.pairs[i].lang2);
+ }
+ return builder.toString();
+ }
}
}
public abstract void print(PrintStream out);
-
+
+ public abstract String getRawText(final boolean compact);
+
// RowBase must manage "disk-based" polymorphism. All other polymorphism is
// dealt with in the normal manner.
static class Serializer implements RAFListSerializer<RowBase> {
public void print(PrintStream out) {
out.println(" " + getEntry().text);
}
+
+ @Override
+ public String getRawText(boolean compact) {
+ return getEntry().text;
+ }
}
out.println(getToken());
}
+ @Override
+ public String getRawText(boolean compact) {
+ return getToken();
+ }
+
}