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 TextView mZoomValue;
42 private ViewTreeObserver mPreviewImgObserver;
43 private String mFilePath;
44 private PdfPageView mPdfView;
45 private Boolean mPdfLoaded = false;
46 private SensorManager mSensorManager;
47 private ViewStates mViewStates;
48 private RelativeLayout mProgressContainer;
51 * Start position of the gesture on touchpad
56 protected void onCreate(Bundle savedInstanceState) {
57 super.onCreate(savedInstanceState);
58 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
59 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
60 setContentView(R.layout.activity_pdf_view);
61 mPdfImageContainer = (FrameLayout) findViewById(R.id.pdf_view_container);
62 mCurrentPageNumber = (TextView) findViewById(R.id.page_number);
63 mLastPageNumber = (TextView) findViewById(R.id.total_pages_num);
64 mViewerStateText = (TextView) findViewById(R.id.pdf_viewer_state);
65 mZoomValue = (TextView) findViewById(R.id.zoom_value);
66 mViewStates = ViewStates.SCROLLING;
67 mProgressContainer = (RelativeLayout) findViewById(R.id.progress_container);
69 if (mPdfImageContainer != null) {
70 mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
71 Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
72 mPreviewImgObserver.addOnGlobalLayoutListener(this);
75 Log.e(TAG, "ImageView for preview image could not be found in the resources.");
76 mPreviewImgObserver = null;
79 Intent intent = getIntent();
80 mFilePath = intent.getStringExtra("FILE_PATH");
82 if (mFilePath != null) {
83 Log.i(TAG, "File path: " + mFilePath);
84 File rootPath = new File(mFilePath);
85 if (!rootPath.exists()) {
86 Toast toast = Toast.makeText(getApplicationContext(), "Document not found", Toast.LENGTH_LONG);
92 Log.i(TAG, "No file path received");
97 public void onResume() {
98 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
103 protected void onPause() {
105 mSensorManager.unregisterListener(this);
109 protected void onDestroy() {
111 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
112 mPreviewImgObserver.removeOnGlobalLayoutListener(this);
114 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
120 public boolean onCreateOptionsMenu(Menu menu) {
121 // Inflate the menu; this adds items to the action bar if it is present.
122 getMenuInflater().inflate(R.menu.menu_pdf_view, menu);
127 public boolean onOptionsItemSelected(MenuItem item) {
128 // Handle action bar item clicks here. The action bar will
129 // automatically handle clicks on the Home/Up button, so long
130 // as you specify a parent activity in AndroidManifest.xml.
131 int id = item.getItemId();
133 //noinspection SimplifiableIfStatement
134 if (id == R.id.action_settings) {
138 return super.onOptionsItemSelected(item);
142 public void onGlobalLayout() {
144 Log.d(TAG, "PDF file already loaded.");
148 String picturePath = mFilePath;
149 Log.i(TAG, "Path to component files: " + picturePath);
150 mPdfView = new PdfPageView(getApplicationContext(), picturePath);
151 mCurrentPageNumber.setText(Integer.toString(mPdfView.getActualPage()+1));
152 mLastPageNumber.setText(Integer.toString(mPdfView.getLastPage()+1));
153 mPdfView.setListener(this);
155 new LoadPageTask().execute();
158 if (mPdfImageContainer != null) {
162 Log.e(TAG, "Could not find container for PdfPageView.");
165 } catch (Exception e) {
166 Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
173 public boolean onGenericMotionEvent(MotionEvent event) {
175 Zoom ratio gained during one gesture on touchpad
178 if (event.getAction() == MotionEvent.ACTION_DOWN) {
179 startX = event.getRawX();
182 if (event.getAction() == MotionEvent.ACTION_MOVE) {
183 dzoom = event.getRawX() - startX;
184 Log.d(TAG,"move_action, dzoom: " + dzoom);
185 zoomPage(dzoom /1000f);
186 startX = event.getRawX();
189 return super.onGenericMotionEvent(event);
193 public void onAccuracyChanged(Sensor sensor, int accuracy) {
198 public void onSensorChanged(SensorEvent event) {
199 if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
200 float dx = event.values[1]*12;
201 float dy = event.values[0]*12;
202 if (mPdfView != null) {
203 mPdfView.move(-dx, -dy);
209 public void onViewChanged(PdfPageView source) {
210 if (mPdfView != null) {
211 mPdfView.invalidate();
216 public void onPageLoaded(PdfPageView source) {
220 private void zoomPage(float deltaZoom) {
221 mPdfView.zoom(deltaZoom);
222 mZoomValue.setText(Integer.toString(Math.round(mPdfView.getZoomRatio()*100)));
225 private class LoadPageTask extends AsyncTask<Void, Void, Void> {
228 protected Void doInBackground(Void[] objects) {
234 protected void onPreExecute() {
235 super.onPreExecute();
236 Log.d(TAG, "Starting loading of the PDF page asynchronously.");
237 mProgressContainer.setVisibility(View.VISIBLE);
241 protected void onPostExecute(Void aVoid) {
242 super.onPostExecute(aVoid);
243 mProgressContainer.setVisibility(View.INVISIBLE);
244 mPdfImageContainer.addView(mPdfView);
245 zoomPage(0.0f); // just for update the zoom value indicator
246 Log.d(TAG, "PDF page loaded.");