InstallerStatusReceiver: Pass required data as extra instead of parcel
Old Android versions experience a crash otherwise for some reason Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
@@ -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<InstallerInfo> {
|
||||
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 {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user