88import android .util .Log ;
99import android .util .SparseIntArray ;
1010import android .view .View ;
11+ import android .widget .Toast ;
1112
1213import androidx .activity .OnBackPressedCallback ;
1314import androidx .activity .result .ActivityResultLauncher ;
4243import com .d4rk .androidtutorials .java .utils .EdgeToEdgeDelegate ;
4344import com .google .android .gms .ads .AdRequest ;
4445import com .google .android .gms .ads .MobileAds ;
45- import com .google .android .material .dialog .MaterialAlertDialogBuilder ;
4646import com .google .android .material .navigation .NavigationBarView ;
4747import com .google .android .material .navigationrail .NavigationRailView ;
4848import com .google .android .material .snackbar .Snackbar ;
@@ -80,6 +80,8 @@ public class MainActivity extends AppCompatActivity {
8080 private AppUpdateNotificationsManager appUpdateNotificationsManager ;
8181 private AppUpdateManager appUpdateManager ;
8282 private InstallStateUpdatedListener installStateUpdatedListener ;
83+ private long backPressedTime ;
84+ private static final long BACK_PRESS_INTERVAL = 2000 ;
8385 private final DefaultLifecycleObserver lifecycleObserver = new DefaultLifecycleObserver () {
8486 @ Override
8587 public void onResume (@ NonNull LifecycleOwner owner ) {
@@ -88,11 +90,13 @@ public void onResume(@NonNull LifecycleOwner owner) {
8890 if (ConsentUtils .canShowAds (MainActivity .this )) {
8991 if (mBinding .adView .getVisibility () != View .VISIBLE ) {
9092 MobileAds .initialize (MainActivity .this );
93+ mBinding .adPlaceholder .setVisibility (View .GONE );
9194 mBinding .adView .setVisibility (View .VISIBLE );
9295 mBinding .adView .loadAd (new AdRequest .Builder ().build ());
9396 }
9497 } else {
9598 mBinding .adView .setVisibility (View .GONE );
99+ mBinding .adPlaceholder .setVisibility (View .VISIBLE );
96100 }
97101 }
98102 }
@@ -149,15 +153,15 @@ protected void onCreate(Bundle savedInstanceState) {
149153 getOnBackPressedDispatcher ().addCallback (this , new OnBackPressedCallback (true ) {
150154 @ Override
151155 public void handleOnBackPressed () {
152- new MaterialAlertDialogBuilder ( MainActivity . this )
153- . setTitle ( R . string . alert_dialog_close )
154- . setMessage ( R . string . summary_alert_dialog_close )
155- . setPositiveButton ( android . R . string . yes , ( dialog , which ) -> {
156- finish ();
157- moveTaskToBack ( true ) ;
158- })
159- . setNegativeButton ( android . R . string . no , null )
160- . show (); }
156+ long currentTime = System . currentTimeMillis ();
157+ if ( currentTime - backPressedTime < BACK_PRESS_INTERVAL ) {
158+ finish ();
159+ moveTaskToBack ( true );
160+ } else {
161+ backPressedTime = currentTime ;
162+ Toast . makeText ( MainActivity . this , R . string . press_back_again_to_exit , Toast . LENGTH_SHORT ). show ();
163+ }
164+ }
161165 });
162166 }
163167
@@ -214,10 +218,12 @@ private void observeViewModel() {
214218 if (mBinding .adView != null ) {
215219 if (ConsentUtils .canShowAds (this )) {
216220 MobileAds .initialize (this );
221+ mBinding .adPlaceholder .setVisibility (View .GONE );
217222 mBinding .adView .setVisibility (View .VISIBLE );
218223 mBinding .adView .loadAd (new AdRequest .Builder ().build ());
219224 } else {
220225 mBinding .adView .setVisibility (View .GONE );
226+ mBinding .adPlaceholder .setVisibility (View .VISIBLE );
221227 }
222228 }
223229 }
@@ -287,6 +293,9 @@ private void observeViewModel() {
287293 recreate ();
288294 }
289295 });
296+
297+ mainViewModel .getLoadingState ().observe (this , isLoading ->
298+ mBinding .progressBar .setVisibility (Boolean .TRUE .equals (isLoading ) ? View .VISIBLE : View .GONE ));
290299 }
291300
292301 private void setupUpdateNotifications () {
0 commit comments