From db81d44e62fb8bf80daf70dc3f79e58f935a427d Mon Sep 17 00:00:00 2001 From: Synced Synapse Date: Tue, 30 Jan 2018 09:13:21 +0000 Subject: [PATCH] Simplify hardware volume key handling There's no need to have so many classes to handle the hardware volume keys. This PR simplifies it, without duplicating any more code than was already duplicated. --- .../org/xbmc/kore/ui/BaseMediaActivity.java | 33 +++------- ...olumeControllerDialogFragmentListener.java | 48 ++++++++++---- .../ui/sections/remote/RemoteActivity.java | 39 +++--------- .../OnHardwareVolumeKeyPressedCallback.java | 5 -- .../VolumeKeyActionHandler.java | 62 ------------------- 5 files changed, 54 insertions(+), 133 deletions(-) rename app/src/main/java/org/xbmc/kore/ui/{volumecontrollers => generic}/VolumeControllerDialogFragmentListener.java (79%) delete mode 100644 app/src/main/java/org/xbmc/kore/ui/volumecontrollers/OnHardwareVolumeKeyPressedCallback.java delete mode 100644 app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeKeyActionHandler.java diff --git a/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java b/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java index cd00a9b..596f29c 100644 --- a/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java +++ b/app/src/main/java/org/xbmc/kore/ui/BaseMediaActivity.java @@ -49,9 +49,7 @@ import org.xbmc.kore.jsonrpc.type.ListType; import org.xbmc.kore.jsonrpc.type.PlayerType; import org.xbmc.kore.ui.generic.NavigationDrawerFragment; import org.xbmc.kore.ui.sections.remote.RemoteActivity; -import org.xbmc.kore.ui.volumecontrollers.OnHardwareVolumeKeyPressedCallback; -import org.xbmc.kore.ui.volumecontrollers.VolumeControllerDialogFragmentListener; -import org.xbmc.kore.ui.volumecontrollers.VolumeKeyActionHandler; +import org.xbmc.kore.ui.generic.VolumeControllerDialogFragmentListener; import org.xbmc.kore.ui.widgets.MediaProgressIndicator; import org.xbmc.kore.ui.widgets.NowPlayingPanel; import org.xbmc.kore.ui.widgets.VolumeLevelIndicator; @@ -67,8 +65,7 @@ public abstract class BaseMediaActivity extends BaseActivity implements HostConnectionObserver.ApplicationEventsObserver, HostConnectionObserver.PlayerEventsObserver, NowPlayingPanel.OnPanelButtonsClickListener, - MediaProgressIndicator.OnProgressChangeListener, - OnHardwareVolumeKeyPressedCallback { + MediaProgressIndicator.OnProgressChangeListener { private static final String TAG = LogUtils.makeLogTag(BaseMediaActivity.class); private static final String NAVICON_ISARROW = "navstate"; @@ -84,7 +81,6 @@ public abstract class BaseMediaActivity extends BaseActivity private HostManager hostManager; private HostConnectionObserver hostConnectionObserver; - private VolumeKeyActionHandler volumeKeyActionHandler; private boolean showNowPlayingPanel; @@ -122,7 +118,7 @@ public abstract class BaseMediaActivity extends BaseActivity .findFragmentById(R.id.navigation_drawer); navigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); - Toolbar toolbar = (Toolbar)findViewById(R.id.default_toolbar); + Toolbar toolbar = findViewById(R.id.default_toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); @@ -215,23 +211,12 @@ public abstract class BaseMediaActivity extends BaseActivity */ @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (volumeKeyActionHandler == null) { - volumeKeyActionHandler = new VolumeKeyActionHandler(hostManager, this, this); + boolean handled = VolumeControllerDialogFragmentListener.handleVolumeKeyEvent(this, event); + if (handled) { + new VolumeControllerDialogFragmentListener() + .show(getSupportFragmentManager(), VolumeControllerDialogFragmentListener.class.getName()); } - return volumeKeyActionHandler.handleDispatchKeyEvent(event) || super.dispatchKeyEvent( - event); - } - - @Override - public void onHardwareVolumeKeyPressed() { - showVolumeChangeDialog(); - } - - private void showVolumeChangeDialog() { - VolumeControllerDialogFragmentListener volumeControllerDialogFragment = - new VolumeControllerDialogFragmentListener(); - volumeControllerDialogFragment.show(getSupportFragmentManager(), - VolumeControllerDialogFragmentListener.class.getName()); + return handled || super.dispatchKeyEvent(event); } public boolean getDrawerIndicatorIsArrow() { @@ -240,7 +225,7 @@ public abstract class BaseMediaActivity extends BaseActivity /** * Sets the title and drawer indicator of the toolbar - * @param title + * @param title toolbar title * @param showArrowIndicator true if the toolbar should show the back arrow indicator, * false if it should show the drawer icon */ diff --git a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeControllerDialogFragmentListener.java b/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java similarity index 79% rename from app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeControllerDialogFragmentListener.java rename to app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java index bfc6c8b..c6b2fb0 100644 --- a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeControllerDialogFragmentListener.java +++ b/app/src/main/java/org/xbmc/kore/ui/generic/VolumeControllerDialogFragmentListener.java @@ -1,22 +1,26 @@ -package org.xbmc.kore.ui.volumecontrollers; +package org.xbmc.kore.ui.generic; import android.app.Dialog; +import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.os.Handler; import android.support.annotation.Nullable; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatDialogFragment; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import org.xbmc.kore.R; +import org.xbmc.kore.Settings; import org.xbmc.kore.host.HostConnectionObserver; import org.xbmc.kore.host.HostManager; import org.xbmc.kore.jsonrpc.ApiCallback; import org.xbmc.kore.jsonrpc.ApiMethod; import org.xbmc.kore.jsonrpc.method.Application; +import org.xbmc.kore.jsonrpc.type.GlobalType; import org.xbmc.kore.ui.widgets.HighlightButton; import org.xbmc.kore.ui.widgets.VolumeLevelIndicator; import org.xbmc.kore.utils.LogUtils; @@ -26,7 +30,7 @@ import butterknife.InjectView; public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragment implements HostConnectionObserver.ApplicationEventsObserver, - OnHardwareVolumeKeyPressedCallback, VolumeLevelIndicator.VolumeBarTouchTrackerListener { + VolumeLevelIndicator.VolumeBarTouchTrackerListener { private static final String TAG = LogUtils.makeLogTag(VolumeControllerDialogFragmentListener.class); private static final int AUTO_DISMISS_DELAY = 2000; @@ -39,7 +43,6 @@ public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragm VolumeLevelIndicator volumeLevelIndicator; private Handler callbackHandler = new Handler(); - private VolumeKeyActionHandler volumeKeyActionHandler; private HostManager hostManager = null; private ApiCallback defaultIntActionCallback = ApiMethod.getDefaultActionCallback(); private View.OnClickListener onMuteToggleOnClickListener = new View.OnClickListener() { @@ -79,15 +82,15 @@ public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragm @Override public void onResume() { super.onResume(); - if (volumeKeyActionHandler == null) { - volumeKeyActionHandler = new VolumeKeyActionHandler(hostManager, getContext(), this); - } getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() { @Override public boolean onKey(android.content.DialogInterface dialog, int keyCode, android.view.KeyEvent event) { - - return volumeKeyActionHandler.handleDispatchKeyEvent(event); + boolean handled = handleVolumeKeyEvent(getContext(), event); + if (handled) { + delayedDismissDialog(); + } + return handled; } }); } @@ -156,11 +159,6 @@ public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragm volumeMuteButton.setHighlight(muted); } - @Override - public void onHardwareVolumeKeyPressed() { - delayedDismissDialog(); - } - private void delayedDismissDialog() { cancelDismissDialog(); callbackHandler.postDelayed(dismissDialog, AUTO_DISMISS_DELAY); @@ -180,4 +178,28 @@ public class VolumeControllerDialogFragmentListener extends AppCompatDialogFragm public void onStopTrackingTouch() { delayedDismissDialog(); } + + public static boolean handleVolumeKeyEvent(Context context, KeyEvent event) { + boolean shouldInterceptKey = + android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean(Settings.KEY_PREF_USE_HARDWARE_VOLUME_KEYS, + Settings.DEFAULT_PREF_USE_HARDWARE_VOLUME_KEYS); + + if (shouldInterceptKey) { + int action = event.getAction(); + int keyCode = event.getKeyCode(); + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + String volume = (keyCode == KeyEvent.KEYCODE_VOLUME_UP)? + GlobalType.IncrementDecrement.INCREMENT: + GlobalType.IncrementDecrement.DECREMENT; + if (action == KeyEvent.ACTION_DOWN) { + new Application.SetVolume(volume) + .execute(HostManager.getInstance(context).getConnection(), null, null); + } + return true; + } + } + return false; + } + } diff --git a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java index 618f5ec..fcdbdc6 100644 --- a/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java +++ b/app/src/main/java/org/xbmc/kore/ui/sections/remote/RemoteActivity.java @@ -55,9 +55,7 @@ import org.xbmc.kore.ui.generic.NavigationDrawerFragment; import org.xbmc.kore.ui.generic.SendTextDialogFragment; import org.xbmc.kore.ui.sections.hosts.AddHostActivity; import org.xbmc.kore.ui.views.CirclePageIndicator; -import org.xbmc.kore.ui.volumecontrollers.OnHardwareVolumeKeyPressedCallback; -import org.xbmc.kore.ui.volumecontrollers.VolumeControllerDialogFragmentListener; -import org.xbmc.kore.ui.volumecontrollers.VolumeKeyActionHandler; +import org.xbmc.kore.ui.generic.VolumeControllerDialogFragmentListener; import org.xbmc.kore.utils.LogUtils; import org.xbmc.kore.utils.TabsAdapter; import org.xbmc.kore.utils.UIUtils; @@ -78,7 +76,7 @@ import butterknife.InjectView; public class RemoteActivity extends BaseActivity implements HostConnectionObserver.PlayerEventsObserver, NowPlayingFragment.NowPlayingListener, - SendTextDialogFragment.SendTextDialogListener, OnHardwareVolumeKeyPressedCallback { + SendTextDialogFragment.SendTextDialogListener { private static final String TAG = LogUtils.makeLogTag(RemoteActivity.class); @@ -98,8 +96,6 @@ public class RemoteActivity extends BaseActivity private NavigationDrawerFragment navigationDrawerFragment; - private VolumeKeyActionHandler volumeKeyActionHandler; - private Future pendingShare; private Future awaitingShare; @@ -292,18 +288,15 @@ public class RemoteActivity extends BaseActivity */ @Override public boolean dispatchKeyEvent(KeyEvent event) { - if (volumeKeyActionHandler == null) { - volumeKeyActionHandler = new VolumeKeyActionHandler(hostManager, this, this); - } - return volumeKeyActionHandler.handleDispatchKeyEvent(event) || super.dispatchKeyEvent( - event); - } + boolean handled = VolumeControllerDialogFragmentListener.handleVolumeKeyEvent(this, event); - private void showVolumeChangeDialog() { - VolumeControllerDialogFragmentListener volumeControllerDialogFragment = - new VolumeControllerDialogFragmentListener(); - volumeControllerDialogFragment.show(getSupportFragmentManager(), - VolumeControllerDialogFragmentListener.class.getName()); + // Show volume change dialog if the event was handled and we are not in + // first page, which already contains a volume control + if (handled && (viewPager.getCurrentItem() != 0)) { + new VolumeControllerDialogFragmentListener() + .show(getSupportFragmentManager(), VolumeControllerDialogFragmentListener.class.getName()); + } + return handled || super.dispatchKeyEvent(event); } /** @@ -656,16 +649,4 @@ public class RemoteActivity extends BaseActivity playlistFragment.forceRefreshPlaylist(); } } - - @Override - public void onHardwareVolumeKeyPressed() { - int currentPage = viewPager.getCurrentItem(); - if (!isPageWithVolumeController(currentPage)) { - showVolumeChangeDialog(); - } - } - - private boolean isPageWithVolumeController(int currentPage) { - return currentPage == 0; - } } diff --git a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/OnHardwareVolumeKeyPressedCallback.java b/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/OnHardwareVolumeKeyPressedCallback.java deleted file mode 100644 index bc95bde..0000000 --- a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/OnHardwareVolumeKeyPressedCallback.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.xbmc.kore.ui.volumecontrollers; - -public interface OnHardwareVolumeKeyPressedCallback { - void onHardwareVolumeKeyPressed(); -} diff --git a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeKeyActionHandler.java b/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeKeyActionHandler.java deleted file mode 100644 index ccf7435..0000000 --- a/app/src/main/java/org/xbmc/kore/ui/volumecontrollers/VolumeKeyActionHandler.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.xbmc.kore.ui.volumecontrollers; - -import android.content.Context; -import android.support.annotation.Nullable; -import android.view.KeyEvent; - -import org.xbmc.kore.Settings; -import org.xbmc.kore.host.HostManager; -import org.xbmc.kore.jsonrpc.method.Application; -import org.xbmc.kore.jsonrpc.type.GlobalType; - -public class VolumeKeyActionHandler { - - private final HostManager hostManager; - private final Context context; - private final OnHardwareVolumeKeyPressedCallback onHardwareVolumeKeyPressedCallback; - - public VolumeKeyActionHandler(HostManager hostManager, Context context, - @Nullable OnHardwareVolumeKeyPressedCallback onHardwareVolumeKeyPressedCallback) { - this.hostManager = hostManager; - this.context = context; - this.onHardwareVolumeKeyPressedCallback = onHardwareVolumeKeyPressedCallback; - } - - public boolean handleDispatchKeyEvent(KeyEvent event) { - if (shouldInterceptKey()) { - int action = event.getAction(); - int keyCode = event.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { - if (action == KeyEvent.ACTION_DOWN) { - notifyCallback(); - setVolume(GlobalType.IncrementDecrement.INCREMENT); - } - return true; - } - else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { - if (action == KeyEvent.ACTION_DOWN) { - notifyCallback(); - setVolume(GlobalType.IncrementDecrement.DECREMENT); - } - return true; - } - } - return false; - } - - private void setVolume(String volume) { - new Application.SetVolume(volume).execute(hostManager.getConnection(), null, null); - } - - private boolean shouldInterceptKey() { - return android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(Settings.KEY_PREF_USE_HARDWARE_VOLUME_KEYS, - Settings.DEFAULT_PREF_USE_HARDWARE_VOLUME_KEYS); - } - - private void notifyCallback() { - if (onHardwareVolumeKeyPressedCallback != null) { - onHardwareVolumeKeyPressedCallback.onHardwareVolumeKeyPressed(); - } - } -}