]> gitweb.fperrin.net Git - Dictionary.git/commitdiff
Fixed text color of normal text.
authorThad Hughes <thadh@google.com>
Sun, 23 Dec 2012 17:42:44 +0000 (09:42 -0800)
committerThad Hughes <thadh@google.com>
Sun, 23 Dec 2012 17:42:44 +0000 (09:42 -0800)
AndroidManifest.xml
res/values/themes.xml
src/com/hughes/android/dictionary/C.java
src/com/hughes/android/dictionary/DictionaryActivity.java
src/com/hughes/android/dictionary/engine/HtmlEntry.java
src/com/hughes/android/dictionary/engine/TokenRow.java
src/com/hughes/android/util/NonLinkClickableSpan.java

index 74fbac2c57b47dc15210c95f2835ff5b126852b2..99eea889d64b06b98a234edef400247a63ba45ba 100644 (file)
@@ -16,7 +16,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
+    
     <application
         android:name=".DictionaryApplication"
         android:icon="@drawable/icon"
index 2ec3984c6e3a0399cae9af813ad7b7be25caa19e..a39b036b5c345a377da5d1818c968de845b4c28a 100644 (file)
@@ -11,6 +11,7 @@
     <item name="android:textColor">#FFFFFF</item>
     </style>
   
+  <color name="theme_default_token_row_fg">#FFFFFF</color>
   <color name="theme_default_token_row_main_bg">#111111</color>
   <color name="theme_default_token_row_other_bg">#111111</color>
   <color name="theme_default_other_lang_bg">#000000</color>
@@ -26,7 +27,7 @@
     <item name="android:textColor">#000000</item>
   </style>
   
-  <color name="theme_light_token_row_fg">#FFFFFF</color>
+  <color name="theme_light_token_row_fg">#000000</color>
   <color name="theme_light_token_row_main_bg">#EEEEEE</color>
   <color name="theme_light_token_row_other_bg">#EEEEEE</color>
   <color name="theme_light_other_lang_bg">#FFFFFF</color>
