Skip to content
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.
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
@@ -0,0 +1,34 @@
package com.d4rk.androidtutorials.java.ui.components.navigation;

import android.os.Bundle;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;

import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;

public abstract class BaseActivity extends AppCompatActivity {

@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
View container = findViewById(R.id.container);
if (container != null) {
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
edgeToEdgeDelegate.applyEdgeToEdge(container);
}
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}

@Override
public boolean onSupportNavigateUp() {
finish();
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,8 @@
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import com.d4rk.androidtutorials.java.ui.components.navigation.UpNavigationActivity;
import com.d4rk.androidtutorials.java.ui.components.navigation.BaseActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
Expand All @@ -21,7 +20,6 @@
import com.d4rk.androidtutorials.java.databinding.ActivityHelpBinding;
import com.d4rk.androidtutorials.java.databinding.DialogVersionInfoBinding;
import com.d4rk.androidtutorials.java.ui.screens.help.repository.HelpRepository;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.d4rk.androidtutorials.java.utils.OpenSourceLicensesUtils;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.play.core.review.ReviewInfo;
Expand All @@ -30,7 +28,7 @@
import dagger.hilt.android.AndroidEntryPoint;

@AndroidEntryPoint
public class HelpActivity extends UpNavigationActivity {
public class HelpActivity extends BaseActivity {

private HelpViewModel helpViewModel;

Expand All @@ -40,16 +38,8 @@ protected void onCreate(Bundle savedInstanceState) {
ActivityHelpBinding binding = ActivityHelpBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());

EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);

helpViewModel = new ViewModelProvider(this).get(HelpViewModel.class);

ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}

getSupportFragmentManager().beginTransaction()
.replace(R.id.frame_layout_faq, new FaqFragment())
.commit();
Expand All @@ -73,7 +63,10 @@ public boolean onCreateOptionsMenu(Menu menu) {
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();

if (itemId == R.id.view_in_google_play) {
if (itemId == android.R.id.home) {
finish();
return true;
} else if (itemId == R.id.view_in_google_play) {
openGooglePlayListing();
return true;
} else if (itemId == R.id.version_info) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import android.util.Log;
import android.util.SparseIntArray;
import android.view.View;
import android.widget.Toast;

import androidx.activity.OnBackPressedCallback;
import androidx.activity.result.ActivityResultLauncher;
Expand Down Expand Up @@ -42,7 +43,6 @@
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.MobileAds;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.navigation.NavigationBarView;
import com.google.android.material.navigationrail.NavigationRailView;
import com.google.android.material.snackbar.Snackbar;
Expand Down Expand Up @@ -80,6 +80,8 @@ public class MainActivity extends AppCompatActivity {
private AppUpdateNotificationsManager appUpdateNotificationsManager;
private AppUpdateManager appUpdateManager;
private InstallStateUpdatedListener installStateUpdatedListener;
private long backPressedTime;
private static final long BACK_PRESS_INTERVAL = 2000;
private final DefaultLifecycleObserver lifecycleObserver = new DefaultLifecycleObserver() {
@Override
public void onResume(@NonNull LifecycleOwner owner) {
Expand All @@ -88,11 +90,13 @@ public void onResume(@NonNull LifecycleOwner owner) {
if (ConsentUtils.canShowAds(MainActivity.this)) {
if (mBinding.adView.getVisibility() != View.VISIBLE) {
MobileAds.initialize(MainActivity.this);
mBinding.adPlaceholder.setVisibility(View.GONE);
mBinding.adView.setVisibility(View.VISIBLE);
mBinding.adView.loadAd(new AdRequest.Builder().build());
}
} else {
mBinding.adView.setVisibility(View.GONE);
mBinding.adPlaceholder.setVisibility(View.VISIBLE);
}
}
}
Expand Down Expand Up @@ -149,15 +153,15 @@ protected void onCreate(Bundle savedInstanceState) {
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
@Override
public void handleOnBackPressed() {
new MaterialAlertDialogBuilder(MainActivity.this)
.setTitle(R.string.alert_dialog_close)
.setMessage(R.string.summary_alert_dialog_close)
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
finish();
moveTaskToBack(true);
})
.setNegativeButton(android.R.string.no, null)
.show(); }
long currentTime = System.currentTimeMillis();
if (currentTime - backPressedTime < BACK_PRESS_INTERVAL) {
finish();
moveTaskToBack(true);
} else {
backPressedTime = currentTime;
Toast.makeText(MainActivity.this, R.string.press_back_again_to_exit, Toast.LENGTH_SHORT).show();
}
}
});
}

