From 12e01180fe59fee047fedeba4ff89038c9e99331 Mon Sep 17 00:00:00 2001 From: Greg Date: Sun, 18 Dec 2022 22:37:15 -0700 Subject: [PATCH] Suspend/Resume apps & some more button icons. --- Playstation/OrbisLibAPI/Apps.cpp | 76 ++++++++++++------ Playstation/OrbisLibAPI/Apps.h | 3 + Playstation/OrbisLibAPI/LncUtil.cpp | 32 ++++++-- Playstation/OrbisLibAPI/LncUtil.h | 4 + Playstation/OrbisLibAPI/Version.h | 22 ++--- .../OrbisLib/Classes/Target/Application.cs | 64 ++++++++++++++- Windows/Libraries/OrbisLib/Common/API/API.cs | 2 +- .../OrbisNeighborHood/Controls/AppPanel.xaml | 46 +++++------ .../Controls/AppPanel.xaml.cs | 59 +++++++++++--- Windows/OrbisNeighborHood/Images/Info.png | Bin 0 -> 1857 bytes .../OrbisNeighborHood/Images/ReplaceIcon.png | Bin 1054 -> 2436 bytes Windows/OrbisNeighborHood/Images/Store.png | Bin 0 -> 3688 bytes Windows/OrbisNeighborHood/Images/Suspend.png | Bin 0 -> 1418 bytes .../OrbisNeighborHood/Images/Visibility.png | Bin 1741 -> 2700 bytes .../MVVM/View/AppListView.xaml.cs | 27 ++++--- .../OrbisNeighborHood.csproj | 15 ++++ .../Resources/BuildNumber.txt | 2 +- .../Resources/BuildString.txt | 2 +- 18 files changed, 258 insertions(+), 96 deletions(-) create mode 100644 Windows/OrbisNeighborHood/Images/Info.png create mode 100644 Windows/OrbisNeighborHood/Images/Store.png create mode 100644 Windows/OrbisNeighborHood/Images/Suspend.png diff --git a/Playstation/OrbisLibAPI/Apps.cpp b/Playstation/OrbisLibAPI/Apps.cpp index 80f7ccc..80b3e09 100644 --- a/Playstation/OrbisLibAPI/Apps.cpp +++ b/Playstation/OrbisLibAPI/Apps.cpp @@ -48,6 +48,18 @@ void Apps::HandleAPI(OrbisNetId Sock, APIPacket* Packet) KillApp(Sock, titleId); + break; + + case API_APPS_SUSPEND: + + SuspendApp(Sock, titleId); + + break; + + case API_APPS_RESUME: + + ResumeApp(Sock, titleId); + break; } } @@ -77,21 +89,17 @@ void Apps::GetAppInfoString(OrbisNetId Sock, const char* TitleId) char KeyValue[50]; sceNetRecv(Sock, KeyValue, sizeof(KeyValue), 0); - klog("TitleId: %s\n", TitleId); - klog("Key: %s\n", KeyValue); - // Look up the key for that titleId in the app.db. char OutStr[200]; memset(OutStr, 0, sizeof(OutStr)); AppDatabase::GetAppInfoString(TitleId, OutStr, sizeof(OutStr), KeyValue); - klog("OutStr: %s\n", OutStr); - // Send back the result. sceNetSend(Sock, OutStr, sizeof(OutStr), 0); } -void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId) +// TODO: Currently cant get the appId of child processes like the Web Browser since it is a child of the ShellUI. +int Apps::GetAppId(const char* TitleId) { int appId = 0; @@ -114,6 +122,13 @@ void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId) } } + return appId; +} + +void Apps::SendAppStatus(OrbisNetId Sock, const char* TitleId) +{ + auto appId = GetAppId(TitleId); + // If we have no appId that means the process is not running. if (appId <= 0) { @@ -161,26 +176,7 @@ void Apps::StartApp(OrbisNetId Sock, const char* TitleId) void Apps::KillApp(OrbisNetId Sock, const char* TitleId) { - int appId = 0; - - // Get the list of running processes. - std::vector processList; - GetProcessList(processList); - - for (const auto& i : processList) - { - // Get the app info using the pid. - OrbisAppInfo appInfo; - sceKernelGetAppInfo(i.pid, &appInfo); - - // Using the titleId match our desired app and return the appId from the appinfo. - if (!strcmp(appInfo.TitleId, TitleId)) - { - appId = appInfo.AppId; - - break; - } - } + auto appId = GetAppId(TitleId); if (appId > 0 && sceSystemServiceKillApp(appId, -1, 0, 0) == 0) { @@ -192,6 +188,34 @@ void Apps::KillApp(OrbisNetId Sock, const char* TitleId) } } +void Apps::SuspendApp(OrbisNetId Sock, const char* TitleId) +{ + auto appId = GetAppId(TitleId); + + if (appId > 0 && LncUtil::sceLncUtilSuspendApp(appId, 0) == 0) + { + SockSendInt(Sock, 1); + } + else + { + SockSendInt(Sock, 0); + } +} + +void Apps::ResumeApp(OrbisNetId Sock, const char* TitleId) +{ + auto appId = GetAppId(TitleId); + + if (appId > 0 && LncUtil::sceLncUtilResumeApp(appId, 0) == 0) + { + SockSendInt(Sock, 1); + } + else + { + SockSendInt(Sock, 0); + } +} + Apps::Apps() { diff --git a/Playstation/OrbisLibAPI/Apps.h b/Playstation/OrbisLibAPI/Apps.h index a5e0b5d..7366bc0 100644 --- a/Playstation/OrbisLibAPI/Apps.h +++ b/Playstation/OrbisLibAPI/Apps.h @@ -13,7 +13,10 @@ public: private: void GetAppsList(OrbisNetId Sock); void GetAppInfoString(OrbisNetId Sock, const char* TitleId); + int GetAppId(const char* TitleId); void SendAppStatus(OrbisNetId Sock, const char* TitleId); void StartApp(OrbisNetId Sock, const char* TitleId); void KillApp(OrbisNetId Sock, const char* TitleId); + void SuspendApp(OrbisNetId Sock, const char* TitleId); + void ResumeApp(OrbisNetId Sock, const char* TitleId); }; diff --git a/Playstation/OrbisLibAPI/LncUtil.cpp b/Playstation/OrbisLibAPI/LncUtil.cpp index 2e3913d..503addc 100644 --- a/Playstation/OrbisLibAPI/LncUtil.cpp +++ b/Playstation/OrbisLibAPI/LncUtil.cpp @@ -4,6 +4,8 @@ uint64_t LncUtil::LibraryBaseAddress = 0; int(*LncUtil::_sceLncUtilGetAppId)(const char*); int(*LncUtil::_sceLncUtilLaunchApp)(const char* titleId, char* args, LaunchAppParam* appParam); +int(*LncUtil::_sceLncUtilSuspendApp)(int AppId, int Flag); +int(*LncUtil::_sceLncUtilResumeApp)(int AppId, int Flag); int LncUtil::Init() { @@ -45,6 +47,8 @@ int LncUtil::Init() // Set up Functions. _sceLncUtilGetAppId = (decltype(_sceLncUtilGetAppId))(LibraryBaseAddress + 0x4E10); _sceLncUtilLaunchApp = (decltype(_sceLncUtilLaunchApp))(LibraryBaseAddress + 0x4C10); + _sceLncUtilSuspendApp = (decltype(_sceLncUtilSuspendApp))(LibraryBaseAddress + 0x4F20); + _sceLncUtilResumeApp = (decltype(_sceLncUtilResumeApp))(LibraryBaseAddress + 0x4F40); return 0; } @@ -70,17 +74,33 @@ int LncUtil::sceLncUtilLaunchApp(const char* titleId, char* args, LaunchAppParam } else { - klog("failed to resolve sceLncUtilGetAppId\n"); + klog("failed to resolve sceLncUtilLaunchApp\n"); return -1; } } -/*int SuspensceLncUtilSuspendAppdApp(int AppId, int Flag) +int LncUtil::sceLncUtilSuspendApp(int AppId, int Flag) { - + if ((uint64_t)_sceLncUtilSuspendApp > 0x4F20) + { + return _sceLncUtilSuspendApp(AppId, Flag); + } + else + { + klog("failed to resolve sceLncUtilSuspendApp\n"); + return -1; + } } -int sceLncUtilResumeApp(int AppId, int Flag) +int LncUtil::sceLncUtilResumeApp(int AppId, int Flag) { - -}*/ + if ((uint64_t)_sceLncUtilResumeApp > 0x4F40) + { + return _sceLncUtilResumeApp(AppId, Flag); + } + else + { + klog("failed to resolve sceLncUtilResumeApp\n"); + return -1; + } +} diff --git a/Playstation/OrbisLibAPI/LncUtil.h b/Playstation/OrbisLibAPI/LncUtil.h index f694a06..e1c347e 100644 --- a/Playstation/OrbisLibAPI/LncUtil.h +++ b/Playstation/OrbisLibAPI/LncUtil.h @@ -46,9 +46,13 @@ public: static int Init(); static int sceLncUtilGetAppId(const char* TitleId); static int sceLncUtilLaunchApp(const char* titleId, char* args, LaunchAppParam* appParam); + static int sceLncUtilSuspendApp(int AppId, int Flag); + static int sceLncUtilResumeApp(int AppId, int Flag); private: static uint64_t LibraryBaseAddress; static int(*_sceLncUtilGetAppId)(const char* titleId); static int(*_sceLncUtilLaunchApp)(const char* titleId, char* args, LaunchAppParam* appParam); + static int(*_sceLncUtilSuspendApp)(int AppId, int Flag); + static int(*_sceLncUtilResumeApp)(int AppId, int Flag); }; diff --git a/Playstation/OrbisLibAPI/Version.h b/Playstation/OrbisLibAPI/Version.h index d897bfe..caf5cd6 100644 --- a/Playstation/OrbisLibAPI/Version.h +++ b/Playstation/OrbisLibAPI/Version.h @@ -1,11 +1,11 @@ -#pragma once -#define ORBISLIB_MAJOR 3 -#define ORBISLIB_MINOR 0 -#define ORBISLIB_BUILDVERSION 635 -#define stringify(a) stringify_(a) -#define stringify_(a) #a -#if defined(_DEBUG) -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#else -#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) -#endif +#pragma once +#define ORBISLIB_MAJOR 3 +#define ORBISLIB_MINOR 0 +#define ORBISLIB_BUILDVERSION 636 +#define stringify(a) stringify_(a) +#define stringify_(a) #a +#if defined(_DEBUG) +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Dev Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#else +#define ORBISLIB_BUILDSTRING ("[OrbisLib Daemon " stringify(ORBISLIB_MAJOR) "." stringify(ORBISLIB_MINOR) "] Build " stringify(ORBISLIB_BUILDVERSION) " " __DATE__ " " __TIME__) +#endif diff --git a/Windows/Libraries/OrbisLib/Classes/Target/Application.cs b/Windows/Libraries/OrbisLib/Classes/Target/Application.cs index dda697c..374d6df 100644 --- a/Windows/Libraries/OrbisLib/Classes/Target/Application.cs +++ b/Windows/Libraries/OrbisLib/Classes/Target/Application.cs @@ -188,7 +188,69 @@ namespace OrbisSuite return false; } - APIResults apiResult = API.CallLong(Target.Info.IPAddress, Settings.CreateInstance().APIPort, new APIPacket() { PacketVersion = Config.PacketVersion, Command = APICommands.API_APPS_STOP }, out Socket Sock); + var apiResult = API.CallLong(Target.Info.IPAddress, Settings.CreateInstance().APIPort, new APIPacket() { PacketVersion = Config.PacketVersion, Command = APICommands.API_APPS_STOP }, out Socket Sock); + + if (apiResult != APIResults.API_OK) + return false; + + // Send the titleId of the app. + var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); + Sock.Send(bytes); + + // Get the state from API. + var result = Sock.RecvInt32(); + + // close socket. + Sock.Close(); + + return (result == 1); + } + + public bool Suspend(string TitleId) + { + if (!Regex.IsMatch(TitleId, @"[a-zA-Z]{4}\d{5}")) + { + Console.WriteLine($"Invaild titleId format {TitleId}"); + return false; + } + + if (!Target.Info.Details.IsAPIAvailable) + { + return false; + } + + var apiResult = API.CallLong(Target.Info.IPAddress, Settings.CreateInstance().APIPort, new APIPacket() { PacketVersion = Config.PacketVersion, Command = APICommands.API_APPS_SUSPEND }, out Socket Sock); + + if (apiResult != APIResults.API_OK) + return false; + + // Send the titleId of the app. + var bytes = Encoding.ASCII.GetBytes(TitleId.PadRight(10, '\0')).Take(10).ToArray(); + Sock.Send(bytes); + + // Get the state from API. + var result = Sock.RecvInt32(); + + // close socket. + Sock.Close(); + + return (result == 1); + } + + public bool Resume(string TitleId) + { + if (!Regex.IsMatch(TitleId, @"[a-zA-Z]{4}\d{5}")) + { + Console.WriteLine($"Invaild titleId format {TitleId}"); + return false; + } + + if (!Target.Info.Details.IsAPIAvailable) + { + return false; + } + + var apiResult = API.CallLong(Target.Info.IPAddress, Settings.CreateInstance().APIPort, new APIPacket() { PacketVersion = Config.PacketVersion, Command = APICommands.API_APPS_RESUME }, out Socket Sock); if (apiResult != APIResults.API_OK) return false; diff --git a/Windows/Libraries/OrbisLib/Common/API/API.cs b/Windows/Libraries/OrbisLib/Common/API/API.cs index 531bc60..519d615 100644 --- a/Windows/Libraries/OrbisLib/Common/API/API.cs +++ b/Windows/Libraries/OrbisLib/Common/API/API.cs @@ -14,7 +14,7 @@ namespace OrbisSuite.Common { Sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - return Sock.EasyConnect(IPAddr, Port, 4000); + return Sock.EasyConnect(IPAddr, Port, -1); } /// diff --git a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml index db9a631..b898dd3 100644 --- a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml +++ b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml @@ -149,6 +149,17 @@ Click="StartStop_Click" Grid.Column="0"/> + + + + Grid.Column="4"/> - - - - - + - - + diff --git a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs index a8c63ef..7d26ac3 100644 --- a/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs +++ b/Windows/OrbisNeighborHood/Controls/AppPanel.xaml.cs @@ -62,7 +62,9 @@ namespace OrbisNeighborHood.Controls StartStop.ToolTip = $"Start {App.TitleName}."; Visibility.ToolTip = $"Hide {App.TitleName} from Home Menu."; ChangeIcon.ToolTip = $"Change the icon of {App.TitleName}."; - // 3 more TBD here. + SuspendResume.ToolTip = $"Not available while {App.TitleName} is not running."; + // TODO: One TBD. + MoreInfo.ToolTip = $"See more info about {App.TitleName}."; Delete.ToolTip = $"Delete {App.TitleName}."; } @@ -80,13 +82,35 @@ namespace OrbisNeighborHood.Controls // App status. if (AppState == AppState.STATE_RUNNING || AppState == AppState.STATE_SUSPENDED) { - Dispatcher.Invoke(() => StartStop.ToolTip = $"Stop {App.TitleName}."); - Dispatcher.Invoke(() => StartStop.ImageSource = "/OrbisNeighborHood;component/Images/Stop.png"); + Dispatcher.Invoke(() => + { + StartStop.ToolTip = $"Stop {App.TitleName}."; + StartStop.ImageSource = "/OrbisNeighborHood;component/Images/Stop.png"; + + SuspendResume.IsEnabled = true; + if (AppState == AppState.STATE_SUSPENDED) + { + SuspendResume.ToolTip = $"Resume {App.TitleName}."; + SuspendResume.ImageSource = "/OrbisNeighborHood;component/Images/Start.png"; + } + else + { + SuspendResume.ToolTip = $"Suspend {App.TitleName}."; + SuspendResume.ImageSource = "/OrbisNeighborHood;component/Images/Suspend.png"; + } + }); } else { - Dispatcher.Invoke(() => StartStop.ToolTip = $"Start {App.TitleName}."); - Dispatcher.Invoke(() => StartStop.ImageSource = "/OrbisNeighborHood;component/Images/Start.png"); + Dispatcher.Invoke(() => + { + StartStop.ToolTip = $"Start {App.TitleName}."; + StartStop.ImageSource = "/OrbisNeighborHood;component/Images/Start.png"; + + SuspendResume.ToolTip = $"Not available while {App.TitleName} is not running."; + SuspendResume.ImageSource = "/OrbisNeighborHood;component/Images/UnAvailable.png"; + SuspendResume.IsEnabled = false; + }); } // App Visibility. @@ -121,6 +145,22 @@ namespace OrbisNeighborHood.Controls }); } + private void SuspendResume_Click(object sender, RoutedEventArgs e) + { + Task.Run(() => + { + var currentTarget = OrbisLib.Instance.SelectedTarget; + if (AppState == AppState.STATE_SUSPENDED) + { + currentTarget.Application.Resume(App.TitleId); + } + else + { + currentTarget.Application.Suspend(App.TitleId); + } + }); + } + private void Visibility_Click(object sender, RoutedEventArgs e) { @@ -131,17 +171,12 @@ namespace OrbisNeighborHood.Controls } - private void Unknown_Click(object sender, RoutedEventArgs e) + private void OpenStore_Click(object sender, RoutedEventArgs e) { } - private void Unknown2_Click(object sender, RoutedEventArgs e) - { - - } - - private void Unknown3_Click(object sender, RoutedEventArgs e) + private void MoreInfo_Click(object sender, RoutedEventArgs e) { } diff --git a/Windows/OrbisNeighborHood/Images/Info.png b/Windows/OrbisNeighborHood/Images/Info.png new file mode 100644 index 0000000000000000000000000000000000000000..41612e7175c9f7b689ac648be3ef509cccd9ab5c GIT binary patch literal 1857 zcmV-H2fp};P)otohEz_djdRnl)>E3j%>aAP{H|tJ;B9NE!)D2c`j2qn{@MXGO=j=o8=o@MrXS z0N4Ti1PlOMfuGFmP?`Q`rFMcyIt{oI=!=foz(`N#2Z1fX#^~5&W`{l5?j9r!mvpnF zm6G-jQ^=q@|J$RvO~=_(#&Ca=pFIN76h=+pCSK z7q&{8TXj6!M$!nmo8<9oB!&ozc-T3wS9yS0!VCbwxhW|A*YLdDZNZbY+5%GgXgwEYD|+Z>ApjG!ys|IHMG=nz#YXGqaD=UXZ%Uk{f=0nd*B~ue1^az|6h}UMs<$L^pt! z<(m0aWVwed11`?&l7ChgRJJIl0I8o(QvJ6}x)}HYf3rXGFviUGrzt3DG_bE=f6{Oe zxXjFUv?`dkhCE3<#K=n3&Fcw90gtCC*isNl(||kjdgPHyGnAcCm>1c(Q__@Hh0@fJ zWw=qzx^Q=fvI`3HB0Ixzu}mbfO3S_Z+eW>H)DHu*qFz)}qHgb3K=BV}={X8aHnUyL z3bd*ri>Q|v;GQeqj{+V`bnboXB?h=yK9p3TX$_Gy9M}n5;Mpl(906X%b!~r$zPlWl z58O}v#5lnoV1k()k2{$p$Xwu~qP*&H`poQ;xD!cD*203E2_(cewuZ=!QvSiobr%7@ z>;uj-v!g>#G^-)A2x1h;7~qh}al66XeDM9SJyMW882Lku(aoPOr-M z2))1|VBF9(k8w3*8bORQ7>OI2{~yf+sU4P)s{Kt#L##VSkS-+%QZrHsa#0D61RN8G zei1k8@az&C$&4hO`g;f6Cz5E0bzBV@Q-UJ_M?M*gaR|taCj8uZ`Ey0n1qaoIDg8W*7BLPRl3adCl21;-w;An_-5Tsgy zAT^^Q)*br_x7Fa{(80(WlI|6*nH|Kf%?lLE7jZd+n+=_ORZzn=b_AElBv1_NA;*AA%xqgyp_Y>zqU_D@`0}cUS=&ksNS}OW0`Mbn zW?rw_CGSkdifhb4U`Cphf2pPcMeW|xdA;gko=BU2G4+34l!R*w70r(C;2N?GxFYTD zaH%KCMZ1|jj7wV=NQZz$S+?rSG;=Y^9r$8auY8a<8)X$f1J9e;#w-_PZU!Wc06qt< z%X)2(@ij0z8mLW8yNQ&?1K$DXwsU-kbdxQGrX)KCkz=LM?x-Wy?mljL96w7=Szw#A9snN+odYlJjMJ)p4mDNy8-FB_y(}AhcF&&qQZ8R>M&R9;aW7&^; vIkYeOc?WKi-`41Jpl$*L0)apv;ER6&UXZ(mTF#+*00000NkvXXu0mjfuXS>H literal 0 HcmV?d00001 diff --git a/Windows/OrbisNeighborHood/Images/ReplaceIcon.png b/Windows/OrbisNeighborHood/Images/ReplaceIcon.png index cf2eb43d7e0104852d253652b69c5943bd7fc1b2..b519f42e130392ae39d2ee4c18a4a5cd39467c62 100644 GIT binary patch literal 2436 zcmV-~348X5P)U*Veklc(wA4=9K*jU_0=* z-=3|yK&2q*EJ^bv-7Be2#nC5ejih;!&MLbeN=MRUNk5acr$7nS*LLfj|mM5$FCkK>YhBuy>5-f~CMXh}CqI#_BIr{l1s zWs=S*yB>2v(gI04%B|B}=#@0D?D|ZNq)~EL*4yRQW3HT(>-)xps<$BH5J{7P^}rP& z@~;3}fiIZZzw^#G_h)ZOSK|g>tttk<$AE2;KACsMxe6lb%fQ39*BPzO`M@KR7U!91 zZh}a<30Mn^&MVImz$jpqq#xv!VJ?D5`U$WyulzBup#6L|vOndbiaTowTYi1kMoSaG!KhAg&xFF5> zZNNU@GBewi^u)xs8cCyZgT9U!^_d8)Pcx!VbML={)*kfb#pS?lNl!|2%aXJJ*qHRZ zHb%gFGkY@b39&0y?)CHEagGL6W4Hf1rBo}T=>=w**+87cNp4xUP)#ua*7&W8bOTG{ zCXUrYBuxQc;k3I=l@KruI0^iVYL1Bx10Rg@b~vu_Kc|{v0Bka|o&FK?iL#BU!#Lo_ zaS}EaMAF5;!mJhrWc84L-&2|u%~>RATC+rPTF4J^Z#ApP0pOt_zc=6pWmV*Cpy^xT zhJyGJ`B(C?C;&ZXc4Y8}nH>clDAAr~d|lG}8zpGgLcRk8n?KHh)e-wv6>dd*MguoA zN>KMHOU|`&7cea~!|fp>qt^+y@*qv;F|(ox;ps0$z%nUebA-7HFt=p8&p{ zvw1aj9VJM2&V>Rj2DX~nh5&izioZbmf&UHe^A3Su4NzQ-AW?lth&6TR;GB||%dJBn z5y&k%S`OR?oExBsi-zxr5@dXUf(Q8?uu0Op1D25sk|qL=;%p8@O z2LhLq8cCM|TX6kGNNVc33_$=c#)*VJfX5_#BXmK2 z#qcKJy`jr$KrBHH6ktdr#sGIqS{Y&x=?8l&anrnc1x8Ct-|!t#f+Sw`6Nn{*dD?lG z&$|lLyt$4NWJdvp#9@1*dGoZG*v^4&-K2}S$CurYMAmUVLDI}!=SiXqLef}&t4%^B1&Msi>fIdoQjYiHQQ-Wc>pmJG zX*O`T|M^Wb+Z^+}bAh)gr>{H!Ofs_*!w*EZ5HmZDTa8o(TjGczX`G}xfTwYD7u~?K zlJ1h!^g{AwJeS$pbo?<&3~22AzAlh4&1ibNlJqIyRp3_KQn5h{w;-lh(lvRM6^P_@ zD;JNwj1b^;!*)oT;9J1Sn0Y-YX;OpyW{3JuG+>t+#F?*q!28Db#8xmL`f(9IYmjs; z@EWcK#GPSW2)yjijp7B0pZ{4`Z}n7DBwZ-!SbNegiiBOziqcbn!F%N0_H;kL$QPI0Ssl%;H3vh$K@4PcvH&+>|Ac7GtTIWqS9QIi#wY{g#*! zH(Q)#X7=l>ndG)|Nz#qL3aS}5HzWdXF|%Lhky)-w$>i2^uc3XuDKY?j&CGHOyqWvj zKDkfH-B0U362A$2DN6?)MaU0JK0xaZ9$x^yI3hkQ38%&>b8(%0D?Jtq_cgjJLx@ob zlCF~US^*P4p?O6Gu73=QM)v2s52=+t-#rvbQzWfbadY%pI4)_8Tz}Zw$T=~rkaVQf zDv#!v+(lCp?XBgJ^ZUA8((Y0vaO{$Fo0|AdwFPo+t8*o-mUN&%5%x=3CF$d8;NDpz zl?eJW6iH{}qB<<_+ida+9(Drf-SW8Ko{9UhuA-=%Aj6S!uIR>nkZii&x^Pj824f-) zMlkBj4AEbT-QwlgncMfh-I?9<`GCc}yEpU9kJp*m z_x4?I&N=6tbI!TGlC(+E7m}_?e;R0f&n5jK>1Rp%a*wN1B)u(ZVGZHNLO+#ze4U`; zo!myq!#>YF&g@i77j0XX^iJ-vrtnJS*e414-voT0pr7n4bU@NSz-x)>IAms*67`iu zENG=Hq=%M(Tfk4i88dqpJK2M7#sYBA%oal@c+kyR0H#9k?AT)HM)N*!eTm_AyPnX~mX7+ga1xarKj|1mt5xNBLP0*nM^rg-| z&C$K)K_}9Mpzi|vfvvzEf8ZRjmgzuc8+(A)fdjzrYpk(732vT|q$No^D*E0l>B{hl zHS4@0X>Y|jJ0v|#F`%vneKFF%N%~aMVr&3qJB#JHvBmvTiUEcC@50nk$;@PC=Yie8 zY~<8gV7Hl_H?vOdK!)Ys-Yo;W%t!EV<(@iL8UWt`U$1sATZp8Mz)|2N@J55R)zY_1 z@CU$*nf*G-FG)H;aU1ZvtyEP*SLf&uQ7n|>{%+@VE$F|1FM;>QxnJ7M=70}@&wwWl z*Vc{{oBJWp+gc1IfBlzoAfbA?Fh@TC4x8D08;z^j-u(jXYNP#?y1E!H13S&^QJbAe z+73MACB9&pTPI`sC(zGHU zDiQhLn^mHBezVKZ~W*&4R9&{oebRr&fA|7-i9&{oebRw~!2g#~fKmHCK zhy{J8g+kW5aA0P!pf9vg$a)vdEcRK)tH3pir(e0%%~L#%t@7Kv!FP0dH|If$=efDK zd5Q-N2EQ`B>Yw1tclHsAM~zLA?s=tMHvn!@JTmiaEM(`LbIv*EoO8}O=bUr=54ea? U@60Fhc>n+a07*qoM6N<$g6T^J*#H0l diff --git a/Windows/OrbisNeighborHood/Images/Store.png b/Windows/OrbisNeighborHood/Images/Store.png new file mode 100644 index 0000000000000000000000000000000000000000..6a4c510667922ed2b0fbe0094f16ca3c033b9809 GIT binary patch literal 3688 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 Y0h&Ipezx6Bf&c&j07*qoM6N<$f;ZKmg8%>k literal 0 HcmV?d00001 diff --git a/Windows/OrbisNeighborHood/Images/Visibility.png b/Windows/OrbisNeighborHood/Images/Visibility.png index e8e0bb9c10cd15c5d8d4031388798f7ddca971d4..1a1ee52557b0645946c9a4c7c3f81757d4355253 100644 GIT binary patch literal 2700 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 literal 1741 zcmV;;1~U1HP)aE=bf% zXi^|{f$rHuflonCT?8j29~1->7ypE#N`^X+ri z`HtcK!Fh4c+3UZS`#Wdvwb$NKBoc{4B9TZW5{X12kw_#GiCovXyaikd&{xvkk|q|f zDoHm<8ZN1~q=Cg-k4ri$saet?NsW>kB<+;6$2oVpyvn;K_do*$N%u>dE$LB7cS`D+ zvf1;J_DWhOX^o_9&bjuKZT>$2s(~dy6WMbJ_!4+9Z@*zpG&e7cSh1rl4>RGmh`Kn zCP^pdb@!K_$W%!hFKMcz$&xJJwaX;E?3_Dg*k&?-@xVUA-n1Q<3k>Yu`hT(npch-U{fYnBVw*kX46@0n&A;4xM?d$Ma z#!Q4(0<}g$w~)is7Z?C+HS%G-xeve%#o$=5AGpy}V3;pMv3red1}d$D^#e8<32Or; zng~nh(>Ux#OPhfHX$4gP-x&!4SYQ;Z)Bvv<`t>bIlT!F0+}DO;>d9aTmlU7}cH?Y- z6+rk*8=pV6#B4HR1@Ne`kMD;Hn1jt^ zc(zpIld+jeb!2YBKvV&BCA7a07?aS(OUAyo0uOX&bR_nRrKd@jAgTtA2G}_YOi5s8 zFmT4$=O$oeX9jx$KNuSX*pR^aD#C(%kt4wE3G7)7UprDqhmU`ugS`(V1^0*&s7>(9 z5=ny-JU68HY$zKOJkuT3@-e*xFcr9v!T&12>=1SM4_{iQ2iknnz~wHQlYY;M0Z&j1AW(2|@==(}6GWb#Nz&*WTj4O-s?P!*)3f;CD*> z1q1itfAW^hOd61^0A?BccpA7jRKzRBB6b34x3!sp&%f_7_A${bQoyIiLKYgwD>2xA z_&-S_rU0xm6w?MwGK^PJzs6%%Km&d|M!K94&=yPcAek=JEIc_ubqmH!YU{?`YiCx(%_+Xc|e( z!uEBsj;w!?_+e3vq3AYz!J+xkuc-BPY;!nEv(Va^0}fxCXIVDZfUkv1y(O=xZx*)W z{G`VBBsvKp$W+aL%|V<;gj`PbOnz)AtR2 z1hG`oJ(lg}z-~z|I_G}QTS%wi&**p?IG$&BOvo|dEudH4aV#19hiNg{ERR`p2A|u` zay2|#fKm8reaj?{6|MMP1GnTICo_P7_>%|rEB+ZgEQ+_;bl?^*3f3o8@@&^qzlsmW`$^9h9 zj^LB$qvZoWPSRNU9zU#j6(n6;_&hG@f~3R6>!74xB<+!(;2gMaPj8GwB9TZW5{X12 jkw_#Gi9{liYma{cII2gE+XR1e00000NkvXXu0mjfYELc) diff --git a/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs b/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs index 732d660..7a3fac2 100644 --- a/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs +++ b/Windows/OrbisNeighborHood/MVVM/View/AppListView.xaml.cs @@ -37,6 +37,8 @@ namespace OrbisNeighborHood.MVVM.View "NPXS20112", "NPXS20133", "NPXS20132", + "CUSA02012", // Media Player + "NPXS20979", // Playstation Store // Destiny? lol "CUSA00219", @@ -191,13 +193,10 @@ namespace OrbisNeighborHood.MVVM.View var appList = currentTarget.Application.GetAppList(); - foreach (var app in appList) + Parallel.ForEach(appList, app => { - Parallel.Invoke(() => - { - AddApp(appCachePath, app); - }); - } + AddApp(appCachePath, app); + }); } private async Task CheckAppDatabase() @@ -224,24 +223,26 @@ namespace OrbisNeighborHood.MVVM.View var appList = currentTarget.Application.GetAppList(); // Check for deletions. - foreach (var app in AppList.Items.Cast().ToList()) + Parallel.ForEach(AppList.Items.Cast().ToList(), app => { if (appList.Find(x => x.TitleId == app.App.TitleId) == null) { Dispatcher.Invoke(() => AppList.Items.Remove(app)); } - } + }); // Check for new apps / updates. - foreach (var app in appList) + Parallel.ForEach(appList, app => { - Parallel.Invoke(() => + var currentAppList = AppList.Items.Cast().ToList(); + + if (currentAppList.Find(x => x.App.TitleId == app.TitleId) == null) { AddApp(appCachePath, app); - }); - } + } + }); - await Task.Delay(1000); + await Task.Delay(2000); } catch (Exception ex) { diff --git a/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj b/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj index d57f277..483f435 100644 --- a/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj +++ b/Windows/OrbisNeighborHood/OrbisNeighborHood.csproj @@ -25,6 +25,7 @@ + @@ -38,6 +39,8 @@ + + @@ -49,6 +52,12 @@ + + + PreserveNewest + + + PreserveNewest @@ -95,6 +104,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -134,6 +146,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt index 39c15c3..1447642 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildNumber.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildNumber.txt @@ -1 +1 @@ -1956 +1976 diff --git a/Windows/OrbisNeighborHood/Resources/BuildString.txt b/Windows/OrbisNeighborHood/Resources/BuildString.txt index f3c7c94..bc7b4c8 100644 --- a/Windows/OrbisNeighborHood/Resources/BuildString.txt +++ b/Windows/OrbisNeighborHood/Resources/BuildString.txt @@ -1 +1 @@ -Version 3.0.1956 Debug Build Sunday December 18 2022 7:40 PM +Version 3.0.1976 Debug Build Sunday December 18 2022 10:33 PM