Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,11 @@
import androidx.navigation.ui.NavigationUI;
import androidx.preference.PreferenceManager;

import com.d4rk.androidtutorials.java.BuildConfig;
import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.databinding.ActivityMainBinding;
import com.d4rk.androidtutorials.java.notifications.managers.AppUpdateNotificationsManager;
import com.d4rk.androidtutorials.java.notifications.managers.AppUsageNotificationsManager;
import com.d4rk.androidtutorials.java.ui.components.navigation.BottomSheetMenuFragment;
import com.d4rk.androidtutorials.java.ui.screens.startup.StartupActivity;
import com.d4rk.androidtutorials.java.ui.screens.startup.StartupViewModel;
Expand All @@ -48,6 +51,7 @@
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.ump.ConsentInformation;
import com.google.android.ump.ConsentRequestParameters;
import com.google.android.ump.UserMessagingPlatform;
Expand Down Expand Up @@ -92,6 +96,7 @@ public void onResume(@NonNull LifecycleOwner owner) {
private NavController navController;
private int currentNavIndex;
private AppUpdateManager appUpdateManager;
private AppUpdateNotificationsManager appUpdateNotificationsManager;
private InstallStateUpdatedListener installStateUpdatedListener;
private long backPressedTime;

Expand Down Expand Up @@ -134,6 +139,7 @@ protected void onCreate(Bundle savedInstanceState) {
}

this.appUpdateManager = mainViewModel.getAppUpdateManager();
setupUpdateNotifications();

registerInstallStateListener();
getLifecycle().addObserver(lifecycleObserver);
Expand Down Expand Up @@ -238,17 +244,19 @@ private void observeViewModel() {
.build();

if (useRail) {
NavigationUI.setupWithNavController(mBinding.navRail, navController);
mBinding.navRail.setOnItemSelectedListener(item -> {
if (item.getItemId() == navController.getCurrentDestination().getId()) {
if (mBinding.navRail != null) {
NavigationUI.setupWithNavController(mBinding.navRail, navController);
mBinding.navRail.setOnItemSelectedListener(item -> {
if (item.getItemId() == navController.getCurrentDestination().getId()) {
return true;
}
int newIndex = navOrder.get(item.getItemId());
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
navController.navigate(item.getItemId(), null, options);
currentNavIndex = newIndex;
return true;
}
int newIndex = navOrder.get(item.getItemId());
NavOptions options = newIndex > currentNavIndex ? forwardOptions : backwardOptions;
navController.navigate(item.getItemId(), null, options);
currentNavIndex = newIndex;
return true;
});
});
}
} else {
NavigationUI.setupWithNavController(navBarView, navController);
navBarView.setOnItemSelectedListener(item -> {
Expand Down Expand Up @@ -299,12 +307,47 @@ public boolean onOptionsItemSelected(android.view.MenuItem item) {
return super.onOptionsItemSelected(item);
}

@Override
protected void onResume() {
super.onResume();
AppUsageNotificationsManager appUsageNotificationsManager = new AppUsageNotificationsManager(this);
appUsageNotificationsManager.scheduleAppUsageCheck();
appUpdateNotificationsManager.checkAndSendUpdateNotification();
checkForFlexibleOrImmediateUpdate();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P1] Guard update notification call on pre‑O devices

AppUpdateNotificationsManager.checkAndSendUpdateNotification() is annotated @RequiresApi(Build.VERSION_CODES.O) and creates a NotificationChannel. The new onResume calls this method every time without checking the SDK level, so on devices running API 23‑25 (the module’s minSdk is 23) the activity will crash on resume with a NoClassDefFoundError. Add an SDK guard before invoking the method or move the version check inside the manager.

Useful? React with 👍 / 👎.

}

private void checkForFlexibleOrImmediateUpdate() {
appUpdateManager.getAppUpdateInfo().addOnSuccessListener(appUpdateInfo -> {
boolean updateAvailable = appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE;
if (updateAvailable) {
startImmediateUpdate(appUpdateInfo);
}
})
.addOnFailureListener(e -> {
if (!BuildConfig.DEBUG) {
Snackbar.make(
findViewById(android.R.id.content),
getString(R.string.snack_general_error),
Snackbar.LENGTH_LONG
).show();
}
});
}

private void startImmediateUpdate(AppUpdateInfo appUpdateInfo) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
updateActivityResultLauncher,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build()
);
try {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
updateActivityResultLauncher,
AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build()
);
} catch (Exception e) {
Log.e("MainActivity", "Error starting in-app update", e);
}
}

private void setupUpdateNotifications() {
appUpdateNotificationsManager = new AppUpdateNotificationsManager(this);
}

private void registerInstallStateListener() {
Expand Down
Loading