]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Using ListView again for DictionaryManager, downloads working with
authorThad Hughes <thadh@google.com>
Tue, 24 Dec 2013 22:07:54 +0000 (14:07 -0800)
committerThad Hughes <thadh@google.com>
Tue, 24 Dec 2013 22:07:54 +0000 (14:07 -0800)
DownloadManager, filtering working again.

17 files changed:
res/drawable-hdpi/ic_action_download.png [new file with mode: 0644]
res/drawable-hdpi/ic_launcher.png [deleted file]
res/drawable-mdpi/ic_action_download.png [new file with mode: 0644]
res/drawable-mdpi/ic_launcher.png [deleted file]
res/drawable-xhdpi/ic_action_download.png [new file with mode: 0644]
res/drawable-xhdpi/ic_launcher.png [deleted file]
res/drawable-xxhdpi/ic_action_download.png [new file with mode: 0644]
res/layout/dictionaries_on_device_header_row.xml [new file with mode: 0644]
res/layout/dictionaries_on_device_row.xml [moved from res/layout/dictionary_on_device_row.xml with 100% similarity]
res/layout/dictionary_manager_activity.xml
res/layout/downloadable_dictionaries_header_row.xml [new file with mode: 0644]
res/layout/downloadable_dictionary_row.xml [moved from res/layout/dictionary_manager_row.xml with 72% similarity]
res/values/strings.xml
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/DictionaryApplication.java
src/com/hughes/android/dictionary/DictionaryManagerActivity.java
src/com/hughes/android/dictionary/PreferenceActivity.java

diff --git a/res/drawable-hdpi/ic_action_download.png b/res/drawable-hdpi/ic_action_download.png
new file mode 100644 (file)
index 0000000..1f3d065
Binary files /dev/null and b/res/drawable-hdpi/ic_action_download.png differ
diff --git a/res/drawable-hdpi/ic_launcher.png b/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644 (file)
index 288b665..0000000
Binary files a/res/drawable-hdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-mdpi/ic_action_download.png b/res/drawable-mdpi/ic_action_download.png
new file mode 100644 (file)
index 0000000..c2ead0c
Binary files /dev/null and b/res/drawable-mdpi/ic_action_download.png differ
diff --git a/res/drawable-mdpi/ic_launcher.png b/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644 (file)
index 6ae570b..0000000
Binary files a/res/drawable-mdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-xhdpi/ic_action_download.png b/res/drawable-xhdpi/ic_action_download.png
new file mode 100644 (file)
index 0000000..38a3aee
Binary files /dev/null and b/res/drawable-xhdpi/ic_action_download.png differ
diff --git a/res/drawable-xhdpi/ic_launcher.png b/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644 (file)
index d4fb7cd..0000000
Binary files a/res/drawable-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/res/drawable-xxhdpi/ic_action_download.png b/res/drawable-xxhdpi/ic_action_download.png
new file mode 100644 (file)
index 0000000..ef7785a
Binary files /dev/null and b/res/drawable-xxhdpi/ic_action_download.png differ
diff --git a/res/layout/dictionaries_on_device_header_row.xml b/res/layout/dictionaries_on_device_header_row.xml
new file mode 100644 (file)
index 0000000..eb60d4e
--- /dev/null
@@ -0,0 +1,20 @@
+<?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:id="@+id/onDeviceHeaderLayout"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/gray"
+    android:orientation="horizontal"
+    android:padding="10dip" >
+
+    <TextView
+        android:id="@+id/onDeviceTextId"
+        android:layout_width="0dip"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"
+        android:text="@string/dictionariesOnDevice"
+        android:textAppearance="?android:attr/textAppearanceLarge" />
+
+</LinearLayout>
\ No newline at end of file
index 95164c859b8ba5578529efe8c2c56501ff8dc719..790f7f8a3471f8497592ea0d35582a59e3a135d1 100644 (file)
@@ -5,77 +5,14 @@
     android:layout_height="fill_parent"
     android:orientation="vertical" >
 
