From 544fc2fd615a29f419bf3855d203096d4c3e9000 Mon Sep 17 00:00:00 2001 From: haron2013 Date: Wed, 21 Aug 2013 11:54:30 +0400 Subject: [PATCH 01/18] Update DeviceInfo.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit поправил выдачу в лог --- src/com/harasoft/relaunch/DeviceInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/harasoft/relaunch/DeviceInfo.java b/src/com/harasoft/relaunch/DeviceInfo.java index 7e27a36..a8a43f1 100644 --- a/src/com/harasoft/relaunch/DeviceInfo.java +++ b/src/com/harasoft/relaunch/DeviceInfo.java @@ -57,7 +57,7 @@ private static String getBuildField(String fieldName) { try { return (String) Build.class.getField(fieldName).get(null); } catch (Exception e) { - Log.d("cr3", "Exception while trying to check Build." + fieldName); + Log.d("relaunch", "Exception while trying to check Build." + fieldName); return ""; } } From a29c2520442a73409d7d02d8f5349266c2c1d6be Mon Sep 17 00:00:00 2001 From: haron Date: Wed, 21 Aug 2013 13:05:31 +0400 Subject: [PATCH 02/18] Wi-Fi correct the mistake --- .idea/gradle.xml | 7 +++++++ ReLaunch.iml | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 .idea/gradle.xml create mode 100644 ReLaunch.iml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..dbb5ea5 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/ReLaunch.iml b/ReLaunch.iml new file mode 100644 index 0000000..0c9845a --- /dev/null +++ b/ReLaunch.iml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From b97fb9e8068638ad3b70ae8416011e95995e6baf Mon Sep 17 00:00:00 2001 From: haron Date: Wed, 21 Aug 2013 13:12:52 +0400 Subject: [PATCH 03/18] Wi-Fi correct the mistake --- src/com/harasoft/relaunch/Advanced.java | 87 ++++++++++--------------- 1 file changed, 36 insertions(+), 51 deletions(-) diff --git a/src/com/harasoft/relaunch/Advanced.java b/src/com/harasoft/relaunch/Advanced.java index e13cedb..373add9 100644 --- a/src/com/harasoft/relaunch/Advanced.java +++ b/src/com/harasoft/relaunch/Advanced.java @@ -1,24 +1,7 @@ package com.harasoft.relaunch; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import android.app.Activity; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.SharedPreferences; +import android.content.*; import android.graphics.Typeface; import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; @@ -31,15 +14,14 @@ import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; -import android.widget.AbsListView; -import android.widget.BaseAdapter; -import android.widget.Button; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; +import android.widget.*; + +import java.io.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Advanced extends Activity { final static String TAG = "Advanced"; @@ -705,23 +687,31 @@ public void onReceive(Context context, Intent intent) { wifiSetup.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - if (DeviceInfo.EINK_NOOK) { - final Intent intent = new Intent(Intent.ACTION_MAIN, null); - intent.addCategory(Intent.CATEGORY_LAUNCHER); - // NOOK ST only! - final ComponentName cn = new ComponentName( - "com.android.settings", - "com.android.settings.wifi.Settings_Wifi_Settings"); - intent.setComponent(cn); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } else { - Toast.makeText( - Advanced.this, - getResources().getString( - R.string.jv_advanced_nook_only), - Toast.LENGTH_LONG).show(); - } + if (DeviceInfo.EINK_SONY) { + final Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + // SONY PRS-Tx only! + final ComponentName cn = new ComponentName( + "com.sony.drbd.ebook.NetworkManagerSettings", + "com.sony.drbd.ebook.NetworkManagerSettings.NMWirelessSetting"); + intent.setComponent(cn); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } else if (DeviceInfo.EINK_NOOK) { + final Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + // NOOK ST only! + final ComponentName cn = new ComponentName( + "com.android.settings", + "com.android.settings.wifi.Settings_Wifi_Settings"); + intent.setComponent(cn); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } else { + final Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } } }); @@ -832,13 +822,8 @@ public void onClick(View v) { @Override protected void onDestroy() { super.onDestroy(); - } - - @Override - protected void onStop() { - super.onStop(); - unregisterReceiver(b1); - unregisterReceiver(b2); + unregisterReceiver(b1); + unregisterReceiver(b2); } @Override From 3315e4f671ceffe12e8899f001acbd32b937ac29 Mon Sep 17 00:00:00 2001 From: haron Date: Wed, 21 Aug 2013 13:14:07 +0400 Subject: [PATCH 04/18] Wi-Fi correct the mistake --- src/com/harasoft/relaunch/Advanced.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/harasoft/relaunch/Advanced.java b/src/com/harasoft/relaunch/Advanced.java index 373add9..6d9dc39 100644 --- a/src/com/harasoft/relaunch/Advanced.java +++ b/src/com/harasoft/relaunch/Advanced.java @@ -687,6 +687,7 @@ public void onReceive(Context context, Intent intent) { wifiSetup.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { + if (DeviceInfo.EINK_SONY) { final Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); From 56b2ac4b49de64a3aa73ed9bc63ddacf44f11606 Mon Sep 17 00:00:00 2001 From: haron2013 Date: Tue, 29 Apr 2014 10:37:38 +0400 Subject: [PATCH 05/18] 1 --- .idea/gradle.xml | 6 +----- .idea/libraries/ebookParser_1_3.xml | 9 +++++++++ ReLaunch.iml | 26 ++++---------------------- libs/ebookParser-1.3.jar | Bin 23297 -> 0 bytes 4 files changed, 14 insertions(+), 27 deletions(-) create mode 100644 .idea/libraries/ebookParser_1_3.xml delete mode 100644 libs/ebookParser-1.3.jar diff --git a/.idea/gradle.xml b/.idea/gradle.xml index dbb5ea5..f6e673a 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,7 +1,3 @@ - - - - + diff --git a/.idea/libraries/ebookParser_1_3.xml b/.idea/libraries/ebookParser_1_3.xml new file mode 100644 index 0000000..8cdea4f --- /dev/null +++ b/.idea/libraries/ebookParser_1_3.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/ReLaunch.iml b/ReLaunch.iml index 0c9845a..60d24be 100644 --- a/ReLaunch.iml +++ b/ReLaunch.iml @@ -1,37 +1,19 @@ - - - - - - - - - - - + - + - + - - - - - - - - - + diff --git a/libs/ebookParser-1.3.jar b/libs/ebookParser-1.3.jar deleted file mode 100644 index 78dc0a46bf153e5f8d2ef0bcf3784582ccd98a72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23297 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 Date: Tue, 29 Apr 2014 10:48:56 +0400 Subject: [PATCH 06/18] 2 --- res/values-es/arrays.xml | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/res/values-es/arrays.xml b/res/values-es/arrays.xml index a4eb75a..4729075 100644 --- a/res/values-es/arrays.xml +++ b/res/values-es/arrays.xml @@ -54,18 +54,6 @@ sysfs cgroup - - 3 - 4 - 5 - 6 - - - Calidad (CLEAR; mode 3) - Lento (ACTIVE_ALL; mode 4) - Rápido (ONESHOT_ALL; mode 5) - Calidad (CLEAR_ALL; mode 6) - -1 0 @@ -214,5 +202,16 @@ Fuerza a vertical Fuerza al paisaje - + + Sistema + English + Русский + Español + + + default + en + ru + es + \ No newline at end of file From fa820a60a2f8ee391fe4ac4901301ff79dcadf85 Mon Sep 17 00:00:00 2001 From: haron2013 Date: Tue, 29 Apr 2014 10:58:18 +0400 Subject: [PATCH 07/18] 1.3.9 b1 --- .classpath | 2 +- .idea/libraries/ebookParser_1_3.xml | 9 - .idea/libraries/libs.xml | 11 + .idea/uiDesigner.xml | 125 +++ AndroidManifest.xml | 118 ++- ReLaunch.iml | 11 - ReLaunch1.iml | 19 + debug.keystore | Bin 1270 -> 0 bytes res/layout-hdpi/editor_layout.xml | 2 +- res/layout-hdpi/filters_view.xml | 4 +- res/layout-hdpi/main.xml | 12 +- res/layout-hdpi/prefs_main.xml | 117 ++- res/layout-hdpi/service_details.xml | 2 +- res/layout-hdpi/task_details.xml | 2 +- res/layout-hdpi/types_view.xml | 4 +- res/layout-mdpi/editor_layout.xml | 2 +- res/layout-mdpi/filters_view.xml | 4 +- res/layout-mdpi/main.xml | 6 +- res/layout-mdpi/prefs_main.xml | 18 +- res/layout-mdpi/service_details.xml | 2 +- res/layout-mdpi/task_details.xml | 2 +- res/layout-mdpi/types_view.xml | 4 +- res/layout-mdpi/viewer_layout.xml | 5 +- res/values-es/strings.xml | 91 +-- res/values-ru/strings.xml | 200 ++--- res/values/arrays.xml | 88 ++- res/values/colors.xml | 2 - res/values/strings.xml | 189 +++-- res/values/styles.xml | 6 - res/xml/prefs.xml | 282 ++++--- src/com/harasoft/relaunch/Advanced.java | 104 +-- .../harasoft/relaunch/AllApplications.java | 77 +- src/com/harasoft/relaunch/DeviceInfo.java | 64 -- src/com/harasoft/relaunch/Editor.java | 16 +- src/com/harasoft/relaunch/EinkScreen.java | 44 +- .../harasoft/relaunch/FiltersActivity.java | 61 +- src/com/harasoft/relaunch/Home.java | 23 + src/com/harasoft/relaunch/Home1.java | 22 + src/com/harasoft/relaunch/Library.java | 23 + src/com/harasoft/relaunch/ListActions.java | 21 +- src/com/harasoft/relaunch/Main.java | 54 ++ .../harasoft/relaunch/N2EpdController.java | 38 +- src/com/harasoft/relaunch/PowerFunctions.java | 8 +- src/com/harasoft/relaunch/PrefsActivity.java | 312 ++++---- src/com/harasoft/relaunch/ReLaunch.java | 743 ++++++++++++------ src/com/harasoft/relaunch/ReLaunchApp.java | 141 ++-- .../harasoft/relaunch/ResultsActivity.java | 123 +-- src/com/harasoft/relaunch/SearchActivity.java | 2 +- src/com/harasoft/relaunch/Shop.java | 22 + src/com/harasoft/relaunch/TaskManager.java | 86 +- src/com/harasoft/relaunch/TypesActivity.java | 10 +- src/com/harasoft/relaunch/Viewer.java | 7 +- 52 files changed, 1916 insertions(+), 1424 deletions(-) delete mode 100644 .idea/libraries/ebookParser_1_3.xml create mode 100644 .idea/libraries/libs.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 ReLaunch1.iml delete mode 100644 debug.keystore delete mode 100644 src/com/harasoft/relaunch/DeviceInfo.java diff --git a/.classpath b/.classpath index 95dc717..5b56c5c 100644 --- a/.classpath +++ b/.classpath @@ -2,8 +2,8 @@ + - diff --git a/.idea/libraries/ebookParser_1_3.xml b/.idea/libraries/ebookParser_1_3.xml deleted file mode 100644 index 8cdea4f..0000000 --- a/.idea/libraries/ebookParser_1_3.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/libs.xml b/.idea/libraries/libs.xml new file mode 100644 index 0000000..dc5f78e --- /dev/null +++ b/.idea/libraries/libs.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..3b00020 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 23a74cb..175c1ee 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1,21 +1,27 @@ - + android:versionName="1.3.8.2" android:versionCode="100308021"> + - + - - + + + + + android:stateNotNeeded="true" + android:exported="false" + android:configChanges="orientation|locale"> @@ -25,7 +31,9 @@ + android:stateNotNeeded="true" + android:exported="false" + android:configChanges="orientation|locale"> @@ -35,7 +43,9 @@ + android:stateNotNeeded="true" + android:exported="false" + android:configChanges="orientation|locale"> @@ -45,9 +55,11 @@ + android:stateNotNeeded="true" + android:exported="false" + android:configChanges="orientation|locale"> - + @@ -56,68 +68,104 @@ + android:label="@string/app_name" + android:configChanges="orientation|locale"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + - \ No newline at end of file + diff --git a/ReLaunch.iml b/ReLaunch.iml index 60d24be..9d3a505 100644 --- a/ReLaunch.iml +++ b/ReLaunch.iml @@ -1,19 +1,8 @@ - - - - - - - - - - - diff --git a/ReLaunch1.iml b/ReLaunch1.iml new file mode 100644 index 0000000..3e66c4d --- /dev/null +++ b/ReLaunch1.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/debug.keystore b/debug.keystore deleted file mode 100644 index 47a67c4a13b86cbdbcb4023f4eda29f692472c36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 zcmezO_TO6u1_mY|W&~sY#JrTE{LGY;)TGk%?9@u2xM4)pOGluZy#`H8I}P~QxU|_A zSs1mL1Q{7w8CaT_ma6#)J==2P;e^R@3-l&1Io|l={Y`A%szZzUwk|)PWnVh;#Riu} ze`aT_xw5FE@>5-1Z>H5f(SndPwdQkeZ0EI%@8&#CIrd?)J7i4a769ep0YJekuzKDmgY$_I>#mC z++A>>J@@)g;jrwiMIR102hL^WSh$F}mtnii*Aoe<{Kfprj^F0q(A`_(YvUVd&Bv2I z>233@k}_AVz1#m@wYh&Mar)91-ZLhxz=~3#voF^Dy`1}7ba~oi*`=b&KdO`?)0iIDW=|H{+OWiN;RCz)fZ%_9 zWj;Fts!n7`IP{sXPd59rqwwQw#&W%knyImKZ*M#IM{v!`(CO+-rN8BV1#8CX*`5?L z$fyfc7Apze=(+4;w@=;FyP@Czh2OfBX>YV{*G>Lto`x66uaeK1=kkZ8zEEA%Dzmnk zdGhaBnPr!Ys@S6;W^j#rnwO6fQBXnUR4J*?GVqWCpscWZAnVy>GV9-1=r|w)qB`nVwvy83e5Zxr%!~yb-kj zb*I~~uJ-2X(uv%?{VbmsJ!Gi2|L1n?&vCeyhBMk$pm=<^kS^qJCi~ zUr%*@_S$r@la(*S@eco^JDDTzHVW4%pMSBxAm~1)TlE5?>*BoG$MlSu{-ji7ua$jr YQt!cbURAC?0%gl`7#Su;&zyY~08-o%LI3~& diff --git a/res/layout-hdpi/editor_layout.xml b/res/layout-hdpi/editor_layout.xml index efd5011..7cb5cff 100644 --- a/res/layout-hdpi/editor_layout.xml +++ b/res/layout-hdpi/editor_layout.xml @@ -86,7 +86,7 @@ android:drawableLeft="@drawable/ci_del" android:minWidth="64dp" android:paddingRight="5.3dp" - android:text="@string/editor_layout_cancel" > + android:text="@string/app_cancel" > diff --git a/res/layout-hdpi/filters_view.xml b/res/layout-hdpi/filters_view.xml index f036bc1..d4a77c5 100644 --- a/res/layout-hdpi/filters_view.xml +++ b/res/layout-hdpi/filters_view.xml @@ -79,7 +79,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/filters_view_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-hdpi/main.xml b/res/layout-hdpi/main.xml index 5643c72..15ee301 100644 --- a/res/layout-hdpi/main.xml +++ b/res/layout-hdpi/main.xml @@ -66,8 +66,7 @@ android:src="@drawable/ci_gear2" > - - - + + + + - + + - + + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/normal_bg" + android:orientation="vertical" + android:padding="8dp" > + android:id="@+id/LinearLayoutTitle" + android:layout_width="fill_parent" + android:layout_height="56dp" + android:minHeight="32dp" > + android:id="@+id/imageView1" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:background="@color/normal_bg_gray" + android:src="@drawable/ci_gear2" /> + android:id="@+id/prefernces_title" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_weight="1" + android:background="@color/normal_bg_gray" + android:editable="false" + android:focusable="false" + android:gravity="left|center_vertical" + android:inputType="textMultiLine" + android:paddingLeft="8dp" + android:text="@string/prefs_layout_title" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="@color/normal_fg" + android:textStyle="bold" > + android:id="@+id/back_btn" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:layout_gravity="center" + android:layout_marginLeft="4dp" + android:layout_marginRight="1dp" + android:layout_weight="2.8" + android:background="@drawable/main_button" + android:minWidth="96dp" + android:src="@drawable/ci_exit" /> + - - + android:orientation="horizontal" android:layout_weight="10" android:layout_marginTop="8dp"> + + - + + android:layout_height="56dp" + android:layout_marginTop="8dp"> - - - - \ No newline at end of file diff --git a/res/layout-hdpi/service_details.xml b/res/layout-hdpi/service_details.xml index c328f1d..5303d2d 100644 --- a/res/layout-hdpi/service_details.xml +++ b/res/layout-hdpi/service_details.xml @@ -34,7 +34,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/service_details_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-hdpi/task_details.xml b/res/layout-hdpi/task_details.xml index cfa30d4..2bee0b3 100644 --- a/res/layout-hdpi/task_details.xml +++ b/res/layout-hdpi/task_details.xml @@ -34,7 +34,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/service_details_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-hdpi/types_view.xml b/res/layout-hdpi/types_view.xml index 534abc9..c360dda 100644 --- a/res/layout-hdpi/types_view.xml +++ b/res/layout-hdpi/types_view.xml @@ -76,7 +76,7 @@ android:layout_weight="1" android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" - android:text="@string/types_view_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-mdpi/editor_layout.xml b/res/layout-mdpi/editor_layout.xml index 4b88194..db96f81 100644 --- a/res/layout-mdpi/editor_layout.xml +++ b/res/layout-mdpi/editor_layout.xml @@ -86,7 +86,7 @@ android:drawableLeft="@drawable/ci_del" android:minWidth="96dp" android:paddingRight="8dp" - android:text="@string/editor_layout_cancel" > + android:text="@string/app_cancel" > diff --git a/res/layout-mdpi/filters_view.xml b/res/layout-mdpi/filters_view.xml index 3343645..433eaf2 100644 --- a/res/layout-mdpi/filters_view.xml +++ b/res/layout-mdpi/filters_view.xml @@ -79,7 +79,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/filters_view_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-mdpi/main.xml b/res/layout-mdpi/main.xml index 8fba365..43b1f5c 100644 --- a/res/layout-mdpi/main.xml +++ b/res/layout-mdpi/main.xml @@ -81,7 +81,8 @@ android:textColor="@color/normal_fg" android:textStyle="bold" > - + + - + + + + android:orientation="horizontal" android:layout_weight="10" android:layout_marginTop="8dp"> + android:fadingEdge="none" android:footerDividersEnabled="true"> - + + android:layout_marginTop="8dp"> - - - - \ No newline at end of file diff --git a/res/layout-mdpi/service_details.xml b/res/layout-mdpi/service_details.xml index 3cab595..f2cd476 100644 --- a/res/layout-mdpi/service_details.xml +++ b/res/layout-mdpi/service_details.xml @@ -34,7 +34,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/service_details_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-mdpi/task_details.xml b/res/layout-mdpi/task_details.xml index b9c6196..43e0abb 100644 --- a/res/layout-mdpi/task_details.xml +++ b/res/layout-mdpi/task_details.xml @@ -34,7 +34,7 @@ android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" android:gravity="center" - android:text="@string/service_details_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-mdpi/types_view.xml b/res/layout-mdpi/types_view.xml index 3e69185..94bdd26 100644 --- a/res/layout-mdpi/types_view.xml +++ b/res/layout-mdpi/types_view.xml @@ -76,7 +76,7 @@ android:layout_weight="1" android:background="@drawable/main_button" android:drawableLeft="@drawable/ci_ok" - android:text="@string/types_view_layout_ok" > + android:text="@string/app_ok" > diff --git a/res/layout-mdpi/viewer_layout.xml b/res/layout-mdpi/viewer_layout.xml index 8c2360c..3347be7 100644 --- a/res/layout-mdpi/viewer_layout.xml +++ b/res/layout-mdpi/viewer_layout.xml @@ -4,7 +4,7 @@ android:layout_height="fill_parent" android:background="@color/normal_bg" android:orientation="vertical" - android:padding="8dp" > + android:padding="8dp" android:id="@+id/linLayForAdd"> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index f8e3c87..8f32507 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -1,7 +1,11 @@ ReLaunch - <h2>Esta aplicación está diseñada sólo para + OK + Cancelar + + NO + <h2>Esta aplicación está diseñada sólo para el Nook Simple Touch y el Sony PRS-T1</h2><br><center><b>¿Desea continuar?</b></center> @@ -13,29 +17,18 @@ Apagar Guardar == EDICIÓN == - Cancelar Condición: Valor: Y Filtrar ajustes - OK Añadir nuevo Y - Cancelar Subir un nivel Memoria Mem: Batería B Ajustes - Personalizar: Filtros - Personalizar: Asociaciones - Cancelar - OK - Guardar configuraciones y reiniciar ReLaunch - (algunos ajustes solo trabajan después de reiniciar) - Revertir todas las configuraciones a los valores - por defecto Direfenciar mayusculas/minúsculas Buscar sólo extensiones conocidas Ordenar resultados de búsquedas @@ -46,12 +39,11 @@ comas Cadena de búsqueda Búsqueda - Cancelar + Mostrar todos los libros(extensiones conocidas) búsqueda desde root Búsqueda Matar - OK PID/UID: Etiqueta: Nombre: @@ -69,18 +61,16 @@ Ordenar alfabéticamente Tareas Servicios - Esperar... + Esperar… Archivo sufijo: Aplicación: - OK Añadir nuevo - Cancelar Ajustar Asociaciones Editar -- Visualizador integrado -- - REINICIAR\n\nEspere... + REINICIAR\n\nEspere… Dispositivo apagado\n\nUsar botón de encendido para - comenzar de nuevo... + comenzar de nuevo… Conectado, IP: Nivel: No está en rango @@ -92,8 +82,6 @@ Funciones avanzadas, info, etc. Confirmar reinicio ¿Estás seguro de reiniciar el dispositivo? - - NO Confirmación de apagado ¿Estás seguro de que apagar el dispositivo? @@ -106,27 +94,20 @@ RO/RW Sólo lectura RO Lectura/escritura RW - Implementar en los NOOK Simple Touch. Implementar en los dispositivos arraigados. Mover una posición hacia arriba Mover una posición hacia abajo Borrar de favoritos Desinstalar - Cancelar Añadir a favoritos Archivo demasiado grande Archivo es demasiado grande para editar bytes El tamaño máximo permitido es - OK Guardar cambios en alertas ¿Quiere guardar los cambios? - - NO - Cancelar - Cancelar Fallo de apertura No se puede abrir el archivo por escribir @@ -136,27 +117,19 @@ No se puede cerrar el archivo Valores de filtrado: ¡No puede estar vacío! - OK - Cancelar Y OR Seleccione el número de Seleccione la aplicación - OK Cambios disminución de alerta ¿Desea guardar los cambios de configuración de todos los? Configuración por defecto de advertencia ¿Está seguro de restaurar la configuración por defecto? - - No - Cancelar Database operations Do you really want to cleanup cache? ¡Modelo erroneo! - - NO M libre WiFi OFF WiFi ON @@ -165,20 +138,18 @@ Todas las aplicaciones Aplicaciones favoritas Lista de cambios - OK Añadir a favoritos Marcar como leído Quitar marca de leído Olvidar todas las marcas - Obrir con ... - Crear cadena de eventos ... + Obrir con … + Crear cadena de eventos … Copy Move Paste Eliminar ¡No eliminar carpetas vacías! Eliminar carpetas vacías - Cancelar Seleccionar tipo de evento Acción no encontrada Acción no encontrada @@ -217,7 +188,6 @@ fuente: <a href=\"https://github.com/yiselieren/ReLaunch\">git://github.com/yiselieren/ReLaunch.git</a></center> - OK Ver histórico de cambios (changelog) Histórico de cambios Acción @@ -227,7 +197,6 @@ Subir Bajar Eliminar carpeta - Cancelar Eliminar archivo Marcar como leído Eliminar marca de \"leído\" @@ -235,8 +204,6 @@ Eliminar advertencias de archivo ¿Estás seguro de eliminar el archivo \? - - NO Borrar de favoritos Eliminar advertencias de carpeta vacía ¿Estás seguro de eliminar la carpeta vacía @@ -247,7 +214,6 @@ (acciones potencialmente peligrosas) Acción no encontrada Búsqueda en progreso - Cancelar Buscar resultados Archivos (encontrados / búsqueda completa) Total: @@ -260,8 +226,6 @@ Mem: Extensión Extensión de archivo - OK - Cancelar ¡Debe especificar la extensión! ¿Aplicación o acción general? Cuando haces clic sobre un archivo con una @@ -278,7 +242,6 @@ bytes El máximo tamaño de archivo permitido es - OK Resultados filtrados Filtrar resultados de acuerdo a definiciones de filtros @@ -321,18 +284,18 @@ de dir Mostrar los nombres de directorios completos (incluso en los directorios de inicio) - Elemento de menú contextual \'Abrir con...\' + Elemento de menú contextual \'Abrir con…\' - Mostrar \'Abrir con...\' en menú contextual + Mostrar \'Abrir con…\' en menú contextual - No volver a mostrar \'Abrir con...\' en menú + No volver a mostrar \'Abrir con…\' en menú contextual de archivo - Elemento de menú contextual \'Crear evento...\' + Elemento de menú contextual \'Crear evento…\' - Mostrar \'Crear evento...\' en menú contextual - - Ocultar \'Crear evento...\' en menú contextual de - archivo + Mostrar \'Crear evento…\' en menú contextual + + Ocultar \'Crear evento…\' en menú contextual de + archivo Orientación de la pantalla Modo de refresco de pantalla eInk Frecuencia de una completa actualización de la @@ -342,15 +305,15 @@ Tamaño de fuente en nombres de archivos/carpetas Tamaño de fuente en nobres de archivos y - directorios de cualquer lista... px + directorios de cualquer lista… px Tamaño de fuente para nombres de directorios adicionales Tamaño de fuente para de otros directorios como - Favoritos y otras listas... px + Favoritos y otras listas… px Archivos y el tamaño de los iconos de directorios - Icono de tamaño para los archivos y directorios ... - px (0 - desactivar el icono) + Icono de tamaño para los archivos y directorios … + px (0 - desactivar el icono) Lista de archivos y carpetas (por defecto) Lista de carpetas inicial Lista de reciente apertura @@ -427,8 +390,8 @@ Tamaño máximo de resultado en la lista de búsqueda Notificación del estado de la búsqueda - Informe sobre el estado de búsqueda cada ... - archivos + Informe sobre el estado de búsqueda cada … + archivos Carpeta de búsqueda inicial Comenzar búsquedas desde aquí Tamaño máximo de archivo abierto con visor interno @@ -467,4 +430,8 @@ carpetas no vacías Eliminar carpetas vacías recursivamente sin confirmación (¡peligroso!) + + Idioma + Elija un idioma: + Idioma app.\nReinicie Relaunch!. diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 69507d7..1397c95 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -1,6 +1,10 @@ ReLaunch + OK + Отмена + Да + Нет <h2>Эта программа разработана для Nook Simple Touch или Sony PRS-T1!</h2><br><center><b>Хотите продолжить?</b></center> @@ -12,27 +16,18 @@ Выключить Сохр. == РЕДАКТИРОВАНИЕ == - Отм. Условие: Значение: И Настройки файлового фильтра - OK Новый И - Отмена На уровень выше Memory Mem: Battery B Настройки - Настройка:\nФайловый фильтр - Настройка:\nАссоциации файлов - Отмена - OK - Сохранить и перезапустить - Сброс/Сохр./Восст.\n настроек Регистр различается Только файлы известных расширений Отсортировать результаты @@ -42,12 +37,10 @@ Папка или список папок через запятую Строка поиска Искать - Отмена Показать все книги (известных расширений) в папках для поиска Поиск Завершить - OK PID / UID: Имя: Сист.имя: @@ -65,18 +58,16 @@ Сортировать по алфавиту Задачи Сервисы - Ожидайте... + Ожидайте… Расширение файла: Приложение: - OK Новая - Отмена Настройка ассоциаций Ред. -- ПРОСМОТР -- - ПЕРЕЗАГРУЗКА\n\nОжидайте... - ВЫКЛЮЧЕНО\n\nНажмите кнопку Power для включения... - + ПЕРЕЗАГРУЗКА\n\nОжидайте… + ВЫКЛЮЧЕНО\n\nНажмите кнопку Power для включения… + IP: Сигнал: Недоступно @@ -88,8 +79,6 @@ Дополн. функции и информация Подтверждение перезагруки Вы действительно хотите перезагрузиться? - Да - Нет Подтверждение выключения Вы действительно хотите выключиться? Диски/Разделы @@ -101,26 +90,19 @@ RO/RW RO RW - Только для устройств NOOK Simple touch. Только для устройств с root-доступом. Переместить вверх Переместить вниз Удалить из \"Избранных приложений\" Удалить программу - Отмена Добавить в \"Избранные приложения\" Файл слишком большой Файл слишком большой килобайт Максимальный размер файла - OK Сохранение изменений Вы хотите сохранить изменения? - Да - Нет - Отм. - Отм. Ошибка открытия Невозможно открыть файл для записи @@ -130,25 +112,16 @@ Невозможно закрыть файл Значение: Необходимо указать значение! - OK - Отмена И ИЛИ Укажите порядковый № Выберите приложение - OK Предупреждение Вы хотите сохранить все внесенные изменения? Предупреждение Вы ДЕЙСТВИТЕЛЬНО хотите восстановить настройки по умолчанию? - Да - Нет - Отмена - Вернуть настройки по умолчанию - Сохранить настройки на карту памяти - Восстановить настройки с карты памяти Выполнено! Операция выполнена успешно Операция выполнена успешно\nПрограмма будет @@ -163,8 +136,6 @@ Вы действительно хотите очистить список \"Избранное\"? Не верная модель устройства! - Да - Нет M своб. WiFi выкл. WiFi ВКЛ. @@ -173,26 +144,25 @@ Все приложения Избранные приложения Список изменений - OK Добавить в \"Избранное\" Отметить как прочтенное Снять пометку о прочтении Снять все пометки - Открыть с помощью... - Создать событие... + Открыть с помощью… + Создать событие… Копировать + Копировать папку Переместить - Переместить Вставить - Создать новую папку... + Создать новую папку… Введите имя новой папки Не удалось создать папку - Переименовать... + Переименовать… Введите новое имя файла Удалить Удалить НЕ ПУСТУЮ папку! Удалить пустую папку - Отмена + Копировать в папку Dropbox Выберите вид события Действие не найдено Действие не найдено @@ -226,8 +196,6 @@ WiFi выключен пред. след. - Показать названия книг - Показать файлы Переименовать по тегам fb2/epub… Сортировать файлы по имени файла А-Я @@ -236,7 +204,6 @@ алфавиту Я-А Аннотация Свойства - Свойства файла Имя: Размер: Дата: @@ -252,7 +219,6 @@ code: <a href=\"https://github.com/yiselieren/ReLaunch\">git://github.com/yiselieren/ReLaunch.git</a></center> - OK Справка Справка Действие @@ -262,7 +228,6 @@ Переместить вверх Переместить вниз Удалить папку - Отмена Удалить файл Пометить как прочитанное Снять пометку о прочтении @@ -270,8 +235,6 @@ Предупреждение Вы действительно хотите удалить файл \? - Да - Нет Удалить из "Избранного" Предупреждение Вы действительно хотите удалить пустую папку @@ -283,9 +246,7 @@ (потенциально опасное действие)\? Действие не найдено Выберите файл - Отмена Производится поиск - Отмена Результаты поиска Файлов (найдено / просмотрено) @@ -298,8 +259,6 @@ Mem: Расширение Расширение файла - OK - Отмена Необходимо указать расширение! Конкретное приложение или общее действие? Когда Вы нажимаете на файл с определенным @@ -315,7 +274,6 @@ слишком большой килобайт Максимальный размер файла - OK Файловый фильтр Показывать только файлы, соответствующие фильтру @@ -366,29 +324,29 @@ Для папок внутри начальных не показывать первую часть имени Всегда показывать полные имена папок - Пункт меню \"Открыть с помощью...\" - Показывать пункт \"Открыть с помощью...\" в - контекстом меню файла - Не показывать пункт \"Открыть с помощью...\" в - контекстом меню файла - Пункт меню \"Создать событие...\" - Показывать пункт \"Создать событие...\" в - контекстном меню файла - Не показывать пункт \"Создать событие...\" в - контекстном меню файла + Пункт меню \"Открыть с помощью…\" + Показывать пункт \"Открыть с помощью…\" в + контекстом меню файла + Не показывать пункт \"Открыть с помощью…\" в + контекстом меню файла + Пункт меню \"Создать событие…\" + Показывать пункт \"Создать событие…\" в + контекстном меню файла + Не показывать пункт \"Создать событие…\" в + контекстном меню файла Ориентация экрана Режим обновления экрана EInk Частота полного обновления экрана EInk - Как часто экран будет обновляться полностью... - (обновлений) + Как часто экран будет обновляться полностью… + (обновлений) Размер шрифта имен файлов/папок Размер шрифта основной строки имен файлов и папок во всех - списках... px + списках… px Дополнительный размер шрифта имен файлов Размер шрифта дополнительной строки имен файлов Размер иконок имен файлов/папок Размер иконок для имен файлов и папок во всех - списках... px (0 - без иконок) + списках… px (0 - без иконок) Вывод названия файла в несколько строк Вывод названия файла в одну строку Однострочный режим вывода @@ -460,40 +418,40 @@ Собственная полоса прокрутки Использовать собственную полосу прокрутки Ширина полосы прокрутки - Ширина собственной полосы прокрутки... (пикс.) - + Ширина собственной полосы прокрутки… (пикс.) + Отступ полосы прокрутки Кнопка \"Back\" завершает программу Кнопка \"Back\" открывает родительскую папку Использовать кнопку \"Back\" для навигации - Левый отступ собственной полосы прокрутки... - (пикс.) + Левый отступ собственной полосы прокрутки… + (пикс.) Количество результатов поиска Количество выдаваемых результатов поиска, не более - чем... (файлов) + чем… (файлов) Уведомление о состоянии поиска - Сообщать о состоянии поиска каждые... (файлов) - + Сообщать о состоянии поиска каждые… (файлов) + Начальные папки поиска - Поиск всегда начинается с папок... + Поиск всегда начинается с папок… Ограничение просмотра файлов Размер просматриваемого файла не может быть больше - чем... (КБ) + чем… (КБ) Ограничение редактирования файлов Размер редактируемого файла не может быть больше - чем... (КБ) + чем… (КБ) Недавно открытые - Сохранять в списке "Недавно открытых" последние... - (файлов) + Сохранять в списке "Недавно открытых" последние… + (файлов) Избранное - Сохранять в списке "Избранного"... (файлов) - + Сохранять в списке "Избранного"… (файлов) + Недавно запущенные приложения Сохранять в списке "Недавно запущенных приложений" - последние... (приложений) + последние… (приложений) Избранные приложения - Сохранять в списке "Избранных приложений"... - (приложений) + Сохранять в списке "Избранных приложений"… + (приложений) Использовать функции файлового менеджера Показывать пункты меню файлового менеджера Не показывать пункты меню файлового менеджера @@ -520,7 +478,7 @@ Размер шрифта Размер шрифта элементов списка файлов Настройка файлового фильтра - Настройка ассоциций файлов + Настройка ассоциаций файлов Вернуть настройки по умолчанию Сохранить настройки на карту памяти Загрузить настройки с карты памяти @@ -622,5 +580,69 @@ Авторы: Серия: Название: - + + Язык + Выберите язык: + Язык приложения.\nПерегрузите ReLaunch. + Скачать файлы + > Настройка Dropbox + Папка Dropbox + Скачиваемая папка Dropbox + Локальная папка + Локальная папка для скачиваемых файлов + > Настройка OPDS + OPDS каталог для подключения + OPDS каталог + Локальная папка для скачиваемых файлов + Локальная папка + Информация о книге + Cкачать книгу в формате: + Выбрать и скачать + Загрузить файлы + Оставлять отсутствующие на сервере файлы + Удалять отсутствующие на сервере файлы + Удаление локальных файлов + Оставлять отсутствующие на устройстве файлы + Удалять отсутствующие на устройстве файлы + Удаление файлов на сервере. + Внимание! Необходимо выполнить настройку. + Ошибка аутентификации + Ошибка соединения + Ошибка скачивания с сервера + Ошибка загрузки файлов на сервер + Скачать + Дождитесь окончания операции скачивания файлов! + Скачать выбранное? + Скопировано   +   файлов + Введите имя пользователя + Имя пользователя + Введите пароль пользователя + Пароль + Копировать в Dropbox + Кнопка для запуска + Больше + Расширенная информация + Выбор файла + - Данные о книге -\n + - Данные об исходнике книги -\n + - Информация об FB2-документе -\n + - Сведения об издании книги -\n + Серия:\n + Жанр:\n + Название произведения:\n + Список ключевых слов к книге:\n + Дата:\n + Язык книги:\n + Язык оригинала:\n + Программы использованные при подготовке:\n + Оригинальный документ:\n + Автор OCR или оригинального документа:\n + Версия FB2-документа:\n + Правообладатель:\n + Год издания:\n + Автор:\n + Переводчик:\n + Переписать… + Удалить выбранное? diff --git a/res/values/arrays.xml b/res/values/arrays.xml index d577576..18590af 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -54,18 +54,6 @@ sysfs cgroup - - 3 - 4 - 5 - 6 - - - CLEAR (mode 3) - ACTIVE_ALL (mode 4) - ONESHOT_ALL (mode 5) - CLEAR_ALL (mode 6) - -1 0 @@ -83,36 +71,48 @@ OPENN OPENMENU OPENSCREEN + DROPBOX + OPDS @string/arr_home_button_actions_names_1 @string/arr_home_button_actions_names_2 @string/arr_home_button_actions_names_3 @string/arr_home_button_actions_names_4 + @string/arr_home_button_actions_names_5 + @string/arr_home_button_actions_names_6 NOTHING OPENN OPENMENU OPENSCREEN + DROPBOX + OPDS @string/arr_lru_button_actions_names_1 @string/arr_lru_button_actions_names_2 @string/arr_lru_button_actions_names_3 @string/arr_lru_button_actions_names_4 + @string/arr_lru_button_actions_names_5 + @string/arr_lru_button_actions_names_6 NOTHING OPENN OPENMENU OPENSCREEN + DROPBOX + OPDS @string/arr_fav_button_actions_names_1 @string/arr_fav_button_actions_names_2 @string/arr_fav_button_actions_names_3 @string/arr_fav_button_actions_names_4 + @string/arr_fav_button_actions_names_5 + @string/arr_fav_button_actions_names_6 NOTHING @@ -121,6 +121,8 @@ POWEROFF SWITCHWIFI RUN + DROPBOX + OPDS @string/arr_advanced_button_actions_names_1 @@ -129,6 +131,8 @@ @string/arr_advanced_button_actions_names_4 @string/arr_advanced_button_actions_names_5 @string/arr_advanced_button_actions_names_6 + @string/arr_advanced_button_actions_names_7 + @string/arr_advanced_button_actions_names_8 NOTHING @@ -137,6 +141,8 @@ POWEROFF SWITCHWIFI RUN + DROPBOX + OPDS @string/arr_settings_button_actions_names_1 @@ -145,6 +151,8 @@ @string/arr_settings_button_actions_names_4 @string/arr_settings_button_actions_names_5 @string/arr_settings_button_actions_names_6 + @string/arr_settings_button_actions_names_7 + @string/arr_settings_button_actions_names_8 NOTHING @@ -153,6 +161,8 @@ POWEROFF SWITCHWIFI RUN + DROPBOX + OPDS @string/arr_mem_button_actions_names_1 @@ -161,6 +171,8 @@ @string/arr_mem_button_actions_names_4 @string/arr_mem_button_actions_names_5 @string/arr_mem_button_actions_names_6 + @string/arr_mem_button_actions_names_7 + @string/arr_mem_button_actions_names_8 NOTHING @@ -169,6 +181,8 @@ POWEROFF SWITCHWIFI RUN + DROPBOX + OPDS @string/arr_bat_button_actions_names_1 @@ -177,6 +191,8 @@ @string/arr_bat_button_actions_names_4 @string/arr_bat_button_actions_names_5 @string/arr_bat_button_actions_names_6 + @string/arr_bat_button_actions_names_7 + @string/arr_bat_button_actions_names_8 -1 @@ -245,6 +261,50 @@ @string/arr_appfav_button_actions_names_2 @string/arr_appfav_button_actions_names_3 - - + + System + English + Русский + Español + + + default + en + ru + es + + + NOTHING + homeButtonDT + homeButtonLT + lruButtonDT + lruButtonLT + favButtonDT + favButtonLT + settingsButtonDT + settingsButtonLT + advancedButtonDT + advancedButtonLT + memButtonDT + memButtonLT + batButtonDT + batButtonLT + + + @string/arr_einkUpdateMode_names_1 + @string/pref_i_homeButtonDT_title + @string/pref_i_homeButtonLT_title + @string/pref_i_lruButtonDT_title + @string/pref_i_lruButtonLT_title + @string/pref_i_favButtonDT_title + @string/pref_i_favButtonLT_title + @string/pref_i_settingsButtonDT_title + @string/pref_i_settingsButtonLT_title + @string/pref_i_advancedButtonDT_title + @string/pref_i_advancedButtonLT_title + @string/pref_i_memButtonDT_title + @string/pref_i_memButtonLT_title + @string/pref_i_batButtonDT_title + @string/pref_i_batButtonLT_title + \ No newline at end of file diff --git a/res/values/colors.xml b/res/values/colors.xml index 8873e52..6a215a2 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -1,6 +1,5 @@ - #FFFFFFFF #FF000000 #FFD0D0D0 @@ -25,5 +24,4 @@ #FFFFFFFF #FF808080 #FF000000 - \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index f927e87..29a8269 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,6 +1,10 @@ ReLaunch + OK + Cancel + Yes + No <h2>The tool is for Nook Simple Touch or Sony PRS-T1 only!</h2><br><center><b>Continue anyway ?</b></center> @@ -12,28 +16,18 @@ Power Off Save == EDITOR == - Cancel Rule: Value: AND Filter Settings - OK Add new AND - Cancel One level up Memory Mem: Battery B Settings - Filter setting - Associations - Cancel - OK - Save settings and restart ReLaunch (some settings - work only after restart) - Reset/Backup\n/Restore Settings Case sensitive Search known extensions only Sort search results @@ -44,12 +38,10 @@ list Search string Search - Cancel Show all books (known extensions) from search root Search Kill - OK PID/UID: Label: Name: @@ -67,31 +59,27 @@ Sort alphabetically Tasks Services - Wait... + Wait… File suffix: Application: - OK Add new - Cancel Associations Settings Edit -- VIEWER -- - REBOOT\n\nWait... - Powered Off\n\nUse Power button to start again... - + REBOOT\n\nWait… + Powered Off\n\nUse Power button to start again… + Connected, IP: Level: Not in range not configured - WiFi off... + WiFi off… WiFi off - WiFi on... + WiFi on… WiFi on Advanced functions, info, etc. Reboot confirmation Are you sure to reboot your device ? - YES - NO Power Off confirmation Are you sure to power off your device ? Disks/partitions @@ -103,26 +91,19 @@ RO/RW RO RW - Implemented only on NOOK Simple Touch. Implemented only on rooted device. Move one position up Move one position down Remove from favorites Uninstall - Cancel Add to favorites File too big File is too big for editor kilobytes Maximal allowed size is - OK Save changes warning Do you want to save changes? - YES - NO - Cancel - Cancel Open failure Can\'t open file for writting @@ -132,24 +113,15 @@ Can\'t close file Filter value: Can\'t be empty! - OK - Cancel AND OR Select number Select application - OK Decline changes warning Do you want to save all configuration\'s changes? Default settings warning Are you sure to restore default settings? - Yes - No - Cancel - Revert all settings to default values - Save settings to SD Card - Restore settings from SD Card Success! Operation finished successfully Operation finished successfully\nProgram will be @@ -164,8 +136,6 @@ Do you really want to clear Favorites list? Wrong model! - YES - NO M free WiFi is off WiFi is ON @@ -174,26 +144,25 @@ All applications Favorite applications What\'s new - OK Add to favorites Mark as read Remove \"read\" mark Forget all marks - Open with ... - Create Intent ... + Open with … + Create Intent … Copy + Copy Move - Move Paste - Rename... - Create new folder... + Rename… + Create new folder… Enter the name of new folder Unable to create the folder Enter new name of file Delete Delete NON-EMPTY directory! Delete empty directory - Cancel + Copy to dir of Dropbox Select intent type Activity not found Activity not found @@ -225,9 +194,7 @@ WiFi is off prev next - Show book titles - Show file names - Rename file with fb2/epub tags... + Rename file with fb2/epub tags… Sort the files in the order by filename A-Z filename Z-A @@ -235,7 +202,6 @@ by alphabetical order Z-A Show annotation Properties - File Properties Name: Size: Date: @@ -251,7 +217,6 @@ code: <a href=\"https://github.com/yiselieren/ReLaunch\">git://github.com/yiselieren/ReLaunch.git</a></center> - OK Information Information Activity @@ -261,7 +226,6 @@ Move one position up Move one position down Delete directory - Cancel Delete file Mark as read Remove \"read\" mark @@ -270,9 +234,6 @@ Are you sure to delete file \? Select file - Cancel - YES - NO Remove from favorites Delete empty directory warning Are you sure to delete empty directory @@ -282,7 +243,6 @@ (dangerous) \? Activity not found Search in progress - Cancel Search results Files (found / total searched) Total: @@ -295,8 +255,6 @@ Mem: Suffix File suffix - OK - Cancel Can\'t be empty! Explicit application or general intent? When you tap on file with specified suffix ReLaunch @@ -311,7 +269,6 @@ is too big for viewer kilobytes Maximal allowed size is - OK Filter results Filter results according to filter definitions @@ -356,28 +313,28 @@ Hide known part of directories Hide known part (start dir) from dir name Hide known part of directories - \'Open with...\' context menu item - Show \'Open with...\' context menu item - Do not show \'Open with...\' context menu item - - \'Create intent...\' context menu item - Show \'Create intent...\' context menu item - - Do not show \'Create intent...\' context menu item - + \'Open with…\' context menu item + Show \'Open with…\' context menu item + Do not show \'Open with…\' context menu item + + \'Create intent…\' context menu item + Show \'Create intent…\' context menu item + + Do not show \'Create intent…\' context menu item + Screen Orientation EInk Screen Update Mode EInk Screen Full Update Interval How often EInk will be fully updated Files and directories names font size Font size for files and directories names in all - lists... px - Additional font size for files... px - + lists… px + Additional font size for files… px + Font size for additional line in file names Files and directories icons size - Icon size for files and directories... px (0 - - disable icon) + Icon size for files and directories… px (0 - + disable icon) Files and directories list (default) Output filename in multi lines Output filename in single line @@ -458,7 +415,7 @@ Maximal amount of search results Maximal size of search results list How often report search progress - Report search progress every ... files + Report search progress every … files Root search directory Search always start here Maximal file size for viewer @@ -537,38 +494,52 @@ Open home directory # Open home directories menu Open home directories screen + DropBox + OPDS Nothing Open Last opened # Open Last opened menu Open Last opened screen + DropBox + OPDS Nothing Open Favorites # Open Favorites menu Open Favorites screen + DropBox + OPDS Nothing Open \"Advanced functions\" window Lock device Power Off device Switch WiFi state Run application + DropBox + OPDS Nothing Open \"Settings\" window Lock device Power Off device Switch WiFi state Run application + DropBox + OPDS Nothing Open \"Application manager\" window Lock device Power Off device Switch WiFi state Run application + DropBox + OPDS Nothing Open \"battery consumption\" window Lock device Power Off device Switch WiFi state Run application + DropBox + OPDS Detect automatically 1 column 2 columns @@ -600,5 +571,71 @@ Authors: Series: Title: - + + Language + Select the language: + Language app.\nRestart Relaunch!. + Link Dropbox + Unlink Dropbox + Download + > Dropbox settings + Dropbox folder + DropBox folder to download from + Local folder + Local folder for downloading. + > OPDS settings + OPDS catalog to connect to + OPDS catalog + Local folder to download to + Local folder + Book info + Download the book in the format: + Select and download + Upload + Keep files not on server + Remove files not on server + Remove local files? + Keep files not on reader + Remove files not on reader + Remove files on server? + Attention! Configure before attempting to connect + Error authenticating + Error connecting + Error downloading + Error uploading + Download + Please wait until current download finishes! + Download selected? + Downloaded   +   files + Введите имя пользователя + Login + Введите пароль для доступа к ресурсу + Password + Копировать в Dropbox + Кнопка для запуска + Больше + Расширенная информация + Выбор файла + - Данные о книге -\n + - Данные об исходнике книги -\n + - Информация об FB2-документе -\n + - Сведения об издании книги -\n + Серия:\n + Жанр:\n + Название произведения:\n + Список ключевых слов к книге:\n + Дата:\n + Язык книги:\n + Язык оригинала:\n + Программы использованные при подготовке:\n + Оригинальный документ:\n + Автор OCR или оригинального документа:\n + Версия FB2-документа:\n + Правообладатель:\n + Год издания:\n + Автор:\n + Переводчик:\n + Rewrite… + Удалить выбранное? diff --git a/res/values/styles.xml b/res/values/styles.xml index 720012d..ffe3950 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -1,11 +1,5 @@ - - diff --git a/res/xml/prefs.xml b/res/xml/prefs.xml index f7bdd19..bc9f730 100644 --- a/res/xml/prefs.xml +++ b/res/xml/prefs.xml @@ -8,7 +8,7 @@ android:entries="@array/start_mode_names" android:entryValues="@array/start_mode_values" android:key="startMode" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_startMode_title" /> @@ -18,7 +18,7 @@ android:entries="@array/work_mode_names" android:entryValues="@array/work_mode_values" android:key="workMode" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_workMode_title" /> @@ -28,7 +28,7 @@ android:entries="@array/screen_orientation_names" android:entryValues="@array/screen_orientation_values" android:key="screenOrientation" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_screenOrientation_title" /> @@ -36,7 +36,7 @@ + - + + + + @@ -172,7 +183,7 @@ android:defaultValue="10" android:enabled="true" android:key="einkUpdateInterval" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:summary="@string/pref_i_einkUpdateInterval_sum" @@ -181,7 +192,7 @@ @@ -262,7 +273,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsHomeList" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsHomeList_title" /> @@ -272,7 +283,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsLRU" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsLRU_title" /> @@ -282,7 +293,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsFAV" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsFAV_title" /> @@ -292,7 +303,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsSearch" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsSearch_title" /> @@ -302,7 +313,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsAppAll" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsAppAll_title" /> @@ -312,7 +323,7 @@ android:entries="@array/output_columns_names" android:entryValues="@array/output_columns_values" android:key="columnsAppFav" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsAppFav_title" /> @@ -322,7 +333,7 @@ android:entries="@array/output_columns_intensity_names" android:entryValues="@array/output_columns_intensity_values" android:key="columnsAlgIntensity" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_columnsAlgIntensity_title" /> @@ -330,19 +341,19 @@ @@ -423,7 +434,7 @@ android:entries="@array/home_button_actions_names" android:entryValues="@array/home_button_actions_values" android:key="homeButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_homeButtonDT_title" /> @@ -433,7 +444,7 @@ android:entries="@array/home_button_actions_names" android:entryValues="@array/home_button_actions_values" android:key="homeButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_homeButtonLT_title" /> @@ -443,7 +454,7 @@ android:entries="@array/lru_button_actions_names" android:entryValues="@array/lru_button_actions_values" android:key="lruButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_lruButtonST_title" /> @@ -453,7 +464,7 @@ android:entries="@array/lru_button_actions_names" android:entryValues="@array/lru_button_actions_values" android:key="lruButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_lruButtonDT_title" /> @@ -463,7 +474,7 @@ android:entries="@array/lru_button_actions_names" android:entryValues="@array/lru_button_actions_values" android:key="lruButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_lruButtonLT_title" /> @@ -473,7 +484,7 @@ android:entries="@array/fav_button_actions_names" android:entryValues="@array/fav_button_actions_values" android:key="favButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_favButtonST_title" /> @@ -483,7 +494,7 @@ android:entries="@array/fav_button_actions_names" android:entryValues="@array/fav_button_actions_values" android:key="favButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_favButtonDT_title" /> @@ -493,7 +504,7 @@ android:entries="@array/fav_button_actions_names" android:entryValues="@array/fav_button_actions_values" android:key="favButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_favButtonLT_title" /> @@ -503,7 +514,7 @@ android:entries="@array/settings_button_actions_names" android:entryValues="@array/settings_button_actions_values" android:key="settingsButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_settingsButtonST_title" /> @@ -513,7 +524,7 @@ android:entries="@array/settings_button_actions_names" android:entryValues="@array/settings_button_actions_values" android:key="settingsButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_settingsButtonDT_title" /> @@ -523,7 +534,7 @@ android:entries="@array/settings_button_actions_names" android:entryValues="@array/settings_button_actions_values" android:key="settingsButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_settingsButtonLT_title" /> @@ -533,7 +544,7 @@ android:entries="@array/advanced_button_actions_names" android:entryValues="@array/advanced_button_actions_values" android:key="advancedButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_advancedButtonST_title" /> @@ -543,7 +554,7 @@ android:entries="@array/advanced_button_actions_names" android:entryValues="@array/advanced_button_actions_values" android:key="advancedButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_advancedButtonDT_title" /> @@ -553,7 +564,7 @@ android:entries="@array/advanced_button_actions_names" android:entryValues="@array/advanced_button_actions_values" android:key="advancedButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_advancedButtonLT_title" /> @@ -563,7 +574,7 @@ android:entries="@array/mem_button_actions_names" android:entryValues="@array/mem_button_actions_values" android:key="memButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_memButtonST_title" /> @@ -573,7 +584,7 @@ android:entries="@array/mem_button_actions_names" android:entryValues="@array/mem_button_actions_values" android:key="memButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_memButtonDT_title" /> @@ -583,7 +594,7 @@ android:entries="@array/mem_button_actions_names" android:entryValues="@array/mem_button_actions_values" android:key="memButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_memButtonLT_title" /> @@ -593,7 +604,7 @@ android:entries="@array/bat_button_actions_names" android:entryValues="@array/bat_button_actions_values" android:key="batButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_batButtonST_title" /> @@ -603,7 +614,7 @@ android:entries="@array/bat_button_actions_names" android:entryValues="@array/bat_button_actions_values" android:key="batButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_batButtonDT_title" /> @@ -613,7 +624,7 @@ android:entries="@array/bat_button_actions_names" android:entryValues="@array/bat_button_actions_values" android:key="batButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_batButtonLT_title" /> @@ -623,7 +634,7 @@ android:entries="@array/appfav_button_actions_names" android:entryValues="@array/appfav_button_actions_values" android:key="appFavButtonST" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_appFavButtonST_title" /> @@ -633,7 +644,7 @@ android:entries="@array/appfav_button_actions_names" android:entryValues="@array/appfav_button_actions_values" android:key="appFavButtonDT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_appFavButtonDT_title" /> @@ -643,7 +654,7 @@ android:entries="@array/appfav_button_actions_names" android:entryValues="@array/appfav_button_actions_values" android:key="appFavButtonLT" - android:layout="@+layout/pref_child" + android:layout="@layout/pref_child" android:persistent="true" android:selectable="true" android:title="@string/pref_i_appFavButtonLT_title" /> @@ -652,7 +663,7 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/harasoft/relaunch/Advanced.java b/src/com/harasoft/relaunch/Advanced.java index 6d9dc39..ffd1347 100644 --- a/src/com/harasoft/relaunch/Advanced.java +++ b/src/com/harasoft/relaunch/Advanced.java @@ -36,7 +36,7 @@ public class Advanced extends Activity { boolean addSView = true; WifiManager wfm; - boolean wifiOn = false; + public static boolean wifiOn = false; Button wifiOnOff; Button wifiScan; List wifiNetworks = new ArrayList(); @@ -48,36 +48,6 @@ public class Advanced extends Activity { BroadcastReceiver b2; String connectedSSID; - private void setEinkController() { - if (prefs != null) { - Integer einkUpdateMode = 1; - try { - einkUpdateMode = Integer.parseInt(prefs.getString( - "einkUpdateMode", "1")); - } catch (Exception e) { - einkUpdateMode = 1; - } - if (einkUpdateMode < -1 || einkUpdateMode > 2) - einkUpdateMode = 1; - if (einkUpdateMode >= 0) { - EinkScreen.UpdateMode = einkUpdateMode; - - Integer einkUpdateInterval = 10; - try { - einkUpdateInterval = Integer.parseInt(prefs.getString( - "einkUpdateInterval", "10")); - } catch (Exception e) { - einkUpdateInterval = 10; - } - if (einkUpdateInterval < 0 || einkUpdateInterval > 100) - einkUpdateInterval = 10; - EinkScreen.UpdateModeInterval = einkUpdateInterval; - - EinkScreen.PrepareController(null, false); - } - } - } - static class NetInfo { static int unknownLevel = -5000; String SSID; @@ -152,18 +122,6 @@ static class Info { String used; String free; boolean ro; - - public void dump(String p) { - /* - * Log.d(TAG, p + " dev=\"" + dev + "\" mpoint=\"" + mpoint + - * "\" fs=\"" + fs + "\" used=\"" + used + " total=\"" + total + - * "\" free=\"" + free + "\" ro=" + ro); - */ - } - } - - private void Trace(String t, String s) { - // Log.d(t, s); } static class ViewHolder { @@ -408,18 +366,19 @@ private void createInfo() { String flags = f[3]; String[] f1 = flags.split(","); boolean ignore = false; - for (int i = 0; i < ingnoreFs.length; i++) + for (int i = 0; i < ingnoreFs.length; i++){ if (ingnoreFs[i].equals(fs)) { ignore = true; break; } + } if (ignore) continue; Info in = new Info(); in.dev = f[0]; in.mpoint = f[1]; in.fs = fs; - for (int i = 0; i < f1.length; i++) + for (int i = 0; i < f1.length; i++){ if (f1[i].equals("ro")) { in.ro = true; break; @@ -427,6 +386,7 @@ private void createInfo() { in.ro = false; break; } + } in.total = "0"; in.used = "0"; in.free = "0"; @@ -448,6 +408,7 @@ private void createInfo() { // Wifi wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifiOn = wfm.isWifiEnabled(); + wfm.getWifiState(); wifiNetworks = readScanResults(wfm); } @@ -534,7 +495,7 @@ public void onClick(View v) { } }); wifiNetworks = readScanResults(wfm); - setEinkController(); + EinkScreen.PrepareController(null, false); adapter.notifyDataSetChanged(); wifiScan.setEnabled(true); } else { @@ -555,7 +516,7 @@ public void onClick(View v) { } }); wifiNetworks.clear(); - setEinkController(); + EinkScreen.PrepareController(null, false); adapter.notifyDataSetChanged(); wifiScan.setEnabled(false); } @@ -567,7 +528,7 @@ protected void onCreate(Bundle savedInstanceState) { prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - setEinkController(); + EinkScreen.setEinkController(prefs); ingnoreFs = getResources() .getStringArray(R.array.filesystems_to_ignore); @@ -580,12 +541,12 @@ protected void onCreate(Bundle savedInstanceState) { // "Advanced functions, info, etc." ((TextView) findViewById(R.id.results_title)).setText(getResources() .getString(R.string.jv_advanced_title)); - ((ImageButton) findViewById(R.id.results_btn)) + findViewById(R.id.results_btn) .setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - finish(); - } - }); + public void onClick(View v) { + finish(); + } + }); // Wifi info lv_wifi = (ListView) findViewById(R.id.wifi_lv); @@ -615,8 +576,8 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + EinkScreen.PrepareController(null, false); + sv.invalidate(); } public void onScrollStateChanged(AbsListView view, @@ -629,7 +590,7 @@ public void onScrollStateChanged(AbsListView view, lv_wifi.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -652,7 +613,6 @@ public void onClick(View v) { b1 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Trace(TAG, "--- Broadcast receiver B1"); wifiNetworks = readScanResults(wfm); wifiScan.setEnabled(true); adapter.notifyDataSetChanged(); @@ -670,7 +630,6 @@ public void onReceive(Context context, Intent intent) { b2 = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - Trace(TAG, "--- Broadcast receiver B2"); wifiOn = wfm.isWifiEnabled(); wifiNetworks = readScanResults(wfm); wifiScan.setEnabled(true); @@ -688,7 +647,7 @@ public void onReceive(Context context, Intent intent) { public void onClick(View v) { - if (DeviceInfo.EINK_SONY) { + if (N2DeviceInfo.EINK_SONY) { final Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); // SONY PRS-Tx only! @@ -698,21 +657,21 @@ public void onClick(View v) { intent.setComponent(cn); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); - } else if (DeviceInfo.EINK_NOOK) { - final Intent intent = new Intent(Intent.ACTION_MAIN, null); - intent.addCategory(Intent.CATEGORY_LAUNCHER); - // NOOK ST only! - final ComponentName cn = new ComponentName( - "com.android.settings", - "com.android.settings.wifi.Settings_Wifi_Settings"); - intent.setComponent(cn); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(intent); - } else { + } else if (N2DeviceInfo.EINK_NOOK) { + final Intent intent = new Intent(Intent.ACTION_MAIN, null); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + // NOOK ST only! + final ComponentName cn = new ComponentName( + "com.android.settings", + "com.android.settings.wifi.Settings_Wifi_Settings"); + intent.setComponent(cn); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } else { final Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); - } + } } }); @@ -827,10 +786,11 @@ protected void onDestroy() { unregisterReceiver(b2); } + @Override protected void onResume() { super.onResume(); - setEinkController(); + EinkScreen.setEinkController(prefs); app.generalOnResume(TAG, this); } diff --git a/src/com/harasoft/relaunch/AllApplications.java b/src/com/harasoft/relaunch/AllApplications.java index 577f3ef..03c2c6f 100644 --- a/src/com/harasoft/relaunch/AllApplications.java +++ b/src/com/harasoft/relaunch/AllApplications.java @@ -1,9 +1,5 @@ package com.harasoft.relaunch; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.Context; @@ -15,25 +11,16 @@ import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceManager; -import android.view.ContextMenu; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; +import android.view.*; import android.view.ContextMenu.ContextMenuInfo; -import android.widget.AbsListView; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.GridView; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; +import android.widget.*; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + public class AllApplications extends Activity { final String TAG = "AllApps"; @@ -58,35 +45,6 @@ public class AllApplications extends Activity { boolean addSView = true; int gcols = 2; - private void setEinkController() { - if (prefs != null) { - Integer einkUpdateMode = 1; - try { - einkUpdateMode = Integer.parseInt(prefs.getString( - "einkUpdateMode", "1")); - } catch (Exception e) { - einkUpdateMode = 1; - } - if (einkUpdateMode < -1 || einkUpdateMode > 2) - einkUpdateMode = 1; - if (einkUpdateMode >= 0) { - EinkScreen.UpdateMode = einkUpdateMode; - - Integer einkUpdateInterval = 10; - try { - einkUpdateInterval = Integer.parseInt(prefs.getString( - "einkUpdateInterval", "10")); - } catch (Exception e) { - einkUpdateInterval = 10; - } - if (einkUpdateInterval < 0 || einkUpdateInterval > 100) - einkUpdateInterval = 10; - EinkScreen.UpdateModeInterval = einkUpdateInterval; - - EinkScreen.PrepareController(null, false); - } - } - } static class ViewHolder { TextView tv; @@ -202,7 +160,6 @@ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - setEinkController(); app = ((ReLaunchApp) getApplicationContext()); app.setFullScreenIfNecessary(this); setContentView(R.layout.all_applications); @@ -289,8 +246,8 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + EinkScreen.PrepareController(null, false); + sv.invalidate(); } public void onScrollStateChanged(AbsListView view, @@ -303,7 +260,7 @@ public void onScrollStateChanged(AbsListView view, lv.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -361,18 +318,10 @@ public void onItemClick(AdapterView parent, View view, ScreenOrientation.set(this, prefs); } - @Override - protected void onRestart() { - super.onRestart(); - setEinkController(); - if (listName.equals("app_all")) - rereadAppList(); - } - @Override protected void onStart() { super.onStart(); - setEinkController(); + EinkScreen.setEinkController(prefs); if (listName.equals("app_all")) rereadAppList(); } @@ -380,7 +329,7 @@ protected void onStart() { @Override protected void onResume() { super.onResume(); - setEinkController(); + EinkScreen.PrepareController(null, false); if (listName.equals("app_all")) rereadAppList(); app.generalOnResume(TAG, this); @@ -410,7 +359,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, .getString(R.string.jv_allapp_uninstall)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_allapp_cancel)); + .getString(R.string.app_cancel)); } else { List lit = app.getList("app_favorites"); boolean in_fav = false; @@ -429,7 +378,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, .getString(R.string.jv_allapp_uninstall)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_allapp_cancel)); + .getString(R.string.app_cancel)); } } diff --git a/src/com/harasoft/relaunch/DeviceInfo.java b/src/com/harasoft/relaunch/DeviceInfo.java deleted file mode 100644 index a8a43f1..0000000 --- a/src/com/harasoft/relaunch/DeviceInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.harasoft.relaunch; - -/** - * originate from CoolReader - * http://http://sourceforge.net/projects/crengine/ - */ - -import android.os.Build; -import android.util.Log; - -public class DeviceInfo { - - public final static String MANUFACTURER; - public final static String MODEL; - public final static String DEVICE; - public final static boolean SAMSUNG_BUTTONS_HIGHLIGHT_PATCH; - public final static boolean EINK_SCREEN; - public final static boolean EINK_SCREEN_UPDATE_MODES_SUPPORTED; - public final static boolean NOOK_NAVIGATION_KEYS; - public final static boolean EINK_NOOK; - public final static boolean FORCE_LIGHT_THEME; - public final static boolean EINK_SONY; - public final static boolean SONY_NAVIGATION_KEYS; - public final static boolean USE_CUSTOM_TOAST; - public final static boolean AMOLED_SCREEN; - - static { - MANUFACTURER = getBuildField("MANUFACTURER"); - MODEL = getBuildField("MODEL"); - DEVICE = getBuildField("DEVICE"); - SAMSUNG_BUTTONS_HIGHLIGHT_PATCH = MANUFACTURER.toLowerCase() - .contentEquals("samsung") - && (MODEL.contentEquals("GT-S5830") || MODEL - .contentEquals("GT-S5660")); // More models? - AMOLED_SCREEN = MANUFACTURER.toLowerCase().contentEquals("samsung") - && (MODEL.toLowerCase().startsWith("gt-i")); // AMOLED screens: - // GT-IXXXX - EINK_NOOK = MANUFACTURER.toLowerCase().contentEquals("barnesandnoble") - && (MODEL.contentEquals("NOOK")|| MODEL.contentEquals("BNRV300") || MODEL.contentEquals("BNRV350")) - && DEVICE.toLowerCase().contentEquals("zoom2"); - EINK_SONY = MANUFACTURER.toLowerCase().contentEquals("sony") - && MODEL.contentEquals("PRS-T1"); - EINK_SCREEN = EINK_SONY || EINK_NOOK; // TODO: set to true for eink - // devices like Nook Touch - - NOOK_NAVIGATION_KEYS = EINK_NOOK; // TODO: add autodetect - SONY_NAVIGATION_KEYS = EINK_SONY; - EINK_SCREEN_UPDATE_MODES_SUPPORTED = EINK_SCREEN && EINK_NOOK; // TODO: - // add - // autodetect - FORCE_LIGHT_THEME = EINK_SCREEN; - USE_CUSTOM_TOAST = EINK_SCREEN; - } - - private static String getBuildField(String fieldName) { - - try { - return (String) Build.class.getField(fieldName).get(null); - } catch (Exception e) { - Log.d("relaunch", "Exception while trying to check Build." + fieldName); - return ""; - } - } -} diff --git a/src/com/harasoft/relaunch/Editor.java b/src/com/harasoft/relaunch/Editor.java index 610a22b..eaee572 100644 --- a/src/com/harasoft/relaunch/Editor.java +++ b/src/com/harasoft/relaunch/Editor.java @@ -81,7 +81,7 @@ private boolean saveChanges(String newBuf, final String fname) { .getString(R.string.jv_editor_openerr_text2)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_editor_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -107,7 +107,7 @@ public void onClick(DialogInterface dialog, + " \"" + fname + "\""); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_editor_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -133,7 +133,7 @@ public void onClick(DialogInterface dialog, + " \"" + fname + "\""); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_editor_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -199,7 +199,7 @@ protected void onCreate(Bundle savedInstanceState) { + " " + getResources().getString(R.string.jv_editor_bytes)); builder.setPositiveButton( - getResources().getString(R.string.jv_editor_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -244,7 +244,7 @@ public void onClick(View v) { // "YES" builder.setPositiveButton( getResources() - .getString(R.string.jv_editor_yes), + .getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -256,7 +256,7 @@ public void onClick(DialogInterface dialog, }); // "NO" builder.setNegativeButton( - getResources().getString(R.string.jv_editor_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -290,12 +290,12 @@ public void afterTextChanged(Editable s) { saveBtn.setEnabled(false); // "Back" cancelBtn - .setText(getResources().getString(R.string.jv_editor_back)); + .setText(getResources().getString(R.string.app_cancel)); } else { saveBtn.setEnabled(true); // "Cancel" cancelBtn.setText(getResources().getString( - R.string.jv_editor_cancel)); + R.string.app_cancel)); } } diff --git a/src/com/harasoft/relaunch/EinkScreen.java b/src/com/harasoft/relaunch/EinkScreen.java index e5e1581..ef5a930 100644 --- a/src/com/harasoft/relaunch/EinkScreen.java +++ b/src/com/harasoft/relaunch/EinkScreen.java @@ -5,7 +5,7 @@ * http://http://sourceforge.net/projects/crengine/ */ -import com.harasoft.relaunch.N2EpdController; +import android.content.SharedPreferences; import android.view.View; public class EinkScreen { @@ -24,7 +24,7 @@ public class EinkScreen { public final static int cmodeActive = 2; public static void PrepareController(View view, boolean isPartially) { - if (DeviceInfo.EINK_NOOK) { + if (N2DeviceInfo.EINK_NOOK) { // System.err.println("Sleep = " + isPartially); if (isPartially || IsSleep != isPartially) { SleepController(isPartially, view); @@ -69,7 +69,6 @@ public static void PrepareController(View view, boolean isPartially) { } } - return; /* * if (UpdateMode == 1 && UpdateModeInterval != 0) { if * (RefreshNumber == 0) { // быстрый режим, один @@ -84,10 +83,10 @@ public static void PrepareController(View view, boolean isPartially) { * RefreshNumber = -1; } RefreshNumber ++; } */ } - } + } public static void ResetController(int mode, View view) { - if (!DeviceInfo.EINK_NOOK) { + if (!N2DeviceInfo.EINK_NOOK) { return; } System.err.println("+++ResetController " + mode); @@ -110,7 +109,7 @@ public static void ResetController(int mode, View view) { } public static void ResetController(View view) { - if (!DeviceInfo.EINK_NOOK || UpdateMode == cmodeClear) { + if (!N2DeviceInfo.EINK_NOOK || UpdateMode == cmodeClear) { return; } System.err.println("+++Soft reset Controller "); @@ -119,7 +118,7 @@ public static void ResetController(View view) { } public static void SleepController(boolean toSleep, View view) { - if (!DeviceInfo.EINK_NOOK || toSleep == IsSleep) { + if (!N2DeviceInfo.EINK_NOOK || toSleep == IsSleep) { return; } System.err.println("+++SleepController " + toSleep); @@ -137,7 +136,6 @@ public static void SleepController(boolean toSleep, View view) { } else { ResetController(UpdateMode, view); } - return; } private static void SetMode(View view, int mode) { @@ -159,4 +157,34 @@ private static void SetMode(View view, int mode) { break; } } + + public static void setEinkController(SharedPreferences prefs) { + if (prefs != null) { + Integer einkUpdateMode; + try { + einkUpdateMode = Integer.parseInt(prefs.getString( + "einkUpdateMode", "1")); + } catch (Exception e) { + einkUpdateMode = 1; + } + if (einkUpdateMode < -1 || einkUpdateMode > 2) + einkUpdateMode = 1; + if (einkUpdateMode >= 0) { + EinkScreen.UpdateMode = einkUpdateMode; + + Integer einkUpdateInterval; + try { + einkUpdateInterval = Integer.parseInt(prefs.getString( + "einkUpdateInterval", "10")); + } catch (Exception e) { + einkUpdateInterval = 10; + } + if (einkUpdateInterval < 0 || einkUpdateInterval > 100) + einkUpdateInterval = 10; + EinkScreen.UpdateModeInterval = einkUpdateInterval; + + PrepareController(null, false); + } + } + } } diff --git a/src/com/harasoft/relaunch/FiltersActivity.java b/src/com/harasoft/relaunch/FiltersActivity.java index 1bd920f..9c64c6a 100644 --- a/src/com/harasoft/relaunch/FiltersActivity.java +++ b/src/com/harasoft/relaunch/FiltersActivity.java @@ -43,8 +43,7 @@ public class myOnItemSelectedListener implements OnItemSelectedListener { public void onItemSelected(AdapterView parent, View v1, int pos, long row) { if (position >= 0 && position < itemsArray.size()) { - itemsArray.set(position, new String[] { Integer.toString(pos), - itemsArray.get(position)[1] }); + itemsArray.set(position, new String[] { Integer.toString(pos),itemsArray.get(position)[1] }); adapter.notifyDataSetChanged(); } } @@ -78,11 +77,9 @@ public View getView(final int position, View convertView, View v = vi.inflate(R.layout.filters_item, null); Spinner methodSpn = (Spinner) v.findViewById(R.id.filters_method); - ImageButton rmBtn = (ImageButton) v - .findViewById(R.id.filters_delete); + ImageButton rmBtn = (ImageButton) v.findViewById(R.id.filters_delete); Button valBtn = (Button) v.findViewById(R.id.filters_type); - TextView condTxt = (TextView) v - .findViewById(R.id.filters_condition); + TextView condTxt = (TextView) v.findViewById(R.id.filters_condition); final String[] item = itemsArray.get(position); if (item == null) @@ -93,10 +90,10 @@ public View getView(final int position, View convertView, try { spos = Integer.parseInt(item[0]); } catch (NumberFormatException e) { + // } - ArrayAdapter sadapter = ArrayAdapter - .createFromResource(cntx, R.array.filter_values, + ArrayAdapter sadapter = ArrayAdapter.createFromResource(cntx, R.array.filter_values, android.R.layout.simple_spinner_item); sadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); methodSpn.setAdapter(sadapter); @@ -113,45 +110,37 @@ public void onClick(View v) { }); // Set value button - if (spos == app.FLT_SELECT || spos == app.FLT_NEW - || spos == app.FLT_NEW_AND_READING) { + if (spos == app.FLT_SELECT) { valBtn.setText(""); valBtn.setEnabled(false); - } else { + }else if(spos == app.FLT_NEW|| spos == app.FLT_NEW_AND_READING){ + valBtn.setText(""); + valBtn.setEnabled(false); + itemsArray.set(position,new String[] { item[0]," " }); + adapter.notifyDataSetChanged(); + }else{ valBtn.setText(item[1]); valBtn.setEnabled(true); + valBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - AlertDialog.Builder builder = new AlertDialog.Builder( - cntx); + AlertDialog.Builder builder = new AlertDialog.Builder(cntx); // "Filter value:" - builder.setTitle(getResources().getString( - R.string.jv_filters_value)); + builder.setTitle(getResources().getString(R.string.jv_filters_value)); final EditText input = new EditText(cntx); input.setText(item[1]); builder.setView(input); - // "Ok" - builder.setPositiveButton( - getResources() - .getString(R.string.jv_filters_ok), + builder.setPositiveButton(getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { - String value = input.getText() - .toString(); + String value = input.getText().toString(); if (value.equals("")) // "Can't be empty!" - Toast.makeText( - cntx, - getResources() - .getString( - R.string.jv_filters_cant_be_empty), - Toast.LENGTH_LONG).show(); + Toast.makeText(cntx,getResources().getString(R.string.jv_filters_cant_be_empty),Toast.LENGTH_LONG).show(); else { - itemsArray.set(position, - new String[] { item[0], - value }); + itemsArray.set(position,new String[] { item[0],value }); adapter.notifyDataSetChanged(); dialog.dismiss(); } @@ -159,21 +148,16 @@ public void onClick(DialogInterface dialog, }); // "Cancel" - builder.setNegativeButton( - getResources().getString( - R.string.jv_filters_cancel), - new DialogInterface.OnClickListener() { + builder.setNegativeButton(getResources().getString(R.string.app_cancel),new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }); - builder.show(); } }); - } - + } // Set condition text if (position >= itemsArray.size() - 1) condTxt.setText(""); @@ -215,8 +199,7 @@ public void onClick(View v) { app.writeFile("filters", ReLaunch.FILT_FILE, 0, ":"); // Save and/or flag - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); SharedPreferences.Editor editor = prefs.edit(); editor.putBoolean("filtersAnd", app.filters_and); editor.commit(); diff --git a/src/com/harasoft/relaunch/Home.java b/src/com/harasoft/relaunch/Home.java index 66241a1..9a943b3 100644 --- a/src/com/harasoft/relaunch/Home.java +++ b/src/com/harasoft/relaunch/Home.java @@ -1,18 +1,41 @@ package com.harasoft.relaunch; +import java.util.Locale; + import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; +import android.preference.PreferenceManager; public class Home extends Activity { final String TAG = "Home"; ReLaunchApp app; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences preferences; + Locale locale; + String lang; + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + lang = preferences.getString("lang", "default"); + if (lang.equals("default")) { + locale = getResources().getConfiguration().locale.getDefault();} + else { + locale = new Locale(lang);} + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + + N2EpdController.n2MainActivity = this; + app = ((ReLaunchApp) getApplicationContext()); app.RestartIntent = PendingIntent.getActivity(this, 0, getIntent(), getIntent().getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/src/com/harasoft/relaunch/Home1.java b/src/com/harasoft/relaunch/Home1.java index e462d92..191d1f5 100644 --- a/src/com/harasoft/relaunch/Home1.java +++ b/src/com/harasoft/relaunch/Home1.java @@ -1,9 +1,14 @@ package com.harasoft.relaunch; +import java.util.Locale; + import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; +import android.preference.PreferenceManager; public class Home1 extends Activity { final String TAG = "Home"; @@ -13,6 +18,23 @@ public class Home1 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences preferences; + Locale locale; + String lang; + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + lang = preferences.getString("lang", "default"); + if (lang.equals("default")) { + locale=getResources().getConfiguration().locale.getDefault();} + else { + locale = new Locale(lang);} + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + + N2EpdController.n2MainActivity = this; + app = ((ReLaunchApp) getApplicationContext()); app.RestartIntent = PendingIntent.getActivity(this, 0, getIntent(), getIntent().getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/src/com/harasoft/relaunch/Library.java b/src/com/harasoft/relaunch/Library.java index fbeaf4c..c91b5e0 100644 --- a/src/com/harasoft/relaunch/Library.java +++ b/src/com/harasoft/relaunch/Library.java @@ -1,9 +1,14 @@ package com.harasoft.relaunch; +import java.util.Locale; + import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; +import android.preference.PreferenceManager; public class Library extends Activity { final String TAG = "Library"; @@ -13,9 +18,27 @@ public class Library extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences preferences; + Locale locale; + String lang; + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + lang = preferences.getString("lang", "default"); + if (lang.equals("default")) { + locale=getResources().getConfiguration().locale.getDefault();} + else { + locale = new Locale(lang);} + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + + N2EpdController.n2MainActivity = this; + app = ((ReLaunchApp) getApplicationContext()); app.RestartIntent = PendingIntent.getActivity(this, 0, getIntent(), getIntent().getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); + Intent intent = new Intent(Library.this, ReLaunch.class); intent.putExtra("home", false); diff --git a/src/com/harasoft/relaunch/ListActions.java b/src/com/harasoft/relaunch/ListActions.java index 1514cbb..3b5b7ba 100644 --- a/src/com/harasoft/relaunch/ListActions.java +++ b/src/com/harasoft/relaunch/ListActions.java @@ -1,12 +1,5 @@ package com.harasoft.relaunch; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import android.app.Activity; import android.app.AlertDialog; import android.content.ActivityNotFoundException; @@ -16,6 +9,8 @@ import android.preference.PreferenceManager; import android.widget.Toast; +import java.util.*; + public class ListActions { String TAG = "ListActions"; List> itemsArray = new ArrayList>(); @@ -103,15 +98,7 @@ public int compare(String a, String b) { exts = new ArrayList(tkeys); Collections.sort(exts, new ExtsComparator()); } - // known dirs - ArrayList dirs = new ArrayList(); - if (prefs.getBoolean("hideKnownDirs", false)) { - String[] home_dirs = prefs.getString("startDir", - "/sdcard,/media/My Files").split("\\,"); - for (int i = 0; i < home_dirs.length; i++) - dirs.add(home_dirs[i]); - Collections.sort(dirs, new ExtsComparator()); - } + final CharSequence[] lnames = new CharSequence[itemsArray.size()]; for (int i = 0; i < itemsArray.size(); i++) { HashMap item = itemsArray.get(i); @@ -149,7 +136,7 @@ public void onClick(DialogInterface dialog, int i) { dialog.dismiss(); } }); - builder.setNegativeButton(app.getResources().getString(R.string.jv_results_menu_button), + builder.setNegativeButton(app.getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { diff --git a/src/com/harasoft/relaunch/Main.java b/src/com/harasoft/relaunch/Main.java index 44aad42..fe6a9c6 100644 --- a/src/com/harasoft/relaunch/Main.java +++ b/src/com/harasoft/relaunch/Main.java @@ -3,16 +3,59 @@ import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; +import android.preference.PreferenceManager; + +import java.util.Locale; + +//import android.app.Application; public class Main extends Activity { final String TAG = "Main"; ReLaunchApp app; + private Locale locale; + + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences preferences; + String lang; + String tmp_startDir; + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + lang = preferences.getString("lang", "default"); + if (lang.equals("default")) { + locale = getResources().getConfiguration().locale.getDefault();} + else { + locale = new Locale(lang);} + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + + if(N2DeviceInfo.EINK_ONYX){ + tmp_startDir = preferences.getString("startDir", "/sdcard,/media/My Files"); + + if(tmp_startDir.equals("/sdcard,/media/My Files")){ + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("startDir","/mnt/storage"); + editor.commit(); + } + + tmp_startDir = preferences.getString("searchRoot", "/sdcard"); + if(tmp_startDir.equals("/sdcard")){ + SharedPreferences.Editor editor = preferences.edit(); + editor.putString("searchRoot","/mnt/storage"); + editor.commit(); + } + } + N2EpdController.n2MainActivity = this; + app = ((ReLaunchApp) getApplicationContext()); app.RestartIntent = PendingIntent.getActivity(this, 0, getIntent(), getIntent().getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); @@ -30,4 +73,15 @@ public void onCreate(Bundle savedInstanceState) { protected void onActivityResult(int requestCode, int resultCode, Intent data) { finish(); } + @Override + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + } + } diff --git a/src/com/harasoft/relaunch/N2EpdController.java b/src/com/harasoft/relaunch/N2EpdController.java index 56104b2..a1b149a 100644 --- a/src/com/harasoft/relaunch/N2EpdController.java +++ b/src/com/harasoft/relaunch/N2EpdController.java @@ -5,9 +5,10 @@ * http://http://sourceforge.net/projects/crengine/ */ -import java.lang.reflect.Method; -import java.lang.reflect.Constructor; +import android.app.Activity; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; /** * Nook Touch EPD controller interface wrapper. This class is created by * DairyKnight for Nook Touch screen support in FBReaderJ. @@ -42,25 +43,34 @@ public class N2EpdController { private static Method mtSetRegion = null; private static Constructor RegionParamsConstructor = null; + private static Constructor EpdControllerConstructors[] = null; + public static Activity n2MainActivity = null; + private static Object mEpdController = null; private static Object[] enumsWave = null; private static Object[] enumsRegion = null; private static Object[] enumsMode = null; static { - if (DeviceInfo.EINK_NOOK) { + if (N2DeviceInfo.EINK_NOOK) { try { Class clEpdController = Class .forName("android.hardware.EpdController"); - Class clEpdControllerWave = Class - .forName("android.hardware.EpdController$Wave"); + Class clEpdControllerWave; + if (N2DeviceInfo.EINK_NOOK_120) + clEpdControllerWave = Class.forName("android.hardware.EpdRegionParams$Wave"); + else + clEpdControllerWave = Class.forName("android.hardware.EpdController$Wave"); Class clEpdControllerMode = Class .forName("android.hardware.EpdController$Mode"); Class clEpdControllerRegion = Class .forName("android.hardware.EpdController$Region"); - Class clEpdControllerRegionParams = Class - .forName("android.hardware.EpdController$RegionParams"); + Class clEpdControllerRegionParams; + if (N2DeviceInfo.EINK_NOOK_120) + clEpdControllerRegionParams = Class.forName("android.hardware.EpdRegionParams"); + else + clEpdControllerRegionParams = Class.forName("android.hardware.EpdController$RegionParams"); enumsWave = clEpdControllerWave.getEnumConstants(); @@ -68,9 +78,6 @@ public class N2EpdController { enumsRegion = clEpdControllerRegion.getEnumConstants(); - // mtSetRegion = clEpdController.getMethod("setRegion", - // String.class, clEpdControllerRegion, View.class, - // clEpdControllerWave, clEpdControllerMode); RegionParamsConstructor = clEpdControllerRegionParams .getConstructor(new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, @@ -78,7 +85,8 @@ public class N2EpdController { mtSetRegion = clEpdController.getMethod("setRegion", String.class, clEpdControllerRegion, clEpdControllerRegionParams, clEpdControllerMode); - + if (N2DeviceInfo.EINK_NOOK_120) + EpdControllerConstructors = clEpdController.getConstructors(); strN2EpdInit += "Ok!"; } catch (Exception e) { System.err.println("Failed to init refresh EPD"); @@ -89,17 +97,15 @@ public class N2EpdController { } } - // public static void setMode(int region, int wave, int mode, View view) { public static void setMode(int region, int wave, int mode) { if (mtSetRegion != null) { try { + if (N2DeviceInfo.EINK_NOOK_120 && mEpdController == null) + mEpdController = EpdControllerConstructors[0].newInstance(new Object[] { n2MainActivity }); Object regionParams = RegionParamsConstructor .newInstance(new Object[] { 0, 0, 600, 800, enumsWave[wave] }); - // mtSetRegion.invoke(null, "CoolReader", enumsRegion[region], - // view, enumsWave[wave], enumsMode[mode]); - mtSetRegion.invoke(null, "ReLaunch", enumsRegion[region], - regionParams, enumsMode[mode]); + mtSetRegion.invoke(mEpdController, "ReLaunch", enumsRegion[region], regionParams, enumsMode[mode]); } catch (Exception e) { System.err.println("Failed: SetMode"); System.err.println(e.toString()); diff --git a/src/com/harasoft/relaunch/PowerFunctions.java b/src/com/harasoft/relaunch/PowerFunctions.java index 544ce7d..45e2623 100644 --- a/src/com/harasoft/relaunch/PowerFunctions.java +++ b/src/com/harasoft/relaunch/PowerFunctions.java @@ -58,7 +58,7 @@ public static void actionReboot(Activity act) { // "YES" final Activity fact = act; builder.setPositiveButton( - act.getResources().getString(R.string.jv_advanced_yes), + act.getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -88,7 +88,7 @@ public void run() { }); // "NO" builder.setNegativeButton( - act.getResources().getString(R.string.jv_advanced_no), + act.getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -118,7 +118,7 @@ public static void actionPowerOff(Activity act) { // "YES" final Activity fact = act; builder.setPositiveButton( - act.getResources().getString(R.string.jv_advanced_yes), + act.getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -148,7 +148,7 @@ public void run() { }); // "NO" builder.setNegativeButton( - act.getResources().getString(R.string.jv_advanced_no), + act.getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { diff --git a/src/com/harasoft/relaunch/PrefsActivity.java b/src/com/harasoft/relaunch/PrefsActivity.java index 56c691f..323ece4 100644 --- a/src/com/harasoft/relaunch/PrefsActivity.java +++ b/src/com/harasoft/relaunch/PrefsActivity.java @@ -1,11 +1,5 @@ package com.harasoft.relaunch; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import android.R.integer; import android.app.Activity; import android.app.AlarmManager; import android.app.AlertDialog; @@ -15,24 +9,19 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.Preference; -import android.preference.PreferenceActivity; -import android.preference.PreferenceCategory; -import android.preference.PreferenceManager; -import android.preference.PreferenceScreen; +import android.os.SystemClock; +import android.preference.*; import android.text.InputType; -import android.view.LayoutInflater; -import android.view.View; +import android.util.Log; +import android.view.*; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ImageButton; -import android.widget.ListAdapter; import android.widget.ListView; -import android.os.SystemClock; -import android.view.MotionEvent; + +import java.util.List; +import java.util.Map; +import java.util.Set; public class PrefsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { @@ -226,23 +215,21 @@ private void initSummary(Preference p) { @Override protected void onCreate(Bundle savedInstanceState) { - app = ((ReLaunchApp) getApplicationContext()); -// app.setFullScreenIfNecessary(this); + app.setFullScreenIfNecessary(this); applicationsArray = app.getApps(); - applications = applicationsArray - .toArray(new CharSequence[applicationsArray.size()]); - happlications = app.getApps().toArray( - new CharSequence[app.getApps().size()]); + applications = applicationsArray.toArray(new CharSequence[applicationsArray.size()]); + happlications = app.getApps().toArray(new CharSequence[app.getApps().size()]); for (int j = 0; j < happlications.length; j++) { String happ = (String) happlications[j]; String[] happp = happ.split("\\%"); happlications[j] = happp[2]; } - prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.prefs); setContentView(R.layout.prefs_main); @@ -252,8 +239,9 @@ protected void onCreate(Bundle savedInstanceState) { for (int i = 0; i < prefAdvancedScreen.getPreferenceCount(); i++) { Preference p = prefAdvancedScreen.getPreference(i); - if (p instanceof PreferenceScreen) + if (p instanceof PreferenceScreen){ p.setOnPreferenceClickListener(prefScreenListener); + } } // Save items value @@ -273,7 +261,7 @@ public boolean onPreferenceClick(Preference pref) { builder.setMessage(getResources().getString( R.string.jv_prefs_cleanup_database_text)); builder.setPositiveButton( - getResources().getString(R.string.jv_prefs_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -283,7 +271,7 @@ public void onClick(DialogInterface dialog, }); builder.setNegativeButton( getResources().getString( - R.string.jv_relaunch_no), + R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -305,7 +293,7 @@ public boolean onPreferenceClick(Preference pref) { builder.setMessage(getResources().getString( R.string.jv_prefs_clear_lru_text)); builder.setPositiveButton( - getResources().getString(R.string.jv_prefs_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -315,7 +303,7 @@ public void onClick(DialogInterface dialog, }); builder.setNegativeButton( getResources().getString( - R.string.jv_relaunch_no), + R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -337,7 +325,7 @@ public boolean onPreferenceClick(Preference pref) { builder.setMessage(getResources().getString( R.string.jv_prefs_clear_favorites_text)); builder.setPositiveButton( - getResources().getString(R.string.jv_prefs_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -347,7 +335,7 @@ public void onClick(DialogInterface dialog, }); builder.setNegativeButton( getResources().getString( - R.string.jv_relaunch_no), + R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -392,7 +380,7 @@ public boolean onPreferenceClick(Preference pref) { R.string.jv_prefs_default_settings_text)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_prefs_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -406,7 +394,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_prefs_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -422,7 +410,7 @@ public void onClick(DialogInterface dialog, new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference pref) { boolean ret = app.copyPrefs(app.DATA_DIR, - app.BACKUP_DIR); + ReLaunch.BACKUP_DIR); AlertDialog.Builder builder = new AlertDialog.Builder( context); if (ret) { @@ -437,7 +425,7 @@ public boolean onPreferenceClick(Preference pref) { R.string.jv_prefs_rsr_fail_text)); } builder.setNeutralButton( - getResources().getString(R.string.jv_prefs_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -452,7 +440,7 @@ public void onClick(DialogInterface dialog, findPreference("loadSettings").setOnPreferenceClickListener( new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference pref) { - boolean ret = app.copyPrefs(app.BACKUP_DIR, + boolean ret = app.copyPrefs(ReLaunch.BACKUP_DIR, app.DATA_DIR); AlertDialog.Builder builder = new AlertDialog.Builder( context); @@ -468,7 +456,7 @@ public boolean onPreferenceClick(Preference pref) { R.string.jv_prefs_rsr_fail_text)); } builder.setNeutralButton( - getResources().getString(R.string.jv_prefs_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -500,7 +488,7 @@ public boolean onPreferenceClick(Preference pref) { // final Activity pact = this; // back button - work as cancel - ((ImageButton) findViewById(R.id.back_btn)) + ( findViewById(R.id.back_btn)) .setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (isPreferencesChanged()) { @@ -515,7 +503,7 @@ public void onClick(View v) { // "Yes" builder.setPositiveButton( getResources().getString( - R.string.jv_prefs_yes), + R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -530,7 +518,7 @@ public void onClick( // "No" builder.setNegativeButton( getResources().getString( - R.string.jv_prefs_cancel), + R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -541,7 +529,7 @@ public void onClick( // "Cancel" builder.setNeutralButton( getResources().getString( - R.string.jv_prefs_no), + R.string.app_no), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -558,85 +546,6 @@ public void onClick( } }); - ImageButton upScroll = (ImageButton) findViewById(R.id.btn_scrollup); - upScroll.setOnClickListener(new View.OnClickListener() { - - public void onClick(View v) { - if (DeviceInfo.EINK_NOOK) { - MotionEvent ev; - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_DOWN, 200, 100, 0); - getListView().dispatchTouchEvent(ev); - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis() + 100, - MotionEvent.ACTION_MOVE, 200, 200, 0); - getListView().dispatchTouchEvent(ev); - SystemClock.sleep(100); - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, - 200, 200, 0); - getListView().dispatchTouchEvent(ev); - } else { - final ListView lv = (ListView) getListView(); - int first = lv.getFirstVisiblePosition(); - int visible = lv.getLastVisiblePosition() - - lv.getFirstVisiblePosition() + 1; - first -= visible; - if (first < 0) - first = 0; - final int finfirst = first; - lv.clearFocus(); - lv.post(new Runnable() { - - public void run() { - lv.setSelection(finfirst); - } - }); - } - } - }); - - ImageButton downScroll = (ImageButton) findViewById(R.id.btn_scrolldown); - downScroll.setOnClickListener(new View.OnClickListener() { - - public void onClick(View v) { - if (DeviceInfo.EINK_NOOK) { - MotionEvent ev; - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), - MotionEvent.ACTION_DOWN, 200, 200, 0); - getListView().dispatchTouchEvent(ev); - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis() + 100, - MotionEvent.ACTION_MOVE, 200, 100, 0); - getListView().dispatchTouchEvent(ev); - SystemClock.sleep(100); - ev = MotionEvent.obtain(SystemClock.uptimeMillis(), - SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, - 200, 100, 0); - getListView().dispatchTouchEvent(ev); - } else { - final ListView lv = (ListView) getListView(); - int total = lv.getCount(); - int last = lv.getLastVisiblePosition(); - if (total == last + 1) - return; - int target = last + 1; - if (target > (total - 1)) - target = total - 1; - final int ftarget = target; - lv.clearFocus(); - lv.post(new Runnable() { - public void run() { - lv.setSelection(ftarget); - } - }); - } - - } - }); - for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) { initSummary(getPreferenceScreen().getPreference(i)); } @@ -810,7 +719,7 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, builder1.setView(input); // "OK" builder1.setPositiveButton( - getResources().getString(R.string.jv_prefs_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -865,6 +774,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("homeButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("homeButtonLT")) { if (sharedPreferences.getString(key, "OPENSCREEN").equals( @@ -900,6 +810,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("homeButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); } // LRU if (key.equals("lruButtonST")) { @@ -917,7 +828,7 @@ public void onClick(DialogInterface dialog, builder1.setView(input); // "OK" builder1.setPositiveButton( - getResources().getString(R.string.jv_prefs_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -971,6 +882,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("lruButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("lruButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("OPENN")) { @@ -1005,6 +917,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("lruButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); } // FAV if (key.equals("favButtonST")) { @@ -1022,7 +935,7 @@ public void onClick(DialogInterface dialog, builder1.setView(input); // "OK" builder1.setPositiveButton( - getResources().getString(R.string.jv_prefs_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1076,6 +989,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("favButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("favButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("OPENN")) { @@ -1110,6 +1024,7 @@ public void onClick(DialogInterface dialog, imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); builder1.show(); } + checkSetDropboxAndOpds("favButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("settingsButtonST")) { if (sharedPreferences.getString(key, "RELAUNCH").equals("RUN")) { @@ -1156,6 +1071,7 @@ public void onClick(DialogInterface dialog, }); builder.show(); } + checkSetDropboxAndOpds("settingsButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("settingsButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("RUN")) { @@ -1179,6 +1095,7 @@ public void onClick(DialogInterface dialog, }); builder.show(); } + checkSetDropboxAndOpds("settingsButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); } if (key.equals("advancedButtonST")) { if (sharedPreferences.getString(key, "RELAUNCH").equals("RUN")) { @@ -1225,7 +1142,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("advancedButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("advancedButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1248,7 +1167,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("advancedButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("memButtonST")) { if (sharedPreferences.getString(key, "RELAUNCH").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1294,7 +1215,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("memButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("memButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1317,7 +1240,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("memButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("batButtonST")) { if (sharedPreferences.getString(key, "RELAUNCH").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1363,7 +1288,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("batButtonDT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("batButtonLT")) { if (sharedPreferences.getString(key, "NOTHING").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1386,7 +1313,9 @@ public void onClick(DialogInterface dialog, }); builder.show(); } - } + checkSetDropboxAndOpds("batButtonLT", sharedPreferences.getString(key, "none"), sharedPreferences); + + } if (key.equals("appFavButtonST")) { if (sharedPreferences.getString(key, "RELAUNCH").equals("RUN")) { AlertDialog.Builder builder = new AlertDialog.Builder( @@ -1456,23 +1385,32 @@ public void onClick(DialogInterface dialog, builder.show(); } } - + if (key.equals("dropboxSetButton")) { + checkSetDropboxAndOpds("dropboxSetButton", sharedPreferences.getString(key, "none"), sharedPreferences); + + } + if (key.equals("opdsSetButton")) { + checkSetDropboxAndOpds("opdsSetButton", sharedPreferences.getString(key, "none"), sharedPreferences); + + } } } public Preference.OnPreferenceClickListener prefScreenListener = new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference pref) { - final PreferenceScreen prefScreen = (PreferenceScreen) pref; - LayoutInflater inflater = (LayoutInflater) getApplicationContext() - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + final PreferenceScreen prefScreen = (PreferenceScreen) pref; + + prefScreen.getDialog().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); final View prefView = inflater.inflate(R.layout.prefs_main, null); + prefScreen.getDialog().setContentView(prefView); - final ListView prefListView = (ListView) prefView - .findViewById(android.R.id.list); + + final ListView prefListView = (ListView) prefView.findViewById(android.R.id.list); prefScreen.bind(prefListView); - EditText tEdit = (EditText) prefView - .findViewById(R.id.prefernces_title); + EditText tEdit = (EditText) prefView.findViewById(R.id.prefernces_title); tEdit.setText(pref.getTitle()); ImageButton b = (ImageButton) prefView.findViewById(R.id.back_btn); @@ -1482,12 +1420,11 @@ public void onClick(View v) { } }); - ImageButton bu = (ImageButton) prefView - .findViewById(R.id.btn_scrollup); + ImageButton bu = (ImageButton) prefView.findViewById(R.id.btn_scrollup); bu.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - if (DeviceInfo.EINK_NOOK) { + if (N2DeviceInfo.EINK_NOOK) { MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -1526,7 +1463,7 @@ public void run() { bd.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - if (DeviceInfo.EINK_NOOK) { + if (N2DeviceInfo.EINK_NOOK) { MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -1613,4 +1550,93 @@ private boolean isEqual(Object o1, Object o2) { return equal; } + private void checkSetDropboxAndOpds(String button, String key, SharedPreferences sharedPreferences) { + String[] buttonName = {"none","homeButtonDT", "homeButtonLT", "lruButtonDT", "lruButtonLT", "favButtonDT", "favButtonLT", "settingsButtonDT", "settingsButtonLT", + "advancedButtonDT", "advancedButtonLT", "memButtonDT", "memButtonLT", "batButtonDT", "batButtonLT"}; + + boolean newOPDS = false; + boolean newDropbox = false; + SharedPreferences.Editor editor = prefs.edit(); + + if("OPDS".equals(key)){ + newOPDS = true; + } + if("DROPBOX".equals(key)){ + newDropbox = true; + } + if(!"dropboxSetButton".equals(button) && !"opdsSetButton".equals(button)){ + // действия при выборе из меню кнопок экрана + do_pref_subrequest = false; + if(button.equals(((ListPreference) findPreference("dropboxSetButton")).getValue())){ + if(!key.equals("DROPBOX")){ + ((ListPreference) findPreference("dropboxSetButton")).setValueIndex(0); + editor.putString("dropboxSetButton", "NOTHING"); + } + } + if(button.equals(((ListPreference) findPreference("opdsSetButton")).getValue())){ + if(!key.equals("OPDS")){ + ((ListPreference) findPreference("opdsSetButton")).setValueIndex(0); + editor.putString("opdsSetButton", "NOTHING"); + } + } + + // если новые настройки + if(newDropbox || newOPDS){ + //сбрасываем на всех остальных настройки + for (int i = 1, j=buttonName.length; i < j; i++) { + if(!buttonName[i].equals(button)){ + // сбрасываем настройки если совпадают с проверяемыми + if(sharedPreferences.getString(buttonName[i], "none").equals(key)){ + ((ListPreference) findPreference(buttonName[i])).setValueIndex(0); + editor.putString(buttonName[i], "NOTHING"); + } + }else{ // сохраняем настройки в модулях + if(newOPDS){ + ((ListPreference) findPreference("opdsSetButton")).setValueIndex(i); + editor.putString("opdsSetButton",buttonName[i]); + } + if(newDropbox){ + ((ListPreference) findPreference("dropboxSetButton")).setValueIndex(i); + editor.putString("dropboxSetButton",buttonName[i]); + } + } + } + } + editor.commit(); + do_pref_subrequest = true; + }else { + // действия при выборе в самих настройках модулей + do_pref_subrequest = false; + int indexValue = 0; + if("dropboxSetButton".equals(button)){ + indexValue = ((ListPreference) findPreference(key)).findIndexOfValue("DROPBOX"); + editor.putString(key, "DROPBOX"); + button = key; + key = "DROPBOX"; + } + if("opdsSetButton".equals(button)){ + indexValue = ((ListPreference) findPreference(key)).findIndexOfValue("OPDS"); + editor.putString(key, "OPDS"); + button = key; + key = "OPDS"; + } + //сбрасываем на всех остальных настройки + if("OPDS".equals(key) || "DROPBOX".equals(key)){ + for (int i = 1, j=buttonName.length; i < j; i++) { + if(!buttonName[i].equals(button)){ + // сбрасываем настройки если совпадают с проверяемыми + if(sharedPreferences.getString(buttonName[i], "none").equals(key)){ + ((ListPreference) findPreference(buttonName[i])).setValueIndex(0); + editor.putString(buttonName[i], "NOTHING"); + } + } + } + ((ListPreference) findPreference(button)).setValueIndex(indexValue); + editor.commit(); + } + do_pref_subrequest = true; + } + + } + } diff --git a/src/com/harasoft/relaunch/ReLaunch.java b/src/com/harasoft/relaunch/ReLaunch.java index 110ca32..b5a9148 100644 --- a/src/com/harasoft/relaunch/ReLaunch.java +++ b/src/com/harasoft/relaunch/ReLaunch.java @@ -1,39 +1,8 @@ package com.harasoft.relaunch; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.Stack; - -import ebook.EBook; -import ebook.parser.InstantParser; -import ebook.parser.Parser; -import android.R.style; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.AlertDialog; +import android.app.*; import android.app.ActivityManager.MemoryInfo; -import android.app.Dialog; -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.content.SharedPreferences; +import android.content.*; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; @@ -52,38 +21,23 @@ import android.text.SpannableString; import android.text.TextUtils.TruncateAt; import android.text.style.StyleSpan; -import android.util.Log; import android.util.TypedValue; -import android.view.GestureDetector; +import android.view.*; import android.view.GestureDetector.SimpleOnGestureListener; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; import android.view.View.MeasureSpec; import android.view.View.OnTouchListener; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.webkit.WebView; -import android.widget.AdapterView; -import android.view.LayoutInflater; -import android.widget.AbsListView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.GridView; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; +import android.widget.*; import android.widget.LinearLayout.LayoutParams; -import android.widget.ListAdapter; -import android.widget.SimpleAdapter; -import android.widget.TextView; -import android.widget.Toast; +import com.dropbox.client2.DropboxAPI; +import com.dropbox.client2.android.AndroidAuthSession; +import com.dropbox.client2.exception.DropboxException; +import ebook.EBook; +import ebook.parser.InstantParser; +import ebook.parser.Parser; + +import java.io.*; +import java.util.*; public class ReLaunch extends Activity { @@ -120,20 +74,23 @@ public class ReLaunch extends Activity { final static int CNTXT_MENU_RENAME = 14; final static int CNTXT_MENU_CREATE_DIR = 15; final static int CNTXT_MENU_COPY_DIR = 16; - final static int CNTXT_MENU_MOVE_DIR = 17; + //final static int CNTXT_MENU_MOVE_DIR = 17; final static int CNTXT_MENU_SWITCH_TITLES = 18; final static int CNTXT_MENU_TAGS_RENAME = 19; final static int CNTXT_MENU_ADD_STARTDIR = 20; final static int CNTXT_MENU_SHOW_BOOKINFO = 21; final static int CNTXT_MENU_FILE_INFO = 22; final static int CNTXT_MENU_SET_STARTDIR = 23; - final static int BROWSE_FILES = 0; - final static int BROWSE_TITLES = 1; - final static int BROWSE_COVERS = 2; + final static int CNTXT_MENU_COPY_DROPBOX = 24; + final static int CNTXT_MENU_COPY_DIR_DROPBOX = 25; + //final static int BROWSE_FILES = 0; + //final static int BROWSE_TITLES = 1; + //final static int BROWSE_COVERS = 2; final static int SORT_FILES_ASC = 0; final static int SORT_FILES_DESC = 1; final static int SORT_TITLES_ASC = 2; final static int SORT_TITLES_DESC = 3; + public static String BACKUP_DIR = "/sdcard/.relaunch"; String currentRoot = "/sdcard"; Integer currentPosition = -1; List> itemsArray; @@ -155,7 +112,7 @@ public class ReLaunch extends Activity { boolean addSView = true; // multicolumns per directory configuration - List columnsArray = new ArrayList(); + //List columnsArray = new ArrayList(); Integer currentColsNum = -1; // Bottom info panel @@ -255,40 +212,12 @@ private void actionRun(String appspec) { } } - private void setEinkController() { - if (prefs != null) { - Integer einkUpdateMode = 1; - try { - einkUpdateMode = Integer.parseInt(prefs.getString( - "einkUpdateMode", "1")); - } catch (Exception e) { - einkUpdateMode = 1; - } - if (einkUpdateMode < -1 || einkUpdateMode > 2) - einkUpdateMode = 1; - if (einkUpdateMode >= 0) { - EinkScreen.UpdateMode = einkUpdateMode; - Integer einkUpdateInterval = 10; - try { - einkUpdateInterval = Integer.parseInt(prefs.getString( - "einkUpdateInterval", "10")); - } catch (Exception e) { - einkUpdateInterval = 10; - } - if (einkUpdateInterval < 0 || einkUpdateInterval > 100) - einkUpdateInterval = 10; - EinkScreen.UpdateModeInterval = einkUpdateInterval; - - EinkScreen.PrepareController(null, false); - } - } - } private boolean checkField(String[] a, String f) { - for (int i = 0; i < a.length; i++) - if (a[i].equals("*") || a[i].equals(f)) - return true; + for (String anA : a) + if (anA.equals("*") || anA.equals(f)) + return true; return false; } @@ -315,7 +244,7 @@ private void checkDevice(String dev, String man, String model, builder.setView(wv); // "YES" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -327,7 +256,7 @@ public void onClick(DialogInterface dialog, }); // "NO" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -403,12 +332,12 @@ public View getView(int position, View convertView, ViewGroup parent) { if (prefs.getBoolean("hideKnownExts", false)) { rc = app.getReaders(); Set tkeys = new HashSet(); - for (int i = 0; i < rc.size(); i++) { - Object[] keys = rc.get(i).keySet().toArray(); - for (int j = 0; j < keys.length; j++) { - tkeys.add(keys[j].toString()); - } - } + for (HashMap aRc : rc) { + Object[] keys = aRc.keySet().toArray(); + for (Object key : keys) { + tkeys.add(key.toString()); + } + } exts = new ArrayList(tkeys); final class ExtsComparator implements java.util.Comparator { @@ -471,9 +400,7 @@ public int compare(String a, String b) { .equals("0")) { iv.setVisibility(View.GONE); } else { - iv.setImageBitmap(scaleDrawableById(R.drawable.dir_ok, - Integer.parseInt(prefs.getString( - "firstLineIconSizePx", "48")))); + iv.setImageBitmap(scaleDrawableById(R.drawable.dir_ok,Integer.parseInt(prefs.getString("firstLineIconSizePx", "48")))); } } else { if (useFaces) { @@ -639,10 +566,10 @@ private Integer getAutoColsNum() { Integer auto_cols_num = 1; ArrayList tmp = new ArrayList(); if (itemsArray.size() > 0) { - Integer factor = 0; - for (Integer i = 0; i < itemsArray.size(); i++) { - tmp.add(itemsArray.get(i).get("sname").length()); - } + Integer factor ; + for (HashMap anItemsArray : itemsArray) { + tmp.add(anItemsArray.get("sname").length()); + } String pattern = prefs.getString("columnsAlgIntensity", "70 3:5 7:4 15:3 48:2"); // default - medium String[] spat = pattern.split("[\\s\\:]+"); @@ -666,7 +593,7 @@ private Integer getAutoColsNum() { } private void redrawList() { - setEinkController(); + EinkScreen.PrepareController(null, false); GridView gv = (GridView) findViewById(useDirViewer ? R.id.results_list : R.id.gl_list); if (prefs.getBoolean("filterResults", false)) { @@ -751,13 +678,13 @@ private void setUpButton(final Button up, final String upDir, String currDir) { enabled = false; String[] homes = prefs.getString("startDir", "/sdcard,/media/My Files").split("\\,"); - for (int i = 0; i < homes.length; i++) { - if (homes[i].length() < currDir.length() - && currDir.startsWith(homes[i])) { - enabled = true; - break; - } - } + for (String home : homes) { + if (home.length() < currDir.length() + && currDir.startsWith(home)) { + enabled = true; + break; + } + } } up.setEnabled(enabled); // gesture listener @@ -772,20 +699,8 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } return true; } - - @Override - public boolean onDoubleTap(MotionEvent e) { - return true; - } - - @Override - public void onLongPress(MotionEvent e) { - if (up.hasWindowFocus()) { - - } - } } - ; + UpSimpleOnGestureListener up_gl = new UpSimpleOnGestureListener(); final GestureDetector up_gd = new GestureDetector(up_gl); up.setOnTouchListener(new OnTouchListener() { @@ -903,7 +818,7 @@ else if (level < 75) null, null); } } catch (IllegalArgumentException e) { - Log.v("ReLaunch", "Battery intent illegal arguments"); + //Log.v("ReLaunch", "Battery intent illegal arguments"); } } @@ -921,7 +836,7 @@ private void drawDirectory(String root, Integer startPosition) { List files = new ArrayList(); List dirs = new ArrayList(); - setEinkController(); + EinkScreen.PrepareController(null, false); currentRoot = root; currentPosition = (startPosition == -1) ? 0 : startPosition; @@ -996,7 +911,7 @@ public void onLongPress(MotionEvent e) { menuSort(); } } - ; + TvSimpleOnGestureListener tv_gl = new TvSimpleOnGestureListener(); final GestureDetector tv_gd = new GestureDetector(tv_gl); tv.setOnTouchListener(new OnTouchListener() { @@ -1078,7 +993,7 @@ public void onLongPress(MotionEvent e) { } } } - ; + advSimpleOnGestureListener adv_gl = new advSimpleOnGestureListener(); final GestureDetector adv_gd = new GestureDetector(adv_gl); adv.setOnTouchListener(new OnTouchListener() { @@ -1154,7 +1069,7 @@ else if (!prefs.getBoolean("filterResults", false) gv.setAdapter(adapter); gv.setHorizontalSpacing(0); - Integer colsNum = -1; + Integer colsNum; if (getDirectoryColumns(currentRoot) != 0) { colsNum = getDirectoryColumns(currentRoot); } else { @@ -1190,8 +1105,9 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + + EinkScreen.PrepareController(null, false); + sv.invalidate(); } public void onScrollStateChanged(AbsListView view, @@ -1204,7 +1120,7 @@ public void onScrollStateChanged(AbsListView view, gv.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -1328,12 +1244,12 @@ public boolean onDoubleTap(MotionEvent e) { public void onLongPress(MotionEvent e) { if (!ReLaunch.this.hasWindowFocus()) return; - int menuType = 0; + int menuType; int position = findViewByXY(e); HashMap item; String fn = null; String dr = null; - String tp = null; + String tp; String fullName = null; ArrayList aList = new ArrayList(10); if (position == -1) @@ -1344,7 +1260,7 @@ public void onLongPress(MotionEvent e) { dr = item.get("dname"); tp = item.get("type"); fullName = dr + "/" + fn; - if (tp == "dir") + if (tp.equals("dir")) menuType = 1; else if (fn.endsWith("fb2") || fn.endsWith("fb2.zip") || fn.endsWith("epub")) menuType = 2; @@ -1371,6 +1287,7 @@ else if (fn.endsWith("fb2") || fn.endsWith("fb2.zip") || fn.endsWith("epub")) aList.add(getString(R.string.jv_relaunch_create_folder)); aList.add(getString(R.string.jv_relaunch_rename)); aList.add(getString(R.string.jv_relaunch_move)); + aList.add(getString(R.string.jv_relaunch_copy_dir)); if (fileOp != 0) { aList.add(getString(R.string.jv_relaunch_paste)); } @@ -1443,7 +1360,11 @@ else if (fn.endsWith("fb2") || fn.endsWith("fb2.zip") || fn.endsWith("epub")) } aList.add(getString(R.string.jv_relaunch_fileinfo)); } - aList.add(getString(R.string.jv_relaunch_cancel)); + if(menuType > 0){ + aList.add(getString(R.string.jv_relaunch_add_Dropbox)); + aList.add(getString(R.string.jv_relaunch_add_dir_Dropbox)); + } + aList.add(getString(R.string.app_cancel)); final int pos = position; final String[] list = aList.toArray(new String[aList.size()]); @@ -1454,7 +1375,7 @@ else if (fn.endsWith("fb2") || fn.endsWith("fb2.zip") || fn.endsWith("epub")) builder.setAdapter(cmAdapter, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { String s = list[item]; - if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_cancel))) + if (s.equalsIgnoreCase(getString(R.string.app_cancel))) onContextMenuSelected(CNTXT_MENU_CANCEL, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_delete))) onContextMenuSelected(CNTXT_MENU_DELETE_F, pos); @@ -1476,6 +1397,8 @@ else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_openwith))) onContextMenuSelected(CNTXT_MENU_OPENWITH, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_copy))) onContextMenuSelected(CNTXT_MENU_COPY_FILE, pos); + else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_copy_dir))) + onContextMenuSelected(CNTXT_MENU_COPY_DIR, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_move))) onContextMenuSelected(CNTXT_MENU_MOVE_FILE, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_paste))) @@ -1484,8 +1407,6 @@ else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_rename))) onContextMenuSelected(CNTXT_MENU_RENAME, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_create_folder))) onContextMenuSelected(CNTXT_MENU_CREATE_DIR, pos); - else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_move_dir))) - onContextMenuSelected(CNTXT_MENU_MOVE_DIR, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_tags_rename))) onContextMenuSelected(CNTXT_MENU_TAGS_RENAME, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_set_startdir))) @@ -1496,13 +1417,17 @@ else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_bookinfo))) onContextMenuSelected(CNTXT_MENU_SHOW_BOOKINFO, pos); else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_fileinfo))) onContextMenuSelected(CNTXT_MENU_FILE_INFO, pos); + else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_add_Dropbox))) + onContextMenuSelected(CNTXT_MENU_COPY_DROPBOX, pos); + else if (s.equalsIgnoreCase(getString(R.string.jv_relaunch_add_dir_Dropbox))) + onContextMenuSelected(CNTXT_MENU_COPY_DIR_DROPBOX, pos); } }); AlertDialog alert = builder.create(); alert.requestWindowFeature(Window.FEATURE_NO_TITLE); alert.show(); } - }; + } GlSimpleOnGestureListener gv_gl = new GlSimpleOnGestureListener(this); final GestureDetector gv_gd = new GestureDetector(gv_gl); @@ -1523,7 +1448,7 @@ public boolean onTouch(View v, MotionEvent event) { class upScrlSimpleOnGestureListener extends SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { - if (DeviceInfo.EINK_NOOK) { // nook + if (N2DeviceInfo.EINK_NOOK) { // nook MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -1592,7 +1517,7 @@ public void onLongPress(MotionEvent e) { } } } - ; + upScrlSimpleOnGestureListener upscrl_gl = new upScrlSimpleOnGestureListener(); final GestureDetector upscrl_gd = new GestureDetector(upscrl_gl); upScroll.setOnTouchListener(new OnTouchListener() { @@ -1640,7 +1565,7 @@ public void run() { class dnScrlSimpleOnGestureListener extends SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { - if (DeviceInfo.EINK_NOOK) { // nook special + if (N2DeviceInfo.EINK_NOOK) { // nook special MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -1706,7 +1631,7 @@ public void onLongPress(MotionEvent e) { } } } - ; + dnScrlSimpleOnGestureListener dnscrl_gl = new dnScrlSimpleOnGestureListener(); final GestureDetector dnscrl_gd = new GestureDetector(dnscrl_gl); downScroll.setOnTouchListener(new OnTouchListener() { @@ -1779,8 +1704,8 @@ static public List createAppList(PackageManager pm) { componentSearchIntent.setAction(Intent.ACTION_MAIN); List ril = pm.queryIntentActivities(componentSearchIntent, 0); - String pname = ""; - String aname = ""; + String pname; + String aname ; String hname = ""; for (ResolveInfo ri : ril) { if (ri.activityInfo != null) { @@ -1845,7 +1770,10 @@ public void onReceive(Context context, Intent intent) { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + if(N2DeviceInfo.EINK_ONYX){ + currentRoot = "/mnt/storage"; + BACKUP_DIR = "/mnt/storage/.relaunch"; + } // If we called from Home launcher? final Intent data = getIntent(); if (data.getExtras() == null) { @@ -1882,7 +1810,6 @@ public void onCreate(Bundle savedInstanceState) { app.FLT_NEW_AND_READING = getResources().getInteger( R.integer.FLT_NEW_AND_READING); - // Preferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); if (prefs.getString("startMode", "UNKNOWN").equalsIgnoreCase("LAUNCHER")) useHome = true; @@ -1949,7 +1876,7 @@ else if (r[1].equals("FINISHED")) setContentView(R.layout.results_layout); if (data.getExtras() != null) start_dir = data.getStringExtra("start_dir"); - ((ImageButton) findViewById(R.id.results_btn)) + (findViewById(R.id.results_btn)) .setOnClickListener(new View.OnClickListener() { public void onClick(View v) { finish(); @@ -1983,19 +1910,8 @@ public boolean onSingleTapConfirmed(MotionEvent e) { startActivity(intent); return true; } - - @Override - public boolean onDoubleTap(MotionEvent e) { - return true; - } - - @Override - public void onLongPress(MotionEvent e) { - if (lrua_button.hasWindowFocus()) { - } - } } - ; + LruaSimpleOnGestureListener lrua_gl = new LruaSimpleOnGestureListener(); final GestureDetector lrua_gd = new GestureDetector(lrua_gl); lrua_button.setOnTouchListener(new OnTouchListener() { @@ -2021,19 +1937,8 @@ public boolean onSingleTapConfirmed(MotionEvent e) { return true; } - @Override - public boolean onDoubleTap(MotionEvent e) { - return true; - } - - @Override - public void onLongPress(MotionEvent e) { - if (alla_button.hasWindowFocus()) { - - } - } } - ; + AllaSimpleOnGestureListener alla_gl = new AllaSimpleOnGestureListener(); final GestureDetector alla_gd = new GestureDetector(alla_gl); alla_button.setOnTouchListener(new OnTouchListener() { @@ -2103,7 +2008,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } else if (prefs.getString("homeButtonST", "OPENN") .equals("OPENSCREEN")) { screenHome(); - } + } else if (prefs.getString("homeButtonST", "OPENN") + .equals("DROPBOX")) { + screenDropbox(); + }else if (prefs.getString("homeButtonST", "OPENN") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2119,7 +2030,13 @@ public boolean onDoubleTap(MotionEvent e) { } else if (prefs.getString("homeButtonDT", "OPENMENU") .equals("OPENSCREEN")) { screenHome(); - } + } else if (prefs.getString("homeButtonDT", "OPENN") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("homeButtonDT", "OPENN") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2136,7 +2053,13 @@ public void onLongPress(MotionEvent e) { } else if (prefs.getString("homeButtonLT", "OPENSCREEN").equals("OPENSCREEN")) { screenHome(); - } + } else if (prefs.getString("homeButtonLT", "OPENN") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("homeButtonLT", "OPENN") + .equals("OPDS")) { + screenOPDS(); + } } } } @@ -2171,7 +2094,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { "RELAUNCH").equals("RUN")) { actionRun(prefs.getString("settingsButtonSTapp", "%%")); - } + } else if (prefs.getString("settingsButtonST", + "RELAUNCH").equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("settingsButtonST", + "RELAUNCH").equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2193,7 +2122,13 @@ public boolean onDoubleTap(MotionEvent e) { "RELAUNCH").equals("RUN")) { actionRun(prefs.getString("settingsButtonDTapp", "%%")); - } + } else if (prefs.getString("settingsButtonDT", + "RELAUNCH").equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("settingsButtonDT", + "RELAUNCH").equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2216,7 +2151,13 @@ public void onLongPress(MotionEvent e) { "RELAUNCH").equals("RUN")) { actionRun(prefs.getString( "settingsButtonLTapp", "%%")); - } + } else if (prefs.getString("settingsButtonLT", + "RELAUNCH").equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("settingsButtonLT", + "RELAUNCH").equals("OPDS")) { + screenOPDS(); + } } } } @@ -2278,7 +2219,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } else if (prefs.getString("lruButtonST", "OPENSCREEN") .equals("OPENSCREEN")) { menuLastopened(); - } + } else if (prefs.getString("lruButtonST", "OPENSCREEN") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("lruButtonST", "OPENSCREEN") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2296,7 +2243,13 @@ public boolean onDoubleTap(MotionEvent e) { } else if (prefs.getString("lruButtonDT", "NOTHING") .equals("OPENSCREEN")) { menuLastopened(); - } + } else if (prefs.getString("lruButtonDT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("lruButtonDT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2320,7 +2273,13 @@ public void onLongPress(MotionEvent e) { .getString("lruButtonLT", "NOTHING") .equals("OPENSCREEN")) { menuLastopened(); - } + } else if (prefs.getString("lruButtonLT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("lruButtonLT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } } } } @@ -2351,7 +2310,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } else if (prefs.getString("favButtonST", "OPENSCREEN") .equals("OPENSCREEN")) { menuFavorites(); - } + } else if (prefs.getString("favButtonST", "OPENSCREEN") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("favButtonST", "OPENSCREEN") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2369,7 +2334,13 @@ public boolean onDoubleTap(MotionEvent e) { } else if (prefs.getString("favButtonDT", "NOTHING") .equals("OPENSCREEN")) { menuFavorites(); - } + } else if (prefs.getString("favButtonDT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("favButtonDT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2393,7 +2364,13 @@ public void onLongPress(MotionEvent e) { .getString("favButtonLT", "NOTHING") .equals("OPENSCREEN")) { menuFavorites(); - } + } else if (prefs.getString("favButtonLT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("favButtonLT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } } } } @@ -2432,7 +2409,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } else if (prefs.getString("memButtonST", "RELAUNCH") .equals("RUN")) { actionRun(prefs.getString("memButtonSTapp", "%%")); - } + } else if (prefs.getString("memButtonST", "RELAUNCH") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("memButtonST", "RELAUNCH") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2455,7 +2438,13 @@ public boolean onDoubleTap(MotionEvent e) { } else if (prefs.getString("memButtonDT", "NOTHING") .equals("RUN")) { actionRun(prefs.getString("memButtonDTapp", "%%")); - } + } else if (prefs.getString("memButtonDT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("memButtonDT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2484,11 +2473,17 @@ public void onLongPress(MotionEvent e) { .equals("RUN")) { actionRun(prefs.getString("memButtonLTapp", "%%")); - } + } else if (prefs.getString("memButtonLT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("memButtonLT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } } } } - ; + MemlSimpleOnGestureListener meml_gl = new MemlSimpleOnGestureListener(); final GestureDetector meml_gd = new GestureDetector(meml_gl); mem_l.setOnTouchListener(new View.OnTouchListener() { @@ -2525,7 +2520,13 @@ public boolean onSingleTapConfirmed(MotionEvent e) { } else if (prefs.getString("batButtonST", "RELAUNCH") .equals("RUN")) { actionRun(prefs.getString("batButtonSTapp", "%%")); - } + } else if (prefs.getString("batButtonST", "RELAUNCH") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("batButtonST", "RELAUNCH") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2548,7 +2549,13 @@ public boolean onDoubleTap(MotionEvent e) { } else if (prefs.getString("batButtonDT", "NOTHING") .equals("RUN")) { actionRun(prefs.getString("batButtonDTapp", "%%")); - } + } else if (prefs.getString("batButtonDT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("batButtonDT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } return true; } @@ -2577,7 +2584,13 @@ public void onLongPress(MotionEvent e) { .equals("RUN")) { actionRun(prefs.getString("batButtonLTapp", "%%")); - } + } else if (prefs.getString("batButtonLT", "NOTHING") + .equals("DROPBOX")) { + screenDropbox(); + } else if (prefs.getString("batButtonLT", "NOTHING") + .equals("OPDS")) { + screenOPDS(); + } } } } @@ -2618,7 +2631,7 @@ public boolean onTouch(View v, MotionEvent event) { R.string.jv_relaunch_whats_new)); builder.setView(wv); builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -2635,7 +2648,7 @@ public void onClick(DialogInterface dialog, checkDevice(Build.DEVICE, Build.MANUFACTURER, Build.MODEL, Build.PRODUCT); - setEinkController(); + EinkScreen.setEinkController(prefs); // First directory to get to if (data.getExtras() != null @@ -2643,7 +2656,12 @@ public void onClick(DialogInterface dialog, drawDirectory(data.getExtras().getString("start_dir"), -1); } else { if (prefs.getBoolean("saveDir", true)) - drawDirectory(prefs.getString("lastdir", "/sdcard"), -1); + if(N2DeviceInfo.EINK_ONYX){ + drawDirectory(prefs.getString("lastdir", "/mnt/storage"), -1); + }else{ + drawDirectory(prefs.getString("lastdir", "/sdcard"), -1); + } + else { String[] startDirs = prefs.getString("startDir", "/sdcard,/media/My Files").split("\\,"); @@ -2819,7 +2837,7 @@ public void onClick(DialogInterface dialog, int i) { } }); builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -2894,7 +2912,7 @@ public void onClick(DialogInterface dialog, int i) { .getString( R.string.jv_relaunch_activity_not_found_text3)); builder1.setPositiveButton(getResources() - .getString(R.string.jv_relaunch_ok), + .getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -2921,7 +2939,7 @@ public void onClick(DialogInterface dialog, builder1.setView(input); // "Ok" builder1.setPositiveButton(getResources() - .getString(R.string.jv_relaunch_ok), + .getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -2968,7 +2986,7 @@ public void onClick( builder2.setPositiveButton( getResources() .getString( - R.string.jv_relaunch_ok), + R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -2984,7 +3002,7 @@ public void onClick( }); // "Cancel" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3011,7 +3029,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_del_file_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3024,7 +3042,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3053,7 +3071,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_del_em_dir_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3066,7 +3084,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3096,7 +3114,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_del_ne_dir_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3109,7 +3127,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3135,11 +3153,11 @@ public void onClick(DialogInterface dialog, fileOp = CNTXT_MENU_MOVE_FILE; break; - case CNTXT_MENU_MOVE_DIR: - fileOpFile = fname; - fileOpDir = dname; - fileOp = CNTXT_MENU_MOVE_DIR; - break; + case CNTXT_MENU_COPY_DIR: + fileOpFile = fname; + fileOpDir = dname; + fileOp = CNTXT_MENU_COPY_DIR; + break; case CNTXT_MENU_PASTE: String src; @@ -3151,8 +3169,11 @@ public void onClick(DialogInterface dialog, boolean retCode = false; if (fileOp == CNTXT_MENU_COPY_FILE) retCode = app.copyFile(src, dst, false); - else if ((fileOp == CNTXT_MENU_MOVE_FILE) || (fileOp == CNTXT_MENU_MOVE_DIR)) + else if (fileOp == CNTXT_MENU_MOVE_FILE) retCode = app.moveFile(src, dst); + else if (fileOp == CNTXT_MENU_COPY_DIR){ + retCode = app.copyDir(src, dst); + } if (retCode) { HashMap fitem = new HashMap(); fitem.put("name", fileOpFile); @@ -3165,10 +3186,6 @@ else if ((fileOp == CNTXT_MENU_MOVE_FILE) || (fileOp == CNTXT_MENU_MOVE_DIR)) fitem.put("sname", app.dataBase.getEbookName(dname, fileOpFile, prefs.getString("bookTitleFormat", "%t[\n%a][. %s][-%n]"))); else fitem.put("sname", fileOpFile); - } else if (fileOp == CNTXT_MENU_MOVE_DIR) { - fitem.put("sname", fileOpFile); - fitem.put("type", "dir"); - fitem.put("reader", "nope"); } itemsArray.add(fitem); fileOp = 0; @@ -3182,7 +3199,7 @@ else if ((fileOp == CNTXT_MENU_MOVE_FILE) || (fileOp == CNTXT_MENU_MOVE_DIR)) R.string.jv_relaunch_paste_fail_text) + " " + fileOpFile); builder.setNeutralButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3212,7 +3229,7 @@ else if (fname.endsWith("epub")) R.string.jv_relaunch_rename_title)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3232,7 +3249,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_rename_fail_text) + " " + fname); builder.setNeutralButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3245,7 +3262,7 @@ public void onClick(DialogInterface dialog, }); // "Cancel" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3269,7 +3286,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_rename_title)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3289,7 +3306,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_rename_fail_text) + " " + fname); builder.setNeutralButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3302,7 +3319,7 @@ public void onClick(DialogInterface dialog, }); // "Cancel" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3323,7 +3340,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_create_folder_title)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3353,7 +3370,7 @@ public void onClick(DialogInterface dialog, R.string.jv_relaunch_create_folder_fail_text) + " " + newFullName); builder.setNeutralButton( - getResources().getString(R.string.jv_relaunch_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3366,7 +3383,7 @@ public void onClick(DialogInterface dialog, }); // "Cancel" builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -3393,13 +3410,21 @@ public void onClick(DialogInterface dialog, showFileInfo(dname + "/" + fname); break; + case CNTXT_MENU_COPY_DROPBOX: + copyFileToDropbox(dname, fname); + break; + + case CNTXT_MENU_COPY_DIR_DROPBOX: + copyFileToLocalDirDropbox(dname, fname); + break; + } return true; } - @Override + @Override protected void onResume() { - setEinkController(); + EinkScreen.setEinkController(prefs); super.onResume(); if (app.dataBase == null) app.dataBase = new BooksBase(this); @@ -3480,7 +3505,7 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { R.string.jv_relaunch_launcher_text)) // "YES" .setPositiveButton( - getResources().getString(R.string.jv_relaunch_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { @@ -3489,7 +3514,7 @@ public void onClick(DialogInterface dialog, }) // "NO" .setNegativeButton( - getResources().getString(R.string.jv_relaunch_no), + getResources().getString(R.string.app_no), null).show(); } return true; @@ -3530,7 +3555,7 @@ private void menuFavorites() { intent.putExtra("title", getResources().getString(R.string.jv_relaunch_fav)); intent.putExtra("rereadOnStart", true); - setEinkController(); // ??? not needed + EinkScreen.PrepareController(null, false); // ??? not needed startActivity(intent); } @@ -3568,7 +3593,7 @@ public void onClick(DialogInterface dialog, int i) { } }); builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); @@ -3597,6 +3622,14 @@ private void screenHome() { startActivity(intent); } + private void screenDropbox() { + Intent intent = new Intent(ReLaunch.this, DropBoxActivity.class); + startActivity(intent); + } + private void screenOPDS() { + Intent intent = new Intent(ReLaunch.this, OPDSActivity.class); + startActivity(intent); + } private void menuAbout() { app.About(this); } @@ -3677,7 +3710,7 @@ public void onClick(DialogInterface dialog, int i) { } }); builder.setNegativeButton( - getResources().getString(R.string.jv_relaunch_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); @@ -3746,7 +3779,7 @@ public void run() { } } - if (DeviceInfo.EINK_SONY) { + if (N2DeviceInfo.EINK_SONY) { int prevCode = 0x0069; int nextCode = 0x006a; GridView gv = (GridView) findViewById(R.id.gl_list); @@ -3781,13 +3814,35 @@ public void run() { return super.dispatchKeyEvent(event); } - private void showBookInfo(String file) { + private void showBookInfo(final String file) { final int COVER_MAX_W = 280; Bitmap cover = null; final Dialog dialog = new Dialog(this, android.R.style.Theme_Light_NoTitleBar_Fullscreen); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.bookinfo); - + + if(".fb2".equalsIgnoreCase(file.substring(file.length()-4)) || ".fb2.zip".equalsIgnoreCase(file.substring(file.length()-8))){ + // добавляем кнопку дополнительной информации о файле + Button btnMore = new Button(this); + btnMore.setText(getString(R.string.srt_btn_more_info_book));//"More"); + btnMore.setTextSize(24); + btnMore.setBackgroundResource(R.drawable.main_button); + btnMore.setPadding(20,10,20,10); + LinearLayout ll = (LinearLayout)dialog.findViewById(R.id.linearLayout4); + LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.RIGHT; + ll.addView(btnMore, lp); + btnMore.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + Intent intent = new Intent(app, ExtendedInfoBook.class); + intent.putExtra("filename", file); + startActivity(intent); + } + }); + + //============================================================================= + } Parser parser = new InstantParser(); EBook eBook = parser.parse(file, true); if (eBook.cover != null) { @@ -3849,7 +3904,6 @@ public void onClick(View v) { dialog.dismiss(); } }); - dialog.show(); } @@ -3858,7 +3912,6 @@ private void showFileInfo(String filename) { final Dialog dialog = new Dialog(this); dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); -// dialog.setTitle(getString(R.string.jv_relaunch_fileinfo_title)); dialog.setContentView(R.layout.fileinfo); LinearLayout llSize = (LinearLayout) dialog.findViewById(R.id.llSize); if (file.isDirectory()) @@ -3874,11 +3927,11 @@ private void showFileInfo(String filename) { Runtime rt = Runtime.getRuntime(); String[] args = {"ls", "-l", filename}; Process proc = rt.exec(args); - String str = filename.replace(" ", "\\ "); + //String str = filename.replace(" ", "\\ "); BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream())); int read; char[] buffer = new char[4096]; - StringBuffer output = new StringBuffer(); + StringBuilder output = new StringBuilder(); while ((read = br.read(buffer)) > 0) { output.append(buffer, 0, read); } @@ -3906,5 +3959,199 @@ public void onClick(View v) { dialog.show(); } - + private void copyFileToLocalDirDropbox(String dirname, String filename) { + String src, str_f, locDirDrop; + + locDirDrop = prefs.getString("LocalfolderDropbox", "none"); + if(!"none".equals(locDirDrop)){ + str_f = locDirDrop.trim(); + if(str_f.lastIndexOf("/") == str_f.length()-1) { + locDirDrop = str_f.substring(0, str_f.length()-1); + }else{ + locDirDrop = str_f; + } + String dst = locDirDrop + "/" + filename; + src = dirname + "/" + filename; + File toDir = new File(src); + if(toDir.isDirectory()){ + app.copyDir(src, dst); + }else{ + app.copyFile(src, dst, false); + } + } + } + + + private void copyFileToDropbox(final String dirname, String filename) { + // получаем имя папки Dropbox, куда будем закидывать выделенное + String str_f; + String DBPath; + final Activity activity = this; + DBPath = prefs.getString("DropBoxfolder", "none"); + str_f = DBPath.trim(); + if(str_f.lastIndexOf("/") == str_f.length()-1){ + DBPath = str_f.substring(0, str_f.length()-1); + }else{ + DBPath = str_f; + } + //--------------------------------------------------------------------- + // проверяем наличие подключения к сервису Dropbox + final DropboxAPI mDBApiDB; + mDBApiDB = DropBoxActivity.mDBApi; + if(mDBApiDB == null){ + showToast(getString(R.string.srt_dbactivity_err_con_dropbox));//" Нет подключения к серверу"); + return; // нет подключения к сервису + } + //------------------------------------------------------------------------ + // проверяем наличие на сервере и если такое уже есть - выдаем диалог с вариантами + int checkRez = checkFileDB(DBPath, filename, mDBApiDB); + if(checkRez == 1){ + + // выбор действия + String[] list_url = new String[2]; + final String[] tempNameFile = {filename}; + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(getString(R.string.jv_relaunch_activity_not_found_text1));//"На сервере уже есть такой файл.");//"Скачать файлы"); + list_url[0] = getString(R.string.jv_relaunch_rename);//"Переименовать"; + list_url[1] = getString(R.string.jv_relaunch_rewrite);//"Заменить"; + final String finalDBPath = DBPath; + builder.setItems(list_url, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int item) { + + if(item == 0){ + final AlertDialog.Builder builder2 = new AlertDialog.Builder(activity); + builder2.setTitle(getString(R.string.jv_relaunch_rename_title));//"Введите новое имя"); + final EditText input = new EditText(activity); + builder2.setView(input); + builder2.setCancelable(true); + builder2.setNegativeButton(getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { // Кнопка Отмена + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); // Отпускает диалоговое окно + } + }); + builder2.setPositiveButton(getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { // Кнопка Отмена + @Override + public void onClick(DialogInterface dialog, int which) { + String newName = input.getText().toString().trim(); + + if (newName.length() > 0) { + uploadFilesOrDir(dirname, tempNameFile[0], finalDBPath, mDBApiDB, newName); + }else{ + uploadFilesOrDir(dirname, tempNameFile[0], finalDBPath, mDBApiDB, ""); + } + dialog.dismiss(); // Отпускает диалоговое окно + } + }); + builder2.show(); + } + if(item == 1){ + try { + mDBApiDB.delete(finalDBPath + "/" +tempNameFile[0]); + } catch (DropboxException e) { + showToast(getString(R.string.srt_dbactivity_err_upl_dropbox));//"Ошибка при перезаписи."); + } + + uploadFilesOrDir(dirname, tempNameFile[0], finalDBPath, mDBApiDB, ""); + } + dialog.dismiss(); // Отпускает диалоговое окно + } + }); + builder.setCancelable(true); + builder.setNegativeButton(getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { // Кнопка Отмена + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); // Отпускает диалоговое окно + } + }); + builder.show(); + + }else if(checkRez == 0){ + uploadFilesOrDir(dirname, filename, DBPath, mDBApiDB, ""); + } + + } + private boolean uploadFilesOrDir(String dirname, String filename, String DBPath, DropboxAPI mDBApi, String newfilename) { + //------------------------------------------------------------------------ + // выясняем чего копируем - папку или файл + FileInputStream mFos; + if(newfilename.equals("")){ + newfilename = filename; + } + String src = dirname + "/" + filename; + File toDir = new File(src); + if(toDir.isDirectory()){ + if (!uploadFiles(dirname + "/" + filename, (dirname + "/" ).length(), DBPath, mDBApi)) { + return false; + } + }else{ // копирование одиночного файла + File f1 = new File(src); + try { + mFos = new FileInputStream(src); + } catch (FileNotFoundException e) { + return false; + } + try { + mDBApi.putFile(DBPath + "/" + newfilename, mFos, f1.length(), null, null); + } catch (DropboxException e) { + showToast(getString(R.string.srt_dbactivity_err_upl_dropbox));//" Ошибка при записи файла на сервер"); + return false; + } + } + //----------------------------------------------------------------------- + showToast(getString(R.string.jv_prefs_rsr_ok_text));//" Успешно выполнено"); + return true; + } + private boolean uploadFiles(String Path, int start_pos_path, String DBPath, DropboxAPI mDBApi) { + String[] strDirList = (new File(Path)).list(); + String strPath = Path.substring(start_pos_path); + FileInputStream mFos; + + for (String aStrDirList : strDirList) { + + File f1 = new File(Path+ File.separator + aStrDirList); + if (f1.isFile()) { + try { + mFos = new FileInputStream(f1); + } catch (FileNotFoundException e) { + showToast(getString(R.string.jv_editor_openerr_text1));//" Ошибка при открытии файла"); + return false; + } + try { + mDBApi.putFile(DBPath + "/" + strPath + File.separator + f1.getName(), mFos, f1.length(), null, null); + } catch (DropboxException e) { + showToast(getString(R.string.srt_dbactivity_err_upl_dropbox));//" Ошибка при записи на сервер"); + return false; + } + } else { + if (!uploadFiles(Path + File.separator + aStrDirList , start_pos_path, DBPath, mDBApi)) { + return false; + } + } + } + return true; + } + + private int checkFileDB(String PathDB, String filenameOrDirname, DropboxAPI mDBApi){ + DropboxAPI.Entry entries; + try { + entries = mDBApi.metadata(PathDB, 0, null, true, null); + } catch (DropboxException e) { + return -1; + } + for (DropboxAPI.Entry e : entries.contents) { + if (!e.isDeleted) { + if(e.fileName().equals(filenameOrDirname)){ + return 1; + } + } + } + return 0; + } + + private void showToast(String msg) { + Toast error = Toast.makeText(this, msg, Toast.LENGTH_LONG); + error.show(); + } } diff --git a/src/com/harasoft/relaunch/ReLaunchApp.java b/src/com/harasoft/relaunch/ReLaunchApp.java index 6bb56fd..86a541a 100644 --- a/src/com/harasoft/relaunch/ReLaunchApp.java +++ b/src/com/harasoft/relaunch/ReLaunchApp.java @@ -1,29 +1,10 @@ package com.harasoft.relaunch; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.regex.Pattern; - import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; +import android.content.*; import android.graphics.drawable.Drawable; import android.net.Uri; import android.preference.PreferenceManager; @@ -33,6 +14,12 @@ import android.webkit.WebView; import android.widget.Toast; +import java.io.*; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + public class ReLaunchApp extends Application { final String TAG = "ReLaunchApp"; @@ -73,8 +60,7 @@ public class ReLaunchApp extends Application { public int FLT_NEW; public int FLT_NEW_AND_READING; public boolean filters_and; - - public final String BACKUP_DIR = "/sdcard/.relaunch"; + public final String DATA_DIR = "/data/data/com.harasoft.relaunch"; public HashMap history = new HashMap(); @@ -83,6 +69,7 @@ public class ReLaunchApp extends Application { private HashMap icons; private List> readers; private List apps; + //SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); public BooksBase dataBase; @@ -199,8 +186,7 @@ public void dumpList(String name, List l) { // save list public void saveList(String listName) { - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); if (listName.equals("favorites")) { int favMax = 30; try { @@ -256,12 +242,8 @@ else if (this.history.get(k) == this.FINISHED) this.writeFile("columns", ReLaunch.COLS_FILE, 0, ":"); } } - // Add to list - public void addToList(String listName, String dr, String fn, - Boolean addToEnd) { - // Log.d(TAG, "addToList(" + listName + ", " + dr + ":" + fn + ", " + - // addToEnd + ")"); + public void addToList(String listName, String dr, String fn, Boolean addToEnd) { addToList_internal(listName, dr, fn, addToEnd); } @@ -269,10 +251,7 @@ public void addToList(String listName, String fullName, Boolean addToEnd) { addToList(listName, fullName, addToEnd, "/"); } - public void addToList(String listName, String fullName, Boolean addToEnd, - String delimiter) { - // Log.d(TAG, "addToList(" + listName + ", " + fullName + ", " + - // addToEnd + ", " + delimiter + ")"); + public void addToList(String listName, String fullName, Boolean addToEnd, String delimiter) { if (delimiter.equals("/")) { if (fullName.endsWith("/" + DIR_TAG)) { @@ -312,16 +291,14 @@ public void addToList(String listName, String fullName, Boolean addToEnd, } - public void addToList_internal(String listName, String dr, String fn, - Boolean addToEnd) { + public void addToList_internal(String listName, String dr, String fn, Boolean addToEnd) { if (!m.containsKey(listName)) m.put(listName, new ArrayList()); List resultList = m.get(listName); String[] entry = new String[] { dr, fn }; for (int i = 0; i < resultList.size(); i++) { - if (resultList.get(i)[0].equals(dr) - && resultList.get(i)[1].equals(fn)) { + if (resultList.get(i)[0].equals(dr) && resultList.get(i)[1].equals(fn)) { resultList.remove(i); break; } @@ -331,7 +308,6 @@ public void addToList_internal(String listName, String dr, String fn, else resultList.add(0, entry); } - // Remove from list public void removeFromList(String listName, String dr, String fn) { removeFromList_internal(listName, dr, fn); @@ -350,15 +326,13 @@ public void removeFromList_internal(String listName, String dr, String fn) { return; List resultList = m.get(listName); for (int i = 0; i < resultList.size(); i++) { - if (resultList.get(i)[0].equals(dr) - && resultList.get(i)[1].equals(fn)) { + if (resultList.get(i)[0].equals(dr) && resultList.get(i)[1].equals(fn)) { resultList.remove(i); saveList(listName); return; } } } - // If list contains public boolean contains(String listName, String dr, String fn) { if (!m.containsKey(listName)) @@ -366,8 +340,7 @@ public boolean contains(String listName, String dr, String fn) { List resultList = m.get(listName); for (int i = 0; i < resultList.size(); i++) { - if (resultList.get(i)[0].equals(dr) - && resultList.get(i)[1].equals(fn)) + if (resultList.get(i)[0].equals(dr) && resultList.get(i)[1].equals(fn)) return true; } return false; @@ -437,8 +410,7 @@ public void writeFile(String listName, String fileName, int maxEntries, for (int i = 0; i < resultList.size(); i++) { if (maxEntries != 0 && i >= maxEntries) break; - String line = resultList.get(i)[0] + delimiter - + resultList.get(i)[1] + "\n"; + String line = resultList.get(i)[0] + delimiter + resultList.get(i)[1] + "\n"; try { fos.write(line.getBytes()); } catch (IOException e) { @@ -504,8 +476,7 @@ public boolean copyFile(String from, String to, boolean rewrite) { File dstFile = new File(to); FileChannel src = null; FileChannel dst = null; - boolean ret; -// if ((!srcFile.canRead()) || (!dstFile.canWrite()) || (dstFile.exists())) + if ((!srcFile.canRead()) || ((dstFile.exists()) && (!rewrite))) return false; try { @@ -515,13 +486,35 @@ public boolean copyFile(String from, String to, boolean rewrite) { dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); - ret = true; } catch (IOException e) { - ret = false; + return false; } - return ret; + return true; } - + public boolean copyDir(String from, String to) { + File toDir = new File(to); + String[] strDirList = (new File(from)).list(); + + if(!toDir.exists()){ + if(!toDir.mkdirs()){ + return false; + } + } + for (String aStrDirList1 : strDirList) { + File f1 = new File(from +"/" + aStrDirList1); + if (f1.isFile()) { + if (!copyFile(from +"/" + aStrDirList1, to +"/" + aStrDirList1, false)){ + return false; + } + } else { + if (!copyDir(from +"/" + aStrDirList1, to + "/" +aStrDirList1)){ + return false; + } + } + } + return true; + } + //Move file src to dst public boolean moveFile(String from, String to) { boolean ret = false; @@ -546,8 +539,7 @@ public Intent getIntentByLabel(String label) { String[] labelp = label.split("\\%"); Intent i = new Intent(); i.setComponent(new ComponentName(labelp[0], labelp[1])); - i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); return i; } @@ -555,11 +547,12 @@ public Intent getIntentByLabel(String label) { // file name. Null if not found public Intent launchReader(String name, String file) { String re[] = name.split(":"); + Log.i("=====================", "---------------- name = " + name); + Log.i("=====================", "---------------- file = " + file); if (re.length == 2 && re[0].equals("Intent")) { Intent i = new Intent(); i.setAction(Intent.ACTION_VIEW); - i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); i.setDataAndType(Uri.parse("file:///" + Uri.encode(file.substring(1))), re[1]); addToList("lastOpened", file, false); saveList("lastOpened"); @@ -583,8 +576,7 @@ public Intent launchReader(String name, String file) { Toast.LENGTH_SHORT).show(); else { i.setAction(Intent.ACTION_VIEW); - i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); // i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ALREADY DONE! in // getIntentByLabel i.setData(Uri.parse("file:///" + Uri.encode(file.substring(1)))); @@ -674,10 +666,8 @@ public boolean specialAction(Activity a, String s) { if (s.endsWith(".apk")) { // Install application Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setDataAndType(Uri.parse("file://" + s), - "application/vnd.android.package-archive"); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.setDataAndType(Uri.parse("file://" + s), "application/vnd.android.package-archive"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); a.startActivity(intent); return true; } @@ -710,7 +700,7 @@ public void About(final Activity a) { wv.loadDataWithBaseURL(null, str, "text/html", "utf-8", null); builder.setView(wv); // "Ok" - builder.setPositiveButton(getResources().getString(R.string.jv_rla_ok), + builder.setPositiveButton(getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); @@ -721,24 +711,20 @@ public void onClick(DialogInterface dialog, int whichButton) { getResources().getString(R.string.jv_rla_see_changelog), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { - AlertDialog.Builder builder1 = new AlertDialog.Builder( - a); + AlertDialog.Builder builder1 = new AlertDialog.Builder(a); WebView wv = new WebView(a); wv.loadDataWithBaseURL( null, getResources().getString(R.string.about_help) - + getResources().getString( - R.string.about_appr) - + getResources().getString( - R.string.whats_new), + + getResources().getString(R.string.about_appr) + + getResources().getString(R.string.whats_new), "text/html", "utf-8", null); // "What's new" - builder1.setTitle(getResources().getString( - R.string.jv_rla_whats_new_title)); + builder1.setTitle(getResources().getString(R.string.jv_rla_whats_new_title)); builder1.setView(wv); // "Ok" builder1.setPositiveButton( - getResources().getString(R.string.jv_rla_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -754,8 +740,7 @@ public void onClick(DialogInterface dialog, public void setFullScreenIfNecessary(Activity a) { if (fullScreen) { a.requestWindowFeature(Window.FEATURE_NO_TITLE); - a.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); + a.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } } @@ -787,15 +772,13 @@ public boolean copyPrefs(String from, String to) { } String src = fromDir.getAbsolutePath() + "/shared_prefs/com.harasoft.relaunch_preferences.xml"; String dst = toDir.getAbsolutePath() + "/shared_prefs/com.harasoft.relaunch_preferences.xml"; -// boolean ret = copyFile(src, dst, true); if (!copyFile(src, dst, true)) return false; return true; } public boolean isStartDir(String dir) { - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String startDirs = prefs.getString("startDir", "/sdcard,/media/My Files"); if (startDirs.contains(dir)) return true; @@ -803,8 +786,7 @@ public boolean isStartDir(String dir) { } public void setStartDir(String dir) { - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); SharedPreferences.Editor editor = prefs.edit(); editor.putString("startDir", dir); editor.putBoolean("showAddStartDir", false); @@ -812,8 +794,7 @@ public void setStartDir(String dir) { } public void addStartDir(String dir) { - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); SharedPreferences.Editor editor = prefs.edit(); String oldStart = prefs.getString("startDir", "/sdcard,/media/My Files"); editor.putString("startDir", oldStart + "," + dir); diff --git a/src/com/harasoft/relaunch/ResultsActivity.java b/src/com/harasoft/relaunch/ResultsActivity.java index 51d314a..4548caa 100644 --- a/src/com/harasoft/relaunch/ResultsActivity.java +++ b/src/com/harasoft/relaunch/ResultsActivity.java @@ -1,25 +1,8 @@ package com.harasoft.relaunch; -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.regex.Pattern; - -import ebook.EBook; -import ebook.parser.InstantParser; -import ebook.parser.Parser; - import android.app.Activity; import android.app.AlertDialog; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; +import android.content.*; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Typeface; @@ -31,32 +14,19 @@ import android.text.SpannableString; import android.text.style.StyleSpan; import android.util.TypedValue; -import android.view.ContextMenu; -import android.view.GestureDetector; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.MeasureSpec; -import android.view.View.OnTouchListener; -import android.view.ViewGroup; +import android.view.*; import android.view.ContextMenu.ContextMenuInfo; import android.view.GestureDetector.SimpleOnGestureListener; -import android.widget.AbsListView; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.GridView; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; +import android.view.View.MeasureSpec; +import android.view.View.OnTouchListener; +import android.widget.*; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; +import ebook.EBook; + +import java.io.File; +import java.util.*; +import java.util.regex.Pattern; public class ResultsActivity extends Activity { final String TAG = "Results"; @@ -76,45 +46,13 @@ public class ResultsActivity extends Activity { Boolean rereadOnStart = true; SharedPreferences prefs; FLSimpleAdapter adapter; - ListView lv; - Integer currentColsNum = -1; + Integer currentColsNum = -1; List> itemsArray = new ArrayList>(); Integer currentPosition = -1; boolean addSView = true; boolean oldHome; Pattern purgeBracketsPattern; - - private void setEinkController() { - if (prefs != null) { - Integer einkUpdateMode = 1; - try { - einkUpdateMode = Integer.parseInt(prefs.getString( - "einkUpdateMode", "1")); - } catch (Exception e) { - einkUpdateMode = 1; - } - if (einkUpdateMode < -1 || einkUpdateMode > 2) - einkUpdateMode = 1; - if (einkUpdateMode >= 0) { - EinkScreen.UpdateMode = einkUpdateMode; - - Integer einkUpdateInterval = 10; - try { - einkUpdateInterval = Integer.parseInt(prefs.getString( - "einkUpdateInterval", "10")); - } catch (Exception e) { - einkUpdateInterval = 10; - } - if (einkUpdateInterval < 0 || einkUpdateInterval > 100) - einkUpdateInterval = 10; - EinkScreen.UpdateModeInterval = einkUpdateInterval; - - EinkScreen.PrepareController(null, false); - } - } - } - static class ViewHolder { TextView tv1; TextView tv2; @@ -428,7 +366,7 @@ private Integer getAutoColsNum() { } private void redrawList() { - setEinkController(); + EinkScreen.PrepareController(null, false); if (prefs.getBoolean("filterResults", false)) { List> newItemsArray = new ArrayList>(); @@ -517,7 +455,7 @@ protected void onCreate(Bundle savedInstanceState) { prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - setEinkController(); + EinkScreen.setEinkController(prefs); app = ((ReLaunchApp) getApplicationContext()); app.setFullScreenIfNecessary(this); @@ -756,8 +694,8 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + EinkScreen.PrepareController(null, false); + sv.invalidate(); } public void onScrollStateChanged(AbsListView view, @@ -770,7 +708,7 @@ public void onScrollStateChanged(AbsListView view, gv.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -871,7 +809,7 @@ public void onClick( class upScrlSimpleOnGestureListener extends SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { - if (DeviceInfo.EINK_NOOK) { // nook + if (N2DeviceInfo.EINK_NOOK) { // nook MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -988,7 +926,7 @@ public void run() { class dnScrlSimpleOnGestureListener extends SimpleOnGestureListener { @Override public boolean onSingleTapConfirmed(MotionEvent e) { - if (DeviceInfo.EINK_NOOK) { // nook special + if (N2DeviceInfo.EINK_NOOK) { // nook special MotionEvent ev; ev = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), @@ -1161,7 +1099,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, .getString(R.string.jv_results_delete_dir)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_results_cancel)); + .getString(R.string.app_cancel)); } else if (listName.equals("favorites")) { if (pos > 0) // "Move one position up" @@ -1184,7 +1122,7 @@ public void onCreateContextMenu(ContextMenu menu, View v, R.string.jv_results_delete_file)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_results_cancel)); + .getString(R.string.app_cancel)); } else if (listName.equals("lastOpened")) { if (app.history.containsKey(fullName)) { if (app.history.get(fullName) == app.READING) @@ -1214,7 +1152,7 @@ else if (app.history.get(fullName) == app.FINISHED) R.string.jv_results_delete_file)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_results_cancel)); + .getString(R.string.app_cancel)); } else if (listName.equals("searchResults")) { if (pos > 0) // "Move one position up" @@ -1252,7 +1190,7 @@ else if (app.history.get(fullName) == app.FINISHED) R.string.jv_results_delete_file)); // "Cancel" menu.add(Menu.NONE, CNTXT_MENU_CANCEL, Menu.NONE, getResources() - .getString(R.string.jv_results_cancel)); + .getString(R.string.app_cancel)); } } @@ -1346,7 +1284,7 @@ public boolean onContextItemSelected(MenuItem item) { R.string.jv_results_delete_file_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_results_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1359,7 +1297,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_results_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1392,7 +1330,7 @@ public void onClick(DialogInterface dialog, R.string.jv_results_delete_em_dir_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_results_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1405,7 +1343,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_results_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1434,7 +1372,7 @@ public void onClick(DialogInterface dialog, R.string.jv_results_delete_ne_dir_text2)); // "Yes" builder.setPositiveButton( - getResources().getString(R.string.jv_results_yes), + getResources().getString(R.string.app_yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1447,7 +1385,7 @@ public void onClick(DialogInterface dialog, }); // "No" builder.setNegativeButton( - getResources().getString(R.string.jv_results_no), + getResources().getString(R.string.app_no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -1467,7 +1405,7 @@ public void onClick(DialogInterface dialog, @Override protected void onResume() { - setEinkController(); + EinkScreen.setEinkController(prefs); super.onResume(); app.generalOnResume(TAG, this); } @@ -1476,8 +1414,7 @@ private String getEbookName(String dir, String file) { EBook eBook; if ((!file.endsWith("fb2")) && (!file.endsWith("fb2.zip")) &&(!file.endsWith("epub"))) return file; - String fileName = dir + "/" + file; - eBook = app.dataBase.getBookByFileName(dir + "/" + file); + eBook = app.dataBase.getBookByFileName(dir + "/" + file); if (eBook.isOk) { String output = prefs.getString("bookTitleFormat", "[%a. ]%t"); if (eBook.authors.size() > 0) { diff --git a/src/com/harasoft/relaunch/SearchActivity.java b/src/com/harasoft/relaunch/SearchActivity.java index d687c4b..b568911 100644 --- a/src/com/harasoft/relaunch/SearchActivity.java +++ b/src/com/harasoft/relaunch/SearchActivity.java @@ -66,7 +66,7 @@ private void resetSearch() { pd.setCancelable(true); // "Cancel" pd.setButton(ProgressDialog.BUTTON_NEGATIVE, - getResources().getString(R.string.jv_search_cancel), + getResources().getString(R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { stop_search = true; diff --git a/src/com/harasoft/relaunch/Shop.java b/src/com/harasoft/relaunch/Shop.java index 246226c..8b6134e 100644 --- a/src/com/harasoft/relaunch/Shop.java +++ b/src/com/harasoft/relaunch/Shop.java @@ -1,9 +1,14 @@ package com.harasoft.relaunch; +import java.util.Locale; + import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Configuration; import android.os.Bundle; +import android.preference.PreferenceManager; public class Shop extends Activity { final String TAG = "Shop"; @@ -13,6 +18,23 @@ public class Shop extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + SharedPreferences preferences; + Locale locale; + String lang; + + preferences = PreferenceManager.getDefaultSharedPreferences(this); + lang = preferences.getString("lang", "default"); + if (lang.equals("default")) { + locale = getResources().getConfiguration().locale.getDefault();} + else { + locale = new Locale(lang);} + Locale.setDefault(locale); + Configuration config = new Configuration(); + config.locale = locale; + getBaseContext().getResources().updateConfiguration(config, null); + + N2EpdController.n2MainActivity = this; + app = ((ReLaunchApp) getApplicationContext()); app.RestartIntent = PendingIntent.getActivity(this, 0, getIntent(), getIntent().getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/src/com/harasoft/relaunch/TaskManager.java b/src/com/harasoft/relaunch/TaskManager.java index 9c77156..43dbc27 100644 --- a/src/com/harasoft/relaunch/TaskManager.java +++ b/src/com/harasoft/relaunch/TaskManager.java @@ -1,14 +1,5 @@ package com.harasoft.relaunch; -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.Dialog; @@ -28,18 +19,16 @@ import android.text.style.StyleSpan; import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; -import android.view.View.OnClickListener; -import android.widget.AbsListView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.ListView; -import android.widget.TextView; +import android.widget.*; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; public class TaskManager extends Activity { final String TAG = "TaskManager"; @@ -136,35 +125,6 @@ static class PInfo { List newServ; HashMap newPinfo; - private void setEinkController() { - if (prefs != null) { - Integer einkUpdateMode = 1; - try { - einkUpdateMode = Integer.parseInt(prefs.getString( - "einkUpdateMode", "1")); - } catch (Exception e) { - einkUpdateMode = 1; - } - if (einkUpdateMode < -1 || einkUpdateMode > 2) - einkUpdateMode = 1; - if (einkUpdateMode >= 0) { - EinkScreen.UpdateMode = einkUpdateMode; - - Integer einkUpdateInterval = 10; - try { - einkUpdateInterval = Integer.parseInt(prefs.getString( - "einkUpdateInterval", "10")); - } catch (Exception e) { - einkUpdateInterval = 10; - } - if (einkUpdateInterval < 0 || einkUpdateInterval > 100) - einkUpdateInterval = 10; - EinkScreen.UpdateModeInterval = einkUpdateInterval; - - EinkScreen.PrepareController(null, false); - } - } - } public class cpuComparator implements java.util.Comparator { public int compare(Integer o1, Integer o2) { @@ -525,7 +485,7 @@ protected void onPostExecute(String result) { taskPids = newTask; servPids = newServ; sortLists(); - setEinkController(); + EinkScreen.PrepareController(null, false); adapter_t.notifyDataSetChanged(); adapter_s.notifyDataSetChanged(); @@ -1005,7 +965,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - setEinkController(); + EinkScreen.setEinkController(prefs); app = ((ReLaunchApp) getApplicationContext()); app.setFullScreenIfNecessary(this); @@ -1052,8 +1012,8 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + EinkScreen.PrepareController(null, false); + sv.invalidate(); } public void onScrollStateChanged(AbsListView view, @@ -1077,8 +1037,12 @@ public void onScroll(AbsListView view, sv.total = totalItemCount; sv.count = visibleItemCount; sv.first = firstVisibleItem; - setEinkController(); - sv.invalidate(); + if(N2DeviceInfo.EINK_ONYX){ + EinkScreen.PrepareController(sv, false); + }else{ + EinkScreen.PrepareController(null, false); + sv.invalidate(); + } } public void onScrollStateChanged(AbsListView view, @@ -1091,7 +1055,7 @@ public void onScrollStateChanged(AbsListView view, lv_t.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -1101,7 +1065,7 @@ public void onScrollStateChanged(AbsListView view, lv_s.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - setEinkController(); + EinkScreen.PrepareController(null, false); } public void onScrollStateChanged(AbsListView view, @@ -1168,17 +1132,11 @@ protected void onPause() { stopCPUUpdate(); } - @Override - protected void onRestart() { - super.onRestart(); - setEinkController(); - startCPUUpdate(); - } @Override protected void onResume() { super.onResume(); - setEinkController(); + EinkScreen.setEinkController(prefs); startCPUUpdate(); app.generalOnResume(TAG, this); } @@ -1186,7 +1144,7 @@ protected void onResume() { @Override protected void onStart() { super.onStart(); - setEinkController(); + EinkScreen.setEinkController(prefs); startCPUUpdate(); } diff --git a/src/com/harasoft/relaunch/TypesActivity.java b/src/com/harasoft/relaunch/TypesActivity.java index f24b806..9b1197a 100644 --- a/src/com/harasoft/relaunch/TypesActivity.java +++ b/src/com/harasoft/relaunch/TypesActivity.java @@ -150,7 +150,7 @@ public void onClick(View v) { // "Ok" builder.setPositiveButton( - getResources().getString(R.string.jv_types_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -176,7 +176,7 @@ public void onClick(DialogInterface dialog, // "Cancel" builder.setNegativeButton( getResources().getString( - R.string.jv_types_cancel), + R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -274,7 +274,7 @@ public void onClick(DialogInterface dialog, // "Ok" builder3.setPositiveButton( getResources().getString( - R.string.jv_types_ok), + R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -307,7 +307,7 @@ public void onClick( builder3.setNegativeButton( getResources() .getString( - R.string.jv_types_cancel), + R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick( DialogInterface dialog, @@ -323,7 +323,7 @@ public void onClick( // "Cancel" builder1.setNegativeButton( getResources().getString( - R.string.jv_types_cancel), + R.string.app_cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { diff --git a/src/com/harasoft/relaunch/Viewer.java b/src/com/harasoft/relaunch/Viewer.java index d28e990..03adccd 100644 --- a/src/com/harasoft/relaunch/Viewer.java +++ b/src/com/harasoft/relaunch/Viewer.java @@ -53,6 +53,7 @@ private boolean rereadFile(String fname, EditText editTxt) { try { br.close(); } catch (IOException e) { + // } // Set text @@ -111,7 +112,7 @@ protected void onCreate(Bundle savedInstanceState) { + getResources().getString(R.string.jv_viewer_bytes)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_viewer_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -155,7 +156,7 @@ public void onClick(View v) { R.string.jv_editor_bytes)); // "OK" builder.setPositiveButton( - getResources().getString(R.string.jv_viewer_ok), + getResources().getString(R.string.app_ok), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { @@ -198,8 +199,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { case EDITOR_ACT: rereadFile(fileName, editTxt); break; - default: - return; } } From a2f1beaee93a72a34316be367720618090f58ad9 Mon Sep 17 00:00:00 2001 From: haron2013 Date: Tue, 29 Apr 2014 11:00:00 +0400 Subject: [PATCH 08/18] 1.3.9 b1 --- ReLaunch1.iml | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 ReLaunch1.iml diff --git a/ReLaunch1.iml b/ReLaunch1.iml deleted file mode 100644 index 3e66c4d..0000000 --- a/ReLaunch1.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - From 95c4971a7f2288341f0cfadc7a4686fe0aa79c5d Mon Sep 17 00:00:00 2001 From: haron2013 Date: Tue, 29 Apr 2014 11:01:00 +0400 Subject: [PATCH 09/18] 1.3.9 b1 --- .idea/compiler.xml | 23 + .idea/copyright/profiles_settings.xml | 3 + .idea/encodings.xml | 5 + .idea/misc.xml | 8 + .idea/modules.xml | 9 + .idea/scopes/scope_settings.xml | 5 + .idea/vcs.xml | 7 + Main.iml | 19 + Readme_Haron.txt | 10 + gen/com/harasoft/relaunch/BuildConfig.java | 8 + gen/com/harasoft/relaunch/Manifest.java | 7 + gen/com/harasoft/relaunch/R.java | 7 + libs/dropbox-android-sdk-1.5.4.jar | Bin 0 -> 91895 bytes libs/httpmime-4.0.3.jar | Bin 0 -> 25447 bytes libs/json_simple-1.1.jar | Bin 0 -> 16046 bytes res/drawable-mdpi/book.png | Bin 0 -> 2525 bytes res/drawable-mdpi/ci_dropbox.png | Bin 0 -> 3341 bytes res/drawable-mdpi/folder_books.png | Bin 0 -> 3145 bytes res/layout-mdpi/button_dropbox_select.xml | 30 + res/layout-mdpi/button_opds.xml | 32 + res/layout-mdpi/dropsync.xml | 106 ++ res/values-ru/arrays.xml | 16 + src/com/harasoft/relaunch/Base64Coder.java | 144 ++ .../harasoft/relaunch/DropBoxActivity.java | 530 +++++++ src/com/harasoft/relaunch/DropboxSelect.java | 620 ++++++++ .../harasoft/relaunch/ExtendedInfoBook.java | 642 ++++++++ .../relaunch/HttpBasicAuthentication.java | 64 + src/com/harasoft/relaunch/N2DeviceInfo.java | 71 + src/com/harasoft/relaunch/OPDSActivity.java | 1300 +++++++++++++++++ src/ebook/EBook.java | 100 ++ src/ebook/EBookFormat.java | 38 + src/ebook/ParsingType.java | 36 + src/ebook/Person.java | 71 + src/ebook/parser/Base64Decoder.java | 113 ++ src/ebook/parser/EpubInstantParser.java | 168 +++ src/ebook/parser/Fb2InstantParser.java | 202 +++ src/ebook/parser/InstantParser.java | 88 ++ src/ebook/parser/Parser.java | 63 + src/ebook/parser/SOP.java | 97 ++ 39 files changed, 4642 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/vcs.xml create mode 100644 Main.iml create mode 100644 Readme_Haron.txt create mode 100644 gen/com/harasoft/relaunch/BuildConfig.java create mode 100644 gen/com/harasoft/relaunch/Manifest.java create mode 100644 gen/com/harasoft/relaunch/R.java create mode 100644 libs/dropbox-android-sdk-1.5.4.jar create mode 100644 libs/httpmime-4.0.3.jar create mode 100644 libs/json_simple-1.1.jar create mode 100644 res/drawable-mdpi/book.png create mode 100644 res/drawable-mdpi/ci_dropbox.png create mode 100644 res/drawable-mdpi/folder_books.png create mode 100644 res/layout-mdpi/button_dropbox_select.xml create mode 100644 res/layout-mdpi/button_opds.xml create mode 100644 res/layout-mdpi/dropsync.xml create mode 100644 res/values-ru/arrays.xml create mode 100644 src/com/harasoft/relaunch/Base64Coder.java create mode 100644 src/com/harasoft/relaunch/DropBoxActivity.java create mode 100644 src/com/harasoft/relaunch/DropboxSelect.java create mode 100644 src/com/harasoft/relaunch/ExtendedInfoBook.java create mode 100644 src/com/harasoft/relaunch/HttpBasicAuthentication.java create mode 100644 src/com/harasoft/relaunch/N2DeviceInfo.java create mode 100644 src/com/harasoft/relaunch/OPDSActivity.java create mode 100644 src/ebook/EBook.java create mode 100644 src/ebook/EBookFormat.java create mode 100644 src/ebook/ParsingType.java create mode 100644 src/ebook/Person.java create mode 100644 src/ebook/parser/Base64Decoder.java create mode 100644 src/ebook/parser/EpubInstantParser.java create mode 100644 src/ebook/parser/Fb2InstantParser.java create mode 100644 src/ebook/parser/InstantParser.java create mode 100644 src/ebook/parser/Parser.java create mode 100644 src/ebook/parser/SOP.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..217af47 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..e206d70 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..1a0d457 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..8867b26 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 0000000..922003b --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..275077f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Main.iml b/Main.iml new file mode 100644 index 0000000..11d403f --- /dev/null +++ b/Main.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Readme_Haron.txt b/Readme_Haron.txt new file mode 100644 index 0000000..d4c6e2d --- /dev/null +++ b/Readme_Haron.txt @@ -0,0 +1,10 @@ +Чем отличается от ReLaunch 1.3.8, который лежит на github: +1. Поправлено определение NST(проверено, на аппаратах с подсветкой тоже должно заработать, но не проверялось) на прошивках 1.2.0 и 1.2.1. Соответственно стали работать настройки WiFi.(Использовался патч отсюда: https://www.dropbox.com/s/9ldwsgrz10zwbc1/nook120.patch. Добавлял определение BNRV300) +2. Добавлена возможность ручного переключения языков. По умолчанию язык устанавливается системный (т.е. как в не правленном ReLaunch) (Способ описан здесь: http://habrahabr.ru/post/125812/) +3. Сделаны правки согласно патча lucifervrn000 (ему ограменный спасиб). Патч поправляет баг с вылетом при повторном заходе в настройки WiFi, поправляет вызов настроек на книжках Sony, вызывает штатные настройки WiFi андроида на остальных устройствах.(использовался этот патч: docs.google.com/file/d/0B5d0vsLEKJhdRUJrSEdyYmk1OVk/edit?usp=sharing) +4. В библиотеку ebookParser-1.3 добавил костыль (да простит меня автор библиотеки за такое своеволие) определения серии и номер в серии, в файлах EPUB если есть тэги от программы Calibre ("calibre:series" и "calibre:series_index"). Точно работает в инфо по книге. Возможно работает в переименовании по тэгам. Если чего - пишем о глюках. +6. Поправил добавление фильтров на файлы. Не запоминалась часть фильтров. +7. Добавил просмотр дополнительной информации для файлов fb2. +5. Совсем немного почистил код от "мусора". Надеюсь не перестарался. +6. Добавил небольшой модуль для работы с дропбоксом. Сделан на основе Core API 1.5.4. Возможности зачаточные. +7. Добавил небольшой модуль для работы с OPDS-каталогами. Работает не совсеми каталогами. Сделан с использованием XmlPullParser. diff --git a/gen/com/harasoft/relaunch/BuildConfig.java b/gen/com/harasoft/relaunch/BuildConfig.java new file mode 100644 index 0000000..5f46cb8 --- /dev/null +++ b/gen/com/harasoft/relaunch/BuildConfig.java @@ -0,0 +1,8 @@ +/*___Generated_by_IDEA___*/ + +package com.harasoft.relaunch; + +/* This stub is only used by the IDE. It is NOT the BuildConfig class actually packed into the APK */ +public final class BuildConfig { + public final static boolean DEBUG = Boolean.parseBoolean(null); +} \ No newline at end of file diff --git a/gen/com/harasoft/relaunch/Manifest.java b/gen/com/harasoft/relaunch/Manifest.java new file mode 100644 index 0000000..a788da3 --- /dev/null +++ b/gen/com/harasoft/relaunch/Manifest.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package com.harasoft.relaunch; + +/* This stub is only used by the IDE. It is NOT the Manifest class actually packed into the APK */ +public final class Manifest { +} \ No newline at end of file diff --git a/gen/com/harasoft/relaunch/R.java b/gen/com/harasoft/relaunch/R.java new file mode 100644 index 0000000..8eda8ff --- /dev/null +++ b/gen/com/harasoft/relaunch/R.java @@ -0,0 +1,7 @@ +/*___Generated_by_IDEA___*/ + +package com.harasoft.relaunch; + +/* This stub is only used by the IDE. It is NOT the R class actually packed into the APK */ +public final class R { +} \ No newline at end of file diff --git a/libs/dropbox-android-sdk-1.5.4.jar b/libs/dropbox-android-sdk-1.5.4.jar new file mode 100644 index 0000000000000000000000000000000000000000..38a3602ffa06bc09a255422ebde6228494861a68 GIT binary patch literal 91895 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�C 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

L zs9F*t-X*@DyfB=HG&^R`1t#c-@0dCn65+NE1=T-xZ?Z_5IHnBtDNi~Zm!7MrAbw^} z7#VlapaT=1+UzuELv-!B^NwTZZqz4u`+;o52iU}xY9o#Nn)rsx7aYYy&95V0pUiu~)ehmowO}9JBXvIhtFH1}%vG zOKGjgQn>InTP=Y<5^3p=nPhhEiljW&NC2&cx>3OrOr0-0_zmXz(2gY)}VC$as)y+4+$5}Sb9FsWVnrqS; z9K(PgQ&1>!&ZsaDs)VA(RC=p=rL_VVv#=UlY84Y+!c(&*+>tXreFoj1xhY?B+K+ z_r+A+$jQOzTL+-$Xk_B{H#jSmFBKA%5Wlj#cGZ%B?2sJ1_&i6E;Z$ZB`6vWo{YQL9 zQsi-x$FIiv?<=OcBUFu*)y<8%k_h%q6(&y*aVSj~&FgFwm8H`spL>hYx)m9s=XGSW z+9CWe{ORVsTc$gYvmLHlyWcpDFAlrATL5+8qTAzQ)LD#kl=-qCWZLvZIw53?^r*6@ z_w7L-h=9q_LN zh5A>fnT8w*gE#`o0j-0gQQ*4|xF_m9p)ez0A_>I>T}@b?7OZno|<1I!S5GoPai@ z3pWg&fCDy$&Q!+#uo+xol-+_i=+9Y9)tp9~wL!zH*9tXlMLs=XU3xx;WI&Y7H>afp z&>Ig2E^{-5tu4tN7E~LvUSOmoFf|2Z;_ipnQdZjq_U9l)X;UI`1XzT%%!{C{w=Q2R z1!h!&0g5kCL^BRCS8@gtQUo5pW%XBA)vu*vLdxd@i10%*G znE0@nx!dFjBJ-0B%h%~tORY7;b(WwNf3zJCM{$8KZ+}wi(dHw)jR{kY7$aP@(t-f< zqeG_`L62%dLsWuG13(Bdql~3F=KE<3Zw%F?A5|0k5Kni{c90-d1X6)%)Wa z2T|)Z@H^fFE-5Mo)htw7rn0@ z+Jq9!Ru4DO8yBlD3s~#>h!#h9$W?bxGZN;*4%UVKnu=-gK~{Tmsm8|d`ImeK1Utd~D4AcJM6%#ZQ{Spc>cb)wt*qWL2uQg%;x|QzcGfe7L*!QZs5ZHmimU0>hBN zMblDcPT~m0Uxzf3qw&37N9T!gF0BhS&3bI2saZot=6OdoW=aE*YNMHi6EZHjapju@ z4;-4|D|Yo|gGTOlgl6V?SGH&o15GVugXa8gdg0(o_({mRY6q)6ca&2VdyeAyh_|-_ z@#*(OiJ+|Ht)t^`QwQAf2wlataLJKBEAS4vh^Wd!UX=RGE4bw{TJ!IXNC2gJ0XvJO zV8`YiCp==rql{dO)40n3T=28{O~suXN>5q6Qf#QzHkoPGCJtTQ*R~i$+t8kNiMp$X z$duD?f9Xk|afKkL`71I8FC6-3PW!AJOhac>JZ$(F-;(#}SPR=uwS%q~bJprH$DqlJ zYNhr&$jJYM>4RBq0;i)fv(y-#qAx5t!7%gzdvmYe$IsN6#!)pIQIexUs zZDNPiOoz05BeIt

i9qN-KT>nmj9~I7_EEZ^t+TW|?Pg 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�stzY$L=fl?rAP;QZ74%#D}tMd3CtP|Mm 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 T05_Y#vkKtm^ra|@B1!w;7C{gM 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 literal 0 HcmV?d00001 diff --git a/res/layout-mdpi/button_dropbox_select.xml b/res/layout-mdpi/button_dropbox_select.xml new file mode 100644 index 0000000..d857ec4 --- /dev/null +++ b/res/layout-mdpi/button_dropbox_select.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout-mdpi/button_opds.xml b/res/layout-mdpi/button_opds.xml new file mode 100644 index 0000000..f2f07d8 --- /dev/null +++ b/res/layout-mdpi/button_opds.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout-mdpi/dropsync.xml b/res/layout-mdpi/dropsync.xml new file mode 100644 index 0000000..40985bd --- /dev/null +++ b/res/layout-mdpi/dropsync.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + +