Skip to content

Commit 9239a5d

Browse files
Merge pull request #18 from D4rK7355608/codex/set-up-consent-mode-in-firebase
Implement persistent consent switches
2 parents 89eaa54 + 6966668 commit 9239a5d

File tree

8 files changed

+101
-11
lines changed

8 files changed

+101
-11
lines changed

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
3232
edgeToEdgeDelegate.applyEdgeToEdge(binding.container);
3333

3434
settingsViewModel = new ViewModelProvider(this).get(SettingsViewModel.class);
35+
settingsViewModel.applyConsent();
3536

3637
getSupportFragmentManager().beginTransaction()
3738
.replace(R.id.settings, new SettingsFragment())

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/SettingsViewModel.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,8 @@ public boolean onPreferenceChanged(String key) {
3535
public SharedPreferences getSharedPreferences() {
3636
return settingsRepository.getSharedPreferences();
3737
}
38+
39+
public void applyConsent() {
40+
settingsRepository.applyConsent();
41+
}
3842
}

app/src/main/java/com/d4rk/androidtutorials/java/ui/screens/settings/repository/SettingsRepository.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
import androidx.appcompat.app.AppCompatDelegate;
77
import androidx.core.os.LocaleListCompat;
88
import androidx.preference.PreferenceManager;
9+
import com.google.firebase.analytics.FirebaseAnalytics;
10+
import java.util.EnumMap;
11+
import java.util.Map;
912

1013
import com.d4rk.androidtutorials.java.R;
1114

@@ -76,9 +79,39 @@ public void handlePreferenceChange(String key) {
7679
applyTheme();
7780
} else if (key.equals(context.getString(R.string.key_language))) {
7881
applyLanguage();
82+
} else if (key.equals(context.getString(R.string.key_consent_analytics)) ||
83+
key.equals(context.getString(R.string.key_consent_ad_storage)) ||
84+
key.equals(context.getString(R.string.key_consent_ad_user_data)) ||
85+
key.equals(context.getString(R.string.key_consent_ad_personalization))) {
86+
applyConsent();
7987
}
8088
}
8189

90+
/** Apply Firebase consent settings from preferences */
91+
public void applyConsent() {
92+
boolean analytics = sharedPreferences.getBoolean(
93+
context.getString(R.string.key_consent_analytics), true);
94+
boolean adStorage = sharedPreferences.getBoolean(
95+
context.getString(R.string.key_consent_ad_storage), true);
96+
boolean adUserData = sharedPreferences.getBoolean(
97+
context.getString(R.string.key_consent_ad_user_data), true);
98+
boolean adPersonalization = sharedPreferences.getBoolean(
99+
context.getString(R.string.key_consent_ad_personalization), true);
100+
101+
Map<FirebaseAnalytics.ConsentType, FirebaseAnalytics.ConsentStatus> map =
102+
new EnumMap<>(FirebaseAnalytics.ConsentType.class);
103+
map.put(FirebaseAnalytics.ConsentType.ANALYTICS_STORAGE,
104+
analytics ? FirebaseAnalytics.ConsentStatus.GRANTED : FirebaseAnalytics.ConsentStatus.DENIED);
105+
map.put(FirebaseAnalytics.ConsentType.AD_STORAGE,
106+
adStorage ? FirebaseAnalytics.ConsentStatus.GRANTED : FirebaseAnalytics.ConsentStatus.DENIED);
107+
map.put(FirebaseAnalytics.ConsentType.AD_USER_DATA,
108+
adUserData ? FirebaseAnalytics.ConsentStatus.GRANTED : FirebaseAnalytics.ConsentStatus.DENIED);
109+
map.put(FirebaseAnalytics.ConsentType.AD_PERSONALIZATION,
110+
adPersonalization ? FirebaseAnalytics.ConsentStatus.GRANTED : FirebaseAnalytics.ConsentStatus.DENIED);
111+
112+
FirebaseAnalytics.getInstance(context).setConsent(map);
113+
}
114+
82115
public SharedPreferences getSharedPreferences() {
83116
return sharedPreferences;
84117
}

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import android.Manifest;
44
import android.content.Intent;
5+
import android.content.SharedPreferences;
6+
import androidx.preference.PreferenceManager;
57
import android.net.Uri;
68
import android.os.Build;
79
import android.os.Bundle;
@@ -33,6 +35,8 @@ protected void onCreate(Bundle savedInstanceState) {
3335
com.d4rk.androidtutorials.java.databinding.ActivityStartupBinding binding = ActivityStartupBinding.inflate(getLayoutInflater());
3436
setContentView(binding.getRoot());
3537

38+
applyStoredConsent();
39+
3640
startupViewModel = new ViewModelProvider(this).get(StartupViewModel.class);
3741

3842
consentInformation = UserMessagingPlatform.getConsentInformation(this);
@@ -50,7 +54,7 @@ protected void onCreate(Bundle savedInstanceState) {
5054
formError -> updateFirebaseConsent(false, false, false, false)
5155
);
5256
} else if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.OBTAINED) {
53-
updateFirebaseConsent(true, true, true, true);
57+
applyStoredConsent();
5458
}
5559
},
5660
formError -> {}
@@ -84,6 +88,15 @@ private void proceedToMainActivity() {
8488
finish();
8589
}
8690

