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

Commit 3a1513de authored by Harshit Mahajan's avatar Harshit Mahajan
Browse files

Moving away from LocalIntentReceiver

We cannot use LocalIntentReceiver from the new module.
It is not possible to copy the functionality to module due to hidden
APIs.
Refactoring to use PendingIntent and BroadcastReciver instead.

Test: atest CrashRecoveryTest; verified that rollback happens and WatchdogRollbackLogger are correct
Bug: 289203818
Flag: android.crashrecovery.flags.refactor_crashrecovery
Change-Id: I5d9cd74e7f7d3c7d8906a871ec5686bd8307a36a
parent 26ac6575
Loading
Loading
Loading
Loading
+38 −5
Original line number Diff line number Diff line
@@ -24,8 +24,11 @@ import android.annotation.AnyThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.WorkerThread;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@@ -78,6 +81,8 @@ import java.util.function.Consumer;
public final class RollbackPackageHealthObserver implements PackageHealthObserver {
    private static final String TAG = "RollbackPackageHealthObserver";
    private static final String NAME = "rollback-observer";
    private static final String ACTION_NAME = RollbackPackageHealthObserver.class.getName();

    private static final int PERSISTENT_MASK = ApplicationInfo.FLAG_PERSISTENT
            | ApplicationInfo.FLAG_SYSTEM;

@@ -596,6 +601,33 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
            }
        };

        if (Flags.refactorCrashrecovery()) {
            // Define a BroadcastReceiver to handle the result
            BroadcastReceiver rollbackReceiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent result) {
                    mHandler.post(() -> onResult.accept(result));
                }
            };

            // Register the BroadcastReceiver
            mContext.registerReceiver(rollbackReceiver,
                    new IntentFilter(ACTION_NAME),
                    Context.RECEIVER_NOT_EXPORTED);

            Intent intentReceiver = new Intent(ACTION_NAME);
            intentReceiver.putExtra("rollbackId", rollback.getRollbackId());
            intentReceiver.setPackage(mContext.getPackageName());

            PendingIntent rollbackPendingIntent = PendingIntent.getBroadcast(mContext,
                    rollback.getRollbackId(),
                    intentReceiver,
                    PendingIntent.FLAG_MUTABLE);

            rollbackManager.commitRollback(rollback.getRollbackId(),
                    Collections.singletonList(failedPackage),
                    rollbackPendingIntent.getIntentSender());
        } else {
            final LocalIntentReceiver rollbackReceiver = new LocalIntentReceiver(result -> {
                mHandler.post(() -> onResult.accept(result));
            });
@@ -603,6 +635,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve
            rollbackManager.commitRollback(rollback.getRollbackId(),
                    Collections.singletonList(failedPackage), rollbackReceiver.getIntentSender());
        }
    }

    /**
     * Two-phase rollback: