<meta-data android:name="com.google.android.backup.api_key"
android:value="AEdPqrEAAAAIUa0cU0ZHbBpYXJqm0vVUP5IAjr5D4iUeX7UwiQ" />
- <activity android:name=".DictionaryListActivity"
+ <activity android:name=".DictionaryManagerActivity"
android:label="@string/app_name">
<intent-filter>
--- /dev/null
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_window_focused="false" android:state_selected="true" android:drawable="@android:color/transparent" />
+ <item android:state_selected="true" android:drawable="@android:color/transparent" />
+ <item android:state_pressed="true" android:state_selected="false" android:drawable="@android:color/background_dark" />
+ <item android:state_selected="false" android:drawable="@android:color/background_dark" />
+</selector>
\ No newline at end of file
--- /dev/null
+# LANG_1 %LANG_2 FILENAME FILESIZE NUM_MAIN_WORDS_1 NUM_MAIN_WORDS_2 NUM_ALL_WORDS_1 NUM_ALL_WORDS_2
+DE EN DE-EN_chemnitz_enwiktionary.quickdic 50207808 262726 119111 262726 119111
+EN af EN-AF_enwiktionary.quickdic 524028 4864 2757 4864 2757
+EN ar EN-AR_enwiktionary.quickdic 4012835 16522 23357 16522 23357
+EN be EN-BE_enwiktionary.quickdic 711212 4481 5325 4481 5325
+EN bg EN-BG_enwiktionary.quickdic 12913407 19530 54724 19530 54724
+EN bn EN-BN_enwiktionary.quickdic 709473 4479 1867 4479 1867
+EN bo EN-BO_enwiktionary.quickdic 82371 767 424 767 424
+EN bs EN-BS_enwiktionary.quickdic 532886 5031 2947 5031 2947
+EN ca EN-CA_enwiktionary.quickdic 8983841 16662 50054 16662 50054
+EN ci EN-CI_enwiktionary.quickdic 749721 5884 3779 5884 3779
+EN cs EN-CS_enwiktionary.quickdic 5819580 24351 23142 24351 23142
+EN da EN-DA_enwiktionary.quickdic 5279379 17460 30597 17460 30597
+EN el EN-EL_enwiktionary.quickdic 12106155 24424 48789 24424 48789
+EN eo EN-EO_enwiktionary.quickdic 11600016 16907 100765 16907 100765
+EN es EN-ES_enwiktionary.quickdic 66315884 37676 240847 37676 240847
+EN et EN-ET_enwiktionary.quickdic 1447664 9818 7697 9818 7697
+EN fa EN-FA_enwiktionary.quickdic 2266032 11292 11565 11292 11565
+EN fi EN-FI_enwiktionary.quickdic 24362077 51150 126697 51150 126697
+EN FR EN-FR_enwiktionary.quickdic 37999114 44540 208469 44540 208469
+EN ga EN-GA_enwiktionary.quickdic 2146063 11870 8649 11870 8649
+EN iw EN-HE_enwiktionary.quickdic 3655803 15703 18853 15703 18853
+EN hi EN-HI_enwiktionary.quickdic 1578419 8494 5673 8494 5673
+EN hr EN-HR_enwiktionary.quickdic 11994054 21291 45181 21291 45181
+EN hu EN-HU_enwiktionary.quickdic 6648136 22700 36369 22700 36369
+EN hy EN-HY_enwiktionary.quickdic 4635747 16697 20671 16697 20671
+EN in EN-ID_enwiktionary.quickdic 855320 6919 4384 6919 4384
+EN is EN-IS_enwiktionary.quickdic 3539828 16781 16584 16781 16584
+EN IT EN-IT_enwiktionary.quickdic 66258996 82955 458534 82955 458534
+EN ja EN-JA_enwiktionary.quickdic 14160233 32116 74666 32116 74666
+EN ko EN-KO_enwiktionary.quickdic 3798948 18780 24154 18780 24154
+EN ku EN-KU_enwiktionary.quickdic 950213 5853 5266 5853 5266
+EN la EN-LA_enwiktionary.quickdic 97577095 22517 515727 22517 515727
+EN lt EN-LT_enwiktionary.quickdic 2947045 7970 18146 7970 18146
+EN lv EN-LV_enwiktionary.quickdic 895714 6533 4709 6533 4709
+EN mi EN-MI_enwiktionary.quickdic 122547 1316 637 1316 637
+EN mn EN-MN_enwiktionary.quickdic 299861 2238 2295 2238 2295
+EN ms EN-MS_enwiktionary.quickdic 664757 5026 3483 5026 3483
+EN ne EN-NE_enwiktionary.quickdic 55115 494 305 494 305
+EN nl EN-NL_enwiktionary.quickdic 12882227 32296 65344 32296 65344
+EN no EN-NO_enwiktionary.quickdic 3793263 16740 19398 16740 19398
+EN pa EN-PA_enwiktionary.quickdic 79473 721 418 721 418
+EN pl EN-PL_enwiktionary.quickdic 8265972 22429 42112 22429 42112
+EN pt EN-PT_enwiktionary.quickdic 10595199 21951 49188 21951 49188
+EN ro EN-RO_enwiktionary.quickdic 4100603 17827 18709 17827 18709
+EN ru EN-RU_enwiktionary.quickdic 13197074 37230 70018 37230 70018
+EN sa EN-SA_enwiktionary.quickdic 1514085 7958 3667 7958 3667
+EN sk EN-SK_enwiktionary.quickdic 1022589 7895 5040 7895 5040
+EN so EN-SO_enwiktionary.quickdic 29794 326 169 326 169
+EN sq EN-SQ_enwiktionary.quickdic 820891 6153 4112 6153 4112
+EN sr EN-SR_enwiktionary.quickdic 1363176 8002 9261 8002 9261
+EN sv EN-SV_enwiktionary.quickdic 15275508 26455 98329 26455 98329
+EN sw EN-SW_enwiktionary.quickdic 1192717 7864 3526 7864 3526
+EN tg EN-TG_enwiktionary.quickdic 326521 2034 1788 2034 1788
+EN th EN-TH_enwiktionary.quickdic 1394582 7647 8766 7647 8766
+EN tr EN-TR_enwiktionary.quickdic 3420079 15760 17996 15760 17996
+EN uk EN-UK_enwiktionary.quickdic 1332001 7512 9448 7512 9448
+EN vi EN-VI_enwiktionary.quickdic 1225627 9074 4767 9074 4767
+EN ji EN-YI_enwiktionary.quickdic 421569 2955 2807 2955 2807
+EN zh EN-ZH_enwiktionary.quickdic 13270167 28253 73329 28253 73329
+EN zu EN-ZU_enwiktionary.quickdic 41213 484 224 484 224
+EN haw EN-haw_enwiktionary.quickdic 228760 1791 961 1791 961
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <string name="AF">Afrikaans</string>
+ <string name="SQ">Albanian</string>
+ <string name="AR">Arabic</string>
+ <string name="HY">Armenian</string>
+ <string name="BE">Belarusian</string>
+ <string name="BN">Bengali</string>
+ <string name="BS">Bosnian</string>
+ <string name="BG">Bulgarian</string>
+ <string name="CA">Catalan</string>
+ <string name="HR">Croatian</string>
+ <string name="CS">Czech</string>
+ <string name="ZH">Chinese|Mandarin|Cantonese</string>
+ <string name="DA">Danish</string>
+ <string name="NL">Dutch</string>
+ <string name="EN">English</string>
+ <string name="EO">Esperanto</string>
+ <string name="ET">Estonian</string>
+ <string name="FI">Finnish</string>
+ <string name="FR">French</string>
+ <string name="DE">German</string>
+ <string name="EL">Greek</string>
+ <string name="haw">Hawaiian</string>
+ <string name="HE">Hebrew</string>
+ <string name="HI">Hindi</string>
+ <string name="HU">Hungarian</string>
+ <string name="IS">Icelandic</string>
+ <string name="ID">Indonesian</string>
+ <string name="GA">Irish</string>
+ <string name="IT">Italian</string>
+ <string name="LA">Latin</string>
+ <string name="LV">Latvian</string>
+ <string name="LT">Lithuanian</string>
+ <string name="JA">Japanese</string>
+ <string name="KO">Korean</string>
+ <string name="KU">Kurdish</string>
+ <string name="MS">Malay</string>
+ <string name="MI">Maori</string>
+ <string name="MN">Mongolian</string>
+ <string name="NE">Nepali</string>
+ <string name="NO">Norwegian</string>
+ <string name="FA">Persian</string>
+ <string name="PL">Polish</string>
+ <string name="PT">Portuguese</string>
+ <string name="PA">Punjabi</string>
+ <string name="RO">Romanian</string>
+ <string name="RU">Russian</string>
+ <string name="SA">Sanskrit</string>
+ <string name="SR">Serbian</string>
+ <string name="SK">Slovak</string>
+ <string name="SO">Somali</string>
+ <string name="ES">Spanish</string>
+ <string name="SW">Swahili</string>
+ <string name="SV">Swedish</string>
+ <string name="TG">Tajik</string>
+ <string name="TH">Thai</string>
+ <string name="BO">Tibetan</string>
+ <string name="TR">Turkish</string>
+ <string name="UK">Ukrainian</string>
+ <string name="VI">Vietnamese</string>
+ <string name="CI">Welsh</string>
+ <string name="YI">Yiddish</string>
+ <string name="ZU">Zulu</string>
+
+</resources>
\ No newline at end of file
<string name="app_name">QuickDic</string>
<!-- DictionaryListActivity -->
- <string name="dictionaryList">Dictionary list</string>
+ <string name="dictionaryManager">Dictionary manager</string>
<string name="selectADictionary"><![CDATA[Select a dictionary.
\nLong-press to edit the dictionary config. Press "menu" to add a new dictionary.]]></string>
- <string name="addDictionary">Add dictionary</string>
- <string name="addDefaultDictionaries">Add default dictionaries</string>
- <string name="removeAllDictionaries">Remove all dictionaries</string>
- <string name="editDictionary">Edit dictionary config</string>
- <string name="deleteDictionary">Delete dictionary</string>
+ <string name="dictionaryConfig">Dictionary config</string>
<string name="moveToTop">Move to top</string>
- <string name="newDictionary">New dictionary</string>
<string name="notOnDevice">%s (not on device)</string>
<string name="thanksForUpdatingVersion">3.0.1h</string>
<item name="android:colorBackground">#FFFFFF</item>
<item name="android:textColorPrimary">#000000</item>
+
-->
</style>
+
+ <style name="Theme.Light.Token" parent="@style/Theme.Light">
+ <item name="android:textColor">@android:color/primary_text_dark</item>
+</style>
+
</resources>
\r
import com.hughes.android.dictionary.engine.Dictionary;\r
import com.hughes.android.dictionary.engine.Index;\r
+import com.hughes.android.dictionary.engine.Language;\r
import com.hughes.android.dictionary.engine.PairEntry;\r
import com.hughes.android.dictionary.engine.PairEntry.Pair;\r
import com.hughes.android.dictionary.engine.RowBase;\r
\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
return intent;\r
}\r
+ \r
+ // TODO: Can we trigger an App restart when the preferences activity gets opened?\r
+ // TODO: fix these...\r
+\r
+ @Override\r
+ protected void onSaveInstanceState(final Bundle outState) {\r
+ super.onSaveInstanceState(outState);\r
+ setDictionaryPrefs(this, dictIndex, indexIndex, searchText.getText().toString());\r
+ }\r
\r
public static void setDictionaryPrefs(final Context context,\r
final int dictIndex, final int indexIndex, final String searchToken) {\r
prefs.putString(C.SEARCH_TOKEN, searchToken);\r
prefs.commit();\r
}\r
-\r
+ \r
public static void clearDictionaryPrefs(final Context context) {\r
- final SharedPreferences.Editor prefs = PreferenceManager.getDefaultSharedPreferences(context).edit();\r
+ final SharedPreferences.Editor prefs = PreferenceManager\r
+ .getDefaultSharedPreferences(context).edit();\r
prefs.remove(C.DICT_INDEX);\r
prefs.remove(C.INDEX_INDEX);\r
prefs.remove(C.SEARCH_TOKEN);\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
+ final DictionaryInfo dictionaryConfig = quickDicConfig.dictionaryConfigs.get(dictIndex);\r
this.setTitle("QuickDic: " + dictionaryConfig.name);\r
dictRaf = new RandomAccessFile(dictionaryConfig.localFile, "r");\r
dictionary = new Dictionary(dictRaf); \r
dictRaf = null;\r
}\r
Toast.makeText(this, getString(R.string.invalidDictionary, "", e.getMessage()), Toast.LENGTH_LONG);\r
- startActivity(DictionaryEditActivity.getIntent(dictIndex));\r
+ startActivity(DictionaryManagerActivity.getIntent(this));\r
finish();\r
return;\r
}\r
});\r
\r
for (final Index index : dictionary.indices) {\r
- Log.d(LOG, "Starting collator load for lang=" + index.sortLanguage.getSymbol());\r
+ Log.d(LOG, "Starting collator load for lang=" + index.sortLanguage.getIsoCode());\r
\r
final com.ibm.icu.text.Collator c = index.sortLanguage.getCollator(); \r
if (c.compare("pre-print", "preppy") >= 0) {\r
@Override\r
protected void onResume() {\r
super.onResume();\r
+ if (PreferenceActivity.prefsMightHaveChanged) {\r
+ PreferenceActivity.prefsMightHaveChanged = false;\r
+ finish();\r
+ startActivity(getIntent());\r
+ }\r
}\r
\r
@Override\r
final MenuItem preferences = menu.add(getString(R.string.preferences));\r
preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {\r
public boolean onMenuItemClick(final MenuItem menuItem) {\r
+ PreferenceActivity.prefsMightHaveChanged = true;\r
startActivity(new Intent(DictionaryActivity.this,\r
PreferenceActivity.class));\r
return false;\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(DictionaryManagerActivity.getIntent(DictionaryActivity.this));\r
finish();\r
return false;\r
}\r
return true;\r
}\r
if (keyCode == KeyEvent.KEYCODE_BACK) {\r
- Log.d(LOG, "Clearing dictionary prefs.");\r
- DictionaryActivity.clearDictionaryPrefs(this);\r
}\r
if (keyCode == KeyEvent.KEYCODE_ENTER) {\r
-// Log.d(LOG, "Trying to hide soft keyboard.");\r
-// final InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
-// manager.hideSoftInputFromWindow(searchText, InputMethodManager.SHOW_FORCED);\r
-\r
+ Log.d(LOG, "Trying to hide soft keyboard.");\r
+ final InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);\r
+ inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);\r
+ return true;\r
}\r
return super.onKeyDown(keyCode, event);\r
}\r
\r
// TODO: color words by gender\r
final Pair pair = entry.pairs.get(r);\r
- final String col1Text = index.swapPairEntries ? pair.lang2 : pair.lang1;\r
+ final String col1Text = Language.fixBidiText(index.swapPairEntries ? pair.lang2 : pair.lang1);\r
column1.setText(col1Text, TextView.BufferType.SPANNABLE);\r
final Spannable col1Spannable = (Spannable) column1.getText();\r
\r
startPos += token.length();\r
}\r
\r
- final String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2;\r
+ String col2Text = index.swapPairEntries ? pair.lang1 : pair.lang2;\r
+ col2Text = Language.fixBidiText(col2Text);\r
column2.setText(col2Text, TextView.BufferType.NORMAL);\r
\r
column1.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSizeSp);\r
}\r
\r
private View getView(TokenRow row, ViewGroup parent) {\r
- final TextView textView = new TextView(parent.getContext());\r
+ final Context context = parent.getContext();\r
+ final TextView textView = new TextView(context);\r
textView.setText(row.getToken());\r
+ textView.setBackgroundResource(R.drawable.token_row_drawable);\r
+ // Doesn't work:\r
+ //textView.setTextColor(android.R.color.secondary_text_light);\r
+ textView.setTextAppearance(context, R.style.Theme_Light_Token);\r
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 5 * fontSizeSp / 4);\r
return textView;\r
}\r
import android.view.View;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View.OnClickListener;
+import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
static final String LOG = "QuickDic";
QuickDicConfig quickDicConfig;
- private DictionaryConfig dictionaryConfig;
+ private DictionaryInfo dictionaryConfig;
final Handler uiHandler = new Handler();
startActivity(intent);
}
});
+
+ // Don't show the keyboard when this opens up:
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
final MenuItem dictionaryList = menu.add(getString(R.string.dictionaryList));
dictionaryList.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
- startActivity(DictionaryListActivity.getIntent(DictionaryEditActivity.this));
+ startActivity(DictionaryManagerActivity.getIntent(DictionaryEditActivity.this));
return false;
}
});
}
static void startDownloadDictActivity(final Context context,
- final DictionaryConfig dictionaryConfig) {
+ final DictionaryInfo dictionaryConfig) {
final Intent intent = new Intent(context, DownloadActivity.class);
intent.putExtra(DownloadActivity.SOURCE, dictionaryConfig.downloadUrl);
intent.putExtra(DownloadActivity.DEST, dictionaryConfig.localFile + ".zip");
context.startActivity(intent);
}
- @Override
- public boolean onKeyDown(final int keyCode, final KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- Log.d(LOG, "Clearing dictionary prefs.");
- DictionaryActivity.clearDictionaryPrefs(this);
- }
- return super.onKeyDown(keyCode, event);
- }
-
}
import java.io.Serializable;
-public class DictionaryConfig implements Serializable {
+public class DictionaryInfo implements Serializable {
- private static final long serialVersionUID = -6850863377577700387L;
-
- String name = "";
- String localFile = "/sdcard/quickDic/";
- String downloadUrl = "http://";
+ private static final long serialVersionUID = -6850863377577700388L;
- int openIndex = 0;
- String openWord = "";
+ // Stuff populated from the text file.
+ public final String[] langIsos = new String[2];
+ public String uncompressedFilename;
+ public long uncompressedSize;
+ public final int[] allTokenCounts = new int[2];
+ public final int[] mainTokenCounts = new int[2];
+
+ String name; // Determined at runtime based on locale on device--user editable.
+ String localFile; // Determined based on device's Environment.
+ String downloadUrl;
@Override
public String toString() {
return name;
}
+
+ public String toTabSeparatedString() {
+ return String.format("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d", langIsos[0],
+ langIsos[1], uncompressedFilename, uncompressedSize,
+ mainTokenCounts[0], mainTokenCounts[1], allTokenCounts[0],
+ allTokenCounts[1]);
+ }
}
import com.hughes.android.util.PersistentObjectCache;
-public class DictionaryListActivity extends ListActivity {
+public class DictionaryManagerActivity extends ListActivity {
static final String LOG = "QuickDic";
protected void onResume() {
super.onResume();
+ if (PreferenceActivity.prefsMightHaveChanged) {
+ PreferenceActivity.prefsMightHaveChanged = false;
+ finish();
+ startActivity(getIntent());
+ }
+
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.contains(C.DICT_INDEX) && prefs.contains(C.INDEX_INDEX)) {
Log.d(LOG, "Skipping Dictionary List, going straight to dictionary.");
// Replace <-> with -
if (quickDicConfig.currentVersion < 5) {
- for (final DictionaryConfig config : quickDicConfig.dictionaryConfigs) {
+ for (final DictionaryInfo config : quickDicConfig.dictionaryConfigs) {
config.name = config.name.replace("<->", "-");
}
}
final MenuItem newDictionaryMenuItem = menu.add(R.string.addDictionary);
newDictionaryMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
- final DictionaryConfig dictionaryConfig = new DictionaryConfig();
+ final DictionaryInfo dictionaryConfig = new DictionaryInfo();
dictionaryConfig.name = getString(R.string.newDictionary);
quickDicConfig.dictionaryConfigs.add(0, dictionaryConfig);
dictionaryConfigsChanged();
final MenuItem preferences = menu.add(getString(R.string.preferences));
preferences.setOnMenuItemClickListener(new OnMenuItemClickListener() {
public boolean onMenuItemClick(final MenuItem menuItem) {
- startActivity(new Intent(DictionaryListActivity.this,
+ PreferenceActivity.prefsMightHaveChanged = true;
+ startActivity(new Intent(DictionaryManagerActivity.this,
PreferenceActivity.class));
return false;
}
moveToTopMenuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
- final DictionaryConfig dictionaryConfig = quickDicConfig.dictionaryConfigs.remove(adapterContextMenuInfo.position);
+ final DictionaryInfo dictionaryConfig = quickDicConfig.dictionaryConfigs.remove(adapterContextMenuInfo.position);
quickDicConfig.dictionaryConfigs.add(0, dictionaryConfig);
dictionaryConfigsChanged();
return true;
}
@Override
- public DictionaryConfig getItem(int position) {
+ public DictionaryInfo getItem(int position) {
return quickDicConfig.dictionaryConfigs.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
- final DictionaryConfig dictionaryConfig = getItem(position);
+ final DictionaryInfo dictionaryConfig = getItem(position);
final TableLayout tableLayout = new TableLayout(parent.getContext());
final TextView view = new TextView(parent.getContext());
public static Intent getIntent(final Context context) {
DictionaryActivity.clearDictionaryPrefs(context);
final Intent intent = new Intent();
- intent.setClassName(DictionaryListActivity.class.getPackage().getName(),
- DictionaryListActivity.class.getName());
+ intent.setClassName(DictionaryManagerActivity.class.getPackage().getName(),
+ DictionaryManagerActivity.class.getName());
return intent;
}
import android.os.Bundle;\r
\r
public class PreferenceActivity extends android.preference.PreferenceActivity {\r
+ \r
+ static boolean prefsMightHaveChanged = false;\r
+ \r
@Override\r
public void onCreate(Bundle savedInstanceState) {\r
((DictionaryApplication)getApplication()).applyTheme(this);\r
import java.util.ArrayList;
import java.util.List;
+import android.os.Environment;
+
import com.hughes.android.dictionary.engine.Language;
public final class QuickDicConfig implements Serializable {
// Just increment this to have them all update...
static final int LATEST_VERSION = 6;
- final List<DictionaryConfig> dictionaryConfigs = new ArrayList<DictionaryConfig>();
+ final List<DictionaryInfo> dictionaryConfigs = new ArrayList<DictionaryInfo>();
int currentVersion = LATEST_VERSION;
public QuickDicConfig() {
}
static final String BASE_URL = "http://quickdic-dictionary.googlecode.com/files/";
- static final String VERSION_SUFFIX = "v002";
+ // TODO: read this from a resource file....
+
public void addDefaultDictionaries() {
{
- final DictionaryConfig config = new DictionaryConfig();
+ final DictionaryInfo config = new DictionaryInfo();
config.name = "German-English";
config.downloadUrl = String.format("%sDE-EN_chemnitz_enwiktionary.quickdic.%s.zip", BASE_URL, VERSION_SUFFIX);
- config.localFile = "/sdcard/quickDic/DE-EN_chemnitz_enwiktionary.quickdic";
+ config.localFile = String.format("%s/quickDic/DE-EN_chemnitz_enwiktionary.quickdic", Environment.getExternalStorageDirectory());
addOrReplace(config);
}
- for (final String iso : Language.isoCodeToWikiName.keySet()) {
+ for (final String iso : Language.isoCodeToResourceName.keySet()) {
if (iso.equals("EN") || iso.equals("DE")) {
continue;
}
- final DictionaryConfig config = new DictionaryConfig();
+ final DictionaryInfo config = new DictionaryInfo();
config.name = String.format("English-%s", Language.isoCodeToWikiName.get(iso));
config.downloadUrl = String.format("%sEN-%s_enwiktionary.quickdic.%s.zip", BASE_URL, iso, VERSION_SUFFIX);
- config.localFile = String.format("/sdcard/quickDic/EN-%s_enwiktionary.quickdic", iso);
+ config.localFile = String.format("%s/quickDic/EN-%s_enwiktionary.quickdic", Environment.getExternalStorageDirectory(), iso);
addOrReplace(config);
}
}
- private void addOrReplace(final DictionaryConfig dictionaryConfig) {
+ private void addOrReplace(final DictionaryInfo dictionaryConfig) {
for (int i = 0; i < dictionaryConfigs.size(); ++i) {
if (dictionaryConfigs.get(i).name.equals(dictionaryConfig.name)) {
dictionaryConfigs.set(i, dictionaryConfig);
public void write(final RandomAccessFile raf) throws IOException {
raf.writeUTF(shortName);
raf.writeUTF(longName);
- raf.writeUTF(sortLanguage.getSymbol());
+ raf.writeUTF(sortLanguage.getIsoCode());
raf.writeUTF(normalizerRules);
raf.writeBoolean(swapPairEntries);
RAFList.write(raf, sortedIndexEntries, IndexEntry.SERIALIZER);
result = windBackCase(sortedIndexEntries.get(result).normalizedToken(), result, interrupted);
return sortedIndexEntries.get(result);
}
-
- public static final class SearchResult {
- public final IndexEntry insertionPoint;
- public final IndexEntry longestPrefix;
- public final String longestPrefixString;
- public final boolean success;
-
- public SearchResult(IndexEntry insertionPoint, IndexEntry longestPrefix,
- String longestPrefixString, boolean success) {
- this.insertionPoint = insertionPoint;
- this.longestPrefix = longestPrefix;
- 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) {
-// token = normalizer.transliterate(token);
-// if (token.length() == 0) {
-// return new SearchResult(sortedIndexEntries.get(0), sortedIndexEntries.get(0), "", true);
-// }
-// IndexEntry insertionPoint = null;
-// IndexEntry result = null;
-// boolean unmodified = true;
-// while (!interrupted.get() && token.length() > 0) {
-// result = findInsertionPoint(token, interrupted);
-// if (result == null) {
-// return null;
-// }
-// if (unmodified) {
-// insertionPoint = result;
-// }
-// if (result.normalizedToken(normalizer).startsWith(token)) {
-// return new SearchResult(insertionPoint, result, token, unmodified);
-// }
-// unmodified = false;
-// token = token.substring(0, token.length() - 1);
-// }
-// return new SearchResult(insertionPoint, sortedIndexEntries.get(0), "", false);
-// }
-
private final int windBackCase(final String token, int result, final AtomicBoolean interrupted) {
while (result > 0 && sortedIndexEntries.get(result - 1).normalizedToken().equals(token)) {
--result;
return result;
}
- /*
- public int tokenRowBinarySearch(final int rowIndex) {
- int start = 0;
- int end = sortedIndexEntries.size();
- while (start < end) {
- final int mid = (start + end) / 2;
- final int midRowIndex = sortedIndexEntries.get(mid).startRow;
- if (midRowIndex == rowIndex) {
- return mid;
- }
- if ()
- }
- }
- */
-
}
\ No newline at end of file
import java.util.LinkedHashMap;\r
import java.util.Locale;\r
import java.util.Map;\r
+import java.util.regex.Pattern;\r
\r
+import com.hughes.android.dictionary.R;\r
import com.ibm.icu.text.Collator;\r
\r
public class Language {\r
\r
- public static final Map<String,String> isoCodeToWikiName = new LinkedHashMap<String,String>();\r
+ public static final Map<String,Integer> isoCodeToResourceId = new LinkedHashMap<String,Integer>();\r
static {\r
- isoCodeToWikiName.put("AF", "Afrikaans");\r
- isoCodeToWikiName.put("SQ", "Albanian");\r
- isoCodeToWikiName.put("AR", "Arabic");\r
- isoCodeToWikiName.put("HY", "Armenian");\r
- isoCodeToWikiName.put("BE", "Belarusian");\r
- isoCodeToWikiName.put("BN", "Bengali");\r
- isoCodeToWikiName.put("BS", "Bosnian");\r
- isoCodeToWikiName.put("BG", "Bulgarian");\r
- isoCodeToWikiName.put("CA", "Catalan");\r
- isoCodeToWikiName.put("HR", "Croatian");\r
- isoCodeToWikiName.put("CS", "Czech");\r
- isoCodeToWikiName.put("ZH", "Chinese|Mandarin|Cantonese");\r
- isoCodeToWikiName.put("DA", "Danish");\r
- isoCodeToWikiName.put("NL", "Dutch");\r
- isoCodeToWikiName.put("EN", "English");\r
- isoCodeToWikiName.put("EO", "Esperanto");\r
- isoCodeToWikiName.put("ET", "Estonian");\r
- isoCodeToWikiName.put("FI", "Finnish");\r
- isoCodeToWikiName.put("FR", "French");\r
- isoCodeToWikiName.put("DE", "German");\r
- isoCodeToWikiName.put("EL", "Greek");\r
- isoCodeToWikiName.put("haw", "Hawaiian");\r
- isoCodeToWikiName.put("HE", "Hebrew");\r
- isoCodeToWikiName.put("HI", "Hindi");\r
- isoCodeToWikiName.put("HU", "Hungarian");\r
- isoCodeToWikiName.put("IS", "Icelandic");\r
- isoCodeToWikiName.put("ID", "Indonesian");\r
- isoCodeToWikiName.put("GA", "Irish");\r
- isoCodeToWikiName.put("IT", "Italian");\r
- isoCodeToWikiName.put("LA", "Latin");\r
- isoCodeToWikiName.put("LV", "Latvian");\r
- isoCodeToWikiName.put("LT", "Lithuanian");\r
- isoCodeToWikiName.put("JA", "Japanese");\r
- isoCodeToWikiName.put("KO", "Korean");\r
- isoCodeToWikiName.put("KU", "Kurdish");\r
- isoCodeToWikiName.put("MS", "Malay");\r
- isoCodeToWikiName.put("MI", "Maori");\r
- isoCodeToWikiName.put("MN", "Mongolian");\r
- isoCodeToWikiName.put("NE", "Nepali");\r
- isoCodeToWikiName.put("NO", "Norwegian");\r
- isoCodeToWikiName.put("FA", "Persian");\r
- isoCodeToWikiName.put("PL", "Polish");\r
- isoCodeToWikiName.put("PT", "Portuguese");\r
- isoCodeToWikiName.put("PA", "Punjabi");\r
- isoCodeToWikiName.put("RO", "Romanian");\r
- isoCodeToWikiName.put("RU", "Russian");\r
- isoCodeToWikiName.put("SA", "Sanskrit");\r
- isoCodeToWikiName.put("SR", "Serbian");\r
- isoCodeToWikiName.put("SK", "Slovak");\r
- isoCodeToWikiName.put("SO", "Somali");\r
- isoCodeToWikiName.put("ES", "Spanish");\r
- isoCodeToWikiName.put("SW", "Swahili");\r
- isoCodeToWikiName.put("SV", "Swedish");\r
- isoCodeToWikiName.put("TG", "Tajik");\r
- isoCodeToWikiName.put("TH", "Thai");\r
- isoCodeToWikiName.put("BO", "Tibetan");\r
- isoCodeToWikiName.put("TR", "Turkish");\r
- isoCodeToWikiName.put("UK", "Ukrainian");\r
- isoCodeToWikiName.put("VI", "Vietnamese");\r
- isoCodeToWikiName.put("CI", "Welsh");\r
- isoCodeToWikiName.put("YI", "Yiddish");\r
- isoCodeToWikiName.put("ZU", "Zulu");\r
+ isoCodeToResourceId.put("AF", R.string.AF);\r
+ isoCodeToResourceId.put("SQ", R.string.SQ);\r
+ isoCodeToResourceId.put("AR", R.string.AR);\r
+ isoCodeToResourceId.put("HY", R.string.HY);\r
+ isoCodeToResourceId.put("BE", R.string.BE);\r
+ isoCodeToResourceId.put("BN", R.string.BN);\r
+ isoCodeToResourceId.put("BS", R.string.BS);\r
+ isoCodeToResourceId.put("BG", R.string.BG);\r
+ isoCodeToResourceId.put("CA", R.string.CA);\r
+ isoCodeToResourceId.put("HR", R.string.HR);\r
+ isoCodeToResourceId.put("CS", R.string.CS);\r
+ isoCodeToResourceId.put("ZH", R.string.ZH);\r
+ isoCodeToResourceId.put("DA", R.string.DA);\r
+ isoCodeToResourceId.put("NL", R.string.NL);\r
+ isoCodeToResourceId.put("EN", R.string.EN);\r
+ isoCodeToResourceId.put("EO", R.string.EO);\r
+ isoCodeToResourceId.put("ET", R.string.ET);\r
+ isoCodeToResourceId.put("FI", R.string.FI);\r
+ isoCodeToResourceId.put("FR", R.string.FR);\r
+ isoCodeToResourceId.put("DE", R.string.DE);\r
+ isoCodeToResourceId.put("EL", R.string.EL);\r
+ isoCodeToResourceId.put("haw", R.string.haw);\r
+ isoCodeToResourceId.put("HE", R.string.HE);\r
+ isoCodeToResourceId.put("HI", R.string.HI);\r
+ isoCodeToResourceId.put("HU", R.string.HU);\r
+ isoCodeToResourceId.put("IS", R.string.IS);\r
+ isoCodeToResourceId.put("ID", R.string.ID);\r
+ isoCodeToResourceId.put("GA", R.string.GA);\r
+ isoCodeToResourceId.put("IT", R.string.IT);\r
+ isoCodeToResourceId.put("LA", R.string.LA);\r
+ isoCodeToResourceId.put("LV", R.string.LV);\r
+ isoCodeToResourceId.put("LT", R.string.LT);\r
+ isoCodeToResourceId.put("JA", R.string.JA);\r
+ isoCodeToResourceId.put("KO", R.string.KO);\r
+ isoCodeToResourceId.put("KU", R.string.KU);\r
+ isoCodeToResourceId.put("MS", R.string.MS);\r
+ isoCodeToResourceId.put("MI", R.string.MI);\r
+ isoCodeToResourceId.put("MN", R.string.MN);\r
+ isoCodeToResourceId.put("NE", R.string.NE);\r
+ isoCodeToResourceId.put("NO", R.string.NO);\r
+ isoCodeToResourceId.put("FA", R.string.FA);\r
+ isoCodeToResourceId.put("PL", R.string.PL);\r
+ isoCodeToResourceId.put("PT", R.string.PT);\r
+ isoCodeToResourceId.put("PA", R.string.PA);\r
+ isoCodeToResourceId.put("RO", R.string.RO);\r
+ isoCodeToResourceId.put("RU", R.string.RU);\r
+ isoCodeToResourceId.put("SA", R.string.SA);\r
+ isoCodeToResourceId.put("SR", R.string.SR);\r
+ isoCodeToResourceId.put("SK", R.string.SK);\r
+ isoCodeToResourceId.put("SO", R.string.SO);\r
+ isoCodeToResourceId.put("ES", R.string.ES);\r
+ isoCodeToResourceId.put("SW", R.string.SW);\r
+ isoCodeToResourceId.put("SV", R.string.SV);\r
+ isoCodeToResourceId.put("TG", R.string.TG);\r
+ isoCodeToResourceId.put("TH", R.string.TH);\r
+ isoCodeToResourceId.put("BO", R.string.BO);\r
+ isoCodeToResourceId.put("TR", R.string.TR);\r
+ isoCodeToResourceId.put("UK", R.string.UK);\r
+ isoCodeToResourceId.put("VI", R.string.VI);\r
+ isoCodeToResourceId.put("CI", R.string.CI);\r
+ isoCodeToResourceId.put("YI", R.string.YI);\r
+ isoCodeToResourceId.put("ZU", R.string.ZU);\r
}\r
\r
- static final Map<String, Language> symbolToLangauge = new LinkedHashMap<String, Language>();\r
\r
- final String symbol;\r
+ private static final Map<String, Language> registry = new LinkedHashMap<String, Language>();\r
+\r
+ final String isoCode;\r
final Locale locale;\r
\r
private Collator collator;\r
\r
- public Language(final Locale locale) {\r
- this.symbol = locale.getLanguage();\r
+ private Language(final Locale locale, final String isoCode) {\r
this.locale = locale;\r
+ this.isoCode = isoCode;\r
\r
- symbolToLangauge.put(symbol.toLowerCase(), this);\r
+ registry.put(isoCode.toLowerCase(), this);\r
}\r
\r
@Override\r
return locale.toString();\r
}\r
\r
- public String getSymbol() {\r
- return symbol;\r
+ public String getIsoCode() {\r
+ return isoCode;\r
}\r
\r
public synchronized Collator getCollator() {\r
public String getDefaultNormalizerRules() {\r
return ":: Any-Latin; ' ' > ; :: Lower; :: NFD; :: [:Nonspacing Mark:] Remove; :: NFC ;";\r
}\r
+ \r
+ /**\r
+ * A practical pattern to identify strong RTL characters. This pattern is not\r
+ * completely correct according to the Unicode standard. It is simplified for\r
+ * performance and small code size.\r
+ */\r
+ private static final String rtlChars =\r
+ "\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC";\r
+ private static final Pattern RTL_TOKEN = Pattern.compile("[" + rtlChars + "]+");\r
+ \r
+ public static String fixBidiText(final String text) {\r
+ return RTL_TOKEN.matcher(text).replaceAll("\u200e $0 \u200e");\r
+ }\r
+ \r
// ----------------------------------------------------------------\r
\r
- public static final Language en = new Language(Locale.ENGLISH);\r
- public static final Language fr = new Language(Locale.FRENCH);\r
- public static final Language it = new Language(Locale.ITALIAN);\r
+ public static final Language en = new Language(Locale.ENGLISH, "EN");\r
+ public static final Language fr = new Language(Locale.FRENCH, "FR");\r
+ public static final Language it = new Language(Locale.ITALIAN, "IT");\r
\r
- public static final Language de = new Language(Locale.GERMAN) {\r
+ public static final Language de = new Language(Locale.GERMAN, "DE") {\r
@Override\r
public String getDefaultNormalizerRules() {\r
return ":: Lower; 'ae' > 'ä'; 'oe' > 'ö'; 'ue' > 'ü'; 'ß' > 'ss'; ";\r
\r
// ----------------------------------------------------------------\r
\r
- public static synchronized Language lookup(final String symbol) {\r
- Language lang = symbolToLangauge.get(symbol.toLowerCase());\r
+ public static synchronized Language lookup(final String isoCode) {\r
+ Language lang = registry.get(isoCode.toLowerCase());\r
if (lang == null) {\r
- lang = new Language(new Locale(symbol));\r
+ lang = new Language(new Locale(isoCode), isoCode);\r
}\r
return lang;\r
}\r
final byte rowType = raf.readByte();
if (rowType == 0) {
return new PairEntry.Row(raf, listIndex, index);
- } else if (rowType == 1) {
- return new TokenRow(raf, listIndex, index);
+ } else if (rowType == 1 || rowType == 3) {
+ return new TokenRow(raf, listIndex, index, rowType == 1);
} else if (rowType == 2) {
return new TextEntry.Row(raf, listIndex, index);
}
if (t instanceof PairEntry.Row) {
raf.writeByte(0);
} else if (t instanceof TokenRow) {
- raf.writeByte(1);
+ final TokenRow tokenRow = (TokenRow) t;
+ raf.writeByte(tokenRow.hasMainEntry ? 1 : 3);
} else if (t instanceof TextEntry.Row) {
raf.writeByte(2);
}
public class TokenRow extends RowBase {
- TokenRow(final RandomAccessFile raf, final int thisRowIndex, final Index index) throws IOException {
+ final boolean hasMainEntry;
+
+ TokenRow(final RandomAccessFile raf, final int thisRowIndex, final Index index, final boolean hasMainEntry) throws IOException {
super(raf, thisRowIndex, index);
+ this.hasMainEntry = hasMainEntry;
}
- TokenRow(final int referenceIndex, final int thisRowIndex, final Index index) {
+ TokenRow(final int referenceIndex, final int thisRowIndex, final Index index, final boolean hasMainEntry) {
super(referenceIndex, thisRowIndex, index);
+ this.hasMainEntry = hasMainEntry;
}
public String toString() {