@@ -29,15 +29,15 @@ public class DataCollectionArbiter {
2929 private static final String FIREBASE_CRASHLYTICS_COLLECTION_ENABLED =
3030 "firebase_crashlytics_collection_enabled" ;
3131
32+ private final SharedPreferences sharedPreferences ;
33+ private final FirebaseApp firebaseApp ;
34+
3235 // State for waitForDataCollectionEnabled().
33- private Object taskLock = new Object ();
36+ private final Object taskLock = new Object ();
3437 TaskCompletionSource <Void > dataCollectionEnabledTask = new TaskCompletionSource <>();
3538 boolean taskResolved = false ;
3639
37- private final SharedPreferences sharedPreferences ;
38- private volatile boolean crashlyticsDataCollectionExplicitlySet ;
39- private volatile boolean crashlyticsDataCollectionEnabled ;
40- private final FirebaseApp firebaseApp ;
40+ private Boolean crashlyticsDataCollectionEnabled ;
4141
4242 /**
4343 * A Task that will be resolved when explicit data collection permission is granted by calling
@@ -47,43 +47,17 @@ public class DataCollectionArbiter {
4747 new TaskCompletionSource <>();
4848
4949 public DataCollectionArbiter (FirebaseApp app ) {
50- this .firebaseApp = app ;
51- Context applicationContext = app .getApplicationContext ();
52- if (applicationContext == null ) {
53- throw new RuntimeException ("null context" );
54- }
50+ final Context applicationContext = app .getApplicationContext ();
5551
52+ firebaseApp = app ;
5653 sharedPreferences = CommonUtils .getSharedPrefs (applicationContext );
5754
58- boolean enabled = true ;
59- boolean explicitlySet = false ;
60-
61- if (sharedPreferences .contains (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED )) {
62- enabled = sharedPreferences .getBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED , true );
63- explicitlySet = true ;
64- } else {
65- try {
66- final PackageManager packageManager = applicationContext .getPackageManager ();
67- if (packageManager != null ) {
68- final ApplicationInfo applicationInfo =
69- packageManager .getApplicationInfo (
70- applicationContext .getPackageName (), PackageManager .GET_META_DATA );
71- if (applicationInfo != null
72- && applicationInfo .metaData != null
73- && applicationInfo .metaData .containsKey (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED )) {
74- enabled = applicationInfo .metaData .getBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED );
75- explicitlySet = true ;
76- }
77- }
78- } catch (PackageManager .NameNotFoundException e ) {
79- // This shouldn't happen since it's this app's package, but fall through to default
80- // if so.
81- Logger .getLogger ().d ("Unable to get PackageManager. Falling through" , e );
82- }
55+ Boolean dataCollectionEnabled = getDataCollectionValueFromSharedPreferences (sharedPreferences );
56+ if (dataCollectionEnabled == null ) {
57+ dataCollectionEnabled = getDataCollectionValueFromManifest (applicationContext );
8358 }
8459
85- crashlyticsDataCollectionEnabled = enabled ;
86- crashlyticsDataCollectionExplicitlySet = explicitlySet ;
60+ crashlyticsDataCollectionEnabled = dataCollectionEnabled ;
8761
8862 synchronized (taskLock ) {
8963 if (isAutomaticDataCollectionEnabled ()) {
@@ -93,27 +67,21 @@ public DataCollectionArbiter(FirebaseApp app) {
9367 }
9468 }
9569
96- public boolean isAutomaticDataCollectionEnabled () {
97- if (crashlyticsDataCollectionExplicitlySet ) {
98- return crashlyticsDataCollectionEnabled ;
99- }
100- return firebaseApp .isDataCollectionDefaultEnabled ();
101- }
102-
103- public Task <Void > waitForAutomaticDataCollectionEnabled () {
104- synchronized (taskLock ) {
105- return dataCollectionEnabledTask .getTask ();
106- }
70+ public synchronized boolean isAutomaticDataCollectionEnabled () {
71+ return crashlyticsDataCollectionEnabled != null
72+ ? crashlyticsDataCollectionEnabled
73+ : firebaseApp .isDataCollectionDefaultEnabled ();
10774 }
10875
109- @ SuppressLint ({"CommitPrefEdits" , "ApplySharedPref" })
110- public void setCrashlyticsDataCollectionEnabled (boolean enabled ) {
111- crashlyticsDataCollectionEnabled = enabled ;
112- crashlyticsDataCollectionExplicitlySet = true ;
113- sharedPreferences .edit ().putBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED , enabled ).commit ();
76+ public synchronized void setCrashlyticsDataCollectionEnabled (Boolean enabled ) {
77+ crashlyticsDataCollectionEnabled =
78+ (enabled != null )
79+ ? enabled
80+ : getDataCollectionValueFromManifest (firebaseApp .getApplicationContext ());
81+ storeDataCollectionValueInSharedPreferences (sharedPreferences , enabled );
11482
11583 synchronized (taskLock ) {
116- if (enabled ) {
84+ if (isAutomaticDataCollectionEnabled () ) {
11785 if (!taskResolved ) {
11886 dataCollectionEnabledTask .trySetResult (null );
11987 taskResolved = true ;
@@ -127,6 +95,12 @@ public void setCrashlyticsDataCollectionEnabled(boolean enabled) {
12795 }
12896 }
12997
98+ public Task <Void > waitForAutomaticDataCollectionEnabled () {
99+ synchronized (taskLock ) {
100+ return dataCollectionEnabledTask .getTask ();
101+ }
102+ }
103+
130104 /**
131105 * Returns a task which will be resolved when either: 1) automatic data collection has been
132106 * enabled, or 2) grantDataCollectionPermission has been called.
@@ -150,4 +124,55 @@ public void grantDataCollectionPermission(boolean dataCollectionToken) {
150124 }
151125 dataCollectionExplicitlyApproved .trySetResult (null );
152126 }
127+
128+ @ SuppressLint ({"ApplySharedPref" })
129+ private static void storeDataCollectionValueInSharedPreferences (
130+ SharedPreferences sharedPreferences , Boolean enabled ) {
131+ final SharedPreferences .Editor prefsEditor = sharedPreferences .edit ();
132+ if (enabled != null ) {
133+ prefsEditor .putBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED , enabled );
134+ } else {
135+ prefsEditor .remove (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED );
136+ }
137+ prefsEditor .commit ();
138+ }
139+
140+ private static Boolean getDataCollectionValueFromSharedPreferences (
141+ SharedPreferences sharedPreferences ) {
142+ if (sharedPreferences .contains (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED )) {
143+ return sharedPreferences .getBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED , true );
144+ }
145+ return null ;
146+ }
147+
148+ private static Boolean getDataCollectionValueFromManifest (Context applicationContext ) {
149+ final Boolean manifestSetting =
150+ readCrashlyticsDataCollectionEnabledFromManifest (applicationContext );
151+ if (manifestSetting == null ) {
152+ return null ;
153+ }
154+ return Boolean .TRUE .equals (manifestSetting );
155+ }
156+
157+ private static Boolean readCrashlyticsDataCollectionEnabledFromManifest (
158+ Context applicationContext ) {
159+ try {
160+ final PackageManager packageManager = applicationContext .getPackageManager ();
161+ if (packageManager != null ) {
162+ final ApplicationInfo applicationInfo =
163+ packageManager .getApplicationInfo (
164+ applicationContext .getPackageName (), PackageManager .GET_META_DATA );
165+ if (applicationInfo != null
166+ && applicationInfo .metaData != null
167+ && applicationInfo .metaData .containsKey (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED )) {
168+ return applicationInfo .metaData .getBoolean (FIREBASE_CRASHLYTICS_COLLECTION_ENABLED );
169+ }
170+ }
171+ } catch (PackageManager .NameNotFoundException e ) {
172+ // This shouldn't happen since it's this app's package, but fall through to default
173+ // if so.
174+ Logger .getLogger ().d ("Unable to get PackageManager. Falling through" , e );
175+ }
176+ return null ;
177+ }
153178}
0 commit comments