]> rtime.felk.cvut.cz Git - hornmich/skoda-qr-demo.git/blob - QRScanner/glass/src/main/java/cz/cvut/fel/dce/qrscanner/pdfviewer/PdfViewActivity.java
Implement PDF viewer state switching
[hornmich/skoda-qr-demo.git] / QRScanner / glass / src / main / java / cz / cvut / fel / dce / qrscanner / pdfviewer / PdfViewActivity.java
1 package cz.cvut.fel.dce.qrscanner.pdfviewer;
2
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;
25
26 import com.google.android.glass.media.Sounds;
27
28 import java.io.File;
29
30 import cz.cvut.fel.dce.qrscanner.R;
31
32 public class PdfViewActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, PdfPageView.SceneChange, SensorEventListener {
33
34         enum ViewStates {
35                 SCROLLING,
36                 VIEWING
37         };
38
39         public static final String TAG = "PdfViewActivity";
40
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;
53
54         /**
55          * Start position of the gesture on touchpad
56          */
57         private float startX;
58
59         @Override
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);
72
73                 if (mPdfImageContainer != null) {
74                         mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
75                         Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
76                         mPreviewImgObserver.addOnGlobalLayoutListener(this);
77                 }
78                 else {
79                         Log.e(TAG, "ImageView for preview image could not be found in the resources.");
80                         mPreviewImgObserver = null;
81                 }
82
83                 Intent intent = getIntent();
84                 mFilePath = intent.getStringExtra("FILE_PATH");
85
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);
91                                 toast.show();
92                                 finish();
93                         }
94                 }
95                 else {
96                         Log.i(TAG, "No file path received");
97                         finish();
98                 }
99         }
100
101         public void onResume() {
102                 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
103                 super.onResume();
104         }
105
106         @Override
107         protected void onPause() {
108                 super.onPause();
109                 mSensorManager.unregisterListener(this);
110         }
111
112         @Override
113         protected void onDestroy() {
114                 super.onDestroy();
115                 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
116                         mPreviewImgObserver.removeOnGlobalLayoutListener(this);
117                 }
118                 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
119         }
120
121
122
123         @Override
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);
127                 return true;
128         }
129
130         @Override
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();
136
137                 //noinspection SimplifiableIfStatement
138                 if (id == R.id.action_settings) {
139                         return true;
140                 }
141
142                 return super.onOptionsItemSelected(item);
143         }
144
145         @Override
146         public void onGlobalLayout() {
147                 if (mPdfLoaded) {
148                         Log.d(TAG, "PDF file already loaded.");
149                         return;
150                 }
151                 try {
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);
158                         mPdfView.setPage(0);
159                         new LoadPageTask().execute();
160
161
162                         if (mPdfImageContainer != null) {
163                                 mPdfLoaded = true;
164                         }
165                         else {
166                                 Log.e(TAG, "Could not find container for PdfPageView.");
167                                 finish();
168                         }
169                 } catch (Exception e) {
170                         Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
171                         toast.show();
172                         e.printStackTrace();
173                 }
174         }
175
176         @Override
177         public boolean onGenericMotionEvent(MotionEvent event) {
178                 if (mViewStates == ViewStates.SCROLLING) {
179                         /*
180                           Zoom ratio gained during one gesture on touchpad
181                         */
182                         float dzoom;
183                         if (event.getAction() == MotionEvent.ACTION_DOWN) {
184                                 startX = event.getRawX();
185                                 return false;
186                         }
187                         if (event.getAction() == MotionEvent.ACTION_MOVE) {
188                                 dzoom = event.getRawX() - startX;
189                                 zoomPage(dzoom / 1000f);
190                                 startX = event.getRawX();
191                                 return false;
192                         }
193                 }
194                 return super.onGenericMotionEvent(event);
195         }
196
197         @Override
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);
202                         switchState();
203                 }
204                 return super.onKeyDown(keyCode, event);
205         }
206
207         private void switchState() {
208                 if (mViewStates == ViewStates.SCROLLING) {
209                         mViewStates = ViewStates.VIEWING;
210                         mViewerStateText.setText(getText(R.string.state_viewing));
211                 }
212                 else {
213                         mViewStates = ViewStates.SCROLLING;
214                         mViewerStateText.setText(getText(R.string.state_scrolling));
215
216                 }
217         }
218
219         @Override
220         public void onAccuracyChanged(Sensor sensor, int accuracy) {
221
222         }
223
224         @Override
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);
232                                 }
233                         }
234                 }
235         }
236
237         @Override
238         public void onViewChanged(PdfPageView source) {
239                 if (mPdfView != null) {
240                         mPdfView.invalidate();
241                 }
242         }
243
244         @Override
245         public void onPageLoaded(PdfPageView source) {
246
247         }
248
249         private void zoomPage(float deltaZoom) {
250                 mPdfView.zoom(deltaZoom);
251                 mZoomValue.setText(Integer.toString(Math.round(mPdfView.getZoomRatio() * 100)));
252         }
253
254         private class LoadPageTask extends AsyncTask<Void, Void, Void> {
255
256                 @Override
257                 protected Void doInBackground(Void[] objects) {
258                         mPdfView.loadPage();
259                         return null;
260                 }
261
262                 @Override
263                 protected void onPreExecute() {
264                         super.onPreExecute();
265                         Log.d(TAG, "Starting loading of the PDF page asynchronously.");
266                         mProgressContainer.setVisibility(View.VISIBLE);
267                 }
268
269                 @Override
270                 protected void onPostExecute(Void aVoid) {
271                         super.onPostExecute(aVoid);
272                         mProgressContainer.setVisibility(View.INVISIBLE);
273                         switchState();
274                         mPdfImageContainer.addView(mPdfView);
275                         zoomPage(0.0f); // just for update the zoom value indicator
276                         Log.d(TAG, "PDF page loaded.");
277                 }
278         }
279 }