Put Privileged callbacks to use

This commit is contained in:
Rahul Kumar Patel
2021-03-02 04:02:12 +05:30
parent d63ff3790f
commit eef13bf242
4 changed files with 125 additions and 25 deletions

View File

@@ -21,4 +21,10 @@ interface IPrivilegedCallback {
in String packageName,
in int returnCode
);
void handleResultX(
in String packageName,
in int returnCode,
in String extra
);
}

View File

@@ -20,13 +20,28 @@
package com.aurora.store.data.installer
import android.content.Context
import android.content.pm.PackageInstaller
import android.os.Build
import com.aurora.store.data.SingletonHolder
import com.aurora.store.R
import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
open class AppInstaller constructor(var context: Context) {
companion object {
fun getErrorString(context: Context, status: Int): String {
return when (status) {
PackageInstaller.STATUS_FAILURE_ABORTED -> context.getString(R.string.installer_status_user_action)
PackageInstaller.STATUS_FAILURE_BLOCKED -> context.getString(R.string.installer_status_failure_blocked)
PackageInstaller.STATUS_FAILURE_CONFLICT -> context.getString(R.string.installer_status_failure_conflict)
PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> context.getString(R.string.installer_status_failure_incompatible)
PackageInstaller.STATUS_FAILURE_INVALID -> context.getString(R.string.installer_status_failure_invalid)
PackageInstaller.STATUS_FAILURE_STORAGE -> context.getString(R.string.installer_status_failure_storage)
else -> context.getString(R.string.installer_status_failure)
}
}
}
fun getPreferredInstaller(): IInstaller {
val prefValue = Preferences.getInteger(
context,

View File

@@ -25,7 +25,6 @@ import android.content.pm.PackageInstaller
import android.os.Build
import android.os.IBinder
import androidx.annotation.RequiresApi
import com.aurora.store.R
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.util.Log
import org.greenrobot.eventbus.EventBus
@@ -37,6 +36,7 @@ class InstallerService : Service() {
val status = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -69)
val packageName = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME)
val extra = intent.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE);
when (status) {
PackageInstaller.STATUS_PENDING_USER_ACTION -> promptUser(intent)
else -> postStatus(status, packageName, extra)
@@ -68,25 +68,16 @@ class InstallerService : Service() {
EventBus.getDefault().post(InstallerEvent.Success(packageName, "Success"))
}
else -> {
val errorString = getErrorString(status)
val errorString =
AppInstaller.getErrorString(this, status)
val event =
InstallerEvent.Failed(packageName, errorString, extra)
Log.e("$packageName : $errorString")
EventBus.getDefault().post(InstallerEvent.Failed(packageName, errorString, extra))
EventBus.getDefault().post(event)
}
}
}
private fun getErrorString(status: Int): String {
return when (status) {
PackageInstaller.STATUS_FAILURE_ABORTED -> getString(R.string.installer_status_user_action)
PackageInstaller.STATUS_FAILURE_BLOCKED -> getString(R.string.installer_status_failure_blocked)
PackageInstaller.STATUS_FAILURE_CONFLICT -> getString(R.string.installer_status_failure_conflict)
PackageInstaller.STATUS_FAILURE_INCOMPATIBLE -> getString(R.string.installer_status_failure_incompatible)
PackageInstaller.STATUS_FAILURE_INVALID -> getString(R.string.installer_status_failure_invalid)
PackageInstaller.STATUS_FAILURE_STORAGE -> getString(R.string.installer_status_failure_storage)
else -> getString(R.string.installer_status_failure)
}
}
override fun onBind(intent: Intent): IBinder? {
return null
}

View File

@@ -23,6 +23,7 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.content.pm.PackageInstaller
import android.net.Uri
import android.os.Build
import android.os.IBinder
@@ -80,6 +81,67 @@ class ServiceInstaller(context: Context) : InstallerBase(context) {
}
}
override fun uninstall(packageName: String) {
val serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder: IBinder) {
val service = IPrivilegedService.Stub.asInterface(binder)
if (service.hasPrivilegedPermissions()) {
Log.i(context.getString(R.string.installer_service_available))
val callback = object : IPrivilegedCallback.Stub() {
override fun handleResult(packageName: String, returnCode: Int) {
}
override fun handleResultX(
packageName: String,
returnCode: Int,
extra: String?
) {
}
}
try {
service.deletePackageX(
packageName,
2,
BuildConfig.APPLICATION_ID,
callback
)
} catch (e: RemoteException) {
Log.e("Failed to connect Aurora Services")
}
} else {
Log.e(context.getString(R.string.installer_service_misconfigured))
val event = InstallerEvent.Failed(
packageName,
context.getString(R.string.installer_status_failure),
context.getString(R.string.installer_service_misconfigured)
)
EventBus.getDefault().post(event)
}
}
override fun onServiceDisconnected(name: ComponentName) {
removeFromInstallQueue(packageName)
Log.e("Disconnected from Aurora Services")
}
}
val intent = Intent(PRIVILEGED_EXTENSION_SERVICE_INTENT)
intent.setPackage(PRIVILEGED_EXTENSION_PACKAGE_NAME)
context.bindService(
intent,
serviceConnection,
Context.BIND_AUTO_CREATE
)
}
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private fun xInstall(packageName: String, uriList: List<Uri>) {
val serviceConnection = object : ServiceConnection {
@@ -89,10 +151,39 @@ class ServiceInstaller(context: Context) : InstallerBase(context) {
if (service.hasPrivilegedPermissions()) {
Log.i(context.getString(R.string.installer_service_available))
val callback = object : IPrivilegedCallback.Stub() {
override fun handleResult(packageName: String, returnCode: Int) {
Log.e("$packageName : $returnCode")
removeFromInstallQueue(packageName)
}
override fun handleResultX(
packageName: String,
returnCode: Int,
extra: String?
) {
when (returnCode) {
PackageInstaller.STATUS_SUCCESS -> {
EventBus.getDefault()
.post(InstallerEvent.Success(packageName, "Success"))
}
else -> {
val errorString = AppInstaller.getErrorString(
context,
returnCode
)
val event = InstallerEvent.Failed(
packageName,
errorString,
extra
)
Log.e("$packageName : $errorString")
EventBus.getDefault().post(event)
}
}
}
}
try {
@@ -105,15 +196,12 @@ class ServiceInstaller(context: Context) : InstallerBase(context) {
)
} catch (e: RemoteException) {
removeFromInstallQueue(packageName)
EventBus
.getDefault()
.post(
InstallerEvent.Failed(
packageName,
e.localizedMessage,
e.stackTraceToString()
)
)
val event = InstallerEvent.Failed(
packageName,
e.localizedMessage,
e.stackTraceToString()
)
EventBus.getDefault().post(event)
Log.e("Failed to connect Aurora Services")
}
} else {