diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 2482f87b..42634775 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -257,15 +257,6 @@
android:exported="false"
android:label="@string/grid_view"
android:parentActivityName=".ui.screens.android.lessons.views.grid.GirdViewActivity" />
-
-
-
-
-
-
-
{
- Intent intent = new Intent(requireContext(), SettingsActivity.class);
- startActivity(intent);
+ NavHostFragment navHostFragment = (NavHostFragment) requireActivity()
+ .getSupportFragmentManager()
+ .findFragmentById(R.id.nav_host_fragment_activity_main);
+ if (navHostFragment != null) {
+ navHostFragment.getNavController().navigate(R.id.navigation_settings);
+ }
dismiss();
});
diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java
index aad63cf3..9adab447 100644
--- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java
+++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java
@@ -35,7 +35,6 @@
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;
-import com.d4rk.androidtutorials.java.ui.screens.support.SupportActivity;
import com.d4rk.androidtutorials.java.utils.ConsentUtils;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.google.android.gms.ads.AdRequest;
@@ -254,7 +253,9 @@ public boolean onCreateOptionsMenu(android.view.Menu menu) {
@Override
public boolean onOptionsItemSelected(android.view.MenuItem item) {
if (item.getItemId() == R.id.support) {
- startActivity(new Intent(this, SupportActivity.class));
+ if (navController != null) {
+ navController.navigate(R.id.navigation_support);
+ }
return true;
}
return super.onOptionsItemSelected(item);
diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizFragment.java
similarity index 69%
rename from app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizActivity.java
rename to app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizFragment.java
index 2dfc4ac2..d771d234 100644
--- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizActivity.java
+++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizFragment.java
@@ -1,60 +1,54 @@
package com.d4rk.androidtutorials.java.ui.screens.quiz;
import android.os.Bundle;
-import android.view.MenuItem;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
+import androidx.navigation.fragment.NavHostFragment;
+import com.airbnb.lottie.LottieAnimationView;
import com.d4rk.androidtutorials.java.R;
import com.d4rk.androidtutorials.java.data.model.QuizQuestion;
-import com.d4rk.androidtutorials.java.databinding.ActivityQuizBinding;
+import com.d4rk.androidtutorials.java.databinding.FragmentQuizBinding;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-import com.airbnb.lottie.LottieAnimationView;
-/**
- * Activity that displays a simple multiple-choice quiz.
- */
import dagger.hilt.android.AndroidEntryPoint;
@AndroidEntryPoint
-public class QuizActivity extends AppCompatActivity {
+public class QuizFragment extends Fragment {
- private ActivityQuizBinding binding;
+ private FragmentQuizBinding binding;
private QuizViewModel viewModel;
+ @Nullable
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = ActivityQuizBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ binding = FragmentQuizBinding.inflate(inflater, container, false);
- EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
+ EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(requireActivity());
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
-
viewModel = new ViewModelProvider(this).get(QuizViewModel.class);
if (viewModel.getTotalQuestions() == 0) {
- new MaterialAlertDialogBuilder(this)
+ new MaterialAlertDialogBuilder(requireContext())
.setMessage(R.string.quiz_no_more_questions)
- .setPositiveButton(android.R.string.ok, (d, w) -> finish())
+ .setPositiveButton(android.R.string.ok, (d, w) -> NavHostFragment.findNavController(this).popBackStack())
.setCancelable(false)
.show();
- return;
+ } else {
+ showQuestion(viewModel.getCurrentQuestion());
+ binding.buttonNext.setOnClickListener(v -> onNextClicked());
}
- showQuestion(viewModel.getCurrentQuestion());
- binding.buttonNext.setOnClickListener(v -> onNextClicked());
+ return binding.getRoot();
}
private void onNextClicked() {
@@ -94,24 +88,21 @@ private void showQuestion(QuizQuestion question) {
private void showResult() {
int score = viewModel.getScore().getValue();
int total = viewModel.getTotalQuestions();
- View view = LayoutInflater.from(this).inflate(R.layout.dialog_quiz_result, null, false);
+ View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_quiz_result, null, false);
TextView textResult = view.findViewById(R.id.text_result);
textResult.setText(getString(R.string.quiz_finished, score, total));
LottieAnimationView animationView = view.findViewById(R.id.animation_success);
animationView.playAnimation();
- new MaterialAlertDialogBuilder(this)
+ new MaterialAlertDialogBuilder(requireContext())
.setView(view)
- .setPositiveButton(android.R.string.ok, (d, w) -> finish())
+ .setPositiveButton(android.R.string.ok, (d, w) -> NavHostFragment.findNavController(this).popBackStack())
.setCancelable(false)
.show();
}
@Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
}
}
diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java
deleted file mode 100644
index 2d52301d..00000000
--- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.d4rk.androidtutorials.java.ui.screens.settings;
-
-import android.content.SharedPreferences;
-import android.os.Bundle;
-
-import androidx.annotation.Nullable;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.lifecycle.ViewModelProvider;
-import androidx.preference.ListPreference;
-
-import com.d4rk.androidtutorials.java.R;
-import com.d4rk.androidtutorials.java.databinding.ActivitySettingsBinding;
-import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
-
-/**
- * Settings screen that delegates preference change logic to a ViewModel/Repository.
- */
-import dagger.hilt.android.AndroidEntryPoint;
-
-@AndroidEntryPoint
-public class SettingsActivity extends AppCompatActivity
- implements SharedPreferences.OnSharedPreferenceChangeListener,
- androidx.preference.Preference.SummaryProvider {
-
- private SettingsViewModel settingsViewModel;
-
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ActivitySettingsBinding binding = ActivitySettingsBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
-
- EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
- edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
-
- settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class);
- settingsViewModel.applyConsent();
-
- getSupportFragmentManager().beginTransaction()
- .replace(R.id.settings, new SettingsFragment())
- .commit();
-
- ActionBar supportActionBar = getSupportActionBar();
- if (supportActionBar != null) {
- supportActionBar.setDisplayHomeAsUpEnabled(true);
- }
-
- settingsViewModel.registerPreferenceChangeListener(this);
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- boolean changedTheme = settingsViewModel.onPreferenceChanged(key);
- if (changedTheme) {
- recreate();
- }
- }
-
- /**
- * Provide summary for ListPreference if needed
- */
- @Override
- public CharSequence provideSummary(ListPreference preference) {
- String key = preference.getKey();
- if (key != null && key.equals(getString(R.string.dark_mode))) {
- String value = settingsViewModel.getDarkMode();
- int index = preference.findIndexOfValue(value);
- if (index >= 0) {
- CharSequence[] entries = preference.getEntries();
- if (entries != null && index < entries.length) {
- return entries[index];
- }
- }
- }
- return null;
- }
-
- @Override
- protected void onDestroy() {
- super.onDestroy();
- settingsViewModel.unregisterPreferenceChangeListener(this);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportFragment.java
similarity index 74%
rename from app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java
rename to app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportFragment.java
index 7b868013..38359cd2 100644
--- a/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportActivity.java
+++ b/app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/support/SupportFragment.java
@@ -3,16 +3,18 @@
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
-import android.view.MenuItem;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
import androidx.annotation.NonNull;
-import androidx.appcompat.app.ActionBar;
-import androidx.appcompat.app.AppCompatActivity;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
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.databinding.FragmentSupportBinding;
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
import com.google.android.gms.ads.AdRequest;
@@ -21,26 +23,20 @@
import dagger.hilt.android.AndroidEntryPoint;
@AndroidEntryPoint
-public class SupportActivity extends AppCompatActivity {
+public class SupportFragment extends Fragment {
- private ActivitySupportBinding binding;
+ private FragmentSupportBinding binding;
private SupportViewModel supportViewModel;
+ @Nullable
@Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- binding = ActivitySupportBinding.inflate(getLayoutInflater());
- setContentView(binding.getRoot());
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+ @Nullable Bundle savedInstanceState) {
+ binding = FragmentSupportBinding.inflate(inflater, container, false);
-
- EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
+ EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(requireActivity());
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
- ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
-
supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class);
AdRequest adRequest = supportViewModel.initMobileAds();
@@ -55,6 +51,8 @@ protected void onCreate(Bundle savedInstanceState) {
binding.buttonNormalDonation.setOnClickListener(v -> initiatePurchase("normal_donation"));
binding.buttonHighDonation.setOnClickListener(v -> initiatePurchase("high_donation"));
binding.buttonExtremeDonation.setOnClickListener(v -> initiatePurchase("extreme_donation"));
+
+ return binding.getRoot();
}
private void queryProductDetails() {
@@ -77,16 +75,13 @@ private void queryProductDetails() {
private void initiatePurchase(String productId) {
SupportRepository.BillingFlowLauncher launcher = supportViewModel.initiatePurchase(productId);
if (launcher != null) {
- launcher.launch(this);
+ launcher.launch(requireActivity());
}
}
@Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
- if (item.getItemId() == android.R.id.home) {
- finish();
- return true;
- }
- return super.onOptionsItemSelected(item);
+ public void onDestroyView() {
+ super.onDestroyView();
+ binding = null;
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
deleted file mode 100644
index ec7d0231..00000000
--- a/app/src/main/res/layout/activity_settings.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_quiz.xml b/app/src/main/res/layout/fragment_quiz.xml
similarity index 100%
rename from app/src/main/res/layout/activity_quiz.xml
rename to app/src/main/res/layout/fragment_quiz.xml
diff --git a/app/src/main/res/layout/activity_support.xml b/app/src/main/res/layout/fragment_support.xml
similarity index 100%
rename from app/src/main/res/layout/activity_support.xml
rename to app/src/main/res/layout/fragment_support.xml
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index 58964ad1..98f3f661 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -17,4 +17,24 @@
android:name="com.d4rk.androidtutorials.java.ui.screens.about.AboutFragment"
android:label="@string/about"
tools:layout="@layout/fragment_about" />
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml-v26/shortcuts.xml b/app/src/main/res/xml-v26/shortcuts.xml
index 50beaf4d..74cba319 100644
--- a/app/src/main/res/xml-v26/shortcuts.xml
+++ b/app/src/main/res/xml-v26/shortcuts.xml
@@ -7,7 +7,8 @@
android:shortcutShortLabel="@string/settings">
\ No newline at end of file