]> rtime.felk.cvut.cz Git - hornmich/skoda-qr-demo.git/blob - QRScanner/glass/src/main/java/cz/cvut/fel/dce/qrscanner/pdfviewer/PdfViewActivity.java
3da70ad9a97c4d7379debeddbdc0d0f13ca869ea
[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.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;
23
24 import java.io.File;
25
26 import cz.cvut.fel.dce.qrscanner.R;
27
28 public class PdfViewActivity extends Activity implements ViewTreeObserver.OnGlobalLayoutListener, PdfPageView.SceneChange, SensorEventListener {
29
30         enum ViewStates {
31                 SCROLLING,
32                 VIEWING
33         };
34
35         public static final String TAG = "PdfViewActivity";
36
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;
49
50         /**
51          * Start position of the gesture on touchpad
52          */
53         private float startX;
54
55         @Override
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);
68
69                 if (mPdfImageContainer != null) {
70                         mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
71                         Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
72                         mPreviewImgObserver.addOnGlobalLayoutListener(this);
73                 }
74                 else {
75                         Log.e(TAG, "ImageView for preview image could not be found in the resources.");
76                         mPreviewImgObserver = null;
77                 }
78
79                 Intent intent = getIntent();
80                 mFilePath = intent.getStringExtra("FILE_PATH");
81
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);
87                                 toast.show();
88                                 finish();
89                         }
90                 }
91                 else {
92                         Log.i(TAG, "No file path received");
93                         finish();
94                 }
95         }
96
97         public void onResume() {
98                 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
99                 super.onResume();
100         }
101
102         @Override
103         protected void onPause() {
104                 super.onPause();
105                 mSensorManager.unregisterListener(this);
106         }
107
108         @Override
109         protected void onDestroy() {
110                 super.onDestroy();
111                 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
112                         mPreviewImgObserver.removeOnGlobalLayoutListener(this);
113                 }
114                 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
115         }
116
117
118
119         @Override
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);
123                 return true;
124         }
125
126         @Override
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();
132
133                 //noinspection SimplifiableIfStatement
134                 if (id == R.id.action_settings) {
135                         return true;
136                 }
137
138                 return super.onOptionsItemSelected(item);
139         }
140
141         @Override
142         public void onGlobalLayout() {
143                 if (mPdfLoaded) {
144                         Log.d(TAG, "PDF file already loaded.");
145                         return;
146                 }
147                 try {
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);
154                         mPdfView.setPage(0);
155                         new LoadPageTask().execute();
156
157
158                         if (mPdfImageContainer != null) {
159                                 mPdfLoaded = true;
160                         }
161                         else {
162                                 Log.e(TAG, "Could not find container for PdfPageView.");
163                                 finish();
164                         }
165                 } catch (Exception e) {
166                         Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
167                         toast.show();
168                         e.printStackTrace();
169                 }
170         }
171
172         @Override
173         public boolean onGenericMotionEvent(MotionEvent event) {
174                 /*
175           Zoom ratio gained during one gesture on touchpad
176          */
177                 float dzoom;
178                 if (event.getAction() == MotionEvent.ACTION_DOWN) {
179                         startX = event.getRawX();
180                         return false;
181                 }
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();
187                         return false;
188                 }
189                 return super.onGenericMotionEvent(event);
190         }
191
192         @Override
193         public void onAccuracyChanged(Sensor sensor, int accuracy) {
194
195         }
196
197         @Override
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);
204                         }
205                 }
206         }
207
208         @Override
209         public void onViewChanged(PdfPageView source) {
210                 if (mPdfView != null) {
211                         mPdfView.invalidate();
212                 }
213         }
214
215         @Override
216         public void onPageLoaded(PdfPageView source) {
217
218         }
219
220         private void zoomPage(float deltaZoom) {
221                 mPdfView.zoom(deltaZoom);
222                 mZoomValue.setText(Integer.toString(Math.round(mPdfView.getZoomRatio()*100)));
223         }
224
225         private class LoadPageTask extends AsyncTask<Void, Void, Void> {
226
227                 @Override
228                 protected Void doInBackground(Void[] objects) {
229                         mPdfView.loadPage();
230                         return null;
231                 }
232
233                 @Override
234                 protected void onPreExecute() {
235                         super.onPreExecute();
236                         Log.d(TAG, "Starting loading of the PDF page asynchronously.");
237                         mProgressContainer.setVisibility(View.VISIBLE);
238                 }
239
240                 @Override
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.");
247                 }
248         }
249 }