Skip to content

Commit d424b39

Browse files
Merge pull request #73 from MihaiCristianCondrea/codex/restore-separate-activities-from-recent-commits
Restore quiz, support, and settings activities
2 parents c9873b8 + da9e998 commit d424b39

File tree

12 files changed

+189
-87
lines changed

12 files changed

+189
-87
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,26 @@
304304
android:label="@string/navigation_drawer"
305305
android:parentActivityName=".ui.screens.main.MainActivity" />
306306

307+
<activity
308+
android:name=".ui.screens.settings.SettingsActivity"
309+
android:exported="false"
310+
android:label="@string/settings"
311+
android:parentActivityName=".ui.screens.settings.SettingsActivity">
312+
<intent-filter>
313+
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
314+
</intent-filter>
315+
</activity>
316+
<activity
317+
android:name=".ui.screens.support.SupportActivity"
318+
android:exported="false"
319+
android:label="@string/support_us"
320+
android:parentActivityName=".ui.screens.support.SupportActivity" />
321+
<activity
322+
android:name=".ui.screens.quiz.QuizActivity"
323+
android:exported="false"
324+
android:label="@string/quiz_title"
325+
android:parentActivityName=".ui.screens.quiz.QuizActivity" />
326+
307327
<receiver
308328
android:name=".notifications.receivers.QuizReminderReceiver"
309329
android:exported="false" />

app/src/main/java/com/d4rk/androidtutorials/java/notifications/workers/QuizReminderWorker.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
import android.app.NotificationManager;
55
import android.app.PendingIntent;
66
import android.content.Context;
7+
import android.content.Intent;
78
import android.os.Build;
89

910
import androidx.annotation.NonNull;
1011
import androidx.annotation.RequiresApi;
1112
import androidx.core.app.NotificationCompat;
12-
import androidx.navigation.NavDeepLinkBuilder;
1313
import androidx.work.Worker;
1414
import androidx.work.WorkerParameters;
1515

1616
import com.d4rk.androidtutorials.java.R;
17-
import com.d4rk.androidtutorials.java.ui.screens.main.MainActivity;
17+
import com.d4rk.androidtutorials.java.ui.screens.quiz.QuizActivity;
1818

