Merge "updater_sample: add updater state" am: c290e088ed
am: 4e17087235
Change-Id: I698a9821d0e452e47a379051d68142f633ddb20a
This commit is contained in:
commit
22fb42b53f
5 changed files with 186 additions and 43 deletions
|
@ -111,19 +111,38 @@
|
||||||
android:orientation="horizontal">
|
android:orientation="horizontal">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/textView"
|
android:id="@+id/textView3"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Update status:" />
|
android:text="Updater state:" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/textViewStatus"
|
android:id="@+id/textViewUpdaterState"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
android:text="@string/unknown" />
|
android:text="@string/unknown" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Engine status:" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/textViewEngineStatus"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:text="@string/unknown" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -135,10 +154,10 @@
|
||||||
android:id="@+id/textView2"
|
android:id="@+id/textView2"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Update completion:" />
|
android:text="Engine error:" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/textViewCompletion"
|
android:id="@+id/textViewEngineErrorCode"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_marginLeft="8dp"
|
||||||
|
|
|
@ -25,6 +25,7 @@ import com.example.android.systemupdatersample.services.PrepareStreamingService;
|
||||||
import com.example.android.systemupdatersample.util.PayloadSpecs;
|
import com.example.android.systemupdatersample.util.PayloadSpecs;
|
||||||
import com.example.android.systemupdatersample.util.UpdateEngineErrorCodes;
|
import com.example.android.systemupdatersample.util.UpdateEngineErrorCodes;
|
||||||
import com.example.android.systemupdatersample.util.UpdateEngineProperties;
|
import com.example.android.systemupdatersample.util.UpdateEngineProperties;
|
||||||
|
import com.example.android.systemupdatersample.util.UpdaterStates;
|
||||||
import com.google.common.util.concurrent.AtomicDouble;
|
import com.google.common.util.concurrent.AtomicDouble;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -37,7 +38,8 @@ import java.util.function.DoubleConsumer;
|
||||||
import java.util.function.IntConsumer;
|
import java.util.function.IntConsumer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages the update flow. Asynchronously interacts with the {@link UpdateEngine}.
|
* Manages the update flow. It has its own state (in memory), separate from
|
||||||
|
* {@link UpdateEngine}'s state. Asynchronously interacts with the {@link UpdateEngine}.
|
||||||
*/
|
*/
|
||||||
public class UpdateManager {
|
public class UpdateManager {
|
||||||
|
|
||||||
|
@ -55,12 +57,15 @@ public class UpdateManager {
|
||||||
private AtomicInteger mEngineErrorCode = new AtomicInteger(UpdateEngineErrorCodes.UNKNOWN);
|
private AtomicInteger mEngineErrorCode = new AtomicInteger(UpdateEngineErrorCodes.UNKNOWN);
|
||||||
private AtomicDouble mProgress = new AtomicDouble(0);
|
private AtomicDouble mProgress = new AtomicDouble(0);
|
||||||
|
|
||||||
|
private AtomicInteger mState = new AtomicInteger(UpdaterStates.IDLE);
|
||||||
|
|
||||||
private final UpdateManager.UpdateEngineCallbackImpl
|
private final UpdateManager.UpdateEngineCallbackImpl
|
||||||
mUpdateEngineCallback = new UpdateManager.UpdateEngineCallbackImpl();
|
mUpdateEngineCallback = new UpdateManager.UpdateEngineCallbackImpl();
|
||||||
|
|
||||||
private PayloadSpec mLastPayloadSpec;
|
private PayloadSpec mLastPayloadSpec;
|
||||||
private AtomicBoolean mManualSwitchSlotRequired = new AtomicBoolean(true);
|
private AtomicBoolean mManualSwitchSlotRequired = new AtomicBoolean(true);
|
||||||
|
|
||||||
|
private IntConsumer mOnStateChangeCallback = null;
|
||||||
private IntConsumer mOnEngineStatusUpdateCallback = null;
|
private IntConsumer mOnEngineStatusUpdateCallback = null;
|
||||||
private DoubleConsumer mOnProgressUpdateCallback = null;
|
private DoubleConsumer mOnProgressUpdateCallback = null;
|
||||||
private IntConsumer mOnEngineCompleteCallback = null;
|
private IntConsumer mOnEngineCompleteCallback = null;
|
||||||
|
@ -97,10 +102,30 @@ public class UpdateManager {
|
||||||
* Returns true if manual switching slot is required. Value depends on
|
* Returns true if manual switching slot is required. Value depends on
|
||||||
* the update config {@code ab_config.force_switch_slot}.
|
* the update config {@code ab_config.force_switch_slot}.
|
||||||
*/
|
*/
|
||||||
public boolean manualSwitchSlotRequired() {
|
public boolean isManualSwitchSlotRequired() {
|
||||||
return mManualSwitchSlotRequired.get();
|
return mManualSwitchSlotRequired.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets SystemUpdaterSample app state change callback. Value of {@code state} will be one
|
||||||
|
* of the values from {@link UpdaterStates}.
|
||||||
|
*
|
||||||
|
* @param onStateChangeCallback a callback with parameter {@code state}.
|
||||||
|
*/
|
||||||
|
public void setOnStateChangeCallback(IntConsumer onStateChangeCallback) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
this.mOnStateChangeCallback = onStateChangeCallback;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<IntConsumer> getOnStateChangeCallback() {
|
||||||
|
synchronized (mLock) {
|
||||||
|
return mOnStateChangeCallback == null
|
||||||
|
? Optional.empty()
|
||||||
|
: Optional.of(mOnStateChangeCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets update engine status update callback. Value of {@code status} will
|
* Sets update engine status update callback. Value of {@code status} will
|
||||||
* be one of the values from {@link UpdateEngine.UpdateStatusConstants}.
|
* be one of the values from {@link UpdateEngine.UpdateStatusConstants}.
|
||||||
|
@ -160,6 +185,18 @@ public class UpdateManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates {@link this.mState} and if state is changed,
|
||||||
|
* it also notifies {@link this.mOnStateChangeCallback}.
|
||||||
|
*/
|
||||||
|
private void setUpdaterState(int updaterState) {
|
||||||
|
int previousState = mState.get();
|
||||||
|
mState.set(updaterState);
|
||||||
|
if (previousState != updaterState) {
|
||||||
|
getOnStateChangeCallback().ifPresent(callback -> callback.accept(updaterState));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests update engine to stop any ongoing update. If an update has been applied,
|
* Requests update engine to stop any ongoing update. If an update has been applied,
|
||||||
* leave it as is.
|
* leave it as is.
|
||||||
|
@ -171,6 +208,7 @@ public class UpdateManager {
|
||||||
public void cancelRunningUpdate() {
|
public void cancelRunningUpdate() {
|
||||||
try {
|
try {
|
||||||
mUpdateEngine.cancel();
|
mUpdateEngine.cancel();
|
||||||
|
setUpdaterState(UpdaterStates.IDLE);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.w(TAG, "UpdateEngine failed to stop the ongoing update", e);
|
Log.w(TAG, "UpdateEngine failed to stop the ongoing update", e);
|
||||||
}
|
}
|
||||||
|
@ -186,6 +224,7 @@ public class UpdateManager {
|
||||||
public void resetUpdate() {
|
public void resetUpdate() {
|
||||||
try {
|
try {
|
||||||
mUpdateEngine.resetStatus();
|
mUpdateEngine.resetStatus();
|
||||||
|
setUpdaterState(UpdaterStates.IDLE);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.w(TAG, "UpdateEngine failed to reset the update", e);
|
Log.w(TAG, "UpdateEngine failed to reset the update", e);
|
||||||
}
|
}
|
||||||
|
@ -199,6 +238,7 @@ public class UpdateManager {
|
||||||
*/
|
*/
|
||||||
public void applyUpdate(Context context, UpdateConfig config) {
|
public void applyUpdate(Context context, UpdateConfig config) {
|
||||||
mEngineErrorCode.set(UpdateEngineErrorCodes.UNKNOWN);
|
mEngineErrorCode.set(UpdateEngineErrorCodes.UNKNOWN);
|
||||||
|
setUpdaterState(UpdaterStates.RUNNING);
|
||||||
|
|
||||||
if (!config.getAbConfig().getForceSwitchSlot()) {
|
if (!config.getAbConfig().getForceSwitchSlot()) {
|
||||||
mManualSwitchSlotRequired.set(true);
|
mManualSwitchSlotRequired.set(true);
|
||||||
|
@ -221,6 +261,7 @@ public class UpdateManager {
|
||||||
payload = mPayloadSpecs.forNonStreaming(config.getUpdatePackageFile());
|
payload = mPayloadSpecs.forNonStreaming(config.getUpdatePackageFile());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
Log.e(TAG, "Error creating payload spec", e);
|
Log.e(TAG, "Error creating payload spec", e);
|
||||||
|
setUpdaterState(UpdaterStates.ERROR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
updateEngineApplyPayload(payload, extraProperties);
|
updateEngineApplyPayload(payload, extraProperties);
|
||||||
|
@ -239,6 +280,7 @@ public class UpdateManager {
|
||||||
updateEngineApplyPayload(payloadSpec, extraProperties);
|
updateEngineApplyPayload(payloadSpec, extraProperties);
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "PrepareStreamingService failed, result code is " + code);
|
Log.e(TAG, "PrepareStreamingService failed, result code is " + code);
|
||||||
|
setUpdaterState(UpdaterStates.ERROR);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -282,6 +324,7 @@ public class UpdateManager {
|
||||||
properties.toArray(new String[0]));
|
properties.toArray(new String[0]));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.e(TAG, "UpdateEngine failed to apply the update", e);
|
Log.e(TAG, "UpdateEngine failed to apply the update", e);
|
||||||
|
setUpdaterState(UpdaterStates.ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,6 +365,12 @@ public class UpdateManager {
|
||||||
private void onPayloadApplicationComplete(int errorCode) {
|
private void onPayloadApplicationComplete(int errorCode) {
|
||||||
Log.d(TAG, "onPayloadApplicationComplete invoked, errorCode=" + errorCode);
|
Log.d(TAG, "onPayloadApplicationComplete invoked, errorCode=" + errorCode);
|
||||||
mEngineErrorCode.set(errorCode);
|
mEngineErrorCode.set(errorCode);
|
||||||
|
if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS
|
||||||
|
|| errorCode == UpdateEngineErrorCodes.UPDATED_BUT_NOT_ACTIVE) {
|
||||||
|
setUpdaterState(UpdaterStates.FINISHED);
|
||||||
|
} else if (errorCode != UpdateEngineErrorCodes.USER_CANCELLED) {
|
||||||
|
setUpdaterState(UpdaterStates.ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
getOnEngineCompleteCallback()
|
getOnEngineCompleteCallback()
|
||||||
.ifPresent(callback -> callback.accept(errorCode));
|
.ifPresent(callback -> callback.accept(errorCode));
|
||||||
|
|
|
@ -29,7 +29,6 @@ import android.widget.Button;
|
||||||
import android.widget.ProgressBar;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.example.android.systemupdatersample.R;
|
import com.example.android.systemupdatersample.R;
|
||||||
import com.example.android.systemupdatersample.UpdateConfig;
|
import com.example.android.systemupdatersample.UpdateConfig;
|
||||||
|
@ -38,6 +37,7 @@ import com.example.android.systemupdatersample.util.PayloadSpecs;
|
||||||
import com.example.android.systemupdatersample.util.UpdateConfigs;
|
import com.example.android.systemupdatersample.util.UpdateConfigs;
|
||||||
import com.example.android.systemupdatersample.util.UpdateEngineErrorCodes;
|
import com.example.android.systemupdatersample.util.UpdateEngineErrorCodes;
|
||||||
import com.example.android.systemupdatersample.util.UpdateEngineStatuses;
|
import com.example.android.systemupdatersample.util.UpdateEngineStatuses;
|
||||||
|
import com.example.android.systemupdatersample.util.UpdaterStates;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -56,8 +56,9 @@ public class MainActivity extends Activity {
|
||||||
private Button mButtonStop;
|
private Button mButtonStop;
|
||||||
private Button mButtonReset;
|
private Button mButtonReset;
|
||||||
private ProgressBar mProgressBar;
|
private ProgressBar mProgressBar;
|
||||||
private TextView mTextViewStatus;
|
private TextView mTextViewUpdaterState;
|
||||||
private TextView mTextViewCompletion;
|
private TextView mTextViewEngineStatus;
|
||||||
|
private TextView mTextViewEngineErrorCode;
|
||||||
private TextView mTextViewUpdateInfo;
|
private TextView mTextViewUpdateInfo;
|
||||||
private Button mButtonSwitchSlot;
|
private Button mButtonSwitchSlot;
|
||||||
|
|
||||||
|
@ -79,8 +80,9 @@ public class MainActivity extends Activity {
|
||||||
this.mButtonStop = findViewById(R.id.buttonStop);
|
this.mButtonStop = findViewById(R.id.buttonStop);
|
||||||
this.mButtonReset = findViewById(R.id.buttonReset);
|
this.mButtonReset = findViewById(R.id.buttonReset);
|
||||||
this.mProgressBar = findViewById(R.id.progressBar);
|
this.mProgressBar = findViewById(R.id.progressBar);
|
||||||
this.mTextViewStatus = findViewById(R.id.textViewStatus);
|
this.mTextViewUpdaterState = findViewById(R.id.textViewUpdaterState);
|
||||||
this.mTextViewCompletion = findViewById(R.id.textViewCompletion);
|
this.mTextViewEngineStatus = findViewById(R.id.textViewEngineStatus);
|
||||||
|
this.mTextViewEngineErrorCode = findViewById(R.id.textViewEngineErrorCode);
|
||||||
this.mTextViewUpdateInfo = findViewById(R.id.textViewUpdateInfo);
|
this.mTextViewUpdateInfo = findViewById(R.id.textViewUpdateInfo);
|
||||||
this.mButtonSwitchSlot = findViewById(R.id.buttonSwitchSlot);
|
this.mButtonSwitchSlot = findViewById(R.id.buttonSwitchSlot);
|
||||||
|
|
||||||
|
@ -89,9 +91,10 @@ public class MainActivity extends Activity {
|
||||||
uiReset();
|
uiReset();
|
||||||
loadUpdateConfigs();
|
loadUpdateConfigs();
|
||||||
|
|
||||||
this.mUpdateManager.setOnEngineStatusUpdateCallback(this::onStatusUpdate);
|
this.mUpdateManager.setOnStateChangeCallback(this::onUpdaterStateChange);
|
||||||
|
this.mUpdateManager.setOnEngineStatusUpdateCallback(this::onEngineStatusUpdate);
|
||||||
|
this.mUpdateManager.setOnEngineCompleteCallback(this::onEnginePayloadApplicationComplete);
|
||||||
this.mUpdateManager.setOnProgressUpdateCallback(this::onProgressUpdate);
|
this.mUpdateManager.setOnProgressUpdateCallback(this::onProgressUpdate);
|
||||||
this.mUpdateManager.setOnEngineCompleteCallback(this::onPayloadApplicationComplete);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -143,6 +146,7 @@ public class MainActivity extends Activity {
|
||||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
.setPositiveButton(android.R.string.ok, (dialog, whichButton) -> {
|
.setPositiveButton(android.R.string.ok, (dialog, whichButton) -> {
|
||||||
uiSetUpdating();
|
uiSetUpdating();
|
||||||
|
uiResetEngineText();
|
||||||
mUpdateManager.applyUpdate(this, getSelectedConfig());
|
mUpdateManager.applyUpdate(this, getSelectedConfig());
|
||||||
})
|
})
|
||||||
.setNegativeButton(android.R.string.cancel, null)
|
.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
@ -186,17 +190,26 @@ public class MainActivity extends Activity {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoked when anything changes. The value of {@code status} will
|
* Invoked when SystemUpdaterSample app state changes.
|
||||||
* be one of the values from {@link UpdateEngine.UpdateStatusConstants},
|
* Value of {@code state} will be one of the
|
||||||
* and {@code percent} will be from {@code 0.0} to {@code 1.0}.
|
* values from {@link UpdaterStates}.
|
||||||
*/
|
*/
|
||||||
private void onStatusUpdate(int status) {
|
private void onUpdaterStateChange(int state) {
|
||||||
|
Log.i(TAG, "onUpdaterStateChange invoked state=" + state);
|
||||||
runOnUiThread(() -> {
|
runOnUiThread(() -> {
|
||||||
Log.e("UpdateEngine", "StatusUpdate - status="
|
setUiUpdaterState(state);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when {@link UpdateEngine} status changes. Value of {@code status} will
|
||||||
|
* be one of the values from {@link UpdateEngine.UpdateStatusConstants}.
|
||||||
|
*/
|
||||||
|
private void onEngineStatusUpdate(int status) {
|
||||||
|
runOnUiThread(() -> {
|
||||||
|
Log.e(TAG, "StatusUpdate - status="
|
||||||
+ UpdateEngineStatuses.getStatusText(status)
|
+ UpdateEngineStatuses.getStatusText(status)
|
||||||
+ "/" + status);
|
+ "/" + status);
|
||||||
Toast.makeText(this, "Update Status changed", Toast.LENGTH_LONG)
|
|
||||||
.show();
|
|
||||||
if (status == UpdateEngine.UpdateStatusConstants.IDLE) {
|
if (status == UpdateEngine.UpdateStatusConstants.IDLE) {
|
||||||
Log.d(TAG, "status changed, resetting ui");
|
Log.d(TAG, "status changed, resetting ui");
|
||||||
uiReset();
|
uiReset();
|
||||||
|
@ -204,33 +217,28 @@ public class MainActivity extends Activity {
|
||||||
Log.d(TAG, "status changed, setting ui to updating mode");
|
Log.d(TAG, "status changed, setting ui to updating mode");
|
||||||
uiSetUpdating();
|
uiSetUpdating();
|
||||||
}
|
}
|
||||||
setUiStatus(status);
|
setUiEngineStatus(status);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onProgressUpdate(double progress) {
|
|
||||||
mProgressBar.setProgress((int) (100 * progress));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoked when the payload has been applied, whether successfully or
|
* Invoked when the payload has been applied, whether successfully or
|
||||||
* unsuccessfully. The value of {@code errorCode} will be one of the
|
* unsuccessfully. The value of {@code errorCode} will be one of the
|
||||||
* values from {@link UpdateEngine.ErrorCodeConstants}.
|
* values from {@link UpdateEngine.ErrorCodeConstants}.
|
||||||
*/
|
*/
|
||||||
private void onPayloadApplicationComplete(int errorCode) {
|
private void onEnginePayloadApplicationComplete(int errorCode) {
|
||||||
final String state = UpdateEngineErrorCodes.isUpdateSucceeded(errorCode)
|
final String completionState = UpdateEngineErrorCodes.isUpdateSucceeded(errorCode)
|
||||||
? "SUCCESS"
|
? "SUCCESS"
|
||||||
: "FAILURE";
|
: "FAILURE";
|
||||||
runOnUiThread(() -> {
|
runOnUiThread(() -> {
|
||||||
Log.i("UpdateEngine",
|
Log.i(TAG,
|
||||||
"Completed - errorCode="
|
"Completed - errorCode="
|
||||||
+ UpdateEngineErrorCodes.getCodeName(errorCode) + "/" + errorCode
|
+ UpdateEngineErrorCodes.getCodeName(errorCode) + "/" + errorCode
|
||||||
+ " " + state);
|
+ " " + completionState);
|
||||||
Toast.makeText(this, "Update completed", Toast.LENGTH_LONG).show();
|
setUiEngineErrorCode(errorCode);
|
||||||
setUiCompletion(errorCode);
|
|
||||||
if (errorCode == UpdateEngineErrorCodes.UPDATED_BUT_NOT_ACTIVE) {
|
if (errorCode == UpdateEngineErrorCodes.UPDATED_BUT_NOT_ACTIVE) {
|
||||||
// if update was successfully applied.
|
// if update was successfully applied.
|
||||||
if (mUpdateManager.manualSwitchSlotRequired()) {
|
if (mUpdateManager.isManualSwitchSlotRequired()) {
|
||||||
// Show "Switch Slot" button.
|
// Show "Switch Slot" button.
|
||||||
uiShowSwitchSlotInfo();
|
uiShowSwitchSlotInfo();
|
||||||
}
|
}
|
||||||
|
@ -238,6 +246,13 @@ public class MainActivity extends Activity {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when update progress changes.
|
||||||
|
*/
|
||||||
|
private void onProgressUpdate(double progress) {
|
||||||
|
mProgressBar.setProgress((int) (100 * progress));
|
||||||
|
}
|
||||||
|
|
||||||
/** resets ui */
|
/** resets ui */
|
||||||
private void uiReset() {
|
private void uiReset() {
|
||||||
mTextViewBuild.setText(Build.DISPLAY);
|
mTextViewBuild.setText(Build.DISPLAY);
|
||||||
|
@ -249,11 +264,15 @@ public class MainActivity extends Activity {
|
||||||
mProgressBar.setProgress(0);
|
mProgressBar.setProgress(0);
|
||||||
mProgressBar.setEnabled(false);
|
mProgressBar.setEnabled(false);
|
||||||
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
|
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
|
||||||
mTextViewStatus.setText(R.string.unknown);
|
|
||||||
mTextViewCompletion.setText(R.string.unknown);
|
|
||||||
uiHideSwitchSlotInfo();
|
uiHideSwitchSlotInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void uiResetEngineText() {
|
||||||
|
mTextViewEngineStatus.setText(R.string.unknown);
|
||||||
|
mTextViewEngineErrorCode.setText(R.string.unknown);
|
||||||
|
// Note: Do not reset mTextViewUpdaterState; UpdateManager notifies properly.
|
||||||
|
}
|
||||||
|
|
||||||
/** sets ui updating mode */
|
/** sets ui updating mode */
|
||||||
private void uiSetUpdating() {
|
private void uiSetUpdating() {
|
||||||
mTextViewBuild.setText(Build.DISPLAY);
|
mTextViewBuild.setText(Build.DISPLAY);
|
||||||
|
@ -287,20 +306,25 @@ public class MainActivity extends Activity {
|
||||||
/**
|
/**
|
||||||
* @param status update engine status code
|
* @param status update engine status code
|
||||||
*/
|
*/
|
||||||
private void setUiStatus(int status) {
|
private void setUiEngineStatus(int status) {
|
||||||
String statusText = UpdateEngineStatuses.getStatusText(status);
|
String statusText = UpdateEngineStatuses.getStatusText(status);
|
||||||
mTextViewStatus.setText(statusText + "/" + status);
|
mTextViewEngineStatus.setText(statusText + "/" + status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param errorCode update engine error code
|
* @param errorCode update engine error code
|
||||||
*/
|
*/
|
||||||
private void setUiCompletion(int errorCode) {
|
private void setUiEngineErrorCode(int errorCode) {
|
||||||
final String state = UpdateEngineErrorCodes.isUpdateSucceeded(errorCode)
|
|
||||||
? "SUCCESS"
|
|
||||||
: "FAILURE";
|
|
||||||
String errorText = UpdateEngineErrorCodes.getCodeName(errorCode);
|
String errorText = UpdateEngineErrorCodes.getCodeName(errorCode);
|
||||||
mTextViewCompletion.setText(state + " " + errorText + "/" + errorCode);
|
mTextViewEngineErrorCode.setText(errorText + "/" + errorCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param state updater sample state
|
||||||
|
*/
|
||||||
|
private void setUiUpdaterState(int state) {
|
||||||
|
String stateText = UpdaterStates.getStateText(state);
|
||||||
|
mTextViewUpdaterState.setText(stateText + "/" + state);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadConfigsToSpinner(List<UpdateConfig> configs) {
|
private void loadConfigsToSpinner(List<UpdateConfig> configs) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ public final class UpdateEngineErrorCodes {
|
||||||
*/
|
*/
|
||||||
public static final int UNKNOWN = -1;
|
public static final int UNKNOWN = -1;
|
||||||
public static final int UPDATED_BUT_NOT_ACTIVE = 52;
|
public static final int UPDATED_BUT_NOT_ACTIVE = 52;
|
||||||
|
public static final int USER_CANCELLED = 48;
|
||||||
|
|
||||||
private static final SparseArray<String> CODE_TO_NAME_MAP = new SparseArray<>();
|
private static final SparseArray<String> CODE_TO_NAME_MAP = new SparseArray<>();
|
||||||
|
|
||||||
|
@ -61,7 +62,7 @@ public final class UpdateEngineErrorCodes {
|
||||||
* Completion codes returned by update engine indicating that the update
|
* Completion codes returned by update engine indicating that the update
|
||||||
* was successfully applied.
|
* was successfully applied.
|
||||||
*/
|
*/
|
||||||
private static final Set<Integer> SUCCEEDED_COMPLETION_CODES = new HashSet<Integer>(
|
private static final Set<Integer> SUCCEEDED_COMPLETION_CODES = new HashSet<>(
|
||||||
Arrays.asList(UpdateEngine.ErrorCodeConstants.SUCCESS,
|
Arrays.asList(UpdateEngine.ErrorCodeConstants.SUCCESS,
|
||||||
// UPDATED_BUT_NOT_ACTIVE is returned when the payload is
|
// UPDATED_BUT_NOT_ACTIVE is returned when the payload is
|
||||||
// successfully applied but the
|
// successfully applied but the
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.example.android.systemupdatersample.util;
|
||||||
|
|
||||||
|
import android.util.SparseArray;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SystemUpdaterSample app state.
|
||||||
|
*/
|
||||||
|
public class UpdaterStates {
|
||||||
|
|
||||||
|
public static final int IDLE = 0;
|
||||||
|
public static final int ERROR = 1;
|
||||||
|
public static final int RUNNING = 2;
|
||||||
|
public static final int PAUSED = 3;
|
||||||
|
public static final int FINISHED = 4;
|
||||||
|
|
||||||
|
private static final SparseArray<String> STATE_MAP = new SparseArray<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
STATE_MAP.put(0, "IDLE");
|
||||||
|
STATE_MAP.put(1, "ERROR");
|
||||||
|
STATE_MAP.put(2, "RUNNING");
|
||||||
|
STATE_MAP.put(3, "PAUSED");
|
||||||
|
STATE_MAP.put(4, "FINISHED");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* converts status code to status name
|
||||||
|
*/
|
||||||
|
public static String getStateText(int state) {
|
||||||
|
return STATE_MAP.get(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
private UpdaterStates() {}
|
||||||
|
}
|
Loading…
Reference in a new issue