1 package cz.cvut.fel.dce.qrscanner.pdfviewer;
3 import android.app.Activity;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.hardware.Sensor;
7 import android.hardware.SensorEvent;
8 import android.hardware.SensorEventListener;
9 import android.hardware.SensorManager;
10 import android.os.AsyncTask;
11 import android.os.Bundle;
12 import android.util.Log;
13 import android.view.Menu;
14 import android.view.MenuItem;
15 import android.view.MotionEvent;
16 import android.view.View;
17 import android.view.ViewTreeObserver;
18 import android.view.WindowManager;
19 import android.widget.FrameLayout;
20 import android.widget.RelativeLayout;
21 import android.widget.TextView;
22 import android.widget.Toast;
26 import cz.cvut.fel.dce.qrscanner.R;
28 public class PdfViewActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, PdfPageView.SceneChange, SensorEventListener {
35 public static final String TAG = "PdfViewActivity";
37 private FrameLayout mPdfImageContainer;
38 private TextView mCurrentPageNumber;
39 private TextView mLastPageNumber;
40 private TextView mViewerStateText;
41 private ViewTreeObserver mPreviewImgObserver;
42 private String mFilePath;
43 private PdfPageView mPdfView;
44 private Boolean mPdfLoaded = false;
45 private SensorManager mSensorManager;
46 private ViewStates mViewStates;
47 private RelativeLayout mProgressContainer;
50 * Start position of the gesture on touchpad
55 protected void onCreate(Bundle savedInstanceState) {
56 super.onCreate(savedInstanceState);
57 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
58 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
59 setContentView(R.layout.activity_pdf_view);
60 mPdfImageContainer = (FrameLayout) findViewById(R.id.pdf_view_container);
61 mCurrentPageNumber = (TextView) findViewById(R.id.page_number);
62 mLastPageNumber = (TextView) findViewById(R.id.total_pages_num);
63 mViewerStateText = (TextView) findViewById(R.id.pdf_viewer_state);
64 mViewStates = ViewStates.SCROLLING;
65 mProgressContainer = (RelativeLayout) findViewById(R.id.progress_container);
67 if (mPdfImageContainer != null) {
68 mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
69 Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
70 mPreviewImgObserver.addOnGlobalLayoutListener(this);
73 Log.e(TAG, "ImageView for preview image could not be found in the resources.");
74 mPreviewImgObserver = null;
77 Intent intent = getIntent();
78 mFilePath = intent.getStringExtra("FILE_PATH");
80 if (mFilePath != null) {
81 Log.i(TAG, "File path: " + mFilePath);
82 File rootPath = new File(mFilePath);
83 if (!rootPath.exists()) {
84 Toast toast = Toast.makeText(getApplicationContext(), "Document not found", Toast.LENGTH_LONG);
90 Log.i(TAG, "No file path received");
95 public void onResume() {
96 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
101 protected void onPause() {
103 mSensorManager.unregisterListener(this);
107 protected void onDestroy() {
109 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
110 mPreviewImgObserver.removeOnGlobalLayoutListener(this);
112 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
118 public boolean onCreateOptionsMenu(Menu menu) {
119 // Inflate the menu; this adds items to the action bar if it is present.
120 getMenuInflater().inflate(R.menu.menu_pdf_view, menu);
125 public boolean onOptionsItemSelected(MenuItem item) {
126 // Handle action bar item clicks here. The action bar will
127 // automatically handle clicks on the Home/Up button, so long
128 // as you specify a parent activity in AndroidManifest.xml.
129 int id = item.getItemId();
131 //noinspection SimplifiableIfStatement
132 if (id == R.id.action_settings) {
136 return super.onOptionsItemSelected(item);
140 public void onGlobalLayout() {
142 Log.d(TAG, "PDF file already loaded.");
146 String picturePath = mFilePath;
147 Log.i(TAG, "Path to component files: " + picturePath);
148 mPdfView = new PdfPageView(getApplicationContext(), picturePath);
149 mCurrentPageNumber.setText(Integer.toString(mPdfView.getActualPage()+1));
150 mLastPageNumber.setText(Integer.toString(mPdfView.getLastPage()+1));
151 mPdfView.setListener(this);
153 new LoadPageTask().execute();
156 if (mPdfImageContainer != null) {
160 Log.e(TAG, "Could not find container for PdfPageView.");
163 } catch (Exception e) {
164 Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
171 public boolean onGenericMotionEvent(MotionEvent event) {
173 Zoom ratio gained during one gesture on touchpad
176 if (event.getAction() == MotionEvent.ACTION_DOWN) {
177 startX = event.getRawX();
180 if (event.getAction() == MotionEvent.ACTION_MOVE) {
181 dzoom = event.getRawX() - startX;
182 Log.d(TAG,"move_action, dzoom: " + dzoom);
183 mPdfView.zoom(dzoom /1000f);
184 startX = event.getRawX();
187 return super.onGenericMotionEvent(event);
191 public void onAccuracyChanged(Sensor sensor, int accuracy) {
196 public void onSensorChanged(SensorEvent event) {
197 if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
198 float dx = event.values[1]*12;
199 float dy = event.values[0]*12;
200 if (mPdfView != null) {
201 mPdfView.move(-dx, -dy);
207 public void onViewChanged(PdfPageView source) {
208 if (mPdfView != null) {
209 mPdfView.invalidate();
214 public void onPageLoaded(PdfPageView source) {
218 private class LoadPageTask extends AsyncTask<Void, Void, Void> {
221 protected Void doInBackground(Void[] objects) {
227 protected void onPreExecute() {
228 super.onPreExecute();
229 Log.d(TAG, "Starting loading of the PDF page asynchronously.");
230 mProgressContainer.setVisibility(View.VISIBLE);
234 protected void onPostExecute(Void aVoid) {
235 super.onPostExecute(aVoid);
236 mProgressContainer.setVisibility(View.INVISIBLE);
237 mPdfImageContainer.addView(mPdfView);
238 Log.d(TAG, "PDF page loaded.");