1919
/**
2020
* Worker that displays the daily quiz reminder notification.
@@ -39,11 +39,9 @@ public Result doWork() {
3939
);
4040
manager.createNotificationChannel(channel);
4141

42-
PendingIntent pendingIntent = new NavDeepLinkBuilder(getApplicationContext())
43-
.setComponentName(MainActivity.class)
44-
.setGraph(R.navigation.mobile_navigation)
45-
.setDestination(R.id.navigation_quiz)
46-
.createPendingIntent();
42+
Intent intent = new Intent(getApplicationContext(), QuizActivity.class);
43+
PendingIntent pendingIntent = PendingIntent.getActivity(
44+
getApplicationContext(), 0, intent, PendingIntent.FLAG_IMMUTABLE);
4745

4846
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext(), channelId)
4947
.setSmallIcon(R.drawable.ic_check_circle)

app/src/main/java/com/d4rk/androidtutorials/java/ui/components/navigation/BottomSheetMenuFragment.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import com.d4rk.androidtutorials.java.BuildConfig;
1313
import com.d4rk.androidtutorials.java.R;
1414
import com.d4rk.androidtutorials.java.databinding.BottomSheetMenuBinding;
15-
import androidx.navigation.fragment.NavHostFragment;
15+
import com.d4rk.androidtutorials.java.ui.screens.settings.SettingsActivity;
1616
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
1717

1818
public class BottomSheetMenuFragment extends BottomSheetDialogFragment {
@@ -26,12 +26,8 @@ public View onCreateView(@NonNull LayoutInflater inflater,
2626
binding = BottomSheetMenuBinding.inflate(inflater, container, false);
2727

2828
binding.menuSettings.setOnClickListener(v -> {
29-
NavHostFragment navHostFragment = (NavHostFragment) requireActivity()
30-
.getSupportFragmentManager()
31-
.findFragmentById(R.id.nav_host_fragment_activity_main);
32-
if (navHostFragment != null) {
33-
navHostFragment.getNavController().navigate(R.id.navigation_settings);
34-
}
29+
Intent intent = new Intent(requireContext(), SettingsActivity.class);
30+
startActivity(intent);
3531
dismiss();
3632
});
3733

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/main/MainActivity.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import com.d4rk.androidtutorials.java.ui.components.navigation.BottomSheetMenuFragment;
3636
import com.d4rk.androidtutorials.java.ui.screens.startup.StartupViewModel;
3737
import com.d4rk.androidtutorials.java.ui.screens.startup.dialogs.ConsentDialogFragment;
38+
import com.d4rk.androidtutorials.java.ui.screens.support.SupportActivity;
3839
import com.d4rk.androidtutorials.java.utils.ConsentUtils;
3940
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
4041
import com.google.android.gms.ads.AdRequest;
@@ -256,9 +257,7 @@ public boolean onCreateOptionsMenu(android.view.Menu menu) {
256257
@Override
257258
public boolean onOptionsItemSelected(android.view.MenuItem item) {
258259
if (item.getItemId() == R.id.support) {
259-
if (navController != null) {
260-
navController.navigate(R.id.navigation_support);
261-
}
260+
startActivity(new Intent(this, SupportActivity.class));
262261
return true;
263262
}
264263
return super.onOptionsItemSelected(item);

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizFragment.java renamed to app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/quiz/QuizActivity.java

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,60 @@
11
package com.d4rk.androidtutorials.java.ui.screens.quiz;
22

33
import android.os.Bundle;
4-
import android.view.LayoutInflater;
5-
import android.view.View;
6-
import android.view.ViewGroup;
7-
import android.widget.TextView;
4+
import android.view.MenuItem;
85

96
import androidx.annotation.NonNull;
10-
import androidx.annotation.Nullable;
11-
import androidx.fragment.app.Fragment;
7+
import androidx.appcompat.app.ActionBar;
8+
import androidx.appcompat.app.AppCompatActivity;
129
import androidx.lifecycle.ViewModelProvider;
13-
import androidx.navigation.fragment.NavHostFragment;
1410

15-
import com.airbnb.lottie.LottieAnimationView;
1611
import com.d4rk.androidtutorials.java.R;
1712
import com.d4rk.androidtutorials.java.data.model.QuizQuestion;
18-
import com.d4rk.androidtutorials.java.databinding.FragmentQuizBinding;
13+
import com.d4rk.androidtutorials.java.databinding.ActivityQuizBinding;
1914
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
2015
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
16+
import android.view.LayoutInflater;
17+
import android.view.View;
18+
import android.widget.TextView;
19+
import com.airbnb.lottie.LottieAnimationView;
2120

21+
/**
22+
* Activity that displays a simple multiple-choice quiz.
23+
*/
2224
import dagger.hilt.android.AndroidEntryPoint;
2325