index e2f03e0d79836a920d66c8d5d5ec4813e60bf34d..5d5751423a0a71f5a96b319bb1d6767456b63e62 100644 (file)
@@ -16,43 +16,49 @@ package com.hughes.android.dictionary;
 
 public class C {
 
-  static final String DICTIONARY_CONFIGS = "dictionaryConfigs2";
-
-  public static final String DICT_FILE = "dictFile";
-  public static final String INDEX_INDEX = "indexIndex";
-  public static final String SEARCH_TOKEN = "searchToken";
-  public static final String CAN_AUTO_LAUNCH_DICT = "canAutoLaunch";
-  public static final String SHOW_LOCAL = "showLocal";
-
-  public static final String THANKS_FOR_UPDATING_VERSION = "thanksForUpdatingVersion";
-
-  enum Theme {
-    DEFAULT(R.style.Theme_Default, R.style.Theme_Default_TokenRow_Fg,
-        R.drawable.theme_default_token_row_main_bg,
-        R.drawable.theme_default_token_row_other_bg,
-        R.drawable.theme_default_other_lang_bg),
-        
-    LIGHT(R.style.Theme_Light,
-        R.style.Theme_Light_TokenRow_Fg,
-        R.drawable.theme_light_token_row_main_bg,
-        R.drawable.theme_light_token_row_other_bg,
-        R.drawable.theme_light_other_lang_bg);
-
-    private Theme(final int themeId, final int tokenRowFg,
-        final int tokenRowMainBg, final int tokenRowOtherBg,
-        final int otherLangBg) {
-      this.themeId = themeId;
-      this.tokenRowFg = tokenRowFg;
-      this.tokenRowMainBg = tokenRowMainBg;
-      this.tokenRowOtherBg = tokenRowOtherBg;
-      this.otherLangBg = otherLangBg;
-    }
+    static final String DICTIONARY_CONFIGS = "dictionaryConfigs2";
+
+    public static final String DICT_FILE = "dictFile";
+    public static final String INDEX_INDEX = "indexIndex";
+    public static final String SEARCH_TOKEN = "searchToken";
+    public static final String CAN_AUTO_LAUNCH_DICT = "canAutoLaunch";
+    public static final String SHOW_LOCAL = "showLocal";
+
+    public static final String THANKS_FOR_UPDATING_VERSION = "thanksForUpdatingVersion";
+
+    enum Theme {
+        DEFAULT(R.style.Theme_Default,
+                R.style.Theme_Default_TokenRow_Fg,
+                R.color.theme_default_token_row_fg,
+                R.drawable.theme_default_token_row_main_bg,
+                R.drawable.theme_default_token_row_other_bg,
+                R.drawable.theme_default_other_lang_bg),
 
-    final int themeId;
-    final int tokenRowFg;
-    final int tokenRowMainBg;
-    final int tokenRowOtherBg;
-    final int otherLangBg;
-  }
+        LIGHT(R.style.Theme_Light,
+                R.style.Theme_Light_TokenRow_Fg,
+                R.color.theme_light_token_row_fg,
+                R.drawable.theme_light_token_row_main_bg,
+                R.drawable.theme_light_token_row_other_bg,
+                R.drawable.theme_light_other_lang_bg);
+
+        private Theme(final int themeId, final int tokenRowFg,
+                final int tokenRowFgColor,
+                final int tokenRowMainBg, final int tokenRowOtherBg,
+                final int otherLangBg) {
+            this.themeId = themeId;
+            this.tokenRowFg = tokenRowFg;
+            this.tokenRowFgColor = tokenRowFgColor;
+            this.tokenRowMainBg = tokenRowMainBg;
+            this.tokenRowOtherBg = tokenRowOtherBg;
+            this.otherLangBg = otherLangBg;
+        }
+
+        final int themeId;
+        final int tokenRowFg;
+        final int tokenRowFgColor;
+        final int tokenRowMainBg;
+        final int tokenRowOtherBg;
+        final int otherLangBg;
+    }
 
 }
index 96f385e9c048ac78c6cfe2469d6748e85521ae9b..75751c711c1a165c01dd46544a5d0134c7136c9b 100644 (file)
@@ -19,6 +19,7 @@ import android.app.ListActivity;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.graphics.Color;
 import android.graphics.Typeface;
 import android.net.Uri;
 import android.os.Bundle;
@@ -50,7 +51,6 @@ import android.view.View.OnLongClickListener;
 import android.view.ViewGroup;
 import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
-import android.widget.AdapterView;
 import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.BaseAdapter;
 import android.widget.Button;