-    <ScrollView
-        android:id="@+id/scrollView"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" >
-
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="vertical" >
-
-            <!-- Dictionaries on device -->
-
-            <LinearLayout
-                android:id="@+id/onDeviceHeaderLayout"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:background="@color/gray"
-                android:orientation="horizontal"
-                android:padding="10dip" >
-
-                <TextView
-                    android:id="@+id/onDeviceTextId"
-                    android:layout_width="0dip"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:text="@string/dictionariesOnDevice"
-                    android:textAppearance="?android:attr/textAppearanceLarge" />
-            </LinearLayout>
-
-            <LinearLayout
-                android:id="@+id/dictionariesOnDeviceGoHere"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical"
-                android:paddingBottom="10dip" >
-            </LinearLayout>
-
-            <!-- Downloadable dictionaries -->
-
-            <LinearLayout
-                android:id="@+id/downloadableHeaderLayout"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:background="@color/gray"
-                android:orientation="horizontal"
-                android:padding="10dip" >
-
-                <TextView
-                    android:id="@+id/downloadableTextId"
-                    android:layout_width="0dip"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="1"
-                    android:text="@string/downloadableDictionaries"
-                    android:textAppearance="?android:attr/textAppearanceLarge" />
-
-                <ToggleButton
-                    android:id="@+id/hideDownloadable"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:layout_weight="0"
-                    android:textOff="@string/managerHide"
-                    android:textOn="@string/managerShow" />
-            </LinearLayout>
-
-            <LinearLayout
-                android:id="@+id/downloadableDictionariesGoHere"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:orientation="vertical" >
-            </LinearLayout>
-        </LinearLayout>
-    </ScrollView>
+    <ListView
+        android:id="@id/android:list"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:choiceMode="singleChoice"
+        android:clickable="true"
+        android:fastScrollEnabled="true"
+        android:focusable="true"
+        android:focusableInTouchMode="true" />
 
 </LinearLayout>
\ No newline at end of file
diff --git a/res/layout/downloadable_dictionaries_header_row.xml b/res/layout/downloadable_dictionaries_header_row.xml
new file mode 100644 (file)
index 0000000..b5c5368
--- /dev/null
@@ -0,0 +1,36 @@
+<?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:id="@+id/onDeviceHeaderLayout"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/gray"
+    android:orientation="horizontal"
+    android:padding="10dip" >
+
+    <LinearLayout
+        android:id="@+id/downloadableHeaderLayout"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@color/gray"
+        android:orientation="horizontal"
+        android:padding="10dip" >
+
+        <TextView
+            android:id="@+id/downloadableTextId"
+            android:layout_width="0dip"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:text="@string/downloadableDictionaries"
+            android:textAppearance="?android:attr/textAppearanceLarge" />
+
+        <ToggleButton
+            android:id="@+id/hideDownloadable"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_weight="0"
+            android:textOff="@string/managerHide"
+            android:textOn="@string/managerShow" />
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
similarity index 72%
rename from res/layout/dictionary_manager_row.xml
rename to res/layout/downloadable_dictionary_row.xml
index 175b21f7be0bcfcb1f22f693f9043d67e6a362a5..e4f59889533359b8d42de3c049e3bb3eb743a922 100644 (file)
         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"
+            android:textAppearance="?android:attr/textAppearanceMedium"
             tools:ignore="HardcodedText" />
 
         <Button
-            android:id="@+id/dictionaryDownloadButton"
+            android:id="@+id/downloadButton"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_weight="0"
-            android:drawableLeft="@android:drawable/ic_menu_add"
+            android:drawableRight="@drawable/ic_action_download"
+            android:textAppearance="?android:attr/textAppearanceSmall"
             android:text="@string/downloadButton" />
     </LinearLayout>
 
index 305eac4dbaf3a3d6da840ad80a4bb04bc97a576f..795e1467e2e7686a123c8854d70d885866b516aa 100644 (file)
   <string name="help">Help</string>
   <string name="reportIssue">Report issue…</string>
   <string name="fontWorkaround">Detected font problem (common on Sony Ericsson devices), switching back to default font.</string>
-  <string name="clearSearchText">Clear search text</string>
-  
   
   <string name="no_dict_file">Please specify a default directory in the settings.</string>
-    
   
   
    <!-- DictionaryManagerActivity -->
