Skip to content

Commit fa8d320

Browse files
authored
fix(crashlytics): read firebase_crashlytics_collection_enabled from AndroidManifest.xml (#13217)
* fix(crashlytics): read firebase_crashlytics_collection_enabled from AndroidManifest.xml * tests: run is isCrashlyticsCollectionEnabled e2e for android platform only * chore(crashlytics): refactor isCrashlyticsCollectionEnabled function
1 parent cc542d7 commit fa8d320

File tree

6 files changed

+57
-11
lines changed

6 files changed

+57
-11
lines changed

packages/firebase_crashlytics/firebase_crashlytics/android/src/main/java/io/flutter/plugins/firebase/crashlytics/FlutterFirebaseCrashlyticsPlugin.java

+36-8
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import android.content.Context;
88
import android.content.SharedPreferences;
9+
import android.content.pm.ApplicationInfo;
10+
import android.content.pm.PackageManager;
911
import android.os.Handler;
1012
import android.os.Looper;
1113
import android.util.Log;
@@ -16,6 +18,7 @@
1618
import com.google.firebase.FirebaseApp;
1719
import com.google.firebase.crashlytics.FirebaseCrashlytics;
1820
import com.google.firebase.crashlytics.FlutterFirebaseCrashlyticsInternal;
21+
import com.google.firebase.crashlytics.internal.Logger;
1922
import io.flutter.embedding.engine.plugins.FlutterPlugin;
2023
import io.flutter.plugin.common.BinaryMessenger;
2124
import io.flutter.plugin.common.MethodCall;
@@ -35,6 +38,9 @@ public class FlutterFirebaseCrashlyticsPlugin
3538
public static final String TAG = "FLTFirebaseCrashlytics";
3639
private MethodChannel channel;
3740

41+
private static final String FIREBASE_CRASHLYTICS_COLLECTION_ENABLED =
42+
"firebase_crashlytics_collection_enabled";
43+
3844
private void initInstance(BinaryMessenger messenger) {
3945
String channelName = "plugins.flutter.io/firebase_crashlytics";
4046
channel = new MethodChannel(messenger, channelName);
@@ -380,20 +386,42 @@ private boolean isCrashlyticsCollectionEnabled(FirebaseApp app) {
380386
SharedPreferences crashlyticsSharedPrefs =
381387
getCrashlyticsSharedPrefs(app.getApplicationContext());
382388

383-
if (crashlyticsSharedPrefs.contains("firebase_crashlytics_collection_enabled")) {
384-
enabled = crashlyticsSharedPrefs.getBoolean("firebase_crashlytics_collection_enabled", true);
389+
if (crashlyticsSharedPrefs.contains(FIREBASE_CRASHLYTICS_COLLECTION_ENABLED)) {
390+
enabled = crashlyticsSharedPrefs.getBoolean(FIREBASE_CRASHLYTICS_COLLECTION_ENABLED, true);
385391
} else {
386-
if (app.isDataCollectionDefaultEnabled()) {
387-
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true);
388-
enabled = true;
389-
} else {
390-
enabled = false;
391-
}
392+
393+
Boolean manifestEnabled =
394+
readCrashlyticsDataCollectionEnabledFromManifest(app.getApplicationContext());
395+
396+
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(manifestEnabled);
397+
enabled = manifestEnabled;
392398
}
393399

394400
return enabled;
395401
}
396402

403+
private static Boolean readCrashlyticsDataCollectionEnabledFromManifest(
404+
Context applicationContext) {
405+
try {
406+
final PackageManager packageManager = applicationContext.getPackageManager();
407+
if (packageManager != null) {
408+
final ApplicationInfo applicationInfo =
409+
packageManager.getApplicationInfo(
410+
applicationContext.getPackageName(), PackageManager.GET_META_DATA);
411+
if (applicationInfo != null
412+
&& applicationInfo.metaData != null
413+
&& applicationInfo.metaData.containsKey(FIREBASE_CRASHLYTICS_COLLECTION_ENABLED)) {
414+
return applicationInfo.metaData.getBoolean(FIREBASE_CRASHLYTICS_COLLECTION_ENABLED);
415+
}
416+
}
417+
} catch (PackageManager.NameNotFoundException e) {
418+
// This shouldn't happen since it's this app's package, but fall through to default
419+
// if so.
420+
Logger.getLogger().e("Could not read data collection permission from manifest", e);
421+
}
422+
return true;
423+
}
424+
397425
@Override
398426
public Task<Map<String, Object>> getPluginConstantsForFirebaseApp(FirebaseApp firebaseApp) {
399427
TaskCompletionSource<Map<String, Object>> taskCompletionSource = new TaskCompletionSource<>();

packages/firebase_crashlytics/firebase_crashlytics/example/ios/Flutter/AppFrameworkInfo.plist

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@
2121
<key>CFBundleVersion</key>
2222
<string>1.0</string>
2323
<key>MinimumOSVersion</key>
24-
<string>11.0</string>
24+
<string>12.0</string>
2525
</dict>
2626
</plist>

packages/firebase_crashlytics/firebase_crashlytics/example/ios/Runner.xcodeproj/project.pbxproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@
171171
97C146E61CF9000F007C117D /* Project object */ = {
172172
isa = PBXProject;
173173
attributes = {
174-
LastUpgradeCheck = 1430;
174+
LastUpgradeCheck = 1510;
175175
ORGANIZATIONNAME = "The Chromium Authors";
176176
TargetAttributes = {
177177
97C146ED1CF9000F007C117D = {

packages/firebase_crashlytics/firebase_crashlytics/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1430"
3+
LastUpgradeVersion = "1510"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

tests/android/app/src/main/AndroidManifest.xml

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
android:name="${applicationName}"
55
android:icon="@mipmap/ic_launcher"
66
android:usesCleartextTraffic="true">
7+
<meta-data
8+
android:name="firebase_crashlytics_collection_enabled"
9+
android:value="false" />
710
<activity
811
android:name=".MainActivity"
912
android:exported="true"

tests/integration_test/firebase_crashlytics/firebase_crashlytics_e2e_test.dart

+15
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@ void main() {
2121
);
2222
});
2323

24+
group(
25+
'isCrashlyticsCollectionEnabled',
26+
() {
27+
test(
28+
'checks isCrashlyticsCollectionEnabled value set from AndroidManifest.xml',
29+
() async {
30+
bool isCrashlyticsCollectionEnabled =
31+
FirebaseCrashlytics.instance.isCrashlyticsCollectionEnabled;
32+
33+
expect(isCrashlyticsCollectionEnabled, false);
34+
});
35+
},
36+
skip: kIsWeb || defaultTargetPlatform != TargetPlatform.android,
37+
);
38+
2439
group('checkForUnsentReports', () {
2540
test('should throw if automatic crash report is enabled', () async {
2641
await FirebaseCrashlytics.instance

0 commit comments

Comments
 (0)