Skip to content

Commit 8c9fda9

Browse files
Refine onboarding theme handling and integrate consent
1 parent e9a128e commit 8c9fda9

File tree

13 files changed

+147
-159
lines changed

13 files changed

+147
-159
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/DataFragment.java

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
import androidx.lifecycle.ViewModelProvider;
1414

1515
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingDataBinding;
16+
import com.d4rk.androidtutorials.java.utils.ConsentUtils;
17+
import androidx.preference.PreferenceManager;
18+
import android.content.SharedPreferences;
19+
import com.d4rk.androidtutorials.java.R;
1620

1721
public class DataFragment extends Fragment {
1822

@@ -30,9 +34,27 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
3034
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
3135
super.onViewCreated(view, savedInstanceState);
3236
viewModel = new ViewModelProvider(requireActivity()).get(OnboardingViewModel.class);
37+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
38+
String keyAnalytics = getString(R.string.key_consent_analytics);
39+
String keyAdPersonalization = getString(R.string.key_consent_ad_personalization);
3340

34-
binding.switchCrashlytics.setOnCheckedChangeListener((buttonView, isChecked) ->
35-
viewModel.setCrashlyticsEnabled(isChecked));
41+
boolean analytics = prefs.getBoolean(keyAnalytics, true);
42+
boolean ads = prefs.getBoolean(keyAdPersonalization, true);
43+
binding.switchCrashlytics.setChecked(analytics);
44+
binding.switchAds.setChecked(ads);
45+
46+
binding.switchCrashlytics.setOnCheckedChangeListener((buttonView, isChecked) -> {
47+
viewModel.setCrashlyticsEnabled(isChecked);
48+
viewModel.setConsentAnalytics(isChecked);
49+
ConsentUtils.updateFirebaseConsent(requireContext(), isChecked, binding.switchAds.isChecked(), binding.switchAds.isChecked(), binding.switchAds.isChecked());
50+
});
51+
52+
binding.switchAds.setOnCheckedChangeListener((buttonView, isChecked) -> {
53+
viewModel.setConsentAdStorage(isChecked);
54+
viewModel.setConsentAdUserData(isChecked);
55+
viewModel.setConsentAdPersonalization(isChecked);
56+
ConsentUtils.updateFirebaseConsent(requireContext(), binding.switchCrashlytics.isChecked(), isChecked, isChecked, isChecked);
57+
});
3658

3759
binding.linkPrivacy.setOnClickListener(v -> {
3860
Intent intent = new Intent(Intent.ACTION_VIEW,
@@ -42,7 +64,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4264
}
4365

4466
public void saveSelection() {
45-
viewModel.setCrashlyticsEnabled(binding.switchCrashlytics.isChecked());
67+
boolean analytics = binding.switchCrashlytics.isChecked();
68+
boolean ads = binding.switchAds.isChecked();
69+
viewModel.setCrashlyticsEnabled(analytics);
70+
viewModel.setConsentAnalytics(analytics);
71+
viewModel.setConsentAdStorage(ads);
72+
viewModel.setConsentAdUserData(ads);
73+
viewModel.setConsentAdPersonalization(ads);
74+
ConsentUtils.updateFirebaseConsent(requireContext(), analytics, ads, ads, ads);
4675
}
4776

4877
@Override

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/DoneFragment.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import androidx.annotation.NonNull;
99
import androidx.annotation.Nullable;
1010
import androidx.fragment.app.Fragment;
11-
1211
import androidx.lifecycle.ViewModelProvider;
1312

1413
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingDoneBinding;

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/OnboardingActivity.java

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package com.d4rk.androidtutorials.java.ui.screens.onboarding;
22

33
import android.content.Intent;
4-
import android.content.SharedPreferences;
54
import android.os.Bundle;
65
import android.view.View;
76
import android.widget.ImageView;
87
import android.widget.LinearLayout;
98

109
import androidx.annotation.NonNull;
11-
import androidx.preference.PreferenceManager;
1210
import androidx.appcompat.app.AppCompatActivity;
1311
import androidx.fragment.app.Fragment;
1412
import androidx.lifecycle.ViewModelProvider;
@@ -17,8 +15,6 @@
1715
import com.d4rk.androidtutorials.java.R;
1816
import com.d4rk.androidtutorials.java.databinding.ActivityOnboardingBinding;
1917
import com.d4rk.androidtutorials.java.ui.screens.main.MainActivity;
20-
import com.d4rk.androidtutorials.java.ui.screens.startup.dialogs.ConsentDialogFragment;
21-
import com.d4rk.androidtutorials.java.utils.ConsentUtils;
2218
import com.google.android.material.tabs.TabLayout;
2319
import com.google.android.material.tabs.TabLayoutMediator;
2420

@@ -42,14 +38,9 @@ protected void onCreate(Bundle savedInstanceState) {
4238

4339
adapter = new OnboardingPagerAdapter(this);
4440
binding.viewPager.setAdapter(adapter);
45-
46-
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
47-
String keyAnalytics = getString(R.string.key_consent_analytics);
48-
if (!prefs.contains(keyAnalytics)) {
49-
ConsentDialogFragment dialog = new ConsentDialogFragment();
50-
dialog.setConsentListener((a,b,c,d) -> ConsentUtils.updateFirebaseConsent(this, a,b,c,d));
51-
dialog.show(getSupportFragmentManager(), "consent");
52-
}
41+
int startPage = viewModel.getCurrentPage();
42+
binding.viewPager.setCurrentItem(startPage, false);
43+
currentPosition = startPage;
5344

5445
binding.viewPager.registerOnPageChangeCallback(new androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback() {
5546
@Override
@@ -66,6 +57,7 @@ public void onPageSelected(int position) {
6657
}
6758
}
6859
currentPosition = position;
60+
viewModel.setCurrentPage(position);
6961
}
7062
});
7163

@@ -80,9 +72,9 @@ public void onPageSelected(int position) {
8072
tab.setCustomView(dot);
8173
}).attach();
8274

83-
TabLayout.Tab firstTab = binding.tabIndicator.getTabAt(0);
84-
if (firstTab != null && firstTab.getCustomView() instanceof ImageView) {
85-
((ImageView) firstTab.getCustomView()).setImageResource(R.drawable.onboarding_dot_selected);
75+
TabLayout.Tab startTab = binding.tabIndicator.getTabAt(startPage);
76+
if (startTab != null && startTab.getCustomView() instanceof ImageView) {
77+
((ImageView) startTab.getCustomView()).setImageResource(R.drawable.onboarding_dot_selected);
8678
}
8779

8880
binding.tabIndicator.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@@ -137,7 +129,7 @@ public void onTabReselected(TabLayout.Tab tab) {
137129
}
138130
});
139131

