react-native-pushy适配harmony (#461)
* init * update * udpate * update * update * update * add pushy build time logic
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -50,3 +50,4 @@ Example/testHotUpdate/.yarn | ||||
| android/bin | ||||
| Example/testHotUpdate/harmony | ||||
| Example/testHotUpdate/android/app/.cxx | ||||
| Example/harmony_use_pushy/libs | ||||
|   | ||||
							
								
								
									
										6
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -4,3 +4,9 @@ | ||||
| [submodule "android/jni/HDiffPatch"] | ||||
| 	path = android/jni/HDiffPatch | ||||
| 	url = https://github.com/sisong/HDiffPatch.git | ||||
| [submodule "harmony/src/main/cpp/HDiffPatch"] | ||||
| 	path = harmony/src/main/cpp/HDiffPatch | ||||
| 	url = https://github.com/sisong/HDiffPatch.git | ||||
| [submodule "harmony/src/main/cpp/lzma"] | ||||
| 	path = harmony/src/main/cpp/lzma | ||||
| 	url = https://github.com/sisong/lzma.git | ||||
|   | ||||
							
								
								
									
										2
									
								
								Example/harmony_use_pushy/.bundle/config
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,2 @@ | ||||
| BUNDLE_PATH: "vendor/bundle" | ||||
| BUNDLE_FORCE_RUBY_PLATFORM: 1 | ||||
							
								
								
									
										4
									
								
								Example/harmony_use_pushy/.eslintrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| module.exports = { | ||||
|   root: true, | ||||
|   extends: '@react-native', | ||||
| }; | ||||
							
								
								
									
										7
									
								
								Example/harmony_use_pushy/.prettierrc.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,7 @@ | ||||
| module.exports = { | ||||
|   arrowParens: 'avoid', | ||||
|   bracketSameLine: true, | ||||
|   bracketSpacing: false, | ||||
|   singleQuote: true, | ||||
|   trailingComma: 'all', | ||||
| }; | ||||
							
								
								
									
										1
									
								
								Example/harmony_use_pushy/.watchmanconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| {} | ||||
							
								
								
									
										221
									
								
								Example/harmony_use_pushy/App.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,221 @@ | ||||
| /* eslint-disable react/no-unstable-nested-components */ | ||||
| /* eslint-disable react-native/no-inline-styles */ | ||||
| import React, {useState} from 'react'; | ||||
| import {StyleSheet, Text, View, TouchableOpacity, Image} from 'react-native'; | ||||
|  | ||||
| import TestConsole from './TestConsole'; | ||||
|  | ||||
| import _updateConfig from './update.json'; | ||||
| import {PushyProvider, Pushy, usePushy} from 'react-native-update'; | ||||
| const {appKey} = _updateConfig.harmony; | ||||
|  | ||||
| function App() { | ||||
|   const { | ||||
|     client, | ||||
|     checkUpdate, | ||||
|     downloadUpdate, | ||||
|     switchVersionLater, | ||||
|     switchVersion, | ||||
|     updateInfo, | ||||
|     packageVersion, | ||||
|     currentHash, | ||||
|     progress: {received, total} = {}, | ||||
|   } = usePushy(); | ||||
|   const [useDefaultAlert, setUseDefaultAlert] = useState(false); | ||||
|   const [showTestConsole, setShowTestConsole] = useState(false); | ||||
|   const [showUpdateBanner, setShowUpdateBanner] = useState(false); | ||||
|   const [showUpdateSnackbar, setShowUpdateSnackbar] = useState(false); | ||||
|   // if (updateInfo) { | ||||
|   //   updateInfo!.name = 'name'; | ||||
|   //   updateInfo!.update = true; | ||||
|   // } | ||||
|   const snackbarVisible = | ||||
|     !useDefaultAlert && showUpdateSnackbar && updateInfo?.update; | ||||
|  | ||||
|   if (showTestConsole) { | ||||
|     return ( | ||||
|       <TestConsole visible={true} onClose={() => setShowTestConsole(false)} /> | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <View style={styles.container}> | ||||
|       <Text style={styles.welcome}>欢迎使用Pushy热更新服务</Text> | ||||
|       {/* <Text style={styles.welcome}>😁hdiffFromAPP更新成功!!!</Text> */} | ||||
|       {/* <Text style={styles.welcome}>😁hdiffFromPPk更新成功!!!</Text> */} | ||||
|       <View style={{flexDirection: 'row'}}> | ||||
|         <TouchableOpacity | ||||
|           onPress={() => { | ||||
|             client?.setOptions({ | ||||
|               updateStrategy: !useDefaultAlert ? null : 'alwaysAlert', | ||||
|             }); | ||||
|             setShowUpdateSnackbar(useDefaultAlert); | ||||
|             setUseDefaultAlert(!useDefaultAlert); | ||||
|           }} | ||||
|           style={{ | ||||
|             flexDirection: 'row', | ||||
|             alignItems: 'center', | ||||
|           }}> | ||||
|           <View | ||||
|             style={{ | ||||
|               width: 20, | ||||
|               height: 20, | ||||
|               borderWidth: 1, | ||||
|               borderColor: '#999', | ||||
|               backgroundColor: useDefaultAlert ? 'blue' : 'white', | ||||
|               justifyContent: 'center', | ||||
|               alignItems: 'center', | ||||
|             }}> | ||||
|             {useDefaultAlert && <Text style={{color: 'white'}}>✓</Text>} | ||||
|           </View> | ||||
|           <Text style={{marginLeft: 8}}> | ||||
|             {' '} | ||||
|             {useDefaultAlert ? '当前使用' : '当前不使用'}默认的alert更新提示 | ||||
|           </Text> | ||||
|         </TouchableOpacity> | ||||
|       </View> | ||||
|       <Image | ||||
|         resizeMode={'contain'} | ||||
|         source={require('./assets/shezhi.png')} | ||||
|         style={styles.image} | ||||
|       /> | ||||
|       <Text style={styles.instructions}> | ||||
|         这是版本一 {'\n'} | ||||
|         当前原生包版本号: {packageVersion} | ||||
|         {'\n'} | ||||
|         当前热更新版本Hash: {currentHash || '(空)'} | ||||
|         {'\n'} | ||||
|       </Text> | ||||
|       <Text> | ||||
|         下载进度:{received} / {total} | ||||
|       </Text> | ||||
|       <TouchableOpacity | ||||
|         onPress={() => { | ||||
|           checkUpdate(); | ||||
|           setShowUpdateSnackbar(true); | ||||
|         }}> | ||||
|         <Text style={styles.instructions}>点击这里检查更新</Text> | ||||
|       </TouchableOpacity> | ||||
|  | ||||
|       <TouchableOpacity | ||||
|         testID="testcase" | ||||
|         style={{marginTop: 15}} | ||||
|         onPress={() => { | ||||
|           setShowTestConsole(true); | ||||
|         }}> | ||||
|         <Text style={styles.instructions}> | ||||
|           react-native-update版本:{client?.version} | ||||
|         </Text> | ||||
|       </TouchableOpacity> | ||||
|       {snackbarVisible && ( | ||||
|         <View style={styles.overlay}> | ||||
|           <View | ||||
|             style={{ | ||||
|               width: '100%', | ||||
|               backgroundColor: '#333', | ||||
|               padding: 16, | ||||
|               flexDirection: 'row', | ||||
|               justifyContent: 'space-between', | ||||
|               alignItems: 'center', | ||||
|             }}> | ||||
|             <Text style={{color: 'white'}}> | ||||
|               有新版本({updateInfo.name})可用,是否更新? | ||||
|             </Text> | ||||
|             <View style={{flexDirection: 'row'}}> | ||||
|               <TouchableOpacity | ||||
|                 onPress={() => setShowUpdateSnackbar(false)} | ||||
|                 style={{marginRight: 10}}> | ||||
|                 <Text style={{color: 'white'}}>取消</Text> | ||||
|               </TouchableOpacity> | ||||
|               <TouchableOpacity | ||||
|                 onPress={async () => { | ||||
|                   setShowUpdateSnackbar(false); | ||||
|                   await downloadUpdate(); | ||||
|                   setShowUpdateBanner(true); | ||||
|                 }}> | ||||
|                 <Text style={{color: '#2196F3'}}>更新</Text> | ||||
|               </TouchableOpacity> | ||||
|             </View> | ||||
|           </View> | ||||
|         </View> | ||||
|       )} | ||||
|       {showUpdateBanner && ( | ||||
|         <View style={styles.overlay}> | ||||
|           <View | ||||
|             style={{ | ||||
|               width: '100%', | ||||
|               backgroundColor: '#fff', | ||||
|               padding: 16, | ||||
|               borderBottomWidth: 1, | ||||
|               borderBottomColor: '#eee', | ||||
|             }}> | ||||
|             <View style={{flexDirection: 'row', alignItems: 'center'}}> | ||||
|               <Text>更新已完成,是否立即重启?</Text> | ||||
|             </View> | ||||
|             <View | ||||
|               style={{ | ||||
|                 flexDirection: 'row', | ||||
|                 justifyContent: 'flex-end', | ||||
|                 marginTop: 10, | ||||
|               }}> | ||||
|               <TouchableOpacity | ||||
|                 onPress={() => { | ||||
|                   switchVersionLater(); | ||||
|                   setShowUpdateBanner(false); | ||||
|                 }} | ||||
|                 style={{marginRight: 20}}> | ||||
|                 <Text style={{color: '#2196F3'}}>下次再说</Text> | ||||
|               </TouchableOpacity> | ||||
|               <TouchableOpacity onPress={switchVersion}> | ||||
|                 <Text style={{color: '#2196F3'}}>立即重启</Text> | ||||
|               </TouchableOpacity> | ||||
|             </View> | ||||
|           </View> | ||||
|         </View> | ||||
|       )} | ||||
|     </View> | ||||
|   ); | ||||
| } | ||||
|  | ||||
| const styles = StyleSheet.create({ | ||||
|   overlay: { | ||||
|     position: 'absolute', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     right: 0, | ||||
|     bottom: 0, | ||||
|     backgroundColor: 'rgba(0, 0, 0, 0.5)', | ||||
|     justifyContent: 'center', | ||||
|     alignItems: 'center', | ||||
|   }, | ||||
|   container: { | ||||
|     flex: 1, | ||||
|     justifyContent: 'center', | ||||
|     alignItems: 'center', | ||||
|     backgroundColor: '#F5FCFF', | ||||
|   }, | ||||
|   welcome: { | ||||
|     fontSize: 20, | ||||
|     textAlign: 'center', | ||||
|     margin: 10, | ||||
|   }, | ||||
|   instructions: { | ||||
|     textAlign: 'center', | ||||
|     color: '#333333', | ||||
|     marginBottom: 5, | ||||
|   }, | ||||
|   image: {}, | ||||
| }); | ||||
|  | ||||
| const pushyClient = new Pushy({ | ||||
|   appKey, | ||||
|   debug: true, | ||||
| }); | ||||
|  | ||||
| export default function Root() { | ||||
|   return ( | ||||
|     <PushyProvider client={pushyClient}> | ||||
|       <App /> | ||||
|     </PushyProvider> | ||||
|   ); | ||||
| } | ||||
							
								
								
									
										6
									
								
								Example/harmony_use_pushy/Gemfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| source 'https://rubygems.org' | ||||
|  | ||||
| # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version | ||||
| ruby ">= 2.6.10" | ||||
|  | ||||
| gem 'cocoapods', '~> 1.12' | ||||
							
								
								
									
										34
									
								
								Example/harmony_use_pushy/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,34 @@ | ||||
| ## 运行harmony_use_pushy项目步骤 | ||||
|  | ||||
| ### 1.将项目克隆到本地后在项目根目录创建libs文件夹。 | ||||
|  | ||||
| ### 2.然后将[`rnoh`](https://github.com/bozaigao/rnoh)克隆到libs文件夹中。 | ||||
|  | ||||
| 说明:rnoh项目基于react-native 0.72.5版本适配,如果使用最新的RN版本可能会报错,项目适配RN新版本请关注[`gitee仓库`](https://gitee.com/openharmony-sig/ohos_react_native/tree/0.72.5-ohos-5.0-release/tester/harmony/react_native_openharmony/src/main) | ||||
|  | ||||
| ### 3.进入rnoh项目执行下面命令对rnoh项目依赖的C++库进行初始化; | ||||
| ``` | ||||
| git submodule update --init --recursive | ||||
| ``` | ||||
|  | ||||
| ### 4. 确保在react-native-update根目录已经执行过yarn submodule命令。 | ||||
| 说明:这个命令会在harmony/src/main/cpp目录生成HDiffPatch和lzma的C++模块依赖。 | ||||
|  | ||||
| ### 5. 在项目根目录执行下面命令安装第三方依赖。 | ||||
| ``` | ||||
| yarn install | ||||
| ``` | ||||
|  | ||||
| ### 6. 在项目根目录执行下面命令生成bundle包文件。 | ||||
| ``` | ||||
| yarn build | ||||
| ``` | ||||
| 说明:这个命令会在harmony/entry/src/main/resources/rawfile目录生成Hbundle.harmony.js和assets文件,同时会基于该内容在.pushy/output目录生成ppk包。 | ||||
|  | ||||
| **注意⚠️**:在使用pushy bundle --platform harmony命令进行打包的默认bundle包名是Hbundle.harmony.js,不要随意修改包名,因为diff是匹配该包名进行生成的。 | ||||
|  | ||||
| ### 7. 使用DevEco Studio IDE打开harmony目录然后执行sync运行项目 | ||||
|  | ||||
|  | ||||
| ### 8 运行效果图 | ||||
|  | ||||
							
								
								
									
										274
									
								
								Example/harmony_use_pushy/TestConsole.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,274 @@ | ||||
| /* eslint-disable react-native/no-inline-styles */ | ||||
| /* eslint-disable react/react-in-jsx-scope */ | ||||
| import {useCallback, useMemo, useState} from 'react'; | ||||
| import { | ||||
|   ActivityIndicator, | ||||
|   TextInput, | ||||
|   Button, | ||||
|   StyleSheet, | ||||
|   SafeAreaView, | ||||
|   Text, | ||||
|   View, | ||||
|   TouchableOpacity, | ||||
| } from 'react-native'; | ||||
|  | ||||
| import {PushyModule} from 'react-native-update'; | ||||
| const Hash = '9D5CE6EBA420717BE7E7D308B11F8207681B066C951D68F3994D19828F342474'; | ||||
| const UUID = '00000000-0000-0000-0000-000000000000'; | ||||
| const DownloadUrl = 'https://localhost:3000/diff.ppk-patch'; | ||||
| const AppPatchDownloadUrl = 'https://github.com/bozaigao/test_pushy_server/raw/refs/heads/main/hdiff.app-patch'; | ||||
| const AppPatchHash = 'f5ba92c7c04250d4b8a446c8267ef459'; | ||||
| const PPKDownloadUrl = 'https://github.com/bozaigao/test_pushy_server/raw/refs/heads/main/hdiff.ppk-patch'; | ||||
| const PPKPatchHash = '6b3d26b7d868d1f67aedadb7f0b342d9'; | ||||
| const OriginHash = 'f5ba92c7c04250d4b8a446c8267ef459'; | ||||
|  | ||||
|  | ||||
| const CustomDialog = ({title, visible, onConfirm}) => { | ||||
|   if (!visible) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <View style={styles.overlay}> | ||||
|       <View style={styles.dialog}> | ||||
|         <Text style={styles.title}>{title}</Text> | ||||
|         <TouchableOpacity | ||||
|           testID="done" | ||||
|           style={styles.button} | ||||
|           onPress={onConfirm}> | ||||
|           <Text style={styles.buttonText}>确认</Text> | ||||
|         </TouchableOpacity> | ||||
|       </View> | ||||
|     </View> | ||||
|   ); | ||||
| }; | ||||
| export default function TestConsole({visible, onClose}) { | ||||
|   const [text, setText] = useState(''); | ||||
|   const [running, setRunning] = useState(false); | ||||
|   const [options, setOptions] = useState(); | ||||
|   const [alertVisible, setAlertVisible] = useState(false); | ||||
|   const [alertMsg, setAlertMsg] = useState(''); | ||||
|   const NativeTestMethod = useMemo(() => { | ||||
|     return [ | ||||
|       { | ||||
|         name: 'setLocalHashInfo', | ||||
|         invoke: () => { | ||||
|           setText( | ||||
|             `setLocalHashInfo\n${Hash}\n{\"version\":\"1.0.0\",\"size\":\"19M\"}`, | ||||
|           ); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'getLocalHashInfo', | ||||
|         invoke: () => { | ||||
|           setText(`getLocalHashInfo\n${Hash}`); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'setUuid', | ||||
|         invoke: () => { | ||||
|           setText(`setUuid\n${UUID}`); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'reloadUpdate', | ||||
|         invoke: () => { | ||||
|           setText('reloadUpdate'); | ||||
|           setOptions({hash: Hash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'setNeedUpdateForApp', | ||||
|         invoke: () => { | ||||
|           setText('setNeedUpdate'); | ||||
|           setOptions({hash: AppPatchHash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'setNeedUpdateForPPK', | ||||
|         invoke: () => { | ||||
|           setText('setNeedUpdate'); | ||||
|           setOptions({hash: PPKPatchHash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'markSuccess', | ||||
|         invoke: () => { | ||||
|           setText('markSuccess'); | ||||
|           setOptions(undefined); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'downloadPatchFromPpk', | ||||
|         invoke: () => { | ||||
|           setText('downloadPatchFromPpk'); | ||||
|           setOptions({updateUrl: PPKDownloadUrl, hash: PPKPatchHash, originHash: OriginHash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'downloadPatchFromPackage', | ||||
|         invoke: () => { | ||||
|           setText('downloadPatchFromPackage'); | ||||
|           setOptions({updateUrl: AppPatchDownloadUrl, hash: AppPatchHash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'downloadFullUpdate', | ||||
|         invoke: () => { | ||||
|           setText('downloadFullUpdate'); | ||||
|           setOptions({updateUrl: DownloadUrl, hash: Hash}); | ||||
|         }, | ||||
|       }, | ||||
|       { | ||||
|         name: 'downloadAndInstallApk', | ||||
|         invoke: () => { | ||||
|           setText('downloadAndInstallApk'); | ||||
|           setOptions({url: DownloadUrl, target: Hash, hash: Hash}); | ||||
|         }, | ||||
|       }, | ||||
|     ]; | ||||
|   }, []); | ||||
|  | ||||
|   const renderTestView = useCallback(() => { | ||||
|     const views = []; | ||||
|     for (let i = 0; i < NativeTestMethod.length; i++) { | ||||
|       views.push( | ||||
|         <TouchableOpacity | ||||
|           key={i} | ||||
|           testID={NativeTestMethod[i].name} | ||||
|           onPress={() => { | ||||
|             NativeTestMethod[i].invoke(); | ||||
|           }}> | ||||
|           <Text>{NativeTestMethod[i].name}</Text> | ||||
|         </TouchableOpacity>, | ||||
|       ); | ||||
|     } | ||||
|     return <View>{views}</View>; | ||||
|   }, [NativeTestMethod]); | ||||
|   if (!visible) { | ||||
|     return null; | ||||
|   } | ||||
|  | ||||
|   return ( | ||||
|     <SafeAreaView style={{flex: 1, padding: 10}}> | ||||
|       <View | ||||
|         style={{ | ||||
|           flexDirection: 'row', | ||||
|           alignItems: 'center', | ||||
|           justifyContent: 'space-between', | ||||
|           padding: 10, | ||||
|         }}> | ||||
|         <Text>调试Pushy方法(方法名,参数,值换行)</Text> | ||||
|         <Button title="关闭" onPress={() => onClose()} /> | ||||
|       </View> | ||||
|       <TextInput | ||||
|         autoCorrect={false} | ||||
|         autoCapitalize="none" | ||||
|         style={{ | ||||
|           borderWidth: StyleSheet.hairlineWidth * 4, | ||||
|           borderColor: 'black', | ||||
|           height: '30%', | ||||
|           marginTop: 20, | ||||
|           marginBottom: 20, | ||||
|           padding: 10, | ||||
|           fontSize: 20, | ||||
|         }} | ||||
|         textAlignVertical="top" | ||||
|         multiline={true} | ||||
|         value={text} | ||||
|         onChangeText={setText} | ||||
|       /> | ||||
|       {running && <ActivityIndicator />} | ||||
|       <TouchableOpacity | ||||
|         style={{ | ||||
|           backgroundColor: 'rgb(0,140,237)', | ||||
|           justifyContent: 'center', | ||||
|           alignItems: 'center', | ||||
|           paddingTop: 10, | ||||
|           paddingBottom: 10, | ||||
|           marginBottom: 5, | ||||
|         }} | ||||
|         testID="submit" | ||||
|         onPress={async () => { | ||||
|           setRunning(true); | ||||
|           try { | ||||
|             const inputs = text.split('\n'); | ||||
|             const methodName = inputs[0]; | ||||
|             let params = []; | ||||
|             if (inputs.length === 1) { | ||||
|               if (options) { | ||||
|                 await PushyModule[methodName](options); | ||||
|               } else { | ||||
|                 await PushyModule[methodName](); | ||||
|               } | ||||
|             } else { | ||||
|               if (inputs.length === 2) { | ||||
|                 params = [inputs[1]]; | ||||
|               } else { | ||||
|                 params = [inputs[1], inputs[2]]; | ||||
|                 console.log({inputs, params}); | ||||
|               } | ||||
|               await PushyModule[methodName](...params); | ||||
|             } | ||||
|             setAlertVisible(true); | ||||
|             setAlertMsg('done'); | ||||
|           } catch (e) { | ||||
|             setAlertVisible(true); | ||||
|             setAlertMsg(e.message); | ||||
|           } | ||||
|           setRunning(false); | ||||
|         }}> | ||||
|         <Text style={{color: 'white'}}>执行</Text> | ||||
|       </TouchableOpacity> | ||||
|       <Button title="重置" onPress={() => setText('')} /> | ||||
|       {renderTestView()} | ||||
|       <CustomDialog | ||||
|         title={alertMsg} | ||||
|         visible={alertVisible} | ||||
|         onConfirm={() => { | ||||
|           setAlertVisible(false); | ||||
|         }} | ||||
|       /> | ||||
|     </SafeAreaView> | ||||
|   ); | ||||
| } | ||||
|  | ||||
| const styles = StyleSheet.create({ | ||||
|   container: { | ||||
|     flex: 1, | ||||
|     justifyContent: 'center', | ||||
|     alignItems: 'center', | ||||
|   }, | ||||
|   overlay: { | ||||
|     position: 'absolute', | ||||
|     top: 0, | ||||
|     left: 0, | ||||
|     right: 0, | ||||
|     bottom: 0, | ||||
|     backgroundColor: 'rgba(0, 0, 0, 0.5)', | ||||
|     justifyContent: 'center', | ||||
|     alignItems: 'center', | ||||
|   }, | ||||
|   dialog: { | ||||
|     backgroundColor: 'white', | ||||
|     borderRadius: 10, | ||||
|     padding: 20, | ||||
|     width: '80%', | ||||
|     alignItems: 'center', | ||||
|   }, | ||||
|   title: { | ||||
|     fontSize: 18, | ||||
|     fontWeight: 'bold', | ||||
|     marginBottom: 20, | ||||
|   }, | ||||
|   button: { | ||||
|     backgroundColor: '#2196F3', | ||||
|     borderRadius: 5, | ||||
|     paddingVertical: 10, | ||||
|     paddingHorizontal: 20, | ||||
|   }, | ||||
|   buttonText: { | ||||
|     color: 'white', | ||||
|     fontWeight: 'bold', | ||||
|   }, | ||||
| }); | ||||
							
								
								
									
										17
									
								
								Example/harmony_use_pushy/__tests__/App.test.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| /** | ||||
|  * @format | ||||
|  */ | ||||
|  | ||||
| import 'react-native'; | ||||
| import React from 'react'; | ||||
| import App from '../App'; | ||||
|  | ||||
| // Note: import explicitly to use the types shiped with jest. | ||||
| import {it} from '@jest/globals'; | ||||
|  | ||||
| // Note: test renderer must be required after react-native. | ||||
| import renderer from 'react-test-renderer'; | ||||
|  | ||||
| it('renders correctly', () => { | ||||
|   renderer.create(<App />); | ||||
| }); | ||||
							
								
								
									
										123
									
								
								Example/harmony_use_pushy/android/app/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,123 @@ | ||||
| apply plugin: "com.android.application" | ||||
| apply plugin: "com.facebook.react" | ||||
|  | ||||
| /** | ||||
|  * This is the configuration block to customize your React Native Android app. | ||||
|  * By default you don't need to apply any configuration, just uncomment the lines you need. | ||||
|  */ | ||||
| react { | ||||
|     /* Folders */ | ||||
|     //   The root of your project, i.e. where "package.json" lives. Default is '..' | ||||
|     // root = file("../") | ||||
|     //   The folder where the react-native NPM package is. Default is ../node_modules/react-native | ||||
|     // reactNativeDir = file("../node_modules/react-native") | ||||
|     //   The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen | ||||
|     // codegenDir = file("../node_modules/@react-native/codegen") | ||||
|     //   The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js | ||||
|     // cliFile = file("../node_modules/react-native/cli.js") | ||||
|  | ||||
|     /* Variants */ | ||||
|     //   The list of variants to that are debuggable. For those we're going to | ||||
|     //   skip the bundling of the JS bundle and the assets. By default is just 'debug'. | ||||
|     //   If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. | ||||
|     // debuggableVariants = ["liteDebug", "prodDebug"] | ||||
|  | ||||
|     /* Bundling */ | ||||
|     //   A list containing the node command and its flags. Default is just 'node'. | ||||
|     // nodeExecutableAndArgs = ["node"] | ||||
|     // | ||||
|     //   The command to run when bundling. By default is 'bundle' | ||||
|     // bundleCommand = "ram-bundle" | ||||
|     // | ||||
|     //   The path to the CLI configuration file. Default is empty. | ||||
|     // bundleConfig = file(../rn-cli.config.js) | ||||
|     // | ||||
|     //   The name of the generated asset file containing your JS bundle | ||||
|     // bundleAssetName = "MyApplication.android.bundle" | ||||
|     // | ||||
|     //   The entry file for bundle generation. Default is 'index.android.js' or 'index.js' | ||||
|     // entryFile = file("../js/MyApplication.android.js") | ||||
|     // | ||||
|     //   A list of extra flags to pass to the 'bundle' commands. | ||||
|     //   See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle | ||||
|     // extraPackagerArgs = [] | ||||
|  | ||||
|     /* Hermes Commands */ | ||||
|     //   The hermes compiler command to run. By default it is 'hermesc' | ||||
|     // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" | ||||
|     // | ||||
|     //   The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" | ||||
|     // hermesFlags = ["-O", "-output-source-map"] | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Set this to true to Run Proguard on Release builds to minify the Java bytecode. | ||||
|  */ | ||||
| def enableProguardInReleaseBuilds = false | ||||
|  | ||||
| /** | ||||
|  * The preferred build flavor of JavaScriptCore (JSC) | ||||
|  * | ||||
|  * For example, to use the international variant, you can use: | ||||
|  * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` | ||||
|  * | ||||
|  * The international variant includes ICU i18n library and necessary data | ||||
|  * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that | ||||
|  * give correct results when using with locales other than en-US. Note that | ||||
|  * this variant is about 6MiB larger per architecture than default. | ||||
|  */ | ||||
| def jscFlavor = 'org.webkit:android-jsc:+' | ||||
|  | ||||
| android { | ||||
|     ndkVersion rootProject.ext.ndkVersion | ||||
|  | ||||
|     compileSdkVersion rootProject.ext.compileSdkVersion | ||||
|  | ||||
|     namespace "com.harmony_use_pushy" | ||||
|     defaultConfig { | ||||
|         applicationId "com.harmony_use_pushy" | ||||
|         minSdkVersion rootProject.ext.minSdkVersion | ||||
|         targetSdkVersion rootProject.ext.targetSdkVersion | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|     } | ||||
|     signingConfigs { | ||||
|         debug { | ||||
|             storeFile file('debug.keystore') | ||||
|             storePassword 'android' | ||||
|             keyAlias 'androiddebugkey' | ||||
|             keyPassword 'android' | ||||
|         } | ||||
|     } | ||||
|     buildTypes { | ||||
|         debug { | ||||
|             signingConfig signingConfigs.debug | ||||
|         } | ||||
|         release { | ||||
|             // Caution! In production, you need to generate your own keystore file. | ||||
|             // see https://reactnative.dev/docs/signed-apk-android. | ||||
|             signingConfig signingConfigs.debug | ||||
|             minifyEnabled enableProguardInReleaseBuilds | ||||
|             proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| dependencies { | ||||
|     // The version of react-native is set by the React Native Gradle Plugin | ||||
|     implementation("com.facebook.react:react-android") | ||||
|  | ||||
|     debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") | ||||
|     debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { | ||||
|         exclude group:'com.squareup.okhttp3', module:'okhttp' | ||||
|     } | ||||
|  | ||||
|     debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") | ||||
|     if (hermesEnabled.toBoolean()) { | ||||
|         implementation("com.facebook.react:hermes-android") | ||||
|     } else { | ||||
|         implementation jscFlavor | ||||
|     } | ||||
| } | ||||
|  | ||||
| apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) | ||||
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/android/app/debug.keystore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										10
									
								
								Example/harmony_use_pushy/android/app/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | ||||
| # Add project specific ProGuard rules here. | ||||
| # By default, the flags in this file are appended to flags specified | ||||
| # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt | ||||
| # You can edit the include path and order by changing the proguardFiles | ||||
| # directive in build.gradle. | ||||
| # | ||||
| # For more details, see | ||||
| #   http://developer.android.com/guide/developing/tools/proguard.html | ||||
|  | ||||
| # Add any project specific keep options here: | ||||
| @@ -0,0 +1,13 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:tools="http://schemas.android.com/tools"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> | ||||
|  | ||||
|     <application | ||||
|         android:usesCleartextTraffic="true" | ||||
|         tools:targetApi="28" | ||||
|         tools:ignore="GoogleAppIndexingWarning"> | ||||
|         <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" android:exported="false" /> | ||||
|     </application> | ||||
| </manifest> | ||||
| @@ -0,0 +1,75 @@ | ||||
| /** | ||||
|  * Copyright (c) Meta Platforms, Inc. and affiliates. | ||||
|  * | ||||
|  * <p>This source code is licensed under the MIT license found in the LICENSE file in the root | ||||
|  * directory of this source tree. | ||||
|  */ | ||||
| package com.harmony_use_pushy; | ||||
|  | ||||
| import android.content.Context; | ||||
| import com.facebook.flipper.android.AndroidFlipperClient; | ||||
| import com.facebook.flipper.android.utils.FlipperUtils; | ||||
| import com.facebook.flipper.core.FlipperClient; | ||||
| import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; | ||||
| import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; | ||||
| import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; | ||||
| import com.facebook.flipper.plugins.inspector.DescriptorMapping; | ||||
| import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; | ||||
| import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; | ||||
| import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; | ||||
| import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; | ||||
| import com.facebook.react.ReactInstanceEventListener; | ||||
| import com.facebook.react.ReactInstanceManager; | ||||
| import com.facebook.react.bridge.ReactContext; | ||||
| import com.facebook.react.modules.network.NetworkingModule; | ||||
| import okhttp3.OkHttpClient; | ||||
|  | ||||
| /** | ||||
|  * Class responsible of loading Flipper inside your React Native application. This is the debug | ||||
|  * flavor of it. Here you can add your own plugins and customize the Flipper setup. | ||||
|  */ | ||||
| public class ReactNativeFlipper { | ||||
|   public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { | ||||
|     if (FlipperUtils.shouldEnableFlipper(context)) { | ||||
|       final FlipperClient client = AndroidFlipperClient.getInstance(context); | ||||
|  | ||||
|       client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); | ||||
|       client.addPlugin(new DatabasesFlipperPlugin(context)); | ||||
|       client.addPlugin(new SharedPreferencesFlipperPlugin(context)); | ||||
|       client.addPlugin(CrashReporterPlugin.getInstance()); | ||||
|  | ||||
|       NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); | ||||
|       NetworkingModule.setCustomClientBuilder( | ||||
|           new NetworkingModule.CustomClientBuilder() { | ||||
|             @Override | ||||
|             public void apply(OkHttpClient.Builder builder) { | ||||
|               builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); | ||||
|             } | ||||
|           }); | ||||
|       client.addPlugin(networkFlipperPlugin); | ||||
|       client.start(); | ||||
|  | ||||
|       // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized | ||||
|       // Hence we run if after all native modules have been initialized | ||||
|       ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); | ||||
|       if (reactContext == null) { | ||||
|         reactInstanceManager.addReactInstanceEventListener( | ||||
|             new ReactInstanceEventListener() { | ||||
|               @Override | ||||
|               public void onReactContextInitialized(ReactContext reactContext) { | ||||
|                 reactInstanceManager.removeReactInstanceEventListener(this); | ||||
|                 reactContext.runOnNativeModulesQueueThread( | ||||
|                     new Runnable() { | ||||
|                       @Override | ||||
|                       public void run() { | ||||
|                         client.addPlugin(new FrescoFlipperPlugin()); | ||||
|                       } | ||||
|                     }); | ||||
|               } | ||||
|             }); | ||||
|       } else { | ||||
|         client.addPlugin(new FrescoFlipperPlugin()); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,25 @@ | ||||
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> | ||||
|  | ||||
|     <uses-permission android:name="android.permission.INTERNET" /> | ||||
|  | ||||
|     <application | ||||
|       android:name=".MainApplication" | ||||
|       android:label="@string/app_name" | ||||
|       android:icon="@mipmap/ic_launcher" | ||||
|       android:roundIcon="@mipmap/ic_launcher_round" | ||||
|       android:allowBackup="false" | ||||
|       android:theme="@style/AppTheme"> | ||||
|       <activity | ||||
|         android:name=".MainActivity" | ||||
|         android:label="@string/app_name" | ||||
|         android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" | ||||
|         android:launchMode="singleTask" | ||||
|         android:windowSoftInputMode="adjustResize" | ||||
|         android:exported="true"> | ||||
|         <intent-filter> | ||||
|             <action android:name="android.intent.action.MAIN" /> | ||||
|             <category android:name="android.intent.category.LAUNCHER" /> | ||||
|         </intent-filter> | ||||
|       </activity> | ||||
|     </application> | ||||
| </manifest> | ||||
| @@ -0,0 +1,32 @@ | ||||
| package com.harmony_use_pushy; | ||||
|  | ||||
| import com.facebook.react.ReactActivity; | ||||
| import com.facebook.react.ReactActivityDelegate; | ||||
| import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; | ||||
| import com.facebook.react.defaults.DefaultReactActivityDelegate; | ||||
|  | ||||
| public class MainActivity extends ReactActivity { | ||||
|  | ||||
|   /** | ||||
|    * Returns the name of the main component registered from JavaScript. This is used to schedule | ||||
|    * rendering of the component. | ||||
|    */ | ||||
|   @Override | ||||
|   protected String getMainComponentName() { | ||||
|     return "harmony_use_pushy"; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * Returns the instance of the {@link ReactActivityDelegate}. Here we use a util class {@link | ||||
|    * DefaultReactActivityDelegate} which allows you to easily enable Fabric and Concurrent React | ||||
|    * (aka React 18) with two boolean flags. | ||||
|    */ | ||||
|   @Override | ||||
|   protected ReactActivityDelegate createReactActivityDelegate() { | ||||
|     return new DefaultReactActivityDelegate( | ||||
|         this, | ||||
|         getMainComponentName(), | ||||
|         // If you opted-in for the New Architecture, we enable the Fabric Renderer. | ||||
|         DefaultNewArchitectureEntryPoint.getFabricEnabled()); | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,62 @@ | ||||
| package com.harmony_use_pushy; | ||||
|  | ||||
| import android.app.Application; | ||||
| import com.facebook.react.PackageList; | ||||
| import com.facebook.react.ReactApplication; | ||||
| import com.facebook.react.ReactNativeHost; | ||||
| import com.facebook.react.ReactPackage; | ||||
| import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; | ||||
| import com.facebook.react.defaults.DefaultReactNativeHost; | ||||
| import com.facebook.soloader.SoLoader; | ||||
| import java.util.List; | ||||
|  | ||||
| public class MainApplication extends Application implements ReactApplication { | ||||
|  | ||||
|   private final ReactNativeHost mReactNativeHost = | ||||
|       new DefaultReactNativeHost(this) { | ||||
|         @Override | ||||
|         public boolean getUseDeveloperSupport() { | ||||
|           return BuildConfig.DEBUG; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected List<ReactPackage> getPackages() { | ||||
|           @SuppressWarnings("UnnecessaryLocalVariable") | ||||
|           List<ReactPackage> packages = new PackageList(this).getPackages(); | ||||
|           // Packages that cannot be autolinked yet can be added manually here, for example: | ||||
|           // packages.add(new MyReactNativePackage()); | ||||
|           return packages; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected String getJSMainModuleName() { | ||||
|           return "index"; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected boolean isNewArchEnabled() { | ||||
|           return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         protected Boolean isHermesEnabled() { | ||||
|           return BuildConfig.IS_HERMES_ENABLED; | ||||
|         } | ||||
|       }; | ||||
|  | ||||
|   @Override | ||||
|   public ReactNativeHost getReactNativeHost() { | ||||
|     return mReactNativeHost; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public void onCreate() { | ||||
|     super.onCreate(); | ||||
|     SoLoader.init(this, /* native exopackage */ false); | ||||
|     if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { | ||||
|       // If you opted-in for the New Architecture, we load the native entry point for this app. | ||||
|       DefaultNewArchitectureEntryPoint.load(); | ||||
|     } | ||||
|     ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,36 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <!-- Copyright (C) 2014 The Android Open Source Project | ||||
|  | ||||
|      Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|      you may not use this file except in compliance with the License. | ||||
|      You may obtain a copy of the License at | ||||
|  | ||||
|           http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|      Unless required by applicable law or agreed to in writing, software | ||||
|      distributed under the License is distributed on an "AS IS" BASIS, | ||||
|      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|      See the License for the specific language governing permissions and | ||||
|      limitations under the License. | ||||
| --> | ||||
| <inset xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|        android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material" | ||||
|        android:insetRight="@dimen/abc_edit_text_inset_horizontal_material" | ||||
|        android:insetTop="@dimen/abc_edit_text_inset_top_material" | ||||
|        android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"> | ||||
|  | ||||
|     <selector> | ||||
|         <!-- | ||||
|           This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I). | ||||
|           The item below with state_pressed="false" and state_focused="false" causes a NullPointerException. | ||||
|           NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' | ||||
|  | ||||
|           <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/> | ||||
|  | ||||
|           For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR. | ||||
|         --> | ||||
|         <item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/> | ||||
|         <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/> | ||||
|     </selector> | ||||
|  | ||||
| </inset> | ||||
| After Width: | Height: | Size: 3.0 KiB | 
| After Width: | Height: | Size: 4.9 KiB | 
| After Width: | Height: | Size: 2.0 KiB | 
| After Width: | Height: | Size: 2.8 KiB | 
| After Width: | Height: | Size: 4.5 KiB | 
| After Width: | Height: | Size: 6.9 KiB | 
| After Width: | Height: | Size: 6.3 KiB | 
| After Width: | Height: | Size: 10 KiB | 
| After Width: | Height: | Size: 9.0 KiB | 
| After Width: | Height: | Size: 15 KiB | 
| @@ -0,0 +1,3 @@ | ||||
| <resources> | ||||
|     <string name="app_name">harmony_use_pushy</string> | ||||
| </resources> | ||||
| @@ -0,0 +1,9 @@ | ||||
| <resources> | ||||
|  | ||||
|     <!-- Base application theme. --> | ||||
|     <style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar"> | ||||
|         <!-- Customize your theme here. --> | ||||
|         <item name="android:editTextBackground">@drawable/rn_edit_text_material</item> | ||||
|     </style> | ||||
|  | ||||
| </resources> | ||||
| @@ -0,0 +1,20 @@ | ||||
| /** | ||||
|  * Copyright (c) Meta Platforms, Inc. and affiliates. | ||||
|  * | ||||
|  * <p>This source code is licensed under the MIT license found in the LICENSE file in the root | ||||
|  * directory of this source tree. | ||||
|  */ | ||||
| package com.harmony_use_pushy; | ||||
|  | ||||
| import android.content.Context; | ||||
| import com.facebook.react.ReactInstanceManager; | ||||
|  | ||||
| /** | ||||
|  * Class responsible of loading Flipper inside your React Native application. This is the release | ||||
|  * flavor of it so it's empty as we don't want to load Flipper. | ||||
|  */ | ||||
| public class ReactNativeFlipper { | ||||
|   public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { | ||||
|     // Do nothing as we don't want to initialize Flipper on Release. | ||||
|   } | ||||
| } | ||||
							
								
								
									
										21
									
								
								Example/harmony_use_pushy/android/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,21 @@ | ||||
| // Top-level build file where you can add configuration options common to all sub-projects/modules. | ||||
|  | ||||
| buildscript { | ||||
|     ext { | ||||
|         buildToolsVersion = "33.0.0" | ||||
|         minSdkVersion = 21 | ||||
|         compileSdkVersion = 33 | ||||
|         targetSdkVersion = 33 | ||||
|  | ||||
|         // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. | ||||
|         ndkVersion = "23.1.7779620" | ||||
|     } | ||||
|     repositories { | ||||
|         google() | ||||
|         mavenCentral() | ||||
|     } | ||||
|     dependencies { | ||||
|         classpath("com.android.tools.build:gradle") | ||||
|         classpath("com.facebook.react:react-native-gradle-plugin") | ||||
|     } | ||||
| } | ||||
							
								
								
									
										44
									
								
								Example/harmony_use_pushy/android/gradle.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,44 @@ | ||||
| # Project-wide Gradle settings. | ||||
|  | ||||
| # IDE (e.g. Android Studio) users: | ||||
| # Gradle settings configured through the IDE *will override* | ||||
| # any settings specified in this file. | ||||
|  | ||||
| # For more details on how to configure your build environment visit | ||||
| # http://www.gradle.org/docs/current/userguide/build_environment.html | ||||
|  | ||||
| # 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 | ||||
|  | ||||
| # When configured, Gradle will run in incubating parallel mode. | ||||
| # This option should only be used with decoupled projects. More details, visit | ||||
| # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects | ||||
| # org.gradle.parallel=true | ||||
|  | ||||
| # AndroidX package structure to make it clearer which packages are bundled with the | ||||
| # Android operating system, and which are packaged with your app's APK | ||||
| # https://developer.android.com/topic/libraries/support-library/androidx-rn | ||||
| android.useAndroidX=true | ||||
| # Automatically convert third-party libraries to use AndroidX | ||||
| android.enableJetifier=true | ||||
|  | ||||
| # Version of flipper SDK to use with React Native | ||||
| FLIPPER_VERSION=0.182.0 | ||||
|  | ||||
| # Use this property to specify which architecture you want to build. | ||||
| # You can also override it from the CLI using | ||||
| # ./gradlew <task> -PreactNativeArchitectures=x86_64 | ||||
| reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 | ||||
|  | ||||
| # Use this property to enable support to the new architecture. | ||||
| # This will allow you to use TurboModules and the Fabric render in | ||||
| # your application. You should enable this flag either if you want | ||||
| # to write custom TurboModules/Fabric components OR use libraries that | ||||
| # are providing them. | ||||
| newArchEnabled=false | ||||
|  | ||||
| # Use this property to enable or disable the Hermes JS engine. | ||||
| # If set to false, you will be using JSC instead. | ||||
| hermesEnabled=true | ||||
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/android/gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										6
									
								
								Example/harmony_use_pushy/android/gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip | ||||
| networkTimeout=10000 | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
							
								
								
									
										244
									
								
								Example/harmony_use_pushy/android/gradlew
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						| @@ -0,0 +1,244 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| # | ||||
| # Copyright © 2015-2021 the original authors. | ||||
| # | ||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| # you may not use this file except in compliance with the License. | ||||
| # You may obtain a copy of the License at | ||||
| # | ||||
| #      https://www.apache.org/licenses/LICENSE-2.0 | ||||
| # | ||||
| # Unless required by applicable law or agreed to in writing, software | ||||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| # See the License for the specific language governing permissions and | ||||
| # limitations under the License. | ||||
| # | ||||
|  | ||||
| ############################################################################## | ||||
| # | ||||
| #   Gradle start up script for POSIX generated by Gradle. | ||||
| # | ||||
| #   Important for running: | ||||
| # | ||||
| #   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is | ||||
| #       noncompliant, but you have some other compliant shell such as ksh or | ||||
| #       bash, then to run this script, type that shell name before the whole | ||||
| #       command line, like: | ||||
| # | ||||
| #           ksh Gradle | ||||
| # | ||||
| #       Busybox and similar reduced shells will NOT work, because this script | ||||
| #       requires all of these POSIX shell features: | ||||
| #         * functions; | ||||
| #         * expansions «$var», «${var}», «${var:-default}», «${var+SET}», | ||||
| #           «${var#prefix}», «${var%suffix}», and «$( cmd )»; | ||||
| #         * compound commands having a testable exit status, especially «case»; | ||||
| #         * various built-in commands including «command», «set», and «ulimit». | ||||
| # | ||||
| #   Important for patching: | ||||
| # | ||||
| #   (2) This script targets any POSIX shell, so it avoids extensions provided | ||||
| #       by Bash, Ksh, etc; in particular arrays are avoided. | ||||
| # | ||||
| #       The "traditional" practice of packing multiple parameters into a | ||||
| #       space-separated string is a well documented source of bugs and security | ||||
| #       problems, so this is (mostly) avoided, by progressively accumulating | ||||
| #       options in "$@", and eventually passing that to Java. | ||||
| # | ||||
| #       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, | ||||
| #       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; | ||||
| #       see the in-line comments for details. | ||||
| # | ||||
| #       There are tweaks for specific operating systems such as AIX, CygWin, | ||||
| #       Darwin, MinGW, and NonStop. | ||||
| # | ||||
| #   (3) This script is generated from the Groovy template | ||||
| #       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||
| #       within the Gradle project. | ||||
| # | ||||
| #       You can find Gradle at https://github.com/gradle/gradle/. | ||||
| # | ||||
| ############################################################################## | ||||
|  | ||||
| # Attempt to set APP_HOME | ||||
|  | ||||
| # Resolve links: $0 may be a link | ||||
| app_path=$0 | ||||
|  | ||||
| # Need this for daisy-chained symlinks. | ||||
| while | ||||
|     APP_HOME=${app_path%"${app_path##*/}"}  # leaves a trailing /; empty if no leading path | ||||
|     [ -h "$app_path" ] | ||||
| do | ||||
|     ls=$( ls -ld "$app_path" ) | ||||
|     link=${ls#*' -> '} | ||||
|     case $link in             #( | ||||
|       /*)   app_path=$link ;; #( | ||||
|       *)    app_path=$APP_HOME$link ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| # This is normally unused | ||||
| # shellcheck disable=SC2034 | ||||
| APP_BASE_NAME=${0##*/} | ||||
| APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD=maximum | ||||
|  | ||||
| warn () { | ||||
|     echo "$*" | ||||
| } >&2 | ||||
|  | ||||
| die () { | ||||
|     echo | ||||
|     echo "$*" | ||||
|     echo | ||||
|     exit 1 | ||||
| } >&2 | ||||
|  | ||||
| # OS specific support (must be 'true' or 'false'). | ||||
| cygwin=false | ||||
| msys=false | ||||
| darwin=false | ||||
| nonstop=false | ||||
| case "$( uname )" in                #( | ||||
|   CYGWIN* )         cygwin=true  ;; #( | ||||
|   Darwin* )         darwin=true  ;; #( | ||||
|   MSYS* | MINGW* )  msys=true    ;; #( | ||||
|   NONSTOP* )        nonstop=true ;; | ||||
| esac | ||||
|  | ||||
| CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||
|  | ||||
|  | ||||
| # Determine the Java command to use to start the JVM. | ||||
| if [ -n "$JAVA_HOME" ] ; then | ||||
|     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then | ||||
|         # IBM's JDK on AIX uses strange locations for the executables | ||||
|         JAVACMD=$JAVA_HOME/jre/sh/java | ||||
|     else | ||||
|         JAVACMD=$JAVA_HOME/bin/java | ||||
|     fi | ||||
|     if [ ! -x "$JAVACMD" ] ; then | ||||
|         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| else | ||||
|     JAVACMD=java | ||||
|     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
| fi | ||||
|  | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | ||||
|     case $MAX_FD in #( | ||||
|       max*) | ||||
|         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC3045  | ||||
|         MAX_FD=$( ulimit -H -n ) || | ||||
|             warn "Could not query maximum file descriptor limit" | ||||
|     esac | ||||
|     case $MAX_FD in  #( | ||||
|       '' | soft) :;; #( | ||||
|       *) | ||||
|         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC3045  | ||||
|         ulimit -n "$MAX_FD" || | ||||
|             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||
|     esac | ||||
| fi | ||||
|  | ||||
| # Collect all arguments for the java command, stacking in reverse order: | ||||
| #   * args from the command line | ||||
| #   * the main class name | ||||
| #   * -classpath | ||||
| #   * -D...appname settings | ||||
| #   * --module-path (only if needed) | ||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. | ||||
|  | ||||
| # For Cygwin or MSYS, switch paths to Windows format before running java | ||||
| if "$cygwin" || "$msys" ; then | ||||
|     APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) | ||||
|     CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) | ||||
|  | ||||
|     JAVACMD=$( cygpath --unix "$JAVACMD" ) | ||||
|  | ||||
|     # Now convert the arguments - kludge to limit ourselves to /bin/sh | ||||
|     for arg do | ||||
|         if | ||||
|             case $arg in                                #( | ||||
|               -*)   false ;;                            # don't mess with options #( | ||||
|               /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath | ||||
|                     [ -e "$t" ] ;;                      #( | ||||
|               *)    false ;; | ||||
|             esac | ||||
|         then | ||||
|             arg=$( cygpath --path --ignore --mixed "$arg" ) | ||||
|         fi | ||||
|         # Roll the args list around exactly as many times as the number of | ||||
|         # args, so each arg winds up back in the position where it started, but | ||||
|         # possibly modified. | ||||
|         # | ||||
|         # NB: a `for` loop captures its iteration list before it begins, so | ||||
|         # changing the positional parameters here affects neither the number of | ||||
|         # iterations, nor the values presented in `arg`. | ||||
|         shift                   # remove old arg | ||||
|         set -- "$@" "$arg"      # push replacement arg | ||||
|     done | ||||
| fi | ||||
|  | ||||
| # Collect all arguments for the java command; | ||||
| #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | ||||
| #     shell script including quotes and variable substitutions, so put them in | ||||
| #     double quotes to make sure that they get re-expanded; and | ||||
| #   * put everything else in single quotes, so that it's not re-expanded. | ||||
|  | ||||
| set -- \ | ||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||
|         -classpath "$CLASSPATH" \ | ||||
|         org.gradle.wrapper.GradleWrapperMain \ | ||||
|         "$@" | ||||
|  | ||||
| # Stop when "xargs" is not available. | ||||
| if ! command -v xargs >/dev/null 2>&1 | ||||
| then | ||||
|     die "xargs is not available" | ||||
| fi | ||||
|  | ||||
| # Use "xargs" to parse quoted args. | ||||
| # | ||||
| # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||
| # | ||||
| # In Bash we could simply go: | ||||
| # | ||||
| #   readarray ARGS < <( xargs -n1 <<<"$var" ) && | ||||
| #   set -- "${ARGS[@]}" "$@" | ||||
| # | ||||
| # but POSIX shell has neither arrays nor command substitution, so instead we | ||||
| # post-process each arg (as a line of input to sed) to backslash-escape any | ||||
| # character that might be a shell metacharacter, then use eval to reverse | ||||
| # that process (while maintaining the separation between arguments), and wrap | ||||
| # the whole thing up as a single "set" statement. | ||||
| # | ||||
| # This will of course break if any of these variables contains a newline or | ||||
| # an unmatched quote. | ||||
| # | ||||
|  | ||||
| eval "set -- $( | ||||
|         printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | | ||||
|         xargs -n1 | | ||||
|         sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | | ||||
|         tr '\n' ' ' | ||||
|     )" '"$@"' | ||||
|  | ||||
| exec "$JAVACMD" "$@" | ||||
							
								
								
									
										92
									
								
								Example/harmony_use_pushy/android/gradlew.bat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,92 @@ | ||||
| @rem | ||||
| @rem Copyright 2015 the original author or authors. | ||||
| @rem | ||||
| @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||
| @rem you may not use this file except in compliance with the License. | ||||
| @rem You may obtain a copy of the License at | ||||
| @rem | ||||
| @rem      https://www.apache.org/licenses/LICENSE-2.0 | ||||
| @rem | ||||
| @rem Unless required by applicable law or agreed to in writing, software | ||||
| @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||
| @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
| @rem See the License for the specific language governing permissions and | ||||
| @rem limitations under the License. | ||||
| @rem | ||||
|  | ||||
| @if "%DEBUG%"=="" @echo off | ||||
| @rem ########################################################################## | ||||
| @rem | ||||
| @rem  Gradle startup script for Windows | ||||
| @rem | ||||
| @rem ########################################################################## | ||||
|  | ||||
| @rem Set local scope for the variables with windows NT shell | ||||
| if "%OS%"=="Windows_NT" setlocal | ||||
|  | ||||
| set DIRNAME=%~dp0 | ||||
| if "%DIRNAME%"=="" set DIRNAME=. | ||||
| @rem This is normally unused | ||||
| set APP_BASE_NAME=%~n0 | ||||
| set APP_HOME=%DIRNAME% | ||||
|  | ||||
| @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||
| for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||
|  | ||||
| @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||
|  | ||||
| @rem Find java.exe | ||||
| if defined JAVA_HOME goto findJavaFromJavaHome | ||||
|  | ||||
| set JAVA_EXE=java.exe | ||||
| %JAVA_EXE% -version >NUL 2>&1 | ||||
| if %ERRORLEVEL% equ 0 goto execute | ||||
|  | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
| echo. | ||||
| echo Please set the JAVA_HOME variable in your environment to match the | ||||
| echo location of your Java installation. | ||||
|  | ||||
| goto fail | ||||
|  | ||||
| :findJavaFromJavaHome | ||||
| set JAVA_HOME=%JAVA_HOME:"=% | ||||
| set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||
|  | ||||
| if exist "%JAVA_EXE%" goto execute | ||||
|  | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||
| echo. | ||||
| echo Please set the JAVA_HOME variable in your environment to match the | ||||
| echo location of your Java installation. | ||||
|  | ||||
| goto fail | ||||
|  | ||||
| :execute | ||||
| @rem Setup the command line | ||||
|  | ||||
| set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||
|  | ||||
|  | ||||
| @rem Execute Gradle | ||||
| "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* | ||||
|  | ||||
| :end | ||||
| @rem End local scope for the variables with windows NT shell | ||||
| if %ERRORLEVEL% equ 0 goto mainEnd | ||||
|  | ||||
| :fail | ||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||
| rem the _cmd.exe /c_ return code! | ||||
| set EXIT_CODE=%ERRORLEVEL% | ||||
| if %EXIT_CODE% equ 0 set EXIT_CODE=1 | ||||
| if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | ||||
| exit /b %EXIT_CODE% | ||||
|  | ||||
| :mainEnd | ||||
| if "%OS%"=="Windows_NT" endlocal | ||||
|  | ||||
| :omega | ||||
							
								
								
									
										4
									
								
								Example/harmony_use_pushy/android/settings.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| rootProject.name = 'harmony_use_pushy' | ||||
| apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) | ||||
| include ':app' | ||||
| includeBuild('../node_modules/@react-native/gradle-plugin') | ||||
							
								
								
									
										4
									
								
								Example/harmony_use_pushy/app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,4 @@ | ||||
| { | ||||
|   "name": "harmony_use_pushy", | ||||
|   "displayName": "harmony_use_pushy" | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shezhi.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 696 B | 
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shezhi@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.2 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shezhi@3x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shoucang.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 521 B | 
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shoucang@2x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 928 B | 
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/assets/shoucang@3x.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
							
								
								
									
										3
									
								
								Example/harmony_use_pushy/babel.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,3 @@ | ||||
| module.exports = { | ||||
|   presets: ['module:metro-react-native-babel-preset'], | ||||
| }; | ||||
							
								
								
									
										
											BIN
										
									
								
								Example/harmony_use_pushy/demo.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 337 KiB | 
							
								
								
									
										12
									
								
								Example/harmony_use_pushy/harmony/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,12 @@ | ||||
| /node_modules | ||||
| /oh_modules | ||||
| /local.properties | ||||
| /.idea | ||||
| **/build | ||||
| /.hvigor | ||||
| .cxx | ||||
| /.clangd | ||||
| /.clang-format | ||||
| /.clang-tidy | ||||
| **/.test | ||||
| /.appanalyzer | ||||
							
								
								
									
										10
									
								
								Example/harmony_use_pushy/harmony/AppScope/app.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,10 @@ | ||||
| { | ||||
|   "app": { | ||||
|     "bundleName": "com.example.myapplication", | ||||
|     "vendor": "example", | ||||
|     "versionCode": 1000000, | ||||
|     "versionName": "1.0.0", | ||||
|     "icon": "$media:app_icon", | ||||
|     "label": "$string:app_name" | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "string": [ | ||||
|     { | ||||
|       "name": "app_name", | ||||
|       "value": "harmony_use_pushy" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| After Width: | Height: | Size: 2.7 KiB | 
							
								
								
									
										49
									
								
								Example/harmony_use_pushy/harmony/build-profile.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,49 @@ | ||||
| { | ||||
|   "app": { | ||||
|     "signingConfigs": [], | ||||
|     "products": [ | ||||
|       { | ||||
|         "name": "default", | ||||
|         "signingConfig": "default", | ||||
|         "compatibleSdkVersion": "5.0.0(12)", | ||||
|         "runtimeOS": "HarmonyOS", | ||||
|         "buildOption": { | ||||
|           "strictMode": { | ||||
|             "caseSensitiveCheck": true, | ||||
|             "useNormalizedOHMUrl": true | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     ], | ||||
|     "buildModeSet": [ | ||||
|       { | ||||
|         "name": "debug", | ||||
|       }, | ||||
|       { | ||||
|         "name": "release" | ||||
|       } | ||||
|     ] | ||||
|   }, | ||||
|   "modules": [ | ||||
|     { | ||||
|       "name": "entry", | ||||
|       "srcPath": "./entry", | ||||
|       "targets": [ | ||||
|         { | ||||
|           "name": "default", | ||||
|           "applyToProducts": [ | ||||
|             "default" | ||||
|           ] | ||||
|         } | ||||
|       ] | ||||
|     }, | ||||
|     { | ||||
|       name: 'rnoh', | ||||
|       srcPath: '../libs/rnoh', | ||||
|     }, | ||||
|     { | ||||
|       name: 'pushy', | ||||
|       srcPath: '../node_modules/react-native-update/harmony', | ||||
|     } | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										20
									
								
								Example/harmony_use_pushy/harmony/code-linter.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,20 @@ | ||||
| { | ||||
|   "files": [ | ||||
|     "**/*.ets" | ||||
|   ], | ||||
|   "ignore": [ | ||||
|     "**/src/ohosTest/**/*", | ||||
|     "**/src/test/**/*", | ||||
|     "**/src/mock/**/*", | ||||
|     "**/node_modules/**/*", | ||||
|     "**/oh_modules/**/*", | ||||
|     "**/build/**/*", | ||||
|     "**/.preview/**/*" | ||||
|   ], | ||||
|   "ruleSet": [ | ||||
|     "plugin:@performance/recommended", | ||||
|     "plugin:@typescript-eslint/recommended" | ||||
|   ], | ||||
|   "rules": { | ||||
|   } | ||||
| } | ||||
							
								
								
									
										6
									
								
								Example/harmony_use_pushy/harmony/entry/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| /node_modules | ||||
| /oh_modules | ||||
| /.preview | ||||
| /build | ||||
| /.cxx | ||||
| /.test | ||||
							
								
								
									
										33
									
								
								Example/harmony_use_pushy/harmony/entry/build-profile.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,33 @@ | ||||
| { | ||||
|   "apiType": "stageMode", | ||||
|   "buildOption": { | ||||
|     "externalNativeOptions": { | ||||
|       "path": "./src/main/cpp/CMakeLists.txt", | ||||
|       "arguments": "", | ||||
|       "cppFlags": "", | ||||
|     }, | ||||
|   }, | ||||
|   "buildOptionSet": [ | ||||
|     { | ||||
|       "name": "release", | ||||
|       "arkOptions": { | ||||
|         "obfuscation": { | ||||
|           "ruleOptions": { | ||||
|             "enable": false, | ||||
|             "files": [ | ||||
|               "./obfuscation-rules.txt" | ||||
|             ] | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|   ], | ||||
|   "targets": [ | ||||
|     { | ||||
|       "name": "default" | ||||
|     }, | ||||
|     { | ||||
|       "name": "ohosTest", | ||||
|     } | ||||
|   ] | ||||
| } | ||||
							
								
								
									
										32
									
								
								Example/harmony_use_pushy/harmony/entry/hvigorfile.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,32 @@ | ||||
| import { hapTasks } from '@ohos/hvigor-ohos-plugin'; | ||||
| import fs from 'fs'; | ||||
| import path from 'path'; | ||||
| export function generatePushyBuildTime(str?: string) { | ||||
|     return { | ||||
|         pluginId: 'PushyBuildTimePlugin', | ||||
|         apply(pluginContext) { | ||||
|             pluginContext.registerTask({ | ||||
|                 name: 'pushy_build_time', | ||||
|                 run: (taskContext) => { | ||||
|                     const metaFilePath = path.resolve(__dirname, 'src/main/resources/rawfile/meta.json'); | ||||
|                     const dirPath = path.dirname(metaFilePath); | ||||
|                     if (!fs.existsSync(dirPath)) { | ||||
|                         fs.mkdirSync(dirPath, { recursive: true }); | ||||
|                     } | ||||
|                     const buildTime = new Date().toISOString(); | ||||
|                     const metaContent = { pushy_build_time : buildTime }; | ||||
|                     fs.writeFileSync(metaFilePath, JSON.stringify(metaContent, null, 4)); | ||||
|                     console.log(`Build time written to ${metaFilePath}`); | ||||
|  | ||||
|                 }, | ||||
|                 dependencies: [], | ||||
|                 postDependencies: ['default@BuildJS'] | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| export default { | ||||
|     system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */ | ||||
|     plugins:[generatePushyBuildTime()]         /* Custom plugin to extend the functionality of Hvigor. */ | ||||
| } | ||||
| @@ -0,0 +1,23 @@ | ||||
| # Define project specific obfuscation rules here. | ||||
| # You can include the obfuscation configuration files in the current module's build-profile.json5. | ||||
| # | ||||
| # For more details, see | ||||
| #   https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/source-obfuscation-V5 | ||||
|  | ||||
| # Obfuscation options: | ||||
| # -disable-obfuscation: disable all obfuscations | ||||
| # -enable-property-obfuscation: obfuscate the property names | ||||
| # -enable-toplevel-obfuscation: obfuscate the names in the global scope | ||||
| # -compact: remove unnecessary blank spaces and all line feeds | ||||
| # -remove-log: remove all console.* statements | ||||
| # -print-namecache: print the name cache that contains the mapping from the old names to new names | ||||
| # -apply-namecache: reuse the given cache file | ||||
|  | ||||
| # Keep options: | ||||
| # -keep-property-name: specifies property names that you want to keep | ||||
| # -keep-global-name: specifies names that you want to keep in the global scope | ||||
|  | ||||
| -enable-property-obfuscation | ||||
| -enable-toplevel-obfuscation | ||||
| -enable-filename-obfuscation | ||||
| -enable-export-obfuscation | ||||
| @@ -0,0 +1,28 @@ | ||||
| { | ||||
|   "meta": { | ||||
|     "stableOrder": true | ||||
|   }, | ||||
|   "lockfileVersion": 3, | ||||
|   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | ||||
|   "specifiers": { | ||||
|     "pushy@../../node_modules/react-native-update/harmony": "pushy@../../node_modules/react-native-update/harmony", | ||||
|     "rnoh@../../libs/rnoh": "rnoh@../../libs/rnoh" | ||||
|   }, | ||||
|   "packages": { | ||||
|     "pushy@../../node_modules/react-native-update/harmony": { | ||||
|       "name": "pushy", | ||||
|       "version": "3.1.0-0.0.7", | ||||
|       "resolved": "../../node_modules/react-native-update/harmony", | ||||
|       "registryType": "local", | ||||
|       "dependencies": { | ||||
|         "rnoh": "file:../../../libs/rnoh" | ||||
|       } | ||||
|     }, | ||||
|     "rnoh@../../libs/rnoh": { | ||||
|       "name": "rnoh", | ||||
|       "version": "0.72.12", | ||||
|       "resolved": "../../libs/rnoh", | ||||
|       "registryType": "local" | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										13
									
								
								Example/harmony_use_pushy/harmony/entry/oh-package.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,13 @@ | ||||
| { | ||||
|   "name": "entry", | ||||
|   "version": "1.0.0", | ||||
|   "description": "Please describe the basic information.", | ||||
|   "main": "", | ||||
|   "author": "", | ||||
|   "license": "", | ||||
|   "dependencies": { | ||||
|     "rnoh": "file:../../libs/rnoh", | ||||
|     "pushy": "file:../../node_modules/react-native-update/harmony" | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										1
									
								
								Example/harmony_use_pushy/harmony/entry/src/main/cpp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1 @@ | ||||
| jsbundle.h | ||||
| @@ -0,0 +1,15 @@ | ||||
| cmake_minimum_required(VERSION 3.16) | ||||
| project(rnapp) | ||||
| set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}") | ||||
| set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules") | ||||
| set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../libs/rnoh/src/main/cpp") | ||||
| set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") | ||||
| add_subdirectory("${OH_MODULES}/pushy/src/main/cpp" ./pushy) | ||||
|  | ||||
| add_subdirectory("${RNOH_CPP_DIR}" ./rn) | ||||
| add_library(rnoh_app SHARED | ||||
|     "./PackageProvider.cpp" | ||||
|     "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" | ||||
| ) | ||||
| target_link_libraries(rnoh_app PUBLIC rnoh) | ||||
| target_link_libraries(rnoh_app PUBLIC rnoh_pushy) | ||||
| @@ -0,0 +1,9 @@ | ||||
| #include "RNOH/PackageProvider.h" | ||||
| #include "PushyPackage.h" | ||||
| using namespace rnoh; | ||||
|  | ||||
| std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) { | ||||
|     return { | ||||
|          std::make_shared<PushyPackage>(ctx) | ||||
|     }; | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| import type {RNPackageContext, RNPackage} from 'rnoh/ts'; | ||||
| import {PushyPackage} from 'pushy/ts'; | ||||
|  | ||||
| export function createRNPackages(ctx: RNPackageContext): RNPackage[] { | ||||
|   return [new PushyPackage(ctx)]; | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| import {RNAbility} from 'rnoh/ts'; | ||||
|  | ||||
| export default class EntryAbility extends RNAbility { | ||||
|   getPagePath() { | ||||
|     return 'pages/Index'; | ||||
|   } | ||||
|  | ||||
|   shouldCleanUpRNInstance__hack() { | ||||
|     return true // Used by RNOH devs. If set to true, the app may crash. | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,12 @@ | ||||
| import { hilog } from '@kit.PerformanceAnalysisKit'; | ||||
| import { BackupExtensionAbility, BundleVersion } from '@kit.CoreFileKit'; | ||||
|  | ||||
| export default class EntryBackupAbility extends BackupExtensionAbility { | ||||
|   async onBackup() { | ||||
|     hilog.info(0x0000, 'testTag', 'onBackup ok'); | ||||
|   } | ||||
|  | ||||
|   async onRestore(bundleVersion: BundleVersion) { | ||||
|     hilog.info(0x0000, 'testTag', 'onRestore ok %{public}s', JSON.stringify(bundleVersion)); | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,61 @@ | ||||
| import { FileJSBundleProvider } from 'pushy/src/main/ets/FileJSBundleProvider'; | ||||
| import { ComponentBuilderContext, JSBundleProvider, RNOHLogger } from 'rnoh'; | ||||
| import { | ||||
|   RNApp, | ||||
|   RNAbility, | ||||
|   AnyJSBundleProvider, | ||||
|   ResourceJSBundleProvider, | ||||
|   TraceJSBundleProviderDecorator, | ||||
| } from 'rnoh' | ||||
| import { createRNPackages } from '../RNPackagesFactory' | ||||
|  | ||||
| @Builder | ||||
| export function CustomComponentBuilder(ctx: ComponentBuilderContext) { | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
| @Entry | ||||
| @Component | ||||
| struct Index { | ||||
|   @StorageLink('RNAbility') private rnAbility: RNAbility | undefined = undefined | ||||
|   @State shouldShow: boolean = false | ||||
|   @State message: string = 'Hello World'; | ||||
|  | ||||
|   aboutToAppear(): void { | ||||
|     this.shouldShow = true | ||||
|   } | ||||
|  | ||||
|   onBackPress(): boolean | undefined { | ||||
|     // NOTE: this is required since `Ability`'s `onBackPressed` function always | ||||
|     // terminates or puts the app in the background, but we want Ark to ignore it completely | ||||
|     // when handled by RN | ||||
|     return this.rnAbility?.onBackPress(); | ||||
|   } | ||||
|  | ||||
|   build() { | ||||
|     Column() { | ||||
|       if (this.rnAbility && this.shouldShow) { | ||||
|         RNApp({ | ||||
|           rnInstanceConfig: { createRNPackages }, | ||||
|           initialProps: { "foo": "bar" } as Record<string, string>, | ||||
|           appKey: "harmony_use_pushy", | ||||
|           buildCustomComponent: CustomComponentBuilder, | ||||
|           onSetUp: (rnInstance) => { | ||||
|             rnInstance.enableFeatureFlag("ENABLE_RN_INSTANCE_CLEAN_UP") | ||||
|           }, | ||||
|           jsBundleProvider: new TraceJSBundleProviderDecorator( | ||||
|             new AnyJSBundleProvider([ | ||||
|               // MetroJSBundleProvider.fromServerIp('127.0.0.1'), | ||||
|               // new ResourceJSBundleProvider(this.rnAbility.context.resourceManager, 'hermes_bundle.hbc'), | ||||
|               new FileJSBundleProvider(this.rnAbility.context), | ||||
|               new ResourceJSBundleProvider(this.rnAbility.context.resourceManager, 'bundle.harmony.js') | ||||
|             ]), | ||||
|             this.rnAbility.getLogger()), | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|     .height('100%') | ||||
|     .width('100%') | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,71 @@ | ||||
| { | ||||
|   "module": { | ||||
|     "name": "entry", | ||||
|     "type": "entry", | ||||
|     "description": "$string:module_desc", | ||||
|     "mainElement": "EntryAbility", | ||||
|     "deviceTypes": [ | ||||
|       "phone", | ||||
|       "tablet", | ||||
|       "2in1" | ||||
|     ], | ||||
|     "deliveryWithInstall": true, | ||||
|     "installationFree": false, | ||||
|     "pages": "$profile:main_pages", | ||||
|     "abilities": [ | ||||
|       { | ||||
|         "name": "EntryAbility", | ||||
|         "srcEntry": "./ets/entryability/EntryAbility.ets", | ||||
|         "description": "$string:EntryAbility_desc", | ||||
|         "icon": "$media:layered_image", | ||||
|         "label": "$string:EntryAbility_label", | ||||
|         "startWindowIcon": "$media:startIcon", | ||||
|         "startWindowBackground": "$color:start_window_background", | ||||
|         "exported": true, | ||||
|         "skills": [ | ||||
|           { | ||||
|             "entities": [ | ||||
|               "entity.system.home" | ||||
|             ], | ||||
|             "actions": [ | ||||
|               "action.system.home" | ||||
|             ] | ||||
|           } | ||||
|         ] | ||||
|       } | ||||
|     ], | ||||
|     "extensionAbilities": [ | ||||
|       { | ||||
|         "name": "EntryBackupAbility", | ||||
|         "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets", | ||||
|         "type": "backup", | ||||
|         "exported": false, | ||||
|         "metadata": [ | ||||
|           { | ||||
|             "name": "ohos.extension.backup", | ||||
|             "resource": "$profile:backup_config" | ||||
|           } | ||||
|         ], | ||||
|       } | ||||
|     ], | ||||
|     "requestPermissions": [ | ||||
|       { | ||||
|         "name": "ohos.permission.WRITE_MEDIA", | ||||
|         "reason": "$string:reason_write_media", | ||||
|         "usedScene": { | ||||
|           "when": "always", | ||||
|         } | ||||
|       }, | ||||
|       { | ||||
|         "name": "ohos.permission.READ_MEDIA", | ||||
|         "reason": "$string:reason_read_media", | ||||
|         "usedScene": { | ||||
|           "when": "always", | ||||
|         } | ||||
|       }, | ||||
|       { | ||||
|         "name": "ohos.permission.INTERNET" | ||||
|       } | ||||
|     ] | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,8 @@ | ||||
| { | ||||
|   "color": [ | ||||
|     { | ||||
|       "name": "start_window_background", | ||||
|       "value": "#FFFFFF" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -0,0 +1,28 @@ | ||||
| { | ||||
|   "string": [ | ||||
|     { | ||||
|       "name": "Access_location", | ||||
|       "value": "access location" | ||||
|     }, | ||||
|     { | ||||
|       "name": "module_desc", | ||||
|       "value": "module description" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_desc", | ||||
|       "value": "description" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_label", | ||||
|       "value": "label" | ||||
|     }, | ||||
|     { | ||||
|       "name": "reason_write_media", | ||||
|       "value": "Write files to internal storage" | ||||
|     }, | ||||
|     { | ||||
|       "name": "reason_read_media", | ||||
|       "value": "Read files to internal storage" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| After Width: | Height: | Size: 56 KiB | 
| After Width: | Height: | Size: 12 KiB | 
| @@ -0,0 +1,7 @@ | ||||
| { | ||||
|   "layered-image": | ||||
|   { | ||||
|     "background" : "$media:background", | ||||
|     "foreground" : "$media:foreground" | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 20 KiB | 
| @@ -0,0 +1,3 @@ | ||||
| { | ||||
|   "allowToBackupRestore": true | ||||
| } | ||||
| @@ -0,0 +1,5 @@ | ||||
| { | ||||
|   "src": [ | ||||
|     "pages/Index" | ||||
|   ] | ||||
| } | ||||
| @@ -0,0 +1,16 @@ | ||||
| { | ||||
|   "string": [ | ||||
|     { | ||||
|       "name": "module_desc", | ||||
|       "value": "module description" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_desc", | ||||
|       "value": "description" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_label", | ||||
|       "value": "label" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| After Width: | Height: | Size: 1.8 KiB | 
| @@ -0,0 +1,16 @@ | ||||
| { | ||||
|   "string": [ | ||||
|     { | ||||
|       "name": "module_desc", | ||||
|       "value": "模块描述" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_desc", | ||||
|       "value": "description" | ||||
|     }, | ||||
|     { | ||||
|       "name": "EntryAbility_label", | ||||
|       "value": "label" | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -0,0 +1,2 @@ | ||||
| { | ||||
| } | ||||
| @@ -0,0 +1,35 @@ | ||||
| import { hilog } from '@kit.PerformanceAnalysisKit'; | ||||
| import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; | ||||
|  | ||||
| export default function abilityTest() { | ||||
|   describe('ActsAbilityTest', () => { | ||||
|     // Defines a test suite. Two parameters are supported: test suite name and test suite function. | ||||
|     beforeAll(() => { | ||||
|       // Presets an action, which is performed only once before all test cases of the test suite start. | ||||
|       // This API supports only one parameter: preset action function. | ||||
|     }) | ||||
|     beforeEach(() => { | ||||
|       // Presets an action, which is performed before each unit test case starts. | ||||
|       // The number of execution times is the same as the number of test cases defined by **it**. | ||||
|       // This API supports only one parameter: preset action function. | ||||
|     }) | ||||
|     afterEach(() => { | ||||
|       // Presets a clear action, which is performed after each unit test case ends. | ||||
|       // The number of execution times is the same as the number of test cases defined by **it**. | ||||
|       // This API supports only one parameter: clear action function. | ||||
|     }) | ||||
|     afterAll(() => { | ||||
|       // Presets a clear action, which is performed after all test cases of the test suite end. | ||||
|       // This API supports only one parameter: clear action function. | ||||
|     }) | ||||
|     it('assertContain', 0, () => { | ||||
|       // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. | ||||
|       hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); | ||||
|       let a = 'abc'; | ||||
|       let b = 'b'; | ||||
|       // Defines a variety of assertion methods, which are used to declare expected boolean conditions. | ||||
|       expect(a).assertContain(b); | ||||
|       expect(a).assertEqual(a); | ||||
|     }) | ||||
|   }) | ||||
| } | ||||
| @@ -0,0 +1,5 @@ | ||||
| import abilityTest from './Ability.test'; | ||||
|  | ||||
| export default function testsuite() { | ||||
|   abilityTest(); | ||||
| } | ||||
| @@ -0,0 +1,13 @@ | ||||
| { | ||||
|   "module": { | ||||
|     "name": "entry_test", | ||||
|     "type": "feature", | ||||
|     "deviceTypes": [ | ||||
|       "phone", | ||||
|       "tablet", | ||||
|       "2in1" | ||||
|     ], | ||||
|     "deliveryWithInstall": true, | ||||
|     "installationFree": false | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,5 @@ | ||||
| import localUnitTest from './LocalUnit.test'; | ||||
|  | ||||
| export default function testsuite() { | ||||
|   localUnitTest(); | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; | ||||
|  | ||||
| export default function localUnitTest() { | ||||
|   describe('localUnitTest', () => { | ||||
|     // Defines a test suite. Two parameters are supported: test suite name and test suite function. | ||||
|     beforeAll(() => { | ||||
|       // Presets an action, which is performed only once before all test cases of the test suite start. | ||||
|       // This API supports only one parameter: preset action function. | ||||
|     }); | ||||
|     beforeEach(() => { | ||||
|       // Presets an action, which is performed before each unit test case starts. | ||||
|       // The number of execution times is the same as the number of test cases defined by **it**. | ||||
|       // This API supports only one parameter: preset action function. | ||||
|     }); | ||||
|     afterEach(() => { | ||||
|       // Presets a clear action, which is performed after each unit test case ends. | ||||
|       // The number of execution times is the same as the number of test cases defined by **it**. | ||||
|       // This API supports only one parameter: clear action function. | ||||
|     }); | ||||
|     afterAll(() => { | ||||
|       // Presets a clear action, which is performed after all test cases of the test suite end. | ||||
|       // This API supports only one parameter: clear action function. | ||||
|     }); | ||||
|     it('assertContain', 0, () => { | ||||
|       // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. | ||||
|       let a = 'abc'; | ||||
|       let b = 'b'; | ||||
|       // Defines a variety of assertion methods, which are used to declare expected boolean conditions. | ||||
|       expect(a).assertContain(b); | ||||
|       expect(a).assertEqual(a); | ||||
|     }); | ||||
|   }); | ||||
| } | ||||
							
								
								
									
										22
									
								
								Example/harmony_use_pushy/harmony/hvigor/hvigor-config.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,22 @@ | ||||
| { | ||||
|   "modelVersion": "5.0.0", | ||||
|   "dependencies": { | ||||
|   }, | ||||
|   "execution": { | ||||
|     // "analyze": "normal",                     /* Define the build analyze mode. Value: [ "normal" | "advanced" | false ]. Default: "normal" */ | ||||
|     // "daemon": true,                          /* Enable daemon compilation. Value: [ true | false ]. Default: true */ | ||||
|     // "incremental": true,                     /* Enable incremental compilation. Value: [ true | false ]. Default: true */ | ||||
|     // "parallel": true,                        /* Enable parallel compilation. Value: [ true | false ]. Default: true */ | ||||
|     // "typeCheck": false,                      /* Enable typeCheck. Value: [ true | false ]. Default: false */ | ||||
|   }, | ||||
|   "logging": { | ||||
|     // "level": "info"                          /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ | ||||
|   }, | ||||
|   "debugging": { | ||||
|     // "stacktrace": false                      /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ | ||||
|   }, | ||||
|   "nodeOptions": { | ||||
|     // "maxOldSpaceSize": 8192                  /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ | ||||
|     // "exposeGC": true                         /* Enable to trigger garbage collection explicitly. Default: true*/ | ||||
|   } | ||||
| } | ||||
							
								
								
									
										6
									
								
								Example/harmony_use_pushy/harmony/hvigorfile.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,6 @@ | ||||
| import { appTasks } from '@ohos/hvigor-ohos-plugin'; | ||||
|  | ||||
| export default { | ||||
|     system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */ | ||||
|     plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */ | ||||
| } | ||||
							
								
								
									
										27
									
								
								Example/harmony_use_pushy/harmony/oh-package-lock.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,27 @@ | ||||
| { | ||||
|   "meta": { | ||||
|     "stableOrder": true | ||||
|   }, | ||||
|   "lockfileVersion": 3, | ||||
|   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | ||||
|   "specifiers": { | ||||
|     "@ohos/hamock@1.0.0": "@ohos/hamock@1.0.0", | ||||
|     "@ohos/hypium@1.0.19": "@ohos/hypium@1.0.19" | ||||
|   }, | ||||
|   "packages": { | ||||
|     "@ohos/hamock@1.0.0": { | ||||
|       "name": "@ohos/hamock", | ||||
|       "version": "1.0.0", | ||||
|       "integrity": "sha512-K6lDPYc6VkKe6ZBNQa9aoG+ZZMiwqfcR/7yAVFSUGIuOAhPvCJAo9+t1fZnpe0dBRBPxj2bxPPbKh69VuyAtDg==", | ||||
|       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hamock/-/hamock-1.0.0.har", | ||||
|       "registryType": "ohpm" | ||||
|     }, | ||||
|     "@ohos/hypium@1.0.19": { | ||||
|       "name": "@ohos/hypium", | ||||
|       "version": "1.0.19", | ||||
|       "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==", | ||||
|       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.19.har", | ||||
|       "registryType": "ohpm" | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										17
									
								
								Example/harmony_use_pushy/harmony/oh-package.json5
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,17 @@ | ||||
| { | ||||
|   "modelVersion": "5.0.0", | ||||
|   "description": "Please describe the basic information.", | ||||
|   "dependencies": { | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@ohos/hypium": "1.0.19", | ||||
|     "@ohos/hamock": "1.0.0" | ||||
|   }, | ||||
|   "arkTs": { | ||||
|     "compilerOptions": { | ||||
|       "noImplicitAny": false, | ||||
|       "suppressImplicitAnyIndexErrors": true, | ||||
|       "strict": false | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										9
									
								
								Example/harmony_use_pushy/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,9 @@ | ||||
| /** | ||||
|  * @format | ||||
|  */ | ||||
|  | ||||
| import {AppRegistry} from 'react-native'; | ||||
| import App from './App'; | ||||
| import {name as appName} from './app.json'; | ||||
|  | ||||
| AppRegistry.registerComponent(appName, () => App); | ||||
							
								
								
									
										11
									
								
								Example/harmony_use_pushy/ios/.xcode.env
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,11 @@ | ||||
| # This `.xcode.env` file is versioned and is used to source the environment | ||||
| # used when running script phases inside Xcode. | ||||
| # To customize your local environment, you can create an `.xcode.env.local` | ||||
| # file that is not versioned. | ||||
|  | ||||
| # NODE_BINARY variable contains the PATH to the node executable. | ||||
| # | ||||
| # Customize the NODE_BINARY variable here. | ||||
| # For example, to use nvm with brew, add the following line | ||||
| # . "$(brew --prefix nvm)/nvm.sh" --no-use | ||||
| export NODE_BINARY=$(command -v node) | ||||
							
								
								
									
										62
									
								
								Example/harmony_use_pushy/ios/Podfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,62 @@ | ||||
| # Resolve react_native_pods.rb with node to allow for hoisting | ||||
| require Pod::Executable.execute_command('node', ['-p', | ||||
|   'require.resolve( | ||||
|     "react-native/scripts/react_native_pods.rb", | ||||
|     {paths: [process.argv[1]]}, | ||||
|   )', __dir__]).strip | ||||
|  | ||||
| platform :ios, min_ios_version_supported | ||||
| prepare_react_native_project! | ||||
|  | ||||
| # If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. | ||||
| # because `react-native-flipper` depends on (FlipperKit,...) that will be excluded | ||||
| # | ||||
| # To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` | ||||
| # ```js | ||||
| # module.exports = { | ||||
| #   dependencies: { | ||||
| #     ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), | ||||
| # ``` | ||||
| flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled | ||||
|  | ||||
| linkage = ENV['USE_FRAMEWORKS'] | ||||
| if linkage != nil | ||||
|   Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green | ||||
|   use_frameworks! :linkage => linkage.to_sym | ||||
| end | ||||
|  | ||||
| target 'harmony_use_pushy' do | ||||
|   config = use_native_modules! | ||||
|  | ||||
|   # Flags change depending on the env values. | ||||
|   flags = get_default_flags() | ||||
|  | ||||
|   use_react_native!( | ||||
|     :path => config[:reactNativePath], | ||||
|     # Hermes is now enabled by default. Disable by setting this flag to false. | ||||
|     :hermes_enabled => flags[:hermes_enabled], | ||||
|     :fabric_enabled => flags[:fabric_enabled], | ||||
|     # Enables Flipper. | ||||
|     # | ||||
|     # Note that if you have use_frameworks! enabled, Flipper will not work and | ||||
|     # you should disable the next line. | ||||
|     :flipper_configuration => flipper_config, | ||||
|     # An absolute path to your application root. | ||||
|     :app_path => "#{Pod::Config.instance.installation_root}/.." | ||||
|   ) | ||||
|  | ||||
|   target 'harmony_use_pushyTests' do | ||||
|     inherit! :complete | ||||
|     # Pods for testing | ||||
|   end | ||||
|  | ||||
|   post_install do |installer| | ||||
|     # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 | ||||
|     react_native_post_install( | ||||
|       installer, | ||||
|       config[:reactNativePath], | ||||
|       :mac_catalyst_enabled => false | ||||
|     ) | ||||
|     __apply_Xcode_12_5_M1_post_install_workaround(installer) | ||||
|   end | ||||
| end | ||||
| @@ -0,0 +1,702 @@ | ||||
| // !$*UTF8*$! | ||||
| { | ||||
| 	archiveVersion = 1; | ||||
| 	classes = { | ||||
| 	}; | ||||
| 	objectVersion = 54; | ||||
| 	objects = { | ||||
|  | ||||
| /* Begin PBXBuildFile section */ | ||||
| 		00E356F31AD99517003FC87E /* harmony_use_pushyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* harmony_use_pushyTests.m */; }; | ||||
| 		0C80B921A6F3F58F76C31292 /* libPods-harmony_use_pushy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5DCACB8F33CDC322A6C60F78 /* libPods-harmony_use_pushy.a */; }; | ||||
| 		13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; | ||||
| 		13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; | ||||
| 		13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; | ||||
| 		7699B88040F8A987B510C191 /* libPods-harmony_use_pushy-harmony_use_pushyTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19F6CBCC0A4E27FBF8BF4A61 /* libPods-harmony_use_pushy-harmony_use_pushyTests.a */; }; | ||||
| 		81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; | ||||
| /* End PBXBuildFile section */ | ||||
|  | ||||
| /* Begin PBXContainerItemProxy section */ | ||||
| 		00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { | ||||
| 			isa = PBXContainerItemProxy; | ||||
| 			containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; | ||||
| 			proxyType = 1; | ||||
| 			remoteGlobalIDString = 13B07F861A680F5B00A75B9A; | ||||
| 			remoteInfo = harmony_use_pushy; | ||||
| 		}; | ||||
| /* End PBXContainerItemProxy section */ | ||||
|  | ||||
| /* Begin PBXFileReference section */ | ||||
| 		00E356EE1AD99517003FC87E /* harmony_use_pushyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = harmony_use_pushyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
| 		00E356F21AD99517003FC87E /* harmony_use_pushyTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = harmony_use_pushyTests.m; sourceTree = "<group>"; }; | ||||
| 		13B07F961A680F5B00A75B9A /* harmony_use_pushy.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = harmony_use_pushy.app; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = harmony_use_pushy/AppDelegate.h; sourceTree = "<group>"; }; | ||||
| 		13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = harmony_use_pushy/AppDelegate.mm; sourceTree = "<group>"; }; | ||||
| 		13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = harmony_use_pushy/Images.xcassets; sourceTree = "<group>"; }; | ||||
| 		13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = harmony_use_pushy/Info.plist; sourceTree = "<group>"; }; | ||||
| 		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = harmony_use_pushy/main.m; sourceTree = "<group>"; }; | ||||
| 		19F6CBCC0A4E27FBF8BF4A61 /* libPods-harmony_use_pushy-harmony_use_pushyTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-harmony_use_pushy-harmony_use_pushyTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		3B4392A12AC88292D35C810B /* Pods-harmony_use_pushy.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-harmony_use_pushy.debug.xcconfig"; path = "Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy.debug.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		5709B34CF0A7D63546082F79 /* Pods-harmony_use_pushy.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-harmony_use_pushy.release.xcconfig"; path = "Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy.release.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		5B7EB9410499542E8C5724F5 /* Pods-harmony_use_pushy-harmony_use_pushyTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-harmony_use_pushy-harmony_use_pushyTests.debug.xcconfig"; path = "Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests.debug.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		5DCACB8F33CDC322A6C60F78 /* libPods-harmony_use_pushy.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-harmony_use_pushy.a"; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = harmony_use_pushy/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||||
| 		89C6BE57DB24E9ADA2F236DE /* Pods-harmony_use_pushy-harmony_use_pushyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-harmony_use_pushy-harmony_use_pushyTests.release.xcconfig"; path = "Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests.release.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; | ||||
| /* End PBXFileReference section */ | ||||
|  | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		00E356EB1AD99517003FC87E /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				7699B88040F8A987B510C191 /* libPods-harmony_use_pushy-harmony_use_pushyTests.a in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		13B07F8C1A680F5B00A75B9A /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				0C80B921A6F3F58F76C31292 /* libPods-harmony_use_pushy.a in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXFrameworksBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXGroup section */ | ||||
| 		00E356EF1AD99517003FC87E /* harmony_use_pushyTests */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				00E356F21AD99517003FC87E /* harmony_use_pushyTests.m */, | ||||
| 				00E356F01AD99517003FC87E /* Supporting Files */, | ||||
| 			); | ||||
| 			path = harmony_use_pushyTests; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		00E356F01AD99517003FC87E /* Supporting Files */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				00E356F11AD99517003FC87E /* Info.plist */, | ||||
| 			); | ||||
| 			name = "Supporting Files"; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		13B07FAE1A68108700A75B9A /* harmony_use_pushy */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				13B07FAF1A68108700A75B9A /* AppDelegate.h */, | ||||
| 				13B07FB01A68108700A75B9A /* AppDelegate.mm */, | ||||
| 				13B07FB51A68108700A75B9A /* Images.xcassets */, | ||||
| 				13B07FB61A68108700A75B9A /* Info.plist */, | ||||
| 				81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, | ||||
| 				13B07FB71A68108700A75B9A /* main.m */, | ||||
| 			); | ||||
| 			name = harmony_use_pushy; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		2D16E6871FA4F8E400B85C8A /* Frameworks */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				ED297162215061F000B7C4FE /* JavaScriptCore.framework */, | ||||
| 				5DCACB8F33CDC322A6C60F78 /* libPods-harmony_use_pushy.a */, | ||||
| 				19F6CBCC0A4E27FBF8BF4A61 /* libPods-harmony_use_pushy-harmony_use_pushyTests.a */, | ||||
| 			); | ||||
| 			name = Frameworks; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		832341AE1AAA6A7D00B99B32 /* Libraries */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 			); | ||||
| 			name = Libraries; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		83CBB9F61A601CBA00E9B192 = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				13B07FAE1A68108700A75B9A /* harmony_use_pushy */, | ||||
| 				832341AE1AAA6A7D00B99B32 /* Libraries */, | ||||
| 				00E356EF1AD99517003FC87E /* harmony_use_pushyTests */, | ||||
| 				83CBBA001A601CBA00E9B192 /* Products */, | ||||
| 				2D16E6871FA4F8E400B85C8A /* Frameworks */, | ||||
| 				BBD78D7AC51CEA395F1C20DB /* Pods */, | ||||
| 			); | ||||
| 			indentWidth = 2; | ||||
| 			sourceTree = "<group>"; | ||||
| 			tabWidth = 2; | ||||
| 			usesTabs = 0; | ||||
| 		}; | ||||
| 		83CBBA001A601CBA00E9B192 /* Products */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				13B07F961A680F5B00A75B9A /* harmony_use_pushy.app */, | ||||
| 				00E356EE1AD99517003FC87E /* harmony_use_pushyTests.xctest */, | ||||
| 			); | ||||
| 			name = Products; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		BBD78D7AC51CEA395F1C20DB /* Pods */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				3B4392A12AC88292D35C810B /* Pods-harmony_use_pushy.debug.xcconfig */, | ||||
| 				5709B34CF0A7D63546082F79 /* Pods-harmony_use_pushy.release.xcconfig */, | ||||
| 				5B7EB9410499542E8C5724F5 /* Pods-harmony_use_pushy-harmony_use_pushyTests.debug.xcconfig */, | ||||
| 				89C6BE57DB24E9ADA2F236DE /* Pods-harmony_use_pushy-harmony_use_pushyTests.release.xcconfig */, | ||||
| 			); | ||||
| 			path = Pods; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
|  | ||||
| /* Begin PBXNativeTarget section */ | ||||
| 		00E356ED1AD99517003FC87E /* harmony_use_pushyTests */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "harmony_use_pushyTests" */; | ||||
| 			buildPhases = ( | ||||
| 				A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */, | ||||
| 				00E356EA1AD99517003FC87E /* Sources */, | ||||
| 				00E356EB1AD99517003FC87E /* Frameworks */, | ||||
| 				00E356EC1AD99517003FC87E /* Resources */, | ||||
| 				C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */, | ||||
| 				F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 				00E356F51AD99517003FC87E /* PBXTargetDependency */, | ||||
| 			); | ||||
| 			name = harmony_use_pushyTests; | ||||
| 			productName = harmony_use_pushyTests; | ||||
| 			productReference = 00E356EE1AD99517003FC87E /* harmony_use_pushyTests.xctest */; | ||||
| 			productType = "com.apple.product-type.bundle.unit-test"; | ||||
| 		}; | ||||
| 		13B07F861A680F5B00A75B9A /* harmony_use_pushy */ = { | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "harmony_use_pushy" */; | ||||
| 			buildPhases = ( | ||||
| 				C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */, | ||||
| 				FD10A7F022414F080027D42C /* Start Packager */, | ||||
| 				13B07F871A680F5B00A75B9A /* Sources */, | ||||
| 				13B07F8C1A680F5B00A75B9A /* Frameworks */, | ||||
| 				13B07F8E1A680F5B00A75B9A /* Resources */, | ||||
| 				00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, | ||||
| 				00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */, | ||||
| 				E235C05ADACE081382539298 /* [CP] Copy Pods Resources */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| 			dependencies = ( | ||||
| 			); | ||||
| 			name = harmony_use_pushy; | ||||
| 			productName = harmony_use_pushy; | ||||
| 			productReference = 13B07F961A680F5B00A75B9A /* harmony_use_pushy.app */; | ||||
| 			productType = "com.apple.product-type.application"; | ||||
| 		}; | ||||
| /* End PBXNativeTarget section */ | ||||
|  | ||||
| /* Begin PBXProject section */ | ||||
| 		83CBB9F71A601CBA00E9B192 /* Project object */ = { | ||||
| 			isa = PBXProject; | ||||
| 			attributes = { | ||||
| 				LastUpgradeCheck = 1210; | ||||
| 				TargetAttributes = { | ||||
| 					00E356ED1AD99517003FC87E = { | ||||
| 						CreatedOnToolsVersion = 6.2; | ||||
| 						TestTargetID = 13B07F861A680F5B00A75B9A; | ||||
| 					}; | ||||
| 					13B07F861A680F5B00A75B9A = { | ||||
| 						LastSwiftMigration = 1120; | ||||
| 					}; | ||||
| 				}; | ||||
| 			}; | ||||
| 			buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "harmony_use_pushy" */; | ||||
| 			compatibilityVersion = "Xcode 12.0"; | ||||
| 			developmentRegion = en; | ||||
| 			hasScannedForEncodings = 0; | ||||
| 			knownRegions = ( | ||||
| 				en, | ||||
| 				Base, | ||||
| 			); | ||||
| 			mainGroup = 83CBB9F61A601CBA00E9B192; | ||||
| 			productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; | ||||
| 			projectDirPath = ""; | ||||
| 			projectRoot = ""; | ||||
| 			targets = ( | ||||
| 				13B07F861A680F5B00A75B9A /* harmony_use_pushy */, | ||||
| 				00E356ED1AD99517003FC87E /* harmony_use_pushyTests */, | ||||
| 			); | ||||
| 		}; | ||||
| /* End PBXProject section */ | ||||
|  | ||||
| /* Begin PBXResourcesBuildPhase section */ | ||||
| 		00E356EC1AD99517003FC87E /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		13B07F8E1A680F5B00A75B9A /* Resources */ = { | ||||
| 			isa = PBXResourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, | ||||
| 				13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXResourcesBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXShellScriptBuildPhase section */ | ||||
| 		00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"$(SRCROOT)/.xcode.env.local", | ||||
| 				"$(SRCROOT)/.xcode.env", | ||||
| 			); | ||||
| 			name = "Bundle React Native code and images"; | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; | ||||
| 		}; | ||||
| 		00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-frameworks-${CONFIGURATION}-input-files.xcfilelist", | ||||
| 			); | ||||
| 			name = "[CP] Embed Pods Frameworks"; | ||||
| 			outputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-frameworks-${CONFIGURATION}-output-files.xcfilelist", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-frameworks.sh\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		A55EABD7B0C7F3A422A6CC61 /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"${PODS_PODFILE_DIR_PATH}/Podfile.lock", | ||||
| 				"${PODS_ROOT}/Manifest.lock", | ||||
| 			); | ||||
| 			name = "[CP] Check Pods Manifest.lock"; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 				"$(DERIVED_FILE_DIR)/Pods-harmony_use_pushy-harmony_use_pushyTests-checkManifestLockResult.txt", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		C38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"${PODS_PODFILE_DIR_PATH}/Podfile.lock", | ||||
| 				"${PODS_ROOT}/Manifest.lock", | ||||
| 			); | ||||
| 			name = "[CP] Check Pods Manifest.lock"; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 				"$(DERIVED_FILE_DIR)/Pods-harmony_use_pushy-checkManifestLockResult.txt", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		C59DA0FBD6956966B86A3779 /* [CP] Embed Pods Frameworks */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", | ||||
| 			); | ||||
| 			name = "[CP] Embed Pods Frameworks"; | ||||
| 			outputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-frameworks.sh\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		E235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-resources-${CONFIGURATION}-input-files.xcfilelist", | ||||
| 			); | ||||
| 			name = "[CP] Copy Pods Resources"; | ||||
| 			outputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-resources-${CONFIGURATION}-output-files.xcfilelist", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy/Pods-harmony_use_pushy-resources.sh\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		F6A41C54EA430FDDC6A6ED99 /* [CP] Copy Pods Resources */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-resources-${CONFIGURATION}-input-files.xcfilelist", | ||||
| 			); | ||||
| 			name = "[CP] Copy Pods Resources"; | ||||
| 			outputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-resources-${CONFIGURATION}-output-files.xcfilelist", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-harmony_use_pushy-harmony_use_pushyTests/Pods-harmony_use_pushy-harmony_use_pushyTests-resources.sh\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		FD10A7F022414F080027D42C /* Start Packager */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 			); | ||||
| 			name = "Start Packager"; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n  if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n    if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n      echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n      exit 2\n    fi\n  else\n    open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n  fi\nfi\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| /* End PBXShellScriptBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| 		00E356EA1AD99517003FC87E /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				00E356F31AD99517003FC87E /* harmony_use_pushyTests.m in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		13B07F871A680F5B00A75B9A /* Sources */ = { | ||||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, | ||||
| 				13B07FC11A68108700A75B9A /* main.m in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| /* End PBXSourcesBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXTargetDependency section */ | ||||
| 		00E356F51AD99517003FC87E /* PBXTargetDependency */ = { | ||||
| 			isa = PBXTargetDependency; | ||||
| 			target = 13B07F861A680F5B00A75B9A /* harmony_use_pushy */; | ||||
| 			targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; | ||||
| 		}; | ||||
| /* End PBXTargetDependency section */ | ||||
|  | ||||
| /* Begin XCBuildConfiguration section */ | ||||
| 		00E356F61AD99517003FC87E /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 5B7EB9410499542E8C5724F5 /* Pods-harmony_use_pushy-harmony_use_pushyTests.debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				INFOPLIST_FILE = harmony_use_pushyTests/Info.plist; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.4; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@loader_path/Frameworks", | ||||
| 				); | ||||
| 				OTHER_LDFLAGS = ( | ||||
| 					"-ObjC", | ||||
| 					"-lc++", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/harmony_use_pushy.app/harmony_use_pushy"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		00E356F71AD99517003FC87E /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 89C6BE57DB24E9ADA2F236DE /* Pods-harmony_use_pushy-harmony_use_pushyTests.release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				INFOPLIST_FILE = harmony_use_pushyTests/Info.plist; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.4; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 					"@loader_path/Frameworks", | ||||
| 				); | ||||
| 				OTHER_LDFLAGS = ( | ||||
| 					"-ObjC", | ||||
| 					"-lc++", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/harmony_use_pushy.app/harmony_use_pushy"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		13B07F941A680F5B00A75B9A /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-harmony_use_pushy.debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				ENABLE_BITCODE = NO; | ||||
| 				INFOPLIST_FILE = harmony_use_pushy/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				OTHER_LDFLAGS = ( | ||||
| 					"$(inherited)", | ||||
| 					"-ObjC", | ||||
| 					"-lc++", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; | ||||
| 				PRODUCT_NAME = harmony_use_pushy; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		13B07F951A680F5B00A75B9A /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-harmony_use_pushy.release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CURRENT_PROJECT_VERSION = 1; | ||||
| 				INFOPLIST_FILE = harmony_use_pushy/Info.plist; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					"$(inherited)", | ||||
| 					"@executable_path/Frameworks", | ||||
| 				); | ||||
| 				MARKETING_VERSION = 1.0; | ||||
| 				OTHER_LDFLAGS = ( | ||||
| 					"$(inherited)", | ||||
| 					"-ObjC", | ||||
| 					"-lc++", | ||||
| 				); | ||||
| 				PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; | ||||
| 				PRODUCT_NAME = harmony_use_pushy; | ||||
| 				SWIFT_VERSION = 5.0; | ||||
| 				VERSIONING_SYSTEM = "apple-generic"; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| 		83CBBA201A601CBA00E9B192 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "c++17"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				ENABLE_TESTABILITY = YES; | ||||
| 				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_DYNAMIC_NO_PIC = NO; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_OPTIMIZATION_LEVEL = 0; | ||||
| 				GCC_PREPROCESSOR_DEFINITIONS = ( | ||||
| 					"DEBUG=1", | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				GCC_SYMBOLS_PRIVATE_EXTERN = NO; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.4; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					/usr/lib/swift, | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				LIBRARY_SEARCH_PATHS = ( | ||||
| 					"\"$(SDKROOT)/usr/lib/swift\"", | ||||
| 					"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", | ||||
| 					"\"$(inherited)\"", | ||||
| 				); | ||||
| 				MTL_ENABLE_DEBUG_INFO = YES; | ||||
| 				ONLY_ACTIVE_ARCH = YES; | ||||
| 				OTHER_CPLUSPLUSFLAGS = ( | ||||
| 					"$(OTHER_CFLAGS)", | ||||
| 					"-DFOLLY_NO_CONFIG", | ||||
| 					"-DFOLLY_MOBILE=1", | ||||
| 					"-DFOLLY_USE_LIBCPP=1", | ||||
| 				); | ||||
| 				SDKROOT = iphoneos; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		83CBBA211A601CBA00E9B192 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				ALWAYS_SEARCH_USER_PATHS = NO; | ||||
| 				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||||
| 				CLANG_CXX_LANGUAGE_STANDARD = "c++17"; | ||||
| 				CLANG_CXX_LIBRARY = "libc++"; | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				CLANG_ENABLE_OBJC_ARC = YES; | ||||
| 				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||||
| 				CLANG_WARN_BOOL_CONVERSION = YES; | ||||
| 				CLANG_WARN_COMMA = YES; | ||||
| 				CLANG_WARN_CONSTANT_CONVERSION = YES; | ||||
| 				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||||
| 				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||||
| 				CLANG_WARN_EMPTY_BODY = YES; | ||||
| 				CLANG_WARN_ENUM_CONVERSION = YES; | ||||
| 				CLANG_WARN_INFINITE_RECURSION = YES; | ||||
| 				CLANG_WARN_INT_CONVERSION = YES; | ||||
| 				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||||
| 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||||
| 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||||
| 				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||||
| 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||||
| 				CLANG_WARN_STRICT_PROTOTYPES = YES; | ||||
| 				CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||||
| 				CLANG_WARN_UNREACHABLE_CODE = YES; | ||||
| 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||||
| 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; | ||||
| 				COPY_PHASE_STRIP = YES; | ||||
| 				ENABLE_NS_ASSERTIONS = NO; | ||||
| 				ENABLE_STRICT_OBJC_MSGSEND = YES; | ||||
| 				"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; | ||||
| 				GCC_C_LANGUAGE_STANDARD = gnu99; | ||||
| 				GCC_NO_COMMON_BLOCKS = YES; | ||||
| 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||||
| 				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||||
| 				GCC_WARN_UNDECLARED_SELECTOR = YES; | ||||
| 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||||
| 				GCC_WARN_UNUSED_FUNCTION = YES; | ||||
| 				GCC_WARN_UNUSED_VARIABLE = YES; | ||||
| 				IPHONEOS_DEPLOYMENT_TARGET = 12.4; | ||||
| 				LD_RUNPATH_SEARCH_PATHS = ( | ||||
| 					/usr/lib/swift, | ||||
| 					"$(inherited)", | ||||
| 				); | ||||
| 				LIBRARY_SEARCH_PATHS = ( | ||||
| 					"\"$(SDKROOT)/usr/lib/swift\"", | ||||
| 					"\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", | ||||
| 					"\"$(inherited)\"", | ||||
| 				); | ||||
| 				MTL_ENABLE_DEBUG_INFO = NO; | ||||
| 				OTHER_CPLUSPLUSFLAGS = ( | ||||
| 					"$(OTHER_CFLAGS)", | ||||
| 					"-DFOLLY_NO_CONFIG", | ||||
| 					"-DFOLLY_MOBILE=1", | ||||
| 					"-DFOLLY_USE_LIBCPP=1", | ||||
| 				); | ||||
| 				SDKROOT = iphoneos; | ||||
| 				VALIDATE_PRODUCT = YES; | ||||
| 			}; | ||||
| 			name = Release; | ||||
| 		}; | ||||
| /* End XCBuildConfiguration section */ | ||||
|  | ||||
| /* Begin XCConfigurationList section */ | ||||
| 		00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "harmony_use_pushyTests" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				00E356F61AD99517003FC87E /* Debug */, | ||||
| 				00E356F71AD99517003FC87E /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "harmony_use_pushy" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				13B07F941A680F5B00A75B9A /* Debug */, | ||||
| 				13B07F951A680F5B00A75B9A /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "harmony_use_pushy" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
| 			buildConfigurations = ( | ||||
| 				83CBBA201A601CBA00E9B192 /* Debug */, | ||||
| 				83CBBA211A601CBA00E9B192 /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* End XCConfigurationList section */ | ||||
| 	}; | ||||
| 	rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; | ||||
| } | ||||
| @@ -0,0 +1,88 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <Scheme | ||||
|    LastUpgradeVersion = "1210" | ||||
|    version = "1.3"> | ||||
|    <BuildAction | ||||
|       parallelizeBuildables = "YES" | ||||
|       buildImplicitDependencies = "YES"> | ||||
|       <BuildActionEntries> | ||||
|          <BuildActionEntry | ||||
|             buildForTesting = "YES" | ||||
|             buildForRunning = "YES" | ||||
|             buildForProfiling = "YES" | ||||
|             buildForArchiving = "YES" | ||||
|             buildForAnalyzing = "YES"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | ||||
|                BuildableName = "harmony_use_pushy.app" | ||||
|                BlueprintName = "harmony_use_pushy" | ||||
|                ReferencedContainer = "container:harmony_use_pushy.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </BuildActionEntry> | ||||
|       </BuildActionEntries> | ||||
|    </BuildAction> | ||||
|    <TestAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES"> | ||||
|       <Testables> | ||||
|          <TestableReference | ||||
|             skipped = "NO"> | ||||
|             <BuildableReference | ||||
|                BuildableIdentifier = "primary" | ||||
|                BlueprintIdentifier = "00E356ED1AD99517003FC87E" | ||||
|                BuildableName = "harmony_use_pushyTests.xctest" | ||||
|                BlueprintName = "harmony_use_pushyTests" | ||||
|                ReferencedContainer = "container:harmony_use_pushy.xcodeproj"> | ||||
|             </BuildableReference> | ||||
|          </TestableReference> | ||||
|       </Testables> | ||||
|    </TestAction> | ||||
|    <LaunchAction | ||||
|       buildConfiguration = "Debug" | ||||
|       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" | ||||
|       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" | ||||
|       launchStyle = "0" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       ignoresPersistentStateOnLaunch = "NO" | ||||
|       debugDocumentVersioning = "YES" | ||||
|       debugServiceExtension = "internal" | ||||
|       allowLocationSimulation = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | ||||
|             BuildableName = "harmony_use_pushy.app" | ||||
|             BlueprintName = "harmony_use_pushy" | ||||
|             ReferencedContainer = "container:harmony_use_pushy.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </LaunchAction> | ||||
|    <ProfileAction | ||||
|       buildConfiguration = "Release" | ||||
|       shouldUseLaunchSchemeArgsEnv = "YES" | ||||
|       savedToolIdentifier = "" | ||||
|       useCustomWorkingDirectory = "NO" | ||||
|       debugDocumentVersioning = "YES"> | ||||
|       <BuildableProductRunnable | ||||
|          runnableDebuggingMode = "0"> | ||||
|          <BuildableReference | ||||
|             BuildableIdentifier = "primary" | ||||
|             BlueprintIdentifier = "13B07F861A680F5B00A75B9A" | ||||
|             BuildableName = "harmony_use_pushy.app" | ||||
|             BlueprintName = "harmony_use_pushy" | ||||
|             ReferencedContainer = "container:harmony_use_pushy.xcodeproj"> | ||||
|          </BuildableReference> | ||||
|       </BuildableProductRunnable> | ||||
|    </ProfileAction> | ||||
|    <AnalyzeAction | ||||
|       buildConfiguration = "Debug"> | ||||
|    </AnalyzeAction> | ||||
|    <ArchiveAction | ||||
|       buildConfiguration = "Release" | ||||
|       revealArchiveInOrganizer = "YES"> | ||||
|    </ArchiveAction> | ||||
| </Scheme> | ||||
| @@ -0,0 +1,6 @@ | ||||
| #import <RCTAppDelegate.h> | ||||
| #import <UIKit/UIKit.h> | ||||
|  | ||||
| @interface AppDelegate : RCTAppDelegate | ||||
|  | ||||
| @end | ||||
| @@ -0,0 +1,26 @@ | ||||
| #import "AppDelegate.h" | ||||
|  | ||||
| #import <React/RCTBundleURLProvider.h> | ||||
|  | ||||
| @implementation AppDelegate | ||||
|  | ||||
| - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||||
| { | ||||
|   self.moduleName = @"harmony_use_pushy"; | ||||
|   // You can add your custom initial props in the dictionary below. | ||||
|   // They will be passed down to the ViewController used by React Native. | ||||
|   self.initialProps = @{}; | ||||
|  | ||||
|   return [super application:application didFinishLaunchingWithOptions:launchOptions]; | ||||
| } | ||||
|  | ||||
| - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | ||||
| { | ||||
| #if DEBUG | ||||
|   return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; | ||||
| #else | ||||
|   return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| @end | ||||
| @@ -0,0 +1,53 @@ | ||||
| { | ||||
|   "images" : [ | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "2x", | ||||
|       "size" : "20x20" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "3x", | ||||
|       "size" : "20x20" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "2x", | ||||
|       "size" : "29x29" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "3x", | ||||
|       "size" : "29x29" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "2x", | ||||
|       "size" : "40x40" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "3x", | ||||
|       "size" : "40x40" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "2x", | ||||
|       "size" : "60x60" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "iphone", | ||||
|       "scale" : "3x", | ||||
|       "size" : "60x60" | ||||
|     }, | ||||
|     { | ||||
|       "idiom" : "ios-marketing", | ||||
|       "scale" : "1x", | ||||
|       "size" : "1024x1024" | ||||
|     } | ||||
|   ], | ||||
|   "info" : { | ||||
|     "author" : "xcode", | ||||
|     "version" : 1 | ||||
|   } | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| { | ||||
|   "info" : { | ||||
|     "version" : 1, | ||||
|     "author" : "xcode" | ||||
|   } | ||||
| } | ||||
 波仔糕
					波仔糕