Skip to content

Commit 216c6bd

Browse files
authored
Merge pull request #41 from S-trace/swipe_page_flip
Allow tracking swipe length and turning pages according to it
2 parents 07182bf + 67f24c9 commit 216c6bd

File tree

5 files changed

+153
-6
lines changed

5 files changed

+153
-6
lines changed

android/res/values-ru/strings.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,27 @@
564564
<string name="motion_timeout_90min">"90 минут"</string>
565565
<string name="motion_timeout_95min">"95 минут"</string>
566566
<string name="motion_timeout_100min">"100 минут"</string>
567+
<string name="pages_per_full_swipe_off">"Выключено"</string>
568+
<string name="pages_per_full_swipe_1">"1 страница (справа налево)"</string>
569+
<string name="pages_per_full_swipe_2">"2 страницы (отслеживать)"</string>
570+
<string name="pages_per_full_swipe_3">"3 страницы (отслеживать)"</string>
571+
<string name="pages_per_full_swipe_4">"4 страницы (отслеживать)"</string>
572+
<string name="pages_per_full_swipe_5">"5 страниц (отслеживать)"</string>
573+
<string name="pages_per_full_swipe_6">"6 страниц (отслеживать)"</string>
574+
<string name="pages_per_full_swipe_7">"7 страниц (отслеживать)"</string>
575+
<string name="pages_per_full_swipe_8">"8 страниц (отслеживать)"</string>
576+
<string name="pages_per_full_swipe_9">"9 страниц (отслеживать)"</string>
577+
<string name="pages_per_full_swipe_10">"10 страниц (отслеживать)"</string>
578+
<string name="pages_per_full_swipe_11">"11 страниц (отслеживать)"</string>
579+
<string name="pages_per_full_swipe_12">"12 страниц (отслеживать)"</string>
580+
<string name="pages_per_full_swipe_13">"13 страниц (отслеживать)"</string>
581+
<string name="pages_per_full_swipe_14">"14 страниц (отслеживать)"</string>
582+
<string name="pages_per_full_swipe_15">"15 страниц (отслеживать)"</string>
583+
<string name="pages_per_full_swipe_16">"16 страниц (отслеживать)"</string>
584+
<string name="pages_per_full_swipe_17">"17 страниц (отслеживать)"</string>
585+
<string name="pages_per_full_swipe_18">"18 страниц (отслеживать)"</string>
586+
<string name="pages_per_full_swipe_19">"19 страниц (отслеживать)"</string>
587+
<string name="pages_per_full_swipe_20">"20 страниц (отслеживать)"</string>
567588
<string name="options_app_ui_theme_hicontrast1">Контрастная белая</string>
568589
<string name="options_app_ui_theme_hicontrast2">Контрастная черная</string>
569590
</resources>

android/res/values/arrays.xml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,52 @@
6565
<item>95</item>
6666
<item>100</item>
6767
</integer-array>
68+
69+
<string-array name="pages_per_full_swipe_titles">
70+
<item>@string/pages_per_full_swipe_off</item>
71+
<item>@string/pages_per_full_swipe_1</item>
72+
<item>@string/pages_per_full_swipe_2</item>
73+
<item>@string/pages_per_full_swipe_3</item>
74+
<item>@string/pages_per_full_swipe_4</item>
75+
<item>@string/pages_per_full_swipe_5</item>
76+
<item>@string/pages_per_full_swipe_6</item>
77+
<item>@string/pages_per_full_swipe_7</item>
78+
<item>@string/pages_per_full_swipe_8</item>
79+
<item>@string/pages_per_full_swipe_9</item>
80+
<item>@string/pages_per_full_swipe_10</item>
81+
<item>@string/pages_per_full_swipe_11</item>
82+
<item>@string/pages_per_full_swipe_12</item>
83+
<item>@string/pages_per_full_swipe_13</item>
84+
<item>@string/pages_per_full_swipe_14</item>
85+
<item>@string/pages_per_full_swipe_15</item>
86+
<item>@string/pages_per_full_swipe_16</item>
87+
<item>@string/pages_per_full_swipe_17</item>
88+
<item>@string/pages_per_full_swipe_18</item>
89+
<item>@string/pages_per_full_swipe_19</item>
90+
<item>@string/pages_per_full_swipe_20</item>
91+
</string-array>
92+
93+
<integer-array name="pages_per_full_swipe_values">
94+
<item>0</item>
95+
<item>1</item>
96+
<item>2</item>
97+
<item>3</item>
98+
<item>4</item>
99+
<item>5</item>
100+
<item>6</item>
101+
<item>7</item>
102+
<item>8</item>
103+
<item>9</item>
104+
<item>10</item>
105+
<item>11</item>
106+
<item>12</item>
107+
<item>13</item>
108+
<item>14</item>
109+
<item>15</item>
110+
<item>16</item>
111+
<item>17</item>
112+
<item>18</item>
113+
<item>19</item>
114+
<item>20</item>
115+
</integer-array>
68116
</resources>

android/res/values/strings.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,4 +592,25 @@
592592
<string name="motion_timeout_90min">"90 minutes"</string>
593593
<string name="motion_timeout_95min">"95 minutes"</string>
594594
<string name="motion_timeout_100min">"100 minutes"</string>
595+
<string name="pages_per_full_swipe_off">"Off"</string>
596+
<string name="pages_per_full_swipe_1">"1 page (right to left)"</string>
597+
<string name="pages_per_full_swipe_2">"2 pages (track)"</string>
598+
<string name="pages_per_full_swipe_3">"3 pages (track)"</string>
599+
<string name="pages_per_full_swipe_4">"4 pages (track)"</string>
600+
<string name="pages_per_full_swipe_5">"5 pages (track)"</string>
601+
<string name="pages_per_full_swipe_6">"6 pages (track)"</string>
602+
<string name="pages_per_full_swipe_7">"7 pages (track)"</string>
603+
<string name="pages_per_full_swipe_8">"8 pages (track)"</string>
604+
<string name="pages_per_full_swipe_9">"9 pages (track)"</string>
605+
<string name="pages_per_full_swipe_10">"10 pages (track)"</string>
606+
<string name="pages_per_full_swipe_11">"11 pages (track)"</string>
607+
<string name="pages_per_full_swipe_12">"12 pages (track)"</string>
608+
<string name="pages_per_full_swipe_13">"13 pages (track)"</string>
609+
<string name="pages_per_full_swipe_14">"14 pages (track)"</string>
610+
<string name="pages_per_full_swipe_15">"15 pages (track)"</string>
611+
<string name="pages_per_full_swipe_16">"16 pages (track)"</string>
612+
<string name="pages_per_full_swipe_17">"17 pages (track)"</string>
613+
<string name="pages_per_full_swipe_18">"18 pages (track)"</string>
614+
<string name="pages_per_full_swipe_19">"19 pages (track)"</string>
615+
<string name="pages_per_full_swipe_20">"20 pages (track)"</string>
595616
</resources>

android/src/org/coolreader/crengine/OptionsDialog.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ public static int findBacklightSettingIndex( int value ) {
9292
};
9393
public static int[] mMotionTimeouts;
9494
public static String[] mMotionTimeoutsTitles;
95+
public static int[] mPagesPerFullSwipe;
96+
public static String[] mPagesPerFullSwipeTitles;
9597
int[] mInterlineSpaces = new int[] {
9698
80, 85, 90, 95, 100, 105, 110, 115, 120, 130, 140, 150, 160, 180, 200
9799
};
@@ -1963,7 +1965,7 @@ private void setupReaderOptions()
19631965
mOptionsControls.add(new BoolOption(this, getString(R.string.options_app_trackball_disable), PROP_APP_TRACKBALL_DISABLED).setDefaultValue("0"));
19641966
if ( !DeviceInfo.EINK_SCREEN )
19651967
mOptionsControls.add(new ListOption(this, getString(R.string.options_controls_flick_brightness), PROP_APP_FLICK_BACKLIGHT_CONTROL).add(mFlickBrightness, mFlickBrightnessTitles).setDefaultValue("1"));
1966-
mOptionsControls.add(new BoolOption(this, getString(R.string.option_controls_gesture_page_flipping_enabled), PROP_APP_GESTURE_PAGE_FLIPPING).setDefaultValue("1"));
1968+
mOptionsControls.add(new ListOption(this, getString(R.string.option_controls_gesture_page_flipping_enabled), PROP_APP_GESTURE_PAGE_FLIPPING).add(mPagesPerFullSwipe, mPagesPerFullSwipeTitles).setDefaultValue("1"));
19671969
mOptionsControls.add(new ListOption(this, getString(R.string.options_selection_action), PROP_APP_SELECTION_ACTION).add(mSelectionAction, mSelectionActionTitles).setDefaultValue("0"));
19681970
mOptionsControls.add(new ListOption(this, getString(R.string.options_multi_selection_action), PROP_APP_MULTI_SELECTION_ACTION).add(mMultiSelectionAction, mMultiSelectionActionTitles).setDefaultValue("0"));
19691971
mOptionsControls.add(new BoolOption(this, getString(R.string.options_selection_keep_selection_after_dictionary), PROP_APP_SELECTION_PERSIST).setDefaultValue("0"));
@@ -2039,6 +2041,9 @@ protected void onCreate(Bundle savedInstanceState) {
20392041
mMotionTimeoutsTitles = activity.getResources().getStringArray(R.array.motion_timeout_titles);
20402042
mMotionTimeouts = activity.getResources().getIntArray(R.array.motion_timeout_values);
20412043

2044+
mPagesPerFullSwipeTitles = activity.getResources().getStringArray(R.array.pages_per_full_swipe_titles);
2045+
mPagesPerFullSwipe = activity.getResources().getIntArray(R.array.pages_per_full_swipe_values);
2046+
20422047
if (mode == Mode.READER)
20432048
setupReaderOptions();
20442049
else if (mode == Mode.BROWSER)

android/src/org/coolreader/crengine/ReaderView.java

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,8 @@ public void copyToClipboard( String text ) {
647647
// private int selectionEndX = 0;
648648
// private int selectionEndY = 0;
649649
private boolean doubleTapSelectionEnabled = false;
650-
private boolean gesturePageFlippingEnabled = true;
650+
private int mGesturePageFlipsPerFullSwipe;
651+
private boolean mIsPageMode;
651652
private int secondaryTapActionType = TAP_ACTION_TYPE_LONGPRESS;
652653
private boolean selectionModeActive = false;
653654

@@ -936,6 +937,7 @@ public class TapHandler {
936937
private final static int STATE_WAIT_FOR_DOUBLE_CLICK = 5; // flipping is in progress
937938
private final static int STATE_DONE = 6; // done: no more tracking
938939
private final static int STATE_BRIGHTNESS = 7; // brightness change in progress
940+
private final static int STATE_FLIP_TRACKING = 8; // pages flip tracking in progress
939941

940942
private final static int EXPIRATION_TIME_MS = 180000;
941943

@@ -979,6 +981,7 @@ private boolean cancel() {
979981
case STATE_WAIT_FOR_DOUBLE_CLICK:
980982
case STATE_DONE:
981983
case STATE_BRIGHTNESS:
984+
case STATE_FLIP_TRACKING:
982985
stopBrightnessControl(-1, -1);
983986
break;
984987
}
@@ -988,6 +991,41 @@ private boolean cancel() {
988991
return true;
989992
}
990993

994+
private void adjustStartValuesOnDrag(int swipeDistance, int distanceForFlip) {
995+
if (Math.abs(swipeDistance) < distanceForFlip) {
996+
return; // Nothing to do
997+
}
998+
int direction = swipeDistance > 0 ? 1 : -1; // Left-to-right or right-to-left swipe?
999+
int value = direction * distanceForFlip;
1000+
while (Math.abs(swipeDistance) >= distanceForFlip) {
1001+
if (mIsPageMode) {
1002+
start_x += value;
1003+
} else {
1004+
start_y += value;
1005+
}
1006+
swipeDistance -= value;
1007+
}
1008+
}
1009+
1010+
private void updatePageFlipTracking(final int x, final int y) {
1011+
final int swipeDistance = mIsPageMode ? x - start_x : y - start_y;
1012+
final int distanceForFlip = surface.getWidth() / mGesturePageFlipsPerFullSwipe;
1013+
int pagesToFlip = swipeDistance / distanceForFlip;
1014+
if (pagesToFlip == 0) {
1015+
return; // Nothing to do
1016+
}
1017+
adjustStartValuesOnDrag(swipeDistance, distanceForFlip);
1018+
ReaderAction action = pagesToFlip > 0 ? ReaderAction.PAGE_DOWN : ReaderAction.PAGE_UP;
1019+
while (pagesToFlip != 0) {
1020+
onAction(action);
1021+
if (pagesToFlip > 0) {
1022+
pagesToFlip--;
1023+
} else {
1024+
pagesToFlip++;
1025+
}
1026+
}
1027+
}
1028+
9911029
/// perform action and reset touch tracking state
9921030
private boolean performAction(final ReaderAction action, boolean checkForLinks) {
9931031
log.d("performAction on touch: " + action);
@@ -1190,6 +1228,10 @@ public boolean onTouchEvent(MotionEvent event) {
11901228
selectionModeActive = false;
11911229
state = STATE_DONE;
11921230
return cancel();
1231+
case STATE_FLIP_TRACKING:
1232+
updatePageFlipTracking(x, y);
1233+
state = STATE_DONE;
1234+
return cancel();
11931235
}
11941236
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
11951237
switch (state) {
@@ -1214,6 +1256,7 @@ public boolean onTouchEvent(MotionEvent event) {
12141256
case STATE_BRIGHTNESS:
12151257
case STATE_FLIPPING:
12161258
case STATE_SELECTION:
1259+
case STATE_FLIP_TRACKING:
12171260
return unexpectedEvent();
12181261
case STATE_WAIT_FOR_DOUBLE_CLICK:
12191262
if (doubleTapAction == ReaderAction.START_SELECTION)
@@ -1241,9 +1284,8 @@ public boolean onTouchEvent(MotionEvent event) {
12411284
return true;
12421285
}
12431286
}
1244-
boolean isPageMode = mSettings.getInt(PROP_PAGE_VIEW_MODE, 1) == 1;
1245-
int dir = isPageMode ? x - start_x : y - start_y;
1246-
if (gesturePageFlippingEnabled) {
1287+
int dir = mIsPageMode ? x - start_x : y - start_y;
1288+
if (mGesturePageFlipsPerFullSwipe == 1) {
12471289
if (pageFlipAnimationSpeedMs == 0 || DeviceInfo.EINK_SCREEN) {
12481290
// no animation
12491291
return performAction(dir < 0 ? ReaderAction.PAGE_DOWN : ReaderAction.PAGE_UP, false);
@@ -1252,13 +1294,20 @@ public boolean onTouchEvent(MotionEvent event) {
12521294
updateAnimation(x, y);
12531295
state = STATE_FLIPPING;
12541296
}
1297+
if (mGesturePageFlipsPerFullSwipe > 1) {
1298+
state = STATE_FLIP_TRACKING;
1299+
updatePageFlipTracking(start_x, start_y);
1300+
}
12551301
return true;
12561302
case STATE_FLIPPING:
12571303
updateAnimation(x, y);
12581304
return true;
12591305
case STATE_BRIGHTNESS:
12601306
updateBrightnessControl(x, y);
12611307
return true;
1308+
case STATE_FLIP_TRACKING:
1309+
updatePageFlipTracking(x, y);
1310+
return true;
12621311
case STATE_WAIT_FOR_DOUBLE_CLICK:
12631312
return true;
12641313
case STATE_SELECTION:
@@ -2625,7 +2674,9 @@ public void applyAppSetting( String key, String value )
26252674
} else if ( key.equals(PROP_APP_DOUBLE_TAP_SELECTION) ) {
26262675
doubleTapSelectionEnabled = flg;
26272676
} else if ( key.equals(PROP_APP_GESTURE_PAGE_FLIPPING) ) {
2628-
gesturePageFlippingEnabled = flg;
2677+
mGesturePageFlipsPerFullSwipe = Integer.valueOf(value);
2678+
} else if ( key.equals(PROP_PAGE_VIEW_MODE)) {
2679+
mIsPageMode = flg;
26292680
} else if ( key.equals(PROP_APP_SECONDARY_TAP_ACTION_TYPE) ) {
26302681
secondaryTapActionType = flg ? TAP_ACTION_TYPE_DOUBLE : TAP_ACTION_TYPE_LONGPRESS;
26312682
} else if ( key.equals(PROP_APP_FLICK_BACKLIGHT_CONTROL) ) {
@@ -2697,6 +2748,7 @@ public void setAppSettings(Properties newSettings, Properties oldSettings)
26972748
viewMode = flg ? ViewMode.PAGES : ViewMode.SCROLL;
26982749
} else if ( PROP_APP_SCREEN_ORIENTATION.equals(key)
26992750
|| PROP_PAGE_ANIMATION.equals(key)
2751+
|| PROP_PAGE_VIEW_MODE.equals(key)
27002752
|| PROP_CONTROLS_ENABLE_VOLUME_KEYS.equals(key)
27012753
|| PROP_APP_SHOW_COVERPAGES.equals(key)
27022754
|| PROP_APP_COVERPAGE_SIZE.equals(key)

0 commit comments

Comments
 (0)