diff --git a/packages/react-native-version-check/android/build.gradle b/packages/react-native-version-check/android/build.gradle index 5400528c..1bb624dc 100644 --- a/packages/react-native-version-check/android/build.gradle +++ b/packages/react-native-version-check/android/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.library' -def DEFAULT_COMPILE_SDK_VERSION = 26 +def DEFAULT_COMPILE_SDK_VERSION = 28 def DEFAULT_BUILD_TOOLS_VERSION = "26.0.3" def DEFAULT_TARGET_SDK_VERSION = 26 def DEFAULT_MIN_SDK_VERSION = 16 diff --git a/packages/react-native-version-check/android/src/main/java/io/xogus/reactnative/versioncheck/RNVersionCheckModule.java b/packages/react-native-version-check/android/src/main/java/io/xogus/reactnative/versioncheck/RNVersionCheckModule.java index 76e2e47b..4e8d4766 100644 --- a/packages/react-native-version-check/android/src/main/java/io/xogus/reactnative/versioncheck/RNVersionCheckModule.java +++ b/packages/react-native-version-check/android/src/main/java/io/xogus/reactnative/versioncheck/RNVersionCheckModule.java @@ -3,6 +3,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.Signature; +import android.content.pm.SigningInfo; +import android.os.Build; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; @@ -10,6 +13,10 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; +import java.util.List; +import java.util.ArrayList; + +import java.security.MessageDigest; import javax.annotation.Nullable; @@ -25,6 +32,36 @@ public RNVersionCheckModule(ReactApplicationContext reactContext) this.packageName = this.reactContext.getPackageName(); } + private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray(); + public static String bytesToHex(byte[] bytes) { + char[] hexChars = new char[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars); + } + + public static String signatureToSHAHex(Signature sig) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA"); + digest.update(sig.toByteArray()); + return bytesToHex(digest.digest()); + } + catch (Exception e) { + return null; + } + } + + public static List signaturesToSHAHexList(Signature[] signatures) { + List signatureList = new ArrayList(); + for (Signature sig : signatures) { + signatureList.add(signatureToSHAHex(sig)); + } + return signatureList; + } + @Override public @Nullable Map getConstants() { @@ -36,12 +73,38 @@ public RNVersionCheckModule(ReactApplicationContext reactContext) PackageManager packageManager = this.reactContext.getPackageManager(); try { - PackageInfo info = packageManager.getPackageInfo(packageName, 0); + boolean useNewAPI = Build.VERSION.SDK_INT >= Build.VERSION_CODES.P; + PackageInfo info = packageManager.getPackageInfo(packageName, useNewAPI ? PackageManager.GET_SIGNING_CERTIFICATES : PackageManager.GET_SIGNATURES); + + List signatureList; + + if (useNewAPI) + { + // New signature + SigningInfo sig = info.signingInfo; + if (sig.hasMultipleSigners()) + { + // Send all with apkContentsSigners + signatureList = signaturesToSHAHexList(sig.getApkContentsSigners()); + } + else + { + // Send one with signingCertificateHistory + signatureList = signaturesToSHAHexList(sig.getSigningCertificateHistory()); + } + } + else + { + signatureList = signaturesToSHAHexList(info.signatures); + } + + constants.put("signatures", signatureList); constants.put("currentVersion", info.versionName); constants.put("currentBuildNumber", info.versionCode); } catch (PackageManager.NameNotFoundException e) { + constants.put("signatures", null); constants.put("currentVersion", null); constants.put("currentBuildNumber", null); } diff --git a/packages/react-native-version-check/builder.js b/packages/react-native-version-check/builder.js index 2ed3a84e..e809eb3b 100644 --- a/packages/react-native-version-check/builder.js +++ b/packages/react-native-version-check/builder.js @@ -23,6 +23,7 @@ export default (VersionInfoObject: IVersionInfo): ReactNativeVersionCheck => { getPackageName: VersionInfoObject.getPackageName, getCurrentBuildNumber: VersionInfoObject.getCurrentBuildNumber, getCurrentVersion: VersionInfoObject.getCurrentVersion, + getAppSignatures: VersionInfoObject.getAppSignatures, getStoreUrl, getAppStoreUrl, diff --git a/packages/react-native-version-check/src/RNVersionInfo.js b/packages/react-native-version-check/src/RNVersionInfo.js index 2aa96bd2..3296f8a3 100644 --- a/packages/react-native-version-check/src/RNVersionInfo.js +++ b/packages/react-native-version-check/src/RNVersionInfo.js @@ -6,4 +6,5 @@ export default { getPackageName: (): string => RNVersionCheck.packageName, getCurrentBuildNumber: (): number => RNVersionCheck.currentBuildNumber, getCurrentVersion: (): string => RNVersionCheck.currentVersion, + getAppSignatures: (): string[] => RNVersionCheck.signatures, }; diff --git a/packages/react-native-version-check/src/versionInfo.js b/packages/react-native-version-check/src/versionInfo.js index c39b1225..e92f5176 100644 --- a/packages/react-native-version-check/src/versionInfo.js +++ b/packages/react-native-version-check/src/versionInfo.js @@ -4,6 +4,7 @@ export interface IVersionInfo { getPackageName: () => string; getCurrentBuildNumber: () => number; getCurrentVersion: () => string; + getAppSignatures: () => string[]; } let VersionInfo: ?IVersionInfo = null;