]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Using external storage dir properly, better notifications when missing.
authorThad Hughes <thadh@google.com>
Wed, 25 Dec 2013 21:46:21 +0000 (13:46 -0800)
committerThad Hughes <thadh@google.com>
Wed, 25 Dec 2013 21:46:21 +0000 (13:46 -0800)
24 files changed:
res/drawable-mdpi/arrow_down_float.png [moved from res/drawable/arrow_down_float.png with 100% similarity]
res/drawable-mdpi/arrow_up_float.png [moved from res/drawable/arrow_up_float.png with 100% similarity]
res/drawable-mdpi/btn_check_buttonless_on.png [moved from res/drawable/btn_check_buttonless_on.png with 100% similarity]
res/drawable-mdpi/ic_input_delete.png [moved from res/drawable/ic_input_delete.png with 100% similarity]
res/drawable-mdpi/ic_menu_forward.png [moved from res/drawable/ic_menu_forward.png with 100% similarity]
res/drawable-mdpi/icon.png [moved from res/drawable/icon.png with 100% similarity]
res/drawable-mdpi/thadolina.jpg [moved from res/drawable/thadolina.jpg with 100% similarity]
res/layout/dictionaries_on_device_row.xml [deleted file]
res/layout/dictionary_manager_header_row_downloadable.xml [moved from res/layout/downloadable_dictionaries_header_row.xml with 100% similarity]
res/layout/dictionary_manager_header_row_on_device.xml [moved from res/layout/dictionaries_on_device_header_row.xml with 100% similarity]
res/layout/dictionary_manager_row.xml [moved from res/layout/downloadable_dictionary_row.xml with 100% similarity]
res/menu/dictionary_manager_options_menu.xml
res/values-de/languages.xml
res/values-de/strings.xml
res/values-es/languages.xml
res/values-es/strings.xml
res/values-it/languages.xml
res/values-it/strings.xml
res/values/strings.xml
res/xml/preferences.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/DictionaryApplication.java
src/com/hughes/android/dictionary/DictionaryManagerActivity.java
todo.txt

diff --git a/res/layout/dictionaries_on_device_row.xml b/res/layout/dictionaries_on_device_row.xml
deleted file mode 100644 (file)
index 63f459b..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical" >
-
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal" >
-
-        <LinearLayout
-            android:id="@+id/dictionaryLauncherButtons"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:paddingRight="5dip" >
-        </LinearLayout>
-
-        <TextView
-            android:id="@+id/dictionaryName"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="English-German"
-            android:textAppearance="?android:attr/textAppearanceLarge"
-            tools:ignore="HardcodedText" />
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/dictionaryDetails"
-        android:layout_width="fill_parent"
-        android:layout_height="0dip"
-        android:layout_weight="1"
-        android:text="@string/indexInfo"
-        android:textAppearance="?android:attr/textAppearanceSmall"
-        tools:ignore="HardcodedText" />
-
-</LinearLayout>
\ No newline at end of file
index 89164bd047f5e1b55420a6804aaf8d42e15b042f..867abff47e2b54ecab1eeb289fb041440f66be56 100644 (file)
@@ -7,10 +7,4 @@
           android:showAsAction="always"
           android:actionViewClass="com.actionbarsherlock.widget.SearchView" />
         
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:showAsAction="never"
-        android:title="@string/settings"/>
-
 </menu>
\ No newline at end of file
index f92c4f8f5b9a7b42210a7ffd487d2ae509925f8e..8af2fe036ae52e7096aa9ae0c02720829fa73c12 100644 (file)
@@ -26,6 +26,7 @@
   <string name="FI">Finnisch</string>
   <string name="FR">Französisch</string>
   <string name="GD">Schottisch-Gälisch</string>
+  <string name="GV">Manx</string>
   <string name="DE">Deutsch</string>
   <string name="EL">Griechisch</string>
   <string name="grc">Altgriechisch</string>
