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.media.AudioManager;
11 import android.os.AsyncTask;
12 import android.os.Bundle;
13 import android.util.Log;
14 import android.view.KeyEvent;
15 import android.view.Menu;
16 import android.view.MenuItem;
17 import android.view.MotionEvent;
18 import android.view.View;
19 import android.view.ViewTreeObserver;
20 import android.view.WindowManager;
21 import android.widget.FrameLayout;
22 import android.widget.RelativeLayout;
23 import android.widget.TextView;
24 import android.widget.Toast;
26 import com.google.android.glass.media.Sounds;
30 import cz.cvut.fel.dce.qrscanner.R;
32 public class PdfViewActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, PdfPageView.SceneChange, SensorEventListener {
39 public static final String TAG = "PdfViewActivity";
41 private FrameLayout mPdfImageContainer;
42 private TextView mCurrentPageNumber;
43 private TextView mLastPageNumber;
44 private TextView mViewerStateText;
45 private TextView mZoomValue;
46 private ViewTreeObserver mPreviewImgObserver;
47 private String mFilePath;
48 private PdfPageView mPdfView;
49 private Boolean mPdfLoaded = false;
50 private SensorManager mSensorManager;
51 private ViewStates mViewStates;
52 private RelativeLayout mProgressContainer;
55 * Start position of the gesture on touchpad
60 protected void onCreate(Bundle savedInstanceState) {
61 super.onCreate(savedInstanceState);
62 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
63 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
64 setContentView(R.layout.activity_pdf_view);
65 mPdfImageContainer = (FrameLayout) findViewById(R.id.pdf_view_container);
66 mCurrentPageNumber = (TextView) findViewById(R.id.page_number);
67 mLastPageNumber = (TextView) findViewById(R.id.total_pages_num);
68 mViewerStateText = (TextView) findViewById(R.id.pdf_viewer_state);
69 mZoomValue = (TextView) findViewById(R.id.zoom_value);
70 mViewStates = ViewStates.SCROLLING;
71 mProgressContainer = (RelativeLayout) findViewById(R.id.progress_container);
73 if (mPdfImageContainer != null) {
74 mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
75 Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
76 mPreviewImgObserver.addOnGlobalLayoutListener(this);
79 Log.e(TAG, "ImageView for preview image could not be found in the resources.");
80 mPreviewImgObserver = null;
83 Intent intent = getIntent();
84 mFilePath = intent.getStringExtra("FILE_PATH");
86 if (mFilePath != null) {
87 Log.i(TAG, "File path: " + mFilePath);
88 File rootPath = new File(mFilePath);
89 if (!rootPath.exists()) {
90 Toast toast = Toast.makeText(getApplicationContext(), "Document not found", Toast.LENGTH_LONG);
96 Log.i(TAG, "No file path received");
101 public void onResume() {
102 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
107 protected void onPause() {
109 mSensorManager.unregisterListener(this);
113 protected void onDestroy() {
115 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
116 mPreviewImgObserver.removeOnGlobalLayoutListener(this);
118 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
124 public boolean onCreateOptionsMenu(Menu menu) {
125 // Inflate the menu; this adds items to the action bar if it is present.
126 getMenuInflater().inflate(R.menu.menu_pdf_view, menu);
131 public boolean onOptionsItemSelected(MenuItem item) {
132 // Handle action bar item clicks here. The action bar will
133 // automatically handle clicks on the Home/Up button, so long
134 // as you specify a parent activity in AndroidManifest.xml.
135 int id = item.getItemId();
137 //noinspection SimplifiableIfStatement
138 if (id == R.id.action_settings) {
142 return super.onOptionsItemSelected(item);
146 public void onGlobalLayout() {
148 Log.d(TAG, "PDF file already loaded.");
152 String picturePath = mFilePath;
153 Log.i(TAG, "Path to component files: " + picturePath);
154 mPdfView = new PdfPageView(getApplicationContext(), picturePath);
155 mCurrentPageNumber.setText(Integer.toString(mPdfView.getActualPage()+1));
156 mLastPageNumber.setText(Integer.toString(mPdfView.getLastPage() + 1));
157 mPdfView.setListener(this);
159 new LoadPageTask().execute();
162 if (mPdfImageContainer != null) {
166 Log.e(TAG, "Could not find container for PdfPageView.");
169 } catch (Exception e) {
170 Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
177 public boolean onGenericMotionEvent(MotionEvent event) {
178 if (mViewStates == ViewStates.SCROLLING) {
180 Zoom ratio gained during one gesture on touchpad
183 if (event.getAction() == MotionEvent.ACTION_DOWN) {
184 startX = event.getRawX();
187 if (event.getAction() == MotionEvent.ACTION_MOVE) {
188 dzoom = event.getRawX() - startX;
189 zoomPage(dzoom / 1000f);
190 startX = event.getRawX();
194 return super.onGenericMotionEvent(event);
198 public boolean onKeyDown(int keyCode, KeyEvent event) {
199 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
200 AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
201 audio.playSoundEffect(Sounds.TAP);
204 return super.onKeyDown(keyCode, event);
207 private void switchState() {
208 if (mViewStates == ViewStates.SCROLLING) {
209 mViewStates = ViewStates.VIEWING;
210 mViewerStateText.setText(getText(R.string.state_viewing));
213 mViewStates = ViewStates.SCROLLING;
214 mViewerStateText.setText(getText(R.string.state_scrolling));
220 public void onAccuracyChanged(Sensor sensor, int accuracy) {
225 public void onSensorChanged(SensorEvent event) {
226 if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
227 float dx = event.values[1]*12;
228 float dy = event.values[0]*12;
229 if (mPdfView != null) {
230 if (mViewStates == ViewStates.SCROLLING) {
231 mPdfView.move(-dx, -dy);
238 public void onViewChanged(PdfPageView source) {
239 if (mPdfView != null) {
240 mPdfView.invalidate();
245 public void onPageLoaded(PdfPageView source) {
249 private void zoomPage(float deltaZoom) {
250 mPdfView.zoom(deltaZoom);
251 mZoomValue.setText(Integer.toString(Math.round(mPdfView.getZoomRatio() * 100)));
254 private class LoadPageTask extends AsyncTask<Void, Void, Void> {
257 protected Void doInBackground(Void[] objects) {
263 protected void onPreExecute() {
264 super.onPreExecute();
265 Log.d(TAG, "Starting loading of the PDF page asynchronously.");
266 mProgressContainer.setVisibility(View.VISIBLE);
270 protected void onPostExecute(Void aVoid) {
271 super.onPostExecute(aVoid);
272 mProgressContainer.setVisibility(View.INVISIBLE);
274 mPdfImageContainer.addView(mPdfView);
275 zoomPage(0.0f); // just for update the zoom value indicator
276 Log.d(TAG, "PDF page loaded.");