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

Commit fdf7b58a authored by Tianjie's avatar Tianjie
Browse files

Add a system API UpdateEngine to switch the slot back and forth

In some cases, the OTA update want to flip the slot to source
without cancelling the entire update. The functionality was
achieved by ResetStatus(). However ResetStatus() will clean up
the update progress and free up space to support virtual A/B.

Details in http://go/no-virtual-ab-switch-off

Test: build
Bug: 187321613
Change-Id: I2abcf8289f5fd573d2b55fa7004ab4dcd175252f
parent 1f5ba0b2
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -7269,8 +7269,10 @@ package android.os {
    method public boolean bind(android.os.UpdateEngineCallback);
    method public void cancel();
    method @WorkerThread public int cleanupAppliedPayload();
    method public void resetShouldSwitchSlotOnReboot();
    method public void resetStatus();
    method public void resume();
    method public void setShouldSwitchSlotOnReboot(@NonNull String);
    method public void suspend();
    method public boolean unbind();
    method public boolean verifyPayloadMetadata(String);
+38 −4
Original line number Diff line number Diff line
@@ -409,10 +409,11 @@ public class UpdateEngine {

    /**
     * Resets the bootable flag on the non-current partition and all internal
     * update_engine state. This can be used after an unwanted payload has been
     * successfully applied and the device has not yet been rebooted to signal
     * that we no longer want to boot into that updated system. After this call
     * completes, update_engine will no longer report
     * update_engine state. Note this call will clear the entire update
     * progress. So a subsequent {@link #applyPayload} will apply the update
     * from scratch.
     *
     * <p>After this call completes, update_engine will no longer report
     * {@code UPDATED_NEED_REBOOT}, so your callback can remove any outstanding
     * notification that rebooting into the new system is possible.
     */
@@ -424,6 +425,39 @@ public class UpdateEngine {
        }
    }

    /**
     * Sets the A/B slot switch for the next boot after applying an ota update. If
     * {@link #applyPayload} hasn't switched the slot, the updater APP can call
     * this API to switch the slot and apply the update on next boot.
     *
     * @param payloadMetadataFilename the location of the metadata without the
     * {@code file://} prefix.
     */
    public void setShouldSwitchSlotOnReboot(@NonNull String payloadMetadataFilename) {
        try {
            mUpdateEngine.setShouldSwitchSlotOnReboot(payloadMetadataFilename);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

   /**
    * Resets the boot slot to the source/current slot, without cancelling the
    * update progress. This can be called after the update is installed, and to
    * prevent the device from accidentally taking the update when it reboots.
    *
    * This is useful when users don't want to take the update immediately; or
    * the updater determines some condition hasn't met, e.g. insufficient space
    * for boot.
    */
    public void resetShouldSwitchSlotOnReboot() {
        try {
            mUpdateEngine.resetShouldSwitchSlotOnReboot();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Unbinds the last bound callback function.
     */