91+
private void applyStoredConsent() {
92+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
93+
boolean analytics = prefs.getBoolean(getString(R.string.key_consent_analytics), true);
94+
boolean adStorage = prefs.getBoolean(getString(R.string.key_consent_ad_storage), true);
95+
boolean adUserData = prefs.getBoolean(getString(R.string.key_consent_ad_user_data), true);
96+
boolean adPersonalization = prefs.getBoolean(getString(R.string.key_consent_ad_personalization), true);
97+
updateFirebaseConsent(analytics, adStorage, adUserData, adPersonalization);
98+
}
99+
87100
private void updateFirebaseConsent(boolean analytics,
88101
boolean adStorage,
89102
boolean adUserData,

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

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import android.app.Dialog;
44
import android.os.Bundle;
55
import android.view.LayoutInflater;
6+
import android.content.SharedPreferences;
7+
import androidx.preference.PreferenceManager;
68

79
import androidx.annotation.NonNull;
810
import androidx.annotation.Nullable;
@@ -30,11 +32,17 @@ public void setConsentListener(ConsentListener listener) {
3032
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
3133
DialogConsentBinding binding = DialogConsentBinding.inflate(LayoutInflater.from(requireContext()));
3234

35+
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireContext());
3336
boolean defaultChecked = !BuildConfig.DEBUG;
34-
binding.checkAnalyticsStorage.setChecked(defaultChecked);
35-
binding.checkAdStorage.setChecked(defaultChecked);
36-
binding.checkAdUserData.setChecked(defaultChecked);
37-
binding.checkAdPersonalization.setChecked(defaultChecked);
37+
boolean analytics = prefs.getBoolean(getString(R.string.key_consent_analytics), defaultChecked);
38+
boolean adStorage = prefs.getBoolean(getString(R.string.key_consent_ad_storage), defaultChecked);
39+
boolean adUserData = prefs.getBoolean(getString(R.string.key_consent_ad_user_data), defaultChecked);
40+
boolean adPersonalization = prefs.getBoolean(getString(R.string.key_consent_ad_personalization), defaultChecked);
41+
42+
binding.checkAnalyticsStorage.setChecked(analytics);
43+
binding.checkAdStorage.setChecked(adStorage);
44+
binding.checkAdUserData.setChecked(adUserData);
45+
binding.checkAdPersonalization.setChecked(adPersonalization);
3846

3947
setCancelable(false);
4048

@@ -43,13 +51,20 @@ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
4351
.setView(binding.getRoot())
4452
.setCancelable(false)
4553
.setPositiveButton(android.R.string.ok, (dialog, which) -> {
54+
boolean a = binding.checkAnalyticsStorage.isChecked();
55+
boolean b = binding.checkAdStorage.isChecked();
56+
boolean c = binding.checkAdUserData.isChecked();
57+
boolean d = binding.checkAdPersonalization.isChecked();
58+
59+
prefs.edit()
60+
.putBoolean(getString(R.string.key_consent_analytics), a)
61+
.putBoolean(getString(R.string.key_consent_ad_storage), b)
62+
.putBoolean(getString(R.string.key_consent_ad_user_data), c)
63+
.putBoolean(getString(R.string.key_consent_ad_personalization), d)
64+
.apply();
65+
4666
if (listener != null) {
47-
listener.onConsentSet(
48-
binding.checkAnalyticsStorage.isChecked(),
49-
binding.checkAdStorage.isChecked(),
50-
binding.checkAdUserData.isChecked(),
51-
binding.checkAdPersonalization.isChecked()
52-
);
67+
listener.onConsentSet(a, b, c, d);
5368
}
5469
})
5570
.create();

app/src/main/res/values/keys.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,8 @@
1414
<string name="key_device_info" translatable="false">device_info</string>
1515
<string name="key_open_source_licenses" translatable="false">open_source_licenses</string>
1616
<string name="key_feedback" translatable="false">feedback</string>
17+
<string name="key_consent_analytics" translatable="false">consent_analytics_storage</string>
18+
<string name="key_consent_ad_storage" translatable="false">consent_ad_storage</string>
19+
<string name="key_consent_ad_user_data" translatable="false">consent_ad_user_data</string>
20+
<string name="key_consent_ad_personalization" translatable="false">consent_ad_personalization</string>
1721
</resources>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@
396396
<string name="ad_storage">Ad storage</string>
397397
<string name="ad_user_data">Ad user data</string>
398398
<string name="ad_personalization">Ad personalization</string>
399+
<string name="consent_settings">Consent settings</string>
399400
<string name="tip_of_the_day">Tip of the Day</string>
400401
<string-array name="daily_tips">
401402
<item>Use ConstraintLayout to create responsive UIs.</item>

app/src/main/res/xml/preferences_settings.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,25 @@
106106
android:action="android.intent.action.VIEW"
107107
android:data="https://www.gnu.org/licenses/gpl-3.0" />
108108
</androidx.preference.Preference>
109+
<androidx.preference.PreferenceCategory
110+
app:title="@string/consent_settings">
111+
<androidx.preference.SwitchPreferenceCompat
112+
app:defaultValue="true"
113+
app:key="@string/key_consent_analytics"
114+
app:title="@string/analytics_storage" />
115+
<androidx.preference.SwitchPreferenceCompat
116+
app:defaultValue="true"
117+
app:key="@string/key_consent_ad_storage"
118+
app:title="@string/ad_storage" />
119+
<androidx.preference.SwitchPreferenceCompat
120+
app:defaultValue="true"
121+
app:key="@string/key_consent_ad_user_data"
122+
app:title="@string/ad_user_data" />
123+
<androidx.preference.SwitchPreferenceCompat
124+
app:defaultValue="true"
125+
app:key="@string/key_consent_ad_personalization"
126+
app:title="@string/ad_personalization" />
127+
</androidx.preference.PreferenceCategory>
109128
</androidx.preference.PreferenceCategory>
110129
<androidx.preference.PreferenceCategory
111130
app:icon="@drawable/ic_about"

0 commit comments

Comments
 (0)