index 83c06cbd44552eb0b14c6df6b2c5edd11be6afe0..dddd1915a85f37bb2b00c5c7291b29d6d4f75bd6 100644 (file)
@@ -46,7 +46,7 @@
   
   <!-- About dictionary. -->
   <string name="dictionaryPath">Datei: %s</string> 
-  <string name="dictionarySize">Grosse: %,d bytes</string> 
+  <string name="dictionarySize">Größe: %,d bytes</string> 
   <string name="dictionaryCreationTime">Hergestellt: %tc</string> 
   <string name="indexName">Index: %s</string> 
   <string name="mainTokenCount">Wortzahl: %,d</string> 
@@ -73,7 +73,7 @@
   <string name="openingConnection">Verbindungsaufbau…</string>
   <string name="downloading">Herunterladen: %1$,d von %2$,d Bytes.</string>
   <string name="unzipping">Entpackung: %1$,d von %2$,d Bytes.</string>
-  <string name="downloadFinished">Fertig: %,d Bytes.</string>
+  <string name="downloadFinished">Fertig: \n%s.</string>
   <string name="errorDownloadingFile">"Fehler beim Herunterladen: \n%s"</string>
 
        <!-- Preferences -->
index be416628911593dc3eb70f2d7995e18d7f490973..851d9f0c25ac83eb03ae363c160555c6a33fe1b2 100644 (file)
@@ -14,6 +14,7 @@
   <string name="CA">Catalán</string>
   <string name="CS">Checo</string>
   <string name="ZH">Chino (Mandarín)</string>
+  <string name="cmn">Mandarín</string>
   <string name="DA">Danés</string>
   <string name="NL">Holandés</string>
   <string name="EN">Inglés</string>
@@ -22,6 +23,7 @@
   <string name="FI">Finés</string>
   <string name="FR">Francés</string>
   <string name="GD">Gaélico escocés</string>
+  <string name="GV">Manx</string>
   <string name="DE">Alemán</string>
   <string name="EL">Griego</string>
   <string name="grc">Griego Antiguo</string>
index eab01443a1835cf3dc0261589837c1207cbf4701..cd7fa4b476a143a9a9cc1b6cc83797cc5a44fb34 100644 (file)
@@ -24,6 +24,9 @@
   <string name="managerFilterText">Listar filtro</string>
   <string name="managerFilterCheckbox">Sólo local</string>
   
+  <!-- Download. -->
+  <string name="downloadFinished">Terminado: \n%s.</string>
+  <string name="downloadFailed">Error descargando archivo: \n%s</string>  
 
   <string name="thanksForUpdatingVersion">4.0.1_en_a</string>
 
@@ -68,14 +71,6 @@ Por favor envíe comentarios, sugerencias, informes de error o simplemente un sa
   <string name="license">QuickDic contiene código con derechos de autor de Google y publicado bajo la licencia Apache 2.0.</string>
   <string name="licenseUrl">http://www.apache.org/licenses/LICENSE-2.0</string>
  
-       <!-- Download. -->
-  <string name="openingConnection">Abriendo conexión…</string>
-  <string name="downloading">Descargando: %1$,d of %2$,d bytes.</string>
-  <string name="unzipping">Descomprimiendo: %1$,d of %2$,d bytes.</string>
-  <string name="downloadFinished">Terminado: %,d bytes.</string>
-  <string name="errorDownloadingFile">Error descargando archivo: \n%s</string>  
-
 
        <!-- Preferences -->
 
@@ -115,6 +110,6 @@ Por favor envíe comentarios, sugerencias, informes de error o simplemente un sa
   
   <string name="themeKey">theme</string>
   <string name="themeTitle">Tema</string>
-  <string name="themeSummary">Color y tema del interfaz de usuario.</string>
+  <string name="themeSummary">Color y tema de la interfaz de usuario.</string>
   
 </resources>
