@appzung/react-native-code-push 9.0.2 → 10.0.0-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CodePush.js +22 -19
- package/LICENSE.md +1 -1
- package/README.md +159 -298
- package/android/app/.gradle/config.properties +2 -0
- package/android/app/build.gradle +1 -1
- package/android/app/local.properties +8 -0
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePush.java +27 -21
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushBuilder.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushConstants.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushDialog.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInstallMode.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidPublicKeyException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushInvalidUpdateException.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushMalformedDataException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +5 -5
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushNotInitializedException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushTelemetryManager.java +14 -14
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUnknownException.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateState.java +2 -2
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUpdateUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/CodePushUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgress.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/DownloadProgressCallback.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/FileUtils.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/ReactInstanceHolder.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/SettingsManager.java +1 -1
- package/android/app/src/main/java/com/microsoft/codepush/react/TLSSocketFactory.java +1 -1
- package/android/build.gradle +1 -1
- package/android/codepush.gradle +3 -3
- package/docs/advanced-usage.md +56 -0
- package/docs/api-android.md +12 -75
- package/docs/api-ios.md +5 -17
- package/docs/api-js.md +18 -55
- package/docs/setup-android.md +15 -397
- package/docs/setup-ios.md +24 -198
- package/docs/setup-windows.md +7 -74
- package/ios/CodePush/CodePush.h +4 -4
- package/ios/CodePush/CodePush.m +8 -8
- package/ios/CodePush/CodePushConfig.m +14 -11
- package/ios/CodePush/CodePushPackage.m +60 -60
- package/ios/CodePush/CodePushTelemetryManager.m +13 -13
- package/ios/CodePush.xcodeproj/project.pbxproj +1 -562
- package/package.json +27 -24
- package/react-native.config.js +1 -1
- package/scripts/generateBundledResourcesHash.js +1 -1
- package/scripts/getFilesInFolder.js +1 -1
- package/scripts/recordFilesBeforeBundleCommand.js +1 -1
- package/typings/react-native-code-push.d.ts +22 -22
- package/windows/CodePush/CodePushConfig.cpp +3 -3
- package/windows/CodePush/CodePushConfig.h +3 -3
- package/windows/CodePush/CodePushNativeModule.cpp +27 -27
- package/windows/CodePush/CodePushNativeModule.h +4 -4
- package/windows/CodePush/CodePushTelemetryManager.cpp +12 -12
- package/windows/CodePush/CodePushTelemetryManager.h +1 -1
- package/.azurepipelines/build-rn-code-push-1es.yml +0 -104
- package/.azurepipelines/test-rn-code-push.yml +0 -94
- package/.config/CredScanSuppressions.json +0 -14
- package/SECURITY.md +0 -41
- package/docs/multi-deployment-testing-android.md +0 -148
- package/docs/multi-deployment-testing-ios.md +0 -59
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.h +0 -34
- package/ios/CodePush/Base64/Base64/MF_Base64Additions.m +0 -252
- package/ios/CodePush/Base64/README.md +0 -47
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithm.h +0 -69
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.h +0 -16
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmFactory.m +0 -51
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.h +0 -15
- package/ios/CodePush/JWT/Core/Algorithms/Base/JWTAlgorithmNone.m +0 -55
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.h +0 -24
- package/ios/CodePush/JWT/Core/Algorithms/ESFamily/JWTAlgorithmESBase.m +0 -41
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.h +0 -28
- package/ios/CodePush/JWT/Core/Algorithms/HSFamily/JWTAlgorithmHSBase.m +0 -205
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.h +0 -103
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolder.m +0 -322
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.h +0 -37
- package/ios/CodePush/JWT/Core/Algorithms/Holders/JWTAlgorithmDataHolderChain.m +0 -145
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.h +0 -35
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTAlgorithmRSBase.m +0 -551
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/JWTRSAlgorithm.h +0 -23
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h +0 -43
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m +0 -230
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.h +0 -31
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoKeyExtractor.m +0 -113
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h +0 -38
- package/ios/CodePush/JWT/Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m +0 -500
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaim.m +0 -214
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.h +0 -23
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSet.m +0 -29
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.h +0 -19
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetSerializer.m +0 -68
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.h +0 -18
- package/ios/CodePush/JWT/Core/ClaimSet/JWTClaimsSetVerifier.m +0 -72
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.h +0 -67
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+ResultTypes.m +0 -111
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.h +0 -119
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionOne.m +0 -307
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.h +0 -94
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionThree.m +0 -619
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.h +0 -164
- package/ios/CodePush/JWT/Core/Coding/JWTCoding+VersionTwo.m +0 -514
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.h +0 -24
- package/ios/CodePush/JWT/Core/Coding/JWTCoding.m +0 -11
- package/ios/CodePush/JWT/Core/FrameworkSupplement/JWT.h +0 -52
- package/ios/CodePush/JWT/Core/FrameworkSupplement/Map.modulemap +0 -5
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.h +0 -28
- package/ios/CodePush/JWT/Core/Supplement/JWTBase64Coder.m +0 -70
- package/ios/CodePush/JWT/Core/Supplement/JWTDeprecations.h +0 -22
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.h +0 -34
- package/ios/CodePush/JWT/Core/Supplement/JWTErrorDescription.m +0 -73
- package/ios/CodePush/JWT/LICENSE +0 -19
- package/ios/CodePush/JWT/README.md +0 -489
- package/ios/CodePush/SSZipArchive/Info.plist +0 -26
- package/ios/CodePush/SSZipArchive/README.md +0 -1
- package/ios/CodePush/SSZipArchive/SSZipArchive.h +0 -178
- package/ios/CodePush/SSZipArchive/SSZipArchive.m +0 -1496
- package/ios/CodePush/SSZipArchive/SSZipCommon.h +0 -71
- package/ios/CodePush/SSZipArchive/Supporting Files/PrivacyInfo.xcprivacy +0 -23
- package/ios/CodePush/SSZipArchive/include/ZipArchive.h +0 -25
- package/ios/CodePush/SSZipArchive/minizip/LICENSE +0 -17
- package/ios/CodePush/SSZipArchive/minizip/mz.h +0 -273
- package/ios/CodePush/SSZipArchive/minizip/mz_compat.c +0 -1306
- package/ios/CodePush/SSZipArchive/minizip/mz_compat.h +0 -346
- package/ios/CodePush/SSZipArchive/minizip/mz_crypt.c +0 -187
- package/ios/CodePush/SSZipArchive/minizip/mz_crypt.h +0 -65
- package/ios/CodePush/SSZipArchive/minizip/mz_crypt_apple.c +0 -526
- package/ios/CodePush/SSZipArchive/minizip/mz_os.c +0 -348
- package/ios/CodePush/SSZipArchive/minizip/mz_os.h +0 -176
- package/ios/CodePush/SSZipArchive/minizip/mz_os_posix.c +0 -350
- package/ios/CodePush/SSZipArchive/minizip/mz_strm.c +0 -556
- package/ios/CodePush/SSZipArchive/minizip/mz_strm.h +0 -132
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.c +0 -383
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_buf.h +0 -42
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.c +0 -269
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_mem.h +0 -48
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_os.h +0 -40
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_os_posix.c +0 -203
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.c +0 -334
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_pkcrypt.h +0 -46
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.c +0 -429
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_split.h +0 -43
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.c +0 -360
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_wzaes.h +0 -46
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.c +0 -389
- package/ios/CodePush/SSZipArchive/minizip/mz_strm_zlib.h +0 -43
- package/ios/CodePush/SSZipArchive/minizip/mz_zip.c +0 -2782
- package/ios/CodePush/SSZipArchive/minizip/mz_zip.h +0 -262
- package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.c +0 -1942
- package/ios/CodePush/SSZipArchive/minizip/mz_zip_rw.h +0 -285
- package/scripts/postlink/android/postlink.js +0 -87
- package/scripts/postlink/ios/postlink.js +0 -116
- package/scripts/postlink/run.js +0 -11
- package/scripts/postunlink/android/postunlink.js +0 -74
- package/scripts/postunlink/ios/postunlink.js +0 -87
- package/scripts/postunlink/run.js +0 -11
- package/scripts/tools/linkToolsAndroid.js +0 -57
- package/scripts/tools/linkToolsIos.js +0 -130
- package/windows-legacy/CodePush/CodePush.csproj +0 -128
- package/windows-legacy/CodePush/CodePushUtils.cs +0 -47
- package/windows-legacy/CodePush/FileUtils.cs +0 -40
- package/windows-legacy/CodePush/Properties/AssemblyInfo.cs +0 -29
- package/windows-legacy/CodePush/Properties/CodePush.rd.xml +0 -33
- package/windows-legacy/CodePush/UpdateManager.cs +0 -305
- package/windows-legacy/CodePush/UpdateUtils.cs +0 -46
- package/windows-legacy/CodePush.Net46/Adapters/Http/HttpProgress.cs +0 -28
- package/windows-legacy/CodePush.Net46/Adapters/Storage/ApplicationDataContainer.cs +0 -106
- package/windows-legacy/CodePush.Net46/CodePush.Net46.csproj +0 -103
- package/windows-legacy/CodePush.Net46/CodePushUtils.cs +0 -158
- package/windows-legacy/CodePush.Net46/FileUtils.cs +0 -55
- package/windows-legacy/CodePush.Net46/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46/UpdateManager.cs +0 -330
- package/windows-legacy/CodePush.Net46/UpdateUtils.cs +0 -70
- package/windows-legacy/CodePush.Net46/packages.config +0 -5
- package/windows-legacy/CodePush.Net46.Test/ApplicationDataContainerTest.cs +0 -105
- package/windows-legacy/CodePush.Net46.Test/CodePush.Net46.Test.csproj +0 -137
- package/windows-legacy/CodePush.Net46.Test/Properties/AssemblyInfo.cs +0 -36
- package/windows-legacy/CodePush.Net46.Test/TelemetryManagerTest.cs +0 -117
- package/windows-legacy/CodePush.Net46.Test/app.config +0 -11
- package/windows-legacy/CodePush.Net46.Test/packages.config +0 -4
- package/windows-legacy/CodePush.Shared/CodePush.Shared.projitems +0 -22
- package/windows-legacy/CodePush.Shared/CodePush.Shared.shproj +0 -13
- package/windows-legacy/CodePush.Shared/CodePushConstants.cs +0 -35
- package/windows-legacy/CodePush.Shared/CodePushNativeModule.cs +0 -329
- package/windows-legacy/CodePush.Shared/CodePushReactPackage.cs +0 -235
- package/windows-legacy/CodePush.Shared/CodePushUtils.cs +0 -70
- package/windows-legacy/CodePush.Shared/InstallMode.cs +0 -9
- package/windows-legacy/CodePush.Shared/MinimumBackgroundListener.cs +0 -44
- package/windows-legacy/CodePush.Shared/SettingsManager.cs +0 -148
- package/windows-legacy/CodePush.Shared/TelemetryManager.cs +0 -250
- package/windows-legacy/CodePush.Shared/UpdateState.cs +0 -9
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
using Newtonsoft.Json.Linq;
|
|
2
|
-
using ReactNative;
|
|
3
|
-
using ReactNative.Bridge;
|
|
4
|
-
using ReactNative.Modules.Core;
|
|
5
|
-
using System;
|
|
6
|
-
using System.Collections.Generic;
|
|
7
|
-
using System.IO;
|
|
8
|
-
using System.Reflection;
|
|
9
|
-
using System.Threading;
|
|
10
|
-
using System.Threading.Tasks;
|
|
11
|
-
#if WINDOWS_UWP
|
|
12
|
-
using Windows.Web.Http;
|
|
13
|
-
#else
|
|
14
|
-
using CodePush.Net46.Adapters.Http;
|
|
15
|
-
#endif
|
|
16
|
-
|
|
17
|
-
namespace CodePush.ReactNative
|
|
18
|
-
{
|
|
19
|
-
internal class CodePushNativeModule : ReactContextNativeModuleBase
|
|
20
|
-
{
|
|
21
|
-
private CodePushReactPackage _codePush;
|
|
22
|
-
private MinimumBackgroundListener _minimumBackgroundListener;
|
|
23
|
-
private ReactContext _reactContext;
|
|
24
|
-
|
|
25
|
-
public CodePushNativeModule(ReactContext reactContext, CodePushReactPackage codePush)
|
|
26
|
-
: base(reactContext)
|
|
27
|
-
{
|
|
28
|
-
_reactContext = reactContext;
|
|
29
|
-
_codePush = codePush;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public override string Name
|
|
33
|
-
{
|
|
34
|
-
get
|
|
35
|
-
{
|
|
36
|
-
return "CodePush";
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
public override IReadOnlyDictionary<string, object> Constants
|
|
41
|
-
{
|
|
42
|
-
get
|
|
43
|
-
{
|
|
44
|
-
return new Dictionary<string, object>
|
|
45
|
-
{
|
|
46
|
-
{ "codePushInstallModeImmediate", InstallMode.Immediate },
|
|
47
|
-
{ "codePushInstallModeOnNextResume", InstallMode.OnNextResume },
|
|
48
|
-
{ "codePushInstallModeOnNextRestart", InstallMode.OnNextRestart },
|
|
49
|
-
{ "codePushUpdateStateRunning", UpdateState.Running },
|
|
50
|
-
{ "codePushUpdateStatePending", UpdateState.Pending },
|
|
51
|
-
{ "codePushUpdateStateLatest", UpdateState.Latest },
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
public override void Initialize()
|
|
57
|
-
{
|
|
58
|
-
_codePush.InitializeUpdateAfterRestart();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
[ReactMethod]
|
|
62
|
-
public async void downloadUpdate(JObject updatePackage, bool notifyProgress, IPromise promise)
|
|
63
|
-
{
|
|
64
|
-
try
|
|
65
|
-
{
|
|
66
|
-
updatePackage[CodePushConstants.BinaryModifiedTimeKey] = "" + await FileUtils.GetBinaryResourcesModifiedTimeAsync(_codePush.AssetsBundleFileName).ConfigureAwait(false);
|
|
67
|
-
await _codePush.UpdateManager.DownloadPackageAsync(
|
|
68
|
-
updatePackage,
|
|
69
|
-
_codePush.AssetsBundleFileName,
|
|
70
|
-
new Progress<HttpProgress>(
|
|
71
|
-
(HttpProgress progress) =>
|
|
72
|
-
{
|
|
73
|
-
if (!notifyProgress)
|
|
74
|
-
{
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
var downloadProgress = new JObject()
|
|
79
|
-
{
|
|
80
|
-
{ "totalBytes", progress.TotalBytesToReceive },
|
|
81
|
-
{ "receivedBytes", progress.BytesReceived }
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
_reactContext
|
|
85
|
-
.GetJavaScriptModule<RCTDeviceEventEmitter>()
|
|
86
|
-
.emit(CodePushConstants.DownloadProgressEventName, downloadProgress);
|
|
87
|
-
}
|
|
88
|
-
)
|
|
89
|
-
).ConfigureAwait(false);
|
|
90
|
-
|
|
91
|
-
JObject newPackage = await _codePush.UpdateManager.GetPackageAsync((string)updatePackage[CodePushConstants.PackageHashKey]).ConfigureAwait(false);
|
|
92
|
-
promise.Resolve(newPackage);
|
|
93
|
-
}
|
|
94
|
-
catch (InvalidDataException e)
|
|
95
|
-
{
|
|
96
|
-
CodePushUtils.Log(e.ToString());
|
|
97
|
-
SettingsManager.SaveFailedUpdate(updatePackage);
|
|
98
|
-
promise.Reject(e);
|
|
99
|
-
}
|
|
100
|
-
catch (Exception e)
|
|
101
|
-
{
|
|
102
|
-
CodePushUtils.Log(e.ToString());
|
|
103
|
-
promise.Reject(e);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
[ReactMethod]
|
|
108
|
-
public void getConfiguration(IPromise promise)
|
|
109
|
-
{
|
|
110
|
-
var config = new JObject
|
|
111
|
-
{
|
|
112
|
-
{ "appVersion", _codePush.AppVersion },
|
|
113
|
-
{ "clientUniqueId", CodePushUtils.GetDeviceId() },
|
|
114
|
-
{ "deploymentKey", _codePush.DeploymentKey },
|
|
115
|
-
{ "serverUrl", CodePushConstants.CodePushServerUrl }
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// TODO generate binary hash
|
|
119
|
-
// string binaryHash = CodePushUpdateUtils.getHashForBinaryContents(mainActivity, isDebugMode);
|
|
120
|
-
/*if (binaryHash != null)
|
|
121
|
-
{
|
|
122
|
-
configMap.putString(PACKAGE_HASH_KEY, binaryHash);
|
|
123
|
-
}*/
|
|
124
|
-
promise.Resolve(config);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
[ReactMethod]
|
|
128
|
-
public async void getUpdateMetadata(UpdateState updateState, IPromise promise)
|
|
129
|
-
{
|
|
130
|
-
JObject currentPackage = await _codePush.UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
|
|
131
|
-
if (currentPackage == null)
|
|
132
|
-
{
|
|
133
|
-
promise.Resolve("");
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
var currentUpdateIsPending = false;
|
|
138
|
-
|
|
139
|
-
if (currentPackage[CodePushConstants.PackageHashKey] != null)
|
|
140
|
-
{
|
|
141
|
-
var currentHash = (string)currentPackage[CodePushConstants.PackageHashKey];
|
|
142
|
-
currentUpdateIsPending = SettingsManager.IsPendingUpdate(currentHash);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (updateState == UpdateState.Pending && !currentUpdateIsPending)
|
|
146
|
-
{
|
|
147
|
-
// The caller wanted a pending update
|
|
148
|
-
// but there isn't currently one.
|
|
149
|
-
promise.Resolve("");
|
|
150
|
-
}
|
|
151
|
-
else if (updateState == UpdateState.Running && currentUpdateIsPending)
|
|
152
|
-
{
|
|
153
|
-
// The caller wants the running update, but the current
|
|
154
|
-
// one is pending, so we need to grab the previous.
|
|
155
|
-
promise.Resolve(await _codePush.UpdateManager.GetPreviousPackageAsync().ConfigureAwait(false));
|
|
156
|
-
}
|
|
157
|
-
else
|
|
158
|
-
{
|
|
159
|
-
// The current package satisfies the request:
|
|
160
|
-
// 1) Caller wanted a pending, and there is a pending update
|
|
161
|
-
// 2) Caller wanted the running update, and there isn't a pending
|
|
162
|
-
// 3) Caller wants the latest update, regardless if it's pending or not
|
|
163
|
-
if (_codePush.IsRunningBinaryVersion)
|
|
164
|
-
{
|
|
165
|
-
// This only matters in Debug builds. Since we do not clear "outdated" updates,
|
|
166
|
-
// we need to indicate to the JS side that somehow we have a current update on
|
|
167
|
-
// disk that is not actually running.
|
|
168
|
-
currentPackage["_isDebugOnly"] = true;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Enable differentiating pending vs. non-pending updates
|
|
172
|
-
currentPackage["isPending"] = currentUpdateIsPending;
|
|
173
|
-
promise.Resolve(currentPackage);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
[ReactMethod]
|
|
179
|
-
public async void getNewStatusReport(IPromise promise)
|
|
180
|
-
{
|
|
181
|
-
await Task.Run(() =>
|
|
182
|
-
{
|
|
183
|
-
if (_codePush.NeedToReportRollback)
|
|
184
|
-
{
|
|
185
|
-
_codePush.NeedToReportRollback = false;
|
|
186
|
-
|
|
187
|
-
var failedUpdates = SettingsManager.GetFailedUpdates();
|
|
188
|
-
if (failedUpdates != null && failedUpdates.Count > 0)
|
|
189
|
-
{
|
|
190
|
-
var lastFailedPackage = (JObject)failedUpdates[failedUpdates.Count - 1];
|
|
191
|
-
var failedStatusReport = TelemetryManager.GetRollbackReport(lastFailedPackage);
|
|
192
|
-
if (failedStatusReport != null)
|
|
193
|
-
{
|
|
194
|
-
promise.Resolve(failedStatusReport);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
else if (_codePush.DidUpdate)
|
|
200
|
-
{
|
|
201
|
-
var currentPackage = _codePush.UpdateManager.GetCurrentPackageAsync().Result;
|
|
202
|
-
if (currentPackage != null)
|
|
203
|
-
{
|
|
204
|
-
var newPackageStatusReport = TelemetryManager.GetUpdateReport(currentPackage);
|
|
205
|
-
if (newPackageStatusReport != null)
|
|
206
|
-
{
|
|
207
|
-
promise.Resolve(newPackageStatusReport);
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else if (_codePush.IsRunningBinaryVersion)
|
|
213
|
-
{
|
|
214
|
-
var newAppVersionStatusReport = TelemetryManager.GetBinaryUpdateReport(_codePush.AppVersion);
|
|
215
|
-
if (newAppVersionStatusReport != null)
|
|
216
|
-
{
|
|
217
|
-
promise.Resolve(newAppVersionStatusReport);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
else
|
|
222
|
-
{
|
|
223
|
-
var retryStatusReport = TelemetryManager.GetRetryStatusReport();
|
|
224
|
-
if (retryStatusReport != null)
|
|
225
|
-
{
|
|
226
|
-
promise.Resolve(retryStatusReport);
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
promise.Resolve("");
|
|
232
|
-
}).ConfigureAwait(false);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
[ReactMethod]
|
|
236
|
-
public async void installUpdate(JObject updatePackage, InstallMode installMode, int minimumBackgroundDuration, IPromise promise)
|
|
237
|
-
{
|
|
238
|
-
await _codePush.UpdateManager.InstallPackageAsync(updatePackage, SettingsManager.IsPendingUpdate(null)).ConfigureAwait(false);
|
|
239
|
-
var pendingHash = (string)updatePackage[CodePushConstants.PackageHashKey];
|
|
240
|
-
SettingsManager.SavePendingUpdate(pendingHash, /* isLoading */false);
|
|
241
|
-
if (installMode == InstallMode.OnNextResume)
|
|
242
|
-
{
|
|
243
|
-
if (_minimumBackgroundListener == null)
|
|
244
|
-
{
|
|
245
|
-
// Ensure we do not add the listener twice.
|
|
246
|
-
Action loadBundleAction = () =>
|
|
247
|
-
{
|
|
248
|
-
Context.RunOnNativeModulesQueueThread(async () =>
|
|
249
|
-
{
|
|
250
|
-
await LoadBundleAsync().ConfigureAwait(false);
|
|
251
|
-
});
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
_minimumBackgroundListener = new MinimumBackgroundListener(loadBundleAction, minimumBackgroundDuration);
|
|
255
|
-
_reactContext.AddLifecycleEventListener(_minimumBackgroundListener);
|
|
256
|
-
}
|
|
257
|
-
else
|
|
258
|
-
{
|
|
259
|
-
_minimumBackgroundListener.MinimumBackgroundDuration = minimumBackgroundDuration;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
promise.Resolve("");
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
[ReactMethod]
|
|
267
|
-
public void isFailedUpdate(string packageHash, IPromise promise)
|
|
268
|
-
{
|
|
269
|
-
promise.Resolve(SettingsManager.IsFailedHash(packageHash));
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
[ReactMethod]
|
|
273
|
-
public async void isFirstRun(string packageHash, IPromise promise)
|
|
274
|
-
{
|
|
275
|
-
bool isFirstRun = _codePush.DidUpdate
|
|
276
|
-
&& packageHash != null
|
|
277
|
-
&& packageHash.Length > 0
|
|
278
|
-
&& packageHash.Equals(await _codePush.UpdateManager.GetCurrentPackageHashAsync().ConfigureAwait(false));
|
|
279
|
-
promise.Resolve(isFirstRun);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
[ReactMethod]
|
|
283
|
-
public void notifyApplicationReady(IPromise promise)
|
|
284
|
-
{
|
|
285
|
-
SettingsManager.RemovePendingUpdate();
|
|
286
|
-
promise.Resolve("");
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
[ReactMethod]
|
|
290
|
-
public async void restartApp(bool onlyIfUpdateIsPending)
|
|
291
|
-
{
|
|
292
|
-
// If this is an unconditional restart request, or there
|
|
293
|
-
// is current pending update, then reload the app.
|
|
294
|
-
if (!onlyIfUpdateIsPending || SettingsManager.IsPendingUpdate(null))
|
|
295
|
-
{
|
|
296
|
-
await LoadBundleAsync().ConfigureAwait(false);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
[ReactMethod]
|
|
301
|
-
public async void recordStatusReported(JObject statusReport)
|
|
302
|
-
{
|
|
303
|
-
await Task.Run(() => TelemetryManager.RecordStatusReported(statusReport)).ConfigureAwait(false);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
[ReactMethod]
|
|
307
|
-
public async void saveStatusReportForRetry(JObject statusReport)
|
|
308
|
-
{
|
|
309
|
-
await Task.Run(() => TelemetryManager.SaveStatusReportForRetry(statusReport)).ConfigureAwait(false);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
internal async Task LoadBundleAsync()
|
|
313
|
-
{
|
|
314
|
-
// #1) Get the private ReactInstanceManager, which is what includes
|
|
315
|
-
// the logic to reload the current React context.
|
|
316
|
-
var reactInstanceManager = _codePush.ReactInstanceManager;
|
|
317
|
-
|
|
318
|
-
// #2) Update the locally stored JS bundle file path
|
|
319
|
-
Type reactInstanceManagerType = typeof(ReactInstanceManager);
|
|
320
|
-
string latestJSBundleFile = await _codePush.GetJavaScriptBundleFileAsync(_codePush.AssetsBundleFileName).ConfigureAwait(false);
|
|
321
|
-
reactInstanceManagerType
|
|
322
|
-
.GetField("_jsBundleFile", BindingFlags.NonPublic | BindingFlags.Instance)
|
|
323
|
-
.SetValue(reactInstanceManager, latestJSBundleFile);
|
|
324
|
-
|
|
325
|
-
// #3) Get the context creation method and fire it on the UI thread (which RN enforces)
|
|
326
|
-
Context.RunOnDispatcherQueueThread(() => reactInstanceManager.RecreateReactContextAsync(CancellationToken.None));
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
using Newtonsoft.Json.Linq;
|
|
2
|
-
using ReactNative;
|
|
3
|
-
using ReactNative.Bridge;
|
|
4
|
-
using ReactNative.Modules.Core;
|
|
5
|
-
using ReactNative.UIManager;
|
|
6
|
-
using System;
|
|
7
|
-
using System.Collections.Generic;
|
|
8
|
-
using System.Reflection;
|
|
9
|
-
using System.Threading.Tasks;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
namespace CodePush.ReactNative
|
|
13
|
-
{
|
|
14
|
-
public sealed class CodePushReactPackage : IReactPackage
|
|
15
|
-
{
|
|
16
|
-
private static CodePushReactPackage CurrentInstance;
|
|
17
|
-
|
|
18
|
-
internal string AppVersion { get; private set; }
|
|
19
|
-
internal string DeploymentKey { get; private set; }
|
|
20
|
-
internal string AssetsBundleFileName { get; private set; }
|
|
21
|
-
internal bool NeedToReportRollback { get; set; } = false;
|
|
22
|
-
internal bool DidUpdate { get; private set; } = false;
|
|
23
|
-
internal bool IsRunningBinaryVersion { get; private set; } = false;
|
|
24
|
-
#pragma warning disable CS0618 // Keeping for backward compatibility
|
|
25
|
-
internal ReactPage MainPage { get; private set; }
|
|
26
|
-
#pragma warning restore CS0618 // Keeping for backward compatibility
|
|
27
|
-
internal ReactNativeHost Host { get; private set; }
|
|
28
|
-
internal UpdateManager UpdateManager { get; private set; }
|
|
29
|
-
|
|
30
|
-
internal ReactInstanceManager ReactInstanceManager
|
|
31
|
-
{
|
|
32
|
-
get
|
|
33
|
-
{
|
|
34
|
-
if (Host != null)
|
|
35
|
-
{
|
|
36
|
-
return Host.ReactInstanceManager;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
#if WINDOWS_UWP
|
|
40
|
-
#pragma warning disable CS0618 // Keeping for backward compatibility
|
|
41
|
-
return (ReactInstanceManager)typeof(ReactPage)
|
|
42
|
-
#pragma warning restore CS0618 // Keeping for backward compatibility
|
|
43
|
-
.GetField("_reactInstanceManager", BindingFlags.NonPublic | BindingFlags.Instance)
|
|
44
|
-
.GetValue(MainPage);
|
|
45
|
-
#else
|
|
46
|
-
return ((Lazy<ReactInstanceManager>)typeof(ReactPage)
|
|
47
|
-
.GetField("_reactInstanceManager", BindingFlags.NonPublic | BindingFlags.Instance)
|
|
48
|
-
.GetValue(MainPage)).Value as ReactInstanceManager;
|
|
49
|
-
#endif
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
internal bool UseDeveloperSupport
|
|
54
|
-
{
|
|
55
|
-
get
|
|
56
|
-
{
|
|
57
|
-
return Host?.UseDeveloperSupport ?? MainPage.UseDeveloperSupport;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
#pragma warning disable CS0618 // Keeping for backward compatibility
|
|
63
|
-
public CodePushReactPackage(string deploymentKey, ReactPage mainPage)
|
|
64
|
-
#pragma warning restore CS0618 // Keeping for backward compatibility
|
|
65
|
-
{
|
|
66
|
-
AppVersion = CodePushUtils.GetAppVersion();
|
|
67
|
-
DeploymentKey = deploymentKey;
|
|
68
|
-
MainPage = mainPage;
|
|
69
|
-
UpdateManager = new UpdateManager();
|
|
70
|
-
|
|
71
|
-
if (CurrentInstance != null)
|
|
72
|
-
{
|
|
73
|
-
CodePushUtils.Log("More than one CodePush instance has been initialized. Please use the instance method codePush.getBundleUrlInternal() to get the correct bundleURL for a particular instance.");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
CurrentInstance = this;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
public CodePushReactPackage(string deploymentKey, ReactNativeHost host)
|
|
80
|
-
{
|
|
81
|
-
AppVersion = CodePushUtils.GetAppVersion();
|
|
82
|
-
DeploymentKey = deploymentKey;
|
|
83
|
-
Host = host;
|
|
84
|
-
UpdateManager = new UpdateManager();
|
|
85
|
-
|
|
86
|
-
if (CurrentInstance != null)
|
|
87
|
-
{
|
|
88
|
-
CodePushUtils.Log("More than one CodePush instance has been initialized. Please use the instance method codePush.getBundleUrlInternal() to get the correct bundleURL for a particular instance.");
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
CurrentInstance = this;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
#region Public methods
|
|
95
|
-
public IReadOnlyList<Type> CreateJavaScriptModulesConfig()
|
|
96
|
-
{
|
|
97
|
-
return new List<Type>();
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
public IReadOnlyList<INativeModule> CreateNativeModules(ReactContext reactContext)
|
|
101
|
-
{
|
|
102
|
-
return new List<INativeModule>
|
|
103
|
-
{
|
|
104
|
-
new CodePushNativeModule(reactContext, this)
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
public IReadOnlyList<IViewManager> CreateViewManagers(ReactContext reactContext)
|
|
109
|
-
{
|
|
110
|
-
return new List<IViewManager>();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
public string GetJavaScriptBundleFile()
|
|
114
|
-
{
|
|
115
|
-
return GetJavaScriptBundleFile(CodePushConstants.DefaultJsBundleName);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
public string GetJavaScriptBundleFile(string assetsBundleFileName)
|
|
119
|
-
{
|
|
120
|
-
if (CurrentInstance == null)
|
|
121
|
-
{
|
|
122
|
-
throw new InvalidOperationException("A CodePush instance has not been created yet. Have you added it to your app's list of ReactPackages?");
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return CurrentInstance.GetJavaScriptBundleFileAsync(assetsBundleFileName).Result;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
public async Task<string> GetJavaScriptBundleFileAsync(string assetsBundleFileName)
|
|
129
|
-
{
|
|
130
|
-
AssetsBundleFileName = assetsBundleFileName;
|
|
131
|
-
string binaryJsBundleUrl = CodePushUtils.GetAssetsBundlePrefix() + assetsBundleFileName;
|
|
132
|
-
|
|
133
|
-
var binaryResourcesModifiedTime = await FileUtils.GetBinaryResourcesModifiedTimeAsync(AssetsBundleFileName).ConfigureAwait(false);
|
|
134
|
-
var packageFile = await UpdateManager.GetCurrentPackageBundleAsync(AssetsBundleFileName).ConfigureAwait(false);
|
|
135
|
-
if (packageFile == null)
|
|
136
|
-
{
|
|
137
|
-
// There has not been any downloaded updates.
|
|
138
|
-
CodePushUtils.LogBundleUrl(binaryJsBundleUrl);
|
|
139
|
-
IsRunningBinaryVersion = true;
|
|
140
|
-
return binaryJsBundleUrl;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
var packageMetadata = await UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
|
|
144
|
-
long? binaryModifiedDateDuringPackageInstall = null;
|
|
145
|
-
var binaryModifiedDateDuringPackageInstallString = (string)packageMetadata[CodePushConstants.BinaryModifiedTimeKey];
|
|
146
|
-
if (binaryModifiedDateDuringPackageInstallString != null)
|
|
147
|
-
{
|
|
148
|
-
binaryModifiedDateDuringPackageInstall = long.Parse(binaryModifiedDateDuringPackageInstallString);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
var packageAppVersion = (string)packageMetadata["appVersion"];
|
|
152
|
-
|
|
153
|
-
if (binaryModifiedDateDuringPackageInstall != null &&
|
|
154
|
-
binaryModifiedDateDuringPackageInstall == binaryResourcesModifiedTime &&
|
|
155
|
-
AppVersion.Equals(packageAppVersion))
|
|
156
|
-
{
|
|
157
|
-
CodePushUtils.LogBundleUrl(packageFile.Path);
|
|
158
|
-
IsRunningBinaryVersion = false;
|
|
159
|
-
|
|
160
|
-
return CodePushUtils.GetFileBundlePrefix() + CodePushUtils.ExtractSubFolder(packageFile.Path);
|
|
161
|
-
}
|
|
162
|
-
else
|
|
163
|
-
{
|
|
164
|
-
// The binary version is newer.
|
|
165
|
-
DidUpdate = false;
|
|
166
|
-
if (!UseDeveloperSupport || !AppVersion.Equals(packageAppVersion))
|
|
167
|
-
{
|
|
168
|
-
await ClearUpdatesAsync().ConfigureAwait(false);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
CodePushUtils.LogBundleUrl(binaryJsBundleUrl);
|
|
172
|
-
IsRunningBinaryVersion = true;
|
|
173
|
-
return binaryJsBundleUrl;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
#endregion
|
|
178
|
-
|
|
179
|
-
#region Internal methods
|
|
180
|
-
|
|
181
|
-
internal void InitializeUpdateAfterRestart()
|
|
182
|
-
{
|
|
183
|
-
// Reset the state which indicates that
|
|
184
|
-
// the app was just freshly updated.
|
|
185
|
-
DidUpdate = false;
|
|
186
|
-
|
|
187
|
-
JObject pendingUpdate = SettingsManager.GetPendingUpdate();
|
|
188
|
-
if (pendingUpdate != null)
|
|
189
|
-
{
|
|
190
|
-
var updateIsLoading = (bool)pendingUpdate[CodePushConstants.PendingUpdateIsLoadingKey];
|
|
191
|
-
if (updateIsLoading)
|
|
192
|
-
{
|
|
193
|
-
// Pending update was initialized, but notifyApplicationReady was not called.
|
|
194
|
-
// Therefore, deduce that it is a broken update and rollback.
|
|
195
|
-
CodePushUtils.Log("Update did not finish loading the last time, rolling back to a previous version.");
|
|
196
|
-
NeedToReportRollback = true;
|
|
197
|
-
RollbackPackageAsync().Wait();
|
|
198
|
-
}
|
|
199
|
-
else
|
|
200
|
-
{
|
|
201
|
-
DidUpdate = true;
|
|
202
|
-
// Clear the React dev bundle cache so that new updates can be loaded.
|
|
203
|
-
if (UseDeveloperSupport)
|
|
204
|
-
{
|
|
205
|
-
FileUtils.ClearReactDevBundleCacheAsync().Wait();
|
|
206
|
-
}
|
|
207
|
-
// Mark that we tried to initialize the new update, so that if it crashes,
|
|
208
|
-
// we will know that we need to rollback when the app next starts.
|
|
209
|
-
SettingsManager.SavePendingUpdate((string)pendingUpdate[CodePushConstants.PendingUpdateHashKey], /* isLoading */true);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
internal async Task ClearUpdatesAsync()
|
|
215
|
-
{
|
|
216
|
-
await UpdateManager.ClearUpdatesAsync().ConfigureAwait(false);
|
|
217
|
-
SettingsManager.RemovePendingUpdate();
|
|
218
|
-
SettingsManager.RemoveFailedUpdates();
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
#endregion
|
|
222
|
-
|
|
223
|
-
#region Private methods
|
|
224
|
-
|
|
225
|
-
private async Task RollbackPackageAsync()
|
|
226
|
-
{
|
|
227
|
-
JObject failedPackage = await UpdateManager.GetCurrentPackageAsync().ConfigureAwait(false);
|
|
228
|
-
SettingsManager.SaveFailedUpdate(failedPackage);
|
|
229
|
-
await UpdateManager.RollbackPackageAsync().ConfigureAwait(false);
|
|
230
|
-
SettingsManager.RemovePendingUpdate();
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
#endregion
|
|
234
|
-
}
|
|
235
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
using System;
|
|
2
|
-
using System.Diagnostics;
|
|
3
|
-
using System.Linq;
|
|
4
|
-
using System.IO;
|
|
5
|
-
#if WINDOWS_UWP
|
|
6
|
-
using Windows.ApplicationModel;
|
|
7
|
-
using Windows.Storage;
|
|
8
|
-
#endif
|
|
9
|
-
|
|
10
|
-
namespace CodePush.ReactNative
|
|
11
|
-
{
|
|
12
|
-
internal partial class CodePushUtils
|
|
13
|
-
{
|
|
14
|
-
internal static void Log(string message)
|
|
15
|
-
{
|
|
16
|
-
Debug.WriteLine("[CodePush] " + message, CodePushConstants.ReactNativeLogCategory);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
internal static void LogBundleUrl(string path)
|
|
20
|
-
{
|
|
21
|
-
Log("Loading JS bundle from \"" + path + "\"");
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
static string _deviceId = String.Empty;
|
|
25
|
-
|
|
26
|
-
internal static string GetDeviceId()
|
|
27
|
-
{
|
|
28
|
-
//It's quite long operation, cache it
|
|
29
|
-
if (!String.IsNullOrEmpty(_deviceId))
|
|
30
|
-
return _deviceId;
|
|
31
|
-
|
|
32
|
-
_deviceId = GetDeviceIdImpl();
|
|
33
|
-
return _deviceId;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
internal static string GetAppVersion()
|
|
37
|
-
{
|
|
38
|
-
#if WINDOWS_UWP
|
|
39
|
-
return Package.Current.Id.Version.Major + "." + Package.Current.Id.Version.Minor + "." + Package.Current.Id.Version.Build;
|
|
40
|
-
#else
|
|
41
|
-
return applicationInfo.Version;
|
|
42
|
-
#endif
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
internal static string GetAppFolder()
|
|
46
|
-
{
|
|
47
|
-
#if WINDOWS_UWP
|
|
48
|
-
return ApplicationData.Current.LocalFolder.Path;
|
|
49
|
-
#else
|
|
50
|
-
return AppDomain.CurrentDomain.BaseDirectory;
|
|
51
|
-
#endif
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
internal static string GetAssetsBundlePrefix()
|
|
55
|
-
{
|
|
56
|
-
#if WINDOWS_UWP
|
|
57
|
-
return CodePushConstants.AssetsBundlePrefix;
|
|
58
|
-
#else
|
|
59
|
-
return Path.Combine(GetAppFolder(), CodePushConstants.AssetsBundlePrefix);
|
|
60
|
-
#endif
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
internal static string ExtractSubFolder(string fullPath)
|
|
64
|
-
{
|
|
65
|
-
var codePushSubPathArray = fullPath.Split(Path.DirectorySeparatorChar);
|
|
66
|
-
return String.Join("/", codePushSubPathArray.SkipWhile((value, index) => codePushSubPathArray.Length - index > 4).ToArray());
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
using ReactNative.Bridge;
|
|
2
|
-
using System;
|
|
3
|
-
|
|
4
|
-
namespace CodePush.ReactNative
|
|
5
|
-
{
|
|
6
|
-
internal class MinimumBackgroundListener : ILifecycleEventListener
|
|
7
|
-
{
|
|
8
|
-
private DateTimeOffset? _lastSuspendDate;
|
|
9
|
-
private Action _resumeAction;
|
|
10
|
-
|
|
11
|
-
internal int MinimumBackgroundDuration { get; set; }
|
|
12
|
-
|
|
13
|
-
internal MinimumBackgroundListener(Action resumeAction, int minimumBackgroundDuration)
|
|
14
|
-
{
|
|
15
|
-
_resumeAction = resumeAction;
|
|
16
|
-
MinimumBackgroundDuration = minimumBackgroundDuration;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public void OnDestroy()
|
|
20
|
-
{
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public void OnResume()
|
|
24
|
-
{
|
|
25
|
-
if (_lastSuspendDate != null)
|
|
26
|
-
{
|
|
27
|
-
// Determine how long the app was in the background and ensure
|
|
28
|
-
// that it meets the minimum duration amount of time.
|
|
29
|
-
double durationInBackground = (DateTimeOffset.Now - _lastSuspendDate.Value).TotalSeconds;
|
|
30
|
-
if (durationInBackground >= MinimumBackgroundDuration)
|
|
31
|
-
{
|
|
32
|
-
_resumeAction.Invoke();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
public void OnSuspend()
|
|
38
|
-
{
|
|
39
|
-
// Save the current time so that when the app is later
|
|
40
|
-
// resumed, we can detect how long it was in the background.
|
|
41
|
-
_lastSuspendDate = DateTimeOffset.Now;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|