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