Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 19 additions & 9 deletions module/src/main/java/rikka/sui/server/SuiService.java
Original file line number Diff line number Diff line change
Expand Up @@ -459,8 +459,9 @@ private ParcelableListSlice<AppInfo> getApplications(int userId) {
dataDir = pi.applicationInfo.dataDir;
}

boolean hasApk = MapUtil.getOrPut(existenceCache, pi.applicationInfo.sourceDir, () -> new File(pi.applicationInfo.sourceDir).exists());
boolean hasData = MapUtil.getOrPut(existenceCache, dataDir, () -> new File(dataDir).exists());
final String sourceDir = pi.applicationInfo.sourceDir;
boolean hasApk = sourceDir != null && MapUtil.getOrPut(existenceCache, sourceDir, () -> new File(sourceDir).exists());
boolean hasData = dataDir != null && MapUtil.getOrPut(existenceCache, dataDir, () -> new File(dataDir).exists());

// Installed (or hidden): hasApk && hasData
// Uninstalled but keep data: !hasApk && hasData
Expand Down Expand Up @@ -558,14 +559,23 @@ public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws
if (code == ServerConstants.BINDER_TRANSACTION_getApplications) {
data.enforceInterface(ShizukuApiConstants.BINDER_DESCRIPTOR);
int userId = data.readInt();
ParcelableListSlice<AppInfo> result = getApplications(userId);
reply.writeNoException();
if (result != null) {
reply.writeInt(1);
result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
reply.writeInt(0);

try {
ParcelableListSlice<AppInfo> result = getApplications(userId);

reply.writeNoException();
if (result != null) {
reply.writeInt(1);
result.writeToParcel(reply, android.os.Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
} else {
reply.writeInt(0);
}
} catch (Throwable e) {
android.util.Log.e("SuiRootService", "A fatal error occurred inside getApplications(). This is the root cause.", e);

reply.writeException(new RuntimeException("Sui root service crashed while trying to get app list.", e));
}

return true;
} else if (code == ServerConstants.BINDER_TRANSACTION_showManagement) {
data.enforceInterface(ShizukuApiConstants.BINDER_DESCRIPTOR);
Expand Down