PageRenderTime 25ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/apdfviewer/src/com/googlecode/apdfviewer/PDFViewerActivity.java

http://nookdevs.googlecode.com/
Java | 465 lines | 378 code | 52 blank | 35 comment | 30 complexity | ffa3e759367434bbc24046cb23068adf MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception
  1. /*
  2. * Copyright (C) 2009 Li Wenhao <liwenhao.g@gmail.com>
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. /**
  17. * Modified the apdfviewer to customize it for nook. - Hari.
  18. */
  19. package com.googlecode.apdfviewer;
  20. import java.io.ObjectInputStream;
  21. import java.io.ObjectOutputStream;
  22. import java.io.Serializable;
  23. import android.content.Context;
  24. import android.content.Intent;
  25. import android.database.Cursor;
  26. import android.media.MediaScannerConnection;
  27. import android.media.MediaScannerConnection.MediaScannerConnectionClient;
  28. import android.net.Uri;
  29. import android.os.Bundle;
  30. import android.os.Handler;
  31. import android.util.Log;
  32. import android.view.KeyEvent;
  33. import android.view.View;
  34. import android.widget.AdapterView;
  35. import android.widget.ImageButton;
  36. import android.widget.SeekBar;
  37. import android.widget.Spinner;
  38. import android.widget.TextView;
  39. import android.widget.ViewAnimator;
  40. import android.widget.AdapterView.OnItemSelectedListener;
  41. import android.widget.SeekBar.OnSeekBarChangeListener;
  42. import com.googlecode.apdfviewer.PDFView.StatusListener;
  43. import com.nookdevs.common.nookBaseActivity;
  44. /**
  45. * @author Li Wenhao
  46. */
  47. public class PDFViewerActivity extends nookBaseActivity {
  48. // private final static String TAG = "PDFViewerActivity";
  49. private static final int ABOUT = 1;
  50. PDFView m_pdf_view;
  51. ViewAnimator m_animator;
  52. private SeekBar m_seek_view;
  53. TextView m_text;
  54. // TextView m_name;
  55. boolean m_landscapeleft = false;
  56. boolean m_landscaperight = false;
  57. private static final int SCROLL_PX_Y = 850;
  58. private static final int SCROLL_PX_X = 650;
  59. Handler m_Handler = new Handler();
  60. CurrentPageInfo pageInfo;
  61. @Override
  62. public void onCreate(Bundle savedInstanceState) {
  63. super.onCreate(savedInstanceState);
  64. setContentView(R.layout.main);
  65. // Check the intent for the content to view
  66. Intent intent = getIntent();
  67. if (intent.getData() == null) { return; }
  68. Uri uri = intent.getData();
  69. m_pdf_view = (PDFView) findViewById(R.id.view);
  70. String file = uri.getPath();
  71. new MediaScannerNotifier(file);
  72. initZoomSpinner();
  73. initButtons();
  74. initListener();
  75. m_pdf_view.openUri(uri);
  76. int idx = file.lastIndexOf('/');
  77. file = file.substring(idx + 1) + "userData";
  78. try {
  79. ObjectInputStream inp = new ObjectInputStream(openFileInput(file));
  80. pageInfo = (CurrentPageInfo) inp.readObject();
  81. inp.close();
  82. m_pdf_view.gotoPage(pageInfo.pageno);
  83. if (pageInfo.landscapeleft) {
  84. m_landscapeleft = true;
  85. m_pdf_view.setRotate(90);
  86. } else if (pageInfo.landscaperight) {
  87. m_landscaperight = true;
  88. m_pdf_view.setRotate(270);
  89. }
  90. m_pdf_view.scrollTo(pageInfo.scrollX, pageInfo.scrollY);
  91. } catch (Exception ex) {
  92. Log.e(LOGTAG, ex.getMessage(), ex);
  93. pageInfo = new CurrentPageInfo();
  94. pageInfo.file = file;
  95. }
  96. // m_name = (TextView)findViewById(R.id.name);
  97. m_animator = (ViewAnimator) findViewById(R.id.viewanim);
  98. m_seek_view = (SeekBar) findViewById(R.id.page_picker_seeker);
  99. m_seek_view.setMax(m_pdf_view.getPagesCount());
  100. m_text = (TextView) findViewById(R.id.page_picker_message);
  101. m_seek_view.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
  102. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  103. if (progress == 0) {
  104. progress = 1;
  105. }
  106. m_text.setText(progress + "");
  107. }
  108. public void onStartTrackingTouch(SeekBar seekBar) {
  109. }
  110. public void onStopTrackingTouch(SeekBar seekBar) {
  111. }
  112. });
  113. ImageButton close = (ImageButton) findViewById(R.id.page_picker_close);
  114. ImageButton plus = (ImageButton) findViewById(R.id.page_picker_plus);
  115. plus.setOnClickListener(new View.OnClickListener() {
  116. public void onClick(View v) {
  117. m_seek_view.incrementProgressBy(1);
  118. }
  119. });
  120. ImageButton minus = (ImageButton) findViewById(R.id.page_picker_minus);
  121. minus.setOnClickListener(new View.OnClickListener() {
  122. public void onClick(View v) {
  123. if (m_seek_view.getProgress() != 0) {
  124. m_seek_view.incrementProgressBy(-1);
  125. }
  126. }
  127. });
  128. close.setOnClickListener(new View.OnClickListener() {
  129. public void onClick(View v) {
  130. if (m_seek_view.getProgress() == 0) {
  131. m_pdf_view.gotoPage(0);
  132. } else {
  133. m_pdf_view.gotoPage(m_seek_view.getProgress() - 1);
  134. }
  135. m_animator.showNext();
  136. }
  137. });
  138. }
  139. private void initListener() {
  140. m_pdf_view.setStatusListener(new StatusListener() {
  141. public void onError(PDFView v, String msg) {
  142. // TODO Auto-generated method stub
  143. }
  144. public void onLoadingEnd(PDFView v) {
  145. // TODO Auto-generated method stub
  146. }
  147. public void onLoadingStart(PDFView v) {
  148. // TODO Auto-generated method stub
  149. }
  150. public void onPageChanged(PDFView v, int page) {
  151. // TODO Auto-generated method stub
  152. ImageButton prev = (ImageButton) findViewById(R.id.prev_page);
  153. ImageButton next = (ImageButton) findViewById(R.id.next_page);
  154. prev.setEnabled(true);
  155. next.setEnabled(true);
  156. TextView tv = (TextView) findViewById(R.id.page_number_view);
  157. tv.setText(page + "/" + v.getPagesCount());
  158. }
  159. public void onRenderingEnd(PDFView v) {
  160. // TODO Auto-generated method stub
  161. }
  162. public void onRenderingStart(PDFView v) {
  163. // TODO Auto-generated method stub
  164. }
  165. });
  166. }
  167. private void pageUp() {
  168. m_pdf_view.prevPage();
  169. }
  170. private void pageDown() {
  171. m_pdf_view.nextPage();
  172. }
  173. private void initButtons() {
  174. ImageButton btn = (ImageButton) findViewById(R.id.exit);
  175. btn.setOnClickListener(new View.OnClickListener() {
  176. public void onClick(View v) {
  177. m_pdf_view.close();
  178. System.gc();
  179. finish();
  180. }
  181. });
  182. btn = (ImageButton) findViewById(R.id.prev_page);
  183. btn.setOnClickListener(new View.OnClickListener() {
  184. public void onClick(View v) {
  185. if (m_landscapeleft) {
  186. pageDown();
  187. } else {
  188. pageUp();
  189. }
  190. saveData();
  191. }
  192. });
  193. btn.setOnLongClickListener(new View.OnLongClickListener() {
  194. public boolean onLongClick(View v) {
  195. m_seek_view.setProgress(m_pdf_view.getCurrentPage() + 1);
  196. m_animator.showNext();
  197. return true;
  198. }
  199. });
  200. btn = (ImageButton) findViewById(R.id.next_page);
  201. btn.setOnClickListener(new View.OnClickListener() {
  202. public void onClick(View v) {
  203. if (m_landscapeleft) {
  204. pageUp();
  205. } else {
  206. pageDown();
  207. }
  208. saveData();
  209. }
  210. });
  211. btn.setOnLongClickListener(new View.OnLongClickListener() {
  212. public boolean onLongClick(View v) {
  213. m_seek_view.setProgress(m_pdf_view.getCurrentPage() + 1);
  214. m_animator.showNext();
  215. return true;
  216. }
  217. });
  218. btn = (ImageButton) findViewById(R.id.switch_page);
  219. btn.setOnClickListener(new View.OnClickListener() {
  220. public void onClick(View v) {
  221. if (m_landscaperight || m_landscapeleft) {
  222. m_pdf_view.setRotate(0);
  223. m_landscaperight = false;
  224. m_landscapeleft = false;
  225. } else {
  226. m_pdf_view.setRotate(90);
  227. m_landscapeleft = true;
  228. }
  229. saveData();
  230. }
  231. });
  232. btn.setOnLongClickListener(new View.OnLongClickListener() {
  233. public boolean onLongClick(View v) {
  234. if (m_landscaperight || m_landscapeleft) {
  235. m_pdf_view.setRotate(0);
  236. m_landscaperight = false;
  237. m_landscapeleft = false;
  238. } else {
  239. m_pdf_view.setRotate(270);
  240. m_landscaperight = true;
  241. }
  242. saveData();
  243. return true;
  244. }
  245. });
  246. }
  247. private void initZoomSpinner() {
  248. Spinner s = (Spinner) findViewById(R.id.zoom);
  249. s.setOnItemSelectedListener(new OnItemSelectedListener() {
  250. public void onNothingSelected(AdapterView<?> view) {
  251. }
  252. public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
  253. float factor = 1.0F;
  254. switch (pos) {
  255. case 1:
  256. factor = 0.25F;
  257. break;
  258. case 2:
  259. factor = 0.50F;
  260. break;
  261. case 3:
  262. factor = 0.75F;
  263. break;
  264. case 4:
  265. factor = 1.00F;
  266. break;
  267. case 5:
  268. factor = 1.25F;
  269. break;
  270. case 6:
  271. factor = 1.5F;
  272. break;
  273. case 7:
  274. factor = 2.0F;
  275. break;
  276. case 8:
  277. factor = 2.5F;
  278. break;
  279. case 9:
  280. factor = 3.0F;
  281. break;
  282. default:
  283. factor = -1.0F;
  284. break;
  285. }
  286. m_pdf_view.setZoomFactor(factor);
  287. }
  288. });
  289. }
  290. @Override
  291. public void onResume() {
  292. super.onResume();
  293. updateTitle(NAME);
  294. }
  295. @Override
  296. protected void onSaveInstanceState(Bundle outState) {
  297. super.onSaveInstanceState(outState);
  298. }
  299. @Override
  300. protected void onStop() {
  301. super.onStop();
  302. }
  303. @Override
  304. protected void onDestroy() {
  305. super.onDestroy();
  306. }
  307. /**
  308. * @see android.app.Activity#onRestoreInstanceState(android.os.Bundle)
  309. */
  310. @Override
  311. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  312. super.onRestoreInstanceState(savedInstanceState);
  313. }
  314. private void saveData() {
  315. Runnable run = new Runnable() {
  316. public void run() {
  317. try {
  318. pageInfo.pageno = m_pdf_view.getCurrentPage();
  319. pageInfo.scrollX = m_pdf_view.getScrollX();
  320. pageInfo.scrollY = m_pdf_view.getScrollY();
  321. pageInfo.landscapeleft = m_landscapeleft;
  322. pageInfo.landscaperight = m_landscaperight;
  323. ObjectOutputStream out =
  324. new ObjectOutputStream(PDFViewerActivity.this.openFileOutput(pageInfo.file,
  325. Context.MODE_PRIVATE));
  326. out.writeObject(pageInfo);
  327. out.close();
  328. } catch (Exception ex) {
  329. Log.e(LOGTAG, ex.getMessage(), ex);
  330. }
  331. }
  332. };
  333. (new Thread(run)).start();
  334. }
  335. @Override
  336. public boolean onKeyDown(int keyCode, KeyEvent event) {
  337. boolean handled = false;
  338. switch (keyCode) {
  339. case NOOK_PAGE_UP_KEY_LEFT:
  340. case NOOK_PAGE_UP_KEY_RIGHT:
  341. pageUp();
  342. handled = true;
  343. break;
  344. case NOOK_PAGE_DOWN_KEY_LEFT:
  345. case NOOK_PAGE_DOWN_KEY_RIGHT:
  346. pageDown();
  347. handled = true;
  348. break;
  349. case NOOK_PAGE_UP_SWIPE:
  350. if (m_landscapeleft) {
  351. pageDown();
  352. } else {
  353. pageUp();
  354. }
  355. handled = true;
  356. break;
  357. case NOOK_PAGE_DOWN_SWIPE:
  358. if (m_landscapeleft) {
  359. pageUp();
  360. } else {
  361. pageDown();
  362. }
  363. handled = true;
  364. break;
  365. default:
  366. break;
  367. }
  368. return handled;
  369. }
  370. class MediaScannerNotifier implements MediaScannerConnectionClient {
  371. private MediaScannerConnection mConnection;
  372. private String mPath;
  373. public synchronized void scanFile(String path) {
  374. if (path == null) { return; }
  375. String mime = "ebook/";
  376. String ext = path.substring(path.lastIndexOf(".") + 1).toLowerCase();
  377. mime += ext;
  378. mConnection.scanFile(path, mime);
  379. }
  380. public MediaScannerNotifier(String path) {
  381. mConnection = new MediaScannerConnection(PDFViewerActivity.this, this);
  382. mConnection.connect();
  383. mPath = path;
  384. }
  385. public void onMediaScannerConnected() {
  386. scanFile(mPath);
  387. }
  388. public void onScanCompleted(String path, Uri arg1) {
  389. System.out.println("On Scan completed" + path + " " + arg1);
  390. String[] columns = {
  391. "title", "authors"
  392. };
  393. final Cursor dbCursor = getContentResolver().query(arg1, columns, null, null, null);
  394. dbCursor.moveToFirst();
  395. m_Handler.post(new Runnable() {
  396. public void run() {
  397. // m_name.setText(dbCursor.getString(0));
  398. updateTitle(NAME = dbCursor.getString(0));
  399. dbCursor.close();
  400. }
  401. });
  402. mConnection.disconnect();
  403. }
  404. }
  405. }
  406. class CurrentPageInfo implements Serializable {
  407. int pageno = 1;
  408. boolean landscaperight = false;
  409. boolean landscapeleft = false;
  410. int scrollX = 0;
  411. int scrollY = 0;
  412. String file;
  413. }