2426
@AndroidEntryPoint
25-
public class QuizFragment extends Fragment {
27+
public class QuizActivity extends AppCompatActivity {
2628

27-
private FragmentQuizBinding binding;
29+
private ActivityQuizBinding binding;
2830
private QuizViewModel viewModel;
2931

30-
@Nullable
3132
@Override
32-
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
33-
@Nullable Bundle savedInstanceState) {
34-
binding = FragmentQuizBinding.inflate(inflater, container, false);
33+
protected void onCreate(Bundle savedInstanceState) {
34+
super.onCreate(savedInstanceState);
35+
binding = ActivityQuizBinding.inflate(getLayoutInflater());
36+
setContentView(binding.getRoot());
3537

36-
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(requireActivity());
38+
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
3739
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
3840

41+
ActionBar actionBar = getSupportActionBar();
42+
if (actionBar != null) {
43+
actionBar.setDisplayHomeAsUpEnabled(true);
44+
}
45+
3946
viewModel = new ViewModelProvider(this).get(QuizViewModel.class);
4047
if (viewModel.getTotalQuestions() == 0) {
41-
new MaterialAlertDialogBuilder(requireContext())
48+
new MaterialAlertDialogBuilder(this)
4249
.setMessage(R.string.quiz_no_more_questions)
43-
.setPositiveButton(android.R.string.ok, (d, w) -> NavHostFragment.findNavController(this).popBackStack())
50+
.setPositiveButton(android.R.string.ok, (d, w) -> finish())
4451
.setCancelable(false)
4552
.show();
46-
} else {
47-
showQuestion(viewModel.getCurrentQuestion());
48-
binding.buttonNext.setOnClickListener(v -> onNextClicked());
53+
return;
4954
}
55+
showQuestion(viewModel.getCurrentQuestion());
5056

51-
return binding.getRoot();
57+
binding.buttonNext.setOnClickListener(v -> onNextClicked());
5258
}
5359

5460
private void onNextClicked() {
@@ -88,21 +94,24 @@ private void showQuestion(QuizQuestion question) {
8894
private void showResult() {
8995
int score = viewModel.getScore().getValue();
9096
int total = viewModel.getTotalQuestions();
91-
View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_quiz_result, null, false);
97+
View view = LayoutInflater.from(this).inflate(R.layout.dialog_quiz_result, null, false);
9298
TextView textResult = view.findViewById(R.id.text_result);
9399
textResult.setText(getString(R.string.quiz_finished, score, total));
94100
LottieAnimationView animationView = view.findViewById(R.id.animation_success);
95101
animationView.playAnimation();
96-
new MaterialAlertDialogBuilder(requireContext())
102+
new MaterialAlertDialogBuilder(this)
97103
.setView(view)
98-
.setPositiveButton(android.R.string.ok, (d, w) -> NavHostFragment.findNavController(this).popBackStack())
104+
.setPositiveButton(android.R.string.ok, (d, w) -> finish())
99105
.setCancelable(false)
100106
.show();
101107
}
102108

103109
@Override
104-
public void onDestroyView() {
105-
super.onDestroyView();
106-
binding = null;
110+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
111+
if (item.getItemId() == android.R.id.home) {
112+
finish();
113+
return true;
114+
}
115+
return super.onOptionsItemSelected(item);
107116
}
108117
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.d4rk.androidtutorials.java.ui.screens.settings;
2+
3+
import android.content.SharedPreferences;
4+
import android.os.Bundle;
5+
6+
import androidx.annotation.Nullable;
7+
import androidx.appcompat.app.ActionBar;
8+
import androidx.appcompat.app.AppCompatActivity;
9+
import androidx.lifecycle.ViewModelProvider;
10+
import androidx.preference.ListPreference;
11+
12+
import com.d4rk.androidtutorials.java.R;
13+
import com.d4rk.androidtutorials.java.databinding.ActivitySettingsBinding;
14+
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
15+
16+
/**
17+
* Settings screen that delegates preference change logic to a ViewModel/Repository.
18+
*/
19+
import dagger.hilt.android.AndroidEntryPoint;
20+
21+
@AndroidEntryPoint
22+
public class SettingsActivity extends AppCompatActivity
23+
implements SharedPreferences.OnSharedPreferenceChangeListener,
24+
androidx.preference.Preference.SummaryProvider<ListPreference> {
25+
26+
private SettingsViewModel settingsViewModel;
27+
28+
@Override
29+
protected void onCreate(@Nullable Bundle savedInstanceState) {
30+
super.onCreate(savedInstanceState);
31+
ActivitySettingsBinding binding = ActivitySettingsBinding.inflate(getLayoutInflater());
32+
setContentView(binding.getRoot());
33+
34+
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
35+
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
36+
37+
settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class);
38+
settingsViewModel.applyConsent();
39+
40+
getSupportFragmentManager().beginTransaction()
41+
.replace(R.id.settings, new SettingsFragment())
42+
.commit();
43+
44+
ActionBar supportActionBar = getSupportActionBar();
45+
if (supportActionBar != null) {
46+
supportActionBar.setDisplayHomeAsUpEnabled(true);
47+
}
48+
49+
settingsViewModel.registerPreferenceChangeListener(this);
50+
}
51+
52+
@Override
53+
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
54+
boolean changedTheme = settingsViewModel.onPreferenceChanged(key);
55+
if (changedTheme) {
56+
recreate();
57+
}
58+
}
59+
60+
/**
61+
* Provide summary for ListPreference if needed
62+
*/
63+
@Override
64+
public CharSequence provideSummary(ListPreference preference) {
65+
String key = preference.getKey();
66+
if (key != null && key.equals(getString(R.string.dark_mode))) {
67+
String value = settingsViewModel.getDarkMode();
68+
int index = preference.findIndexOfValue(value);
69+
if (index >= 0) {
70+
CharSequence[] entries = preference.getEntries();
71+
if (entries != null && index < entries.length) {
72+
return entries[index];
73+
}
74+
}
75+
}
76+
return null;
77+
}
78+
79+
@Override
80+
protected void onDestroy() {
81+
super.onDestroy();
82+
settingsViewModel.unregisterPreferenceChangeListener(this);
83+
}
84+
}
Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@
33
import android.content.Intent;
44
import android.net.Uri;
55
import android.os.Bundle;
6-
import android.view.LayoutInflater;
7-
import android.view.View;
8-
import android.view.ViewGroup;
6+
import android.view.MenuItem;
97

108
import androidx.annotation.NonNull;
11-
import androidx.annotation.Nullable;
12-
import androidx.fragment.app.Fragment;
9+
import androidx.appcompat.app.ActionBar;
10+
import androidx.appcompat.app.AppCompatActivity;
1311
import androidx.lifecycle.ViewModelProvider;
1412

1513
import com.android.billingclient.api.ProductDetails;
1614
import com.d4rk.androidtutorials.java.data.repository.SupportRepository;
17-
import com.d4rk.androidtutorials.java.databinding.FragmentSupportBinding;
15+
import com.d4rk.androidtutorials.java.databinding.ActivitySupportBinding;
1816
import com.d4rk.androidtutorials.java.utils.EdgeToEdgeDelegate;
1917
import com.google.android.gms.ads.AdRequest;
2018

@@ -23,20 +21,26 @@
2321
import dagger.hilt.android.AndroidEntryPoint;
2422

2523
@AndroidEntryPoint
26-
public class SupportFragment extends Fragment {
24+
public class SupportActivity extends AppCompatActivity {
2725

28-
private FragmentSupportBinding binding;
26+
private ActivitySupportBinding binding;
2927
private SupportViewModel supportViewModel;
3028

31-
@Nullable
3229
@Override
33-
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
34-
@Nullable Bundle savedInstanceState) {
35-
binding = FragmentSupportBinding.inflate(inflater, container, false);
30+
protected void onCreate(Bundle savedInstanceState) {
31+
super.onCreate(savedInstanceState);
32+
binding = ActivitySupportBinding.inflate(getLayoutInflater());
33+
setContentView(binding.getRoot());
3634

37-
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(requireActivity());
35+
36+
EdgeToEdgeDelegate edgeToEdgeDelegate = new EdgeToEdgeDelegate(this);
3837
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
3938

39+
ActionBar actionBar = getSupportActionBar();
40+
if (actionBar != null) {
41+
actionBar.setDisplayHomeAsUpEnabled(true);
42+
}
43+
4044
supportViewModel = new ViewModelProvider(this).get(SupportViewModel.class);
4145

4246
AdRequest adRequest = supportViewModel.initMobileAds();
@@ -51,8 +55,6 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
5155
binding.buttonNormalDonation.setOnClickListener(v -> initiatePurchase("normal_donation"));
5256
binding.buttonHighDonation.setOnClickListener(v -> initiatePurchase("high_donation"));
5357
binding.buttonExtremeDonation.setOnClickListener(v -> initiatePurchase("extreme_donation"));
54-
55-
return binding.getRoot();
5658
}
5759

5860
private void queryProductDetails() {
@@ -75,13 +77,16 @@ private void queryProductDetails() {
7577
private void initiatePurchase(String productId) {
7678
SupportRepository.BillingFlowLauncher launcher = supportViewModel.initiatePurchase(productId);
7779
if (launcher != null) {
78-
launcher.launch(requireActivity());
80+
launcher.launch(this);
7981
}
8082
}
8183

8284
@Override
83-
public void onDestroyView() {
84-
super.onDestroyView();
85-
binding = null;
85+
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
86+
if (item.getItemId() == android.R.id.home) {
87+
finish();
88+
return true;
89+
}
90+
return super.onOptionsItemSelected(item);
8691
}
87-
}
92+
}

0 commit comments

Comments
 (0)