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