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 | android/bin | ||||||
| Example/testHotUpdate/harmony | Example/testHotUpdate/harmony | ||||||
| Example/testHotUpdate/android/app/.cxx | Example/testHotUpdate/android/app/.cxx | ||||||
|  | Example/harmony_use_pushy/libs | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						| @@ -4,3 +4,9 @@ | |||||||
| [submodule "android/jni/HDiffPatch"] | [submodule "android/jni/HDiffPatch"] | ||||||
| 	path = android/jni/HDiffPatch | 	path = android/jni/HDiffPatch | ||||||
| 	url = https://github.com/sisong/HDiffPatch.git | 	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" | ||||||
|  |   } | ||||||
|  | } | ||||||
 波仔糕
					波仔糕