@@ -125,6 +125,8 @@ public class DictionaryActivity extends ListActivity {
 
     TextToSpeech textToSpeech;
     volatile boolean ttsReady;
+    
+    int textColorFg = Color.BLACK;
 
     private final Executor searchExecutor = Executors.newSingleThreadExecutor(new ThreadFactory() {
         @Override
@@ -206,6 +208,7 @@ public class DictionaryActivity extends ListActivity {
 
         application = (DictionaryApplication) getApplication();
         theme = application.getSelectedTheme();
+        textColorFg = getResources().getColor(theme.tokenRowFgColor);
 
         final Intent intent = getIntent();
         dictFile = new File(intent.getStringExtra(C.DICT_FILE));
@@ -218,7 +221,7 @@ public class DictionaryActivity extends ListActivity {
                 updateTTSLanuage();
             }
         });
-
+        
         try {
             final String name = application.getDictionaryName(dictFile.getName());
             this.setTitle("QuickDic: " + name);
@@ -1322,7 +1325,7 @@ public class DictionaryActivity extends ListActivity {
     }
 
     static final Pattern CHAR_DASH = Pattern.compile("['\\p{L}\\p{M}\\p{N}]+");
-
+    
     private void createTokenLinkSpans(final TextView textView, final Spannable spannable,
             final String text) {
         // Saw from the source code that LinkMovementMethod sets the selection!
@@ -1330,7 +1333,7 @@ public class DictionaryActivity extends ListActivity {
         textView.setMovementMethod(LinkMovementMethod.getInstance());
         final Matcher matcher = CHAR_DASH.matcher(text);
         while (matcher.find()) {
-            spannable.setSpan(new NonLinkClickableSpan(), matcher.start(), matcher.end(),
+            spannable.setSpan(new NonLinkClickableSpan(textColorFg), matcher.start(), matcher.end(),
                     Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
         }
     }
index 4143fd34477221bd543f5438d6951492f3f0d62c..c7e06282e52aadec67c29d9f897ecc2e543601d2 100644 (file)
@@ -2,6 +2,7 @@ package com.hughes.android.dictionary.engine;
 
 import android.content.Intent;
 import android.net.Uri;
+import android.util.Log;
 
 import com.hughes.android.dictionary.C;
 import com.hughes.util.StringUtil;
@@ -13,8 +14,7 @@ import java.io.IOException;
 import java.io.PrintStream;
 import java.io.RandomAccessFile;
 import java.io.UnsupportedEncodingException;
-import java.net.URI;
-import java.net.URLDecoder;
+import java.lang.ref.SoftReference;
 import java.net.URLEncoder;
 import java.util.List;
 import java.util.regex.Pattern;
@@ -23,34 +23,37 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
   
   // Title is not HTML escaped.
   public final String title;
+  public final LazyHtmlLoader lazyHtmlLoader;
   public String html;
   
   public HtmlEntry(final EntrySource entrySource, String title) {
     super(entrySource);
     this.title = title;
+    lazyHtmlLoader = null;
   }
   
   public HtmlEntry(Dictionary dictionary, RandomAccessFile raf, final int index) throws IOException {
     super(dictionary, raf, index);
     title = raf.readUTF();
-
-    final byte[] bytes = new byte[raf.readInt()];
-    final byte[] zipBytes = new byte[raf.readInt()];
-    raf.read(zipBytes);
-    StringUtil.unzipFully(zipBytes, bytes);
-    html = new String(bytes, "UTF-8");
+    lazyHtmlLoader = new LazyHtmlLoader(raf);
+    html = null;
   }
+  
   @Override
   public void write(RandomAccessFile raf) throws IOException {
     super.write(raf);
     raf.writeUTF(title);
 
-    final byte[] bytes = html.getBytes("UTF-8");
+    final byte[] bytes = getHtml().getBytes("UTF-8");
     final byte[] zipBytes = StringUtil.zipBytes(bytes);
     raf.writeInt(bytes.length);
     raf.writeInt(zipBytes.length);
     raf.write(zipBytes);
   }
+  
+  String getHtml() {
+      return html != null ? html : lazyHtmlLoader.getHtml();
+  }
 
   @Override
   public void addToDictionary(Dictionary dictionary) {
@@ -64,7 +67,6 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
     return new Row(this.index, rowIndex, dictionaryIndex);
   }
 
-  
   static final class Serializer implements RAFListSerializer<HtmlEntry> {
     
     final Dictionary dictionary;
@@ -85,7 +87,7 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
   };
 
   public String getRawText(final boolean compact) {
-    return title + ":\n" + html;
+    return title + ":\n" + getHtml();
   }
 
   
@@ -94,7 +96,7 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
     if (title.compareTo(another.title) != 0) {
       return title.compareTo(another.title);
     }
-    return html.compareTo(another.html);
+    return getHtml().compareTo(another.getHtml());
   }
   
   @Override
@@ -160,9 +162,9 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
         final StringBuilder result = new StringBuilder();
         for (final HtmlEntry htmlEntry : htmlEntries) {
             final String titleEscaped = StringUtil.escapeToPureHtmlUnicode(htmlEntry.title);
-            result.append(String.format("<h1><a href=\"%s\">%s</a></h1>\n(%s)\n<p>%s\n", 
-                    formatQuickdicUrl(indexShortName, titleEscaped), titleEscaped, htmlEntry.entrySource.name,
-                    htmlEntry.html));
+            result.append(String.format("<h1><a href=\"%s\">%s</a></h1>\n<p>%s\n", 
+                    formatQuickdicUrl(indexShortName, titleEscaped), titleEscaped,
+                    htmlEntry.getHtml()));
         }
         return result.toString();
     }
@@ -188,5 +190,51 @@ public class HtmlEntry extends AbstractEntry implements RAFSerializable<HtmlEntr
         if (secondColon == -1) return;
         intent.putExtra(C.SEARCH_TOKEN, Uri.decode(url.substring(secondColon + 1)));
     }
+    
+    // --------------------------------------------------------------------
+    
+    public static final class LazyHtmlLoader {
+        final RandomAccessFile raf;
+        final long offset;
+        final int numBytes;
+        final int numZipBytes;
+        
+        // Not sure this volatile is right, but oh well.
+        volatile SoftReference<String> htmlRef = new SoftReference<String>(null);
+        
+        private LazyHtmlLoader(final RandomAccessFile raf) throws IOException {
+            this.raf = raf;
+            numBytes = raf.readInt();
+            numZipBytes = raf.readInt();
+            offset = raf.getFilePointer();
+            raf.skipBytes(numZipBytes);
+        }
+        
+        public String getHtml() {
+            String html = htmlRef.get();
+            if (html != null) {
+                return html;
+            }
+            System.out.println("Loading Html: numBytes=" + numBytes + ", numZipBytes=" + numZipBytes);
+            final byte[] bytes = new byte[numBytes];
+            final byte[] zipBytes = new byte[numZipBytes];
+            synchronized (raf) {
+                try {
+                    raf.seek(offset);
+                    raf.read(zipBytes);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+            try {
+                StringUtil.unzipFully(zipBytes, bytes);
+                html = new String(bytes, "UTF-8");
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            htmlRef = new SoftReference<String>(html);
+            return html;
+        }
+    }
 
 }
index 96842e985bda925558f8451661f0fb1bff9f22d0..86d4f7e75dffad7dfa44b64ed15f74ff7519c8df 100644 (file)
@@ -64,7 +64,7 @@ public class TokenRow extends RowBase {
     final String surrounder = hasMainEntry ? "***" : "===";
     out.println(surrounder + getToken() + surrounder);
     for (final HtmlEntry htmlEntry : index.sortedIndexEntries.get(referenceIndex).htmlEntries) {
-        out.println("HtmlEntry: " + htmlEntry.title + " <<<" + htmlEntry.html + ">>>");
+        out.println("HtmlEntry: " + htmlEntry.title + " <<<" + htmlEntry.getHtml() + ">>>");
     }
   }
 
index 075cc59ef58020d53657131a1a561dd293e14c20..a590d387ad7237608383c0ca19eddc8bcba672b4 100644 (file)
@@ -19,19 +19,28 @@ import android.text.style.ClickableSpan;
 import android.view.View;
 
 public class NonLinkClickableSpan extends ClickableSpan {
-  
-  public static final NonLinkClickableSpan instance = new NonLinkClickableSpan();
-
-  // Won't see these on a long-click.
-  @Override
-  public void onClick(View widget) {
-  }
-
-  @Override
-  public void updateDrawState(TextPaint ds) {
-    super.updateDrawState(ds);
-    ds.setUnderlineText(false);
-    //ds.setColor(color);
-  }
+
+    // The singleton pattern doesn't work here--we need a separate instance for
+    // each span.
+
+    final int color;
+    
+    public NonLinkClickableSpan(int color) {
+        this.color = color;
+    }
+
+    // Won't see these on a long-click.
+    @Override
+    public void onClick(View widget) {
+        // Don't need to do anything.  These spans are just used to see where
+        // the user long-pressed.
+    }
+
+    @Override
+    public void updateDrawState(TextPaint ds) {
+        super.updateDrawState(ds);
+        ds.setUnderlineText(false);
+        ds.setColor(color);
+    }
 
 }