index 0351f3b38beeb981fbc2b56bb68adc28c5a7548a..9a2555a2cd3c916b538bd6442a4f108eaa8a37eb 100644 (file)
@@ -23,6 +23,7 @@
   <string name="FI">Finlandese</string>
   <string name="FR">Francese</string>
   <string name="GD">Gaelico scozzese</string>
+  <string name="GV">Manx</string>
   <string name="DE">Tedesco</string>
   <string name="EL">Greco</string>
   <string name="grc">Greco antico</string>
index 0bbcfc65768be87ec5a1c4593ee5ccecb95ecb00..618e7950f70ac5499d5191ebc0fed01ebe7758a7 100644 (file)
@@ -67,8 +67,8 @@ QuickDic contiene codice con copyright di Google e rilasciato sotto licenza Apac
 <string name="openingConnection">Apertura connessione…</string>
 <string name="downloading">Downloading: %1$,d of %2$,d bytes.</string>
 <string name="unzipping">Decompressione: %1$,d of %2$,d bytes.</string>
-<string name="downloadFinished">Terminato: %,d bytes.</string>
-<string name="errorDownloadingFile">Errore nel dowload del file: \n%s</string>
+<string name="downloadFinished">Terminato: \n%s.</string>
+<string name="downloadFailed">Errore nel dowload del file: \n%s</string>
 <!-- Preferences -->
 <string name="quickdicDirectoryKey">QuickDic Directory</string>
 <string name="quickdicDirectoryTitle">QuickDic Directory</string>
index 0f4c7b9301be59994ffb323f9c90571730beaaac..6d06d6e7e0e0d61b0a5a3531f6290e8d500d1e11 100644 (file)
   <string name="noDictionariesOnDevice">No dictionaries on device</string>
   <string name="downloadableDictionaries">Downloadable dictionaries</string>
   <string name="downloadButton">%.1fMB</string>
+  <string name="updateAvailable">UPDATE!</string>
   <string name="moveToTop">Move to top</string>
   <string name="deleteDictionary">Delete dictionary</string>
   <string name="indexInfo">%1$s: %2$,d words</string>
   <string name="managerFilterText">List filter</string>
   <string name="managerShow">Show</string>
   <string name="managerHide">Hide</string>
+  
+  <string name="error">Error</string>
+  <string name="unableToReadDictionaryDir">Unable to read dictionary directory: \n%1$s\n\nAndroid external storage directory: \n%2$s</string>
+  
+  <!-- Download. -->
+  <string name="downloadFinished">Download finished: \n%s.</string>
+  <string name="downloadFailed">Download failed: \n%s.</string>  
+  
+  
 
   <string name="thanksForUpdatingVersion">4.0.1_en_a</string>
 
@@ -59,7 +69,6 @@
   <string name="sources">Sources</string> 
   <string name="sourceInfo">%1$s : %2$,d entries</string> 
   
-
   
        <!-- About. -->
   <string name="thadHughes">Thad Hughes</string>
   <string name="licenseUrl">http://www.apache.org/licenses/LICENSE-2.0</string>
  
  
-       <!-- Download. -->
-  <string name="downloadFinished">Download finished: \n%s.</string>
-  <string name="downloadFailed">Download failed: \n%s.</string>  
-  
-
        <!-- Preferences -->
 
   <string name="defaultDicKey">defaultddic</string>
@@ -88,8 +92,7 @@
 
   <string name="quickdicDirectoryKey">quickdicDirectory</string>
   <string name="quickdicDirectoryTitle">QuickDic directory</string>
-  <string name="quickdicDirectorySummary">The directory where QuickDic stores dictionaries.</string>
-  <string name="quickdicDirectoryDefault">/sdcard/quickDic/</string>
+  <string name="quickdicDirectorySummary">The directory where QuickDic stores dictionaries (empty for default quickDic folder on external storage).</string>
   
   <string name="wordListFileKey">wordListFile</string>
   <string name="wordListFileTitle">Word list file</string>
   <string name="clickOpensContextMenuTitle">Click opens context menu</string>
   <string name="clickOpensContextMenuSummary">Open context menu for clicks on entries (long-click will always open-context menu).</string>
 
