diff --git a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt index 4fa0fd724..3e93ceb99 100644 --- a/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/AppInstaller.kt @@ -57,7 +57,11 @@ class AppInstaller @Inject constructor( ) { companion object { - const val EXTRA_DOWNLOAD = "com.aurora.store.data.installer.AppInstaller.EXTRA_DOWNLOAD" + const val ACTION_INSTALL_STATUS = "com.aurora.store.data.installer.AppInstaller.INSTALL_STATUS" + + const val EXTRA_PACKAGE_NAME = "com.aurora.store.data.installer.AppInstaller.EXTRA_PACKAGE_NAME" + const val EXTRA_VERSION_CODE = "com.aurora.store.data.installer.AppInstaller.EXTRA_VERSION_CODE" + const val EXTRA_DISPLAY_NAME = "com.aurora.store.data.installer.AppInstaller.EXTRA_DISPLAY_NAME" fun getAvailableInstallersInfo(context: Context): List { val installers = mutableListOf( @@ -84,11 +88,11 @@ class AppInstaller @Inject constructor( return installers } - fun notifyInstallation(context: Context, download: Download) { + fun notifyInstallation(context: Context, displayName: String, packageName: String) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val notification = NotificationUtil.getInstallNotification(context, download) - notificationManager.notify(download.packageName.hashCode(), notification) + val notification = NotificationUtil.getInstallNotification(context, displayName, packageName) + notificationManager.notify(packageName.hashCode(), notification) } fun getErrorString(context: Context, status: Int): String { diff --git a/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt b/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt index a775fb4d1..21ac6d9d8 100644 --- a/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt +++ b/app/src/main/java/com/aurora/store/data/installer/InstallerBase.kt @@ -56,7 +56,7 @@ abstract class InstallerBase(protected var context: Context) : IInstaller { open fun onInstallationSuccess() { download?.let { - AppInstaller.notifyInstallation(context, it) + AppInstaller.notifyInstallation(context, it.displayName, it.packageName) if (Preferences.getBoolean(context, PREFERENCE_AUTO_DELETE)) { PathUtil.getAppDownloadDir(context, it.packageName, it.versionCode) .deleteRecursively() diff --git a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt index 6b63be2c4..8910a872b 100644 --- a/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/SessionInstaller.kt @@ -37,7 +37,10 @@ import com.aurora.extensions.isTAndAbove import com.aurora.extensions.isUAndAbove import com.aurora.extensions.runOnUiThread import com.aurora.store.R -import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DOWNLOAD +import com.aurora.store.data.installer.AppInstaller.Companion.ACTION_INSTALL_STATUS +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_PACKAGE_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_VERSION_CODE import com.aurora.store.data.model.InstallerInfo import com.aurora.store.data.receiver.InstallerStatusReceiver import com.aurora.store.data.room.download.Download @@ -195,10 +198,11 @@ class SessionInstaller @Inject constructor( private fun getCallBackIntent(packageName: String, sessionId: Int): PendingIntent? { val callBackIntent = Intent(context, InstallerStatusReceiver::class.java).apply { - action = InstallerStatusReceiver.ACTION_INSTALL_STATUS + action = ACTION_INSTALL_STATUS setPackage(context.packageName) - putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, packageName) - putExtra(EXTRA_DOWNLOAD, download) + putExtra(EXTRA_PACKAGE_NAME, packageName) + putExtra(EXTRA_VERSION_CODE, download!!.versionCode) + putExtra(EXTRA_DISPLAY_NAME, download!!.displayName) addFlags(Intent.FLAG_RECEIVER_FOREGROUND) } diff --git a/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt index 6eb9b3adb..46daca5a1 100644 --- a/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/ShizukuInstaller.kt @@ -32,7 +32,10 @@ import androidx.core.app.PendingIntentCompat import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isSAndAbove import com.aurora.store.R -import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DOWNLOAD +import com.aurora.store.data.installer.AppInstaller.Companion.ACTION_INSTALL_STATUS +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_PACKAGE_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_VERSION_CODE import com.aurora.store.data.model.InstallerInfo import com.aurora.store.data.receiver.InstallerStatusReceiver import com.aurora.store.data.room.download.Download @@ -97,14 +100,27 @@ class ShizukuInstaller @Inject constructor( download.sharedLibs.forEach { // Shared library packages cannot be updated if (!isSharedLibraryInstalled(context, it.packageName, it.versionCode)) { - install(download.packageName, download.versionCode, it.packageName) + install( + packageName = download.packageName, + versionCode = download.versionCode, + sharedLibPkgName = it.packageName + ) } } - install(download.packageName, download.versionCode) + install( + packageName = download.packageName, + versionCode = download.versionCode, + displayName = download.displayName + ) } } - private fun install(packageName: String, versionCode: Int, sharedLibPkgName: String = "") { + private fun install( + packageName: String, + versionCode: Int, + sharedLibPkgName: String = "", + displayName: String = "" + ) { Log.i("Received session install request for ${sharedLibPkgName.ifBlank { packageName }}") val (sessionId, session) = kotlin.runCatching { @@ -148,11 +164,12 @@ class ShizukuInstaller @Inject constructor( } val callBackIntent = Intent(context, InstallerStatusReceiver::class.java).apply { - action = InstallerStatusReceiver.ACTION_INSTALL_STATUS + action = ACTION_INSTALL_STATUS setPackage(context.packageName) addFlags(Intent.FLAG_RECEIVER_FOREGROUND) - putExtra(PackageInstaller.EXTRA_PACKAGE_NAME, sharedLibPkgName.ifBlank { packageName }) - putExtra(EXTRA_DOWNLOAD, download) + putExtra(EXTRA_PACKAGE_NAME, sharedLibPkgName.ifBlank { packageName }) + putExtra(EXTRA_VERSION_CODE, versionCode) + putExtra(EXTRA_DISPLAY_NAME, displayName) } val pendingIntent = PendingIntentCompat.getBroadcast( diff --git a/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt b/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt index 99f082b67..b3b6f60b9 100644 --- a/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt +++ b/app/src/main/java/com/aurora/store/data/receiver/InstallerStatusReceiver.kt @@ -29,8 +29,10 @@ import com.aurora.extensions.runOnUiThread import com.aurora.store.R import com.aurora.store.data.event.InstallerEvent import com.aurora.store.data.installer.AppInstaller -import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DOWNLOAD -import com.aurora.store.data.room.download.Download +import com.aurora.store.data.installer.AppInstaller.Companion.ACTION_INSTALL_STATUS +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_DISPLAY_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_PACKAGE_NAME +import com.aurora.store.data.installer.AppInstaller.Companion.EXTRA_VERSION_CODE import com.aurora.store.util.CommonUtil.inForeground import com.aurora.store.util.NotificationUtil import com.aurora.store.util.PackageUtil @@ -43,30 +45,25 @@ import org.greenrobot.eventbus.EventBus @AndroidEntryPoint class InstallerStatusReceiver : BroadcastReceiver() { - companion object { - const val ACTION_INSTALL_STATUS = - "com.aurora.store.data.receiver.InstallReceiver.INSTALL_STATUS" - } - private val TAG = InstallerStatusReceiver::class.java.simpleName override fun onReceive(context: Context?, intent: Intent?) { if (context != null && intent?.action == ACTION_INSTALL_STATUS) { - val packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME)!! + val packageName = intent.getStringExtra(EXTRA_PACKAGE_NAME)!! + val displayName = intent.getStringExtra(EXTRA_DISPLAY_NAME)!! + val versionCode = intent.getIntExtra(EXTRA_VERSION_CODE, -1) + val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1) val extra = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) - val download = IntentCompat.getParcelableExtra( - intent, EXTRA_DOWNLOAD, Download::class.java - )!! // If package was successfully installed, exit after notifying user and doing cleanup if (status == PackageInstaller.STATUS_SUCCESS) { // No post-install steps for shared libraries if (PackageUtil.isSharedLibrary(context, packageName)) return - AppInstaller.notifyInstallation(context, download) + AppInstaller.notifyInstallation(context, displayName, packageName) if (Preferences.getBoolean(context, PREFERENCE_AUTO_DELETE)) { - PathUtil.getAppDownloadDir(context, download.packageName, download.versionCode) + PathUtil.getAppDownloadDir(context, packageName, versionCode) .deleteRecursively() } return @@ -76,20 +73,21 @@ class InstallerStatusReceiver : BroadcastReceiver() { promptUser(intent, context) } else { postStatus(status, packageName, extra, context) - notifyUser(context, download, status) + notifyUser(context, packageName, displayName, status) } } } - private fun notifyUser(context: Context, download: Download, status: Int) { + private fun notifyUser(context: Context, packageName: String, displayName: String, status: Int) { val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notification = NotificationUtil.getInstallerStatusNotification( context, - download, + packageName, + displayName, AppInstaller.getErrorString(context, status) ) - notificationManager.notify(download.packageName.hashCode(), notification) + notificationManager.notify(packageName.hashCode(), notification) } private fun promptUser(intent: Intent, context: Context) { diff --git a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt index 8b9bf6cb2..7f71b539f 100644 --- a/app/src/main/java/com/aurora/store/util/NotificationUtil.kt +++ b/app/src/main/java/com/aurora/store/util/NotificationUtil.kt @@ -154,28 +154,33 @@ object NotificationUtil { return builder.build() } - fun getInstallNotification(context: Context, download: AuroraDownload): Notification { + fun getInstallNotification( + context: Context, + displayName: String, + packageName: String + ): Notification { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_install) - .setLargeIcon(PackageUtil.getIconForPackage(context, download.packageName)) + .setLargeIcon(PackageUtil.getIconForPackage(context, packageName)) .setColor(context.getStyledAttributeColor(R.color.colorAccent)) - .setContentTitle(download.displayName) + .setContentTitle(displayName) .setContentText(context.getString(R.string.installer_status_success)) - .setContentIntent(getContentIntentForDetails(context, download.packageName)) + .setContentIntent(getContentIntentForDetails(context, packageName)) .build() } fun getInstallerStatusNotification( context: Context, - download: Download, + packageName: String, + displayName: String, content: String? ): Notification { return NotificationCompat.Builder(context, Constants.NOTIFICATION_CHANNEL_ALERT) .setSmallIcon(R.drawable.ic_install) .setColor(context.getStyledAttributeColor(R.color.colorAccent)) - .setContentTitle(download.displayName) + .setContentTitle(displayName) .setContentText(content) - .setContentIntent(getContentIntentForDetails(context, download.packageName)) + .setContentIntent(getContentIntentForDetails(context, packageName)) .build() }