diff --git a/CodePush.h b/CodePush.h index 99e6e61..7704421 100644 --- a/CodePush.h +++ b/CodePush.h @@ -88,17 +88,11 @@ failCallback:(void (^)(NSError *err))failCallback; @end -@interface CodePushStatusReport : NSObject +@interface CodePushTelemetryManager : NSObject -+ (NSString *)getDeploymentKeyFromStatusReportIdentifier:(NSString *)statusReportIdentifier; -+ (NSDictionary *)getFailedUpdateStatusReport:(NSDictionary *)lastFailedPackage; -+ (NSDictionary *)getNewPackageStatusReport:(NSDictionary *)currentPackage; -+ (NSDictionary *)getNewAppVersionStatusReport:(NSString *)appVersion; -+ (NSString *)getPackageStatusReportIdentifier:(NSDictionary *)package; -+ (NSString *)getPreviousStatusReportIdentifier; -+ (NSString *)getVersionLabelFromStatusReportIdentifier:(NSString *)statusReportIdentifier; -+ (BOOL)isStatusReportIdentifierCodePushLabel:(NSString *)statusReportIdentifier; -+ (void)recordDeploymentStatusReported:(NSString *)appVersionOrPackageIdentifier; ++ (NSDictionary *)getBinaryUpdateReport:(NSString *)appVersion; ++ (NSDictionary *)getUpdateReport:(NSDictionary *)currentPackage; ++ (NSDictionary *)getRollbackReport:(NSDictionary *)lastFailedPackage; @end diff --git a/CodePush.m b/CodePush.m index 35b424f..933621d 100644 --- a/CodePush.m +++ b/CodePush.m @@ -504,29 +504,27 @@ RCT_EXPORT_METHOD(getNewStatusReport:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { if (needToReportRollback) { - // Check if there was a rollback that was not yet reported needToReportRollback = NO; NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults]; NSMutableArray *failedUpdates = [preferences objectForKey:FailedUpdatesKey]; if (failedUpdates) { NSDictionary *lastFailedPackage = [failedUpdates lastObject]; if (lastFailedPackage) { - resolve([CodePushStatusReport getFailedUpdateStatusReport:lastFailedPackage]); + resolve([CodePushTelemetryManager getRollbackReport:lastFailedPackage]); return; } } } else if (_isFirstRunAfterUpdate) { - // Check if the current CodePush package has been reported NSError *error; NSDictionary *currentPackage = [CodePushPackage getCurrentPackage:&error]; if (!error && currentPackage) { - resolve([CodePushStatusReport getNewPackageStatusReport:currentPackage]); + resolve([CodePushTelemetryManager getUpdateReport:currentPackage]); return; } } else if (isRunningBinaryVersion || [_bridge.bundleURL.scheme hasPrefix:@"http"]) { // Check if the current appVersion has been reported. NSString *appVersion = [[CodePushConfig current] appVersion]; - resolve([CodePushStatusReport getNewAppVersionStatusReport:appVersion]); + resolve([CodePushTelemetryManager getBinaryUpdateReport:appVersion]); return; } diff --git a/CodePush.xcodeproj/project.pbxproj b/CodePush.xcodeproj/project.pbxproj index 72846f0..d3c086c 100644 --- a/CodePush.xcodeproj/project.pbxproj +++ b/CodePush.xcodeproj/project.pbxproj @@ -9,7 +9,7 @@ /* Begin PBXBuildFile section */ 13BE3DEE1AC21097009241FE /* CodePush.m in Sources */ = {isa = PBXBuildFile; fileRef = 13BE3DED1AC21097009241FE /* CodePush.m */; }; 1B23B9141BF9267B000BB2F0 /* RCTConvert+CodePushInstallMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B23B9131BF9267B000BB2F0 /* RCTConvert+CodePushInstallMode.m */; }; - 5421FE311C58AD5A00986A55 /* CodePushStatusReport.m in Sources */ = {isa = PBXBuildFile; fileRef = 5421FE301C58AD5A00986A55 /* CodePushStatusReport.m */; }; + 5421FE311C58AD5A00986A55 /* CodePushTelemetryManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5421FE301C58AD5A00986A55 /* CodePushTelemetryManager.m */; }; 54A0026C1C0E2880004C3CEC /* aescrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = 54A0024C1C0E2880004C3CEC /* aescrypt.c */; }; 54A0026D1C0E2880004C3CEC /* aeskey.c in Sources */ = {isa = PBXBuildFile; fileRef = 54A0024D1C0E2880004C3CEC /* aeskey.c */; }; 54A0026E1C0E2880004C3CEC /* aestab.c in Sources */ = {isa = PBXBuildFile; fileRef = 54A0024F1C0E2880004C3CEC /* aestab.c */; }; @@ -46,7 +46,7 @@ 13BE3DEC1AC21097009241FE /* CodePush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CodePush.h; sourceTree = ""; }; 13BE3DED1AC21097009241FE /* CodePush.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CodePush.m; sourceTree = ""; }; 1B23B9131BF9267B000BB2F0 /* RCTConvert+CodePushInstallMode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTConvert+CodePushInstallMode.m"; sourceTree = ""; }; - 5421FE301C58AD5A00986A55 /* CodePushStatusReport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CodePushStatusReport.m; sourceTree = ""; }; + 5421FE301C58AD5A00986A55 /* CodePushTelemetryManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CodePushTelemetryManager.m; sourceTree = ""; }; 54A0024A1C0E2880004C3CEC /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; 54A0024B1C0E2880004C3CEC /* aes_via_ace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes_via_ace.h; sourceTree = ""; }; 54A0024C1C0E2880004C3CEC /* aescrypt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aescrypt.c; sourceTree = ""; }; @@ -167,7 +167,7 @@ 1B23B9131BF9267B000BB2F0 /* RCTConvert+CodePushInstallMode.m */, 54FFEDDF1BF550630061DD23 /* CodePushDownloadHandler.m */, 810D4E6C1B96935000B397E9 /* CodePushPackage.m */, - 5421FE301C58AD5A00986A55 /* CodePushStatusReport.m */, + 5421FE301C58AD5A00986A55 /* CodePushTelemetryManager.m */, 81D51F391B6181C2000DA084 /* CodePushConfig.m */, 13BE3DEC1AC21097009241FE /* CodePush.h */, 13BE3DED1AC21097009241FE /* CodePush.m */, @@ -242,7 +242,7 @@ 54FFEDE01BF550630061DD23 /* CodePushDownloadHandler.m in Sources */, 54A002711C0E2880004C3CEC /* hmac.c in Sources */, 54A002721C0E2880004C3CEC /* prng.c in Sources */, - 5421FE311C58AD5A00986A55 /* CodePushStatusReport.m in Sources */, + 5421FE311C58AD5A00986A55 /* CodePushTelemetryManager.m in Sources */, 54A002731C0E2880004C3CEC /* pwd2key.c in Sources */, 54A002751C0E2880004C3CEC /* ioapi.c in Sources */, 54A002771C0E2880004C3CEC /* unzip.c in Sources */, diff --git a/CodePushStatusReport.m b/CodePushTelemetryManager.m similarity index 94% rename from CodePushStatusReport.m rename to CodePushTelemetryManager.m index f4f4096..6c5194e 100644 --- a/CodePushStatusReport.m +++ b/CodePushTelemetryManager.m @@ -6,14 +6,37 @@ static NSString *const DeploymentSucceeded = @"DeploymentSucceeded"; static NSString *const LabelKey = @"label"; static NSString *const LastDeploymentReportKey = @"CODE_PUSH_LAST_DEPLOYMENT_REPORT"; -@implementation CodePushStatusReport +@implementation CodePushTelemetryManager -+ (NSString *)getDeploymentKeyFromStatusReportIdentifier:(NSString *)statusReportIdentifier ++ (NSDictionary *)getBinaryUpdateReport:(NSString *)appVersion { - return [[statusReportIdentifier componentsSeparatedByString:@":"] firstObject]; + NSString *previousStatusReportIdentifier = [self getPreviousStatusReportIdentifier]; + if (previousStatusReportIdentifier == nil) { + [self recordDeploymentStatusReported:appVersion]; + return @{ @"appVersion": appVersion }; + } else if (![previousStatusReportIdentifier isEqualToString:appVersion]) { + [self recordDeploymentStatusReported:appVersion]; + if ([self isStatusReportIdentifierCodePushLabel:previousStatusReportIdentifier]) { + NSString *previousDeploymentKey = [self getDeploymentKeyFromStatusReportIdentifier:previousStatusReportIdentifier]; + NSString *previousLabel = [self getVersionLabelFromStatusReportIdentifier:previousStatusReportIdentifier]; + return @{ + @"appVersion": appVersion, + @"previousDeploymentKey": previousDeploymentKey, + @"previousLabelOrAppVersion": previousLabel + }; + } else { + // Previous status report was with a binary app version. + return @{ + @"appVersion": appVersion, + @"previousLabelOrAppVersion": previousStatusReportIdentifier + }; + } + } + + return nil; } -+ (NSDictionary *)getFailedUpdateStatusReport:(NSDictionary *)lastFailedPackage ++ (NSDictionary *)getRollbackReport:(NSDictionary *)lastFailedPackage { return @{ @"package": lastFailedPackage, @@ -21,7 +44,7 @@ static NSString *const LastDeploymentReportKey = @"CODE_PUSH_LAST_DEPLOYMENT_REP }; } -+ (NSDictionary *)getNewPackageStatusReport:(NSDictionary *)currentPackage ++ (NSDictionary *)getUpdateReport:(NSDictionary *)currentPackage { NSString *currentPackageIdentifier = [self getPackageStatusReportIdentifier:currentPackage]; NSString *previousStatusReportIdentifier = [self getPreviousStatusReportIdentifier]; @@ -57,32 +80,9 @@ static NSString *const LastDeploymentReportKey = @"CODE_PUSH_LAST_DEPLOYMENT_REP return nil; } -+ (NSDictionary *)getNewAppVersionStatusReport:(NSString *)appVersion ++ (NSString *)getDeploymentKeyFromStatusReportIdentifier:(NSString *)statusReportIdentifier { - NSString *previousStatusReportIdentifier = [self getPreviousStatusReportIdentifier]; - if (previousStatusReportIdentifier == nil) { - [self recordDeploymentStatusReported:appVersion]; - return @{ @"appVersion": appVersion }; - } else if (![previousStatusReportIdentifier isEqualToString:appVersion]) { - [self recordDeploymentStatusReported:appVersion]; - if ([self isStatusReportIdentifierCodePushLabel:previousStatusReportIdentifier]) { - NSString *previousDeploymentKey = [self getDeploymentKeyFromStatusReportIdentifier:previousStatusReportIdentifier]; - NSString *previousLabel = [self getVersionLabelFromStatusReportIdentifier:previousStatusReportIdentifier]; - return @{ - @"appVersion": appVersion, - @"previousDeploymentKey": previousDeploymentKey, - @"previousLabelOrAppVersion": previousLabel - }; - } else { - // Previous status report was with a binary app version. - return @{ - @"appVersion": appVersion, - @"previousLabelOrAppVersion": previousStatusReportIdentifier - }; - } - } - - return nil; + return [[statusReportIdentifier componentsSeparatedByString:@":"] firstObject]; } + (NSString *)getPackageStatusReportIdentifier:(NSDictionary *)package diff --git a/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java b/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java index 426b3c5..59758df 100644 --- a/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +++ b/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java @@ -65,7 +65,7 @@ public class CodePush { // Helper classes. private CodePushPackage codePushPackage; private CodePushReactPackage codePushReactPackage; - private CodePushStatusReport codePushStatusReport; + private CodePushTelemetryManager codePushTelemetryManager; private CodePushNativeModule codePushNativeModule; // Config properties. @@ -86,7 +86,7 @@ public class CodePush { SoLoader.init(mainActivity, false); this.applicationContext = mainActivity.getApplicationContext(); this.codePushPackage = new CodePushPackage(mainActivity.getFilesDir().getAbsolutePath()); - this.codePushStatusReport = new CodePushStatusReport(this.applicationContext, CODE_PUSH_PREFERENCES); + this.codePushTelemetryManager = new CodePushTelemetryManager(this.applicationContext, CODE_PUSH_PREFERENCES); this.deploymentKey = deploymentKey; this.isDebugMode = isDebugMode; this.mainActivity = mainActivity; @@ -433,7 +433,7 @@ public class CodePush { try { JSONObject lastFailedPackageJSON = failedUpdates.getJSONObject(failedUpdates.length() - 1); WritableMap lastFailedPackage = CodePushUtils.convertJsonObjectToWriteable(lastFailedPackageJSON); - WritableMap failedStatusReport = codePushStatusReport.getFailedUpdateStatusReport(lastFailedPackage); + WritableMap failedStatusReport = codePushTelemetryManager.getRollbackReport(lastFailedPackage); if (failedStatusReport != null) { promise.resolve(failedStatusReport); return; @@ -445,14 +445,14 @@ public class CodePush { } else if (didUpdate) { WritableMap currentPackage = codePushPackage.getCurrentPackage(); if (currentPackage != null) { - WritableMap newPackageStatusReport = codePushStatusReport.getNewPackageStatusReport(currentPackage); + WritableMap newPackageStatusReport = codePushTelemetryManager.getUpdateReport(currentPackage); if (newPackageStatusReport != null) { promise.resolve(newPackageStatusReport); return; } } } else if (isRunningBinaryVersion) { - WritableMap newAppVersionStatusReport = codePushStatusReport.getNewAppVersionStatusReport(appVersion); + WritableMap newAppVersionStatusReport = codePushTelemetryManager.getBinaryUpdateReport(appVersion); if (newAppVersionStatusReport != null) { promise.resolve(newAppVersionStatusReport); return; diff --git a/android/app/src/main/java/com/microsoft/codepush/react/CodePushStatusReport.java b/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java similarity index 87% rename from android/app/src/main/java/com/microsoft/codepush/react/CodePushStatusReport.java rename to android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java index d3ffc76..86ae472 100644 --- a/android/app/src/main/java/com/microsoft/codepush/react/CodePushStatusReport.java +++ b/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java @@ -6,7 +6,7 @@ import android.content.SharedPreferences; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.WritableNativeMap; -public class CodePushStatusReport { +public class CodePushTelemetryManager { private Context applicationContext; private final String CODE_PUSH_PREFERENCES; @@ -16,28 +16,46 @@ public class CodePushStatusReport { private final String LABEL_KEY = "label"; private final String LAST_DEPLOYMENT_REPORT_KEY = "CODE_PUSH_LAST_DEPLOYMENT_REPORT"; - public CodePushStatusReport(Context applicationContext, String codePushPreferencesKey) { + public CodePushTelemetryManager(Context applicationContext, String codePushPreferencesKey) { this.applicationContext = applicationContext; this.CODE_PUSH_PREFERENCES = codePushPreferencesKey; } - public String getDeploymentKeyFromStatusReportIdentifier(String statusReportIdentifier) { - String[] parsedIdentifier = statusReportIdentifier.split(":"); - if (parsedIdentifier.length > 0) { - return parsedIdentifier[0]; - } else { - return null; + public WritableMap getBinaryUpdateReport(String appVersion) { + String previousStatusReportIdentifier = this.getPreviousStatusReportIdentifier(); + if (previousStatusReportIdentifier == null) { + this.recordDeploymentStatusReported(appVersion); + WritableNativeMap reportMap = new WritableNativeMap(); + reportMap.putString("appVersion", appVersion); + return reportMap; + } else if (!previousStatusReportIdentifier.equals(appVersion)) { + this.recordDeploymentStatusReported(appVersion); + WritableNativeMap reportMap = new WritableNativeMap(); + if (this.isStatusReportIdentifierCodePushLabel(previousStatusReportIdentifier)) { + String previousDeploymentKey = this.getDeploymentKeyFromStatusReportIdentifier(previousStatusReportIdentifier); + String previousLabel = this.getVersionLabelFromStatusReportIdentifier(previousStatusReportIdentifier); + reportMap.putString("appVersion", appVersion); + reportMap.putString("previousDeploymentKey", previousDeploymentKey); + reportMap.putString("previousLabelOrAppVersion", previousLabel); + } else { + // Previous status report was with a binary app version. + reportMap.putString("appVersion", appVersion); + reportMap.putString("previousLabelOrAppVersion", previousStatusReportIdentifier); + } + return reportMap; } + + return null; } - public WritableMap getFailedUpdateStatusReport(WritableMap lastFailedPackage) { + public WritableMap getRollbackReport(WritableMap lastFailedPackage) { WritableNativeMap reportMap = new WritableNativeMap(); reportMap.putMap("package", lastFailedPackage); reportMap.putString("status", DEPLOYMENT_FAILED_STATUS); return reportMap; } - public WritableMap getNewPackageStatusReport(WritableMap currentPackage) { + public WritableMap getUpdateReport(WritableMap currentPackage) { String currentPackageIdentifier = this.getPackageStatusReportIdentifier(currentPackage); String previousStatusReportIdentifier = this.getPreviousStatusReportIdentifier(); if (currentPackageIdentifier != null) { @@ -72,34 +90,16 @@ public class CodePushStatusReport { return null; } - public WritableMap getNewAppVersionStatusReport(String appVersion) { - String previousStatusReportIdentifier = this.getPreviousStatusReportIdentifier(); - if (previousStatusReportIdentifier == null) { - this.recordDeploymentStatusReported(appVersion); - WritableNativeMap reportMap = new WritableNativeMap(); - reportMap.putString("appVersion", appVersion); - return reportMap; - } else if (!previousStatusReportIdentifier.equals(appVersion)) { - this.recordDeploymentStatusReported(appVersion); - WritableNativeMap reportMap = new WritableNativeMap(); - if (this.isStatusReportIdentifierCodePushLabel(previousStatusReportIdentifier)) { - String previousDeploymentKey = this.getDeploymentKeyFromStatusReportIdentifier(previousStatusReportIdentifier); - String previousLabel = this.getVersionLabelFromStatusReportIdentifier(previousStatusReportIdentifier); - reportMap.putString("appVersion", appVersion); - reportMap.putString("previousDeploymentKey", previousDeploymentKey); - reportMap.putString("previousLabelOrAppVersion", previousLabel); - } else { - // Previous status report was with a binary app version. - reportMap.putString("appVersion", appVersion); - reportMap.putString("previousLabelOrAppVersion", previousStatusReportIdentifier); - } - return reportMap; + private String getDeploymentKeyFromStatusReportIdentifier(String statusReportIdentifier) { + String[] parsedIdentifier = statusReportIdentifier.split(":"); + if (parsedIdentifier.length > 0) { + return parsedIdentifier[0]; + } else { + return null; } - - return null; } - public String getPackageStatusReportIdentifier(WritableMap updatePackage) { + private String getPackageStatusReportIdentifier(WritableMap updatePackage) { // Because deploymentKeys can be dynamically switched, we use a // combination of the deploymentKey and label as the packageIdentifier. String deploymentKey = CodePushUtils.tryGetString(updatePackage, DEPLOYMENT_KEY_KEY); @@ -111,12 +111,12 @@ public class CodePushStatusReport { } } - public String getPreviousStatusReportIdentifier() { + private String getPreviousStatusReportIdentifier() { SharedPreferences settings = applicationContext.getSharedPreferences(CODE_PUSH_PREFERENCES, 0); return settings.getString(LAST_DEPLOYMENT_REPORT_KEY, null); } - public String getVersionLabelFromStatusReportIdentifier(String statusReportIdentifier) { + private String getVersionLabelFromStatusReportIdentifier(String statusReportIdentifier) { String[] parsedIdentifier = statusReportIdentifier.split(":"); if (parsedIdentifier.length > 1) { return parsedIdentifier[1]; @@ -125,11 +125,11 @@ public class CodePushStatusReport { } } - public boolean isStatusReportIdentifierCodePushLabel(String statusReportIdentifier) { + private boolean isStatusReportIdentifierCodePushLabel(String statusReportIdentifier) { return statusReportIdentifier != null && statusReportIdentifier.contains(":"); } - public void recordDeploymentStatusReported(String appVersionOrPackageIdentifier) { + private void recordDeploymentStatusReported(String appVersionOrPackageIdentifier) { SharedPreferences settings = applicationContext.getSharedPreferences(CODE_PUSH_PREFERENCES, 0); settings.edit().putString(LAST_DEPLOYMENT_REPORT_KEY, appVersionOrPackageIdentifier).commit(); } diff --git a/request-fetch-adapter.js b/request-fetch-adapter.js index 4aef90e..cc22b53 100644 --- a/request-fetch-adapter.js +++ b/request-fetch-adapter.js @@ -32,7 +32,7 @@ module.exports = { }; function getSDKVersion() { - return require("./package.json").dependencies["code-push"]; + return require("./package.json").dependencies["code-push"]; } function getHttpMethodName(verb) {