From 162535e3dd4c7d69bc7007430a86c12f6c0bc8be Mon Sep 17 00:00:00 2001 From: h4h13 Date: Sun, 26 Apr 2020 22:19:46 +0530 Subject: [PATCH] Add in-app update --- app/build.gradle | 6 +- .../retromusic/activities/MainActivity.java | 82 ++++++++++++++++++- .../fragments/songs/SongsViewModel.kt | 4 +- .../main/res/layout/activity_main_content.xml | 1 + 4 files changed, 87 insertions(+), 6 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 91df96946..3b5159d0a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,7 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 418 + versionCode 417 versionName '3.5.100' multiDexEnabled true @@ -33,7 +33,7 @@ android { } signingConfigs { release { - Properties properties = getProperties('/Users/hemanths/Desktop/KeepSafe/retro.properties') + Properties properties = getProperties('/Users/h4h13/Documents/Github/retro.properties') storeFile file(getProperty(properties, 'storeFile')) keyAlias getProperty(properties, 'keyAlias') storePassword getProperty(properties, 'storePassword') @@ -195,4 +195,6 @@ dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" + + implementation 'com.google.android.play:core:1.7.2' } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java index 2c90f52b6..4a69df154 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java @@ -19,6 +19,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.IntentSender; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; @@ -44,7 +45,17 @@ import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialcab.MaterialCab.Callback; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.card.MaterialCardView; +import com.google.android.material.snackbar.Snackbar; import com.google.android.material.textview.MaterialTextView; +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.InstallState; +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 org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,6 +63,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; @@ -91,10 +103,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity implements CabHolder, SharedPreferences.OnSharedPreferenceChangeListener { public static final String TAG = MainActivity.class.getSimpleName(); - public static final int APP_INTRO_REQUEST = 100; - public static final String EXPAND_PANEL = "expand_panel"; + private static final int APP_UPDATE_REQUEST_CODE = 9002; private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { @@ -118,6 +129,30 @@ public class MainActivity extends AbsSlidingMusicPanelActivity private MaterialTextView mAppTitle; private Toolbar mToolbar; private MaterialCardView mToolbarContainer; + private AppUpdateManager appUpdateManager; + InstallStateUpdatedListener listener = new InstallStateUpdatedListener() { + @Override + public void onStateUpdate(InstallState state) { + if (state.installStatus() == InstallStatus.DOWNLOADED) { + popupSnackBarForCompleteUpdate(); + } else if (state.installStatus() == InstallStatus.INSTALLED) { + appUpdateManager.unregisterListener(listener); + } else { + Log.i(TAG, "InstallStateUpdatedListener: state: " + state.installStatus()); + } + } + }; + + private void popupSnackBarForCompleteUpdate() { + Snackbar snackbar = Snackbar.make(findViewById(R.id.mainContent), "New app is ready!", Snackbar.LENGTH_INDEFINITE); + snackbar.setAction("Install", view -> { + if (appUpdateManager != null) { + appUpdateManager.completeUpdate(); + } + }); + snackbar.setActionTextColor(ThemeStore.Companion.accentColor(this)); + snackbar.show(); + } @Override protected void onCreate(@Nullable final Bundle savedInstanceState) { @@ -151,6 +186,28 @@ public class MainActivity extends AbsSlidingMusicPanelActivity checkShowChangelog(); AppRater.appLaunched(this); setupToolbar(); + checkUpdate(); + } + + private void checkUpdate() { + appUpdateManager = AppUpdateManagerFactory.create(this); + appUpdateManager.registerListener(listener); + + Task appUpdateInfoTask = appUpdateManager.getAppUpdateInfo(); + appUpdateInfoTask.addOnSuccessListener(appUpdateInfo -> { + if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE + && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { + try { + appUpdateManager.startUpdateFlowForResult( + appUpdateInfo, + AppUpdateType.IMMEDIATE, + this, + APP_UPDATE_REQUEST_CODE); + } catch (IntentSender.SendIntentException e) { + e.printStackTrace(); + } + } + }); } @Override @@ -161,6 +218,10 @@ public class MainActivity extends AbsSlidingMusicPanelActivity if (!hasPermissions()) { requestPermissions(); } + } else if (requestCode == APP_UPDATE_REQUEST_CODE) { + if (resultCode != RESULT_OK) { + + } } } @@ -176,6 +237,23 @@ public class MainActivity extends AbsSlidingMusicPanelActivity getIntent().putExtra(EXPAND_PANEL, false); } } + appUpdateManager.getAppUpdateInfo() + .addOnSuccessListener(appUpdateInfo -> { + if (appUpdateInfo.installStatus() == InstallStatus.DOWNLOADED) { + popupSnackBarForCompleteUpdate(); + } + try { + if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) { + appUpdateManager.startUpdateFlowForResult( + appUpdateInfo, + AppUpdateType.IMMEDIATE, + this, + APP_UPDATE_REQUEST_CODE); + } + } catch (IntentSender.SendIntentException e) { + e.printStackTrace(); + } + }); } @Override diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt index b4f34c475..ff220761c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsViewModel.kt @@ -10,7 +10,7 @@ import code.name.monkey.retromusic.providers.RepositoryImpl import kotlinx.coroutines.launch class SongsViewModel(application: Application) : AndroidViewModel(application) { - lateinit var songs: MutableLiveData> + var songs = MutableLiveData>() init { loadSongs() @@ -19,7 +19,7 @@ class SongsViewModel(application: Application) : AndroidViewModel(application) { fun loadSongs() = viewModelScope.launch { val result = RepositoryImpl(getApplication()).allSongs() if (result is Success) { - songs = MutableLiveData(result.data) + songs.value = result.data } } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index b3e78f41e..f570d2559 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -19,6 +19,7 @@