]> rtime.felk.cvut.cz Git - hornmich/skoda-qr-demo.git/blob - QRScanner/glass/src/main/java/cz/cvut/fel/dce/qrscanner/pdfviewer/PdfViewActivity.java
2ff961a9dd3da408aeede1647ef25f2b05807468
[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 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;
48
49         /**
50          * Start position of the gesture on touchpad
51          */
52         private float startX;
53
54         @Override
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);
66
67                 if (mPdfImageContainer != null) {
68                         mPreviewImgObserver = mPdfImageContainer.getViewTreeObserver();
69                         Log.i(TAG, "Registering mPreviewImgObserver OnGlobalLayoutListener.");
70                         mPreviewImgObserver.addOnGlobalLayoutListener(this);
71                 }
72                 else {
73                         Log.e(TAG, "ImageView for preview image could not be found in the resources.");
74                         mPreviewImgObserver = null;
75                 }
76
77                 Intent intent = getIntent();
78                 mFilePath = intent.getStringExtra("FILE_PATH");
79
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);
85                                 toast.show();
86                                 finish();
87                         }
88                 }
89                 else {
90                         Log.i(TAG, "No file path received");
91                         finish();
92                 }
93         }
94
95         public void onResume() {
96                 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
97                 super.onResume();
98         }
99
100         @Override
101         protected void onPause() {
102                 super.onPause();
103                 mSensorManager.unregisterListener(this);
104         }
105
106         @Override
107         protected void onDestroy() {
108                 super.onDestroy();
109                 if (mPreviewImgObserver != null && mPreviewImgObserver.isAlive()) {
110                         mPreviewImgObserver.removeOnGlobalLayoutListener(this);
111                 }
112                 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
113         }
114
115
116
117         @Override
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);
121                 return true;
122         }
123
124         @Override
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();
130
131                 //noinspection SimplifiableIfStatement
132                 if (id == R.id.action_settings) {
133                         return true;
134                 }
135
136                 return super.onOptionsItemSelected(item);
137         }
138
139         @Override
140         public void onGlobalLayout() {
141                 if (mPdfLoaded) {
142                         Log.d(TAG, "PDF file already loaded.");
143                         return;
144                 }
145                 try {
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);
152                         mPdfView.setPage(0);
153                         new LoadPageTask().execute();
154
155
156                         if (mPdfImageContainer != null) {
157                                 mPdfLoaded = true;
158                         }
159                         else {
160                                 Log.e(TAG, "Could not find container for PdfPageView.");
161                                 finish();
162                         }
163                 } catch (Exception e) {
164                         Toast toast = Toast.makeText(getApplicationContext(), "Component preview could not be loaded.", Toast.LENGTH_LONG);
165                         toast.show();
166                         e.printStackTrace();
167                 }
168         }
169
170         @Override
171         public boolean onGenericMotionEvent(MotionEvent event) {
172                 /*
173           Zoom ratio gained during one gesture on touchpad
174          */
175                 float dzoom;
176                 if (event.getAction() == MotionEvent.ACTION_DOWN) {
177                         startX = event.getRawX();
178                         return false;
179                 }
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();
185                         return false;
186                 }
187                 return super.onGenericMotionEvent(event);
188         }
189
190         @Override
191         public void onAccuracyChanged(Sensor sensor, int accuracy) {
192
193         }
194
195         @Override
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);
202                         }
203                 }
204         }
205
206         @Override
207         public void onViewChanged(PdfPageView source) {
208                 if (mPdfView != null) {
209                         mPdfView.invalidate();
210                 }
211         }
212
213         @Override
214         public void onPageLoaded(PdfPageView source) {
215
216         }
217
218         private class LoadPageTask extends AsyncTask<Void, Void, Void> {
219
220                 @Override
221                 protected Void doInBackground(Void[] objects) {
222                         mPdfView.loadPage();
223                         return null;
224                 }
225
226                 @Override
227                 protected void onPreExecute() {
228                         super.onPreExecute();
229                         Log.d(TAG, "Starting loading of the PDF page asynchronously.");
230                         mProgressContainer.setVisibility(View.VISIBLE);
231                 }
232
233                 @Override
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.");
239                 }
240         }
241 }