1 package org.libreoffice;
2 
3 import android.content.Intent;
4 import android.os.Build;
5 import android.os.Bundle;
6 import android.support.annotation.Nullable;
7 import android.support.v4.view.GestureDetectorCompat;
8 import android.support.v7.app.AppCompatActivity;
9 import android.view.GestureDetector;
10 import android.view.KeyEvent;
11 import android.view.MotionEvent;
12 import android.view.View;
13 import android.view.WindowManager;
14 import android.webkit.WebView;
15 import android.widget.Button;
16 import android.widget.ImageButton;
17 
18 public class PresentationActivity extends AppCompatActivity {
19 
20     private static final String LOGTAG = PresentationActivity.class.getSimpleName();
21     WebView mWebView;
22     View mGestureView;
23 
24     @Override
onCreate(@ullable Bundle savedInstanceState)25     protected void onCreate(@Nullable Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27 
28         View decorView = getWindow().getDecorView();
29         // Hide the status bar.
30         int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
31         decorView.setSystemUiVisibility(uiOptions);
32 
33         setContentView(R.layout.presentation_mode);
34 
35         // get intent and url
36         Intent intent = getIntent();
37         String filePath = intent.getDataString();
38 
39         // set up WebView
40         mWebView = findViewById(R.id.presentation_view);
41         mWebView.getSettings().setJavaScriptEnabled(true);
42         mWebView.setOnTouchListener(new View.OnTouchListener() {
43             @Override
44             public boolean onTouch(View v, MotionEvent event) {
45                 return true;
46             }
47         });
48 
49         // set up buttons within presentation_gesture_view
50         ImageButton prevButton = findViewById(R.id.slide_show_nav_prev);
51         ImageButton nextButton = findViewById(R.id.slide_show_nav_next);
52         Button backButton = findViewById(R.id.slide_show_nav_back);
53 
54         prevButton.setOnClickListener(new View.OnClickListener() {
55             @Override
56             public void onClick(View v) {
57                 pageLeft();
58             }
59         });
60         nextButton.setOnClickListener(new View.OnClickListener() {
61             @Override
62             public void onClick(View v) {
63                 pageRight();
64             }
65         });
66         backButton.setOnClickListener(new View.OnClickListener() {
67             @Override
68             public void onClick(View v) {
69                 onBackPressed();
70             }
71         });
72 
73         // set up presentation_gesture_view
74         mGestureView = findViewById(R.id.presentation_gesture_view);
75         final GestureDetectorCompat gestureDetector =
76                 new GestureDetectorCompat(this, new PresentationGestureViewListener());
77         mGestureView.setOnTouchListener(new View.OnTouchListener() {
78             @Override
79             public boolean onTouch(View v, MotionEvent event) {
80                 return gestureDetector.onTouchEvent(event);
81             }
82         });
83 
84         // load url
85         mWebView.loadUrl(filePath);
86     }
87 
88     private class PresentationGestureViewListener extends GestureDetector.SimpleOnGestureListener {
89         private static final int SWIPE_VELOCITY_THRESHOLD = 100;
90         private static final int SCROLL_THRESHOLD = 10; // if scrollCounter is larger than this, a page switch is triggered
91         private int scrollCounter = 0; // a counter for measuring scrolling distance
92 
93         @Override
onDown(MotionEvent e)94         public boolean onDown(MotionEvent e) {
95             return true;
96         }
97 
98         @Override
onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)99         public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
100             boolean result = false;
101             try {
102                 float diffY = e2.getY() - e1.getY();
103                 float diffX = e2.getX() - e1.getX();
104                 if (Math.abs(diffX) > Math.abs(diffY)) {
105                     if (Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
106                         if (diffX > 0) {
107                             pageRight();
108                         } else {
109                             pageLeft();
110                         }
111                         result = true;
112                     }
113                 }
114             } catch (Exception exception) {
115                 exception.printStackTrace();
116             }
117             return result;
118         }
119 
120         @Override
onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)121         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
122             boolean result = false;
123             try {
124                 float diffY = e2.getY() - e1.getY();
125                 float diffX = e2.getX() - e1.getX();
126                 if (Math.abs(diffX) < Math.abs(diffY)) {
127                     if (distanceY > 0) {
128                         scrollCounter++;
129                         if (scrollCounter >= SCROLL_THRESHOLD) {
130                             pageRight();
131                             scrollCounter = 0;
132                         }
133                     } else {
134                         scrollCounter--;
135                         if (scrollCounter <= -SCROLL_THRESHOLD) {
136                             pageLeft();
137                             scrollCounter = 0;
138                         }
139                     }
140                     result = true;
141                 }
142             } catch (Exception exception) {
143                 exception.printStackTrace();
144             }
145             return result;
146         }
147 
148         @Override
onSingleTapUp(MotionEvent e)149         public boolean onSingleTapUp(MotionEvent e) {
150             if (e.getX() < mGestureView.getWidth()/3) {
151                 pageLeft();
152             } else if (e.getX() < mGestureView.getWidth()*2/3) {
153                 hideControlButtons();
154             } else {
155                 pageRight();
156             }
157             return true;
158         }
159     }
160 
hideControlButtons()161     private void hideControlButtons() {
162         View[] views= {findViewById(R.id.slide_show_nav_prev),findViewById(R.id.slide_show_nav_next),findViewById(R.id.slide_show_nav_back)} ;
163         for (View view : views) {
164             if (view.getVisibility() == View.GONE) {
165                 view.setVisibility(View.VISIBLE);
166             } else if (view.getVisibility() == View.VISIBLE) {
167                 view.setVisibility(View.GONE);
168             }
169         }
170     }
171 
pageLeft()172     private void pageLeft() {
173         mWebView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_LEFT));
174     }
175 
pageRight()176     private void pageRight() {
177         mWebView.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_RIGHT));
178     }
179 }
180