Compare commits

...

4 Commits

Author SHA1 Message Date
Cameron Gutman 1a7a2f848e Don't close spinner dialogs when the AppList page is destroyed. Increment version 2014-07-22 00:16:35 -07:00
Cameron Gutman 887dd9aa21 Add GFE settings optimization checkbox. Move Add PC button to the main screen. 2014-07-21 23:58:20 -07:00
Cameron Gutman e1e4ccf318 Fix Shield's hardware back button 2014-07-21 23:57:28 -07:00
Cameron Gutman ee6edd2404 Allow up to 4 concurrent PC queries 2014-07-21 22:28:11 -07:00
12 changed files with 116 additions and 119 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.limelight"
android:versionCode="26"
android:versionName="2.5.1" >
android:versionCode="27"
android:versionName="2.5.1.1" >
<uses-sdk
android:minSdkVersion="16"
@@ -59,7 +59,7 @@
android:label="Add Computer Manually" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.limelight.StreamSettings" />
android:value="com.limelight.PcView" />
</activity>
<activity
android:name="com.limelight.Game"
+11 -10
View File
@@ -39,26 +39,27 @@ or to a theme attribute in the form "<code>?[<i>package</i>:][<i>type</i>:]<i>na
}
public static final class id {
public static final int addPc=0x7f080001;
public static final int advancedSettingsButton=0x7f080012;
public static final int advancedSettingsButton=0x7f080013;
public static final int appListText=0x7f080009;
public static final int autoDec=0x7f080004;
public static final int bitrateLabel=0x7f080006;
public static final int bitrateSeekBar=0x7f080007;
public static final int config1080p30Selected=0x7f080010;
public static final int config1080p60Selected=0x7f080011;
public static final int config720p30Selected=0x7f08000e;
public static final int config720p60Selected=0x7f08000f;
public static final int config1080p30Selected=0x7f080011;
public static final int config1080p60Selected=0x7f080012;
public static final int config720p30Selected=0x7f08000f;
public static final int config720p60Selected=0x7f080010;
public static final int decoderConfigGroup=0x7f080002;
public static final int discoveryText=0x7f08000b;
public static final int enableSops=0x7f080014;
public static final int hardwareDec=0x7f080005;
public static final int hostTextView=0x7f080000;
public static final int manuallyAddPc=0x7f080014;
public static final int manuallyAddPc=0x7f08000c;
public static final int pcListView=0x7f080008;
public static final int rowTextView=0x7f080015;
public static final int settingsButton=0x7f08000c;
public static final int rowTextView=0x7f080016;
public static final int settingsButton=0x7f08000d;
public static final int softwareDec=0x7f080003;
public static final int streamConfigGroup=0x7f08000d;
public static final int stretchToFill=0x7f080013;
public static final int streamConfigGroup=0x7f08000e;
public static final int stretchToFill=0x7f080015;
public static final int surfaceView=0x7f08000a;
}
public static final class layout {
Binary file not shown.
+1 -1
View File
@@ -29,7 +29,7 @@
android:layout_centerHorizontal="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_alignParentTop="true"
android:paddingTop="10dp"
android:paddingTop="0dp"
android:paddingBottom="10dp"
android:text="Applications" />
+10 -2
View File
@@ -29,8 +29,8 @@
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_below="@+id/settingsButton"
android:paddingTop="20dp"
android:layout_below="@+id/manuallyAddPc"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:text="Discovered PC List" />
@@ -41,5 +41,13 @@
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:text="Streaming Settings" />
<Button
android:id="@+id/manuallyAddPc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/settingsButton"
android:layout_centerHorizontal="true"
android:text="Add PC Manually" />
</RelativeLayout>
+9 -9
View File
@@ -54,18 +54,10 @@
android:id="@+id/advancedSettingsButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/stretchToFill"
android:layout_below="@+id/enableSops"
android:layout_centerHorizontal="true"
android:layout_marginTop="15dp"
android:text="Advanced Settings" />
<Button
android:id="@+id/manuallyAddPc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/advancedSettingsButton"
android:layout_centerHorizontal="true"
android:text="Add PC Manually" />
<CheckBox
android:id="@+id/stretchToFill"
@@ -74,6 +66,14 @@
android:layout_below="@+id/streamConfigGroup"
android:layout_marginTop="15dp"
android:text="Stretch video to fill screen" />
<CheckBox
android:id="@+id/enableSops"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/stretchToFill"
android:layout_marginTop="15dp"
android:text="Allow GFE to modify game settings for optimal streaming" />
</RelativeLayout>
+39 -5
View File
@@ -39,6 +39,7 @@ public class AppView extends Activity {
private final static int RESUME_ID = 1;
private final static int QUIT_ID = 2;
private final static int CANCEL_ID = 3;
public final static String ADDRESS_EXTRA = "Address";
public final static String UNIQUEID_EXTRA = "UniqueId";
@@ -80,8 +81,8 @@ public class AppView extends Activity {
return;
}
// Only open the context menu if it's running, otherwise start it
if (app.app.getIsRunning()) {
// Only open the context menu if something is running, otherwise start it
if (getRunningAppId() != -1) {
openContextMenu(arg1);
}
else {
@@ -98,7 +99,6 @@ public class AppView extends Activity {
super.onDestroy();
Dialog.closeDialogs();
SpinnerDialog.closeDialogs();
}
@Override
@@ -108,12 +108,43 @@ public class AppView extends Activity {
updateAppList();
}
private int getRunningAppId() {
int runningAppId = -1;
for (int i = 0; i < appListAdapter.getCount(); i++) {
AppObject app = appListAdapter.getItem(i);
if (app.app == null) {
continue;
}
if (app.app.getIsRunning()) {
runningAppId = app.app.getAppId();
break;
}
}
return runningAppId;
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, RESUME_ID, 1, "Resume Session");
menu.add(Menu.NONE, QUIT_ID, 2, "Quit Session");
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
AppObject selectedApp = (AppObject) appListAdapter.getItem(info.position);
if (selectedApp == null || selectedApp.app == null) {
return;
}
int runningAppId = getRunningAppId();
if (runningAppId != -1) {
if (runningAppId == selectedApp.app.getAppId()) {
menu.add(Menu.NONE, RESUME_ID, 1, "Resume Session");
menu.add(Menu.NONE, QUIT_ID, 2, "Quit Session");
}
else {
menu.add(Menu.NONE, RESUME_ID, 1, "Quit Current Game and Start");
menu.add(Menu.NONE, CANCEL_ID, 2, "Cancel");
}
}
}
@Override
@@ -135,6 +166,9 @@ public class AppView extends Activity {
doQuit(app.app);
return true;
case CANCEL_ID:
return true;
default:
return super.onContextItemSelected(item);
}
+18 -20
View File
@@ -79,7 +79,8 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
public static final String REFRESH_RATE_PREF_STRING = "FPS";
public static final String DECODER_PREF_STRING = "Decoder";
public static final String BITRATE_PREF_STRING = "Bitrate";
public static final String STRETCH_PREF_STRING = "Stretch";
public static final String STRETCH_PREF_STRING = "Stretch";
public static final String SOPS_PREF_STRING = "Sops";
public static final int BITRATE_DEFAULT_720_30 = 5;
public static final int BITRATE_DEFAULT_720_60 = 10;
@@ -92,6 +93,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
public static final int DEFAULT_DECODER = 0;
public static final int DEFAULT_BITRATE = BITRATE_DEFAULT_720_60;
public static final boolean DEFAULT_STRETCH = false;
public static final boolean DEFAULT_SOPS = true;
public static final int FORCE_HARDWARE_DECODER = -1;
public static final int AUTOSELECT_DECODER = 0;
@@ -148,10 +150,12 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
}
int refreshRate, bitrate;
boolean sops;
width = prefs.getInt(WIDTH_PREF_STRING, DEFAULT_WIDTH);
height = prefs.getInt(HEIGHT_PREF_STRING, DEFAULT_HEIGHT);
refreshRate = prefs.getInt(REFRESH_RATE_PREF_STRING, DEFAULT_REFRESH_RATE);
bitrate = prefs.getInt(BITRATE_PREF_STRING, DEFAULT_BITRATE);
sops = prefs.getBoolean(SOPS_PREF_STRING, DEFAULT_SOPS);
Display display = getWindowManager().getDefaultDisplay();
display.getSize(screenSize);
@@ -186,7 +190,7 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
// Start the connection
conn = new NvConnection(host, uniqueId, Game.this,
new StreamConfiguration(app, width, height, refreshRate, bitrate * 1000,
enableLargePackets ? 1460 : 1024), PlatformBinding.getCryptoProvider(this));
enableLargePackets ? 1460 : 1024, sops), PlatformBinding.getCryptoProvider(this));
keybTranslator = new KeyboardTranslator(conn);
controllerHandler = new ControllerHandler(conn);
decoderRenderer = new ConfigurableDecoderRenderer();
@@ -299,10 +303,6 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
return modifier;
}
private static boolean isSourceFlagSet(int sourcesFlags, int flag) {
return (sourcesFlags & flag) == flag;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
InputDevice dev = event.getDevice();
@@ -310,16 +310,15 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
return super.onKeyDown(keyCode, event);
}
int source = dev.getSources();
boolean handled = false;
if (isSourceFlagSet(source, InputDevice.SOURCE_DPAD) ||
isSourceFlagSet(source, InputDevice.SOURCE_GAMEPAD) ||
isSourceFlagSet(source, InputDevice.SOURCE_JOYSTICK))
{
handled = controllerHandler.handleButtonDown(keyCode, event);
// Pass-through virtual navigation keys
if ((event.getFlags() & KeyEvent.FLAG_VIRTUAL_HARD_KEY) != 0) {
return super.onKeyDown(keyCode, event);
}
// Try the controller handler first
boolean handled = controllerHandler.handleButtonDown(keyCode, event);
if (!handled) {
// Try the keyboard handler
short translated = keybTranslator.translate(event.getKeyCode());
if (translated == 0) {
return super.onKeyDown(keyCode, event);
@@ -349,16 +348,15 @@ public class Game extends Activity implements SurfaceHolder.Callback, OnGenericM
return super.onKeyUp(keyCode, event);
}
int source = dev.getSources();
boolean handled = false;
if (isSourceFlagSet(source, InputDevice.SOURCE_DPAD) ||
isSourceFlagSet(source, InputDevice.SOURCE_GAMEPAD) ||
isSourceFlagSet(source, InputDevice.SOURCE_JOYSTICK))
{
handled = controllerHandler.handleButtonUp(keyCode, event);
// Pass-through virtual navigation keys
if ((event.getFlags() & KeyEvent.FLAG_VIRTUAL_HARD_KEY) != 0) {
return super.onKeyUp(keyCode, event);
}
// Try the controller handler first
boolean handled = controllerHandler.handleButtonUp(keyCode, event);
if (!handled) {
// Try the keyboard handler
short translated = keybTranslator.translate(event.getKeyCode());
if (translated == 0) {
return super.onKeyUp(keyCode, event);
+11 -2
View File
@@ -37,7 +37,7 @@ import android.widget.Toast;
import android.widget.AdapterView.AdapterContextMenuInfo;
public class PcView extends Activity {
private Button settingsButton;
private Button settingsButton, addComputerButton;
private ListView pcList;
private ArrayAdapter<ComputerObject> pcListAdapter;
private ComputerManagerService.ComputerManagerBinder managerBinder;
@@ -85,6 +85,8 @@ public class PcView extends Activity {
// Setup the list view
settingsButton = (Button)findViewById(R.id.settingsButton);
addComputerButton = (Button)findViewById(R.id.manuallyAddPc);
pcList = (ListView)findViewById(R.id.pcListView);
pcListAdapter = new ArrayAdapter<ComputerObject>(this, R.layout.simplerow, R.id.rowTextView);
pcListAdapter.setNotifyOnChange(false);
@@ -119,6 +121,13 @@ public class PcView extends Activity {
startActivity(new Intent(PcView.this, StreamSettings.class));
}
});
addComputerButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(PcView.this, AddComputerManually.class);
startActivity(i);
}
});
addListPlaceholder();
}
@@ -494,7 +503,7 @@ public class PcView extends Activity {
private void addListPlaceholder() {
pcListAdapter.add(new ComputerObject("Discovery is running. No computers found yet. " +
"If your PC doesn't show up in about 15 seconds, " +
"make sure your computer is running GFE or add your PC manually on the settings page.", null));
"make sure your computer is running GFE or add your PC manually using the button above.", null));
}
private void removeListView(ComputerDetails details) {
+11 -10
View File
@@ -16,10 +16,10 @@ import android.content.Intent;
import android.content.SharedPreferences;
public class StreamSettings extends Activity {
private Button advancedSettingsButton, addComputerButton;
private Button advancedSettingsButton;
private SharedPreferences prefs;
private RadioButton rbutton720p30, rbutton720p60, rbutton1080p30, rbutton1080p60;
private CheckBox stretchToFill;
private CheckBox stretchToFill, enableSops;
@Override
protected void onStop() {
@@ -35,8 +35,8 @@ public class StreamSettings extends Activity {
setContentView(R.layout.activity_stream_settings);
this.stretchToFill = (CheckBox) findViewById(R.id.stretchToFill);
this.enableSops = (CheckBox) findViewById(R.id.enableSops);
this.advancedSettingsButton = (Button) findViewById(R.id.advancedSettingsButton);
this.addComputerButton = (Button) findViewById(R.id.manuallyAddPc);
this.rbutton720p30 = (RadioButton) findViewById(R.id.config720p30Selected);
this.rbutton720p60 = (RadioButton) findViewById(R.id.config720p60Selected);
this.rbutton1080p30 = (RadioButton) findViewById(R.id.config1080p30Selected);
@@ -48,6 +48,7 @@ public class StreamSettings extends Activity {
boolean fps30 = prefs.getInt(Game.REFRESH_RATE_PREF_STRING, Game.DEFAULT_REFRESH_RATE) == 30;
stretchToFill.setChecked(prefs.getBoolean(Game.STRETCH_PREF_STRING, Game.DEFAULT_STRETCH));
enableSops.setChecked(prefs.getBoolean(Game.SOPS_PREF_STRING, Game.DEFAULT_SOPS));
rbutton720p30.setChecked(false);
rbutton720p60.setChecked(false);
@@ -117,13 +118,6 @@ public class StreamSettings extends Activity {
startActivity(i);
}
});
addComputerButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(StreamSettings.this, AddComputerManually.class);
startActivity(i);
}
});
stretchToFill.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
@@ -131,5 +125,12 @@ public class StreamSettings extends Activity {
prefs.edit().putBoolean(Game.STRETCH_PREF_STRING, isChecked).commit();
}
});
enableSops.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
prefs.edit().putBoolean(Game.SOPS_PREF_STRING, isChecked).commit();
}
});
}
}
@@ -148,10 +148,6 @@ public class ControllerHandler {
}
}
mapping.isDpad = (dev.getSources() & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD;
mapping.isGamepad = (dev.getSources() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD ||
(dev.getSources() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK;
return mapping;
}
@@ -181,47 +177,6 @@ public class ControllerHandler {
leftStickX, leftStickY, rightStickX, rightStickY);
}
private static boolean isEventExpected(ControllerMapping mapping, int keyCode) {
if (mapping.isDpad) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
return true;
}
}
if (mapping.isGamepad) {
switch (keyCode) {
case KeyEvent.KEYCODE_BUTTON_MODE:
case KeyEvent.KEYCODE_BUTTON_START:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_BUTTON_SELECT:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_BUTTON_B:
case KeyEvent.KEYCODE_DPAD_CENTER:
case KeyEvent.KEYCODE_BUTTON_A:
case KeyEvent.KEYCODE_BUTTON_X:
case KeyEvent.KEYCODE_BUTTON_Y:
case KeyEvent.KEYCODE_BUTTON_L1:
case KeyEvent.KEYCODE_BUTTON_R1:
case KeyEvent.KEYCODE_BUTTON_THUMBL:
case KeyEvent.KEYCODE_BUTTON_THUMBR:
case KeyEvent.KEYCODE_BUTTON_L2:
case KeyEvent.KEYCODE_BUTTON_R2:
return true;
}
}
return false;
}
private static int handleRemapping(ControllerMapping mapping, int keyCode) {
if (mapping.isDualShock4) {
switch (keyCode) {
@@ -362,10 +317,6 @@ public class ControllerHandler {
return true;
}
if (!isEventExpected(mapping, keyCode)) {
return false;
}
// If the button hasn't been down long enough, sleep for a bit before sending the up event
// This allows "instant" button presses (like OUYA's virtual menu button) to work. This
// path should not be triggered during normal usage.
@@ -489,10 +440,6 @@ public class ControllerHandler {
return true;
}
if (!isEventExpected(mapping, keyCode)) {
return false;
}
switch (keyCode) {
case KeyEvent.KEYCODE_BUTTON_MODE:
inputMap |= ControllerPacket.SPECIAL_BUTTON_FLAG;
@@ -602,7 +549,5 @@ public class ControllerHandler {
public float hatYDeadzone;
public boolean isDualShock4;
public boolean isDpad;
public boolean isGamepad;
}
}
@@ -391,8 +391,9 @@ public class ComputerManagerService extends Service {
discoveryServiceConnection, Service.BIND_AUTO_CREATE);
// Create the thread pool for updating computer state
pollingPool = new ThreadPoolExecutor(1, MAX_CONCURRENT_REQUESTS, Long.MAX_VALUE, TimeUnit.DAYS,
new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardPolicy());
pollingPool = new ThreadPoolExecutor(MAX_CONCURRENT_REQUESTS, MAX_CONCURRENT_REQUESTS,
Long.MAX_VALUE, TimeUnit.DAYS, new LinkedBlockingQueue<Runnable>(),
new ThreadPoolExecutor.DiscardPolicy());
// Lookup or generate this device's UID
idManager = new IdentityManager(this);