diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f2ae0e28..916ae0d38a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## TBD + +* Allow overriding the versionCode via Configuration + [#610](https://github.com/bugsnag/bugsnag-android/pull/610) + ## 4.20.0 (2019-09-25) * Record StorageManager cache behaviour in internal error reports diff --git a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java index ac4cb25aea..88cacc949b 100644 --- a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataSummaryTest.java @@ -37,6 +37,7 @@ public void setUp() throws Exception { Context context = ApplicationProvider.getApplicationContext(); PackageManager packageManager = context.getPackageManager(); Configuration config = new Configuration("api-key"); + config.setVersionCode(1); AppData obj = new AppData(context, packageManager, config, sessionTracker); this.appData = obj.getAppDataSummary(); } diff --git a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java index 58d05e529a..7727c11afe 100644 --- a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/AppDataTest.java @@ -47,6 +47,7 @@ public void setUp() throws Exception { Context context = ApplicationProvider.getApplicationContext(); PackageManager packageManager = context.getPackageManager(); Configuration config = new Configuration("api-key"); + config.setVersionCode(1); AppData obj = new AppData(context, packageManager, config, sessionTracker); this.appData = obj.getAppData(); } diff --git a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java index eb685a62ab..39af595852 100644 --- a/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java +++ b/bugsnag-android-core/src/androidTest/java/com/bugsnag/android/ClientTest.java @@ -181,6 +181,7 @@ public void testEmptyManifestConfig() { ConfigFactory.populateConfigFromManifest(protoConfig, data); assertEquals(config.getApiKey(), protoConfig.getApiKey()); + assertEquals(config.getVersionCode(), protoConfig.getVersionCode()); assertEquals(config.getBuildUUID(), protoConfig.getBuildUUID()); assertEquals(config.getAppVersion(), protoConfig.getAppVersion()); assertEquals(config.getReleaseStage(), protoConfig.getReleaseStage()); @@ -198,6 +199,7 @@ public void testEmptyManifestConfig() { public void testFullManifestConfig() { String buildUuid = "123"; String appVersion = "v1.0"; + Integer versionCode = 27; String releaseStage = "debug"; String endpoint = "http://example.com"; String sessionEndpoint = "http://session-example.com"; @@ -205,6 +207,7 @@ public void testFullManifestConfig() { Bundle data = new Bundle(); data.putString("com.bugsnag.android.BUILD_UUID", buildUuid); data.putString("com.bugsnag.android.APP_VERSION", appVersion); + data.putInt("com.bugsnag.android.VERSION_CODE", versionCode); data.putString("com.bugsnag.android.RELEASE_STAGE", releaseStage); data.putString("com.bugsnag.android.SESSIONS_ENDPOINT", sessionEndpoint); data.putString("com.bugsnag.android.ENDPOINT", endpoint); @@ -219,6 +222,7 @@ public void testFullManifestConfig() { ConfigFactory.populateConfigFromManifest(protoConfig, data); assertEquals(buildUuid, protoConfig.getBuildUUID()); assertEquals(appVersion, protoConfig.getAppVersion()); + assertEquals(versionCode, protoConfig.getVersionCode()); assertEquals(releaseStage, protoConfig.getReleaseStage()); assertEquals(endpoint, protoConfig.getEndpoint()); assertEquals(sessionEndpoint, protoConfig.getSessionEndpoint()); diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java index 59bffba05c..a0a2a81064 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/AppData.java @@ -138,10 +138,16 @@ private String calculateNotifierType() { @Nullable @SuppressWarnings("deprecation") private Integer calculateVersionCode() { - if (packageInfo != null) { - return packageInfo.versionCode; + Integer versionCode = config.getVersionCode(); + + if (versionCode != null) { + return versionCode; } else { - return null; + if (packageInfo != null) { + return packageInfo.versionCode; + } else { + return null; + } } } diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java index 60b52ee3b8..535243187d 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/ConfigFactory.java @@ -11,6 +11,7 @@ class ConfigFactory { private static final String BUGSNAG_NAMESPACE = "com.bugsnag.android"; private static final String MF_APP_VERSION = BUGSNAG_NAMESPACE + ".APP_VERSION"; + private static final String MF_VERSION_CODE = BUGSNAG_NAMESPACE + ".VERSION_CODE"; private static final String MF_ENDPOINT = BUGSNAG_NAMESPACE + ".ENDPOINT"; private static final String MF_SESSIONS_ENDPOINT = BUGSNAG_NAMESPACE + ".SESSIONS_ENDPOINT"; private static final String MF_RELEASE_STAGE = BUGSNAG_NAMESPACE + ".RELEASE_STAGE"; @@ -92,6 +93,9 @@ static void populateConfigFromManifest(@NonNull Configuration config, config.setAppVersion(data.getString(MF_APP_VERSION)); config.setReleaseStage(data.getString(MF_RELEASE_STAGE)); + if (data.containsKey(MF_VERSION_CODE)) { + config.setVersionCode(data.getInt(MF_VERSION_CODE)); + } if (data.containsKey(MF_ENDPOINT)) { String endpoint = data.getString(MF_ENDPOINT); String sessionEndpoint = data.getString(MF_SESSIONS_ENDPOINT); diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java b/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java index 3bb740f422..2bbd5f07d1 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/Configuration.java @@ -32,6 +32,7 @@ public class Configuration extends Observable implements Observer { private final String apiKey; private String buildUuid; private String appVersion; + private Integer versionCode; private String context; private volatile String endpoint = "https://notify.bugsnag.com"; private volatile String sessionEndpoint = "https://sessions.bugsnag.com"; @@ -129,6 +130,26 @@ public void setAppVersion(@NonNull String appVersion) { NativeInterface.MessageType.UPDATE_APP_VERSION, appVersion)); } + /** + * Gets the version code sent to Bugsnag. + * + * @return Version Code + */ + @Nullable + public Integer getVersionCode() { + return versionCode; + } + + /** + * Set the version code sent to Bugsnag. By default we'll pull this + * from your AndroidManifest.xml + * + * @param versionCode the version code to send + */ + public void setVersionCode(@Nullable Integer versionCode) { + this.versionCode = versionCode; + } + /** * Gets the context to be sent to Bugsnag. * diff --git a/bugsnag-android-core/src/test/java/com/bugsnag/android/ConfigurationTest.java b/bugsnag-android-core/src/test/java/com/bugsnag/android/ConfigurationTest.java index 6b5a128957..a5ac481019 100644 --- a/bugsnag-android-core/src/test/java/com/bugsnag/android/ConfigurationTest.java +++ b/bugsnag-android-core/src/test/java/com/bugsnag/android/ConfigurationTest.java @@ -238,4 +238,12 @@ public void deliver(@NonNull Report report, public void testSetNullDelivery() { config.setDelivery(null); } + + @Test + public void testVersionCode() { + Configuration configuration = new Configuration("api-key"); + assertNull(configuration.getVersionCode()); // populated in client ctor if null + configuration.setVersionCode(577); + assertEquals(577, (int) configuration.getVersionCode()); + } }