-  <string name="showClearSearchTextButtonKey">showClearSearchTextButton</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="showPrevNextButtonsKey">showPrevNextButtons</string>
   <string name="showPrevNextButtonsTitle">Show up/down buttons</string>
   <string name="showPrevNextButtonsSummary">Show or hide the previous and next word buttons in the dictionary view.</string>
index 4b948a079f0f4618fc892d95b6a9ac4ca64b2dc0..56df4ff2f18268b5d2163a11f48dd75703eee1d1 100644 (file)
@@ -11,7 +11,7 @@
     android:key="@string/quickdicDirectoryKey"\r
     android:title="@string/quickdicDirectoryTitle" \r
     android:summary="@string/quickdicDirectorySummary"\r
-    android:defaultValue="@string/quickdicDirectoryDefault"\r
+    android:defaultValue=""\r
     android:persistent="true"\r
   />\r
 \r
index c3c67753342913a71aa729fede5fe68c325dbf3c..f8dca37d5dbf03192cb842782c687e735204c652 100644 (file)
@@ -196,7 +196,7 @@ public class DictionaryActivity extends SherlockListActivity {
     public void onCreate(Bundle savedInstanceState) {
         Log.d(LOG, "onCreate:" + this);
         super.onCreate(savedInstanceState);
-
+        
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         
         // Don't auto-launch if this fails.
index 52c3af299c342fdd42ad59608bf071eef5b13b3d..30d8067158303bf0d38b023e3f681a9c4da2904b 100644 (file)
@@ -20,6 +20,7 @@ import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 import android.net.Uri;
+import android.os.Environment;
 import android.preference.PreferenceManager;
 import android.util.Log;
 import android.util.TypedValue;
@@ -119,7 +120,6 @@ public class DictionaryApplication extends Application {
     
     languageButtonPixels = (int) TypedValue.applyDimension(
             TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics());
-
     
     // Load the dictionaries we know about.
     dictionaryConfig = PersistentObjectCache.init(getApplicationContext()).read(
@@ -191,14 +191,17 @@ public class DictionaryApplication extends Application {
   }
   
   public synchronized File getDictDir() {
-    // This metaphore doesn't work, because we've already reset prefsMightHaveChanged.
+    // This metaphor doesn't work, because we've already reset prefsMightHaveChanged.
 //    if (dictDir == null || PreferenceActivity.prefsMightHaveChanged) {
       final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-      final String dir = prefs.getString(getString(R.string.quickdicDirectoryKey), getString(R.string.quickdicDirectoryDefault));
+      final File defaultDictDir = new File(Environment.getExternalStorageDirectory(), "quickDic");
+      String dir = prefs.getString(getString(R.string.quickdicDirectoryKey), defaultDictDir.getAbsolutePath());
+      if (dir.isEmpty()) {
+          dir = defaultDictDir.getAbsolutePath();
+      }
       dictDir = new File(dir);
       dictDir.mkdirs();
-//    }
-    return dictDir;
+      return dictDir;
   }
   
   public C.Theme getSelectedTheme() {
index 094034c5ccc9c60e427d2946a796f24e00e3689e..e3e76ad72a3c2f3b6944f0603a11f55c1813580e 100644 (file)
@@ -14,6 +14,8 @@
 
 package com.hughes.android.dictionary;
 
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.app.DownloadManager;
 import android.app.DownloadManager.Request;
 import android.content.BroadcastReceiver;
@@ -39,6 +41,7 @@ import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.BaseAdapter;
 import android.widget.Button;
 import android.widget.CompoundButton;
+import android.widget.ListView;
 import android.widget.Toast;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.LinearLayout;
@@ -165,6 +168,7 @@ public class DictionaryManagerActivity extends SherlockListActivity {
         return intent;
     }
 
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
 
@@ -172,15 +176,17 @@ public class DictionaryManagerActivity extends SherlockListActivity {
         Log.d(LOG, "onCreate:" + this);
 
         application = (DictionaryApplication) getApplication();
-
+        
+        blockAutoLaunch = false;
+        
         // UI init.
         setContentView(R.layout.dictionary_manager_activity);
 
         dictionariesOnDeviceHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate(
-                R.layout.dictionaries_on_device_header_row, getListView(), false);
+                R.layout.dictionary_manager_header_row_on_device, getListView(), false);
 
         downloadableDictionariesHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate(
-                R.layout.downloadable_dictionaries_header_row, getListView(), false);
+                R.layout.dictionary_manager_header_row_downloadable, getListView(), false);
 
         showDownloadable = (ToggleButton) downloadableDictionariesHeaderRow.findViewById(R.id.hideDownloadable);
         showDownloadable.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@@ -190,7 +196,6 @@ public class DictionaryManagerActivity extends SherlockListActivity {
             }
         });
 
-        blockAutoLaunch = false;
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         final String thanksForUpdatingLatestVersion = getString(R.string.thanksForUpdatingVersion);
         if (!prefs.getString(C.THANKS_FOR_UPDATING_VERSION, "").equals(
@@ -207,10 +212,24 @@ public class DictionaryManagerActivity extends SherlockListActivity {
         
         setListAdapater();
         registerForContextMenu(getListView());
+        
+        final File dictDir = application.getDictDir();
+        if (!dictDir.canRead() || !dictDir.canExecute()) {
+            blockAutoLaunch = true;
+            
+            AlertDialog.Builder builder = new AlertDialog.Builder(getListView().getContext());
+            builder.setTitle(getString(R.string.error));
+            builder.setMessage(getString(
+                    R.string.unableToReadDictionaryDir, 
+                    dictDir.getAbsolutePath(), 
+                    Environment.getExternalStorageDirectory()));
+            builder.create().show();
+        }
     }
     
     @Override
     public void onDestroy() {
+        super.onDestroy();
         unregisterReceiver(broadcastReceiver);
     }
     
@@ -429,6 +448,8 @@ public class DictionaryManagerActivity extends SherlockListActivity {
             if (convertView instanceof LinearLayout && 
                     convertView != dictionariesOnDeviceHeaderRow && 
                     convertView != downloadableDictionariesHeaderRow) {
+                /* This is done to try to avoid leaking memory that used to 
+                 * happen on Android 4.0.3 */
                 ((LinearLayout)convertView).removeAllViews();
             }
             
@@ -438,15 +459,13 @@ public class DictionaryManagerActivity extends SherlockListActivity {
                 if (row.dictionaryInfo == null) {
                     return dictionariesOnDeviceHeaderRow;
                 }
-                return createDictionaryRow(row.dictionaryInfo, 
-                        parent, R.layout.dictionaries_on_device_row, true);
+                return createDictionaryRow(row.dictionaryInfo, parent, true);
             }
             
             if (row.dictionaryInfo == null) {
                 return downloadableDictionariesHeaderRow;
             }
-            return createDictionaryRow(row.dictionaryInfo, 
-                    parent, R.layout.downloadable_dictionary_row, false);
+            return createDictionaryRow(row.dictionaryInfo, parent, false);
         }
         
     }
@@ -457,41 +476,36 @@ public class DictionaryManagerActivity extends SherlockListActivity {
         setListAdapter(new MyListAdapter(filters));
     }
 
-    private View createDictionaryRow(final DictionaryInfo dictionaryInfo, final ViewGroup parent, 
-            final int viewResource, final boolean canLaunch) {
+    private View createDictionaryRow(final DictionaryInfo dictionaryInfo, 
+            final ViewGroup parent, final boolean canLaunch) {
         
         View row = LayoutInflater.from(parent.getContext()).inflate(
-                viewResource, parent, false);
+                R.layout.dictionary_manager_row, parent, false);
         final TextView name = (TextView) row.findViewById(R.id.dictionaryName);
         final TextView details = (TextView) row.findViewById(R.id.dictionaryDetails);
         name.setText(application.getDictionaryName(dictionaryInfo.uncompressedFilename));
 
-        if (!canLaunch) {
-            final Button downloadButton = (Button) row.findViewById(R.id.downloadButton);
-            downloadButton.setText(getString(R.string.downloadButton, dictionaryInfo.zipBytes / 1024.0 / 1024.0));
+        final boolean updateAvailable = application.updateAvailable(dictionaryInfo);
+        final Button downloadButton = (Button) row.findViewById(R.id.downloadButton);
+        if (!canLaunch || updateAvailable) {
+            downloadButton.setText(getString(R.string.downloadButton, application.getDownloadable(dictionaryInfo.uncompressedFilename).zipBytes / 1024.0 / 1024.0));
             downloadButton.setMinWidth(application.languageButtonPixels * 3 / 2);
             downloadButton.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View arg0) {
-                    DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
-                    Request request = new Request(
-                            Uri.parse(dictionaryInfo.downloadUrl));
-                    try {
-                        final String destFile = new File(new URL(dictionaryInfo.downloadUrl).getFile()).getName(); 
-                        Log.d(LOG, "Downloading to: " + destFile);
-                        
-                        request.setDestinationUri(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), destFile)));
-                    } catch (MalformedURLException e) {
-                        throw new RuntimeException(e);
-                    }
-                    downloadManager.enqueue(request);
+                    downloadDictionary(dictionaryInfo);
                 }
             });
