package com.limelight.utils; import android.app.Activity; import android.content.Intent; import android.widget.Toast; import com.limelight.AppView; import com.limelight.Game; import com.limelight.PcView; import com.limelight.R; import com.limelight.ShortcutTrampoline; import com.limelight.binding.PlatformBinding; import com.limelight.computers.ComputerManagerService; import com.limelight.nvstream.http.ComputerDetails; import com.limelight.nvstream.http.GfeHttpResponseException; import com.limelight.nvstream.http.NvApp; import com.limelight.nvstream.http.NvHTTP; import com.limelight.nvstream.jni.MoonBridge; import org.xmlpull.v1.XmlPullParserException; import java.io.FileNotFoundException; import java.io.IOException; import java.net.UnknownHostException; import java.security.cert.CertificateEncodingException; public class ServerHelper { public static final String CONNECTION_TEST_SERVER = "android.conntest.moonlight-stream.org"; public static String getCurrentAddressFromComputer(ComputerDetails computer) throws IOException { if (computer.activeAddress == null) { throw new IOException("No active address for "+computer.name); } return computer.activeAddress; } public static Intent createPcShortcutIntent(Activity parent, ComputerDetails computer) { Intent i = new Intent(parent, ShortcutTrampoline.class); i.putExtra(AppView.NAME_EXTRA, computer.name); i.putExtra(AppView.UUID_EXTRA, computer.uuid); i.setAction(Intent.ACTION_DEFAULT); return i; } public static Intent createAppShortcutIntent(Activity parent, ComputerDetails computer, NvApp app) { Intent i = new Intent(parent, ShortcutTrampoline.class); i.putExtra(AppView.NAME_EXTRA, computer.name); i.putExtra(AppView.UUID_EXTRA, computer.uuid); i.putExtra(Game.EXTRA_APP_NAME, app.getAppName()); i.putExtra(Game.EXTRA_APP_ID, ""+app.getAppId()); i.putExtra(Game.EXTRA_APP_HDR, app.isHdrSupported()); i.setAction(Intent.ACTION_DEFAULT); return i; } public static Intent createStartIntent(Activity parent, NvApp app, ComputerDetails computer, ComputerManagerService.ComputerManagerBinder managerBinder) { Intent intent = new Intent(parent, Game.class); intent.putExtra(Game.EXTRA_HOST, computer.activeAddress); intent.putExtra(Game.EXTRA_APP_NAME, app.getAppName()); intent.putExtra(Game.EXTRA_APP_ID, app.getAppId()); intent.putExtra(Game.EXTRA_APP_HDR, app.isHdrSupported()); intent.putExtra(Game.EXTRA_UNIQUEID, managerBinder.getUniqueId()); intent.putExtra(Game.EXTRA_PC_UUID, computer.uuid); intent.putExtra(Game.EXTRA_PC_NAME, computer.name); try { if (computer.serverCert != null) { intent.putExtra(Game.EXTRA_SERVER_CERT, computer.serverCert.getEncoded()); } } catch (CertificateEncodingException e) { e.printStackTrace(); } return intent; } public static void doStart(Activity parent, NvApp app, ComputerDetails computer, ComputerManagerService.ComputerManagerBinder managerBinder) { if (computer.state == ComputerDetails.State.OFFLINE || computer.activeAddress == null) { Toast.makeText(parent, parent.getResources().getString(R.string.pair_pc_offline), Toast.LENGTH_SHORT).show(); return; } parent.startActivity(createStartIntent(parent, app, computer, managerBinder)); } public static void doNetworkTest(final Activity parent) { new Thread(new Runnable() { @Override public void run() { SpinnerDialog spinnerDialog = SpinnerDialog.displayDialog(parent, parent.getResources().getString(R.string.nettest_title_waiting), parent.getResources().getString(R.string.nettest_text_waiting), false); int ret = MoonBridge.testClientConnectivity(CONNECTION_TEST_SERVER, 443, MoonBridge.ML_PORT_FLAG_ALL); spinnerDialog.dismiss(); String dialogSummary; if (ret == MoonBridge.ML_TEST_RESULT_INCONCLUSIVE) { dialogSummary = parent.getResources().getString(R.string.nettest_text_inconclusive); } else if (ret == 0) { dialogSummary = parent.getResources().getString(R.string.nettest_text_success); } else { dialogSummary = parent.getResources().getString(R.string.nettest_text_failure); dialogSummary += MoonBridge.stringifyPortFlags(ret, "\n"); } Dialog.displayDialog(parent, parent.getResources().getString(R.string.nettest_title_done), dialogSummary, false); } }).start(); } public static void doQuit(final Activity parent, final ComputerDetails computer, final NvApp app, final ComputerManagerService.ComputerManagerBinder managerBinder, final Runnable onComplete) { Toast.makeText(parent, parent.getResources().getString(R.string.applist_quit_app) + " " + app.getAppName() + "...", Toast.LENGTH_SHORT).show(); new Thread(new Runnable() { @Override public void run() { NvHTTP httpConn; String message; try { httpConn = new NvHTTP(ServerHelper.getCurrentAddressFromComputer(computer), managerBinder.getUniqueId(), computer.serverCert, PlatformBinding.getCryptoProvider(parent)); if (httpConn.quitApp()) { message = parent.getResources().getString(R.string.applist_quit_success) + " " + app.getAppName(); } else { message = parent.getResources().getString(R.string.applist_quit_fail) + " " + app.getAppName(); } } catch (GfeHttpResponseException e) { if (e.getErrorCode() == 599) { message = "This session wasn't started by this device," + " so it cannot be quit. End streaming on the original " + "device or the PC itself. (Error code: "+e.getErrorCode()+")"; } else { message = e.getMessage(); } } catch (UnknownHostException e) { message = parent.getResources().getString(R.string.error_unknown_host); } catch (FileNotFoundException e) { message = parent.getResources().getString(R.string.error_404); } catch (IOException | XmlPullParserException e) { message = e.getMessage(); e.printStackTrace(); } finally { if (onComplete != null) { onComplete.run(); } } final String toastMessage = message; parent.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(parent, toastMessage, Toast.LENGTH_LONG).show(); } }); } }).start(); } }