Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 692ee57e authored by Jonathan Klee's avatar Jonathan Klee
Browse files

Improvement SplitInstallService

parent c0ba5a55
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
package foundation.e.splitinstall;

import foundation.e.splitinstall.ISplitInstallServiceCallback;

/**
* Interface towards the SplitInstallService.
*/
@@ -12,5 +14,5 @@ interface ISplitInstallService {
     *                     for.
     * @param modulePath: the path of the split module apk we want to install.
     */
    oneway void installSplitModule(in String packageName, in String modulePath);
    oneway void installSplitModule(in String packageName, in String modulePath, in ISplitInstallServiceCallback callback);
}
+5 −0
Original line number Diff line number Diff line
package foundation.e.splitinstall;

interface ISplitInstallServiceCallback {
    void onFinished(int session);
}
+26 −4
Original line number Diff line number Diff line
@@ -22,17 +22,22 @@ import android.content.Intent
import android.content.pm.PackageInstaller
import android.util.Log
import foundation.e.splitinstall.ISplitInstallService
import foundation.e.splitinstall.ISplitInstallServiceCallback
import java.io.File

class SplitInstallBinder(
    val applicationContext: Context
) : ISplitInstallService.Stub() {

    private var callbacks: ISplitInstallServiceCallback? = null

    companion object {
        const val TAG = SplitInstallService.TAG
    }

    override fun installSplitModule(packageName: String, modulePath: String) {
    override fun installSplitModule(packageName: String, modulePath: String, callbacks: ISplitInstallServiceCallback) {

        this.callbacks = callbacks

        Log.i(TAG, "installing $modulePath")
        val packageManager = applicationContext.packageManager
@@ -45,6 +50,7 @@ class SplitInstallBinder(

        val sessionId = packageInstaller.createSession(params)
        val session = packageInstaller.openSession(sessionId)
        packageInstaller.registerSessionCallback(pmCallbacks)

        try {
            syncFile(session, File(modulePath))
@@ -53,9 +59,10 @@ class SplitInstallBinder(
            callbackIntent.action = SplitInstallBroadcastReceiver.MODULE_INSTALLED_INTENT_ACTION

            val flags = PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
            val servicePendingIntent =
            val pendingIntent =
                PendingIntent.getBroadcast(applicationContext, sessionId, callbackIntent, flags)
            session.commit(servicePendingIntent.intentSender)

            session.commit(pendingIntent.intentSender)
        } catch (e: Exception) {
            session.abandon()
            throw e
@@ -72,4 +79,19 @@ class SplitInstallBinder(
        inputStream.close()
        outputStream.close()
    }

    private val pmCallbacks = object : PackageInstaller.SessionCallback() {
        override fun onActiveChanged(sessionId: Int, active: Boolean) { }

        override fun onBadgingChanged(sessionId: Int) { }

        override fun onCreated(sessionId: Int) { }

        override fun onFinished(sessionId: Int, success: Boolean) { 
	    Log.i(TAG, "onFinished");
	    callbacks?.onFinished(sessionId)
	}

        override fun onProgressChanged(sessionId: Int, progress: Float) { }
    }
}
+6 −0
Original line number Diff line number Diff line
@@ -38,7 +38,13 @@ class SplitInstallService : Service() {
        const val TAG = "SplitInstallSysService"
    }

    override fun onCreate() {
	super.onCreate()
	Log.i(TAG, "onCreate");
    }

    override fun onBind(intent: Intent?): IBinder? {
	Log.i(TAG, "onBind")
        return SplitInstallBinder(applicationContext)
    }
}