From 769f926f16121022a561eb492f9c90c6bb118c5f Mon Sep 17 00:00:00 2001 From: Floens Date: Fri, 14 Aug 2015 12:45:42 +0200 Subject: [PATCH] Add an option to make the volume keys scroll the content --- .../floens/chan/controller/Controller.java | 5 +++++ .../chan/controller/NavigationController.java | 7 +++++++ .../chan/core/settings/ChanSettings.java | 2 ++ .../chan/ui/activity/StartActivity.java | 7 +++++++ .../AdvancedSettingsController.java | 1 + .../chan/ui/controller/DrawerController.java | 6 ++++++ .../controller/SplitNavigationController.java | 8 ++++++++ .../chan/ui/controller/ThreadController.java | 6 ++++++ .../floens/chan/ui/layout/ThreadLayout.java | 5 +++++ .../chan/ui/layout/ThreadListLayout.java | 20 +++++++++++++++++++ Clover/app/src/main/res/values/strings.xml | 1 + 11 files changed, 68 insertions(+) diff --git a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java index bfad43a5..80b51537 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/Controller.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/Controller.java @@ -19,6 +19,7 @@ package org.floens.chan.controller; import android.content.Context; import android.content.res.Configuration; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -85,6 +86,10 @@ public abstract class Controller { public void onConfigurationChanged(Configuration newConfig) { } + public boolean dispatchKeyEvent(KeyEvent event) { + return false; + } + public boolean onBack() { return false; } diff --git a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java index 6dec2d60..cd755a54 100644 --- a/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/controller/NavigationController.java @@ -19,6 +19,7 @@ package org.floens.chan.controller; import android.content.Context; import android.content.res.Configuration; +import android.view.KeyEvent; import android.view.ViewGroup; import java.util.ArrayList; @@ -173,6 +174,12 @@ public abstract class NavigationController extends Controller implements Control } } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + Controller top = getTop(); + return (top != null && top.dispatchKeyEvent(event)) || super.dispatchKeyEvent(event); + } + @Override public void onConfigurationChanged(Configuration newConfig) { for (Controller controller : controllerList) { diff --git a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java index 25b58bd6..ee92614d 100644 --- a/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java +++ b/Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java @@ -86,6 +86,7 @@ public class ChanSettings { public static final BooleanSetting repliesButtonsBottom; public static final BooleanSetting confirmExit; public static final BooleanSetting tapNoReply; + public static final BooleanSetting volumeKeysScrolling; public static final BooleanSetting watchEnabled; public static final BooleanSetting watchCountdown; @@ -146,6 +147,7 @@ public class ChanSettings { repliesButtonsBottom = new BooleanSetting(p, "preference_buttons_bottom", false); confirmExit = new BooleanSetting(p, "preference_confirm_exit", false); tapNoReply = new BooleanSetting(p, "preference_tap_no_reply", false); + volumeKeysScrolling = new BooleanSetting(p, "preference_volume_key_scrolling", false); watchEnabled = new BooleanSetting(p, "preference_watch_enabled", false, new Setting.SettingCallback() { @Override diff --git a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java index 74597313..df362871 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/activity/StartActivity.java @@ -26,7 +26,9 @@ import android.nfc.NdefMessage; import android.nfc.NfcAdapter; import android.nfc.NfcEvent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.ViewGroup; @@ -194,6 +196,11 @@ public class StartActivity extends AppCompatActivity implements NfcAdapter.Creat } } + @Override + public boolean dispatchKeyEvent(@NonNull KeyEvent event) { + return stackTop().dispatchKeyEvent(event) || super.dispatchKeyEvent(event); + } + @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java index 57c80efd..032fb435 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/AdvancedSettingsController.java @@ -114,6 +114,7 @@ public class AdvancedSettingsController extends SettingsController { settings.add(new BooleanSettingView(this, ChanSettings.repliesButtonsBottom, string(R.string.setting_buttons_bottom), null)); settings.add(new BooleanSettingView(this, ChanSettings.confirmExit, string(R.string.setting_confirm_exit), null)); settings.add(new BooleanSettingView(this, ChanSettings.tapNoReply, string(R.string.setting_tap_no_rely), null)); + settings.add(new BooleanSettingView(this, ChanSettings.volumeKeysScrolling, string(R.string.setting_volume_key_scrolling), null)); groups.add(settings); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java index ebae34d9..647ad4bb 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/DrawerController.java @@ -26,6 +26,7 @@ import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.Gravity; +import android.view.KeyEvent; import android.view.View; import android.widget.EditText; import android.widget.FrameLayout; @@ -158,6 +159,11 @@ public class DrawerController extends Controller implements PinAdapter.Callback, } } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return (childController != null && childController.dispatchKeyEvent(event)) || super.dispatchKeyEvent(event); + } + @Override public void onPinClicked(Pin pin) { drawerLayout.closeDrawer(Gravity.LEFT); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java index cec13664..b0748fcf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/SplitNavigationController.java @@ -19,6 +19,7 @@ package org.floens.chan.ui.controller; import android.content.Context; import android.content.res.Configuration; +import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; @@ -158,6 +159,13 @@ public class SplitNavigationController extends NavigationController implements A return super.onBack(); } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return (rightController != null && rightController.dispatchKeyEvent(event)) || + (leftController != null && leftController.dispatchKeyEvent(event)) || + super.dispatchKeyEvent(event); + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java index b9e4a0e5..20a332cf 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/ThreadController.java @@ -23,6 +23,7 @@ import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcEvent; import android.support.v4.widget.SwipeRefreshLayout; +import android.view.KeyEvent; import android.view.LayoutInflater; import org.floens.chan.Chan; @@ -108,6 +109,11 @@ public abstract class ThreadController extends Controller implements ThreadLayou return threadLayout.onBack(); } + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + return threadLayout.sendKeyEvent(event) || super.dispatchKeyEvent(event); + } + public void onEvent(Chan.ForegroundChangedMessage message) { threadLayout.getPresenter().onForegroundChanged(message.inForeground); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java index 4c57e8d1..a6a6bef2 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadLayout.java @@ -29,6 +29,7 @@ import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.util.AttributeSet; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.animation.DecelerateInterpolator; @@ -161,6 +162,10 @@ public class ThreadLayout extends CoordinatorLayout implements ThreadPresenter.T return threadListLayout.onBack(); } + public boolean sendKeyEvent(KeyEvent event) { + return threadListLayout.sendKeyEvent(event); + } + public ThreadPresenter getPresenter() { return presenter; } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java index a8debbeb..319e6630 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/layout/ThreadListLayout.java @@ -18,10 +18,12 @@ package org.floens.chan.ui.layout; import android.content.Context; +import android.support.annotation.NonNull; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; +import android.view.KeyEvent; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; @@ -32,6 +34,7 @@ import org.floens.chan.core.model.Loadable; import org.floens.chan.core.model.Post; import org.floens.chan.core.model.PostImage; import org.floens.chan.core.presenter.ReplyPresenter; +import org.floens.chan.core.settings.ChanSettings; import org.floens.chan.ui.adapter.PostAdapter; import org.floens.chan.ui.adapter.PostsFilter; import org.floens.chan.ui.cell.PostCell; @@ -41,6 +44,7 @@ import org.floens.chan.ui.toolbar.Toolbar; import org.floens.chan.ui.view.ThumbnailView; import org.floens.chan.utils.AndroidUtils; import org.floens.chan.utils.AnimationUtils; +import org.floens.chan.utils.Logger; import java.util.List; @@ -224,6 +228,22 @@ public class ThreadListLayout extends LinearLayout implements ReplyLayout.ReplyL } } + public boolean sendKeyEvent(KeyEvent event) { + if (ChanSettings.volumeKeysScrolling.get()) { + switch (event.getKeyCode()) { + case KeyEvent.KEYCODE_VOLUME_UP: + case KeyEvent.KEYCODE_VOLUME_DOWN: + if (event.getAction() == KeyEvent.ACTION_DOWN) { + boolean down = event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN; + int scroll = (int) (getHeight() * 0.75); + recyclerView.smoothScrollBy(0, down ? scroll : -scroll); + } + return true; + } + } + return false; + } + public void openReply(boolean open) { if (showingThread != null && replyOpen != open) { this.replyOpen = open; diff --git a/Clover/app/src/main/res/values/strings.xml b/Clover/app/src/main/res/values/strings.xml index 516ccd4d..24f0f5b2 100644 --- a/Clover/app/src/main/res/values/strings.xml +++ b/Clover/app/src/main/res/values/strings.xml @@ -328,6 +328,7 @@ along with this program. If not, see . Confirm before exit Confirm exit Tap the post number to reply + Volume keys scroll content HTTP Proxy Enable proxy