index bf93cecdd82eec2c4bd271b1ee55aed3462fee2b..c3c67753342913a71aa729fede5fe68c325dbf3c 100644 (file)
@@ -200,7 +200,7 @@ public class DictionaryActivity extends SherlockListActivity {
         final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
         
         // Don't auto-launch if this fails.
-        prefs.edit().remove(C.INDEX_SHORT_NAME).commit(); 
+        prefs.edit().remove(C.DICT_FILE).commit(); 
 
         setTheme(((DictionaryApplication) getApplication()).getSelectedTheme().themeId);
 
@@ -233,7 +233,7 @@ public class DictionaryActivity extends SherlockListActivity {
                if(intent.getStringExtra(C.DICT_FILE) == null && (from != null || to != null))
                {
                        Log.d(LOG, "DictSearch: from: " + from + " to " + to);
-                       List<DictionaryInfo> dicts = application.getDictionariesOnDevice();
+                       List<DictionaryInfo> dicts = application.getDictionariesOnDevice(null);
                        for(DictionaryInfo info : dicts)
                        {
                                boolean hasFrom = from == null;
@@ -336,7 +336,6 @@ public class DictionaryActivity extends SherlockListActivity {
                 break;
             }
         }
-        indexIndex %= dictionary.indices.size();
         Log.d(LOG, "Loading index " + indexIndex);
         index = dictionary.indices.get(indexIndex);
         setListAdapter(new IndexAdapter(index));
@@ -435,7 +434,7 @@ public class DictionaryActivity extends SherlockListActivity {
         
         searchView = new SearchView(getSupportActionBar().getThemedContext());
         searchView.setIconifiedByDefault(false);
-        // searchView.setIconified(false); // puts the magifying glass in the
+        // searchView.setIconified(false); // puts the magnifying glass in the
         // wrong place.
         searchView.setQueryHint(getString(R.string.searchText));
         searchView.setSubmitButtonEnabled(false);
@@ -613,7 +612,7 @@ public class DictionaryActivity extends SherlockListActivity {
         dialog.setContentView(R.layout.select_dictionary_dialog);
         dialog.setTitle(R.string.selectDictionary);
 
-        final List<DictionaryInfo> installedDicts = application.getDictionariesOnDevice();
+        final List<DictionaryInfo> installedDicts = application.getDictionariesOnDevice(null);
 
         ListView listView = (ListView) dialog.findViewById(android.R.id.list);
         final Button button = new Button(listView.getContext());
index c2bb8457a216ea50872f2331985e6c66025471d8..52c3af299c342fdd42ad59608bf071eef5b13b3d 100644 (file)
@@ -400,28 +400,41 @@ public class DictionaryApplication extends Application {
         }
       }}).start();
   }
+  
+  public boolean matchesFilters(final DictionaryInfo dictionaryInfo, final String[] filters) {
+      if (filters == null) {
+          return true;
+      }
+      for (final String filter : filters) {
+          if (!getDictionaryName(dictionaryInfo.uncompressedFilename).toLowerCase().contains(filter)) {
+              return false;
+          }
+      }
+      return true;
+  }
 
-  public synchronized List<DictionaryInfo> getDictionariesOnDevice() {
+  public synchronized List<DictionaryInfo> getDictionariesOnDevice(String[] filters) {
     final List<DictionaryInfo> result = new ArrayList<DictionaryInfo>(dictionaryConfig.dictionaryFilesOrdered.size());
     for (final String uncompressedFilename : dictionaryConfig.dictionaryFilesOrdered) {
       final DictionaryInfo dictionaryInfo = dictionaryConfig.uncompressedFilenameToDictionaryInfo.get(uncompressedFilename);
-      if (dictionaryInfo != null) {
+      if (dictionaryInfo != null && matchesFilters(dictionaryInfo, filters)) {
         result.add(dictionaryInfo);
       }
     }
     return result;
   }
   
-  public List<DictionaryInfo> getDownloadableDictionaries() {
+  public List<DictionaryInfo> getDownloadableDictionaries(String[] filters) {
       final List<DictionaryInfo> result = new ArrayList<DictionaryInfo>(dictionaryConfig.dictionaryFilesOrdered.size());
       
-      // The downloadable ones.
-      final Map<String,DictionaryInfo> remaining = new LinkedHashMap<String, DictionaryInfo>(DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO);
+      final Map<String, DictionaryInfo> remaining = new LinkedHashMap<String, DictionaryInfo>(DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO);
       remaining.keySet().removeAll(dictionaryConfig.dictionaryFilesOrdered);
-      final List<DictionaryInfo> toAddSorted = new ArrayList<DictionaryInfo>(remaining.values());
-      Collections.sort(toAddSorted, dictionaryInfoComparator);
-      result.addAll(toAddSorted);
-      
+      for (final DictionaryInfo dictionaryInfo : remaining.values()) {
+          if (matchesFilters(dictionaryInfo, filters)) {
+              result.add(dictionaryInfo);
+          }
+      }
+      Collections.sort(result, dictionaryInfoComparator);
       return result;
   }
   
@@ -430,8 +443,11 @@ public class DictionaryApplication extends Application {
   }
 
   public boolean updateAvailable(final DictionaryInfo dictionaryInfo) {
-    final DictionaryInfo downloadable = DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO.get(dictionaryInfo.uncompressedFilename);
-    return downloadable != null && downloadable.creationMillis > dictionaryInfo.creationMillis;
+    final DictionaryInfo downloadable = 
+            DOWNLOADABLE_UNCOMPRESSED_FILENAME_NAME_TO_DICTIONARY_INFO.get(
+                    dictionaryInfo.uncompressedFilename);
+    return downloadable != null && 
+            downloadable.creationMillis > dictionaryInfo.creationMillis;
   }
 
   public DictionaryInfo getDownloadable(final String uncompressedFilename) {
index e668b760f480b79e640f5da8696711527a928947..c1f276675ad7b31785419fd451bc7b274ea9b603 100644 (file)
 
 package com.hughes.android.dictionary;
 
+import android.app.DownloadManager;
+import android.app.DownloadManager.Request;
+import android.content.BroadcastReceiver;
+import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.Handler;
 import android.preference.PreferenceManager;
-import android.text.Editable;
-import android.text.TextWatcher;
 import android.util.Log;
-import android.view.ContextMenu;
-import android.view.ContextMenu.ContextMenuInfo;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.AdapterContextMenuInfo;
-import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
 import android.widget.Button;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 import android.widget.ToggleButton;
 
-import com.actionbarsherlock.app.SherlockActivity;
 import com.actionbarsherlock.app.SherlockListActivity;
 import com.actionbarsherlock.view.Menu;
 import com.actionbarsherlock.view.MenuInflater;
 import com.actionbarsherlock.widget.SearchView;
 import com.actionbarsherlock.widget.SearchView.OnQueryTextListener;
 import com.hughes.android.dictionary.DictionaryInfo.IndexInfo;
-import com.hughes.android.dictionary.engine.Language;
-import com.hughes.android.dictionary.engine.Language.LanguageResources;
 import com.hughes.android.util.IntentLauncher;
 
 import java.io.File;
-import java.util.ArrayList;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
 import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
-public class DictionaryManagerActivity extends SherlockActivity {
+// Filters
+// Right-click:
+//  Delete, move to top.
+
+public class DictionaryManagerActivity extends SherlockListActivity {
 
     static final String LOG = "QuickDic";
     static boolean blockAutoLaunch = false;
@@ -69,10 +77,25 @@ public class DictionaryManagerActivity extends SherlockActivity {
     SearchView filterSearchView;
     ToggleButton showDownloadable;
 
-    LinearLayout dictionariesOnDevice;
-    LinearLayout downloadableDictionaries;
+    LinearLayout dictionariesOnDeviceHeaderRow;
+    LinearLayout downloadableDictionariesHeaderRow;
 
     Handler uiHandler;
+    
+    Runnable dictionaryUpdater = new Runnable() {
+        @Override
+        public void run() {
+            if (uiHandler == null) {
+                return;
+            }
+            uiHandler.post(new Runnable() {
+                @Override
+                public void run() {
+                    setListAdapater();
+                }
+            });
+        }
+    };
 
     public static Intent getLaunchIntent() {
         final Intent intent = new Intent();
@@ -93,8 +116,11 @@ public class DictionaryManagerActivity extends SherlockActivity {
         // UI init.
         setContentView(R.layout.dictionary_manager_activity);
 
-        dictionariesOnDevice = (LinearLayout) findViewById(R.id.dictionariesOnDeviceGoHere);
-        downloadableDictionaries = (LinearLayout) findViewById(R.id.downloadableDictionariesGoHere);
+        dictionariesOnDeviceHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate(
+                R.layout.dictionaries_on_device_header_row, getListView(), false);
+
+        downloadableDictionariesHeaderRow = (LinearLayout) LayoutInflater.from(getListView().getContext()).inflate(
+                R.layout.downloadable_dictionaries_header_row, getListView(), false);
 
         // filterText = (EditText) findViewById(R.id.filterText);
         //
@@ -125,7 +151,7 @@ public class DictionaryManagerActivity extends SherlockActivity {
         // }
         // });
 
-        showDownloadable = (ToggleButton) findViewById(R.id.hideDownloadable);
+        showDownloadable = (ToggleButton) downloadableDictionariesHeaderRow.findViewById(R.id.hideDownloadable);
         showDownloadable.setOnCheckedChangeListener(new OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -146,6 +172,70 @@ public class DictionaryManagerActivity extends SherlockActivity {
             prefs.edit().putString(C.THANKS_FOR_UPDATING_VERSION, thanksForUpdatingLatestVersion)
                     .commit();
         }
+        
+        BroadcastReceiver receiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                final String action = intent.getAction();
+                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
+                    final long downloadId = intent.getLongExtra(
+                            DownloadManager.EXTRA_DOWNLOAD_ID, 0);
+                    final DownloadManager.Query query = new DownloadManager.Query();
+                    query.setFilterById(downloadId);
+                    final DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
+                    final Cursor cursor = downloadManager.query(query);
+                    
+                    if (!cursor.moveToFirst()) {
+                        Log.e(LOG, "Couldn't find download.");
+                        return;
+                    }
+                    
+                    final int status = cursor
+                            .getInt(cursor
+                                    .getColumnIndex(DownloadManager.COLUMN_STATUS));
+                    if (DownloadManager.STATUS_SUCCESSFUL != status){
+                    Log.w(LOG, "Download failed: status=" + status + ", reason=" + cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)));
+                    return;
+                }
+
+                final String dest = cursor
+                        .getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
+                Log.w(LOG, "Download finished: " + dest);
+                final File destFile = new File(Uri.parse(dest).getPath());
+                
+                try {
+                    ZipFile zipFile = new ZipFile(destFile);
+                    final ZipEntry zipEntry = zipFile.entries().nextElement();
+                    Log.d(LOG, "Unzipping entry: " + zipEntry.getName());
+                    final InputStream zipIn = zipFile.getInputStream(zipEntry);
+                    final OutputStream zipOut = new FileOutputStream(new File(application.getDictDir(), zipEntry.getName()));
+                    copyStream(zipIn, zipOut);
+                    destFile.delete();
+                    zipFile.close();
+                    application.backgroundUpdateDictionaries(dictionaryUpdater);
+                } catch (Exception e) {
+                    Log.e(LOG, "Failed to unzip.", e);
+                }
+              }
+            }
+        };
+        registerReceiver(receiver, new IntentFilter(
+                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+        
+        setListAdapater();
+    }
+    
+    private static int copyStream(final InputStream in, final OutputStream out)
+            throws IOException {
+        int bytesRead;
+        final byte[] bytes = new byte[1024 * 16];
+        while ((bytesRead = in.read(bytes)) != -1) {
+            out.write(bytes, 0, bytesRead);
+        }
+        in.close();
+        out.close();
+        return bytesRead;
     }
 
     @Override
@@ -177,30 +267,25 @@ public class DictionaryManagerActivity extends SherlockActivity {
                 getIntent().getBooleanExtra(C.CAN_AUTO_LAUNCH_DICT, true) &&
                 prefs.contains(C.DICT_FILE) &&
                 prefs.contains(C.INDEX_SHORT_NAME)) {
-            Log.d(LOG, "Skipping Dictionary List, going straight to dictionary.");
+            Log.d(LOG, "Skipping DictionaryManager, going straight to dictionary.");
             startActivity(DictionaryActivity.getLaunchIntent(
                     new File(prefs.getString(C.DICT_FILE, "")), prefs.getString(C.INDEX_SHORT_NAME, ""),
                     prefs.getString(C.SEARCH_TOKEN, "")));
             finish();
             return;
         }
+        
+        // Remove the active dictionary from the prefs so we won't autolaunch
+        // next time.
+        final Editor editor = prefs.edit();
+        editor.remove(C.DICT_FILE);
+        editor.remove(C.INDEX_SHORT_NAME);
+        editor.remove(C.SEARCH_TOKEN);
+        editor.commit();
 
-        application.backgroundUpdateDictionaries(new Runnable() {
-            @Override
-            public void run() {
-                if (uiHandler == null) {
-                    return;
-                }
-                uiHandler.post(new Runnable() {
-                    @Override
-                    public void run() {
-                        populateDictionaryLists("");
-                    }
-                });
-            }
-        });
+        application.backgroundUpdateDictionaries(dictionaryUpdater);
 
-        populateDictionaryLists("");
+        setListAdapater();
     }
 
     @Override
@@ -217,7 +302,7 @@ public class DictionaryManagerActivity extends SherlockActivity {
             
             @Override
             public boolean onQueryTextChange(String filterText) {
-                populateDictionaryLists(filterText);
+                setListAdapater();
                 return true;
             }
         });
@@ -284,24 +369,10 @@ public class DictionaryManagerActivity extends SherlockActivity {
 //
 //    }
 
-    private Intent getDownloadIntent(final DictionaryInfo downloadable) {
-        // DownloadManager downloadManager = (DownloadManager)
-        // getSystemService(DOWNLOAD_SERVICE);
-        // DownloadManager.Request request = new
-        // DownloadManager.Request(Uri.parse(""));
-        // long id = downloadManager.enqueue(request);
-        // DownloadManager.Query query;
-        return null;
-    }
-
     private void onShowLocalChanged() {
 //        downloadableDictionaries.setVisibility(showDownloadable.isChecked() ? View.GONE
 //                : View.VISIBLE);
-        if (filterSearchView != null) {
-            populateDictionaryLists(filterSearchView.getQuery().toString());
-        } else {
-            populateDictionaryLists("");
-        }
+        setListAdapater();
         Editor prefs = PreferenceManager.getDefaultSharedPreferences(this).edit();
         prefs.putBoolean(C.SHOW_DOWNLOADABLE, showDownloadable.isChecked());
         prefs.commit();
@@ -323,51 +394,132 @@ public class DictionaryManagerActivity extends SherlockActivity {
     // startActivity(intent);
     // }
     // }
+    
+    class MyListAdapter extends BaseAdapter {
+        
+        List<DictionaryInfo> dictionariesOnDevice;
+        List<DictionaryInfo> downloadableDictionaries;
+        
+        private MyListAdapter(final String[] filters) {
+            dictionariesOnDevice = application.getDictionariesOnDevice(filters);
+            if (showDownloadable.isChecked()) {
+                downloadableDictionaries = application.getDownloadableDictionaries(filters);
+            } else {
+                downloadableDictionaries = Collections.emptyList();
+            }
+        }
 
-    private void populateDictionaryLists(String filterText) {
-        // On device.
-        dictionariesOnDevice.removeAllViews();
-        {
-            final List<DictionaryInfo> dictionaryInfos = application.getDictionariesOnDevice();
-            for (final DictionaryInfo dictionaryInfo : dictionaryInfos) {
-                View row = LayoutInflater.from(dictionariesOnDevice.getContext()).inflate(
-                        R.layout.dictionary_on_device_row, dictionariesOnDevice, false);
-                final TextView name = (TextView) row.findViewById(R.id.dictionaryName);
-                name.setText(application.getDictionaryName(dictionaryInfo.uncompressedFilename));
-                
-                LinearLayout buttons = (LinearLayout) row.findViewById(R.id.dictionaryLauncherButtons);
-                final List<IndexInfo> sortedIndexInfos = application.sortedIndexInfos(dictionaryInfo.indexInfos);
-                for (IndexInfo indexInfo : sortedIndexInfos) {
-                    final View button = application.createButton(buttons.getContext(), dictionaryInfo, indexInfo);
-                    button.setOnClickListener(
-                            new IntentLauncher(buttons.getContext(), 
-                            DictionaryActivity.getLaunchIntent(application.getPath(dictionaryInfo.uncompressedFilename), indexInfo.shortName, "")));
-                    buttons.addView(button);
-                }
-                
-                dictionariesOnDevice.addView(row);
+        @Override
+        public int getCount() {
+            return 2 + dictionariesOnDevice.size() + downloadableDictionaries.size();
+        }
+
+        @Override
+        public Object getItem(int position) {
+            return Integer.valueOf(position);
+        }
+
+        @Override
+        public long getItemId(int position) {
+            return position;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            if (convertView instanceof LinearLayout && 
+                    convertView != dictionariesOnDeviceHeaderRow && 
+                    convertView != downloadableDictionariesHeaderRow) {
+                ((LinearLayout)convertView).removeAllViews();
+            }
+            // Dictionaries on device.
+            if (position == 0) {
+                return dictionariesOnDeviceHeaderRow;
             }
+            --position;
+            
+            if (position < dictionariesOnDevice.size()) {
+                return createDictionaryRow(dictionariesOnDevice.get(position), 
+                                parent, R.layout.dictionaries_on_device_row, true);
+            }
+            position -= dictionariesOnDevice.size();
+            
+            // Downloadable dictionaries.
+            if (position == 0) {
+                return downloadableDictionariesHeaderRow;
+            }
+            --position;
+            
+            assert position < downloadableDictionaries.size();
+            return createDictionaryRow(downloadableDictionaries.get(position), 
+                            parent, R.layout.downloadable_dictionary_row, false);
         }
+        
+    }
+    
 
-        // Downloadable.
-        downloadableDictionaries.removeAllViews();
-        if (showDownloadable.isChecked()) {
-            final List<DictionaryInfo> dictionaryInfos = application.getDownloadableDictionaries();
-            for (final DictionaryInfo dictionaryInfo : dictionaryInfos) {
-                View row = LayoutInflater.from(dictionariesOnDevice.getContext()).inflate(
-                        R.layout.dictionary_on_device_row, dictionariesOnDevice, false);
-                final TextView name = (TextView) row.findViewById(R.id.dictionaryName);
-                name.setText(application.getDictionaryName(dictionaryInfo.uncompressedFilename));
-                
-                LinearLayout buttons = (LinearLayout) row.findViewById(R.id.dictionaryLauncherButtons);
-                final List<IndexInfo> sortedIndexInfos = application.sortedIndexInfos(dictionaryInfo.indexInfos);
-                for (IndexInfo indexInfo : sortedIndexInfos) {
-                    final View button = application.createButton(buttons.getContext(), dictionaryInfo, indexInfo);
-                    buttons.addView(button);
+    private void setListAdapater() {
+        final String filter = filterSearchView == null ? "" : filterSearchView.getQuery().toString();
+        final String[] filters = filter.trim().toLowerCase().split("(\\s|-)+");
+        setListAdapter(new MyListAdapter(filters));
+    }
+
+    private View createDictionaryRow(final DictionaryInfo dictionaryInfo, final ViewGroup parent, 
+            final int viewResource, final boolean canLaunch) {
+        
+        View row = LayoutInflater.from(parent.getContext()).inflate(
+                viewResource, 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));
+            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);
                 }
-                downloadableDictionaries.addView(row);
+            });
+        }
+
+        final StringBuilder builder = new StringBuilder();
+        LinearLayout buttons = (LinearLayout) row.findViewById(R.id.dictionaryLauncherButtons);
+        final List<IndexInfo> sortedIndexInfos = application.sortedIndexInfos(dictionaryInfo.indexInfos);
+        for (IndexInfo indexInfo : sortedIndexInfos) {
+            final View button = application.createButton(buttons.getContext(), dictionaryInfo, indexInfo);
+            buttons.addView(button);
+            
+            if (canLaunch) {
+                button.setOnClickListener(
+                        new IntentLauncher(buttons.getContext(), 
+                        DictionaryActivity.getLaunchIntent(
+                                application.getPath(dictionaryInfo.uncompressedFilename), 
+                                indexInfo.shortName, "")));
+
+            } else {
+                button.setEnabled(false);
+            }
+            if (builder.length() != 0) {
+                builder.append("; ");
             }
+            builder.append(getString(R.string.indexInfo, indexInfo.shortName, indexInfo.mainTokenCount));
         }
+        details.setText(builder.toString());
+        
+        return row;
     }
 
 }
index edc50e44c2a96586c023a49029ff5641051e6ad5..c99aa9605304ebbf59f31bee66b5fbe746ed5177 100644 (file)
@@ -37,7 +37,7 @@ public class PreferenceActivity extends android.preference.PreferenceActivity {
     addPreferencesFromResource(R.xml.preferences);
     ListPreference defaultDic = (ListPreference) findPreference(getResources().getString(R.string.defaultDicKey));
     DictionaryApplication application = (DictionaryApplication) getApplication();
-    List<DictionaryInfo> dicts = application.getDictionariesOnDevice();
+    List<DictionaryInfo> dicts = application.getDictionariesOnDevice(null);
     
        final CharSequence[] entries = new CharSequence[dicts.size()];
        final CharSequence[] entryvalues = new CharSequence[dicts.size()];