+        } else {
+            downloadButton.setVisibility(View.INVISIBLE);
         }
 
-        final StringBuilder builder = new StringBuilder();
         LinearLayout buttons = (LinearLayout) row.findViewById(R.id.dictionaryLauncherButtons);
         final List<IndexInfo> sortedIndexInfos = application.sortedIndexInfos(dictionaryInfo.indexInfos);
+        final StringBuilder builder = new StringBuilder();
+        if (updateAvailable) {
+            builder.append(getString(R.string.updateButton));
+        }
         for (IndexInfo indexInfo : sortedIndexInfos) {
             final View button = application.createButton(buttons.getContext(), dictionaryInfo, indexInfo);
             buttons.addView(button);
@@ -520,5 +534,20 @@ public class DictionaryManagerActivity extends SherlockListActivity {
         
         return row;
     }
+    
+    private void downloadDictionary(final DictionaryInfo dictionaryInfo) {
+        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+        Request request = new Request(
+                Uri.parse(dictionaryInfo.downloadUrl));
+        try {
+            final String destFile = new File(new URL(dictionaryInfo.downloadUrl).getFile()).getName(); 
+            Log.d(LOG, "Downloading to: " + destFile);
+            
+            request.setDestinationUri(Uri.fromFile(new File(Environment.getExternalStorageDirectory(), destFile)));
+        } catch (MalformedURLException e) {
+            throw new RuntimeException(e);
+        }
+        downloadManager.enqueue(request);
+    }
 
 }
index adbbcd17e663013f85cb19aaaca1be22c259c872..72f25ffc70c2e0102b3036a85708b7ed38e8266c 100644 (file)
--- a/todo.txt
+++ b/todo.txt
@@ -1,3 +1,3 @@
-* Application: fix which directory the thing uses: use default SD card instead of what's in prefs.
-* Show download button when dictionaries can be updated.
-* Text rows are too tall.
\ No newline at end of file
+* Contributions from:
+* Unable to read quickdic dir message.
+* HtmlEntries inline, expandable.
\ No newline at end of file