Expand Down Expand Up @@ -214,10 +218,12 @@ private void observeViewModel() {
if (mBinding.adView != null) {
if (ConsentUtils.canShowAds(this)) {
MobileAds.initialize(this);
mBinding.adPlaceholder.setVisibility(View.GONE);
mBinding.adView.setVisibility(View.VISIBLE);
mBinding.adView.loadAd(new AdRequest.Builder().build());
} else {
mBinding.adView.setVisibility(View.GONE);
mBinding.adPlaceholder.setVisibility(View.VISIBLE);
}
}
}
Expand Down Expand Up @@ -287,6 +293,9 @@ private void observeViewModel() {
recreate();
}
});

mainViewModel.getLoadingState().observe(this, isLoading ->
mBinding.progressBar.setVisibility(Boolean.TRUE.equals(isLoading) ? View.VISIBLE : View.GONE));
}

private void setupUpdateNotifications() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public class MainViewModel extends ViewModel {
private final BuildShortcutIntentUseCase buildShortcutIntentUseCase;
private final GetAppUpdateManagerUseCase getAppUpdateManagerUseCase;
private final MutableLiveData<MainUiState> uiState = new MutableLiveData<>();
private final MutableLiveData<Boolean> isLoading = new MutableLiveData<>(false);

@Inject
public MainViewModel(ApplyThemeSettingsUseCase applyThemeSettingsUseCase,
Expand Down Expand Up @@ -80,6 +81,7 @@ public MainViewModel(ApplyThemeSettingsUseCase applyThemeSettingsUseCase,
public void applySettings(String[] themeValues,
String[] bottomNavBarLabelsValues,
String[] defaultTabValues) {
isLoading.setValue(true);
boolean changedTheme = applyThemeSettingsUseCase.invoke(themeValues);

String labelVisibilityStr = getBottomNavLabelVisibilityUseCase.invoke();
Expand All @@ -99,6 +101,7 @@ public void applySettings(String[] themeValues,

uiState.setValue(new MainUiState(visibilityMode, startFragmentId, changedTheme));
applyLanguageSettingsUseCase.invoke();
isLoading.setValue(false);
}

/**
Expand Down Expand Up @@ -136,6 +139,13 @@ public LiveData<MainUiState> getUiState() {
return uiState;
}

/**
* Expose loading state to toggle progress indicators.
*/
public LiveData<Boolean> getLoadingState() {
return isLoading;
}

/**
* Expose the AppUpdateManager if the Activity wants to directly check for in-app updates.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,20 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.d4rk.androidtutorials.java.ui.components.navigation.BaseActivity;
import androidx.lifecycle.ViewModelProvider;

import com.android.billingclient.api.ProductDetails;
import com.d4rk.androidtutorials.java.data.repository.SupportRepository;
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.google.android.gms.ads.AdRequest;

import java.util.List;

import dagger.hilt.android.AndroidEntryPoint;

@AndroidEntryPoint
public class SupportActivity extends AppCompatActivity {
public class SupportActivity extends BaseActivity {

private ActivitySupportBinding binding;
private SupportViewModel supportViewModel;
Expand All @@ -32,15 +27,6 @@ protected void onCreate(Bundle savedInstanceState) {
binding = ActivitySupportBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());


EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);

ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}

supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class);

AdRequest adRequest = supportViewModel.initMobileAds();
Expand Down Expand Up @@ -81,12 +67,5 @@ private void initiatePurchase(String productId) {
}
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
// Up navigation handled by BaseActivity
}
40 changes: 32 additions & 8 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/ic_menu"
app:navigationContentDescription="@string/menu"
app:shapeAppearanceOverlay="@style/ShapeTokens.Clover"
app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout>
Expand All @@ -26,7 +27,7 @@
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_bar_layout"
app:layout_constraintBottom_toTopOf="@+id/ad_view"
app:layout_constraintBottom_toTopOf="@+id/ad_container"
app:menu="@menu/bottom_nav_menu" />

<androidx.fragment.app.FragmentContainerView
Expand All @@ -37,17 +38,30 @@
app:defaultNavHost="true"
app:layout_constraintStart_toEndOf="@id/nav_rail"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@+id/ad_view"
app:layout_constraintBottom_toTopOf="@+id/ad_container"
app:layout_constraintTop_toBottomOf="@id/app_bar_layout"
app:navGraph="@navigation/mobile_navigation" />

<com.google.android.gms.ads.AdView
android:id="@+id/ad_view"
<FrameLayout
android:id="@+id/ad_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:adSize="FULL_BANNER"
app:adUnitId="@string/ad_banner_unit_id"
app:layout_constraintBottom_toTopOf="@+id/nav_view" />
android:layout_height="50dp"
app:layout_constraintBottom_toTopOf="@+id/nav_view">

<View
android:id="@+id/ad_placeholder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray" />

<com.google.android.gms.ads.AdView
android:id="@+id/ad_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
app:adSize="FULL_BANNER"
app:adUnitId="@string/ad_banner_unit_id" />
</FrameLayout>

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/nav_view"
Expand All @@ -56,4 +70,14 @@
app:labelVisibilityMode="labeled"
app:layout_constraintBottom_toBottomOf="parent"
app:menu="@menu/bottom_nav_menu" />

<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ar-rEG/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<string name="summary_notification_update">إصدار جديد من التطبيق متاح. اضغط للتحديث.</string>
<string name="notification_last_time_used_title">بقالك فترة مدخلتش.</string>
<string name="summary_notification_last_time_used">It\'s been a while—learn something new about Android.</string>
<string name="menu">القائمة</string>
<string name="press_back_again_to_exit">اضغط مرة أخرى للخروج</string>
<string name="welcome">أهلاً بك</string>
<string name="summary_browse_terms_of_service_and_privacy_policy">Read and agree to the Terms of Service and Privacy Policy to continue</string>
<string name="agree">موافق</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-bg-rBG/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<string name="summary_notification_update">Налична е нова версия на приложението. Кликнете, за да актуализирате.</string>
<string name="notification_last_time_used_title">Отдавна не сме се виждали.</string>
<string name="summary_notification_last_time_used">It\'s been a while—learn something new about Android.</string>
<string name="menu">Меню</string>
<string name="press_back_again_to_exit">Натиснете отново назад, за да излезете</string>
<string name="welcome">Добре дошли</string>
<string name="summary_browse_terms_of_service_and_privacy_policy">Read and agree to the Terms of Service and Privacy Policy to continue</string>
<string name="agree">Съгласен съм</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-bn-rBD/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<string name="summary_notification_update">অ্যাপটির একটি নতুন সংস্করণ উপলব্ধ। আপডেট করতে ক্লিক করুন.</string>
<string name="notification_last_time_used_title">অনেক দিন হয়ে গেছে.</string>
<string name="summary_notification_last_time_used">It\'s been a while—learn something new about Android.</string>
<string name="menu">মেনু</string>
<string name="press_back_again_to_exit">প্রস্থান করতে আবার ফিরে টিপুন</string>
<string name="welcome">স্বাগতম</string>
<string name="summary_browse_terms_of_service_and_privacy_policy">Read and agree to the Terms of Service and Privacy Policy to continue</string>
<string name="agree">সম্মত</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-de-rDE/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<string name="summary_notification_update">Eine neue Version der App ist verfügbar. Zum Aktualisieren klicken.</string>
<string name="notification_last_time_used_title">Schon eine Weile her.</string>
<string name="summary_notification_last_time_used">It\'s been a while—learn something new about Android.</string>
<string name="menu">Menü</string>
<string name="press_back_again_to_exit">Drücken Sie erneut zurück, um zu verlassen</string>
<string name="welcome">Willkommen</string>
<string name="summary_browse_terms_of_service_and_privacy_policy">Read and agree to the Terms of Service and Privacy Policy to continue</string>
<string name="agree">Zustimmen</string>
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-es-rGQ/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<string name="summary_notification_update">Hay una nueva versión de la aplicación disponible. Haz clic para actualizar.</string>
<string name="notification_last_time_used_title">Ha pasado un tiempo.</string>
<string name="summary_notification_last_time_used">It\'s been a while—learn something new about Android.</string>
<string name="menu">Menú</string>
<string name="press_back_again_to_exit">Presione de nuevo para salir</string>
<string name="welcome">Bienvenido</string>
<string name="summary_browse_terms_of_service_and_privacy_policy">Read and agree to the Terms of Service and Privacy Policy to continue</string>
<string name="agree">Aceptar</string>
Expand Down
Loading