Skip to content
This repository has been archived by the owner on Oct 17, 2021. It is now read-only.

2021-05-06 v. 1.0.7: added in-app update feature #52

Merged
merged 3 commits into from
May 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/build.gradle
Expand Up @@ -145,4 +145,7 @@ dependencies {

// Screenshots
androidTestImplementation 'tools.fastlane:screengrab:2.0.0'

// Play Core Library
implementation 'com.google.android.play:core:1.10.0'
}
Expand Up @@ -3,7 +3,9 @@
import android.app.Activity;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.net.Uri;
import android.os.Bundle;
import android.view.MenuItem;
Expand All @@ -13,6 +15,15 @@
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.google.android.material.snackbar.Snackbar;
import com.google.android.play.core.appupdate.AppUpdateInfo;
import com.google.android.play.core.appupdate.AppUpdateManager;
import com.google.android.play.core.appupdate.AppUpdateManagerFactory;
import com.google.android.play.core.install.InstallStateUpdatedListener;
import com.google.android.play.core.install.model.AppUpdateType;
import com.google.android.play.core.install.model.InstallStatus;
import com.google.android.play.core.install.model.UpdateAvailability;
import com.google.android.play.core.tasks.Task;
import com.smlnskgmail.jaman.hashcheckerlite.components.BaseActivity;
import com.smlnskgmail.jaman.hashcheckerlite.components.BaseFragment;
import com.smlnskgmail.jaman.hashcheckerlite.components.states.AppBackClickTarget;
Expand All @@ -26,10 +37,13 @@ public class MainActivity extends BaseActivity {

public static final String URI_FROM_EXTERNAL_APP
= "com.smlnskgmail.jaman.hashcheckerlite.URI_FROM_EXTERNAL_APP";

private static final int MENU_ITEM_SETTINGS = R.id.menu_main_section_settings;
private static final int MENU_ITEM_FEEDBACK = R.id.menu_main_section_feedback;

private static final int REQUEST_APP_UPDATE = 1;
private AppUpdateManager appUpdateManager;

@Override
public void create() {
Intent intent = getIntent();
Expand Down Expand Up @@ -79,6 +93,23 @@ public void create() {
}

showFragment(mainFragment);

checkForUpdateAvailability();
}

// Checks that the update is not stalled during onResume().
@Override
protected void onResume() {
super.onResume();
appUpdateManager
.getAppUpdateInfo()
.addOnSuccessListener(appUpdateInfo -> {
// If the update is downloaded but not installed,
// notify the user to complete the update.
if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) {
popupSnackbarForCompleteUpdate();
}
});
}

private void showFragment(@NonNull Fragment fragment) {
Expand Down Expand Up @@ -166,4 +197,50 @@ public void onBackPressed() {
}
}

private void checkForUpdateAvailability() {
appUpdateManager = AppUpdateManagerFactory.create(this);
Task<AppUpdateInfo> appUpdateInfoTask = appUpdateManager.getAppUpdateInfo();
appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> {
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
&& appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
// Request the update.
requestUpdate(appUpdateInfo, AppUpdateType.FLEXIBLE, this, REQUEST_APP_UPDATE);
}
});
}

private void requestUpdate(AppUpdateInfo appUpdateInfo, int updateType, Context context, int requestCode) {

// monitor the state of an update
InstallStateUpdatedListener listener = state -> {
if (state.installStatus() == InstallStatus.DOWNLOADED) {
// After the update is downloaded, show a snackbar
// and request user confirmation to restart the app.
popupSnackbarForCompleteUpdate();
}
};

try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
updateType,
(Activity) context,
requestCode);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
}

// Displays the snackbar notification and call to action.
private void popupSnackbarForCompleteUpdate() {
Snackbar snackbar =
Snackbar.make(
findViewById(android.R.id.content).getRootView(),
getResources().getString(R.string.update_downloaded_message),
Snackbar.LENGTH_INDEFINITE);
snackbar.setAction(getResources().getString(R.string.update_restart_action),
view -> appUpdateManager.completeUpdate());
snackbar.show();
}

}
3 changes: 3 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -61,4 +61,7 @@
<string name="feedback_message">Message</string>
<!-- history -->
<string name="history_item_click_text">Hash value copied to clipboard</string>
<!-- in-app updates -->
<string name="update_downloaded_message" translatable="false">An update has just been downloaded.</string>
<string name="update_restart_action" translatable="false">RESTART</string>
</resources>