diff --git a/.gitignore b/.gitignore
index 7d168dc..9acd65d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,7 +26,7 @@ local.properties
# Gradle files
.gradle/
build/
-
+readme.txt
# Local configuration file (sdk path, etc)
local.properties
@@ -35,4 +35,4 @@ local.properties
proguard/
# Log Files
-*.log
\ No newline at end of file
+*.log
diff --git a/README.md b/README.md
index e69de29..1fb7358 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,20 @@
+## 英文原著阅读器
+
+英文原著阅读器,可以通过单击单词查看释义、发音、例句。
+
+### LICENSE
+
+Copyright (C) 2018 wayne <15901418657@163.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
diff --git a/ambilWarna/build.gradle b/ambilWarna/build.gradle
index 1b593ab..f16db04 100644
--- a/ambilWarna/build.gradle
+++ b/ambilWarna/build.gradle
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
android {
compileSdkVersion 19
- buildToolsVersion "25.0.1"
+ buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 8
@@ -14,5 +14,10 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
+ debug {
+
+ }
+ sourceSets {
+ }
}
}
diff --git a/build.gradle b/build.gradle
index f6627fc..af48343 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,14 +2,22 @@
buildscript {
repositories {
jcenter()
+ maven {
+ url 'https://maven.google.com/'
+ name 'Google'
+ }
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.2'
+ classpath 'com.android.tools.build:gradle:3.1.3'
}
}
allprojects {
repositories {
jcenter()
+ maven {
+ url 'https://maven.google.com/'
+ name 'Google'
+ }
}
}
diff --git a/code/build.gradle b/code/build.gradle
index 1b593ab..f16db04 100644
--- a/code/build.gradle
+++ b/code/build.gradle
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
android {
compileSdkVersion 19
- buildToolsVersion "25.0.1"
+ buildToolsVersion '27.0.3'
defaultConfig {
minSdkVersion 8
@@ -14,5 +14,10 @@ android {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
+ debug {
+
+ }
+ sourceSets {
+ }
}
}
diff --git a/fBReader/ReadMe.txt b/fBReader/ReadMe.txt
new file mode 100644
index 0000000..0039e5f
--- /dev/null
+++ b/fBReader/ReadMe.txt
@@ -0,0 +1,5 @@
+1.向上向下滑动出menu按钮,点击返回或者再次点击消失
+
+-ZLTextRegion findRegion 返回字的内容可以利用它来完成后续翻译内容参数。
+-2。左侧点击右侧点击翻页取消,
+-3。单击换成dialog单词翻译。
\ No newline at end of file
diff --git a/fBReader/build.gradle b/fBReader/build.gradle
index f454f06..babea1c 100644
--- a/fBReader/build.gradle
+++ b/fBReader/build.gradle
@@ -1,24 +1,30 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 19
- buildToolsVersion "25.0.1"
-
+ compileSdkVersion 25
+ buildToolsVersion '26.0.2'
+ useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "org.geometerplus.zlibrary.ui.android"
- minSdkVersion 8
- targetSdkVersion 19
+ minSdkVersion 18
+ targetSdkVersion 25
ndk {
- moduleName "DeflatingDecompressor-v3"
+// moduleName "DeflatingDecompressor-v3"
+ abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
+// vectorDrawables.useSupportLibrary = true
}
buildTypes {
+ debug {
+
+ }
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
+
sourceSets {
main {
jni.srcDirs = []
@@ -28,15 +34,22 @@ android {
}
dependencies {
- compile project(':ambilWarna')
- compile project(':code')
- compile project(':library')
- compile project(':superToasts')
- compile 'com.android.support:support-v4:19.1.0'
+ testCompile 'junit:junit:4.12'
+ compile 'com.android.support:support-v4:25.0.1'
compile files('libs/LingvoIntegration_2.5.2.12.jar')
compile files('libs/httpmime-4.2.5.jar')
compile files('libs/json-simple-1.1.1.jar')
compile files('libs/nanohttpd-2.0.5.jar')
compile files('libs/open-dictionary-api-1.2.1.jar')
compile files('libs/pdfparse.jar')
-}
+ implementation project(':ambilWarna')
+ implementation project(':code')
+ implementation project(':library')
+ implementation project(':superToasts')
+ implementation project(':translate_bd')
+// compile 'com.google.code.gson:gson:2.3.0'
+ compile 'com.squareup.okhttp3:okhttp:3.9.1'
+ compile 'com.squareup.retrofit2:retrofit:2.3.0'
+ compile 'com.squareup.retrofit2:converter-gson:2.3.0'
+ compile 'pub.devrel:easypermissions:0.1.5'
+}
\ No newline at end of file
diff --git a/fBReader/src/main/AndroidManifest.xml b/fBReader/src/main/AndroidManifest.xml
index 4ecd902..ad8b2c4 100644
--- a/fBReader/src/main/AndroidManifest.xml
+++ b/fBReader/src/main/AndroidManifest.xml
@@ -30,6 +30,8 @@
+
+
diff --git a/fBReader/src/main/java/dyg/activity/TransWebViewActivity.java b/fBReader/src/main/java/dyg/activity/TransWebViewActivity.java
new file mode 100644
index 0000000..08acb15
--- /dev/null
+++ b/fBReader/src/main/java/dyg/activity/TransWebViewActivity.java
@@ -0,0 +1,27 @@
+package dyg.activity;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.webkit.WebView;
+import android.widget.Toast;
+
+import org.geometerplus.zlibrary.ui.android.R;
+
+public class TransWebViewActivity extends Activity {
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main_tranlate_web);
+ Intent intent = getIntent();
+ String string = intent.getStringExtra("key");
+ if (string == null) {
+ Toast.makeText(this, "no key word ,can't translate", Toast.LENGTH_SHORT).show();
+ finish();
+ }
+ WebView webView = (WebView) findViewById(R.id.layout_webview);
+ webView.loadUrl("http://apii.dict.cn/mini.php?q=" + string);
+
+ }
+}
diff --git a/fBReader/src/main/java/dyg/beans/CiBaWordBeanJson.java b/fBReader/src/main/java/dyg/beans/CiBaWordBeanJson.java
new file mode 100644
index 0000000..a1d53b0
--- /dev/null
+++ b/fBReader/src/main/java/dyg/beans/CiBaWordBeanJson.java
@@ -0,0 +1,237 @@
+package dyg.beans;
+
+import java.util.List;
+
+public class CiBaWordBeanJson {
+
+ /**
+ * word_name : hello
+ * is_CRI : 1
+ * exchange : {"word_pl":["hellos"],"word_past":"","word_done":"","word_ing":"","word_third":"","word_er":"","word_est":""}
+ * symbols : [{"ph_en":"hə'ləʊ","ph_am":"həˈloʊ","ph_other":"","ph_en_mp3":"","ph_am_mp3":"http://res.iciba.com/resource/amp3/1/0/5d/41/5d41402abc4b2a76b9719d911017c592.mp3","ph_tts_mp3":"http://res-tts.iciba.com/5/d/4/5d41402abc4b2a76b9719d911017c592.mp3","parts":[{"part":"int.","means":["哈喽,喂","你好,您好","表示问候","打招呼"]},{"part":"n.","means":["\u201c喂\u201d的招呼声或问候声"]},{"part":"vi.","means":["喊\u201c喂\u201d"]}]}]
+ * items : [""]
+ */
+
+ private String word_name;
+ private int is_CRI;
+ private ExchangeBean exchange;
+ private List symbols;
+ private List items;
+
+ public String getWord_name() {
+ return word_name;
+ }
+
+ public void setWord_name(String word_name) {
+ this.word_name = word_name;
+ }
+
+ public int getIs_CRI() {
+ return is_CRI;
+ }
+
+ public void setIs_CRI(int is_CRI) {
+ this.is_CRI = is_CRI;
+ }
+
+ public ExchangeBean getExchange() {
+ return exchange;
+ }
+
+ public void setExchange(ExchangeBean exchange) {
+ this.exchange = exchange;
+ }
+
+ public List getSymbols() {
+ return symbols;
+ }
+
+ public void setSymbols(List symbols) {
+ this.symbols = symbols;
+ }
+
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = items;
+ }
+ public static class ExchangeBean {
+ /**
+ * word_pl : ["hellos"]
+ * word_past :
+ * word_done :
+ * word_ing :
+ * word_third :
+ * word_er :
+ * word_est :
+ */
+
+ private List word_past;
+ private List word_done;
+ private List word_ing;
+ private List word_third;
+ private List word_er;
+ private List word_est;
+ private List word_pl;
+
+ public List getWord_past() {
+ return word_past;
+ }
+
+ public void setWord_past(List word_past) {
+ this.word_past = word_past;
+ }
+
+ public List getWord_done() {
+ return word_done;
+ }
+
+ public void setWord_done(List word_done) {
+ this.word_done = word_done;
+ }
+
+ public List getWord_ing() {
+ return word_ing;
+ }
+
+ public void setWord_ing(List word_ing) {
+ this.word_ing = word_ing;
+ }
+
+ public List getWord_third() {
+ return word_third;
+ }
+
+ public void setWord_third(List word_third) {
+ this.word_third = word_third;
+ }
+
+ public List getWord_er() {
+ return word_er;
+ }
+
+ public void setWord_er(List word_er) {
+ this.word_er = word_er;
+ }
+
+ public List getWord_est() {
+ return word_est;
+ }
+
+ public void setWord_est(List word_est) {
+ this.word_est = word_est;
+ }
+
+ public List getWord_pl() {
+ return word_pl;
+ }
+
+ public void setWord_pl(List word_pl) {
+ this.word_pl = word_pl;
+ }
+ }
+
+ public static class SymbolsBean {
+ /**
+ * ph_en : hə'ləʊ
+ * ph_am : həˈloʊ
+ * ph_other :
+ * ph_en_mp3 :
+ * ph_am_mp3 : http://res.iciba.com/resource/amp3/1/0/5d/41/5d41402abc4b2a76b9719d911017c592.mp3
+ * ph_tts_mp3 : http://res-tts.iciba.com/5/d/4/5d41402abc4b2a76b9719d911017c592.mp3
+ * parts : [{"part":"int.","means":["哈喽,喂","你好,您好","表示问候","打招呼"]},{"part":"n.","means":["\u201c喂\u201d的招呼声或问候声"]},{"part":"vi.","means":["喊\u201c喂\u201d"]}]
+ */
+
+ private String ph_en;
+ private String ph_am;
+ private String ph_other;
+ private String ph_en_mp3;
+ private String ph_am_mp3;
+ private String ph_tts_mp3;
+ private List parts;
+
+ public String getPh_en() {
+ return ph_en;
+ }
+
+ public void setPh_en(String ph_en) {
+ this.ph_en = ph_en;
+ }
+
+ public String getPh_am() {
+ return ph_am;
+ }
+
+ public void setPh_am(String ph_am) {
+ this.ph_am = ph_am;
+ }
+
+ public String getPh_other() {
+ return ph_other;
+ }
+
+ public void setPh_other(String ph_other) {
+ this.ph_other = ph_other;
+ }
+
+ public String getPh_en_mp3() {
+ return ph_en_mp3;
+ }
+
+ public void setPh_en_mp3(String ph_en_mp3) {
+ this.ph_en_mp3 = ph_en_mp3;
+ }
+
+ public String getPh_am_mp3() {
+ return ph_am_mp3;
+ }
+
+ public void setPh_am_mp3(String ph_am_mp3) {
+ this.ph_am_mp3 = ph_am_mp3;
+ }
+
+ public String getPh_tts_mp3() {
+ return ph_tts_mp3;
+ }
+
+ public void setPh_tts_mp3(String ph_tts_mp3) {
+ this.ph_tts_mp3 = ph_tts_mp3;
+ }
+
+ public List getParts() {
+ return parts;
+ }
+
+ public void setParts(List parts) {
+ this.parts = parts;
+ }
+
+ public static class PartsBean {
+ /**
+ * part : int.
+ * means : ["哈喽,喂","你好,您好","表示问候","打招呼"]
+ */
+
+ private String part;
+ private List means;
+
+ public String getPart() {
+ return part;
+ }
+
+ public void setPart(String part) {
+ this.part = part;
+ }
+
+ public List getMeans() {
+ return means;
+ }
+
+ public void setMeans(List means) {
+ this.means = means;
+ }
+ }
+ }
+}
diff --git a/fBReader/src/main/java/dyg/beans/GsonBuildList.java b/fBReader/src/main/java/dyg/beans/GsonBuildList.java
new file mode 100644
index 0000000..eb2ef71
--- /dev/null
+++ b/fBReader/src/main/java/dyg/beans/GsonBuildList.java
@@ -0,0 +1,120 @@
+package dyg.beans;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParseException;
+import com.google.gson.JsonPrimitive;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import com.google.gson.JsonSyntaxException;
+
+import java.lang.reflect.Type;
+
+public class GsonBuildList {
+ public static Gson normalGson = new Gson();
+
+ static class ExchangeBeanSerializer implements JsonDeserializer {
+ @Override
+ public CiBaWordBeanJson.ExchangeBean deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+ return null;
+ }
+ }
+
+// static class SymbolSerializer implements JsonDeserializer {
+// @Override
+// public CiBaWordBeanJson.SymbolsBean deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
+//
+// return null;
+// }
+// }
+
+ public static Gson buildGson() {
+ Gson gson = null;
+ gson = new GsonBuilder()
+ .registerTypeAdapter(Integer.class, new IntegerDefault0Adapter())
+ .registerTypeAdapter(int.class, new IntegerDefault0Adapter())
+ .registerTypeAdapter(Double.class, new DoubleDefault0Adapter())
+ .registerTypeAdapter(double.class, new DoubleDefault0Adapter())
+ .registerTypeAdapter(Long.class, new LongDefault0Adapter())
+ .registerTypeAdapter(long.class, new LongDefault0Adapter())
+ .registerTypeAdapter(CiBaWordBeanJson.ExchangeBean.class, new ExchangeBeanSerializer())
+// .registerTypeAdapter(CiBaWordBeanJson.SymbolsBean.class, new SymbolSerializer())
+ .create();
+
+ return gson;
+ }
+
+ static class LongDefault0Adapter implements JsonSerializer, JsonDeserializer {
+ @Override
+ public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ try {
+ if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为long类型,如果后台返回""或者null,则返回0
+ return 0l;
+ }
+ } catch (Exception ignore) {
+ }
+ try {
+ return json.getAsLong();
+ } catch (NumberFormatException e) {
+ throw new JsonSyntaxException(e);
+ }
+ }
+
+
+ @Override
+ public JsonElement serialize(Long src, Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(src);
+ }
+ }
+
+ static class DoubleDefault0Adapter implements JsonSerializer, JsonDeserializer {
+ @Override
+ public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
+ try {
+ if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为double类型,如果后台返回""或者null,则返回0.00
+ return 0.00;
+ }
+ } catch (Exception ignore) {
+ }
+ try {
+ return json.getAsDouble();
+ } catch (NumberFormatException e) {
+ throw new JsonSyntaxException(e);
+ }
+ }
+
+ @Override
+ public JsonElement serialize(Double src, Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(src);
+ }
+ }
+
+
+ static class IntegerDefault0Adapter implements JsonSerializer, JsonDeserializer {
+ @Override
+ public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
+ throws JsonParseException {
+ try {
+ if (json.getAsString().equals("") || json.getAsString().equals("null")) {//定义为int类型,如果后台返回""或者null,则返回0
+ return 0;
+ }
+ } catch (Exception ignore) {
+ }
+ try {
+ return json.getAsInt();
+ } catch (NumberFormatException e) {
+ throw new JsonSyntaxException(e);
+ }
+ }
+
+ @Override
+ public JsonElement serialize(Integer src, Type typeOfSrc, JsonSerializationContext context) {
+ return new JsonPrimitive(src);
+ }
+ }
+
+}
diff --git a/fBReader/src/main/java/dyg/net/LoveFamousBookExecutor.java b/fBReader/src/main/java/dyg/net/LoveFamousBookExecutor.java
new file mode 100644
index 0000000..01a842a
--- /dev/null
+++ b/fBReader/src/main/java/dyg/net/LoveFamousBookExecutor.java
@@ -0,0 +1,26 @@
+package dyg.net;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class LoveFamousBookExecutor {
+
+ private ExecutorService executors = null;
+
+ private LoveFamousBookExecutor() {
+ executors = Executors.newFixedThreadPool(4);
+ }
+
+ public LoveFamousBookExecutor getInstance() {
+ return Singleton.executor;
+ }
+
+ private static class Singleton {
+ private static final LoveFamousBookExecutor executor = new LoveFamousBookExecutor();
+ }
+
+ public void exec(Runnable run) {
+ executors.submit(run);
+ }
+
+}
diff --git a/fBReader/src/main/java/dyg/net/LoveFamousBookNet.java b/fBReader/src/main/java/dyg/net/LoveFamousBookNet.java
new file mode 100644
index 0000000..dfb5c0c
--- /dev/null
+++ b/fBReader/src/main/java/dyg/net/LoveFamousBookNet.java
@@ -0,0 +1,14 @@
+package dyg.net;
+
+import java.util.HashMap;
+
+import dyg.beans.CiBaWordBeanJson;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.QueryMap;
+
+public interface LoveFamousBookNet {
+ @GET("/api/dictionary.php")
+ Call getWords(@QueryMap HashMap map);
+
+}
diff --git a/fBReader/src/main/java/dyg/net/LoveFamousMp3FileDownload.java b/fBReader/src/main/java/dyg/net/LoveFamousMp3FileDownload.java
new file mode 100644
index 0000000..4360487
--- /dev/null
+++ b/fBReader/src/main/java/dyg/net/LoveFamousMp3FileDownload.java
@@ -0,0 +1,11 @@
+package dyg.net;
+
+import okhttp3.ResponseBody;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Url;
+
+public interface LoveFamousMp3FileDownload {
+ @GET
+ Call downloadMp3(@Url String url);
+}
diff --git a/fBReader/src/main/java/org/geometerplus/android/fbreader/FBReader.java b/fBReader/src/main/java/org/geometerplus/android/fbreader/FBReader.java
index d6c5cca..95ae61c 100644
--- a/fBReader/src/main/java/org/geometerplus/android/fbreader/FBReader.java
+++ b/fBReader/src/main/java/org/geometerplus/android/fbreader/FBReader.java
@@ -19,30 +19,64 @@
package org.geometerplus.android.fbreader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.*;
-
+import android.Manifest;
import android.annotation.TargetApi;
-import android.app.Activity;
import android.app.SearchManager;
-import android.content.*;
-import android.graphics.Color;
+import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.net.Uri;
-import android.os.*;
-import android.view.*;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.PowerManager;
+import android.support.annotation.NonNull;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.RelativeLayout;
+import org.geometerplus.android.fbreader.api.ApiListener;
+import org.geometerplus.android.fbreader.api.ApiServerImplementation;
+import org.geometerplus.android.fbreader.api.FBReaderIntents;
+import org.geometerplus.android.fbreader.api.MenuNode;
+import org.geometerplus.android.fbreader.api.PluginApi;
+import org.geometerplus.android.fbreader.dict.DictionaryUtil;
+import org.geometerplus.android.fbreader.formatPlugin.PluginUtil;
+import org.geometerplus.android.fbreader.httpd.DataService;
+import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
+import org.geometerplus.android.fbreader.sync.SyncOperations;
+import org.geometerplus.android.fbreader.tips.TipsActivity;
+import org.geometerplus.android.util.DeviceType;
+import org.geometerplus.android.util.SearchDialogUtil;
+import org.geometerplus.android.util.UIMessageUtil;
+import org.geometerplus.android.util.UIUtil;
+import org.geometerplus.fbreader.Paths;
+import org.geometerplus.fbreader.book.Book;
+import org.geometerplus.fbreader.book.BookUtil;
+import org.geometerplus.fbreader.book.Bookmark;
+import org.geometerplus.fbreader.bookmodel.BookModel;
+import org.geometerplus.fbreader.fbreader.ActionCode;
+import org.geometerplus.fbreader.fbreader.DictionaryHighlighting;
+import org.geometerplus.fbreader.fbreader.FBReaderApp;
+import org.geometerplus.fbreader.fbreader.options.CancelMenuHelper;
+import org.geometerplus.fbreader.fbreader.options.ColorProfile;
+import org.geometerplus.fbreader.formats.ExternalFormatPlugin;
+import org.geometerplus.fbreader.formats.PluginCollection;
+import org.geometerplus.fbreader.tips.TipsManager;
import org.geometerplus.zlibrary.core.application.ZLApplicationWindow;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.library.ZLibrary;
import org.geometerplus.zlibrary.core.options.Config;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import org.geometerplus.zlibrary.core.view.ZLViewWidget;
-
import org.geometerplus.zlibrary.text.view.ZLTextRegion;
import org.geometerplus.zlibrary.text.view.ZLTextView;
-
import org.geometerplus.zlibrary.ui.android.R;
import org.geometerplus.zlibrary.ui.android.error.ErrorKeys;
import org.geometerplus.zlibrary.ui.android.library.ZLAndroidApplication;
@@ -50,959 +84,976 @@
import org.geometerplus.zlibrary.ui.android.view.AndroidFontUtil;
import org.geometerplus.zlibrary.ui.android.view.ZLAndroidWidget;
-import org.geometerplus.fbreader.Paths;
-import org.geometerplus.fbreader.book.*;
-import org.geometerplus.fbreader.bookmodel.BookModel;
-import org.geometerplus.fbreader.fbreader.*;
-import org.geometerplus.fbreader.fbreader.options.CancelMenuHelper;
-import org.geometerplus.fbreader.fbreader.options.ColorProfile;
-import org.geometerplus.fbreader.formats.ExternalFormatPlugin;
-import org.geometerplus.fbreader.formats.PluginCollection;
-import org.geometerplus.fbreader.tips.TipsManager;
-
-import org.geometerplus.android.fbreader.api.*;
-import org.geometerplus.android.fbreader.dict.DictionaryUtil;
-import org.geometerplus.android.fbreader.formatPlugin.PluginUtil;
-import org.geometerplus.android.fbreader.httpd.DataService;
-import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
-import org.geometerplus.android.fbreader.sync.SyncOperations;
-import org.geometerplus.android.fbreader.tips.TipsActivity;
-
-import org.geometerplus.android.util.*;
-
-public final class FBReader extends FBReaderMainActivity implements ZLApplicationWindow {
- public static final int RESULT_DO_NOTHING = RESULT_FIRST_USER;
- public static final int RESULT_REPAINT = RESULT_FIRST_USER + 1;
-
- public static Intent defaultIntent(Context context) {
- return new Intent(context, FBReader.class)
- .setAction(FBReaderIntents.Action.VIEW)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- }
-
- public static void openBookActivity(Context context, Book book, Bookmark bookmark) {
- final Intent intent = defaultIntent(context);
- FBReaderIntents.putBookExtra(intent, book);
- FBReaderIntents.putBookmarkExtra(intent, bookmark);
- context.startActivity(intent);
- }
-
- private FBReaderApp myFBReaderApp;
- private volatile Book myBook;
-
- private RelativeLayout myRootView;
- private ZLAndroidWidget myMainView;
-
- private volatile boolean myShowStatusBarFlag;
- private String myMenuLanguage;
-
- final DataService.Connection DataConnection = new DataService.Connection();
-
- volatile boolean IsPaused = false;
- private volatile long myResumeTimestamp;
- volatile Runnable OnResumeAction = null;
-
- private Intent myCancelIntent = null;
- private Intent myOpenBookIntent = null;
-
- private final FBReaderApp.Notifier myNotifier = new AppNotifier(this);
-
- private static final String PLUGIN_ACTION_PREFIX = "___";
- private final List myPluginActions =
- new LinkedList();
- private final BroadcastReceiver myPluginInfoReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- final ArrayList actions = getResultExtras(true).getParcelableArrayList(PluginApi.PluginInfo.KEY);
- if (actions != null) {
- synchronized (myPluginActions) {
- int index = 0;
- while (index < myPluginActions.size()) {
- myFBReaderApp.removeAction(PLUGIN_ACTION_PREFIX + index++);
- }
- myPluginActions.addAll(actions);
- index = 0;
- for (PluginApi.ActionInfo info : myPluginActions) {
- myFBReaderApp.addAction(
- PLUGIN_ACTION_PREFIX + index++,
- new RunPluginAction(FBReader.this, myFBReaderApp, info.getId())
- );
- }
- }
- }
- }
- };
-
- private synchronized void openBook(Intent intent, final Runnable action, boolean force) {
- if (!force && myBook != null) {
- return;
- }
-
- myBook = FBReaderIntents.getBookExtra(intent, myFBReaderApp.Collection);
- final Bookmark bookmark = FBReaderIntents.getBookmarkExtra(intent);
- if (myBook == null) {
- final Uri data = intent.getData();
- if (data != null) {
- myBook = createBookForFile(ZLFile.createFileByPath(data.getPath()));
- }
- }
- if (myBook != null) {
- ZLFile file = BookUtil.fileByBook(myBook);
- if (!file.exists()) {
- if (file.getPhysicalFile() != null) {
- file = file.getPhysicalFile();
- }
- UIMessageUtil.showErrorMessage(this, "fileNotFound", file.getPath());
- myBook = null;
- } else {
- NotificationUtil.drop(this, myBook);
- }
- }
- Config.Instance().runOnConnect(new Runnable() {
- public void run() {
- myFBReaderApp.openBook(myBook, bookmark, action, myNotifier);
- AndroidFontUtil.clearFontCache();
- }
- });
- }
-
- private Book createBookForFile(ZLFile file) {
- if (file == null) {
- return null;
- }
- Book book = myFBReaderApp.Collection.getBookByFile(file.getPath());
- if (book != null) {
- return book;
- }
- if (file.isArchive()) {
- for (ZLFile child : file.children()) {
- book = myFBReaderApp.Collection.getBookByFile(child.getPath());
- if (book != null) {
- return book;
- }
- }
- }
- return null;
- }
-
- private Runnable getPostponedInitAction() {
- return new Runnable() {
- public void run() {
- runOnUiThread(new Runnable() {
- public void run() {
- new TipRunner().start();
- DictionaryUtil.init(FBReader.this, null);
- final Intent intent = getIntent();
- if (intent != null && FBReaderIntents.Action.PLUGIN.equals(intent.getAction())) {
- new RunPluginAction(FBReader.this, myFBReaderApp, intent.getData()).run();
- }
- }
- });
- }
- };
- }
-
- @Override
- protected void onCreate(Bundle icicle) {
- super.onCreate(icicle);
-
- bindService(
- new Intent(this, DataService.class),
- DataConnection,
- DataService.BIND_AUTO_CREATE
- );
-
- final Config config = Config.Instance();
- config.runOnConnect(new Runnable() {
- public void run() {
- config.requestAllValuesForGroup("Options");
- config.requestAllValuesForGroup("Style");
- config.requestAllValuesForGroup("LookNFeel");
- config.requestAllValuesForGroup("Fonts");
- config.requestAllValuesForGroup("Colors");
- config.requestAllValuesForGroup("Files");
- }
- });
-
- final ZLAndroidLibrary zlibrary = getZLibrary();
- myShowStatusBarFlag = zlibrary.ShowStatusBarOption.getValue();
-
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.main);
- myRootView = (RelativeLayout)findViewById(R.id.root_view);
- myMainView = (ZLAndroidWidget)findViewById(R.id.main_view);
- setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
-
- myFBReaderApp = (FBReaderApp)FBReaderApp.Instance();
- if (myFBReaderApp == null) {
- myFBReaderApp = new FBReaderApp(Paths.systemInfo(this), new BookCollectionShadow());
- }
- getCollection().bindToService(this, null);
- myBook = null;
-
- myFBReaderApp.setWindow(this);
- myFBReaderApp.initWindow();
-
- myFBReaderApp.setExternalFileOpener(new ExternalFileOpener(this));
-
- getWindow().setFlags(
- WindowManager.LayoutParams.FLAG_FULLSCREEN,
- myShowStatusBarFlag ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN
- );
-
- if (myFBReaderApp.getPopupById(TextSearchPopup.ID) == null) {
- new TextSearchPopup(myFBReaderApp);
- }
- if (myFBReaderApp.getPopupById(NavigationPopup.ID) == null) {
- new NavigationPopup(myFBReaderApp);
- }
- if (myFBReaderApp.getPopupById(SelectionPopup.ID) == null) {
- new SelectionPopup(myFBReaderApp);
- }
-
- myFBReaderApp.addAction(ActionCode.SHOW_LIBRARY, new ShowLibraryAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_PREFERENCES, new ShowPreferencesAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_BOOK_INFO, new ShowBookInfoAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_TOC, new ShowTOCAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_BOOKMARKS, new ShowBookmarksAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_NETWORK_LIBRARY, new ShowNetworkLibraryAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.SHOW_MENU, new ShowMenuAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHOW_NAVIGATION, new ShowNavigationAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SEARCH, new SearchAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SHARE_BOOK, new ShareBookAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.SELECTION_SHOW_PANEL, new SelectionShowPanelAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SELECTION_HIDE_PANEL, new SelectionHidePanelAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SELECTION_COPY_TO_CLIPBOARD, new SelectionCopyAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SELECTION_SHARE, new SelectionShareAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SELECTION_TRANSLATE, new SelectionTranslateAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.SELECTION_BOOKMARK, new SelectionBookmarkAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.DISPLAY_BOOK_POPUP, new DisplayBookPopupAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.PROCESS_HYPERLINK, new ProcessHyperlinkAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.OPEN_VIDEO, new OpenVideoAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.HIDE_TOAST, new HideToastAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.SHOW_CANCEL_MENU, new ShowCancelMenuAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.OPEN_START_SCREEN, new StartScreenAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_SYSTEM, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_SYSTEM));
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_SENSOR, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_SENSOR));
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_PORTRAIT, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_PORTRAIT));
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_LANDSCAPE, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_LANDSCAPE));
- if (getZLibrary().supportsAllOrientations()) {
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_REVERSE_PORTRAIT, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_REVERSE_PORTRAIT));
- myFBReaderApp.addAction(ActionCode.SET_SCREEN_ORIENTATION_REVERSE_LANDSCAPE, new SetScreenOrientationAction(this, myFBReaderApp, ZLibrary.SCREEN_ORIENTATION_REVERSE_LANDSCAPE));
- }
- myFBReaderApp.addAction(ActionCode.OPEN_WEB_HELP, new OpenWebHelpAction(this, myFBReaderApp));
- myFBReaderApp.addAction(ActionCode.INSTALL_PLUGINS, new InstallPluginsAction(this, myFBReaderApp));
-
- myFBReaderApp.addAction(ActionCode.SWITCH_TO_DAY_PROFILE, new SwitchProfileAction(this, myFBReaderApp, ColorProfile.DAY));
- myFBReaderApp.addAction(ActionCode.SWITCH_TO_NIGHT_PROFILE, new SwitchProfileAction(this, myFBReaderApp, ColorProfile.NIGHT));
-
- final Intent intent = getIntent();
- final String action = intent.getAction();
-
- myOpenBookIntent = intent;
- if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
- if (FBReaderIntents.Action.CLOSE.equals(action)) {
- myCancelIntent = intent;
- myOpenBookIntent = null;
- } else if (FBReaderIntents.Action.PLUGIN_CRASH.equals(action)) {
- myFBReaderApp.ExternalBook = null;
- myOpenBookIntent = null;
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- myFBReaderApp.openBook(null, null, null, myNotifier);
- }
- });
- }
- }
- }
-
- @Override
- public boolean onPrepareOptionsMenu(Menu menu) {
- setStatusBarVisibility(true);
- setupMenu(menu);
-
- return super.onPrepareOptionsMenu(menu);
- }
-
- @Override
- public void onOptionsMenuClosed(Menu menu) {
- super.onOptionsMenuClosed(menu);
- setStatusBarVisibility(false);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- setStatusBarVisibility(false);
- return super.onOptionsItemSelected(item);
- }
-
- @Override
- protected void onNewIntent(final Intent intent) {
- final String action = intent.getAction();
- final Uri data = intent.getData();
-
- if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
- super.onNewIntent(intent);
- } else if (Intent.ACTION_VIEW.equals(action)
- && data != null && "fbreader-action".equals(data.getScheme())) {
- myFBReaderApp.runAction(data.getEncodedSchemeSpecificPart(), data.getFragment());
- } else if (Intent.ACTION_VIEW.equals(action) || FBReaderIntents.Action.VIEW.equals(action)) {
- myOpenBookIntent = intent;
- if (myFBReaderApp.Model == null && myFBReaderApp.ExternalBook != null) {
- final BookCollectionShadow collection = getCollection();
- final Book b = FBReaderIntents.getBookExtra(intent, collection);
- if (!collection.sameBook(b, myFBReaderApp.ExternalBook)) {
- try {
- final ExternalFormatPlugin plugin =
- (ExternalFormatPlugin)BookUtil.getPlugin(
- PluginCollection.Instance(Paths.systemInfo(this)),
- myFBReaderApp.ExternalBook
- );
- startActivity(PluginUtil.createIntent(plugin, FBReaderIntents.Action.PLUGIN_KILL));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- } else if (FBReaderIntents.Action.PLUGIN.equals(action)) {
- new RunPluginAction(this, myFBReaderApp, data).run();
- } else if (Intent.ACTION_SEARCH.equals(action)) {
- final String pattern = intent.getStringExtra(SearchManager.QUERY);
- final Runnable runnable = new Runnable() {
- public void run() {
- final TextSearchPopup popup = (TextSearchPopup)myFBReaderApp.getPopupById(TextSearchPopup.ID);
- popup.initPosition();
- myFBReaderApp.MiscOptions.TextSearchPattern.setValue(pattern);
- if (myFBReaderApp.getTextView().search(pattern, true, false, false, false) != 0) {
- runOnUiThread(new Runnable() {
- public void run() {
- myFBReaderApp.showPopup(popup.getId());
- }
- });
- } else {
- runOnUiThread(new Runnable() {
- public void run() {
- UIMessageUtil.showErrorMessage(FBReader.this, "textNotFound");
- popup.StartPosition = null;
- }
- });
- }
- }
- };
- UIUtil.wait("search", runnable, this);
- } else if (FBReaderIntents.Action.CLOSE.equals(intent.getAction())) {
- myCancelIntent = intent;
- myOpenBookIntent = null;
- } else if (FBReaderIntents.Action.PLUGIN_CRASH.equals(intent.getAction())) {
- final Book book = FBReaderIntents.getBookExtra(intent, myFBReaderApp.Collection);
- myFBReaderApp.ExternalBook = null;
- myOpenBookIntent = null;
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- final BookCollectionShadow collection = getCollection();
- Book b = collection.getRecentBook(0);
- if (collection.sameBook(b, book)) {
- b = collection.getRecentBook(1);
- }
- myFBReaderApp.openBook(b, null, null, myNotifier);
- }
- });
- } else {
- super.onNewIntent(intent);
- }
- }
-
- @Override
- protected void onStart() {
- super.onStart();
-
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- new Thread() {
- public void run() {
- getPostponedInitAction().run();
- }
- }.start();
-
- myFBReaderApp.getViewWidget().repaint();
- }
- });
-
- initPluginActions();
-
- final ZLAndroidLibrary zlibrary = getZLibrary();
-
- Config.Instance().runOnConnect(new Runnable() {
- public void run() {
- final boolean showStatusBar = zlibrary.ShowStatusBarOption.getValue();
- if (showStatusBar != myShowStatusBarFlag) {
- finish();
- startActivity(new Intent(FBReader.this, FBReader.class));
- }
- zlibrary.ShowStatusBarOption.saveSpecialValue();
- myFBReaderApp.ViewOptions.ColorProfileName.saveSpecialValue();
- SetScreenOrientationAction.setOrientation(FBReader.this, zlibrary.getOrientationOption().getValue());
- }
- });
-
- ((PopupPanel)myFBReaderApp.getPopupById(TextSearchPopup.ID)).setPanelInfo(this, myRootView);
- ((NavigationPopup)myFBReaderApp.getPopupById(NavigationPopup.ID)).setPanelInfo(this, myRootView);
- ((PopupPanel)myFBReaderApp.getPopupById(SelectionPopup.ID)).setPanelInfo(this, myRootView);
- }
-
- @Override
- public void onWindowFocusChanged(boolean hasFocus) {
- super.onWindowFocusChanged(hasFocus);
- switchWakeLock(hasFocus &&
- getZLibrary().BatteryLevelToTurnScreenOffOption.getValue() <
- myFBReaderApp.getBatteryLevel()
- );
- }
-
- private void initPluginActions() {
- synchronized (myPluginActions) {
- int index = 0;
- while (index < myPluginActions.size()) {
- myFBReaderApp.removeAction(PLUGIN_ACTION_PREFIX + index++);
- }
- myPluginActions.clear();
- }
-
- sendOrderedBroadcast(
- new Intent(PluginApi.ACTION_REGISTER),
- null,
- myPluginInfoReceiver,
- null,
- RESULT_OK,
- null,
- null
- );
- }
-
- private class TipRunner extends Thread {
- TipRunner() {
- setPriority(MIN_PRIORITY);
- }
-
- public void run() {
- final TipsManager manager = new TipsManager(Paths.systemInfo(FBReader.this));
- switch (manager.requiredAction()) {
- case Initialize:
- startActivity(new Intent(
- TipsActivity.INITIALIZE_ACTION, null, FBReader.this, TipsActivity.class
- ));
- break;
- case Show:
- startActivity(new Intent(
- TipsActivity.SHOW_TIP_ACTION, null, FBReader.this, TipsActivity.class
- ));
- break;
- case Download:
- manager.startDownloading();
- break;
- case None:
- break;
- }
- }
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- myStartTimer = true;
- Config.Instance().runOnConnect(new Runnable() {
- public void run() {
- SyncOperations.enableSync(FBReader.this, myFBReaderApp.SyncOptions);
-
- final int brightnessLevel =
- getZLibrary().ScreenBrightnessLevelOption.getValue();
- if (brightnessLevel != 0) {
- getViewWidget().setScreenBrightness(brightnessLevel);
- } else {
- setScreenBrightnessAuto();
- }
- if (getZLibrary().DisableButtonLightsOption.getValue()) {
- setButtonLight(false);
- }
-
- getCollection().bindToService(FBReader.this, new Runnable() {
- public void run() {
- final BookModel model = myFBReaderApp.Model;
- if (model == null || model.Book == null) {
- return;
- }
- onPreferencesUpdate(myFBReaderApp.Collection.getBookById(model.Book.getId()));
- }
- });
- }
- });
-
- registerReceiver(myBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
- IsPaused = false;
- myResumeTimestamp = System.currentTimeMillis();
- if (OnResumeAction != null) {
- final Runnable action = OnResumeAction;
- OnResumeAction = null;
- action.run();
- }
-
- registerReceiver(mySyncUpdateReceiver, new IntentFilter(FBReaderIntents.Event.SYNC_UPDATED));
-
- SetScreenOrientationAction.setOrientation(this, getZLibrary().getOrientationOption().getValue());
- if (myCancelIntent != null) {
- final Intent intent = myCancelIntent;
- myCancelIntent = null;
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- runCancelAction(intent);
- }
- });
- return;
- } else if (myOpenBookIntent != null) {
- final Intent intent = myOpenBookIntent;
- myOpenBookIntent = null;
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- openBook(intent, null, true);
- }
- });
- } else if (myFBReaderApp.getCurrentServerBook(null) != null) {
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- myFBReaderApp.useSyncInfo(true, myNotifier);
- }
- });
- } else if (myFBReaderApp.Model == null && myFBReaderApp.ExternalBook != null) {
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- myFBReaderApp.openBook(myFBReaderApp.ExternalBook, null, null, myNotifier);
- }
- });
- } else {
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- myFBReaderApp.useSyncInfo(true, myNotifier);
- }
- });
- }
-
- PopupPanel.restoreVisibilities(myFBReaderApp);
- ApiServerImplementation.sendEvent(this, ApiListener.EVENT_READ_MODE_OPENED);
- }
-
- @Override
- protected void onPause() {
- SyncOperations.quickSync(this, myFBReaderApp.SyncOptions);
-
- IsPaused = true;
- try {
- unregisterReceiver(mySyncUpdateReceiver);
- } catch (IllegalArgumentException e) {
- }
-
- try {
- unregisterReceiver(myBatteryInfoReceiver);
- } catch (IllegalArgumentException e) {
- // do nothing, this exception means that myBatteryInfoReceiver was not registered
- }
-
- myFBReaderApp.stopTimer();
- if (getZLibrary().DisableButtonLightsOption.getValue()) {
- setButtonLight(true);
- }
- myFBReaderApp.onWindowClosing();
-
- super.onPause();
- }
-
- @Override
- protected void onStop() {
- ApiServerImplementation.sendEvent(this, ApiListener.EVENT_READ_MODE_CLOSED);
- PopupPanel.removeAllWindows(myFBReaderApp, this);
- super.onStop();
- }
-
- @Override
- protected void onDestroy() {
- getCollection().unbind();
- unbindService(DataConnection);
- super.onDestroy();
- }
-
- @Override
- public void onLowMemory() {
- myFBReaderApp.onWindowClosing();
- super.onLowMemory();
- }
-
- @Override
- public boolean onSearchRequested() {
- final FBReaderApp.PopupPanel popup = myFBReaderApp.getActivePopup();
- myFBReaderApp.hideActivePopup();
- if (DeviceType.Instance().hasStandardSearchDialog()) {
- final SearchManager manager = (SearchManager)getSystemService(SEARCH_SERVICE);
- manager.setOnCancelListener(new SearchManager.OnCancelListener() {
- public void onCancel() {
- if (popup != null) {
- myFBReaderApp.showPopup(popup.getId());
- }
- manager.setOnCancelListener(null);
- }
- });
- startSearch(myFBReaderApp.MiscOptions.TextSearchPattern.getValue(), true, null, false);
- } else {
- SearchDialogUtil.showDialog(
- this, FBReader.class, myFBReaderApp.MiscOptions.TextSearchPattern.getValue(), new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface di) {
- if (popup != null) {
- myFBReaderApp.showPopup(popup.getId());
- }
- }
- }
- );
- }
- return true;
- }
-
- public void showSelectionPanel() {
- final ZLTextView view = myFBReaderApp.getTextView();
- ((SelectionPopup)myFBReaderApp.getPopupById(SelectionPopup.ID))
- .move(view.getSelectionStartY(), view.getSelectionEndY());
- myFBReaderApp.showPopup(SelectionPopup.ID);
- }
-
- public void hideSelectionPanel() {
- final FBReaderApp.PopupPanel popup = myFBReaderApp.getActivePopup();
- if (popup != null && popup.getId() == SelectionPopup.ID) {
- myFBReaderApp.hideActivePopup();
- }
- }
-
- private void onPreferencesUpdate(Book book) {
- AndroidFontUtil.clearFontCache();
- myFBReaderApp.onBookUpdated(book);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- switch (requestCode) {
- default:
- super.onActivityResult(requestCode, resultCode, data);
- break;
- case REQUEST_PREFERENCES:
- if (resultCode != RESULT_DO_NOTHING && data != null) {
- final Book book = FBReaderIntents.getBookExtra(data, myFBReaderApp.Collection);
- if (book != null) {
- getCollection().bindToService(this, new Runnable() {
- public void run() {
- onPreferencesUpdate(book);
- }
- });
- }
- }
- break;
- case REQUEST_CANCEL_MENU:
- runCancelAction(data);
- break;
- }
- }
-
- private void runCancelAction(Intent intent) {
- final CancelMenuHelper.ActionType type;
- try {
- type = CancelMenuHelper.ActionType.valueOf(
- intent.getStringExtra(FBReaderIntents.Key.TYPE)
- );
- } catch (Exception e) {
- // invalid (or null) type value
- return;
- }
- Bookmark bookmark = null;
- if (type == CancelMenuHelper.ActionType.returnTo) {
- bookmark = FBReaderIntents.getBookmarkExtra(intent);
- if (bookmark == null) {
- return;
- }
- }
- myFBReaderApp.runCancelAction(type, bookmark);
- }
-
- public void navigate() {
- ((NavigationPopup)myFBReaderApp.getPopupById(NavigationPopup.ID)).runNavigation();
- }
-
- private Menu addSubmenu(Menu menu, String id) {
- return menu.addSubMenu(ZLResource.resource("menu").getResource(id).getValue());
- }
-
- private void addMenuItem(Menu menu, String actionId, Integer iconId, String name) {
- if (name == null) {
- name = ZLResource.resource("menu").getResource(actionId).getValue();
- }
- final MenuItem menuItem = menu.add(name);
- if (iconId != null) {
- menuItem.setIcon(iconId);
- }
- menuItem.setOnMenuItemClickListener(myMenuListener);
- myMenuItemMap.put(menuItem, actionId);
- }
-
- private void addMenuItem(Menu menu, String actionId, String name) {
- addMenuItem(menu, actionId, null, name);
- }
-
- private void addMenuItem(Menu menu, String actionId, int iconId) {
- addMenuItem(menu, actionId, iconId, null);
- }
-
- private void addMenuItem(Menu menu, String actionId) {
- addMenuItem(menu, actionId, null, null);
- }
-
- private void fillMenu(Menu menu, List nodes) {
- for (MenuNode n : nodes) {
- if (n instanceof MenuNode.Item) {
- final Integer iconId = ((MenuNode.Item)n).IconId;
- if (iconId != null) {
- addMenuItem(menu, n.Code, iconId);
- } else {
- addMenuItem(menu, n.Code);
- }
- } else /* if (n instanceof MenuNode.Submenu) */ {
- final Menu submenu = addSubmenu(menu, n.Code);
- fillMenu(submenu, ((MenuNode.Submenu)n).Children);
- }
- }
- }
-
- private void setupMenu(Menu menu) {
- final String menuLanguage = ZLResource.getLanguageOption().getValue();
- if (menuLanguage.equals(myMenuLanguage)) {
- return;
- }
- myMenuLanguage = menuLanguage;
-
- menu.clear();
- fillMenu(menu, MenuData.topLevelNodes());
- synchronized (myPluginActions) {
- int index = 0;
- for (PluginApi.ActionInfo info : myPluginActions) {
- if (info instanceof PluginApi.MenuActionInfo) {
- addMenuItem(
- menu,
- PLUGIN_ACTION_PREFIX + index++,
- ((PluginApi.MenuActionInfo)info).MenuItemName
- );
- }
- }
- }
-
- refresh();
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- super.onCreateOptionsMenu(menu);
-
- setupMenu(menu);
-
- return true;
- }
-
- protected void onPluginNotFound(final Book book) {
- final BookCollectionShadow collection = getCollection();
- collection.bindToService(this, new Runnable() {
- public void run() {
- final Book recent = collection.getRecentBook(0);
- if (recent != null && !collection.sameBook(recent, book)) {
- myFBReaderApp.openBook(recent, null, null, null);
- } else {
- myFBReaderApp.openHelpBook();
- }
- }
- });
- }
-
- private void setStatusBarVisibility(boolean visible) {
- final ZLAndroidLibrary zlibrary = getZLibrary();
- if (DeviceType.Instance() != DeviceType.KINDLE_FIRE_1ST_GENERATION && !myShowStatusBarFlag) {
- if (visible) {
- getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- } else {
- getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
- }
- }
- }
-
- @Override
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- return (myMainView != null && myMainView.onKeyDown(keyCode, event)) || super.onKeyDown(keyCode, event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- return (myMainView != null && myMainView.onKeyUp(keyCode, event)) || super.onKeyUp(keyCode, event);
- }
-
- private void setButtonLight(boolean enabled) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
- setButtonLightInternal(enabled);
- }
- }
-
- @TargetApi(Build.VERSION_CODES.FROYO)
- private void setButtonLightInternal(boolean enabled) {
- final WindowManager.LayoutParams attrs = getWindow().getAttributes();
- attrs.buttonBrightness = enabled ? -1.0f : 0.0f;
- getWindow().setAttributes(attrs);
- }
-
- private PowerManager.WakeLock myWakeLock;
- private boolean myWakeLockToCreate;
- private boolean myStartTimer;
-
- public final void createWakeLock() {
- if (myWakeLockToCreate) {
- synchronized (this) {
- if (myWakeLockToCreate) {
- myWakeLockToCreate = false;
- myWakeLock =
- ((PowerManager)getSystemService(POWER_SERVICE))
- .newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "FBReader");
- myWakeLock.acquire();
- }
- }
- }
- if (myStartTimer) {
- myFBReaderApp.startTimer();
- myStartTimer = false;
- }
- }
-
- private final void switchWakeLock(boolean on) {
- if (on) {
- if (myWakeLock == null) {
- myWakeLockToCreate = true;
- }
- } else {
- if (myWakeLock != null) {
- synchronized (this) {
- if (myWakeLock != null) {
- myWakeLock.release();
- myWakeLock = null;
- }
- }
- }
- }
- }
-
- private BroadcastReceiver myBatteryInfoReceiver = new BroadcastReceiver() {
- public void onReceive(Context context, Intent intent) {
- final int level = intent.getIntExtra("level", 100);
- final ZLAndroidApplication application = (ZLAndroidApplication)getApplication();
- setBatteryLevel(level);
- switchWakeLock(
- hasWindowFocus() &&
- getZLibrary().BatteryLevelToTurnScreenOffOption.getValue() < level
- );
- }
- };
-
- private BookCollectionShadow getCollection() {
- return (BookCollectionShadow)myFBReaderApp.Collection;
- }
-
- // methods from ZLApplicationWindow interface
- @Override
- public void showErrorMessage(String key) {
- UIMessageUtil.showErrorMessage(this, key);
- }
-
- @Override
- public void showErrorMessage(String key, String parameter) {
- UIMessageUtil.showErrorMessage(this, key, parameter);
- }
-
- @Override
- public FBReaderApp.SynchronousExecutor createExecutor(String key) {
- return UIUtil.createExecutor(this, key);
- }
-
- private int myBatteryLevel;
- @Override
- public int getBatteryLevel() {
- return myBatteryLevel;
- }
- private void setBatteryLevel(int percent) {
- myBatteryLevel = percent;
- }
-
- @Override
- public void close() {
- finish();
- }
-
- @Override
- public ZLViewWidget getViewWidget() {
- return myMainView;
- }
-
- private final HashMap