140-
updateButtons(0);
132+
updateButtons(startPage);
141133
}
142134

143135
void finishOnboarding() {

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/OnboardingViewModel.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class OnboardingViewModel extends ViewModel {
1818

1919
private final Context context;
2020
private final SharedPreferences prefs;
21+
private int currentPage = 0;
2122

2223
@Inject
2324
public OnboardingViewModel(@ApplicationContext Context context) {
@@ -29,6 +30,19 @@ public void setTheme(String value) {
2930
prefs.edit().putString(context.getString(R.string.key_theme), value).apply();
3031
}
3132

33+
public String getTheme() {
34+
String[] values = context.getResources().getStringArray(R.array.preference_theme_values);
35+
return prefs.getString(context.getString(R.string.key_theme), values[0]);
36+
}
37+
38+
public void setCurrentPage(int page) {
39+
currentPage = page;
40+
}
41+
42+
public int getCurrentPage() {
43+
return currentPage;
44+
}
45+
3246
public void setDefaultTab(String value) {
3347
prefs.edit().putString(context.getString(R.string.key_default_tab), value).apply();
3448
}
@@ -45,6 +59,22 @@ public void setCrashlyticsEnabled(boolean enabled) {
4559
prefs.edit().putBoolean(context.getString(R.string.key_firebase_crashlytics), enabled).apply();
4660
}
4761

62+
public void setConsentAnalytics(boolean enabled) {
63+
prefs.edit().putBoolean(context.getString(R.string.key_consent_analytics), enabled).apply();
64+
}
65+
66+
public void setConsentAdStorage(boolean enabled) {
67+
prefs.edit().putBoolean(context.getString(R.string.key_consent_ad_storage), enabled).apply();
68+
}
69+
70+
public void setConsentAdUserData(boolean enabled) {
71+
prefs.edit().putBoolean(context.getString(R.string.key_consent_ad_user_data), enabled).apply();
72+
}
73+
74+
public void setConsentAdPersonalization(boolean enabled) {
75+
prefs.edit().putBoolean(context.getString(R.string.key_consent_ad_personalization), enabled).apply();
76+
}
77+
4878
public void markOnboardingComplete() {
4979
prefs.edit().putBoolean(context.getString(R.string.key_onboarding_complete), true).apply();
5080
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/onboarding/ThemeFragment.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
import androidx.annotation.NonNull;
99
import androidx.annotation.Nullable;
10+
import androidx.appcompat.app.AppCompatDelegate;
1011
import androidx.core.content.ContextCompat;
1112
import androidx.fragment.app.Fragment;
1213
import androidx.lifecycle.ViewModelProvider;
13-
import androidx.appcompat.app.AppCompatDelegate;
1414

1515
import com.d4rk.androidtutorials.java.R;
1616
import com.d4rk.androidtutorials.java.databinding.FragmentOnboardingSelectionBinding;
@@ -49,7 +49,12 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4949
binding.optionSecond.radioButton.setId(View.generateViewId());
5050
binding.optionThird.radioButton.setId(View.generateViewId());
5151

52-
selectOption(2);
52+
String themeValue = viewModel.getTheme();
53+
String[] values = getResources().getStringArray(R.array.preference_theme_values);
54+
int index = 2; // default follow system
55+
if (themeValue.equals(values[1])) index = 0;
56+
else if (themeValue.equals(values[2])) index = 1;
57+
setRadioButtons(index);
5358

5459
binding.cardFirst.setOnClickListener(v -> selectOption(0));
5560
binding.cardSecond.setOnClickListener(v -> selectOption(1));
@@ -60,33 +65,33 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
6065
binding.optionThird.radioButton.setOnClickListener(v -> selectOption(2));
6166
}
6267

63-
private void selectOption(int index) {
68+
private void setRadioButtons(int index) {
6469
binding.optionFirst.radioButton.setChecked(index == 0);
6570
binding.optionSecond.radioButton.setChecked(index == 1);
6671
binding.optionThird.radioButton.setChecked(index == 2);
72+
}
6773

74+
private void selectOption(int index) {
75+
setRadioButtons(index);
6876
int mode;
77+
String[] values = getResources().getStringArray(R.array.preference_theme_values);
78+
String value;
6979
if (index == 0) {
7080
mode = AppCompatDelegate.MODE_NIGHT_NO;
81+
value = values[1];
7182
} else if (index == 1) {
7283
mode = AppCompatDelegate.MODE_NIGHT_YES;
84+
value = values[2];
7385
} else {
7486
mode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM;
87+
value = values[0];
7588
}
89+
viewModel.setTheme(value);
7690
AppCompatDelegate.setDefaultNightMode(mode);
7791
}
7892

7993
public void saveSelection() {
80-
String[] values = getResources().getStringArray(R.array.preference_theme_values);
81-
String value;
82-
if (binding.optionFirst.radioButton.isChecked()) {
83-
value = values[1];
84-
} else if (binding.optionSecond.radioButton.isChecked()) {
85-
value = values[2];
86-
} else {
87-
value = values[0];
88-
}
89-
viewModel.setTheme(value);
94+
// theme stored on selection
9095
}
9196

9297
@Override

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/startup/dialogs/ConsentDialogFragment.java

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1-
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
2-
<path android:fillColor="#FF000000" android:pathData="M9.37 5.51A7 7 0 0 0 12 19a7 7 0 0 0 6.49-4.5 6.5 6.5 0 0 1 -9.12-9z"/>
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:width="24dp"
4+
android:height="24dp"
5+
android:viewportWidth="24"
6+
android:viewportHeight="24">
7+
8+
<path
9+
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
10+
<path
11+
android:fillColor="#000000"
12+
android:pathData="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z" />
313
</vector>
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1-
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
2-
<path android:fillColor="#FF000000" android:pathData="M6.76,4.84l-1.8,-1.79 -1.41,1.41 1.79,1.8 1.42,-1.42zM1,11h3v2H1v-2zm10,-9h2v3h-2V2zm7.66,3.05l1.79,-1.8 -1.41,-1.41 -1.8,1.79 1.42,1.42zM17,11h3v2h-3v-2zm-5,5a4,4 0 1,1 0,-8 4,4 0 0,1 0,8zm5.24,1.16l1.8,1.79 1.41,-1.41 -1.79,-1.8 -1.42,1.42zM13,22h-2v-3h2v3zm-7.66,-3.05l-1.79,1.8 1.41,1.41 1.8,-1.79 -1.42,-1.42z"/>
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:width="24dp"
4+
android:height="24dp"
5+
android:viewportWidth="24"
6+
android:viewportHeight="24">
7+
8+
<path
9+
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
10+
<path
11+
android:fillColor="#000000"
12+
android:pathData="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z" />
313
</vector>
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1-
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
2-
<path android:fillColor="#FF000000" android:pathData="M17,1H7C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2-0.9 2-2V3c0-1.1-0.9-2-2-2zm0,18H7V5h10v14z"/>
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:width="24dp"
4+
android:height="24dp"
5+
android:viewportWidth="24"
6+
android:viewportHeight="24">
7+
8+
<group>
9+
<path
10+
android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" />
11+
</group>
12+
<group>
13+
<path
14+
android:fillColor="#000000"
15+
android:pathData="M12,22c5.52,0,10-4.48,10-10S17.52,2,12,2S2,6.48,2,12S6.48,22,12,22z M13,4.07c3.94,0.49,7,3.85,7,7.93s-3.05,7.44-7,7.93 V4.07z" />
16+
</group>
317
</vector>

0 commit comments

Comments
 (0)