Skip to content

Commit 7c71b57

Browse files
author
Karim Mreisi
committed
game menu: show input device game menu options
1 parent c9fe96a commit 7c71b57

File tree

6 files changed

+66
-59
lines changed

6 files changed

+66
-59
lines changed

app/src/main/java/com/limelight/Game.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.limelight.binding.PlatformBinding;
55
import com.limelight.binding.audio.AndroidAudioRenderer;
66
import com.limelight.binding.input.ControllerHandler;
7+
import com.limelight.binding.input.GameInputDevice;
78
import com.limelight.binding.input.KeyboardTranslator;
89
import com.limelight.binding.input.capture.InputCaptureManager;
910
import com.limelight.binding.input.capture.InputCaptureProvider;
@@ -1417,15 +1418,6 @@ public void toggleKeyboard() {
14171418
inputManager.toggleSoftInput(0, 0);
14181419
}
14191420

1420-
public boolean isMouseEmulationActive() {
1421-
return controllerHandler.isMouseEmulationEnabled();
1422-
}
1423-
1424-
public void toggleMouseEmulation() {
1425-
controllerHandler.toggleMouseEmulation();
1426-
}
1427-
1428-
14291421
// Returns true if the event was consumed
14301422
// NB: View is only present if called from a view callback
14311423
private boolean handleMotionEvent(View view, MotionEvent event) {
@@ -2269,10 +2261,9 @@ public void onUsbPermissionPromptCompleted() {
22692261
updatePipAutoEnter();
22702262
}
22712263

2272-
22732264
@Override
2274-
public void showGameMenu() {
2275-
new GameMenu(this, conn);
2265+
public void showGameMenu(GameInputDevice device) {
2266+
new GameMenu(this, conn, device);
22762267
}
22772268

22782269
@Override
@@ -2286,7 +2277,7 @@ public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
22862277
// Intercept back key event before android handles it
22872278
// Always handle the request, the user has to select "Disconnect" within the game menu to actually disconnect
22882279
if (keyCode == keyEvent.KEYCODE_BACK) {
2289-
showGameMenu();
2280+
showGameMenu(null);
22902281
return true;
22912282
}
22922283
case KeyEvent.ACTION_UP:

app/src/main/java/com/limelight/GameMenu.java

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
import android.os.Handler;
55
import android.widget.ArrayAdapter;
66

7+
import com.limelight.binding.input.GameInputDevice;
78
import com.limelight.binding.input.KeyboardTranslator;
89
import com.limelight.nvstream.NvConnection;
910
import com.limelight.nvstream.input.KeyboardPacket;
1011

12+
import java.util.ArrayList;
13+
import java.util.List;
14+
1115
/**
1216
* Provide options for ongoing Game Stream.
1317
* <p>
@@ -17,22 +21,24 @@ public class GameMenu {
1721

1822
private static final long KEY_UP_DELAY = 25;
1923

20-
private static class MenuOption {
24+
public static class MenuOption {
2125
private final String label;
2226
private final Runnable runnable;
2327

24-
MenuOption(String label, Runnable runnable) {
28+
public MenuOption(String label, Runnable runnable) {
2529
this.label = label;
2630
this.runnable = runnable;
2731
}
2832
}
2933

3034
private final Game game;
3135
private final NvConnection conn;
36+
private final GameInputDevice device;
3237

33-
public GameMenu(Game game, NvConnection conn) {
38+
public GameMenu(Game game, NvConnection conn, GameInputDevice device) {
3439
this.game = game;
3540
this.conn = conn;
41+
this.device = device;
3642

3743
showMenu();
3844
}
@@ -79,10 +85,6 @@ private void sendKeys(short[] keys) {
7985
}), KEY_UP_DELAY);
8086
}
8187

82-
private boolean isMouseEmulationActive() {
83-
return game.isMouseEmulationActive();
84-
}
85-
8688
private void showMenuDialog(String title, MenuOption[] options) {
8789
AlertDialog.Builder builder = new AlertDialog.Builder(game);
8890
builder.setTitle(title);
@@ -132,15 +134,19 @@ private void showSpecialKeysMenu() {
132134
}
133135

134136
private void showMenu() {
135-
showMenuDialog("Game Menu", new MenuOption[]{
136-
new MenuOption(getString(R.string.game_menu_send_keys), () -> showSpecialKeysMenu()),
137-
new MenuOption(getString(isMouseEmulationActive() ?
138-
R.string.game_menu_toggle_mouse_off : R.string.game_menu_toggle_mouse_on),
139-
() -> game.toggleMouseEmulation()),
140-
new MenuOption(getString(R.string.game_menu_toggle_keyboard),
141-
() -> game.toggleKeyboard()),
142-
new MenuOption(getString(R.string.game_menu_disconnect), () -> game.onBackPressed()),
143-
new MenuOption(getString(R.string.game_menu_cancel), null),
144-
});
137+
List<MenuOption> options = new ArrayList<>();
138+
139+
options.add(new MenuOption(getString(R.string.game_menu_toggle_keyboard),
140+
() -> game.toggleKeyboard()));
141+
142+
if (device != null) {
143+
options.addAll(device.getGameMenuOptions());
144+
}
145+
146+
options.add(new MenuOption(getString(R.string.game_menu_send_keys), () -> showSpecialKeysMenu()));
147+
options.add(new MenuOption(getString(R.string.game_menu_disconnect), () -> game.onBackPressed()));
148+
options.add(new MenuOption(getString(R.string.game_menu_cancel), null));
149+
150+
showMenuDialog("Game Menu", options.toArray(new MenuOption[options.size()]));
145151
}
146152
}

app/src/main/java/com/limelight/binding/input/ControllerHandler.java

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import android.view.MotionEvent;
2323
import android.widget.Toast;
2424

25+
import com.limelight.GameMenu;
2526
import com.limelight.LimeLog;
27+
import com.limelight.R;
2628
import com.limelight.binding.input.driver.AbstractController;
2729
import com.limelight.binding.input.driver.UsbDriverListener;
2830
import com.limelight.binding.input.driver.UsbDriverService;
@@ -36,6 +38,8 @@
3638
import org.cgutman.shieldcontrollerextensions.SceManager;
3739

3840
import java.lang.reflect.InvocationTargetException;
41+
import java.util.ArrayList;
42+
import java.util.List;
3943

4044
public class ControllerHandler implements InputManager.InputDeviceListener, UsbDriverListener {
4145

@@ -1511,7 +1515,7 @@ public boolean handleButtonUp(KeyEvent event) {
15111515
if ((context.inputMap & ControllerPacket.PLAY_FLAG) != 0 &&
15121516
event.getEventTime() - context.startDownTime > ControllerHandler.START_DOWN_TIME_MOUSE_MODE_MS &&
15131517
prefConfig.mouseEmulation) {
1514-
gestures.showGameMenu();
1518+
gestures.showGameMenu(context);
15151519
}
15161520
context.inputMap &= ~ControllerPacket.PLAY_FLAG;
15171521
break;
@@ -1858,7 +1862,7 @@ public void deviceAdded(AbstractController controller) {
18581862
usbDeviceContexts.put(controller.getControllerId(), context);
18591863
}
18601864

1861-
class GenericControllerContext {
1865+
class GenericControllerContext implements GameInputDevice {
18621866
public int id;
18631867
public boolean external;
18641868

@@ -1901,9 +1905,20 @@ public void run() {
19011905
}
19021906
};
19031907

1904-
public void toggleMouseEmulation(boolean enable) {
1908+
@Override
1909+
public List<GameMenu.MenuOption> getGameMenuOptions() {
1910+
List<GameMenu.MenuOption> options = new ArrayList<>();
1911+
options.add(new GameMenu.MenuOption(activityContext.getString(mouseEmulationActive ?
1912+
R.string.game_menu_toggle_mouse_off : R.string.game_menu_toggle_mouse_on),
1913+
() -> toggleMouseEmulation()));
1914+
1915+
return options;
1916+
}
1917+
1918+
public void toggleMouseEmulation() {
19051919
handler.removeCallbacks(mouseEmulationRunnable);
1906-
mouseEmulationActive = enable;
1920+
mouseEmulationActive = !mouseEmulationActive;
1921+
Toast.makeText(activityContext, "Mouse emulation is: " + (mouseEmulationActive ? "ON" : "OFF"), Toast.LENGTH_SHORT).show();
19071922

19081923
if (mouseEmulationActive) {
19091924
handler.postDelayed(mouseEmulationRunnable, mouseEmulationReportPeriod);
@@ -1985,27 +2000,4 @@ public void destroy() {
19852000
// Nothing for now
19862001
}
19872002
}
1988-
1989-
public void toggleMouseEmulation() {
1990-
1991-
boolean enable = !defaultContext.mouseEmulationActive;
1992-
defaultContext.mouseEmulationActive = enable;
1993-
defaultContext.toggleMouseEmulation(enable);
1994-
1995-
for (int i = 0; i < inputDeviceContexts.size(); i++) {
1996-
InputDeviceContext deviceContext = inputDeviceContexts.valueAt(i);
1997-
deviceContext.toggleMouseEmulation(enable);
1998-
}
1999-
2000-
for (int i = 0; i < usbDeviceContexts.size(); i++) {
2001-
UsbDeviceContext deviceContext = usbDeviceContexts.valueAt(i);
2002-
deviceContext.toggleMouseEmulation(enable);
2003-
}
2004-
2005-
Toast.makeText(activityContext, "Mouse emulation is: " + (enable ? "ON" : "OFF"), Toast.LENGTH_SHORT).show();
2006-
}
2007-
2008-
public boolean isMouseEmulationEnabled() {
2009-
return defaultContext.mouseEmulationActive;
2010-
}
20112003
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.limelight.binding.input;
2+
3+
import com.limelight.GameMenu;
4+
5+
import java.util.List;
6+
7+
/**
8+
* Generic Input Device
9+
*/
10+
public interface GameInputDevice {
11+
12+
/**
13+
* @return list of device specific game menu options, e.g. configure a controller's mouse mode
14+
*/
15+
List<GameMenu.MenuOption> getGameMenuOptions();
16+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.limelight.ui;
22

3+
import com.limelight.binding.input.GameInputDevice;
4+
35
public interface GameGestures {
46
void toggleKeyboard();
57

6-
void showGameMenu();
8+
void showGameMenu(GameInputDevice device);
79
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@
132132
<string name="applist_details_id">App ID:</string>
133133

134134
<!-- In Game menu -->
135+
<string name="game_menu_toggle_keyboard">Toggle On-screen Keyboard</string>
135136
<string name="game_menu_toggle_mouse_on">Enable Controller Mouse Emulation</string>
136137
<string name="game_menu_toggle_mouse_off">Disable Controller Mouse Emulation</string>
137-
<string name="game_menu_toggle_keyboard">Toggle On-screen Keyboard</string>
138138
<string name="game_menu_disconnect">Disconnect</string>
139139
<string name="game_menu_cancel">Cancel</string>
140140
<string name="game_menu_send_keys">Send special Key(s)</string>

0 commit comments

Comments
 (0)