Reputation: 177
I have implemented flexible and immediate in-app update flows on my Android app. I fetch the update type from a remote server, and then use if-else to determine which update type to trigger. As of now, I am experiencing two issues.
It is important to note that when I implement only the flexible flow, the flow will work correctly, and the background download will work while the user interacts with the app.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkForInAppUpdate();
}
private void checkForInAppUpdate() {
try {
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
if (triggerUpdate
&& appUpdateInfo.updatePriority() > 3
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
requestImmediateUpdate(appUpdateInfo);
} else if (triggerUpdate
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
requestFlexibleUpdate(appUpdateInfo);
}
}
});
appUpdateInfoTask.addOnFailureListener(Throwable::printStackTrace);
} catch (Exception e) {
e.printStackTrace();
}
}
private void requestFlexibleUpdate(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.FLEXIBLE,
this,
FLEXIBLE_UPDATE_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
private void requestImmediateUpdate(AppUpdateInfo appUpdateInfo) {
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
AppUpdateType.IMMEDIATE,
this,
IMMEDIATE_UPDATE_CODE);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
@Override
protected void onResume() {
super.onResume();
appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// If an in-app update is already running, resume the update.
requestImmediateUpdate(appUpdateInfo);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMMEDIATE_UPDATE_CODE && resultCode != RESULT_OK) {
checkForInAppUpdate(); // if in any case update request is cancelled and failed
}
}
Upvotes: 1
Views: 753
Reputation: 177
Removing the Immediate update listener from onResume() and moving it inside my custom checkForInAppUpdate method fixed my use case.
private void checkForInAppUpdate() {
try {
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
if (triggerUpdate
&& appUpdateInfo.updatePriority() > 3
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
requestUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE);
} else if (triggerUpdate
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
requestUpdate(appUpdateInfo, AppUpdateType.FLEXIBLE);
} else if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
requestUpdate(appUpdateInfo, AppUpdateType.IMMEDIATE);
}
}
});
appUpdateInfoTask.addOnFailureListener(Throwable::printStackTrace);
} catch (Exception e) {
e.printStackTrace();
}
}
Upvotes: 2