Explorar o código

refactor: 更新 Android 资源保留策略

- 移除不再使用的 React Native 新应用屏幕相关资源
- 添加新的二维码扫描图标资源
xuqm hai 1 semana
pai
achega
4c54e8ba98
Modificáronse 33 ficheiros con 519 adicións e 15 borrados
  1. 1 0
      android/app/src/main/AndroidManifest.xml
  2. 1 1
      android/app/src/main/assets/app.android.bundle
  3. 0 0
      android/app/src/main/assets/common.android.bundle
  4. BIN=BIN
      android/app/src/main/assets/drawable-mdpi/node_modules_reactnative_newappscreen_src_assets_reactdark.png
  5. BIN=BIN
      android/app/src/main/assets/drawable-mdpi/node_modules_reactnative_newappscreen_src_assets_reactlight.png
  6. BIN=BIN
      android/app/src/main/assets/drawable-mdpi/src_app_resource_images_icon_sign_scan.png
  7. BIN=BIN
      android/app/src/main/assets/drawable-xhdpi/src_app_resource_images_icon_sign_scan.png
  8. BIN=BIN
      android/app/src/main/assets/drawable-xxhdpi/src_app_resource_images_icon_sign_scan.png
  9. 1 1
      android/app/src/main/assets/hospital.android.bundle
  10. 1 1
      android/app/src/main/assets/raw/keep.xml
  11. 1 1
      android/app/src/main/assets/ywq.android.bundle
  12. 4 4
      android/app/src/main/java/com/trust/ywx/MainApplication.kt
  13. 1 1
      android/gradle.properties
  14. 2 0
      bundle/android/app.android.bundle
  15. 1 0
      bundle/android/common.android.bundle
  16. BIN=BIN
      bundle/android/drawable-mdpi/src_app_resource_images_icon_sign_scan.png
  17. BIN=BIN
      bundle/android/drawable-xhdpi/src_app_resource_images_icon_sign_scan.png
  18. BIN=BIN
      bundle/android/drawable-xxhdpi/src_app_resource_images_icon_sign_scan.png
  19. 4 0
      bundle/android/hospital.android.bundle
  20. 1 0
      bundle/android/raw/keep.xml
  21. 4 0
      bundle/android/ywq.android.bundle
  22. 0 0
      config/bundleCommonInfo.json
  23. 7 5
      package.json
  24. 34 0
      src/app/App.tsx
  25. 414 0
      src/app/TestNativeInfo.js
  26. BIN=BIN
      src/app/resource/images/icon_sign_scan.png
  27. BIN=BIN
      src/app/resource/images/icon_sign_scan@2x.png
  28. BIN=BIN
      src/app/resource/images/icon_sign_scan@3x.png
  29. 10 0
      src/common/ToastHelper.ts
  30. 2 1
      src/common/common.ts
  31. 10 0
      src/hospital/Hospital.tsx
  32. 10 0
      src/ywq/Ywq.tsx
  33. 10 0
      yarn.lock

+ 1 - 0
android/app/src/main/AndroidManifest.xml

@@ -1,6 +1,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
 
     <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 
     <application
         android:name=".MainApplication"

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
android/app/src/main/assets/app.android.bundle


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
android/app/src/main/assets/common.android.bundle


BIN=BIN
android/app/src/main/assets/drawable-mdpi/node_modules_reactnative_newappscreen_src_assets_reactdark.png


BIN=BIN
android/app/src/main/assets/drawable-mdpi/node_modules_reactnative_newappscreen_src_assets_reactlight.png


BIN=BIN
android/app/src/main/assets/drawable-mdpi/src_app_resource_images_icon_sign_scan.png


BIN=BIN
android/app/src/main/assets/drawable-xhdpi/src_app_resource_images_icon_sign_scan.png


BIN=BIN
android/app/src/main/assets/drawable-xxhdpi/src_app_resource_images_icon_sign_scan.png


+ 1 - 1
android/app/src/main/assets/hospital.android.bundle

@@ -1,4 +1,4 @@
 __d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.Hospital,function(){return p.default})},10000000,[5,3,10000001,491]);
-__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),n=r(d[1]);var o=t.StyleSheet.create({container:{flex:1}});e.default=function(){var l='dark'===(0,t.useColorScheme)();return(0,n.jsxs)(t.View,{style:o.container,children:[(0,n.jsx)(t.StatusBar,{barStyle:l?'light-content':'dark-content'}),(0,n.jsx)(t.View,{style:{height:100}}),(0,n.jsx)(t.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,n.jsx)(t.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[2]).pop)()}})]})}},10000001,[3,243,491]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,s.jsx)(n.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[4]).pop)()}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[5]).showMessage)('\u4e92\u8054\u7f51\u533b\u9662\u5f39\u51fatoast','info','common\u5411\u4e0b\u517c\u5bb9')}}),(0,s.jsx)(o.default,{})]})}},10000001,[5,3,503,243,491,502]);
 __r(108);
 __r(10000000);

