From 5cd296ad2e623eed3af2837de8cd8a4aff607bc8 Mon Sep 17 00:00:00 2001 From: samarth-sheth-us Date: Tue, 24 Jun 2025 11:33:18 +0530 Subject: [PATCH 1/4] Add getUpdateInfo method --- .../com/rninappupdate/RnInAppUpdateModule.kt | 21 +++ example/src/App.tsx | 122 +++++++++++++++++- src/index.tsx | 28 +++- src/types.ts | 11 ++ 4 files changed, 171 insertions(+), 11 deletions(-) create mode 100644 src/types.ts diff --git a/android/src/main/java/com/rninappupdate/RnInAppUpdateModule.kt b/android/src/main/java/com/rninappupdate/RnInAppUpdateModule.kt index 11cbddd..6567a55 100644 --- a/android/src/main/java/com/rninappupdate/RnInAppUpdateModule.kt +++ b/android/src/main/java/com/rninappupdate/RnInAppUpdateModule.kt @@ -58,6 +58,27 @@ class RnInAppUpdateModule(reactContext: ReactApplicationContext) : } } + @ReactMethod + fun getUpdateInfo(promise: Promise) { + appUpdateManager.appUpdateInfo + .addOnSuccessListener { info -> + val map = Arguments.createMap() + map.putInt("updateAvailability", info.updateAvailability()) + map.putBoolean("immediateAllowed", info.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) + map.putBoolean("flexibleAllowed", info.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) + map.putInt("versionCode", info.availableVersionCode()) + info.clientVersionStalenessDays()?.let { + map.putInt("clientVersionStalenessDays", it) + } + map.putDouble("totalBytesToDownload", info.totalBytesToDownload().toDouble()) + map.putString("packageName", info.packageName()) + promise.resolve(map) + } + .addOnFailureListener { e -> + promise.reject("UPDATE_INFO_FAILED", "Failed to retrieve update info", e) + } + } + override fun onActivityResult(activity: Activity, requestCode: Int, resultCode: Int, data: Intent?) { // No-op } diff --git a/example/src/App.tsx b/example/src/App.tsx index 817d1ec..8ac82b4 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,15 +1,99 @@ -import { useEffect } from 'react'; -import { Text, View, StyleSheet } from 'react-native'; -import { showUpdatePopup } from 'react-native-rn-in-app-update'; +import { useEffect, useState } from 'react'; +import { Alert, Button, Platform, StyleSheet, Text, View } from 'react-native'; +import { + getUpdateInfo, + showUpdatePopup, + type UpdateInfo, +} from 'react-native-rn-in-app-update'; const App = () => { + const [updateInfo, setUpdateInfo] = useState(null); + useEffect(() => { - showUpdatePopup(); + const checkUpdate = async () => { + if (Platform.OS !== 'android') return; + + try { + const info = await getUpdateInfo(); + setUpdateInfo(info); + } catch (err: any) { + Alert.alert( + 'Update Error', + err?.message || 'Could not check or start update' + ); + } + }; + + checkUpdate(); }, []); + const handleCheckFlexibleUpdate = async () => { + try { + await showUpdatePopup('flexible'); + } catch (err: any) { + Alert.alert( + 'Update Error', + err?.message || 'Could not start flexible update' + ); + } + }; + + const handleCheckImmediateUpdate = async () => { + try { + await showUpdatePopup('immediate'); + } catch (err: any) { + Alert.alert( + 'Update Error', + err?.message || 'Could not start immediate update' + ); + } + }; + return ( - App + In-App Update Demo + + {Platform.OS === 'android' ? ( + +