From b6e4d5528b412a4aadd5ff164ab89f6e932adfa8 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 5 Nov 2016 21:29:59 -0700 Subject: [PATCH] Fix and enable launcher shortcuts on Android 7.1 --- app/src/main/AndroidManifest.xml | 9 ++ app/src/main/java/com/limelight/AppView.java | 35 +----- .../limelight/AppViewShortcutTrampoline.java | 119 ++++++++++++++++++ .../com/limelight/utils/ShortcutHelper.java | 9 +- app/src/main/res/mipmap-hdpi/ic_pc_scut.png | Bin 0 -> 2626 bytes app/src/main/res/mipmap-mdpi/ic_pc_scut.png | Bin 0 -> 1641 bytes app/src/main/res/mipmap-xhdpi/ic_pc_scut.png | Bin 0 -> 3757 bytes app/src/main/res/mipmap-xxhdpi/ic_pc_scut.png | Bin 0 -> 5998 bytes .../main/res/mipmap-xxxhdpi/ic_pc_scut.png | Bin 0 -> 8781 bytes 9 files changed, 135 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/com/limelight/AppViewShortcutTrampoline.java create mode 100644 app/src/main/res/mipmap-hdpi/ic_pc_scut.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_pc_scut.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_pc_scut.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_pc_scut.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_pc_scut.png diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ba989ce..487c8d85 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,6 +51,15 @@ + + + + diff --git a/app/src/main/java/com/limelight/AppView.java b/app/src/main/java/com/limelight/AppView.java index a85c91fa..673d4a2e 100644 --- a/app/src/main/java/com/limelight/AppView.java +++ b/app/src/main/java/com/limelight/AppView.java @@ -49,12 +49,11 @@ public class AppView extends Activity implements AdapterFragmentCallbacks { private ComputerDetails computer; private ComputerManagerService.ApplistPoller poller; - private SpinnerDialog blockingLoadSpinner, blockingServerinfoSpinner; + private SpinnerDialog blockingLoadSpinner; private String lastRawApplist; private int lastRunningAppId; private boolean suspendGridUpdates; private boolean inForeground; - private boolean launchedFromShortcut; private final static int START_OR_RESUME_ID = 1; private final static int QUIT_ID = 2; @@ -63,7 +62,6 @@ public class AppView extends Activity implements AdapterFragmentCallbacks { public final static String NAME_EXTRA = "Name"; public final static String UUID_EXTRA = "UUID"; - public final static String SHORTCUT_EXTRA = "Shortcut"; private ComputerManagerService.ComputerManagerBinder managerBinder; private final ServiceConnection serviceConnection = new ServiceConnection() { @@ -183,30 +181,6 @@ public class AppView extends Activity implements AdapterFragmentCallbacks { return; } - if (launchedFromShortcut) { - if (details.state == ComputerDetails.State.ONLINE) { - if (blockingServerinfoSpinner != null) { - blockingServerinfoSpinner.dismiss(); - blockingServerinfoSpinner = null; - } - - if (details.runningGameId != 0) { - AppView.this.runOnUiThread(new Runnable() { - @Override - public void run() { - // We have to finish this activity here otherwise we'll get into a loop - // when the user hits back - finish(); - - // When launched from shortcut, resume the running game - ServerHelper.doStart(AppView.this, new NvApp("app", details.runningGameId), computer, managerBinder); - } - }); - return; - } - } - } - // App list is the same or empty if (details.rawAppList == null || details.rawAppList.equals(lastRawApplist)) { @@ -274,13 +248,6 @@ public class AppView extends Activity implements AdapterFragmentCallbacks { uuidString = getIntent().getStringExtra(UUID_EXTRA); - launchedFromShortcut = getIntent().getBooleanExtra(SHORTCUT_EXTRA, false); - if (launchedFromShortcut) { - // Display blocking loading spinner - blockingLoadSpinner = SpinnerDialog.displayDialog(this, getResources().getString(R.string.conn_establishing_title), - getResources().getString(R.string.applist_connect_msg), true); - } - shortcutHelper.reportShortcutUsed(uuidString); String labelText = getResources().getString(R.string.title_applist)+" "+getIntent().getStringExtra(NAME_EXTRA); diff --git a/app/src/main/java/com/limelight/AppViewShortcutTrampoline.java b/app/src/main/java/com/limelight/AppViewShortcutTrampoline.java new file mode 100644 index 00000000..19c136ad --- /dev/null +++ b/app/src/main/java/com/limelight/AppViewShortcutTrampoline.java @@ -0,0 +1,119 @@ +package com.limelight; + +import android.app.Activity; +import android.app.Service; +import android.content.ComponentName; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.IBinder; + +import com.limelight.computers.ComputerManagerListener; +import com.limelight.computers.ComputerManagerService; +import com.limelight.nvstream.http.ComputerDetails; +import com.limelight.nvstream.http.NvApp; +import com.limelight.utils.ServerHelper; +import com.limelight.utils.SpinnerDialog; +import com.limelight.utils.UiHelper; + +import java.util.UUID; + +public class AppViewShortcutTrampoline extends Activity { + private String uuidString; + + private ComputerDetails computer; + private SpinnerDialog blockingLoadSpinner; + + public final static String UUID_EXTRA = "UUID"; + + private ComputerManagerService.ComputerManagerBinder managerBinder; + private final ServiceConnection serviceConnection = new ServiceConnection() { + public void onServiceConnected(ComponentName className, IBinder binder) { + final ComputerManagerService.ComputerManagerBinder localBinder = + ((ComputerManagerService.ComputerManagerBinder)binder); + + // Wait in a separate thread to avoid stalling the UI + new Thread() { + @Override + public void run() { + // Wait for the binder to be ready + localBinder.waitForReady(); + + // Now make the binder visible + managerBinder = localBinder; + + // Get the computer object + computer = managerBinder.getComputer(UUID.fromString(uuidString)); + + // Force CMS to repoll this machine + managerBinder.invalidateStateForComputer(computer.uuid); + + // Start polling + managerBinder.startPolling(new ComputerManagerListener() { + @Override + public void notifyComputerUpdated(final ComputerDetails details) { + // Don't care about other computers + if (!details.uuid.toString().equalsIgnoreCase(uuidString)) { + return; + } + + if (details.state != ComputerDetails.State.UNKNOWN) { + // Close this activity + finish(); + + if (details.runningGameId != 0) { + // A game is running so launch straight to the game activity + ServerHelper.doStart(AppViewShortcutTrampoline.this, + new NvApp("app", details.runningGameId), details, managerBinder); + } + else { + // No game running or computer offline - launch to the AppView + Intent i = new Intent(getIntent()); + i.setClass(AppViewShortcutTrampoline.this, AppView.class); + startActivity(i); + } + } + } + }); + } + }.start(); + } + + public void onServiceDisconnected(ComponentName className) { + managerBinder = null; + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + UiHelper.notifyNewRootView(this); + + uuidString = getIntent().getStringExtra(UUID_EXTRA); + + // Bind to the computer manager service + bindService(new Intent(this, ComputerManagerService.class), serviceConnection, + Service.BIND_AUTO_CREATE); + + blockingLoadSpinner = SpinnerDialog.displayDialog(this, getResources().getString(R.string.conn_establishing_title), + getResources().getString(R.string.applist_connect_msg), true); + } + + @Override + protected void onPause() { + super.onPause(); + + blockingLoadSpinner.dismiss(); + + if (managerBinder != null) { + unbindService(serviceConnection); + } + + if (managerBinder != null) { + managerBinder.stopPolling(); + } + + finish(); + } +} diff --git a/app/src/main/java/com/limelight/utils/ShortcutHelper.java b/app/src/main/java/com/limelight/utils/ShortcutHelper.java index f7465027..538a6cb9 100644 --- a/app/src/main/java/com/limelight/utils/ShortcutHelper.java +++ b/app/src/main/java/com/limelight/utils/ShortcutHelper.java @@ -5,9 +5,12 @@ import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; +import android.graphics.drawable.Icon; import android.os.Build; import com.limelight.AppView; +import com.limelight.AppViewShortcutTrampoline; +import com.limelight.R; import com.limelight.nvstream.http.ComputerDetails; import java.util.Collections; @@ -75,16 +78,16 @@ public class ShortcutHelper { public void createAppViewShortcut(String id, ComputerDetails details) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { - Intent i = new Intent(context, AppView.class); + Intent i = new Intent(context, AppViewShortcutTrampoline.class); i.putExtra(AppView.NAME_EXTRA, details.name); i.putExtra(AppView.UUID_EXTRA, details.uuid.toString()); - i.putExtra(AppView.SHORTCUT_EXTRA, true); i.setAction(Intent.ACTION_DEFAULT); ShortcutInfo sinfo = new ShortcutInfo.Builder(context, id) .setIntent(i) .setShortLabel(details.name) .setLongLabel(details.name) + .setIcon(Icon.createWithResource(context, R.mipmap.ic_pc_scut)) .build(); ShortcutInfo existingSinfo = getInfoForId(id); @@ -98,7 +101,7 @@ public class ShortcutHelper { reapShortcutsForDynamicAdd(); // Add the new shortcut - //TODO: Testing and proper icon - sm.addDynamicShortcuts(Arrays.asList(sinfo)); + sm.addDynamicShortcuts(Collections.singletonList(sinfo)); } } } diff --git a/app/src/main/res/mipmap-hdpi/ic_pc_scut.png b/app/src/main/res/mipmap-hdpi/ic_pc_scut.png new file mode 100644 index 0000000000000000000000000000000000000000..edd9a152e85d278451ee75a84d60450901931f0f GIT binary patch literal 2626 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 MUHx3vIVCg!04qBXM*si- literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_pc_scut.png b/app/src/main/res/mipmap-xhdpi/ic_pc_scut.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9195d8d1ede663a32b06c8a8a60aa57c077ec5 GIT binary patch literal 3757 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 HoD!M<8M!1s literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_pc_scut.png b/app/src/main/res/mipmap-xxhdpi/ic_pc_scut.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7799b4848fe8a5faadd2d02020fd64d84f55fe GIT binary patch literal 5998 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Bd2>4A0#j?OgGS6cJ1Xoxp4n^ukNgAOTHrUP`7$U?-UdNd3`HqR*Cus z=VW-y>_5cFv4Ukuf>+}MW=;WDhk4Q=a<9+*-&brnZ8vX@T=m=Q+mFpi&M$nw_4==8 z`DcI5zyE!0{@2&)W*a+wbCQH--_R+Yta7sN%)GM;xhLDFt4EzPQ)Fc6%i-J0*!X?r zZhOY*QyCYRu3?;Cs{T1QD@&^I_qVr(2G)4Sk5zz;nbl8 zg)cZHe(mNzXfQRQqEV;o-g^~qC2Q|6m$J!gI@ioxGu0<4`{{nukLg`Mtbe@od&B+v z$i9!#a~Ym0By1AMD0o_|@>BZe|4FG6rfM(9F#i?P?|c5=2kDn7vp?RpV3X-?IQi$m z#bxSq_wO_}H@A1|i}s#&RM1&oW9|05yIE=3iP@>yuMa&rfAaq1@0V{eM)=m~WEbXG zxXn#2yTa;|qva-T(IE3V|H*>hl<8j>E-zwmWpgo_v{m!LrGLxjX|yKa@i=bdUCG$7 zBBiF{T~-W7RMDZJqGRi=E^L{2@_>Z!w090mS-bjuIWMobV4u_d&Q-}KPo-eR!SsN` z@71y|bef#4`RbjPx0YwJ(bb1BWsmQ$c+_(DH8ahz4^&ov;UaB$$wMrwC?&{kDT~$h z`u8hjkEG2wR~XV@+$;5i-S)wjNCS&sm+r(WJe>3L&hpnCxeNPuH5?CISlDC{da_q5 zTl(ZF-_=t^p6`{;UAVsY$TIa;4{S{z?7mX4wQKdpqihF$I#&g|EQ#9EDbwg;a_OQ~ zSBdG|-#%+hL%*7BO?|z@ls&rrxM!Vz?-nP)ZMsVr1+6VQe00f<4Ph^`ooBxmNLefF z(_0jy{)!{R>YDo}*D{&h{occT@xj)xk@M9>f?Knr8_TJ?OlCk%VA}aPQI8u6&H_c zdDlk1xO(kc)yFMd6F2otxMU*bo95`)xIMHp`)AgQb?e-YKd5Yb-d9jFUwT$(Rz}8& zcS6A2U2g;khQ#YMbzchbZySj_|!pc&!L+a-F z_omeSe!Kl=TIkG^Ch@z=cx78d&1@LYD5jm-jAz3w`*SH$r2%&OPA zoMGaT`tpe}`{dV(@1h&t{q%StciP~`ie0;+PMtped&<`di#=V7b93MRb^0DLPi|M; z-(6ECPW)(4Gh@=EM;WWGw6gLTxxU(TBV?MdT}hDb)RQZ_SFQUmxbk#SaAauc)RK31 zb}n7D%;??8ExT)eekxGV5^cNSmaw=aj;uXNe5va(*9rW?IvsrPiR_xpaY^OZPfYGoC*tK{XRtiv+T z&(H67zdzyPr5Q4{FJ8@1_3tqMc5>;`rJnLN9~#d#EY7wl*V=kj;7ab&rAvc?f-cSP z6>Al__}pN*-eSJ+3!;j9|Nr}K#@%lurMOnIdIob~$CiLafr}={)UJ!&Z5G<==ltY< zueA9s8=FnJcXx$~>W0L`=*U_YrG(9QSKRsOQijRJEEjp9QnRI%Jf5jfpFTZy%}LkP z)b!F!;rT>2Q>ebOK->W~KPLKa$_UO~o)2d&hBQ`&j`8xOa`u+d1u9&sw zDE!}cXGfv4Ro$Nok(zl^r#`(Ro*ZXz{MfN$I;NMx!x8XY2|ROnl+`=Sn3vT- zjoD-NF@vwBwzjq0HTNHzs4ZXbJKKzRiR|-LmKjVlw;427 z>8JO)O;%&rWZPhnJn>J#EQx}*Wm1!m?=>*}g~EDp~YC&cu|?y1;VcXwB* zV8X)axm`tHT`NCWUbA0y&O(G?rkKLJkes6vE-iF!7i(f=IYDl}R)=kz0;}@xC<@8T|L2@xz@hMOf_G}_Q?+1@48{pJGZuV{>^gb!896yN`V2x0jg7_6&&7WF{P}Ru!M-yd?Z1vU z+COn;m^xz-zXwA~n5Iwl@2b4Kyqn$n`y|ffSd_6&xcuzwY-f%IUW^kMI2fKje}2EG zr)Lg>84u%$%ID|iCcilSb=eCS5r&zeT$A0ON>9^?ESi6i;qA@M=}HGLt1t*LFfKTB z=uotL-H(SR8!l=(+zEaA>Ff1)_dEao`!c97FgcuMxxll*k-@T@^TN8=-D=zoEDl@^ z?<80R+SRA$-rm+KY}3o6z$n15tLA6X<=grDdqtjYDtPF$T#xbArqt6Gw;boLIOJk4 zz_6>}q0`?-N4u9x@LV`GRogvCGG38EDAk6+s{UWi)zkX>ZB}|WJek?SEv6%}>|#b2 zs{@k)gUkL{v+8eeE+#a$8(Xn=nrPAx$1W-^o-f95^G}b<+qJgs{PM>(l{e4m^?QG2L-psg=7rj;)ARD)1sN_4 z^~pRMT>I_a-QWHO7iAl4f`Wse&weH7$E5IiX2}2F@ArF4o8?sS`be-`kj~%JsCB0H z@-pAcneM)iw#nVzw|4o01rM%0I@&GIEUdrxOVEEk#z$87bANq#sVpTWwQj~DA?xaI zIqj$K%2}74S+#cY)SnxR)@pkFc=P7Xr4JtpzA)~*TYkURFP5?8?7{2TulL5)YHMi; zNh*Z4nuMjj&)69qZL;O)RPAt|phm$fJGTCmtFQmh_^CK-_pLY2&&{=-5V!Z_#MeH7 zorybd_uKvQIB;J{dT`Jv<&mR82p_k&dw@ZB-NHaxl~-ibe>uU*W};zpFV$%*5I<^ zXVa*a)LC%*azsRgM9Bq(O$uJg&wV6YSsY$1(_iB=ZO)uI{`-z!p2Kd)eK#s6=6A!? zna1gSZG2YM-`+$qPWZ~a#3z1t+1p=2`{tYFN`qrHVp{O+Yr~eS*Do%1-zep- z@%!G=-M`#t9-Cv)!g}QR@%{Z>9&b$-|GqTg_QmCkvR8cC#VxSl@^<|{ZA+Kwui@=I zcbHe&Y)#ww<$iOy8s=0@+IQ>njUOK$FFepbNvMCtiWNK3R&{=>O_W#@voYzY{F=pr zAI|aIzqoz5UHu%7;oszYg5<&)L>7=vnc$3`Mt{Y zZ)azl=g-cn@nJ}b`8a3p+}h_?!{ck&_VICYeteVp^=rFHo2hVfb93!WQx$df=L?p) zDKZ8;SAJhuSUAH*{?NX%x4FM|dHYNjYns8=)74eAYSpS$H-)^b7$?MKKW@A{?RtE@ ztnK;6gZ?diVH;;dM zve6Dy`JQWRZ0vA49AEu*tL2x)Qr_K8OP4Oa_4C>>lQnPhGB36>IX(XK^Yi@Hd}byl zf!aCM+ViZtobndC^>Q(+JbCh@wL$TPAZ?>)bIV^31nfzfB){)2JR}4y3`z?W@@6Q zmZo{dy2_x{S!exqOMCnHsJ&HRwSHW>aq+pHZi`}Fc=+|iFIH;S*1uVnZ%TV8)9o31 zcE<;P8H<9h8jESQmM0``EkE3)qoHwvzm|<#Oy`I3(oJsjY}J(}w(>+SS-#x->}+%X zLzYJ(riP~na@4ZOu>=b2?OP`FLAazj`jf+IUf228_Uy5_vtfhWzGV5T4gPO`uiS7l z&|`PsgyqZCryYEDW+fuEI&-t5f-M%gTP`~8S zk+AK5@*CH;X|Vac{WUWq+dp+i!;^;(8<}Sp{P^%Nf=9X|Bu#E5_vQTZ zH#Z77_9e>mnx?*br7?9Uzl6bo`T49fJ$9P0ZvI`!bZF+XX7-y2@9*u+d?LK&v(2Te zS4Euz-!1cr{k3RU3 z|QtDDD~9*2h5*XQ(Db` zAG;{?aA)>6C2kY>okq+qQ_gX!cy+)5{{`)>(017w2qBtak2G}oDnu>@?>RKcX#;(+vfI|J=^x} zvgUPNwt0ODpPu@y*;uk@vRVGUKa%fQR;*hmwrfTEhXlDWH#fJ_%jehaV$AK@_SEd# z){=@Zjx9ECF7L1ZpP;Y5{^J)r8zZAnSEo#wlJq4ixowU|Cfo8gVHqdo>;G&ld3dOG zJ)_(f&8@i{+|L@HT?xD~eb$NI(_Wpi7PjN`W>IoWOt@ST{>^iF8 z@qP&#E30jbnT%P^4VEpM+tqhx!4o4H3;R@Pzl`8Auwa@)2&<}Q@j{*ocP#XUY7kJlz+wa^d|GVh)drb0%x+*gR5D zRDAgA)6>)81yfBY-qz~4eeSS`G1pmErN|iNKWvvoO>dn&>nq)>vEF`1?eA|h=GXmN zxo*dfh&ad9H=}}QD?Ktv{v^)TJz3rVTHw}Sr3ncSoHK;C@NT^*u|;(IOr2@DTynL$ zPE2+0{9Cdp@W>p?;(5PbtzOSJ*Q)fDm=-_VN>{d%lM;hu_M3$=%49gqd3|oKb^n=p zw!brN1CRILK6UlhSHJSb6S=>~E||noQdlTyTJqvT!Ia+_N1o5Cez(5*+nb+;#>TOtWK&e3{+Iwo_kxY_|1)tL0{6sLqipnGV{Y9-tIahq}FGaE0epWc*@1j zE=7(xr>E&gf3x}bACHPh^UK@S z^vPUqdBr=Cv+oM47iVa`>69Y*J?Fz>69i-hGZ}o#%F2ZMK7KxLfB)ARr;unlQA>DD0yLEYBG=GI%Yf`j(Y+D@AQRC2->X*T21vIsf&(slFFCV3gpf(_!sN{_*X0{^bIn z&(F{Q&$l|JS+i!vDz%3)5syy@y0b0c&#?Txspg1ehT==ptD3Y?t38Tj5uePgXx9L zs{6XH?q$eubY#2~q+6$KW@g5^Us6(XXU3l&ANvcJ95i%&AW^u+B2C76{^0;Sb-}_A zrjs*wzqQ?Aw6pzqlT+#pk%=p1H8!!!RX&-x{KUrmnm-?p|5q^Fr>&;;jQx_5Bqt~5 z&XXrkhF`jL$;&hNu7boWji({=EsK{~X=|_U`d6!LYrEG(RduO>p`qdT-|zRIKTy80 zKXi52+GBPb^WEK#Xa0$v{B!%(iEfO(8uG7gYu?PO(L2W^Q|egspv$GtYaZ7O12Yky zm5C;umpBXL_MY11DZZ-O(#fasGcyxYTHuu#wxzGGsHdHq^HYWA{YUdZ^2|n}FM~e* zEsKcYX#bq=cfjyL#E%(ME}Y0b)p_2vA(?4H$>K>u%M@e&{rW7*zrd}?ba`u6Lx;o8 zH63AI-4{0Q{x^T|DV2NeVq$Nk_a8jK^Zfp|r^$g%i=}f}EYi3xGrX&iKJw^FdutYh zdyC+koQ#P97V?733LAQprB4_1q&YbKv_80}KXH%0{Xbs)f4=2*Y>d6Fhn^hpD^4nW zb*fg2Inw@Q0`J2sj}A9oo1PdjOaK3T{`#^GCK3L7%ccLfasOYo*sn_HLWD(t*NT)4 zb8bHTd-LZy8PhK_|NQ^^)A}4&z?2Of2{|lUu{++BIt0(!cmBn@H`A<1B0ilpUXO@geCy0(RDKb literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_pc_scut.png b/app/src/main/res/mipmap-xxxhdpi/ic_pc_scut.png new file mode 100644 index 0000000000000000000000000000000000000000..fe196ebf108756f34563655d662a360e5c9ef6a6 GIT binary patch literal 8781 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

ZNv@(9a?OJW)yKYlD%^POeFCh_*>=H<#y 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