+ 1 - 1
android/app/src/main/assets/raw/keep.xml

@@ -1 +1 @@
-<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/node_modules_reactnative_newappscreen_src_assets_reactdark,@drawable/node_modules_reactnative_newappscreen_src_assets_reactlight" />
+<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/src_app_resource_images_icon_sign_scan" />

+ 1 - 1
android/app/src/main/assets/ywq.android.bundle

@@ -1,4 +1,4 @@
 __d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).Apps.Ywq,function(){return p.default})},10000000,[5,3,10000001,491]);
-__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(d[0]),n=r(d[1]);var o=t.StyleSheet.create({container:{flex:1}});e.default=function(){var l='dark'===(0,t.useColorScheme)();return(0,n.jsxs)(t.View,{style:o.container,children:[(0,n.jsx)(t.StatusBar,{barStyle:l?'light-content':'dark-content'}),(0,n.jsx)(t.View,{style:{height:100}}),(0,n.jsx)(t.Button,{title:'onConfirm',onPress:function(){}})]})}},10000001,[3,243]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Button,{title:'onConfirm',onPress:function(){}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[4]).showMessage)('\u533b\u7f51\u7b7e\u5f39\u51fatoast-error','error')}}),(0,s.jsx)(o.default,{})]})}},10000001,[5,3,503,243,502]);
 __r(108);
 __r(10000000);

+ 4 - 4
android/app/src/main/java/com/trust/ywx/MainApplication.kt

@@ -22,15 +22,15 @@ class MainApplication : Application(), ReactApplication {
                 }
 
             override fun getJSMainModuleName(): String =
-                if (BuildConfig.BUILD_TYPE == "debug") "index" else "commom"
+                if (getUseDeveloperSupport()) "index" else "commom"
 
             override fun getBundleAssetName(): String =
-                if (BuildConfig.BUILD_TYPE == "debug") "index.android.bundle" else "common.android.bundle"
+                if (getUseDeveloperSupport()) "index.android.bundle" else "common.android.bundle"
 
             override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
 
-            override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
-            override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
+            override val isNewArchEnabled: Boolean = true
+            override val isHermesEnabled: Boolean = true
         }
 
     override val reactHost: ReactHost

+ 1 - 1
android/gradle.properties

@@ -10,7 +10,7 @@
 # Specifies the JVM arguments used for the daemon process.
 # The setting is particularly useful for tweaking memory settings.
 # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
-org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
+org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=1g
 
 # When configured, Gradle will run in incubating parallel mode.
 # This option should only be used with decoupled projects. More details, visit

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 0
bundle/android/app.android.bundle


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 0
bundle/android/common.android.bundle


BIN=BIN
bundle/android/drawable-mdpi/src_app_resource_images_icon_sign_scan.png


BIN=BIN
bundle/android/drawable-xhdpi/src_app_resource_images_icon_sign_scan.png


BIN=BIN
bundle/android/drawable-xxhdpi/src_app_resource_images_icon_sign_scan.png


+ 4 - 0
bundle/android/hospital.android.bundle

@@ -0,0 +1,4 @@
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]),n=r(d[1]),p=t(r(d[2]));n.AppRegistry.registerComponent(r(d[3]).Apps.Hospital,function(){return p.default})},10000000,[5,3,10000001,491]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Text,{children:"\u4e92\u8054\u7f51\u533b\u9662"}),(0,s.jsx)(n.Button,{title:'\u8fd4\u56de',onPress:function(){(0,r(d[4]).pop)()}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[5]).showMessage)('\u4e92\u8054\u7f51\u533b\u9662\u5f39\u51fatoast','info','common\u5411\u4e0b\u517c\u5bb9')}}),(0,s.jsx)(o.default,{})]})}},10000001,[5,3,503,243,491,502]);
+__r(108);
+__r(10000000);

+ 1 - 0
bundle/android/raw/keep.xml

@@ -0,0 +1 @@
+<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/src_app_resource_images_icon_sign_scan" />

+ 4 - 0
bundle/android/ywq.android.bundle

@@ -0,0 +1,4 @@
+__d(function(g,r,i,a,m,e,d){var n=r(d[0]),t=r(d[1]),p=n(r(d[2]));t.AppRegistry.registerComponent(r(d[3]).Apps.Ywq,function(){return p.default})},10000000,[5,3,10000001,491]);
+__d(function(g,r,i,a,m,e,d){var t=r(d[0]);Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n=r(d[1]),o=t(r(d[2])),s=r(d[3]);var l=n.StyleSheet.create({container:{flex:1}});e.default=function(){var t='dark'===(0,n.useColorScheme)();return(0,s.jsxs)(n.View,{style:l.container,children:[(0,s.jsx)(n.StatusBar,{barStyle:t?'light-content':'dark-content'}),(0,s.jsx)(n.View,{style:{height:100}}),(0,s.jsx)(n.Button,{title:'onConfirm',onPress:function(){}}),(0,s.jsx)(n.View,{style:{height:15}}),(0,s.jsx)(n.Button,{title:'Toast',onPress:function(){(0,r(d[4]).showMessage)('\u533b\u7f51\u7b7e\u5f39\u51fatoast-error','error')}}),(0,s.jsx)(o.default,{})]})}},10000001,[5,3,503,243,502]);
+__r(108);
+__r(10000000);

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
config/bundleCommonInfo.json


+ 7 - 5
package.json

@@ -8,10 +8,10 @@
     "lint": "eslint .",
     "start": "react-native start",
     "test": "jest",
-    "build-android-common": "react-native bundle --platform android --dev false --entry-file src/common/common.ts --bundle-output ./bundle/common.android.bundle --assets-dest ./bundle   --config metro.common.config.js  --minify true --reset-cache",
-    "build-android-app": "react-native bundle --platform android --dev false --entry-file src/app/app.ts --bundle-output ./bundle/app.android.bundle --assets-dest ./bundle   --config metro.main.config.js  --minify true --reset-cache",
-    "build-android-ywq": "react-native bundle --platform android --dev false --entry-file src/ywq/ywq.ts --bundle-output ./bundle/ywq.android.bundle --assets-dest ./bundle   --config metro.main.config.js  --minify true --reset-cache",
-    "build-android-hospital": "react-native bundle --platform android --dev false --entry-file src/hospital/hospital.ts --bundle-output ./bundle/hospital.android.bundle --assets-dest ./bundle   --config metro.main.config.js  --minify true --reset-cache"
+    "build-android-common": "react-native bundle --platform android --dev false --entry-file src/common/common.ts --bundle-output bundle/android/common.android.bundle --assets-dest ./bundle/android   --config metro.common.config.js  --minify true --reset-cache",
+    "build-android-app": "react-native bundle --platform android --dev false --entry-file src/app/app.ts --bundle-output bundle/android/app.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
+    "build-android-ywq": "react-native bundle --platform android --dev false --entry-file src/ywq/ywq.ts --bundle-output ./bundle/android/ywq.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache",
+    "build-android-hospital": "react-native bundle --platform android --dev false --entry-file src/hospital/hospital.ts --bundle-output bundle/android/hospital.android.bundle --assets-dest ./bundle/android   --config metro.main.config.js  --minify true --reset-cache"
   },
   "codegenConfig": {
     "name": "SpecManager",
@@ -27,7 +27,9 @@
     "babel-plugin-module-resolver": "^5.0.2",
     "react": "19.1.0",
     "react-native": "0.80.1",
-    "react-native-storage": "^1.0.1"
+    "react-native-device-info": "^14.0.4",
+    "react-native-storage": "^1.0.1",
+    "react-native-toast-message": "^2.3.3"
   },
   "devDependencies": {
     "@babel/core": "^7.25.2",

+ 34 - 0
src/app/App.tsx

@@ -6,7 +6,9 @@
  */
 
 import {
+  Animated,
   Button,
+  Image,
   StatusBar,
   StyleSheet,
   useColorScheme,
@@ -14,6 +16,10 @@ import {
 } from 'react-native';
 import * as navigation from '@common/NavigationHelper.ts';
 import { Apps } from '@common/NavigationHelper.ts';
+import ScrollView = Animated.ScrollView;
+import TestNativeInfo from '@app/TestNativeInfo';
+import { showMessage } from '@common/ToastHelper.ts';
+import Toast from 'react-native-toast-message';
 
 function App() {
   const isDarkMode = useColorScheme() === 'dark';
@@ -35,6 +41,24 @@ function App() {
           navigation.pushByName(Apps.Ywq, {});
         }}
       />
+      <View style={{ height: 15 }} />
+      <Button
+        title={'Toast'}
+        onPress={() => {
+          showMessage('APP页面弹出toast')
+        }}
+      />
+      <ScrollView style={styles.flatContainer}>
+        <View style={styles.imgView}>
+          <Image
+            resizeMethod="resize"
+            resizeMode="contain"
+            source={require('@app/resource/images/icon_sign_scan.png')}
+          />
+          <TestNativeInfo />
+        </View>
+      </ScrollView>
+      <Toast />
     </View>
   );
 }
@@ -43,6 +67,16 @@ const styles = StyleSheet.create({
   container: {
     flex: 1,
   },
+  imgView: {
+    width: "100%",
+  },
+  img: {
+    width: "100%",
+    height: 600,
+  },
+  flatContainer: {
+    flex: 1,
+  },
 });
 
 export default App;

+ 414 - 0
src/app/TestNativeInfo.js

@@ -0,0 +1,414 @@
+
+import React, {Component, useCallback, memo} from 'react';
+import {
+  ScrollView,
+  StyleSheet,
+  Text,
+  SafeAreaView,
+  View,
+  TouchableOpacity,
+  NativeModules,
+} from 'react-native';
+import DeviceInfo from 'react-native-device-info';
+import {
+  getManufacturer,
+  getManufacturerSync,
+  syncUniqueId,
+  getUniqueId,
+  getUniqueIdSync,
+  useBatteryLevel,
+  useBatteryLevelIsLow,
+  usePowerState,
+  useFirstInstallTime,
+  useDeviceName,
+  useManufacturer,
+  useHasSystemFeature,
+  useIsEmulator,
+  useIsHeadphonesConnected,
+  useBrightness,
+} from 'react-native-device-info';
+
+const FunctionalComponent = () => {
+  const batteryLevel = useBatteryLevel();
+  const batteryLevelIsLow = useBatteryLevelIsLow();
+  const powerState = usePowerState();
+  const firstInstallTime = useFirstInstallTime();
+  const deviceName = useDeviceName();
+  const manufacturer = useManufacturer();
+  const hasSystemFeature = useHasSystemFeature('amazon.hardware.fire_tv');
+  const isEmulator = useIsEmulator();
+  const isHeadphonesConnected = useIsHeadphonesConnected();
+  const brightness = useBrightness();
+  const deviceJSON = {
+    batteryLevel,
+    batteryLevelIsLow,
+    powerState,
+    firstInstallTime,
+    deviceName,
+    manufacturer,
+    hasSystemFeature,
+    isEmulator,
+    isHeadphonesConnected,
+    brightness,
+  };
+
+  return (
+    <ScrollView>
+      <Text style={styles.instructions} testID="hooks tab contents">
+        {JSON.stringify(deviceJSON, null, '  ')}
+      </Text>
+    </ScrollView>
+  );
+};
+
+const ActionExtensionHeader = memo(({isActionExtension}) => {
+  const onDonePress = useCallback(() => {
+    NativeModules.ActionExtension.done();
+  }, []);
+  return isActionExtension ? (
+    <View style={{minHeight: 50, flexDirection: 'row', margin: 10}}>
+      <TouchableOpacity onPress={onDonePress}>
+        <View
+          style={{
+            backgroundColor: 'red',
+            borderRadius: 20,
+            minWidth: 80,
+            minHeight: 40,
+            alignContent: 'center',
+            justifyContent: 'center',
+            alignItems: 'center',
+          }}>
+          <Text>Done</Text>
+        </View>
+      </TouchableOpacity>
+    </View>
+  ) : (
+    <View />
+  );
+});
+
+export default class TestNativeInfo extends Component {
+  constructor(props) {
+    super(props);
+    this.state = {
+      activeTab: 'constant',
+      constantdeviceinfo: this.getConstantDeviceInfo(),
+      asyncdeviceinfo: {},
+      syncdeviceinfo: this.getSyncDeviceInfo(),
+    };
+  }
+
+  getConstantDeviceInfo() {
+    let deviceJSON = {};
+
+    deviceJSON.deviceId = DeviceInfo.getDeviceId();
+    deviceJSON.bundleId = DeviceInfo.getBundleId();
+    deviceJSON.systemName = DeviceInfo.getSystemName();
+    deviceJSON.systemVersion = DeviceInfo.getSystemVersion();
+    deviceJSON.version = DeviceInfo.getVersion();
+    deviceJSON.readableVersion = DeviceInfo.getReadableVersion();
+    deviceJSON.buildNumber = DeviceInfo.getBuildNumber();
+    deviceJSON.isTablet = DeviceInfo.isTablet();
+    deviceJSON.appName = DeviceInfo.getApplicationName();
+    deviceJSON.brand = DeviceInfo.getBrand();
+    deviceJSON.model = DeviceInfo.getModel();
+    deviceJSON.deviceType = DeviceInfo.getDeviceType();
+
+    return deviceJSON;
+  }
+
+  getSyncDeviceInfo() {
+    let deviceJSON = {};
+
+    deviceJSON.uniqueId = getUniqueIdSync();
+    deviceJSON.manufacturer = getManufacturerSync();
+    deviceJSON.buildId = DeviceInfo.getBuildIdSync();
+    deviceJSON.isCameraPresent = DeviceInfo.isCameraPresentSync();
+    deviceJSON.deviceName = DeviceInfo.getDeviceNameSync();
+    deviceJSON.usedMemory = DeviceInfo.getUsedMemorySync();
+    deviceJSON.instanceId = DeviceInfo.getInstanceIdSync();
+    deviceJSON.installReferrer = DeviceInfo.getInstallReferrerSync();
+    deviceJSON.installerPackageName = DeviceInfo.getInstallerPackageNameSync();
+    deviceJSON.isEmulator = DeviceInfo.isEmulatorSync();
+    deviceJSON.fontScale = DeviceInfo.getFontScaleSync();
+    deviceJSON.hasNotch = DeviceInfo.hasNotch();
+    deviceJSON.hasDynamicIsland = DeviceInfo.hasDynamicIsland();
+    deviceJSON.firstInstallTime = DeviceInfo.getFirstInstallTimeSync();
+    deviceJSON.lastUpdateTime = DeviceInfo.getLastUpdateTimeSync();
+    deviceJSON.serialNumber = DeviceInfo.getSerialNumberSync();
+    deviceJSON.androidId = DeviceInfo.getAndroidIdSync();
+    deviceJSON.IpAddress = DeviceInfo.getIpAddressSync();
+    deviceJSON.MacAddress = DeviceInfo.getMacAddressSync(); // needs android.permission.ACCESS_WIFI_STATE
+    deviceJSON.phoneNumber = "DeviceInfo.getPhoneNumberSync()"; // needs android.permission.READ_PHONE_STATE
+    deviceJSON.ApiLevel = DeviceInfo.getApiLevelSync();
+    deviceJSON.carrier = DeviceInfo.getCarrierSync();
+    deviceJSON.totalMemory = DeviceInfo.getTotalMemorySync();
+    deviceJSON.maxMemory = DeviceInfo.getMaxMemorySync();
+    deviceJSON.totalDiskCapacity = DeviceInfo.getTotalDiskCapacitySync();
+    deviceJSON.totalDiskCapacityOld = DeviceInfo.getTotalDiskCapacityOldSync();
+    deviceJSON.freeDiskStorage = DeviceInfo.getFreeDiskStorageSync();
+    deviceJSON.freeDiskStorageOld = DeviceInfo.getFreeDiskStorageOldSync();
+    deviceJSON.batteryLevel = DeviceInfo.getBatteryLevelSync();
+    deviceJSON.isLandscape = DeviceInfo.isLandscapeSync();
+    deviceJSON.isAirplaneMode = DeviceInfo.isAirplaneModeSync();
+    deviceJSON.isBatteryCharging = DeviceInfo.isBatteryChargingSync();
+    deviceJSON.isPinOrFingerprintSet = DeviceInfo.isPinOrFingerprintSetSync();
+    deviceJSON.supportedAbis = DeviceInfo.supportedAbisSync();
+    deviceJSON.hasSystemFeature = DeviceInfo.hasSystemFeatureSync(
+      'android.software.webview',
+    );
+    deviceJSON.getSystemAvailableFeatures = DeviceInfo.getSystemAvailableFeaturesSync();
+    deviceJSON.powerState = DeviceInfo.getPowerStateSync();
+    deviceJSON.isLocationEnabled = DeviceInfo.isLocationEnabledSync();
+    deviceJSON.headphones = DeviceInfo.isHeadphonesConnectedSync();
+    deviceJSON.getAvailableLocationProviders = DeviceInfo.getAvailableLocationProvidersSync();
+    deviceJSON.bootloader = DeviceInfo.getBootloaderSync();
+    deviceJSON.device = DeviceInfo.getDeviceSync();
+    deviceJSON.display = DeviceInfo.getDisplaySync();
+    deviceJSON.fingerprint = DeviceInfo.getFingerprintSync();
+    deviceJSON.hardware = DeviceInfo.getHardwareSync();
+    deviceJSON.host = DeviceInfo.getHostSync();
+    deviceJSON.product = DeviceInfo.getProductSync();
+    deviceJSON.tags = DeviceInfo.getTagsSync();
+    deviceJSON.type = DeviceInfo.getTypeSync();
+    deviceJSON.baseOS = DeviceInfo.getBaseOsSync();
+    deviceJSON.previewSdkInt = DeviceInfo.getPreviewSdkIntSync();
+    deviceJSON.securityPatch = DeviceInfo.getSecurityPatchSync();
+    deviceJSON.codename = DeviceInfo.getCodenameSync();
+    deviceJSON.incremental = DeviceInfo.getIncrementalSync();
+    deviceJSON.brightness = DeviceInfo.getBrightnessSync();
+    deviceJSON.supported32BitAbis = DeviceInfo.supported32BitAbisSync();
+    deviceJSON.supported64BitAbis = DeviceInfo.supported64BitAbisSync();
+    deviceJSON.hasGms = DeviceInfo.hasGmsSync();
+    deviceJSON.hasHms = DeviceInfo.hasHmsSync();
+    deviceJSON.isMouseConnected = DeviceInfo.isMouseConnectedSync();
+    deviceJSON.isKeyboardConnected = DeviceInfo.isKeyboardConnectedSync();
+
+    return deviceJSON;
+  }
+
+  async componentDidMount() {
+    let deviceJSON = {};
+
+    try {
+      deviceJSON.uniqueId = await getUniqueId();
+      deviceJSON.syncUniqueId = await syncUniqueId();
+      deviceJSON.manufacturer = await getManufacturer();
+      deviceJSON.buildId = await DeviceInfo.getBuildId();
+      deviceJSON.isCameraPresent = await DeviceInfo.isCameraPresent();
+      deviceJSON.deviceName = await DeviceInfo.getDeviceName();
+      deviceJSON.usedMemory = await DeviceInfo.getUsedMemory();
+      deviceJSON.userAgent = await DeviceInfo.getUserAgent();
+      deviceJSON.instanceId = await DeviceInfo.getInstanceId();
+      deviceJSON.installReferrer = await DeviceInfo.getInstallReferrer();
+      deviceJSON.installerPackageName = await DeviceInfo.getInstallerPackageName();
+      deviceJSON.isEmulator = await DeviceInfo.isEmulator();
+      deviceJSON.fontScale = await DeviceInfo.getFontScale();
+      deviceJSON.hasNotch = await DeviceInfo.hasNotch();
+      deviceJSON.hasDynamicIsland = await DeviceInfo.hasDynamicIsland();
+      deviceJSON.firstInstallTime = await DeviceInfo.getFirstInstallTime();
+      deviceJSON.lastUpdateTime = await DeviceInfo.getLastUpdateTime();
+      deviceJSON.serialNumber = await DeviceInfo.getSerialNumber();
+      deviceJSON.androidId = await DeviceInfo.getAndroidId();
+      deviceJSON.IpAddress = await DeviceInfo.getIpAddress();
+      deviceJSON.MacAddress = await DeviceInfo.getMacAddress(); // needs android.permission.ACCESS_WIFI_STATE
+      deviceJSON.phoneNumber = "await DeviceInfo.getPhoneNumber()"; // needs android.permission.READ_PHONE_STATE
+      deviceJSON.ApiLevel = await DeviceInfo.getApiLevel();
+      deviceJSON.carrier = await DeviceInfo.getCarrier();
+      deviceJSON.totalMemory = await DeviceInfo.getTotalMemory();
+      deviceJSON.maxMemory = await DeviceInfo.getMaxMemory();
+      deviceJSON.totalDiskCapacity = await DeviceInfo.getTotalDiskCapacity();
+      deviceJSON.totalDiskCapacityOld = await DeviceInfo.getTotalDiskCapacityOld();
+      deviceJSON.freeDiskStorage = await DeviceInfo.getFreeDiskStorage();
+      deviceJSON.freeDiskStorageOld = await DeviceInfo.getFreeDiskStorageOld();
+      deviceJSON.batteryLevel = await DeviceInfo.getBatteryLevel();
+      deviceJSON.isLandscape = await DeviceInfo.isLandscape();
+      deviceJSON.isAirplaneMode = await DeviceInfo.isAirplaneMode();
+      deviceJSON.isBatteryCharging = await DeviceInfo.isBatteryCharging();
+      deviceJSON.isPinOrFingerprintSet = await DeviceInfo.isPinOrFingerprintSet();
+      deviceJSON.supportedAbis = await DeviceInfo.supportedAbis();
+      deviceJSON.hasSystemFeature = await DeviceInfo.hasSystemFeature(
+        'android.software.webview',
+      );
+      deviceJSON.getSystemAvailableFeatures = await DeviceInfo.getSystemAvailableFeatures();
+      deviceJSON.powerState = await DeviceInfo.getPowerState();
+      deviceJSON.isLocationEnabled = await DeviceInfo.isLocationEnabled();
+      deviceJSON.headphones = await DeviceInfo.isHeadphonesConnected();
+      deviceJSON.getAvailableLocationProviders = await DeviceInfo.getAvailableLocationProviders();
+      deviceJSON.bootloader = await DeviceInfo.getBootloader();
+      deviceJSON.device = await DeviceInfo.getDevice();
+      deviceJSON.display = await DeviceInfo.getDisplay();
+      deviceJSON.fingerprint = await DeviceInfo.getFingerprint();
+      deviceJSON.hardware = await DeviceInfo.getHardware();
+      deviceJSON.host = await DeviceInfo.getHost();
+      deviceJSON.product = await DeviceInfo.getProduct();
+      deviceJSON.tags = await DeviceInfo.getTags();
+      deviceJSON.type = await DeviceInfo.getType();
+      deviceJSON.baseOS = await DeviceInfo.getBaseOs();
+      deviceJSON.previewSdkInt = await DeviceInfo.getPreviewSdkInt();
+      deviceJSON.securityPatch = await DeviceInfo.getSecurityPatch();
+      deviceJSON.codename = await DeviceInfo.getCodename();
+      deviceJSON.incremental = await DeviceInfo.getIncremental();
+      deviceJSON.brightness = await DeviceInfo.getBrightness();
+      deviceJSON.supported32BitAbis = await DeviceInfo.supported32BitAbis();
+      deviceJSON.supported64BitAbis = await DeviceInfo.supported64BitAbis();
+      deviceJSON.hasGms = await DeviceInfo.hasGms();
+      deviceJSON.hasHms = await DeviceInfo.hasHms();
+      deviceJSON.synchronizedUniqueId = await DeviceInfo.syncUniqueId();
+      deviceJSON.isMouseConnected = await DeviceInfo.isMouseConnected();
+      deviceJSON.isKeyboardConnected = await DeviceInfo.isKeyboardConnected();
+      deviceJSON.isTabletMode = await DeviceInfo.isTabletMode();
+      try {
+        deviceJSON.deviceToken = await DeviceInfo.getDeviceToken();
+      } catch (e) {
+        console.log(
+          'Trouble getting device token, likely a simulator or not iOS11+',
+        );
+      }
+    } catch (e) {
+      console.log('Trouble getting device info ', e);
+    }
+    // eslint-disable-next-line react/no-did-mount-set-state
+    this.setState({asyncdeviceinfo: deviceJSON});
+    this.forceUpdate();
+  }
+
+  render() {
+    return (
+      <SafeAreaView style={styles.container}>
+        <ActionExtensionHeader
+          isActionExtension={this.props.isActionExtension}
+        />
+        {this.state.activeTab === 'constant' ? (
+          <>
+            <Text style={styles.welcome}>
+              react-native-device-info example - constant info:
+            </Text>
+            <ScrollView>
+              <Text style={styles.instructions} testID="constant tab contents">
+                {JSON.stringify(this.state.constantdeviceinfo, null, '  ')}
+              </Text>
+            </ScrollView>
+          </>
+        ) : this.state.activeTab === 'sync' ? (
+          <>
+            <Text style={styles.welcome}>
+              react-native-device-info example - sync info:
+            </Text>
+            <ScrollView>
+              <Text style={styles.instructions} testID="sync tab contents">
+                {JSON.stringify(this.state.syncdeviceinfo, null, '  ')}
+              </Text>
+            </ScrollView>
+          </>
+        ) : this.state.activeTab === 'async' ? (
+          <>
+            <Text style={styles.welcome}>
+              react-native-device-info example - async info:
+            </Text>
+            <ScrollView>
+              <Text style={styles.instructions} testID="async tab contents">
+                {JSON.stringify(this.state.asyncdeviceinfo, null, '  ')}
+              </Text>
+            </ScrollView>
+          </>
+        ) : this.state.activeTab === 'hooks' ? (
+          <>
+            <Text style={styles.welcome}>
+              react-native-device-info example - hooks:
+            </Text>
+            <FunctionalComponent />
+          </>
+        ) : null}
+
+        <View style={styles.tabBar}>
+          <TouchableOpacity
+            style={styles.tab}
+            testID="constant button"
+            onPress={() => this.setState({activeTab: 'constant'})}>
+            <Text
+              style={[
+                styles.tabText,
+                this.state.activeTab === 'constant' && styles.boldText,
+              ]}>
+              Constant
+            </Text>
+          </TouchableOpacity>
+
+          <TouchableOpacity
+            style={styles.tab}
+            testID="sync button"
+            onPress={() => this.setState({activeTab: 'sync'})}>
+            <Text
+              style={[
+                styles.tabText,
+                this.state.activeTab === 'sync' && styles.boldText,
+              ]}>
+              Sync
+            </Text>
+          </TouchableOpacity>
+
+          <TouchableOpacity
+            style={styles.tab}
+            testID="async button"
+            onPress={() => this.setState({activeTab: 'async'})}>
+            <Text
+              style={[
+                styles.tabText,
+                this.state.activeTab === 'async' && styles.boldText,
+              ]}>
+              Async
+            </Text>
+          </TouchableOpacity>
+
+          <TouchableOpacity
+            style={styles.tab}
+            testID="hooks button"
+            onPress={() => this.setState({activeTab: 'hooks'})}>
+            <Text
+              style={[
+                styles.tabText,
+                this.state.activeTab === 'hooks' && styles.boldText,
+              ]}>
+              Hooks
+            </Text>
+          </TouchableOpacity>
+        </View>
+      </SafeAreaView>
+    );
+  }
+}
+
+const styles = StyleSheet.create({
+  container: {
+    flex: 1,
+    backgroundColor: '#F5FCFF',
+  },
+  welcome: {
+    fontSize: 20,
+    textAlign: 'center',
+    margin: 10,
+  },
+  instructions: {
+    textAlign: 'left',
+    color: '#333333',
+    margin: 5,
+  },
+  tabBar: {
+    flexDirection: 'row',
+    borderTopColor: '#333333',
+    borderTopWidth: 1,
+  },
+  tab: {
+    height: 50,
+    flex: 1,
+    alignItems: 'center',
+    justifyContent: 'center',
+  },
+  tabText: {
+    color: '#333333',
+  },
+  boldText: {
+    fontWeight: '700',
+  },
+});

BIN=BIN
src/app/resource/images/icon_sign_scan.png


BIN=BIN
src/app/resource/images/icon_sign_scan@2x.png


BIN=BIN
src/app/resource/images/icon_sign_scan@3x.png


+ 10 - 0
src/common/ToastHelper.ts

@@ -0,0 +1,10 @@
+import Toast from 'react-native-toast-message';
+import { ToastType } from 'react-native-toast-message/lib/src/types';
+
+export const showMessage = (message: string, type?: ToastType, message2?: string) => {
+  Toast.show({
+    type: type??'success',
+    text1: message,
+    text2: message2,
+  });
+};

+ 2 - 1
src/common/common.ts

@@ -1,3 +1,4 @@
 import  'react';
 import  'react-native';
-import  './NavigationHelper';
+import  '@common/NavigationHelper';
+import  '@common/ToastHelper.ts';

+ 10 - 0
src/hospital/Hospital.tsx

@@ -14,6 +14,8 @@ import {
   View,
 } from 'react-native';
 import { pop } from '../common/NavigationHelper.ts';
+import { showMessage } from '@common/ToastHelper.ts';
+import Toast from 'react-native-toast-message';
 
 function Hospital() {
   const isDarkMode = useColorScheme() === 'dark';
@@ -29,6 +31,14 @@ function Hospital() {
           pop();
         }}
       />
+      <View style={{ height: 15 }} />
+      <Button
+        title={'Toast'}
+        onPress={() => {
+          showMessage('互联网医院弹出toast', 'info', 'common向下兼容');
+        }}
+      />
+      <Toast />
     </View>
   );
 }

+ 10 - 0
src/ywq/Ywq.tsx

@@ -12,6 +12,8 @@ import {
   useColorScheme,
   View,
 } from 'react-native';
+import { showMessage } from '@common/ToastHelper.ts';
+import Toast from 'react-native-toast-message';
 
 function App() {
   const isDarkMode = useColorScheme() === 'dark';
@@ -21,6 +23,14 @@ function App() {
       <StatusBar barStyle={isDarkMode ? 'light-content' : 'dark-content'} />
       <View style={{ height: 100 }} />
       <Button title={'onConfirm'} onPress={() => {}} />
+      <View style={{ height: 15 }} />
+      <Button
+        title={'Toast'}
+        onPress={() => {
+          showMessage('医网签弹出toast-error', 'error');
+        }}
+      />
+      <Toast />
     </View>
   );
 }

+ 10 - 0
yarn.lock

@@ -5730,6 +5730,11 @@ react-is@^19.1.0:
   resolved "https://nexus-inner.51trust.com/repository/npm/react-is/-/react-is-19.1.0.tgz"
   integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
 
+react-native-device-info@^14.0.4:
+  version "14.0.4"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-device-info/-/react-native-device-info-14.0.4.tgz#56b24ace9ff29a66bdfc667209086421ed6cfdce"
+  integrity sha512-NX0wMAknSDBeFnEnSFQ8kkAcQrFHrG4Cl0mVjoD+0++iaKrOupiGpBXqs8xR0SeJyPC5zpdPl4h/SaBGly6UxA==
+
 react-native-storage@^1.0.1:
   version "1.0.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/react-native-storage/-/react-native-storage-1.0.1.tgz"
@@ -5738,6 +5743,11 @@ react-native-storage@^1.0.1:
     opencollective "^1.0.3"
     opencollective-postinstall "^2.0.2"
 
+react-native-toast-message@^2.3.3:
+  version "2.3.3"
+  resolved "https://nexus-inner.51trust.com/repository/npm/react-native-toast-message/-/react-native-toast-message-2.3.3.tgz#e301508d386a9902ff6b4559ecc6674f8cfdf97a"
+  integrity sha512-4IIUHwUPvKHu4gjD0Vj2aGQzqPATiblL1ey8tOqsxOWRPGGu52iIbL8M/mCz4uyqecvPdIcMY38AfwRuUADfQQ==
+
 react-native@0.80.1:
   version "0.80.1"
   resolved "https://nexus-inner.51trust.com/repository/npm/react-native/-/react-native-0.80.1.tgz"

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio