Advertisement
Guest User

Untitled

a guest
May 16th, 2017
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 73.12 KB | None | 0 0
  1. package net.textreaderfb2epub.textReader;
  2.  
  3. import java.io.File;
  4. import java.lang.Thread.UncaughtExceptionHandler;
  5. import java.lang.reflect.Field;
  6. import java.lang.reflect.Method;
  7. import java.util.ArrayList;
  8. import java.util.Collections;
  9. import java.util.Comparator;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. import android.app.AlertDialog;
  15. import android.content.Context;
  16. import android.content.DialogInterface;
  17. import android.content.Intent;
  18. import android.content.res.AssetManager;
  19. import android.content.res.Configuration;
  20. import android.graphics.Typeface;
  21. import android.net.Uri;
  22. import android.os.Bundle;
  23. import android.provider.Settings;
  24. import android.util.DisplayMetrics;
  25. import android.util.Log;
  26. import android.view.Gravity;
  27. import android.view.KeyEvent;
  28. import android.view.LayoutInflater;
  29. import android.view.Menu;
  30. import android.view.MenuInflater;
  31. import android.view.MotionEvent;
  32. import android.view.View;
  33. import android.view.View.OnClickListener;
  34. import android.view.View.OnLongClickListener;
  35. import android.view.View.OnTouchListener;
  36. import android.view.ViewGroup;
  37. import android.view.Window;
  38. import android.view.WindowManager;
  39. import android.view.WindowManager.LayoutParams;
  40. import android.widget.FrameLayout;
  41. import net.textreaderfb2epub.bookParser.BaseBook;
  42. import net.textreaderfb2epub.bookParser.EpubBook;
  43. import net.textreaderfb2epub.bookParser.Fb2Book;
  44. import net.textreaderfb2epub.bookParser.FontData;
  45. import net.textreaderfb2epub.bookParser.HtmlBook;
  46. import net.textreaderfb2epub.common.BaseActivity;
  47. import net.textreaderfb2epub.common.BaseCustomMenu.OnMenuListener;
  48. import net.textreaderfb2epub.common.CustomMenuView;
  49. import net.textreaderfb2epub.common.DBSettings;
  50. import net.textreaderfb2epub.common.LimitedFrameView;
  51. import net.textreaderfb2epub.common.MenuData;
  52. import net.textreaderfb2epub.common.MenuItem;
  53. import net.textreaderfb2epub.common.Pair;
  54. import net.textreaderfb2epub.R;
  55. public class TextReader extends BaseActivity implements OnClickListener, OnLongClickListener, OnMenuListener, UncaughtExceptionHandler, OnTouchListener, BrightnessMenu.OnBrightnessChangeListener, GotoMenu.OnPageChangeListener, BordersMenu.OnApplyBordersListener {
  56. // constants
  57. public static final int NOOK_KEY_PREV_LEFT = 96;
  58. public static final int NOOK_KEY_PREV_RIGHT = 98;
  59. public static final int NOOK_KEY_NEXT_LEFT = 95;
  60. public static final int NOOK_KEY_NEXT_RIGHT = 97;
  61.  
  62. public static final int NOOK_KEY_SHIFT_UP = 101;
  63. public static final int NOOK_KEY_SHIFT_DOWN = 100;
  64.  
  65. public static final int KEYCODE_PAGE_BOTTOMLEFT = 0x5d;
  66. public static final int KEYCODE_PAGE_BOTTOMRIGHT = 0x5f;
  67. public static final int KEYCODE_PAGE_TOPLEFT = 0x5c;
  68. public static final int KEYCODE_PAGE_TOPRIGHT = 0x5e;
  69.  
  70. public static final int REVERSE_NONE = 0;
  71. public static final int REVERSE_ALWAYS = 1;
  72. public static final int REVERSE_LANDSCAPE = 2;
  73.  
  74. public static final int TOUCH_VERTICAL = 0;
  75. public static final int TOUCH_HORIZONTAL = 1;
  76.  
  77. // fields
  78. private static final HashMap<Integer, Integer> s_fontSizes;
  79. private static final HashMap<Integer, Integer> s_advFontSizes;
  80. // private static final HashMap<Integer, Integer> s_advBrightnessValues;
  81. private static final HashMap<Integer, Float> s_contrastValues;
  82. private static final HashMap<Integer, Float> s_lineSpacings;
  83. private static final HashMap<Integer, Integer> s_headerSizes;
  84. private static final HashMap<Integer, Integer> s_footerTypes;
  85. private static final HashMap<Integer, Integer> s_refreshModes;
  86.  
  87. private static final HashMap<String, String> s_fontPaths = new HashMap<String, String>();
  88.  
  89. static {
  90. s_fontSizes = new HashMap<Integer, Integer>();
  91. s_fontSizes.put(R.id.font_size_xsmall, 20);
  92. s_fontSizes.put(R.id.font_size_small, 22);
  93. s_fontSizes.put(R.id.font_size_medium, 25);
  94. s_fontSizes.put(R.id.font_size_large, 28);
  95. s_fontSizes.put(R.id.font_size_xlarge, 30);
  96.  
  97. s_advFontSizes = new HashMap<Integer, Integer>();
  98. s_advFontSizes.put(R.id.adv_font_size_14, 14);
  99. s_advFontSizes.put(R.id.adv_font_size_15, 15);
  100. s_advFontSizes.put(R.id.adv_font_size_16, 16);
  101. s_advFontSizes.put(R.id.adv_font_size_17, 17);
  102. s_advFontSizes.put(R.id.adv_font_size_18, 18);
  103. s_advFontSizes.put(R.id.adv_font_size_19, 19);
  104. s_advFontSizes.put(R.id.adv_font_size_20, 20);
  105. s_advFontSizes.put(R.id.adv_font_size_21, 21);
  106. s_advFontSizes.put(R.id.adv_font_size_22, 22);
  107. s_advFontSizes.put(R.id.adv_font_size_23, 23);
  108. s_advFontSizes.put(R.id.adv_font_size_24, 24);
  109. s_advFontSizes.put(R.id.adv_font_size_25, 25);
  110. s_advFontSizes.put(R.id.adv_font_size_26, 26);
  111. s_advFontSizes.put(R.id.adv_font_size_27, 27);
  112. s_advFontSizes.put(R.id.adv_font_size_28, 28);
  113. s_advFontSizes.put(R.id.adv_font_size_29, 29);
  114. s_advFontSizes.put(R.id.adv_font_size_30, 30);
  115. s_advFontSizes.put(R.id.adv_font_size_31, 31);
  116. s_advFontSizes.put(R.id.adv_font_size_32, 32);
  117. s_advFontSizes.put(R.id.adv_font_size_33, 33);
  118. s_advFontSizes.put(R.id.adv_font_size_34, 34);
  119. s_advFontSizes.put(R.id.adv_font_size_35, 35);
  120. s_advFontSizes.put(R.id.adv_font_size_36, 36);
  121. s_advFontSizes.put(R.id.adv_font_size_37, 37);
  122. s_advFontSizes.put(R.id.adv_font_size_38, 38);
  123. s_advFontSizes.put(R.id.adv_font_size_39, 39);
  124. s_advFontSizes.put(R.id.adv_font_size_40, 40);
  125.  
  126. /*
  127. * s_advBrightnessValues = new HashMap<Integer, Integer>();
  128. * s_advBrightnessValues.put(R.id.brightness_system, -1);
  129. * s_advBrightnessValues.put(R.id.brightness_10, 25);
  130. * s_advBrightnessValues.put(R.id.brightness_20, 50);
  131. * s_advBrightnessValues.put(R.id.brightness_30, 75);
  132. * s_advBrightnessValues.put(R.id.brightness_40, 100);
  133. * s_advBrightnessValues.put(R.id.brightness_50, 125);
  134. * s_advBrightnessValues.put(R.id.brightness_60, 150);
  135. * s_advBrightnessValues.put(R.id.brightness_70, 175);
  136. * s_advBrightnessValues.put(R.id.brightness_80, 200);
  137. * s_advBrightnessValues.put(R.id.brightness_90, 225);
  138. * s_advBrightnessValues.put(R.id.brightness_100, 250);
  139. */
  140.  
  141. s_contrastValues = new HashMap<Integer, Float>();
  142. s_contrastValues.put(R.id.contrast_normal, 0.0f);
  143. s_contrastValues.put(R.id.contrast_average, 0.15f);
  144. s_contrastValues.put(R.id.contrast_high, 0.25f);
  145. s_contrastValues.put(R.id.contrast_extra, 0.5f);
  146. s_contrastValues.put(R.id.contrast_super, 0.8f);
  147. s_contrastValues.put(R.id.contrast_idiot, 1.0f);
  148.  
  149. s_lineSpacings = new HashMap<Integer, Float>();
  150. // s_lineSpacings.put(R.id.adv_line_space_80, 0.8f);
  151. // s_lineSpacings.put(R.id.adv_line_space_85, 0.85f);
  152. s_lineSpacings.put(R.id.adv_line_space_90, 0.90f);
  153. s_lineSpacings.put(R.id.adv_line_space_95, 0.95f);
  154. s_lineSpacings.put(R.id.adv_line_space_100, 1f);
  155. s_lineSpacings.put(R.id.adv_line_space_105, 1.05f);
  156. s_lineSpacings.put(R.id.adv_line_space_110, 1.1f);
  157. s_lineSpacings.put(R.id.adv_line_space_115, 1.15f);
  158. s_lineSpacings.put(R.id.adv_line_space_120, 1.2f);
  159. s_lineSpacings.put(R.id.adv_line_space_125, 1.25f);
  160. s_lineSpacings.put(R.id.adv_line_space_130, 1.3f);
  161. s_lineSpacings.put(R.id.adv_line_space_135, 1.35f);
  162. s_lineSpacings.put(R.id.adv_line_space_140, 1.4f);
  163. s_lineSpacings.put(R.id.adv_line_space_145, 1.45f);
  164. s_lineSpacings.put(R.id.adv_line_space_150, 1.5f);
  165.  
  166. s_headerSizes = new HashMap<Integer, Integer>();
  167. s_headerSizes.put(R.id.header_off, 0);
  168. s_headerSizes.put(R.id.header_normal, 33);
  169. s_headerSizes.put(R.id.header_large, 45);
  170. s_headerSizes.put(R.id.header_small, 25);
  171. s_headerSizes.put(R.id.header_system, -1);
  172.  
  173. s_footerTypes = new HashMap<Integer, Integer>();
  174. s_footerTypes.put(R.id.footer_off, ReaderView.FOOTER_OFF);
  175. s_footerTypes.put(R.id.footer_flat, ReaderView.FOOTER_NORMAL);
  176. s_footerTypes.put(R.id.footer_ticks, ReaderView.FOOTER_TICKS);
  177.  
  178. s_refreshModes = new HashMap<Integer, Integer>();
  179. s_refreshModes.put(R.id.refresh_normal, ReaderView.REFRESH_NORMAL);
  180. // s_refreshModes.put(R.id.refresh_partial_2bit, ReaderView.REFRESH_A2);
  181. s_refreshModes.put(R.id.refresh_partial_4bit, ReaderView.REFRESH_G16);
  182. }
  183.  
  184. private CustomMenuView m_menuView;
  185. private ReaderView m_readerView;
  186. private LimitedFrameView m_menuDialog;
  187. private ViewGroup m_menuScreen;
  188. private ColorMenu m_colorMenu;
  189. private BordersMenu m_bordersMenu;
  190. private BrightnessMenu m_brightnessMenu;
  191. private GotoMenu m_gotoMenu;
  192.  
  193. private String m_fileName;
  194. private String m_filePath;
  195. // private boolean m_useDirectDraw;
  196. private UncaughtExceptionHandler m_exceptionHandler;
  197.  
  198. private List<FontData> m_internalFonts;
  199. private HashMap<String, FontInfo[]> m_externalFonts;
  200. private HashMap<Integer, String[]> m_fontFaces;
  201.  
  202. private BaseBook m_book;
  203.  
  204. // settings
  205. private int m_fontSize = 22;
  206. private String m_fontFace = "#internal";
  207. private int m_rotation = ReaderView.ORIENTATION_NORMAL;
  208. private boolean m_inverse = false;
  209. private float m_extraStroke = 0;
  210. private float m_lineSpace = 1.0f;
  211. private int m_reverseMode = REVERSE_NONE;
  212. private int m_brightness = 0;
  213. private int m_footer = ReaderView.FOOTER_TICKS;
  214. private int m_header = 33;
  215. private int m_touchMode = TOUCH_VERTICAL;
  216. private int m_textColor = 0xFF000000;
  217. private int m_backColor = 0xFFFFFFFF;
  218. private int m_refreshMode = 0;
  219. private int m_paddingLeft = 10;
  220. private int m_paddingTop = 5;
  221. private int m_paddingBottom = 5;
  222. private int m_paddingRight = 10;
  223.  
  224. private Context m_context = this; // this pointer for threads
  225.  
  226. public TextReader() {
  227. super("Text Reader");
  228. }
  229.  
  230. /** Called when the activity is first created. */
  231. @Override
  232. public void onCreate(Bundle savedInstanceState) {
  233. super.onCreate(savedInstanceState);
  234. Log.d("TextReader", "Starting intent " + getIntent());
  235. m_fontFaces = new HashMap<Integer, String[]>();
  236.  
  237. /*
  238. * runOnUiThread(new Runnable() {
  239. *
  240. * @Override public void run() {
  241. */
  242. Thread thread = new Thread() {
  243. @Override
  244. public void run() {
  245. init();
  246. }
  247. };
  248. thread.start();
  249. /*
  250. * } });
  251. */
  252.  
  253. if (!isNook && !isNookTouch && BaseActivity.SDKVersion >= 8) {
  254. Window window = getWindow();
  255. LayoutParams layoutParams = window.getAttributes();
  256. try {
  257. Field buttonBrightness = layoutParams.getClass().getField("buttonBrightness");
  258. buttonBrightness.set(layoutParams, 0);
  259. } catch (Exception e) {
  260. e.printStackTrace();
  261. }
  262. window.setAttributes(layoutParams);
  263. }
  264.  
  265. setContentView(R.layout.main);
  266.  
  267. FrameLayout eink = (FrameLayout) findViewById(R.id.eink);
  268. m_readerView = new ReaderView(this, eink, /* m_useDirectDraw, */isEpad ? 0.92f : 1.0f);
  269. m_readerView.setOnTouchListener(this);
  270.  
  271. // Log.d("TextReader", "Board is " + Build.MODEL);
  272.  
  273. // m_useDirectDraw = isNook && DirectDraw.isDirectDrawPossible();
  274.  
  275. // Log.d("TextReader", "Creating menu");
  276.  
  277. createMenu();
  278. }
  279.  
  280. private void scanFonts() {
  281. m_externalFonts = new HashMap<String, FontInfo[]>();
  282.  
  283. try {
  284. if (isNook) {
  285. FontInfo.scanPath("/system/media/sdcard/my fonts/", m_externalFonts);
  286. FontInfo.scanPath("/sdcard/my fonts/", m_externalFonts);
  287. } else {
  288. FontInfo.scanPath("/sdcard/fonts/", m_externalFonts);
  289. FontInfo.scanPath("/media/My Files/fonts/", m_externalFonts);
  290. FontInfo.scanPath("/media/fonts/", m_externalFonts);
  291. }
  292. } catch (Exception ex) {
  293. Log.e("TextReader", "Font seek failed: " + ex);
  294. ex.printStackTrace();
  295. }
  296.  
  297. if (m_fontFaces == null)
  298. m_fontFaces = new HashMap<Integer, String[]>();
  299.  
  300. m_fontFaces.put(R.id.font_name_internal, new String[] { "#internal", getString(R.string.internal_font) });
  301. m_fontFaces.put(R.id.font_name_zdroid, new String[] { "#serif", getString(R.string.droid) });
  302. m_fontFaces.put(R.id.font_name_zdroid_sans, new String[] { "#sans-serif", getString(R.string.droid_sans) });
  303.  
  304. int id = 0;
  305. for (Map.Entry<String, FontInfo[]> entry : m_externalFonts.entrySet()) {
  306. FontInfo[] infos = entry.getValue();
  307.  
  308. if (infos[FontInfo.NORMAL] == null) {
  309. Log.d("TextReader", "Skipped font: " + entry.getKey());
  310. continue;
  311. }
  312.  
  313. // Log.d("TextReader", "Got font: " + entry.getKey());
  314.  
  315. m_fontFaces.put(0x2000 | id, new String[] { entry.getKey(), infos[0].Name });
  316.  
  317. id++;
  318. }
  319. }
  320.  
  321. private void updateMenuSize() {
  322. DisplayMetrics dm = new DisplayMetrics();
  323. getWindowManager().getDefaultDisplay().getMetrics(dm);
  324.  
  325. int widthPadding = dm.widthPixels / 50;
  326. if (widthPadding < dm.density * 2)
  327. widthPadding = (int) (dm.density * 2);
  328.  
  329. float dpi = dm.density * 160;
  330.  
  331. float iwidth = (dm.widthPixels - widthPadding * 2) / dpi;
  332.  
  333. if (!isNookColor && iwidth > 4)
  334. widthPadding = (int) ((dm.widthPixels - 4 * dpi) / 2);
  335.  
  336. int heightPadding = dm.heightPixels / 25;
  337. if (heightPadding < dm.density * 4)
  338. heightPadding = (int) (dm.density * 4);
  339.  
  340. float iheight = (dm.heightPixels - heightPadding * 2) / dpi;
  341.  
  342. if (!isNookColor && iheight > 3)
  343. heightPadding = (int) ((dm.heightPixels - 3 * dpi) / 2);
  344.  
  345. if (widthPadding < 0)
  346. widthPadding = 0;
  347. if (widthPadding > dm.widthPixels / 3)
  348. widthPadding = dm.widthPixels / 3;
  349.  
  350. if (heightPadding < 0)
  351. heightPadding = 0;
  352. if (heightPadding > dm.heightPixels / 3)
  353. heightPadding = dm.heightPixels / 3;
  354.  
  355. m_menuDialog.setPadding(widthPadding, heightPadding, widthPadding, heightPadding);
  356.  
  357. m_menuDialog.setSize(-1, -1);
  358. }
  359.  
  360. private void createMenu() {
  361. m_menuScreen = (ViewGroup) findViewById(R.id.touchscreen);
  362. m_menuScreen.removeAllViews();
  363.  
  364. m_menuDialog = new LimitedFrameView(this, 480, 144);
  365. if (!isNook) {
  366. updateMenuSize();
  367. m_menuDialog.setVisibility(View.GONE);
  368.  
  369. DisplayMetrics dm = BaseActivity.DisplayMetrics;
  370.  
  371. if (dm.widthPixels * dm.heightPixels <= 153600) {
  372. s_fontSizes.put(R.id.font_size_xsmall, 12);
  373. s_fontSizes.put(R.id.font_size_small, 14);
  374. s_fontSizes.put(R.id.font_size_medium, 15);
  375. s_fontSizes.put(R.id.font_size_large, 16);
  376. s_fontSizes.put(R.id.font_size_xlarge, 18);
  377. m_fontSize = 14;
  378. }
  379. }
  380.  
  381. m_menuDialog.setOnTouchListener(this);
  382.  
  383. View menuFrame = LayoutInflater.from(this).inflate(R.layout.menu_dialog, m_menuDialog);
  384. View back = menuFrame.findViewById(R.id.backButton);
  385. if (back != null)
  386. back.setOnClickListener(this);
  387.  
  388. m_menuScreen.addView(m_menuDialog);
  389.  
  390. // Log.d("TextReader", "Initing xml menu");
  391. // android.os.Debug.startMethodTracing("/system/media/sdcard/textReader");
  392.  
  393. m_menuView = new TextReaderMenu(this, (FrameLayout) m_menuDialog.findViewById(R.id.dialog_content), R.xml.menu);
  394. m_menuView.setBackButtonListener(R.id.backButton, this);
  395. // m_menuView.setUpButtonListener(this);
  396. // m_menuView.setDownButtonListener(this);
  397. // m_menuView.setUpButtonLongListener(this);
  398. // m_menuView.setDownButtonLongListener(this);
  399. // m_menuView.setSelectButtonListener(this);
  400. m_menuView.setMenuListener(this);
  401.  
  402. m_menuView.setNavigatorVisibility(View.GONE);
  403.  
  404. /*
  405. * if (m_useDirectDraw) { m_exceptionHandler =
  406. * Thread.getDefaultUncaughtExceptionHandler();
  407. * Thread.setDefaultUncaughtExceptionHandler(this); }
  408. */
  409.  
  410. if (!isNook && !isNookTouch)
  411. m_colorMenu = new ColorMenu(this, m_menuView.getSubMenu(R.id.color_menu), m_textColor, m_backColor);
  412.  
  413. m_bordersMenu = new BordersMenu(m_menuView.getSubMenu(R.id.bounds_menu));
  414. m_bordersMenu.setOrientation(DisplayMetrics.widthPixels < DisplayMetrics.heightPixels);
  415.  
  416. if (isNook) {
  417. m_bordersMenu.setListener(this);
  418.  
  419. m_menuView.setMenuVisibility(R.id.rotation_180, View.GONE);
  420. m_menuView.setMenuVisibility(R.id.adv_settings_inverse, View.GONE);
  421. // m_menuView.setMenuVisibility(R.id.settings_inverse, View.GONE);
  422. // m_menuView.setMenuVisibility(R.id.main_exit, View.GONE);
  423. m_menuView.setMenuVisibility(R.id.main_library, View.GONE);
  424. m_menuView.setMenuVisibility(R.id.main_brightness, View.GONE);
  425. // m_menuView.setMenuVisibility(R.id.adv_settings_brightness,
  426. // View.GONE);
  427. m_menuView.setMenuVisibility(R.id.adv_settings_contrast, View.GONE);
  428. m_menuView.setMenuVisibility(R.id.adv_settings_touch, View.GONE);
  429. m_menuView.setMenuVisibility(R.id.settings_color, View.GONE);
  430. m_menuView.setMenuVisibility(R.id.adv_settings_refresh, View.GONE);
  431. } else if (isNookTouch) {
  432. m_menuView.setMenuVisibility(R.id.settings_color, View.GONE);
  433. m_menuView.setMenuVisibility(R.id.main_brightness, View.GONE);
  434. m_menuView.setMenuVisibility(R.id.adv_settings_contrast, View.GONE);
  435. m_menuView.setMenuVisibility(R.id.adv_settings_inverse, View.GONE);
  436. } else {
  437. m_menuView.setMenuVisibility(R.id.settings_contrast, View.GONE);
  438. m_menuView.setMenuVisibility(R.id.adv_settings_contrast, View.VISIBLE);
  439. m_menuView.setMenuVisibility(R.id.adv_settings_refresh, View.GONE);
  440. }
  441.  
  442. if (!isNook) {
  443. ViewGroup brightnessDialog = new FrameLayout(this);
  444. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(-1, -2);
  445. params.gravity = Gravity.CENTER;
  446. brightnessDialog.setLayoutParams(params);
  447. LayoutInflater.from(this).inflate(R.layout.brightness_view, brightnessDialog);
  448. m_menuScreen.addView(brightnessDialog);
  449.  
  450. m_brightnessMenu = new BrightnessMenu(brightnessDialog);
  451. m_brightnessMenu.setBrightnessChangeListener(this);
  452. m_brightnessMenu.hide();
  453.  
  454. }
  455. {
  456. ViewGroup gotoDialog = new FrameLayout(this);
  457. FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(-1, -2);
  458. params.gravity = Gravity.CENTER;
  459. gotoDialog.setLayoutParams(params);
  460. LayoutInflater.from(this).inflate(R.layout.goto_page_view, gotoDialog);
  461. if (isNook)
  462. ((FrameLayout) m_menuDialog.findViewById(R.id.dialog_content)).addView(gotoDialog);
  463. else
  464. m_menuScreen.addView(gotoDialog);
  465.  
  466. m_gotoMenu = new GotoMenu(gotoDialog, BaseActivity.isNook ? m_menuView : null);
  467. m_gotoMenu.setPageChangeListener(this);
  468. m_gotoMenu.hide();
  469. }
  470.  
  471. // m_menuView.setMenuEnabled(R.id.goto_page, false);
  472.  
  473. m_menuView.setMenuEnabled(R.id.main_goto, false);
  474. m_menuView.setMenuEnabled(R.id.main_settings, false);
  475.  
  476. // android.os.Debug.stopMethodTracing();
  477. // DirectDraw.setEnableValue("3");
  478. }
  479.  
  480. @Override
  481. protected void onNewIntent(Intent intent) {
  482. Log.d("TextReader", "Got new intent " + intent);
  483. super.onNewIntent(intent);
  484.  
  485. setIntent(intent);
  486.  
  487. if (intent != null) {
  488. Uri uri = intent.getData();
  489. if (uri != null) {
  490. String fileName = uri.getLastPathSegment();
  491. String filePath = uri.getLastPathSegment();
  492. if (!filePath.equals(m_filePath)) {
  493. m_fileName = fileName;
  494. m_filePath = uri.getPath();
  495. } else
  496. return;
  497. } else
  498. return;
  499. }
  500.  
  501. m_readerView.clear();
  502.  
  503. runOnUiThread(new Runnable() {
  504. @Override
  505. public void run() {
  506. init();
  507. }
  508. });
  509. }
  510.  
  511. private void init() {
  512. Intent intent = getIntent();
  513.  
  514. if (intent != null) {
  515. Uri uri = intent.getData();
  516. if (uri != null) {
  517. String fileName = uri.getLastPathSegment();
  518. String filePath = uri.getLastPathSegment();
  519. if (!filePath.equals(m_filePath)) {
  520. m_fileName = fileName;
  521. m_filePath = uri.getPath();
  522. } else
  523. return;
  524. } else
  525. return;
  526. }
  527.  
  528. File file = new File(m_filePath);
  529.  
  530. if (!file.exists())
  531. return;
  532.  
  533. Log.d("TextReader", "Processing file " + m_filePath);
  534.  
  535. String lowerName = m_fileName.toLowerCase();
  536.  
  537. if (lowerName.endsWith(".epub")) {
  538. m_book = new EpubBook(m_filePath);
  539. } else if (lowerName.endsWith(".fb2") || lowerName.endsWith(".fb2.zip")) {
  540. m_book = new Fb2Book(m_filePath);
  541. } else if (lowerName.endsWith(".xhtml") || lowerName.endsWith(".html") || lowerName.endsWith(".htm")) {
  542. m_book = new HtmlBook(m_filePath);
  543. } else {
  544. // TODO: unknown book!
  545. return;
  546. }
  547.  
  548. /*
  549. * String cacheFile = getCacheDir() + "/cache.nbr"; boolean inited =
  550. * false;
  551. *
  552. * if (BaseBook.checkFile(cacheFile, file.getName(), file.length())) {
  553. * if (m_book.deserialize(cacheFile)) { Log.d("TextReader",
  554. * "Got cached book for file " + file.getName()); inited = true; } }
  555. *
  556. * if (!inited)
  557. */
  558. {
  559. // android.os.Debug.startMethodTracing("textReader");
  560.  
  561. if (!m_book.init(getCacheDir().getAbsolutePath())) {
  562. runOnUiThread(new Runnable() {
  563. @Override
  564. public void run() {
  565. m_menuScreen.setVisibility(View.GONE);
  566. new AlertDialog.Builder(m_context).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.invalid_book_title).setMessage(R.string.invalid_book).setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() {
  567. @Override
  568. public void onClick(DialogInterface dialog, int which) {
  569. m_menuScreen.setVisibility(View.VISIBLE);
  570. uncaughtException(null, null);
  571. goBack();
  572.  
  573. }
  574. }).show();
  575. }
  576. });
  577. return;
  578. }
  579. // m_book.serialize(cacheFile, file.getName(), file.length());
  580. // Log.d("TextReader", "Saved cached book for file " +
  581. // file.getName());
  582.  
  583. // android.os.Debug.stopMethodTracing();
  584. }
  585.  
  586. // try
  587. // {
  588. // File bitmapsDir = new File(getCacheDir() + "/bitmaps/");
  589. // bitmapsDir.createNewFile();
  590.  
  591. // for(ImageData data: m_book.getImages())
  592. // data.init(getCacheDir().getAbsolutePath());
  593. // }
  594. // catch(Exception ex)
  595. // {
  596. // Log.d("TextReader", "Failed to init bitmap cache");
  597. // }
  598.  
  599. runOnUiThread(new Runnable() {
  600. @Override
  601. public void run() {
  602. postInit();
  603. }
  604. });
  605. }
  606.  
  607. private void postInit() {
  608. long start = System.currentTimeMillis();
  609.  
  610. long[] pos = new long[] { 0, -1 };
  611.  
  612. loadSettings(pos);
  613.  
  614. if (m_header != -1)
  615. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  616. else
  617. getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  618.  
  619. if (!isNook && !isNookTouch) {
  620. updateBrightness();
  621.  
  622. if (m_colorMenu != null) {
  623. m_colorMenu.setColors(m_textColor, m_backColor);
  624. m_colorMenu.setInverse(m_inverse);
  625. }
  626. }
  627.  
  628. m_bordersMenu.setBorders(m_paddingTop, m_paddingLeft, m_paddingBottom, m_paddingRight);
  629.  
  630. if (m_fontFaces != null)
  631. m_fontFaces.clear();
  632. if (m_fontFace.length() > 0 && m_fontFace.charAt(0) != '#')
  633. scanFonts();
  634.  
  635. m_internalFonts = m_book.getFonts();
  636.  
  637. if (m_fontFace.equals("#internal") && (m_internalFonts == null || m_internalFonts.size() == 0))
  638. m_fontFace = "#serif";
  639.  
  640. updateFonts();
  641.  
  642. List<Pair<String, Float>> chapterPositions = new ArrayList<Pair<String, Float>>(m_book.getChapters().size());
  643. try {
  644. for (Pair<Long, String> chapter : m_book.getChapters()) {
  645. long cpos = chapter.first;
  646. float percent = m_book.getReader().getPercent(cpos);
  647. chapterPositions.add(new Pair<String, Float>(chapter.second, percent));
  648. }
  649. } catch (Exception ex) {
  650. Log.e("TextReader", "Error parsing chapters " + ex);
  651. }
  652.  
  653. m_readerView.init(m_book.getReader(), pos[0], (int) pos[1], chapterPositions, m_book.getStyles(), m_book.getImages(), m_book.getNotes());
  654.  
  655. // visual sugar - chapters, goto menu, settings menu
  656.  
  657. /*
  658. * m_readerView.postDelayed(new Runnable() { public void run() { long
  659. * start = System.currentTimeMillis();
  660. *
  661. * //createMenu();
  662. */
  663. Thread thread = new Thread() {
  664. @Override
  665. public void run() {
  666. if (m_fontFaces == null || m_fontFaces.size() == 0)
  667. scanFonts();
  668.  
  669. runOnUiThread(new Runnable() {
  670. @Override
  671. public void run() {
  672. long start = System.currentTimeMillis();
  673.  
  674. updateMenu(m_book.getChapters(), m_internalFonts != null && m_internalFonts.size() > 0);
  675.  
  676. m_gotoMenu.initChapters(m_readerView.getChapters());
  677. m_menuView.setMenuEnabled(R.id.main_goto, true);
  678. updateSettingsMenu();
  679. m_menuView.setMenuEnabled(R.id.main_settings, true);
  680.  
  681. m_menuView.setMenuEnabled(R.id.goto_page, true);
  682.  
  683. Log.d("TextReader", "Goto & settings init took " + (System.currentTimeMillis() - start));
  684. };
  685. });
  686.  
  687. };
  688. };
  689. thread.start();
  690.  
  691. /*
  692. * Log.d("TextReader", "Initial menu creation took " +
  693. * (System.currentTimeMillis() - start)); } }, 1000);
  694. */
  695.  
  696. Log.d("TextReader", "Post init " + (System.currentTimeMillis() - start));
  697.  
  698. if (isNookTouch) {
  699. try {
  700. Bundle bundle = new Bundle();
  701. bundle.putString("product_details_ean", "'" + m_book.getTitle() + "'");
  702. bundle.putInt("read_share_status_page", m_readerView.getPageNumber());
  703. bundle.putInt("read_share_status_page", (int) m_book.getReader().getPercent(m_readerView.getPosition()));
  704.  
  705. Intent intent = new Intent();
  706. intent.setAction("com.encore.intent.action.share.reading.status");
  707. intent.setFlags(0x400);
  708. intent.putExtras(bundle);
  709. startActivity(intent);
  710. } catch (Exception ex) {
  711. ex.printStackTrace();
  712. }
  713. }
  714.  
  715. // Log.d("TextReader", "Post init " + (System.currentTimeMillis() -
  716. // start));
  717. // m_readerView.doInvalidate();
  718. }
  719.  
  720. private void loadSettings(long[] pos) {
  721. long position = 0;
  722. int page = 1;
  723.  
  724. DBSettings settings = new DBSettings(this);
  725.  
  726. String bookKey = "book:" + m_filePath;
  727. String positionString = settings.getString(bookKey, "");
  728.  
  729. try {
  730. if (positionString.length() > 0) {
  731. Log.d("TextReader", "Loadeded position string " + positionString + " for key " + bookKey);
  732. String[] positions = positionString.split(":");
  733.  
  734. if (positions.length >= 2) {
  735. position = Long.parseLong(positions[0].trim());
  736. page = Integer.parseInt(positions[1].trim());
  737. }
  738. }
  739. } catch (Exception ex) {
  740. ex.printStackTrace();
  741. }
  742.  
  743. m_fontFace = settings.getString("font", m_fontFace);
  744. m_fontSize = settings.getInt("fontSize", m_fontSize);
  745. m_rotation = settings.getInt("rotation", m_rotation);
  746. m_extraStroke = settings.getFloat("extraStroke", m_extraStroke);
  747. m_inverse = settings.getBoolean("inverse", m_inverse);
  748. m_lineSpace = settings.getFloat("lineSpace", m_lineSpace);
  749. m_reverseMode = settings.getInt("reverseMode", m_reverseMode);
  750. m_brightness = settings.getInt("brightness", m_brightness);
  751. m_header = settings.getInt("header", m_header);
  752. m_footer = settings.getInt("footer", m_footer);
  753. m_touchMode = settings.getInt("touchMode", m_touchMode);
  754. m_textColor = settings.getInt("textColor", m_textColor);
  755. m_backColor = settings.getInt("backColor", m_backColor);
  756. m_refreshMode = settings.getInt("refreshMode", m_refreshMode);
  757. m_paddingLeft = settings.getInt("paddingLeft", m_paddingLeft);
  758. m_paddingTop = settings.getInt("paddingTop", m_paddingTop);
  759. m_paddingRight = settings.getInt("paddingRight", m_paddingRight);
  760. m_paddingBottom = settings.getInt("paddingBottom", m_paddingBottom);
  761.  
  762. // Log.d("TextReader", "Loading settings: " + settings.getAll());
  763. pos[0] = position;
  764. pos[1] = page;
  765.  
  766. settings.close();
  767. }
  768.  
  769. private void saveSettings() {
  770. // SharedPreferences settings = getSharedPreferences("TextReader", 0);
  771. Thread thread = new Thread() {
  772. @Override
  773. public void run() {
  774. doSaveSettings();
  775. }
  776. };
  777. thread.start();
  778.  
  779. }
  780.  
  781. private void doSaveSettings() {
  782. if (isClean) {
  783. return;
  784. }
  785. try {
  786. DBSettings settings = new DBSettings(m_context, true);
  787.  
  788. settings.delete("positions");
  789.  
  790. if (m_readerView != null && m_readerView.getPosition() != -1) // not
  791. // yet
  792. // inited
  793. {
  794. String bookKey = "book:" + m_filePath;
  795. String positionString = Long.toString(m_readerView.getPosition()) + ":" + Integer.toString(m_readerView.getPageNumber()) + ":0";
  796. settings.putString(bookKey, positionString);
  797. Log.d("TextReader", "Saving position string: " + positionString + " for key " + bookKey);
  798. }
  799.  
  800. settings.putString("font", m_fontFace);
  801. settings.putInt("fontSize", m_fontSize);
  802. settings.putInt("rotation", m_rotation);
  803. settings.putFloat("extraStroke", m_extraStroke);
  804. settings.putBoolean("inverse", m_inverse);
  805. settings.putFloat("lineSpace", m_lineSpace);
  806. settings.putInt("reverseMode", m_reverseMode);
  807. if (m_book != null && m_book.getReader() != null) {
  808. settings.putString("readingNow", m_filePath);
  809. } else {
  810. settings.putString("readingNow", "");
  811. }
  812. settings.putInt("brightness", m_brightness);
  813. settings.putInt("header", m_header);
  814. settings.putInt("footer", m_footer);
  815. settings.putInt("touchMode", m_touchMode);
  816. settings.putInt("textColor", m_textColor);
  817. settings.putInt("backColor", m_backColor);
  818. settings.putInt("refreshMode", m_refreshMode);
  819. settings.putInt("paddingLeft", m_paddingLeft);
  820. settings.putInt("paddingTop", m_paddingTop);
  821. settings.putInt("paddingRight", m_paddingRight);
  822. settings.putInt("paddingBottom", m_paddingBottom);
  823. settings.putInt("lastApplication", 1);
  824.  
  825. // Log.d("TextReader", "Saving Positions: " + positionString);
  826.  
  827. // editor.commit();
  828.  
  829. // Log.d("TextReader", "Saving settings: " + settings.getAll());
  830. settings.close();
  831. } catch (Exception ex) {
  832. ex.printStackTrace();
  833. }
  834. }
  835.  
  836. private String lookupFont(List<FontData> internalFonts, String... names) {
  837. FontData fontData = null;
  838.  
  839. for (int i = 0; i < internalFonts.size(); i++) {
  840. FontData data = internalFonts.get(i);
  841. String name = data.getName().toLowerCase();
  842.  
  843. if (names.length == 0 && name.indexOf("-") == -1 && name.indexOf("_") == -1) {
  844. fontData = data;
  845. break;
  846. }
  847.  
  848. for (int j = 0; j < names.length; j++)
  849. if (name.contains(names[j])) {
  850. fontData = data;
  851. break;
  852. }
  853.  
  854. if (fontData != null)
  855. break;
  856. }
  857.  
  858. if (fontData == null)
  859. return null;
  860. // fontData = internalFonts.get(0);
  861.  
  862. return fontData.extractFont(getCacheDir().getAbsolutePath());
  863. }
  864.  
  865. private static Object addAssetPath(AssetManager manager, String path) {
  866. if (s_fontPaths.containsKey(path))
  867. return null;
  868.  
  869. try {
  870. Method method = AssetManager.class.getMethod("addAssetPath", String.class);
  871. Object result = method.invoke(manager, path);
  872. s_fontPaths.put(path, "");
  873. return result;
  874. } catch (Exception ex) {
  875. // TODO Auto-generated catch block
  876. ex.printStackTrace();
  877. }
  878. return null;
  879. }
  880.  
  881. private static Typeface createFromAsset(AssetManager assets, String name) {
  882. try {
  883. return Typeface.createFromAsset(assets, name);
  884. } catch (Exception ex) {
  885. ex.printStackTrace();
  886. }
  887. return null;
  888. }
  889.  
  890. private void updateFonts() {
  891. Typeface normal = null;
  892. Typeface bold = null;
  893. Typeface italic = null;
  894. Typeface boldItalic = null;
  895.  
  896. AssetManager assets = getAssets();
  897.  
  898. // Log.d("TextReader", "Setting font " + m_fontFace);
  899.  
  900. if (!m_fontFace.startsWith("#") && m_externalFonts != null && m_externalFonts.containsKey(m_fontFace) && m_externalFonts.get(m_fontFace)[FontInfo.NORMAL] != null) {
  901. FontInfo[] infos = m_externalFonts.get(m_fontFace);
  902.  
  903. if (infos[FontInfo.NORMAL] != null) {
  904. addAssetPath(assets, infos[FontInfo.NORMAL].Path);
  905. normal = createFromAsset(assets, infos[FontInfo.NORMAL].File);
  906. }
  907.  
  908. if (infos[FontInfo.BOLD] != null) {
  909. addAssetPath(assets, infos[FontInfo.BOLD].Path);
  910. bold = createFromAsset(assets, infos[FontInfo.BOLD].File);
  911. }
  912.  
  913. if (infos[FontInfo.BOLD_ITALIC] != null) {
  914. addAssetPath(assets, infos[FontInfo.BOLD_ITALIC].Path);
  915. boldItalic = createFromAsset(assets, infos[FontInfo.BOLD_ITALIC].File);
  916. }
  917.  
  918. if (infos[FontInfo.ITALIC] != null) {
  919. addAssetPath(assets, infos[FontInfo.ITALIC].Path);
  920. italic = createFromAsset(assets, infos[FontInfo.ITALIC].File);
  921. }
  922.  
  923. if (normal == null)
  924. normal = Typeface.SERIF;
  925. if (bold == null) {
  926. bold = Typeface.create(normal, Typeface.BOLD);
  927. if (bold == null)
  928. bold = normal;
  929. }
  930. if (italic == null) {
  931. italic = Typeface.create(normal, Typeface.ITALIC);
  932. if (italic == null)
  933. italic = normal;
  934. }
  935. if (boldItalic == null) {
  936. boldItalic = Typeface.create(normal, Typeface.BOLD_ITALIC);
  937. if (boldItalic == null)
  938. boldItalic = italic;
  939. }
  940. } else if (m_fontFace.equals("#internal") && m_internalFonts != null && m_internalFonts.size() > 0) {
  941. addAssetPath(assets, getCacheDir().getAbsolutePath() + "/");
  942.  
  943. String normalFile = lookupFont(m_internalFonts, "-regular", "-normal", "regular", "normal");
  944.  
  945. if (normalFile == null)
  946. normalFile = lookupFont(m_internalFonts); // no suffix
  947.  
  948. if (normalFile != null) {
  949. normal = createFromAsset(assets, normalFile);
  950. }
  951.  
  952. if (normal == null)
  953. normal = Typeface.SERIF;
  954.  
  955. String italicFile = lookupFont(m_internalFonts, "-italic", "-oblique", "-it");
  956.  
  957. if (italicFile != null) {
  958. italic = createFromAsset(assets, italicFile);
  959. }
  960.  
  961. if (italic == null) {
  962. italic = Typeface.create(normal, Typeface.ITALIC);
  963. if (italic == null)
  964. italic = normal;
  965. }
  966.  
  967. String boldFile = lookupFont(m_internalFonts, "-bold", "-semibold");
  968. if (boldFile != null) {
  969. bold = createFromAsset(assets, boldFile);
  970. }
  971.  
  972. if (bold == null) {
  973. bold = Typeface.create(normal, Typeface.BOLD);
  974. if (bold == null)
  975. bold = normal;
  976. }
  977.  
  978. String boldItalicFile = lookupFont(m_internalFonts, "-bolditalic", "-semibolditalic", "-boldoblique", "-semiboldit");
  979.  
  980. if (boldItalicFile != null) {
  981. boldItalic = createFromAsset(assets, boldItalicFile);
  982. }
  983.  
  984. if (boldItalic == null) {
  985. boldItalic = Typeface.create(normal, Typeface.BOLD_ITALIC);
  986. if (boldItalic == null)
  987. boldItalic = italic;
  988. }
  989.  
  990. } else { // built-in fonts
  991. normal = Typeface.create(m_fontFace.startsWith("#") ? m_fontFace.substring(1) : m_fontFace, Typeface.NORMAL);
  992.  
  993. if (normal == null) {
  994. normal = Typeface.SERIF;
  995. m_fontFace = "#serif";
  996. }
  997.  
  998. bold = Typeface.create(normal, Typeface.BOLD);
  999. if (bold == null)
  1000. bold = normal;
  1001.  
  1002. italic = Typeface.create(normal, Typeface.ITALIC);
  1003. if (italic == null)
  1004. italic = normal;
  1005.  
  1006. boldItalic = Typeface.create(normal, Typeface.BOLD_ITALIC);
  1007. if (boldItalic == null)
  1008. boldItalic = italic;
  1009. }
  1010.  
  1011. m_readerView.initFonts(m_fontSize, normal, bold, italic, boldItalic, m_rotation, m_extraStroke, m_inverse, m_textColor, m_backColor, m_lineSpace, m_book.getFirstLine() * m_fontSize / 30, m_header, m_footer, m_refreshMode, m_paddingLeft, m_paddingTop, m_paddingRight,
  1012. m_paddingBottom);
  1013. }
  1014.  
  1015. private void updateSettings(boolean reset) {
  1016. m_readerView.changeSettings(m_extraStroke, m_rotation, m_header, m_footer, m_inverse, m_textColor, m_backColor, m_refreshMode, reset);
  1017. }
  1018.  
  1019. private void updateSettingsMenu() {
  1020. for (Map.Entry<Integer, Integer> entry : s_fontSizes.entrySet()) {
  1021. boolean checked = entry.getValue() == m_fontSize;
  1022. m_menuView.setMenuChecked(entry.getKey(), checked);
  1023.  
  1024. if (checked)
  1025. m_menuView.setMenuValueEx(R.id.settings_font_size, entry.getKey());
  1026. }
  1027.  
  1028. for (Map.Entry<Integer, Integer> entry : s_headerSizes.entrySet()) {
  1029. boolean checked = entry.getValue() == m_header;
  1030. m_menuView.setMenuChecked(entry.getKey(), checked);
  1031.  
  1032. if (checked)
  1033. m_menuView.setMenuValueEx(R.id.adv_settings_header, entry.getKey());
  1034. }
  1035.  
  1036. for (Map.Entry<Integer, Integer> entry : s_footerTypes.entrySet()) {
  1037. boolean checked = entry.getValue() == m_footer;
  1038. m_menuView.setMenuChecked(entry.getKey(), checked);
  1039.  
  1040. if (checked)
  1041. m_menuView.setMenuValueEx(R.id.adv_settings_footer, entry.getKey());
  1042. }
  1043.  
  1044. for (Map.Entry<Integer, Integer> entry : s_refreshModes.entrySet()) {
  1045. boolean checked = entry.getValue() == m_refreshMode;
  1046. m_menuView.setMenuChecked(entry.getKey(), checked);
  1047.  
  1048. if (checked)
  1049. m_menuView.setMenuValueEx(R.id.adv_settings_refresh, entry.getKey());
  1050. }
  1051.  
  1052. for (Map.Entry<Integer, Integer> entry : s_advFontSizes.entrySet()) {
  1053. boolean checked = entry.getValue() == m_fontSize;
  1054. m_menuView.setMenuChecked(entry.getKey(), checked);
  1055.  
  1056. if (checked)
  1057. m_menuView.setMenuValueEx(R.id.adv_settings_font_size, entry.getKey());
  1058. }
  1059.  
  1060. /*
  1061. * for (Map.Entry<Integer, Integer> entry :
  1062. * s_advBrightnessValues.entrySet()) { boolean checked =
  1063. * entry.getValue() == m_brightness;
  1064. * m_menuView.setMenuChecked(entry.getKey(), checked);
  1065. *
  1066. * if (checked) m_menuView.setMenuValueEx(R.id.adv_settings_brightness,
  1067. * entry.getKey()); }
  1068. */
  1069.  
  1070. for (Map.Entry<Integer, String[]> entry : m_fontFaces.entrySet()) {
  1071. boolean checked = m_fontFace.equals(entry.getValue()[0]);
  1072. m_menuView.setMenuChecked(entry.getKey(), checked);
  1073.  
  1074. if (checked) {
  1075. m_menuView.setMenuValueEx(R.id.settings_font_name, entry.getKey());
  1076. m_menuView.setMenuValueEx(R.id.adv_settings_font_name, entry.getKey());
  1077. }
  1078. }
  1079.  
  1080. for (Map.Entry<Integer, Float> entry : s_lineSpacings.entrySet()) {
  1081. boolean checked = Math.abs(entry.getValue() - m_lineSpace) < 0.01f;
  1082. m_menuView.setMenuChecked(entry.getKey(), checked);
  1083.  
  1084. if (checked)
  1085. m_menuView.setMenuValueEx(R.id.adv_settings_line_space, entry.getKey());
  1086. }
  1087.  
  1088. for (Map.Entry<Integer, Float> entry : s_contrastValues.entrySet()) {
  1089. boolean checked = Math.abs(entry.getValue() - m_extraStroke) < 0.01f;
  1090. m_menuView.setMenuChecked(entry.getKey(), checked);
  1091.  
  1092. if (checked) {
  1093. m_menuView.setMenuValueEx(R.id.settings_contrast, entry.getKey());
  1094. m_menuView.setMenuValueEx(R.id.adv_settings_contrast, entry.getKey());
  1095. // break;
  1096. }
  1097. }
  1098.  
  1099. int rotationMenu = 0;
  1100. int rotationId = 0;
  1101.  
  1102. switch (m_rotation) {
  1103. case ReaderView.ORIENTATION_NORMAL:
  1104. rotationId = R.string.rotation_normal;
  1105. rotationMenu = R.id.rotation_normal;
  1106. break;
  1107. case ReaderView.ORIENTATION_CW:
  1108. rotationId = R.string.rotation_cw;
  1109. rotationMenu = R.id.rotation_cw;
  1110. break;
  1111. case ReaderView.ORIENTATION_CCW:
  1112. rotationId = R.string.rotation_ccw;
  1113. rotationMenu = R.id.rotation_ccw;
  1114. break;
  1115. case ReaderView.ORIENTATION_180:
  1116. rotationId = R.string.rotation_180;
  1117. rotationMenu = R.id.rotation_180;
  1118. break;
  1119. }
  1120.  
  1121. if (rotationId != 0) {
  1122. m_menuView.setMenuValue(R.id.settings_rotation, rotationId);
  1123. // m_menuView.setMenuValue(R.id.adv_settings_rotation, rotationId);
  1124. }
  1125.  
  1126. m_menuView.setMenuChecked(R.id.rotation_normal, false);
  1127. m_menuView.setMenuChecked(R.id.rotation_cw, false);
  1128. m_menuView.setMenuChecked(R.id.rotation_ccw, false);
  1129. m_menuView.setMenuChecked(R.id.rotation_180, false);
  1130. if (rotationMenu != 0)
  1131. m_menuView.setMenuChecked(rotationMenu, true);
  1132.  
  1133. // m_menuView.setMenuValue(R.id.settings_inverse, m_inverse ?
  1134. // R.string.inverse_on : R.string.inverse_off);
  1135. m_menuView.setMenuValue(R.id.adv_settings_inverse, m_inverse ? R.string.inverse_on : R.string.inverse_off);
  1136. // m_menuView.setMenuChecked(R.id.inverse_off, !m_inverse);
  1137. // m_menuView.setMenuChecked(R.id.inverse_on, m_inverse);
  1138.  
  1139. m_menuView.setMenuValue(R.id.adv_settings_touch, m_touchMode == TOUCH_VERTICAL ? R.string.touch_vert : R.string.touch_horiz);
  1140.  
  1141. switch (m_reverseMode) {
  1142. case REVERSE_NONE:
  1143. m_menuView.setMenuValue(R.id.adv_settings_reverse, R.string.reverse_off);
  1144. break;
  1145. case REVERSE_ALWAYS:
  1146. m_menuView.setMenuValue(R.id.adv_settings_reverse, R.string.reverse_on);
  1147. break;
  1148. case REVERSE_LANDSCAPE:
  1149. m_menuView.setMenuValue(R.id.adv_settings_reverse, R.string.reverse_landscape);
  1150. break;
  1151. }
  1152.  
  1153. saveSettings();
  1154. }
  1155.  
  1156. @Override
  1157. protected void onResume() {
  1158. super.onResume();
  1159.  
  1160. // Log.d("TextReader", "Got on resume, intent " + getIntent());
  1161.  
  1162. // init();
  1163.  
  1164. /*
  1165. * Intent intent = getIntent();
  1166. *
  1167. * if (intent != null && Intent.ACTION_VIEW.equals(intent.getAction()))
  1168. * { Uri uri = intent.getData(); if (uri != null) { String fileName =
  1169. * uri.getLastPathSegment(); if (!fileName.equals(m_fileName)) {
  1170. * this.res } } }
  1171. */
  1172.  
  1173. if (m_header != -1)
  1174. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1175.  
  1176. m_readerView.resume();
  1177.  
  1178. // DirectDraw.doInvalidate(m_readerView);
  1179. /*
  1180. * if (m_useDirectDraw) { DirectDraw.invalidate();
  1181. * m_readerView.doInvalidate(); }
  1182. */
  1183. }
  1184.  
  1185. @Override
  1186. protected void onPause() {
  1187. doSaveSettings();
  1188. super.onPause();
  1189.  
  1190. if (m_header != -1)
  1191. getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1192.  
  1193. // DirectDraw.cancelInvalidate();
  1194. /*
  1195. * if (m_useDirectDraw) DirectDraw.cancelInvalidate();
  1196. */
  1197. m_readerView.pause(); // free pages memory
  1198. }
  1199.  
  1200. /*
  1201. * private void checkExternalFont(int id) { if (s_fontFaces.containsKey(id))
  1202. * { FontInfo info = (FontInfo)s_fontFaces.get(id);
  1203. *
  1204. * Typeface font = Typeface.create(info.Path, Typeface.NORMAL); if (font !=
  1205. * null) { // String fontName = font.toString(); m_menuView.setMenuValue(id,
  1206. * info.Name); m_menuView.setMenuVisibility(id, View.VISIBLE); return; } }
  1207. *
  1208. * m_menuView.setMenuVisibility(id, View.GONE); }
  1209. */
  1210.  
  1211. private void updateMenu(List<Pair<Long, String>> chapters, boolean internalFonts) {
  1212. { // chapters
  1213. m_menuView.removeSubMenu(R.id.goto_chapter_menu);
  1214.  
  1215. ArrayList<MenuItem> items = new ArrayList<MenuItem>(chapters.size());
  1216.  
  1217. for (int i = 0; i < chapters.size(); i++) {
  1218. Pair<Long, String> entry = chapters.get(i);
  1219. MenuItem item = new MenuItem(0x1000 | i, 0, 0, entry.second);
  1220. item.setTag(entry.first);
  1221. items.add(item);
  1222. }
  1223. MenuData data = new MenuData(R.id.goto_chapter_menu, 0, items);
  1224.  
  1225. m_menuView.addSubMenu(R.id.goto_chapter_menu, data);
  1226. }
  1227.  
  1228. { // fonts
  1229. m_menuView.removeSubMenu(R.id.font_name_menu);
  1230.  
  1231. ArrayList<MenuItem> items = new ArrayList<MenuItem>(m_fontFaces.size());
  1232.  
  1233. for (Map.Entry<Integer, String[]> entry : m_fontFaces.entrySet()) {
  1234. items.add(new MenuItem(entry.getKey(), 0, 0, entry.getValue()[1]));
  1235. }
  1236.  
  1237. Collections.sort(items, new Comparator<MenuItem>() {
  1238. @Override
  1239. public int compare(MenuItem one, MenuItem another) {
  1240. return new Integer(one.getId()).compareTo(another.getId());
  1241. }
  1242. });
  1243.  
  1244. MenuData data = new MenuData(R.id.font_name_menu, 0, items);
  1245.  
  1246. m_menuView.addSubMenu(R.id.font_name_menu, data);
  1247.  
  1248. m_menuView.setMenuVisibility(R.id.font_name_internal, internalFonts ? View.VISIBLE : View.GONE);
  1249. }
  1250. }
  1251.  
  1252. private void hideMenu() {
  1253. m_readerView.setOverlayView(null);
  1254. m_menuDialog.setVisibility(View.GONE);
  1255. m_brightnessMenu.hide();
  1256. m_gotoMenu.hide();
  1257. m_menuScreen.setBackgroundColor(0);
  1258.  
  1259. if (m_colorMenu != null) {
  1260. int backColor = m_inverse ? m_colorMenu.getTextColor() : m_colorMenu.getBackColor();
  1261. int textColor = m_inverse ? m_colorMenu.getBackColor() : m_colorMenu.getTextColor();
  1262.  
  1263. if (backColor != m_backColor || textColor != m_textColor) {
  1264. m_backColor = backColor;
  1265. m_textColor = textColor;
  1266.  
  1267. updateSettings(false);
  1268. }
  1269. }
  1270.  
  1271. int paddingLeft = m_bordersMenu.getLeft();
  1272. int paddingRight = m_bordersMenu.getRight();
  1273. int paddingTop = m_bordersMenu.getTop();
  1274. int paddingBottom = m_bordersMenu.getBottom();
  1275.  
  1276. if (paddingLeft != m_paddingLeft || paddingRight != m_paddingRight || paddingTop != m_paddingTop || paddingBottom != m_paddingBottom) {
  1277. m_paddingTop = paddingTop;
  1278. m_paddingLeft = paddingLeft;
  1279. m_paddingRight = paddingRight;
  1280. m_paddingBottom = paddingBottom;
  1281.  
  1282. updateFonts();
  1283. }
  1284.  
  1285. saveSettings();
  1286.  
  1287. m_menuScreen.setOnTouchListener(null);
  1288. }
  1289.  
  1290. private void showMenu() {
  1291. m_readerView.setOverlayView(m_menuDialog);
  1292. m_menuDialog.setVisibility(View.VISIBLE);
  1293. m_menuScreen.setBackgroundColor(0x40000000);
  1294. m_menuScreen.setOnTouchListener(this);
  1295. }
  1296.  
  1297. private boolean isMenuVisible() {
  1298. return (m_menuDialog.getVisibility() == View.VISIBLE || (m_brightnessMenu != null && m_brightnessMenu.isVisible()) || (m_gotoMenu != null && m_gotoMenu.isVisible()));
  1299. }
  1300.  
  1301. private void showBrightnessMenu() {
  1302. m_menuDialog.setVisibility(View.GONE);
  1303. m_readerView.setOverlayView(m_brightnessMenu.getView());
  1304. m_brightnessMenu.show(m_brightness);
  1305. m_menuScreen.setBackgroundColor(0);
  1306. }
  1307.  
  1308. private void showGotoMenu() {
  1309. m_gotoMenu.show(m_readerView.getPageNumber(), m_readerView.getTotalPages(), !isNook);
  1310.  
  1311. if (isNook)
  1312. m_menuView.showTouchscreenMenu(m_gotoMenu.getView());
  1313. else {
  1314. m_menuDialog.setVisibility(View.GONE);
  1315. m_readerView.setOverlayView(m_gotoMenu.getView());
  1316. m_menuScreen.setBackgroundColor(0);
  1317. }
  1318. }
  1319.  
  1320. @Override
  1321. public void onClick(View view) {
  1322. switch (view.getId()) {
  1323. case R.id.backButton:
  1324. if (!isNook) {
  1325. if (m_menuDialog.getVisibility() == View.VISIBLE) {
  1326. if (m_menuView.isRoot())
  1327. hideMenu();
  1328. else
  1329. m_menuView.goBack();
  1330. }
  1331. } else
  1332. goBack();
  1333. break;
  1334. case R.id.touchscreen:
  1335. hideMenu();
  1336. break;
  1337. }
  1338. }
  1339.  
  1340. @Override
  1341. public boolean onLongClick(View view) {
  1342. return false;
  1343. }
  1344.  
  1345. @Override
  1346. public boolean onMenu(MenuItem item) {
  1347. boolean hide = false;
  1348. boolean update = false;
  1349. int itemId = item.getId();
  1350. switch (itemId) {
  1351. case R.id.font_size_xsmall:
  1352. case R.id.font_size_small:
  1353. case R.id.font_size_medium:
  1354. case R.id.font_size_large:
  1355. case R.id.font_size_xlarge:
  1356. m_fontSize = s_fontSizes.get(itemId);
  1357. updateFonts();
  1358. updateSettingsMenu();
  1359. update = true;
  1360. hide = true;
  1361. break;
  1362. case R.id.adv_font_size_14:
  1363. case R.id.adv_font_size_15:
  1364. case R.id.adv_font_size_16:
  1365. case R.id.adv_font_size_17:
  1366. case R.id.adv_font_size_18:
  1367. case R.id.adv_font_size_19:
  1368. case R.id.adv_font_size_20:
  1369. case R.id.adv_font_size_21:
  1370. case R.id.adv_font_size_22:
  1371. case R.id.adv_font_size_23:
  1372. case R.id.adv_font_size_24:
  1373. case R.id.adv_font_size_25:
  1374. case R.id.adv_font_size_26:
  1375. case R.id.adv_font_size_27:
  1376. case R.id.adv_font_size_28:
  1377. case R.id.adv_font_size_29:
  1378. case R.id.adv_font_size_30:
  1379. case R.id.adv_font_size_31:
  1380. case R.id.adv_font_size_32:
  1381. case R.id.adv_font_size_33:
  1382. case R.id.adv_font_size_34:
  1383. case R.id.adv_font_size_35:
  1384. case R.id.adv_font_size_36:
  1385. case R.id.adv_font_size_37:
  1386. case R.id.adv_font_size_38:
  1387. case R.id.adv_font_size_39:
  1388. case R.id.adv_font_size_40:
  1389. m_fontSize = s_advFontSizes.get(itemId);
  1390. updateFonts();
  1391. updateSettingsMenu();
  1392. update = true;
  1393. hide = true;
  1394. break;
  1395. /*
  1396. * case R.id.brightness_system: case R.id.brightness_10: case
  1397. * R.id.brightness_20: case R.id.brightness_30: case R.id.brightness_40:
  1398. * case R.id.brightness_50: case R.id.brightness_60: case
  1399. * R.id.brightness_70: case R.id.brightness_80: case R.id.brightness_90:
  1400. * case R.id.brightness_100: m_brightness =
  1401. * s_advBrightnessValues.get(itemId); updateBrightness();
  1402. * updateSettingsMenu(); break;
  1403. */
  1404. case R.id.adv_line_space_90:
  1405. case R.id.adv_line_space_95:
  1406. case R.id.adv_line_space_100:
  1407. case R.id.adv_line_space_105:
  1408. case R.id.adv_line_space_110:
  1409. case R.id.adv_line_space_115:
  1410. case R.id.adv_line_space_120:
  1411. case R.id.adv_line_space_125:
  1412. case R.id.adv_line_space_130:
  1413. case R.id.adv_line_space_135:
  1414. case R.id.adv_line_space_140:
  1415. case R.id.adv_line_space_145:
  1416. case R.id.adv_line_space_150:
  1417. m_lineSpace = s_lineSpacings.get(itemId);
  1418. updateFonts();
  1419. updateSettingsMenu();
  1420. update = true;
  1421. hide = true;
  1422. break;
  1423. case R.id.font_name_zdroid:
  1424. case R.id.font_name_zdroid_sans:
  1425. case R.id.font_name_internal:
  1426. m_fontFace = m_fontFaces.get(itemId)[0];
  1427. updateFonts();
  1428. updateSettingsMenu();
  1429. update = true;
  1430. hide = true;
  1431. break;
  1432. case R.id.rotation_cw:
  1433. m_rotation = ReaderView.ORIENTATION_CW;
  1434. updateSettings(true);
  1435. updateSettingsMenu();
  1436. update = true;
  1437. hide = true;
  1438. break;
  1439. case R.id.rotation_ccw:
  1440. m_rotation = ReaderView.ORIENTATION_CCW;
  1441. updateSettings(true);
  1442. updateSettingsMenu();
  1443. update = true;
  1444. hide = true;
  1445. break;
  1446. case R.id.rotation_normal:
  1447. m_rotation = ReaderView.ORIENTATION_NORMAL;
  1448. updateSettings(true);
  1449. updateSettingsMenu();
  1450. update = true;
  1451. hide = true;
  1452. break;
  1453. case R.id.rotation_180:
  1454. m_rotation = ReaderView.ORIENTATION_180;
  1455. updateSettings(true);
  1456. updateSettingsMenu();
  1457. update = true;
  1458. hide = true;
  1459. break;
  1460.  
  1461. case R.id.header_large:
  1462. case R.id.header_small:
  1463. case R.id.header_normal:
  1464. case R.id.header_off:
  1465.  
  1466. if (m_header == -1)
  1467. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1468.  
  1469. m_header = s_headerSizes.get(itemId);
  1470.  
  1471. updateSettings(true);
  1472. updateSettingsMenu();
  1473. update = true;
  1474. hide = true;
  1475. break;
  1476. case R.id.header_system:
  1477. if (m_header != -1)
  1478. getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1479.  
  1480. m_header = s_headerSizes.get(itemId);
  1481.  
  1482. updateSettings(true);
  1483. updateSettingsMenu();
  1484. update = true;
  1485. hide = true;
  1486. break;
  1487.  
  1488. case R.id.footer_flat:
  1489. case R.id.footer_off:
  1490. case R.id.footer_ticks:
  1491. m_footer = s_footerTypes.get(itemId);
  1492. updateSettings(true);
  1493. updateSettingsMenu();
  1494. update = true;
  1495. hide = true;
  1496. break;
  1497. case R.id.adv_settings_refresh:
  1498. m_refreshMode = (m_refreshMode + 1) % 2;
  1499. updateSettings(true);
  1500. updateSettingsMenu();
  1501. update = true;
  1502. break;
  1503. case R.id.refresh_normal:
  1504. case R.id.refresh_partial_2bit:
  1505. case R.id.refresh_partial_4bit:
  1506. m_refreshMode = s_refreshModes.get(itemId);
  1507. updateSettings(true);
  1508. updateSettingsMenu();
  1509. update = true;
  1510. hide = true;
  1511. break;
  1512.  
  1513. case R.id.adv_settings_header:
  1514.  
  1515. switch (m_header) {
  1516. case 0:
  1517. m_header = 25;
  1518. break;
  1519. case 25:
  1520. m_header = 33;
  1521. break;
  1522. case 33:
  1523. m_header = 45;
  1524. case 45:
  1525. m_header = -1;
  1526. break;
  1527. default:
  1528. m_header = 0;
  1529. break;
  1530. }
  1531.  
  1532. if (m_header != -1)
  1533. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1534. else
  1535. getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  1536.  
  1537. updateSettings(true);
  1538. updateSettingsMenu();
  1539. update = true;
  1540. break;
  1541.  
  1542. case R.id.adv_settings_footer:
  1543. m_footer = (m_footer + 1) % 3;
  1544. updateSettings(true);
  1545. updateSettingsMenu();
  1546. update = true;
  1547. break;
  1548. case R.id.adv_settings_touch:
  1549. m_touchMode = (m_touchMode + 1) % 2;
  1550. updateSettingsMenu();
  1551. update = true;
  1552. break;
  1553.  
  1554. case R.id.adv_settings_inverse:
  1555. // case R.id.settings_inverse:
  1556. m_inverse = !m_inverse;
  1557. if (m_colorMenu != null)
  1558. m_colorMenu.setInverse(m_inverse);
  1559. // updateFonts();
  1560. updateSettings(false);
  1561. updateSettingsMenu();
  1562. update = true;
  1563. break;
  1564. case R.id.adv_settings_reverse:
  1565. m_reverseMode = (m_reverseMode + 1) % 3;
  1566. updateSettingsMenu();
  1567. break;
  1568.  
  1569. case R.id.contrast_normal:
  1570. case R.id.contrast_average:
  1571. case R.id.contrast_high:
  1572. case R.id.contrast_extra:
  1573. case R.id.contrast_super:
  1574. case R.id.contrast_idiot:
  1575. m_extraStroke = s_contrastValues.get(itemId);
  1576. updateSettings(false);
  1577. updateSettingsMenu();
  1578. update = true;
  1579. break;
  1580.  
  1581. /*
  1582. * case R.id.settings_contrast: case R.id.adv_settings_contrast:
  1583. *
  1584. * Iterator<Map.Entry<Integer, Float>> it =
  1585. * s_contrastValues.entrySet().iterator();
  1586. *
  1587. * boolean found = false; while (it.hasNext()) { Map.Entry<Integer,
  1588. * Float> entry = it.next(); if (Math.abs(entry.getValue() -
  1589. * m_extraStroke) < 0.01f) { found = true; break; } }
  1590. *
  1591. * if (!found || !it.hasNext()) it =
  1592. * s_contrastValues.entrySet().iterator();
  1593. *
  1594. * m_extraStroke = it.next().getValue(); updateSettings(); update =
  1595. * true; break;
  1596. */
  1597. case R.id.goto_cover:
  1598. List<Pair<Long, String>> chapters = m_book.getChapters();
  1599. if (chapters != null && chapters.size() > 0)
  1600. m_readerView.gotoPosition(chapters.get(0).first);
  1601. // hide = true;
  1602. break;
  1603. case R.id.goto_page:
  1604. showGotoMenu();
  1605. hide = !isNook;
  1606. break;
  1607. case R.id.main_exit:
  1608. doSaveSettings();
  1609. clean();
  1610. terminate();
  1611. break;
  1612. case R.id.main_library:
  1613. Intent intent = new Intent();
  1614. intent.setData(Uri.parse("content://settings/system"));
  1615. intent.setClassName("net.textreaderfb2epub.textReader", "net.textreaderfb2epub.fileBrowser.FileBrowser");
  1616. intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  1617. startActivity(intent);
  1618. terminate();
  1619. break;
  1620.  
  1621. default:
  1622. if ((itemId & 0x1000) != 0) // chapters
  1623. {
  1624. m_readerView.gotoPosition((Long) item.getTag());
  1625. hide = true;
  1626. } else if ((itemId & 0x2000) != 0) // fonts
  1627. {
  1628. m_fontFace = m_fontFaces.get(itemId)[0];
  1629. updateFonts();
  1630. updateSettingsMenu();
  1631. update = true;
  1632. hide = true;
  1633. }
  1634. break;
  1635. }
  1636.  
  1637. if (update)
  1638. m_readerView.doInvalidate();
  1639.  
  1640. return hide;
  1641. }
  1642.  
  1643. @Override
  1644. public boolean onMenuBack(int menuId) {
  1645. return true;
  1646. }
  1647.  
  1648. @Override
  1649. public boolean onKeyDown(int keyCode, KeyEvent event) {
  1650. // Log.d("TextReader", "Key " + keyCode + " down");
  1651.  
  1652. boolean pageTurn = false;
  1653. boolean forward = true;
  1654.  
  1655. switch (keyCode) {
  1656. case NOOK_KEY_NEXT_LEFT:
  1657. case NOOK_KEY_NEXT_RIGHT:
  1658. // case KEYCODE_PAGE_BOTTOMRIGHT: same as NOOK_KEY_NEXT_LEFT
  1659. case KEYCODE_PAGE_BOTTOMLEFT:
  1660. case KeyEvent.KEYCODE_DPAD_RIGHT:
  1661. case KeyEvent.KEYCODE_DPAD_DOWN:
  1662. case NOOK_KEY_SHIFT_DOWN:
  1663. pageTurn = true;
  1664. forward = !(m_rotation == ReaderView.ORIENTATION_CW || m_rotation == ReaderView.ORIENTATION_180);
  1665. break;
  1666. case NOOK_KEY_PREV_LEFT:
  1667. case NOOK_KEY_PREV_RIGHT:
  1668. case KEYCODE_PAGE_TOPRIGHT:
  1669. case KEYCODE_PAGE_TOPLEFT:
  1670. case KeyEvent.KEYCODE_DPAD_LEFT:
  1671. case KeyEvent.KEYCODE_DPAD_UP:
  1672. case NOOK_KEY_SHIFT_UP:
  1673. pageTurn = true;
  1674. forward = m_rotation == ReaderView.ORIENTATION_CW || m_rotation == ReaderView.ORIENTATION_180;
  1675. break;
  1676. case KeyEvent.KEYCODE_VOLUME_DOWN:
  1677. pageTurn = true;
  1678. forward = !(m_rotation == ReaderView.ORIENTATION_CW || m_rotation == ReaderView.ORIENTATION_180);
  1679.  
  1680. if (isEpad)
  1681. forward = !forward;
  1682. break;
  1683. case KeyEvent.KEYCODE_VOLUME_UP:
  1684. pageTurn = true;
  1685. forward = m_rotation == ReaderView.ORIENTATION_CW || m_rotation == ReaderView.ORIENTATION_180;
  1686.  
  1687. if (isEpad)
  1688. forward = !forward;
  1689. break;
  1690. case KeyEvent.KEYCODE_BACK:
  1691. if (m_menuDialog.getVisibility() == View.VISIBLE) {
  1692. if (m_menuView.isRoot())
  1693. hideMenu();
  1694. else
  1695. m_menuView.goBack();
  1696. return false;
  1697. }
  1698.  
  1699. if ((m_brightnessMenu != null && m_brightnessMenu.isVisible()) || (m_gotoMenu != null && m_gotoMenu.isVisible())) {
  1700. hideMenu();
  1701. return false;
  1702. }
  1703.  
  1704. goBack();
  1705. break;
  1706. case KeyEvent.KEYCODE_MENU:
  1707. case KeyEvent.KEYCODE_SPACE:
  1708. if (!isNook) {
  1709. if (isMenuVisible())
  1710. hideMenu();
  1711. /*
  1712. * else showMenu();
  1713. */
  1714. return false;
  1715. }
  1716. }
  1717.  
  1718. if (pageTurn) {
  1719. if (!isNook && isMenuVisible())
  1720. return false;
  1721.  
  1722. switch (m_reverseMode) {
  1723. case REVERSE_LANDSCAPE:
  1724. if (m_readerView.getWidth() > m_readerView.getHeight())
  1725. forward = !forward;
  1726. break;
  1727. case REVERSE_ALWAYS:
  1728. forward = !forward;
  1729. break;
  1730. }
  1731.  
  1732. if (forward)
  1733. m_readerView.nextPage(true, true);
  1734. else
  1735. m_readerView.prevPage();
  1736.  
  1737. if (m_menuView != null)
  1738. m_menuView.goToRoot();
  1739. return true;
  1740. }
  1741.  
  1742. return super.onKeyDown(keyCode, event);
  1743. }
  1744.  
  1745. @Override
  1746. public boolean onKeyUp(int keyCode, KeyEvent event) {
  1747. // Log.d("TextReader", "Key " + keyCode + " up");
  1748.  
  1749. switch (keyCode) {
  1750. case KeyEvent.KEYCODE_VOLUME_DOWN:
  1751. case KeyEvent.KEYCODE_VOLUME_UP:
  1752. return true;
  1753. }
  1754. return super.onKeyUp(keyCode, event);
  1755. }
  1756.  
  1757. @Override
  1758. public boolean onTouch(View view, MotionEvent event) {
  1759. if (event.getAction() != MotionEvent.ACTION_UP) {
  1760. /*
  1761. * if (isNookTouch && event.getDownTime() > 10) { openOptionsMenu();
  1762. * return false; }
  1763. */
  1764. return true;
  1765. }
  1766.  
  1767. if (view == m_menuDialog)
  1768. return false;
  1769.  
  1770. if (!isNook) {
  1771. if (isMenuVisible()) {
  1772. if (view != m_menuScreen && m_readerView.isOverlayTouch(event))
  1773. return false;
  1774.  
  1775. hideMenu();
  1776.  
  1777. return true;
  1778. }
  1779.  
  1780. if (m_readerView.isMenuTouch(event)) {
  1781. openOptionsMenu();
  1782. // showMenu();
  1783. return false;
  1784. }
  1785. }
  1786.  
  1787. boolean isCenterX = event.getX() > view.getWidth() * 0.35 && event.getX() < view.getWidth() * 0.65;
  1788. boolean isCenterY = event.getY() > view.getHeight() * 0.35 && event.getY() < view.getHeight() * 0.65;
  1789. if (isCenterX && isCenterY) {
  1790. openOptionsMenu();
  1791. return true;
  1792. }
  1793.  
  1794. boolean forward = true;
  1795.  
  1796. switch (m_touchMode) {
  1797. case TOUCH_VERTICAL:
  1798. if (m_rotation == ReaderView.ORIENTATION_NORMAL || m_rotation == ReaderView.ORIENTATION_180) {
  1799. forward = event.getX() > view.getWidth() / 2;
  1800. } else {
  1801. forward = (event.getY() > view.getHeight() / 2) == (m_rotation == ReaderView.ORIENTATION_CW);
  1802. }
  1803. break;
  1804. case TOUCH_HORIZONTAL:
  1805. if (m_rotation == ReaderView.ORIENTATION_NORMAL || m_rotation == ReaderView.ORIENTATION_180) {
  1806. forward = event.getY() > view.getHeight() / 2;
  1807. } else {
  1808. forward = (event.getX() > view.getWidth() / 2) == (m_rotation == ReaderView.ORIENTATION_CW);
  1809. }
  1810. break;
  1811. }
  1812.  
  1813. switch (m_reverseMode) {
  1814. case REVERSE_LANDSCAPE:
  1815. if ((view.getWidth() > view.getHeight()) == (m_rotation == ReaderView.ORIENTATION_NORMAL || m_rotation == ReaderView.ORIENTATION_180))
  1816. forward = !forward;
  1817. break;
  1818. case REVERSE_ALWAYS:
  1819. forward = !forward;
  1820. break;
  1821. }
  1822.  
  1823. if (forward)
  1824. m_readerView.nextPage(true, true);
  1825. else
  1826. m_readerView.prevPage();
  1827.  
  1828. return super.onTouchEvent(event);
  1829. }
  1830.  
  1831. @Override
  1832. public void uncaughtException(Thread arg0, Throwable arg1) {
  1833. /*
  1834. * if (m_useDirectDraw) DirectDraw.cancelInvalidate();
  1835. */
  1836.  
  1837. DBSettings settings = new DBSettings(this, true);
  1838. settings.putInt("lastApplication", 0);
  1839. settings.putString("readingNow", "");
  1840. settings.close();
  1841.  
  1842. if (arg0 != null && m_exceptionHandler != null) {
  1843. m_exceptionHandler.uncaughtException(arg0, arg1);
  1844. }
  1845. }
  1846.  
  1847. @Override
  1848. public void onConfigurationChanged(Configuration newConfig) {
  1849. super.onConfigurationChanged(newConfig);
  1850. // doCreate();
  1851. // initFonts(m_internalFonts, true);
  1852. if (m_fontFaces.size() == 0)
  1853. scanFonts();
  1854.  
  1855. m_bordersMenu.setOrientation(DisplayMetrics.widthPixels < DisplayMetrics.heightPixels);
  1856. updateSettings(true);
  1857. updateSettingsMenu();
  1858. updateMenuSize();
  1859. // m_readerView.onSizeChanged(//w, h, newConfig., oldh)
  1860. // m_readerView.init();
  1861. }
  1862.  
  1863. private void updateBrightness() {
  1864. try {
  1865. java.lang.reflect.Field fieldScreenBrightness = WindowManager.LayoutParams.class.getField("screenBrightness");
  1866.  
  1867. int value = m_brightness <= 0 ? Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS) : m_brightness <= 10 ? 10 : m_brightness;
  1868. WindowManager.LayoutParams lp = getWindow().getAttributes();
  1869. fieldScreenBrightness.setFloat(lp, value / 255.0f);
  1870. getWindow().setAttributes(lp);
  1871. } catch (Exception ex) {
  1872. Log.d("TextReader", "Failed setting brightness ");
  1873. ex.printStackTrace();
  1874. }
  1875. }
  1876.  
  1877. @Override
  1878. public void onBrightnessChanged(float value) {
  1879. m_brightness = (int) (255 * value) + 1;
  1880. if (m_brightness > 255)
  1881. m_brightness = 255;
  1882.  
  1883. // m_menuView.setMenuValue(R.id.adv_settings_brightness,
  1884. // Integer.toString(100*m_brightness/255) + "%");
  1885. updateBrightness();
  1886. }
  1887.  
  1888. @Override
  1889. public void onPageChanged(int page, float percent) {
  1890. m_readerView.gotoPage(page, percent);
  1891. }
  1892.  
  1893. @Override
  1894. public boolean onOptionsItemSelected(android.view.MenuItem item) {
  1895. switch (item.getItemId()) {
  1896. case R.id.main_goto:
  1897. m_menuView.setRootMenu(R.id.goto_menu);
  1898. showMenu();
  1899. break;
  1900. case R.id.main_exit:
  1901. doSaveSettings();
  1902. clean();
  1903. terminate();
  1904.  
  1905. break;
  1906. case R.id.main_brightness:
  1907. showBrightnessMenu();
  1908.  
  1909. // item.setCheckable(true);
  1910. // item.setChecked(!item.isChecked());
  1911. return false;
  1912. case R.id.main_library:
  1913. Intent intent = new Intent();
  1914. intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  1915. intent.setData(Uri.parse("content://settings/system"));
  1916. intent.setClassName("net.textreaderfb2epub.textReader", "net.textreaderfb2epub.fileBrowser.FileBrowser");
  1917. startActivity(intent);
  1918. terminate();
  1919. break;
  1920. case R.id.main_settings:
  1921. m_menuView.setRootMenu(R.id.settings_menu);
  1922. showMenu();
  1923. break;
  1924. }
  1925. return true;
  1926. }
  1927.  
  1928. @Override
  1929. public boolean onCreateOptionsMenu(Menu menu) {
  1930. menu.clear();
  1931. MenuInflater inflater = getMenuInflater();
  1932. inflater.inflate(R.menu.menu, menu);
  1933. return true;
  1934. }
  1935.  
  1936. @Override
  1937. public boolean onPrepareOptionsMenu(Menu menu) {
  1938. if (isNookTouch)
  1939. menu.findItem(R.id.main_brightness).setVisible(false);
  1940. return true;
  1941. }
  1942.  
  1943. @Override
  1944. protected void onDestroy() {
  1945. super.onDestroy();
  1946. clean();
  1947. }
  1948.  
  1949. @Override
  1950. public void onApplyBorders() {
  1951. int paddingLeft = m_bordersMenu.getLeft();
  1952. int paddingRight = m_bordersMenu.getRight();
  1953. int paddingTop = m_bordersMenu.getTop();
  1954. int paddingBottom = m_bordersMenu.getBottom();
  1955.  
  1956. if (paddingLeft != m_paddingLeft || paddingRight != m_paddingRight || paddingTop != m_paddingTop || paddingBottom != m_paddingBottom) {
  1957. m_paddingTop = paddingTop;
  1958. m_paddingLeft = paddingLeft;
  1959. m_paddingRight = paddingRight;
  1960. m_paddingBottom = paddingBottom;
  1961.  
  1962. updateFonts();
  1963. m_readerView.doInvalidate();
  1964. }
  1965.  
  1966. saveSettings();
  1967.  
  1968. m_menuView.goBack();
  1969.  
  1970. }
  1971.  
  1972. boolean isClean = false;
  1973.  
  1974. private void clean() {
  1975. isClean = true;
  1976. // Log.d("TextReader", "onDestroy called");
  1977.  
  1978. if (m_readerView != null) {
  1979. m_readerView.clear();
  1980. // m_readerView = null;
  1981. }
  1982. if (m_book != null) {
  1983. m_book.clean();
  1984. m_book = null;
  1985. }
  1986. m_externalFonts = null;
  1987. m_fontFaces = null;
  1988. m_internalFonts = null;
  1989. /*
  1990. * m_menuView = null; m_menuDialog = null; m_menuScreen = null;
  1991. * m_colorMenu = null; m_gotoMenu = null; m_brightnessMenu = null;
  1992. */
  1993. // finish();
  1994. // System.gc();
  1995. // goBack();
  1996. }
  1997. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement