Skip to content

Commit 67f24c9

Browse files
committed
Allow tracking swipe length and turning pages according to it
Customizable io options, 1 page means original behaviour, when page turns once on swipe start
1 parent f0b8cc4 commit 67f24c9

5 files changed

Lines changed: 148 additions & 4 deletions

File tree

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: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ 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;
651651
private boolean mIsPageMode;
652652
private int secondaryTapActionType = TAP_ACTION_TYPE_LONGPRESS;
653653
private boolean selectionModeActive = false;
@@ -937,6 +937,7 @@ public class TapHandler {
937937
private final static int STATE_WAIT_FOR_DOUBLE_CLICK = 5; // flipping is in progress
938938
private final static int STATE_DONE = 6; // done: no more tracking
939939
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
940941

941942
private final static int EXPIRATION_TIME_MS = 180000;
942943

@@ -980,6 +981,7 @@ private boolean cancel() {
980981
case STATE_WAIT_FOR_DOUBLE_CLICK:
981982
case STATE_DONE:
982983
case STATE_BRIGHTNESS:
984+
case STATE_FLIP_TRACKING:
983985
stopBrightnessControl(-1, -1);
984986
break;
985987
}
@@ -989,6 +991,41 @@ private boolean cancel() {
989991
return true;
990992
}
991993

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+
9921029
/// perform action and reset touch tracking state
9931030
private boolean performAction(final ReaderAction action, boolean checkForLinks) {
9941031
log.d("performAction on touch: " + action);
@@ -1191,6 +1228,10 @@ public boolean onTouchEvent(MotionEvent event) {
11911228
selectionModeActive = false;
11921229
state = STATE_DONE;
11931230
return cancel();
1231+
case STATE_FLIP_TRACKING:
1232+
updatePageFlipTracking(x, y);
1233+
state = STATE_DONE;
1234+
return cancel();
11941235
}
11951236
} else if (event.getAction() == MotionEvent.ACTION_DOWN) {
11961237
switch (state) {
@@ -1215,6 +1256,7 @@ public boolean onTouchEvent(MotionEvent event) {
12151256
case STATE_BRIGHTNESS:
12161257
case STATE_FLIPPING:
12171258
case STATE_SELECTION:
1259+
case STATE_FLIP_TRACKING:
12181260
return unexpectedEvent();
12191261
case STATE_WAIT_FOR_DOUBLE_CLICK:
12201262
if (doubleTapAction == ReaderAction.START_SELECTION)
@@ -1243,7 +1285,7 @@ public boolean onTouchEvent(MotionEvent event) {
12431285
}
12441286
}
12451287
int dir = mIsPageMode ? x - start_x : y - start_y;
1246-
if (gesturePageFlippingEnabled) {
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,7 @@ 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);
26292678
} else if ( key.equals(PROP_PAGE_VIEW_MODE)) {
26302679
mIsPageMode = flg;
26312680
} else if ( key.equals(PROP_APP_SECONDARY_TAP_ACTION_TYPE) ) {

0 commit comments

Comments
 (0)