From eef13bf2427b208e26d576f96cd5311346aae1cf Mon Sep 17 00:00:00 2001 From: Rahul Kumar Patel Date: Tue, 2 Mar 2021 04:02:12 +0530 Subject: [PATCH] Put Privileged callbacks to use --- .../aurora/services/IPrivilegedCallback.aidl | 6 + .../store/data/installer/AppInstaller.kt | 17 ++- .../store/data/installer/InstallerService.kt | 21 +--- .../store/data/installer/ServiceInstaller.kt | 106 ++++++++++++++++-- 4 files changed, 125 insertions(+), 25 deletions(-) diff --git a/app/src/main/aidl/com/aurora/services/IPrivilegedCallback.aidl b/app/src/main/aidl/com/aurora/services/IPrivilegedCallback.aidl index 4b4b71b2e..9e817845d 100644 --- a/app/src/main/aidl/com/aurora/services/IPrivilegedCallback.aidl +++ b/app/src/main/aidl/com/aurora/services/IPrivilegedCallback.aidl @@ -21,4 +21,10 @@ interface IPrivilegedCallback { in String packageName, in int returnCode ); + + void handleResultX( + in String packageName, + in int returnCode, + in String extra + ); } \ No newline at end of file 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 1b6fe0f98..d185fd14b 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 @@ -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, diff --git a/app/src/main/java/com/aurora/store/data/installer/InstallerService.kt b/app/src/main/java/com/aurora/store/data/installer/InstallerService.kt index 3272241da..8b5e42783 100644 --- a/app/src/main/java/com/aurora/store/data/installer/InstallerService.kt +++ b/app/src/main/java/com/aurora/store/data/installer/InstallerService.kt @@ -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 } diff --git a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt index 0b3d6ac27..ac0dd736d 100644 --- a/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/ServiceInstaller.kt @@ -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) { 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 {