├── .circleci └── config.yml ├── .editorconfig ├── .eslintrc ├── .flowconfig ├── .gitattributes ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── android ├── build.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── reactnativecommunity │ └── status-bar │ ├── RNCStatusBarModule.java │ └── RNCStatusBarPackage.java ├── babel.config.js ├── e2e ├── Mutations.spec.js ├── config.json └── init.js ├── example ├── App.js ├── android │ ├── app │ │ ├── BUCK │ │ ├── build.gradle │ │ ├── build_defs.bzl │ │ ├── proguard-rules.pro │ │ ├── release.keystore │ │ └── src │ │ │ ├── androidTest │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── statusbarexample │ │ │ │ └── DetoxTest.java │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets │ │ │ └── .gitkeep │ │ │ ├── java │ │ │ └── com │ │ │ │ └── statusbarexample │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── res │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── keystores │ │ ├── BUCK │ │ └── debug.keystore.properties │ └── settings.gradle ├── app.json ├── index.js └── ios │ ├── StatusBarExample-tvOS │ └── Info.plist │ ├── StatusBarExample-tvOSTests │ └── Info.plist │ ├── StatusBarExample.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ ├── StatusBarExample-tvOS.xcscheme │ │ └── StatusBarExample.xcscheme │ ├── StatusBarExample │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Info.plist │ └── main.m │ └── StatusBarExampleTests │ ├── Info.plist │ └── StatusBarExampleTests.m ├── index.d.ts ├── ios ├── RNCStatusBar.h ├── RNCStatusBar.m ├── RNCStatusBar.podspec └── RNCStatusBar.xcodeproj │ └── project.pbxproj ├── js ├── StatusBar.android.js ├── StatusBar.ios.js └── StatusBar.js ├── package-lock.json ├── package.json ├── react-native-statusbar.podspec └── yarn.lock /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | rn: react-native-community/react-native@dev:0.1.0-rc10 5 | 6 | jobs: 7 | checkout_code: 8 | executor: rn/linux_js 9 | steps: 10 | - checkout 11 | - persist_to_workspace: 12 | root: . 13 | paths: . 14 | javascript: 15 | executor: rn/linux_js 16 | steps: 17 | - attach_workspace: 18 | at: . 19 | - rn/yarn_install 20 | - run: 21 | name: Eslint 22 | command: yarn run lint 23 | - run: 24 | name: Flow 25 | command: yarn run test:flow 26 | - run: 27 | name: TypeScript 28 | command: yarn run test:typescript 29 | - run: 30 | name: Android JavaScript Bundle 31 | command: yarn run bundle:e2e:android 32 | - run: 33 | name: iOS JavaScript Bundle 34 | command: yarn run bundle:e2e:ios 35 | - persist_to_workspace: 36 | root: . 37 | paths: 38 | - .tmp 39 | 40 | workflows: 41 | test: 42 | jobs: 43 | - checkout_code 44 | - javascript: 45 | requires: 46 | - checkout_code 47 | - rn/android_build: 48 | name: android_debug_build 49 | project_path: "example/android" 50 | build_type: debug 51 | requires: 52 | - javascript 53 | - rn/android_build: 54 | name: android_release_build 55 | project_path: "example/android" 56 | build_type: release 57 | requires: 58 | - javascript 59 | - rn/android_test: 60 | logcat_grep: "com.statusbarexample" 61 | detox_configuration: "android.emu.release" 62 | requires: 63 | - android_release_build 64 | - rn/ios_build_and_test: 65 | project_path: "example/ios/StatusBarExample.xcodeproj" 66 | derived_data_path: "example/ios/build" 67 | device: "iPhone X" 68 | build_configuration: "Release" 69 | scheme: "StatusBarExample" 70 | detox_configuration: "ios.sim.release" 71 | requires: 72 | - javascript 73 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | charset = utf-8 -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@react-native-community", 3 | "globals": { 4 | "it": true, 5 | "expect": true, 6 | "element": true, 7 | "describe": true, 8 | "by": true, 9 | "device": true, 10 | "beforeAll": true, 11 | "beforeEach": true, 12 | "afterAll": true, 13 | "jest": true, 14 | "jasmine": true 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | 16 | ; Ignore polyfills 17 | .*/Libraries/polyfills/.* 18 | 19 | ; Ignore metro 20 | .*/node_modules/metro/.* 21 | 22 | [include] 23 | 24 | [libs] 25 | node_modules/react-native/Libraries/react-native/react-native-interface.js 26 | node_modules/react-native/flow/ 27 | node_modules/react-native/flow-github/ 28 | 29 | [options] 30 | emoji=true 31 | 32 | esproposal.optional_chaining=enable 33 | esproposal.nullish_coalescing=enable 34 | 35 | module.system=haste 36 | module.system.haste.use_name_reducers=true 37 | # get basename 38 | module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' 39 | # strip .js or .js.flow suffix 40 | module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' 41 | # strip .ios suffix 42 | module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' 43 | module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' 44 | module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' 45 | module.system.haste.paths.blacklist=.*/__tests__/.* 46 | module.system.haste.paths.blacklist=.*/__mocks__/.* 47 | module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* 48 | module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* 49 | 50 | munge_underscores=true 51 | 52 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 53 | module.name_mapper='^\@react-native-community/status-bar$' -> '/js/StatusBar.js' 54 | 55 | module.file_ext=.js 56 | module.file_ext=.jsx 57 | module.file_ext=.json 58 | module.file_ext=.native.js 59 | 60 | suppress_type=$FlowIssue 61 | suppress_type=$FlowFixMe 62 | suppress_type=$FlowFixMeProps 63 | suppress_type=$FlowFixMeState 64 | 65 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 66 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 67 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 68 | suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError 69 | 70 | [version] 71 | ^0.86.0 72 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # OSX 3 | # 4 | .DS_Store 5 | 6 | # node.js 7 | # 8 | node_modules/ 9 | npm-debug.log 10 | yarn-error.log 11 | 12 | # Xcode 13 | # 14 | build/ 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | xcuserdata 24 | *.xccheckout 25 | *.moved-aside 26 | DerivedData 27 | *.hmap 28 | *.ipa 29 | *.xcuserstate 30 | project.xcworkspace 31 | 32 | 33 | # Android/IntelliJ 34 | # 35 | build/ 36 | .idea 37 | .gradle 38 | local.properties 39 | *.iml 40 | 41 | # BUCK 42 | buck-out/ 43 | \.buckd/ 44 | 45 | 46 | .env 47 | .tmp 48 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | 2 | # JS 3 | node_modules 4 | yarn.lock 5 | 6 | # Project files 7 | CONTRIBUTING.md 8 | CODE_OF_CONDUCT.md 9 | README.md 10 | 11 | # Config files 12 | .babelrc 13 | babel.config.js 14 | .editorconfig 15 | .eslintrc 16 | .flowconfig 17 | .watchmanconfig 18 | jsconfig.json 19 | .npmrc 20 | .gitattributes 21 | .circleci 22 | *.coverage.json 23 | .opensource 24 | .circleci 25 | .eslintignore 26 | .env 27 | codecov.yml 28 | 29 | # Example 30 | example/ 31 | 32 | # Android 33 | android/*/build/ 34 | android/gradlew 35 | android/build 36 | android/gradlew.bat 37 | android/gradle/ 38 | android/com_crashlytics_export_strings.xml 39 | android/local.properties 40 | android/.gradle/ 41 | android/.signing/ 42 | android/.idea/gradle.xml 43 | android/.idea/libraries/ 44 | android/.idea/workspace.xml 45 | android/.idea/tasks.xml 46 | android/.idea/.name 47 | android/.idea/compiler.xml 48 | android/.idea/copyright/profiles_settings.xml 49 | android/.idea/encodings.xml 50 | android/.idea/misc.xml 51 | android/.idea/modules.xml 52 | android/.idea/scopes/scope_settings.xml 53 | android/.idea/vcs.xml 54 | android/*.iml 55 | android/.settings 56 | 57 | # iOS 58 | ios/*.xcodeproj/xcuserdata 59 | *.pbxuser 60 | *.mode1v3 61 | *.mode2v3 62 | *.perspectivev3 63 | *.xcuserstate 64 | project.xcworkspace/ 65 | xcuserdata/ 66 | 67 | # Misc 68 | .DS_Store 69 | .DS_Store? 70 | *.DS_Store 71 | coverage.android.json 72 | coverage.ios.json 73 | coverage 74 | npm-debug.log 75 | .github 76 | ._* 77 | .Spotlight-V100 78 | .Trashes 79 | ehthumbs.db 80 | Thumbs.dbandroid/gradle 81 | docs 82 | .idea 83 | tests/ 84 | bin/test.js 85 | codorials 86 | .vscode 87 | .nyc_output 88 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 1.0.3 (2019-03-29) 2 | 3 | ### Fixes 4 | 5 | * Add many more tests, improve CI 6 | * Add missing `google()` to the android build.gradle (#15) 7 | 8 | 9 | # 1.0.2 (2019-03-13) 10 | 11 | ### Fixes 12 | 13 | * Fix missing react peer dependency 14 | 15 | # 1.0.1 (2019-03-13) 16 | 17 | ### Features 18 | 19 | * Add TypeScript support ([#8](https://github.com/react-native-community/react-native-statusbar/issues/8)) 20 | 21 | ### Other 22 | 23 | * Add PodFile 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 React Native Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-native-status-bar 2 | 3 | [![npm package](https://img.shields.io/npm/v/@react-native-community/status-bar.svg)](https://www.npmjs.org/package/@react-native-community/status-bar) 4 | [![CircleCI Status](https://img.shields.io/circleci/project/github/react-native-community/react-native-statusbar/master.svg)](https://circleci.com/gh/react-native-community/workflows/react-native-netinfo/tree/master) ![Supports Android and iOS](https://img.shields.io/badge/platforms-android%20|%20ios-lightgrey.svg) 5 | ![MIT License](https://img.shields.io/npm/l/@react-native-community/status-bar.svg) 6 | [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) 7 | 8 | # Development is on hold 9 | This project is not actively supported because of [this issue](https://github.com/react-native-community/react-native-statusbar/issues/28). (Current state of events is that the StatusBar stays in the core for now. We're not sure for how long though.) 10 | 11 | ## Getting started 12 | 13 | `$ npm install @react-native-community/status-bar --save` 14 | 15 | ### Mostly automatic installation 16 | 17 | `$ react-native link @react-native-community/status-bar` 18 | 19 | ### Manual installation 20 | 21 | #### iOS 22 | 23 | 1. In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` 24 | 2. Go to `node_modules` ➜ `react-native-status-bar` and add `RNCStatusBar.xcodeproj` 25 | 3. In XCode, in the project navigator, select your project. Add `libRNCStatusBar.a` to your project's `Build Phases` ➜ `Link Binary With Libraries` 26 | 4. Run your project (`Cmd+R`) 27 | 28 | #### Android 29 | 30 | 1. Open up `android/app/src/main/java/[...]/MainActivity.java` 31 | 32 | - Add `import com.reactnativecommunity.statusbar.RNCStatusBarPackage;` to the imports at the top of the file 33 | - Add `new RNCStatusBarPackage()` to the list returned by the `getPackages()` method 34 | 35 | 2. Append the following lines to `android/settings.gradle`: 36 | ``` 37 | include ':@react-native-community_status-bar' 38 | project(':@react-native-community_status-bar').projectDir = new File(rootProject.projectDir, '../../node_modules/@react-native-community/status-bar/android') 39 | ``` 40 | 3. Insert the following lines inside the dependencies block in `android/app/build.gradle`: 41 | ``` 42 | implementation project(':@react-native-community_status-bar') 43 | ``` 44 | 45 | ## Usage 46 | 47 | ```javascript 48 | import StatusBar from '@react-native-community/status-bar'; 49 | 50 | function MyComponent() { 51 | return ( 52 | StatusBar.setHidden(true, "slide")} // or "fade" 55 | > 56 | 57 | Hide status bar 58 | 59 | 60 | ) 61 | } 62 | ``` 63 | 64 | ## Api 65 | 66 | For cases where using a component is not ideal, there is also an imperative API exposed as static functions on the component. It is however not recommended to use the static API and the component for the same prop because any value set by the static API will get overriden by the one set by the component in the next render. 67 | 68 | ### Constants 69 | 70 | `currentHeight` (Android only) The height of the status bar. 71 | 72 | ### Props 73 | 74 | * [`animated`](#animated) 75 | * [`barStyle`](#barstyle) 76 | * [`hidden`](#hidden) 77 | * [`backgroundColor`](#backgroundcolor) 78 | * [`translucent`](#translucent) 79 | * [`networkActivityIndicatorVisible`](#networkactivityindicatorvisible) 80 | * [`showHideTransition`](#showhidetransition) 81 | 82 | ### Methods 83 | 84 | * [`setHidden`](#sethidden) 85 | * [`setBarStyle`](#setbarstyle) 86 | * [`setNetworkActivityIndicatorVisible`](#setnetworkactivityindicatorvisible) 87 | * [`setBackgroundColor`](#setbackgroundcolor) 88 | * [`setTranslucent`](#settranslucent) 89 | 90 | ### Type Definitions 91 | 92 | * [`StatusBarStyle`](#statusbarstyle) 93 | * [`StatusBarAnimation`](#statusbaranimation) 94 | 95 | --- 96 | 97 | # Reference 98 | 99 | ## Props 100 | 101 | ### `animated` 102 | 103 | If the transition between status bar property changes should be animated. Supported for backgroundColor, barStyle and hidden. 104 | 105 | | Type | Required | 106 | | ---- | -------- | 107 | | bool | No | 108 | 109 | --- 110 | 111 | ### `barStyle` 112 | 113 | Sets the color of the status bar text. 114 | 115 | | Type | Required | 116 | | ------------------------------------------------ | -------- | 117 | | enum('default', 'light-content', 'dark-content') | No | 118 | 119 | --- 120 | 121 | ### `hidden` 122 | 123 | If the status bar is hidden. 124 | 125 | | Type | Required | 126 | | ---- | -------- | 127 | | bool | No | 128 | 129 | --- 130 | 131 | ### `backgroundColor` 132 | 133 | The background color of the status bar. 134 | 135 | | Type | Required | Platform | 136 | | ------------------ | -------- | -------- | 137 | | [color](https://facebook.github.io/react-native/docs/colors) | No | Android | 138 | 139 | --- 140 | 141 | ### `translucent` 142 | 143 | If the status bar is translucent. When translucent is set to true, the app will draw under the status bar. This is useful when using a semi transparent status bar color. 144 | 145 | | Type | Required | Platform | 146 | | ---- | -------- | -------- | 147 | | bool | No | Android | 148 | 149 | --- 150 | 151 | ### `networkActivityIndicatorVisible` 152 | 153 | If the network activity indicator should be visible. 154 | 155 | | Type | Required | Platform | 156 | | ---- | -------- | -------- | 157 | | bool | No | iOS | 158 | 159 | --- 160 | 161 | ### `showHideTransition` 162 | 163 | The transition effect when showing and hiding the status bar using the `hidden` prop. Defaults to 'fade'. 164 | 165 | | Type | Required | Platform | 166 | | --------------------- | -------- | -------- | 167 | | enum('fade', 'slide') | No | iOS | 168 | 169 | ## Methods 170 | 171 | ### `setHidden()` 172 | 173 | ```javascript 174 | static setHidden(hidden: boolean, [animation]: StatusBarAnimation) 175 | ``` 176 | 177 | Show or hide the status bar 178 | 179 | **Parameters:** 180 | 181 | | Name | Type | Required | Description | 182 | | --------- | ----------------------------------------------------- | -------- | ---------------------------------------------------------------- | 183 | | hidden | boolean | Yes | Hide the status bar. | 184 | | animation | [StatusBarAnimation](#statusbaranimation) | No | Optional animation when changing the status bar hidden property. | 185 | 186 | --- 187 | 188 | ### `setBarStyle()` 189 | 190 | ```javascript 191 | static setBarStyle(style: StatusBarStyle, [animated]: boolean) 192 | ``` 193 | 194 | Set the status bar style 195 | 196 | **Parameters:** 197 | 198 | | Name | Type | Required | Description | 199 | | -------- | --------------------------------------------- | -------- | ------------------------- | 200 | | style | [StatusBarStyle]( 201 | #statusbarstyle) | Yes | Status bar style to set | 202 | | animated | boolean | No | Animate the style change. | 203 | 204 | --- 205 | 206 | ### `setNetworkActivityIndicatorVisible()` 207 | 208 | ```javascript 209 | static setNetworkActivityIndicatorVisible(visible: boolean) 210 | ``` 211 | 212 | Control the visibility of the network activity indicator 213 | 214 | **Parameters:** 215 | 216 | | Name | Type | Required | Description | 217 | | ------- | ------- | -------- | ------------------- | 218 | | visible | boolean | Yes | Show the indicator. | 219 | 220 | --- 221 | 222 | ### `setBackgroundColor()` 223 | 224 | ```javascript 225 | static setBackgroundColor(color: string, [animated]: boolean) 226 | ``` 227 | 228 | Set the background color for the status bar 229 | 230 | **Parameters:** 231 | 232 | | Name | Type | Required | Description | 233 | | -------- | ------- | -------- | ------------------------- | 234 | | color | [color](https://facebook.github.io/react-native/docs/colors) | Yes | Background color. | 235 | | animated | boolean | No | Animate the style change. | 236 | 237 | --- 238 | 239 | ### `setTranslucent()` 240 | 241 | ```javascript 242 | static setTranslucent(translucent: boolean) 243 | ``` 244 | 245 | Control the translucency of the status bar 246 | 247 | **Parameters:** 248 | 249 | | Name | Type | Required | Description | 250 | | ----------- | ------- | -------- | ------------------- | 251 | | translucent | boolean | Yes | Set as translucent. | 252 | 253 | ## Type Definitions 254 | 255 | ### StatusBarStyle 256 | 257 | Status bar style 258 | 259 | | Type | 260 | | ----- | 261 | | $Enum | 262 | 263 | **Constants:** 264 | 265 | | Value | Description | 266 | | ------------- | -------------------------------------------------------------------- | 267 | | default | Default status bar style (dark for iOS, light for Android) | 268 | | light-content | Dark background, white texts and icons | 269 | | dark-content | Light background, dark texts and icons (requires API>=23 on Android) | 270 | 271 | --- 272 | 273 | ### StatusBarAnimation 274 | 275 | Status bar animation 276 | 277 | | Type | 278 | | ----- | 279 | | $Enum | 280 | 281 | **Constants:** 282 | 283 | | Value | Description | 284 | | ----- | --------------- | 285 | | none | No animation | 286 | | fade | Fade animation | 287 | | slide | Slide animation | 288 | 289 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | 2 | buildscript { 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:3.2.1' 10 | } 11 | } 12 | 13 | apply plugin: 'com.android.library' 14 | 15 | android { 16 | compileSdkVersion 28 17 | buildToolsVersion "28.0.3" 18 | 19 | defaultConfig { 20 | minSdkVersion 18 21 | targetSdkVersion 28 22 | versionCode 1 23 | versionName "1.0" 24 | } 25 | lintOptions { 26 | abortOnError false 27 | } 28 | } 29 | 30 | repositories { 31 | google() 32 | mavenCentral() 33 | } 34 | 35 | dependencies { 36 | implementation 'com.facebook.react:react-native:+' 37 | } 38 | 39 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Feb 11 08:24:57 EET 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip 7 | -------------------------------------------------------------------------------- /android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/src/main/java/com/reactnativecommunity/status-bar/RNCStatusBarModule.java: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Copyright (c) Facebook, Inc. and its affiliates. 4 | * 5 | * This source code is licensed under the MIT license found in the 6 | * LICENSE file in the root directory of this source tree. 7 | */ 8 | 9 | package com.reactnativecommunity.statusbar; 10 | 11 | import android.animation.ArgbEvaluator; 12 | import android.animation.ValueAnimator; 13 | import android.annotation.TargetApi; 14 | import android.app.Activity; 15 | import android.content.Context; 16 | import android.os.Build; 17 | import android.support.v4.view.ViewCompat; 18 | import android.view.View; 19 | import android.view.WindowInsets; 20 | import android.view.WindowManager; 21 | import com.facebook.common.logging.FLog; 22 | import com.facebook.react.bridge.GuardedRunnable; 23 | import com.facebook.react.bridge.NativeModule; 24 | import com.facebook.react.bridge.ReactApplicationContext; 25 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 26 | import com.facebook.react.bridge.ReactMethod; 27 | import com.facebook.react.bridge.UiThreadUtil; 28 | import com.facebook.react.common.MapBuilder; 29 | import com.facebook.react.common.ReactConstants; 30 | import com.facebook.react.module.annotations.ReactModule; 31 | import com.facebook.react.uimanager.PixelUtil; 32 | import java.util.Map; 33 | import javax.annotation.Nullable; 34 | 35 | /** 36 | * {@link NativeModule} that allows changing the appearance of the status bar. 37 | */ 38 | @ReactModule(name = RNCStatusBarModule.NAME) 39 | public class RNCStatusBarModule extends ReactContextBaseJavaModule { 40 | 41 | private static final String HEIGHT_KEY = "HEIGHT"; 42 | private static final String DEFAULT_BACKGROUND_COLOR_KEY = "DEFAULT_BACKGROUND_COLOR"; 43 | public static final String NAME = "RNCStatusBarManager"; 44 | 45 | public RNCStatusBarModule(ReactApplicationContext reactContext) { 46 | 47 | super(reactContext); 48 | } 49 | 50 | @Override 51 | public String getName() { 52 | return NAME; 53 | } 54 | 55 | @Override 56 | public @Nullable Map getConstants() { 57 | final Context context = getReactApplicationContext(); 58 | final Activity activity = getCurrentActivity(); 59 | 60 | final int heightResId = context.getResources() 61 | .getIdentifier("status_bar_height", "dimen", "android"); 62 | final float height = heightResId > 0 ? 63 | PixelUtil.toDIPFromPixel(context.getResources().getDimensionPixelSize(heightResId)) : 64 | 0; 65 | String statusBarColorString = "black"; 66 | 67 | if (activity != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 68 | final int statusBarColor = activity.getWindow().getStatusBarColor(); 69 | statusBarColorString = String.format("#%06X", (0xFFFFFF & statusBarColor)); 70 | } 71 | 72 | return MapBuilder.of( 73 | HEIGHT_KEY, height, DEFAULT_BACKGROUND_COLOR_KEY, statusBarColorString); 74 | } 75 | 76 | @ReactMethod 77 | public void setColor(final int color, final boolean animated) { 78 | final Activity activity = getCurrentActivity(); 79 | if (activity == null) { 80 | FLog.w(ReactConstants.TAG, "StatusBarModule: Ignored status bar change, current activity is null."); 81 | return; 82 | } 83 | 84 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 85 | 86 | UiThreadUtil.runOnUiThread( 87 | new GuardedRunnable(getReactApplicationContext()) { 88 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 89 | @Override 90 | public void runGuarded() { 91 | activity 92 | .getWindow() 93 | .addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 94 | if (animated) { 95 | int curColor = activity.getWindow().getStatusBarColor(); 96 | ValueAnimator colorAnimation = 97 | ValueAnimator.ofObject(new ArgbEvaluator(), curColor, color); 98 | 99 | colorAnimation.addUpdateListener( 100 | new ValueAnimator.AnimatorUpdateListener() { 101 | @Override 102 | public void onAnimationUpdate(ValueAnimator animator) { 103 | activity 104 | .getWindow() 105 | .setStatusBarColor((Integer) animator.getAnimatedValue()); 106 | } 107 | }); 108 | colorAnimation.setDuration(300).setStartDelay(0); 109 | colorAnimation.start(); 110 | } else { 111 | activity.getWindow().setStatusBarColor(color); 112 | } 113 | } 114 | }); 115 | } 116 | } 117 | 118 | @ReactMethod 119 | public void setTranslucent(final boolean translucent) { 120 | final Activity activity = getCurrentActivity(); 121 | if (activity == null) { 122 | FLog.w(ReactConstants.TAG, "StatusBarModule: Ignored status bar change, current activity is null."); 123 | return; 124 | } 125 | 126 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 127 | UiThreadUtil.runOnUiThread( 128 | new GuardedRunnable(getReactApplicationContext()) { 129 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 130 | @Override 131 | public void runGuarded() { 132 | // If the status bar is translucent hook into the window insets calculations 133 | // and consume all the top insets so no padding will be added under the status bar. 134 | View decorView = activity.getWindow().getDecorView(); 135 | if (translucent) { 136 | decorView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { 137 | @Override 138 | public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { 139 | WindowInsets defaultInsets = v.onApplyWindowInsets(insets); 140 | return defaultInsets.replaceSystemWindowInsets( 141 | defaultInsets.getSystemWindowInsetLeft(), 142 | 0, 143 | defaultInsets.getSystemWindowInsetRight(), 144 | defaultInsets.getSystemWindowInsetBottom()); 145 | } 146 | }); 147 | } else { 148 | decorView.setOnApplyWindowInsetsListener(null); 149 | } 150 | 151 | ViewCompat.requestApplyInsets(decorView); 152 | } 153 | }); 154 | } 155 | } 156 | 157 | @ReactMethod 158 | public void setHidden(final boolean hidden) { 159 | final Activity activity = getCurrentActivity(); 160 | if (activity == null) { 161 | FLog.w(ReactConstants.TAG, "StatusBarModule: Ignored status bar change, current activity is null."); 162 | return; 163 | } 164 | UiThreadUtil.runOnUiThread( 165 | new Runnable() { 166 | @Override 167 | public void run() { 168 | if (hidden) { 169 | activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 170 | activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 171 | } else { 172 | activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); 173 | activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 174 | } 175 | } 176 | }); 177 | } 178 | 179 | @ReactMethod 180 | public void setStyle(@Nullable final String style) { 181 | final Activity activity = getCurrentActivity(); 182 | if (activity == null) { 183 | FLog.w(ReactConstants.TAG, "StatusBarModule: Ignored status bar change, current activity is null."); 184 | return; 185 | } 186 | 187 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 188 | UiThreadUtil.runOnUiThread( 189 | new Runnable() { 190 | @TargetApi(Build.VERSION_CODES.M) 191 | @Override 192 | public void run() { 193 | View decorView = activity.getWindow().getDecorView(); 194 | int systemUiVisibilityFlags = decorView.getSystemUiVisibility(); 195 | if ("dark-content".equals(style)) { 196 | systemUiVisibilityFlags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 197 | } else { 198 | systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; 199 | } 200 | decorView.setSystemUiVisibility(systemUiVisibilityFlags); 201 | } 202 | } 203 | ); 204 | } 205 | } 206 | } -------------------------------------------------------------------------------- /android/src/main/java/com/reactnativecommunity/status-bar/RNCStatusBarPackage.java: -------------------------------------------------------------------------------- 1 | 2 | package com.reactnativecommunity.statusbar; 3 | 4 | import java.util.Arrays; 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.bridge.NativeModule; 10 | import com.facebook.react.bridge.ReactApplicationContext; 11 | import com.facebook.react.uimanager.ViewManager; 12 | import com.facebook.react.bridge.JavaScriptModule; 13 | public class RNCStatusBarPackage implements ReactPackage { 14 | @Override 15 | public List createNativeModules(ReactApplicationContext reactContext) { 16 | return Arrays.asList(new RNCStatusBarModule(reactContext)); 17 | } 18 | 19 | // Deprecated from RN 0.47 20 | public List> createJSModules() { 21 | return Collections.emptyList(); 22 | } 23 | 24 | @Override 25 | public List createViewManagers(ReactApplicationContext reactContext) { 26 | return Collections.emptyList(); 27 | } 28 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["module:metro-react-native-babel-preset"], 3 | plugins: [ 4 | [ 5 | "module-resolver", 6 | { 7 | alias: { 8 | "@react-native-community/status-bar": "./js/StatusBar.js" 9 | }, 10 | cwd: "babelrc" 11 | } 12 | ] 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /e2e/Mutations.spec.js: -------------------------------------------------------------------------------- 1 | describe('Should mutate status bar state with no crashes', () => { 2 | beforeEach(async () => { 3 | await device.reloadReactNative(); 4 | }); 5 | 6 | it('Should hide statusbar (slide)', async () => { 7 | await expect(element(by.id('set-hidden-slide'))).toBeVisible(); 8 | await element(by.id('set-hidden-slide')).tap(); 9 | }); 10 | 11 | it('Should make statusbar visible (fade)', async () => { 12 | await expect(element(by.id('set-visible-fade'))).toBeVisible(); 13 | await element(by.id('set-visible-fade')).tap(); 14 | }); 15 | 16 | it('Should set light-content statusbar style', async () => { 17 | await expect(element(by.id('set-light-style'))).toBeVisible(); 18 | await element(by.id('set-light-style')).tap(); 19 | }); 20 | 21 | it('Should set default statusbar style', async () => { 22 | await expect(element(by.id('set-default-style'))).toBeVisible(); 23 | await element(by.id('set-default-style')).tap(); 24 | }); 25 | 26 | it('Should set network visibility - hidden', async () => { 27 | await expect(element(by.id('set-network-hidden'))).toBeVisible(); 28 | await element(by.id('set-network-hidden')).tap(); 29 | }); 30 | 31 | it('Should set network visibility - visible', async () => { 32 | await expect(element(by.id('set-network-visible'))).toBeVisible(); 33 | await element(by.id('set-network-visible')).tap(); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /e2e/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "setupTestFrameworkScriptFile": "./init.js", 3 | "testEnvironment": "node" 4 | } 5 | -------------------------------------------------------------------------------- /e2e/init.js: -------------------------------------------------------------------------------- 1 | // @flow 2 | import detox from 'detox'; 3 | import adapter from 'detox/runners/jest/adapter'; 4 | import { detox as config } from '../package.json'; 5 | 6 | jest.setTimeout(600000); 7 | // $FlowFixMe 8 | jasmine.getEnv().addReporter(adapter); 9 | 10 | beforeAll(async () => { 11 | await detox.init(config); 12 | }); 13 | 14 | beforeEach(async () => { 15 | await adapter.beforeEach(); 16 | }); 17 | 18 | afterAll(async () => { 19 | await adapter.afterAll(); 20 | await detox.cleanup(); 21 | }); 22 | -------------------------------------------------------------------------------- /example/App.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * 5 | * @format 6 | * @flow 7 | * @lint-ignore-every XPLATJSCOPYRIGHT1 8 | */ 9 | 10 | import React from 'react'; 11 | import StatusBar from '@react-native-community/status-bar'; 12 | import {StyleSheet, Text, View, TouchableHighlight} from 'react-native'; 13 | 14 | type MutationBtnProps = { 15 | label: string, 16 | testID: string, 17 | onPress: () => void, 18 | }; 19 | 20 | const MutationBtn = ({label, onPress, testID}: MutationBtnProps) => { 21 | return ( 22 | 26 | 27 | {label} 28 | 29 | 30 | ); 31 | }; 32 | 33 | const App = () => ( 34 | 35 | StatusBar.setHidden(true, 'slide')} 39 | /> 40 | 41 | StatusBar.setHidden(false, 'fade')} 45 | /> 46 | 47 | StatusBar.setBarStyle('light-content', true)} 51 | /> 52 | 53 | StatusBar.setBarStyle('default', true)} 57 | /> 58 | 59 | StatusBar.setNetworkActivityIndicatorVisible(true)} 63 | /> 64 | 65 | StatusBar.setNetworkActivityIndicatorVisible(false)} 69 | /> 70 | 71 | ); 72 | 73 | const styles = StyleSheet.create({ 74 | container: { 75 | flex: 1, 76 | justifyContent: 'center', 77 | padding: 20, 78 | paddingTop: 100, 79 | backgroundColor: '#f5fcff', 80 | }, 81 | innerContainer: { 82 | borderRadius: 10, 83 | alignItems: 'center', 84 | }, 85 | wrapper: { 86 | borderRadius: 5, 87 | marginBottom: 5, 88 | }, 89 | button: { 90 | borderRadius: 5, 91 | backgroundColor: '#eeeeee', 92 | padding: 10, 93 | }, 94 | modalButton: { 95 | marginTop: 10, 96 | }, 97 | }); 98 | 99 | export default App; 100 | -------------------------------------------------------------------------------- /example/android/app/BUCK: -------------------------------------------------------------------------------- 1 | # To learn about Buck see [Docs](https://buckbuild.com/). 2 | # To run your application with Buck: 3 | # - install Buck 4 | # - `npm start` - to start the packager 5 | # - `cd android` 6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 8 | # - `buck install -r android/app` - compile, install and run application 9 | # 10 | 11 | load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") 12 | 13 | lib_deps = [] 14 | 15 | create_aar_targets(glob(["libs/*.aar"])) 16 | 17 | create_jar_targets(glob(["libs/*.jar"])) 18 | 19 | android_library( 20 | name = "all-libs", 21 | exported_deps = lib_deps, 22 | ) 23 | 24 | android_library( 25 | name = "app-code", 26 | srcs = glob([ 27 | "src/main/java/**/*.java", 28 | ]), 29 | deps = [ 30 | ":all-libs", 31 | ":build_config", 32 | ":res", 33 | ], 34 | ) 35 | 36 | android_build_config( 37 | name = "build_config", 38 | package = "com.statusbarexample", 39 | ) 40 | 41 | android_resource( 42 | name = "res", 43 | package = "com.statusbarexample", 44 | res = "src/main/res", 45 | ) 46 | 47 | android_binary( 48 | name = "app", 49 | keystore = "//android/keystores:debug", 50 | manifest = "src/main/AndroidManifest.xml", 51 | package_type = "debug", 52 | deps = [ 53 | ":app-code", 54 | ], 55 | ) 56 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 37 | * // for example: to disable dev mode in the staging build type (if configured) 38 | * devDisabledInStaging: true, 39 | * // The configuration property can be in the following formats 40 | * // 'devDisabledIn${productFlavor}${buildType}' 41 | * // 'devDisabledIn${buildType}' 42 | * 43 | * // the root of your project, i.e. where "package.json" lives 44 | * root: "../../", 45 | * 46 | * // where to put the JS bundle asset in debug mode 47 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 48 | * 49 | * // where to put the JS bundle asset in release mode 50 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 51 | * 52 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 53 | * // require('./image.png')), in debug mode 54 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 55 | * 56 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 57 | * // require('./image.png')), in release mode 58 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 59 | * 60 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 61 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 62 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 63 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 64 | * // for example, you might want to remove it from here. 65 | * inputExcludes: ["android/**", "ios/**"], 66 | * 67 | * // override which node gets called and with what additional arguments 68 | * nodeExecutableAndArgs: ["node"], 69 | * 70 | * // supply additional arguments to the packager 71 | * extraPackagerArgs: [] 72 | * ] 73 | */ 74 | 75 | 76 | project.ext.react = [ 77 | entryFile: "example/index.js", 78 | root: "../../../" 79 | ] 80 | 81 | apply from: "../../../node_modules/react-native/react.gradle" 82 | 83 | /** 84 | * Set this to true to create two separate APKs instead of one: 85 | * - An APK that only works on ARM devices 86 | * - An APK that only works on x86 devices 87 | * The advantage is the size of the APK is reduced by about 4MB. 88 | * Upload all the APKs to the Play Store and people will download 89 | * the correct one based on the CPU architecture of their device. 90 | */ 91 | def enableSeparateBuildPerCPUArchitecture = false 92 | 93 | /** 94 | * Run Proguard to shrink the Java bytecode in release builds. 95 | */ 96 | def enableProguardInReleaseBuilds = false 97 | 98 | android { 99 | compileSdkVersion rootProject.ext.compileSdkVersion 100 | buildToolsVersion rootProject.ext.buildToolsVersion 101 | 102 | defaultConfig { 103 | applicationId "com.statusbarexample" 104 | minSdkVersion rootProject.ext.minSdkVersion 105 | targetSdkVersion rootProject.ext.targetSdkVersion 106 | versionCode 1 107 | versionName "1.0" 108 | testBuildType System.getProperty('testBuildType', 'debug') 109 | missingDimensionStrategy "minReactNative", "minReactNative46" 110 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 111 | } 112 | signingConfigs { 113 | release { 114 | if (project.hasProperty('EXAMPLE_APP_STORE_FILE')) { 115 | storeFile file(EXAMPLE_APP_STORE_FILE) 116 | storePassword EXAMPLE_APP_STORE_PASSWORD 117 | keyAlias EXAMPLE_APP_KEY_ALIAS 118 | keyPassword EXAMPLE_APP_KEY_PASSWORD 119 | } 120 | } 121 | } 122 | splits { 123 | abi { 124 | reset() 125 | enable enableSeparateBuildPerCPUArchitecture 126 | universalApk false // If true, also generate a universal APK 127 | include "armeabi-v7a", "x86", "arm64-v8a" 128 | } 129 | } 130 | buildTypes { 131 | release { 132 | minifyEnabled enableProguardInReleaseBuilds 133 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 134 | signingConfig signingConfigs.release 135 | } 136 | } 137 | // applicationVariants are e.g. debug, release 138 | applicationVariants.all { variant -> 139 | variant.outputs.each { output -> 140 | // For each separate APK per architecture, set a unique version code as described here: 141 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 142 | def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3] 143 | def abi = output.getFilter(OutputFile.ABI) 144 | if (abi != null) { // null for the universal-debug, universal-release variants 145 | output.versionCodeOverride = 146 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 147 | } 148 | } 149 | } 150 | } 151 | 152 | dependencies { 153 | implementation fileTree(dir: "libs", include: ["*.jar"]) 154 | implementation project(':react-native-status-bar') 155 | implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" 156 | implementation "com.facebook.react:react-native:+" // From node_modules 157 | 158 | androidTestImplementation(project(path: ":detox")) 159 | androidTestImplementation 'junit:junit:4.12' 160 | androidTestImplementation 'com.android.support.test:runner:1.0.1' 161 | androidTestImplementation 'com.android.support.test:rules:1.0.1' 162 | } 163 | 164 | // Run this once to be able to run the application with BUCK 165 | // puts all compile dependencies into folder libs for BUCK to use 166 | task copyDownloadableDepsToLibs(type: Copy) { 167 | from configurations.compile 168 | into 'libs' 169 | } 170 | -------------------------------------------------------------------------------- /example/android/app/build_defs.bzl: -------------------------------------------------------------------------------- 1 | """Helper definitions to glob .aar and .jar targets""" 2 | 3 | def create_aar_targets(aarfiles): 4 | for aarfile in aarfiles: 5 | name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] 6 | lib_deps.append(":" + name) 7 | android_prebuilt_aar( 8 | name = name, 9 | aar = aarfile, 10 | ) 11 | 12 | def create_jar_targets(jarfiles): 13 | for jarfile in jarfiles: 14 | name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] 15 | lib_deps.append(":" + name) 16 | prebuilt_jar( 17 | name = name, 18 | binary_jar = jarfile, 19 | ) 20 | -------------------------------------------------------------------------------- /example/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /example/android/app/release.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/release.keystore -------------------------------------------------------------------------------- /example/android/app/src/androidTest/java/com/statusbarexample/DetoxTest.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | package com.statusbarexample; 9 | 10 | import com.wix.detox.Detox; 11 | 12 | import org.junit.Rule; 13 | import org.junit.Test; 14 | import org.junit.runner.RunWith; 15 | 16 | import androidx.test.ext.junit.runners.AndroidJUnit4; 17 | import androidx.test.filters.LargeTest; 18 | import androidx.test.rule.ActivityTestRule; 19 | 20 | @RunWith(AndroidJUnit4.class) 21 | @LargeTest 22 | public class DetoxTest { 23 | 24 | @Rule 25 | public ActivityTestRule mActivityRule = new ActivityTestRule<>(MainActivity.class, false, false); 26 | 27 | @Test 28 | public void runDetoxTests() { 29 | Detox.runTests(mActivityRule); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /example/android/app/src/main/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/assets/.gitkeep -------------------------------------------------------------------------------- /example/android/app/src/main/java/com/statusbarexample/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.statusbarexample; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "StatusBarExample"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /example/android/app/src/main/java/com/statusbarexample/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.statusbarexample; 2 | 3 | import android.app.Application; 4 | 5 | import com.facebook.react.ReactApplication; 6 | import com.facebook.react.ReactNativeHost; 7 | import com.facebook.react.ReactPackage; 8 | import com.facebook.react.shell.MainReactPackage; 9 | import com.facebook.soloader.SoLoader; 10 | import com.reactnativecommunity.statusbar.RNCStatusBarPackage; 11 | 12 | import java.util.Arrays; 13 | import java.util.List; 14 | 15 | public class MainApplication extends Application implements ReactApplication { 16 | 17 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 18 | @Override 19 | public boolean getUseDeveloperSupport() { 20 | return BuildConfig.DEBUG; 21 | } 22 | 23 | @Override 24 | protected List getPackages() { 25 | return Arrays.asList( 26 | new MainReactPackage(), 27 | new RNCStatusBarPackage() 28 | ); 29 | } 30 | 31 | @Override 32 | protected String getJSMainModuleName() { 33 | return "example/index"; 34 | } 35 | }; 36 | 37 | @Override 38 | public ReactNativeHost getReactNativeHost() { 39 | return mReactNativeHost; 40 | } 41 | 42 | @Override 43 | public void onCreate() { 44 | super.onCreate(); 45 | SoLoader.init(this, /* native exopackage */ false); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | StatusBarExample 3 | 4 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "28.0.3" 6 | minSdkVersion = 18 7 | compileSdkVersion = 28 8 | targetSdkVersion = 27 9 | supportLibVersion = "28.0.0" 10 | kotlinVersion = '1.3.0' 11 | } 12 | repositories { 13 | google() 14 | jcenter() 15 | } 16 | dependencies { 17 | classpath 'com.android.tools.build:gradle:3.2.1' 18 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" 19 | // NOTE: Do not place your application dependencies here; they belong 20 | // in the individual module build.gradle files 21 | } 22 | } 23 | 24 | allprojects { 25 | task downloadDependencies() { 26 | description 'Download all dependencies to the Gradle cache' 27 | doLast { 28 | configurations.findAll().each { config -> 29 | if (config.name.contains("minReactNative") && config.canBeResolved) { 30 | print config.name 31 | print '\n' 32 | config.files 33 | } 34 | } 35 | } 36 | } 37 | 38 | repositories { 39 | mavenLocal() 40 | google() 41 | jcenter() 42 | maven { 43 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 44 | url "$rootDir/../../node_modules/react-native/android" 45 | } 46 | } 47 | } 48 | 49 | task wrapper(type: Wrapper) { 50 | gradleVersion = '4.7' 51 | distributionUrl = distributionUrl.replace("bin", "all") 52 | } 53 | 54 | subprojects { 55 | task listAllDependencies(type: DependencyReportTask) {} 56 | } 57 | -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | 21 | org.gradle.caching=true 22 | org.gradle.parallel=true 23 | org.gradle.configureondemand=true 24 | 25 | EXAMPLE_APP_STORE_FILE=release.keystore 26 | EXAMPLE_APP_KEY_ALIAS=androiddebugkey 27 | EXAMPLE_APP_STORE_PASSWORD=android 28 | EXAMPLE_APP_KEY_PASSWORD=android 29 | 30 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cedev935/react-native-statusbar/6ecaa99f8abfb2435de5637b7172db1c2cf7a268/example/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip 6 | -------------------------------------------------------------------------------- /example/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Attempt to set APP_HOME 10 | # Resolve links: $0 may be a link 11 | PRG="$0" 12 | # Need this for relative symlinks. 13 | while [ -h "$PRG" ] ; do 14 | ls=`ls -ld "$PRG"` 15 | link=`expr "$ls" : '.*-> \(.*\)$'` 16 | if expr "$link" : '/.*' > /dev/null; then 17 | PRG="$link" 18 | else 19 | PRG=`dirname "$PRG"`"/$link" 20 | fi 21 | done 22 | SAVED="`pwd`" 23 | cd "`dirname \"$PRG\"`/" >/dev/null 24 | APP_HOME="`pwd -P`" 25 | cd "$SAVED" >/dev/null 26 | 27 | APP_NAME="Gradle" 28 | APP_BASE_NAME=`basename "$0"` 29 | 30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 31 | DEFAULT_JVM_OPTS="" 32 | 33 | # Use the maximum available, or set MAX_FD != -1 to use that value. 34 | MAX_FD="maximum" 35 | 36 | warn () { 37 | echo "$*" 38 | } 39 | 40 | die () { 41 | echo 42 | echo "$*" 43 | echo 44 | exit 1 45 | } 46 | 47 | # OS specific support (must be 'true' or 'false'). 48 | cygwin=false 49 | msys=false 50 | darwin=false 51 | nonstop=false 52 | case "`uname`" in 53 | CYGWIN* ) 54 | cygwin=true 55 | ;; 56 | Darwin* ) 57 | darwin=true 58 | ;; 59 | MINGW* ) 60 | msys=true 61 | ;; 62 | NONSTOP* ) 63 | nonstop=true 64 | ;; 65 | esac 66 | 67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 68 | 69 | # Determine the Java command to use to start the JVM. 70 | if [ -n "$JAVA_HOME" ] ; then 71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 72 | # IBM's JDK on AIX uses strange locations for the executables 73 | JAVACMD="$JAVA_HOME/jre/sh/java" 74 | else 75 | JAVACMD="$JAVA_HOME/bin/java" 76 | fi 77 | if [ ! -x "$JAVACMD" ] ; then 78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 79 | 80 | Please set the JAVA_HOME variable in your environment to match the 81 | location of your Java installation." 82 | fi 83 | else 84 | JAVACMD="java" 85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 86 | 87 | Please set the JAVA_HOME variable in your environment to match the 88 | location of your Java installation." 89 | fi 90 | 91 | # Increase the maximum file descriptors if we can. 92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 93 | MAX_FD_LIMIT=`ulimit -H -n` 94 | if [ $? -eq 0 ] ; then 95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 96 | MAX_FD="$MAX_FD_LIMIT" 97 | fi 98 | ulimit -n $MAX_FD 99 | if [ $? -ne 0 ] ; then 100 | warn "Could not set maximum file descriptor limit: $MAX_FD" 101 | fi 102 | else 103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 104 | fi 105 | fi 106 | 107 | # For Darwin, add options to specify how the application appears in the dock 108 | if $darwin; then 109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 110 | fi 111 | 112 | # For Cygwin, switch paths to Windows format before running java 113 | if $cygwin ; then 114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 116 | JAVACMD=`cygpath --unix "$JAVACMD"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Escape application args 158 | save () { 159 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 160 | echo " " 161 | } 162 | APP_ARGS=$(save "$@") 163 | 164 | # Collect all arguments for the java command, following the shell quoting and substitution rules 165 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 166 | 167 | # by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong 168 | if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then 169 | cd "$(dirname "$0")" 170 | fi 171 | 172 | exec "$JAVACMD" "$@" 173 | -------------------------------------------------------------------------------- /example/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | set DIRNAME=%~dp0 12 | if "%DIRNAME%" == "" set DIRNAME=. 13 | set APP_BASE_NAME=%~n0 14 | set APP_HOME=%DIRNAME% 15 | 16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 17 | set DEFAULT_JVM_OPTS= 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windows variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | 53 | :win9xME_args 54 | @rem Slurp the command line arguments. 55 | set CMD_LINE_ARGS= 56 | set _SKIP=2 57 | 58 | :win9xME_args_slurp 59 | if "x%~1" == "x" goto execute 60 | 61 | set CMD_LINE_ARGS=%* 62 | 63 | :execute 64 | @rem Setup the command line 65 | 66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 67 | 68 | @rem Execute Gradle 69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 70 | 71 | :end 72 | @rem End local scope for the variables with windows NT shell 73 | if "%ERRORLEVEL%"=="0" goto mainEnd 74 | 75 | :fail 76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 77 | rem the _cmd.exe /c_ return code! 78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 79 | exit /b 1 80 | 81 | :mainEnd 82 | if "%OS%"=="Windows_NT" endlocal 83 | 84 | :omega 85 | -------------------------------------------------------------------------------- /example/android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = "debug", 3 | properties = "debug.keystore.properties", 4 | store = "debug.keystore", 5 | visibility = [ 6 | "PUBLIC", 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /example/android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'StatusBarExample' 2 | 3 | include(':react-native-status-bar') 4 | project(':react-native-status-bar').projectDir = new File(rootProject.projectDir, '../../android') 5 | 6 | include ':detox' 7 | project(':detox').projectDir = new File(rootProject.projectDir, '../../node_modules/detox/android/detox') 8 | 9 | include ':app' 10 | -------------------------------------------------------------------------------- /example/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "StatusBarExample", 3 | "displayName": "StatusBarExample" 4 | } -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @format 3 | * @lint-ignore-every XPLATJSCOPYRIGHT1 4 | */ 5 | 6 | import {AppRegistry} from 'react-native'; 7 | import App from './App'; 8 | import {name as appName} from './app.json'; 9 | 10 | AppRegistry.registerComponent(appName, () => App); 11 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample-tvOSTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 00E356F31AD99517003FC87E /* StatusBarExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusBarExampleTests.m */; }; 16 | 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 17 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 18 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 19 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 20 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 21 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 22 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 23 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 24 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 25 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 26 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 27 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 28 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 29 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 30 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; 31 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; 32 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; 33 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; 34 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; 35 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; 36 | 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; 37 | 2DCD954D1E0B4F2C00145EB5 /* StatusBarExampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusBarExampleTests.m */; }; 38 | 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; 39 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 40 | ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; 41 | B9903065220E218F00AD1234 /* libRNCStatusBar.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B9903064220E217500AD1234 /* libRNCStatusBar.a */; }; 42 | ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; }; 43 | ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; 44 | /* End PBXBuildFile section */ 45 | 46 | /* Begin PBXContainerItemProxy section */ 47 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 48 | isa = PBXContainerItemProxy; 49 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 50 | proxyType = 2; 51 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 52 | remoteInfo = RCTActionSheet; 53 | }; 54 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 55 | isa = PBXContainerItemProxy; 56 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 57 | proxyType = 2; 58 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 59 | remoteInfo = RCTGeolocation; 60 | }; 61 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 62 | isa = PBXContainerItemProxy; 63 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 64 | proxyType = 2; 65 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 66 | remoteInfo = RCTImage; 67 | }; 68 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 69 | isa = PBXContainerItemProxy; 70 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 71 | proxyType = 2; 72 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 73 | remoteInfo = RCTNetwork; 74 | }; 75 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 76 | isa = PBXContainerItemProxy; 77 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 78 | proxyType = 2; 79 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 80 | remoteInfo = RCTVibration; 81 | }; 82 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 83 | isa = PBXContainerItemProxy; 84 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 85 | proxyType = 1; 86 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 87 | remoteInfo = StatusBarExample; 88 | }; 89 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 90 | isa = PBXContainerItemProxy; 91 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 92 | proxyType = 2; 93 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 94 | remoteInfo = RCTSettings; 95 | }; 96 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 97 | isa = PBXContainerItemProxy; 98 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 99 | proxyType = 2; 100 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 101 | remoteInfo = RCTWebSocket; 102 | }; 103 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 104 | isa = PBXContainerItemProxy; 105 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 106 | proxyType = 2; 107 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 108 | remoteInfo = React; 109 | }; 110 | 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { 111 | isa = PBXContainerItemProxy; 112 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 113 | proxyType = 1; 114 | remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; 115 | remoteInfo = "StatusBarExample-tvOS"; 116 | }; 117 | 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { 118 | isa = PBXContainerItemProxy; 119 | containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 120 | proxyType = 2; 121 | remoteGlobalIDString = ADD01A681E09402E00F6D226; 122 | remoteInfo = "RCTBlob-tvOS"; 123 | }; 124 | 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { 125 | isa = PBXContainerItemProxy; 126 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 127 | proxyType = 2; 128 | remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; 129 | remoteInfo = fishhook; 130 | }; 131 | 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { 132 | isa = PBXContainerItemProxy; 133 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 134 | proxyType = 2; 135 | remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; 136 | remoteInfo = "fishhook-tvOS"; 137 | }; 138 | 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = { 139 | isa = PBXContainerItemProxy; 140 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 141 | proxyType = 2; 142 | remoteGlobalIDString = EBF21BDC1FC498900052F4D5; 143 | remoteInfo = jsinspector; 144 | }; 145 | 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = { 146 | isa = PBXContainerItemProxy; 147 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 148 | proxyType = 2; 149 | remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; 150 | remoteInfo = "jsinspector-tvOS"; 151 | }; 152 | 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = { 153 | isa = PBXContainerItemProxy; 154 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 155 | proxyType = 2; 156 | remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; 157 | remoteInfo = "third-party"; 158 | }; 159 | 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = { 160 | isa = PBXContainerItemProxy; 161 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 162 | proxyType = 2; 163 | remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; 164 | remoteInfo = "third-party-tvOS"; 165 | }; 166 | 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = { 167 | isa = PBXContainerItemProxy; 168 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 169 | proxyType = 2; 170 | remoteGlobalIDString = 139D7E881E25C6D100323FB7; 171 | remoteInfo = "double-conversion"; 172 | }; 173 | 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = { 174 | isa = PBXContainerItemProxy; 175 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 176 | proxyType = 2; 177 | remoteGlobalIDString = 3D383D621EBD27B9005632C8; 178 | remoteInfo = "double-conversion-tvOS"; 179 | }; 180 | 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { 181 | isa = PBXContainerItemProxy; 182 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 183 | proxyType = 2; 184 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 185 | remoteInfo = "RCTImage-tvOS"; 186 | }; 187 | 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { 188 | isa = PBXContainerItemProxy; 189 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 190 | proxyType = 2; 191 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 192 | remoteInfo = "RCTLinking-tvOS"; 193 | }; 194 | 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 195 | isa = PBXContainerItemProxy; 196 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 197 | proxyType = 2; 198 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 199 | remoteInfo = "RCTNetwork-tvOS"; 200 | }; 201 | 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 202 | isa = PBXContainerItemProxy; 203 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 204 | proxyType = 2; 205 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 206 | remoteInfo = "RCTSettings-tvOS"; 207 | }; 208 | 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { 209 | isa = PBXContainerItemProxy; 210 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 211 | proxyType = 2; 212 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 213 | remoteInfo = "RCTText-tvOS"; 214 | }; 215 | 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { 216 | isa = PBXContainerItemProxy; 217 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 218 | proxyType = 2; 219 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 220 | remoteInfo = "RCTWebSocket-tvOS"; 221 | }; 222 | 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { 223 | isa = PBXContainerItemProxy; 224 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 225 | proxyType = 2; 226 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 227 | remoteInfo = "React-tvOS"; 228 | }; 229 | 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { 230 | isa = PBXContainerItemProxy; 231 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 232 | proxyType = 2; 233 | remoteGlobalIDString = 3D3C059A1DE3340900C268FA; 234 | remoteInfo = yoga; 235 | }; 236 | 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { 237 | isa = PBXContainerItemProxy; 238 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 239 | proxyType = 2; 240 | remoteGlobalIDString = 3D3C06751DE3340C00C268FA; 241 | remoteInfo = "yoga-tvOS"; 242 | }; 243 | 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { 244 | isa = PBXContainerItemProxy; 245 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 246 | proxyType = 2; 247 | remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; 248 | remoteInfo = cxxreact; 249 | }; 250 | 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { 251 | isa = PBXContainerItemProxy; 252 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 253 | proxyType = 2; 254 | remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; 255 | remoteInfo = "cxxreact-tvOS"; 256 | }; 257 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 258 | isa = PBXContainerItemProxy; 259 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 260 | proxyType = 2; 261 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 262 | remoteInfo = RCTAnimation; 263 | }; 264 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 265 | isa = PBXContainerItemProxy; 266 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 267 | proxyType = 2; 268 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 269 | remoteInfo = "RCTAnimation-tvOS"; 270 | }; 271 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 272 | isa = PBXContainerItemProxy; 273 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 274 | proxyType = 2; 275 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 276 | remoteInfo = RCTLinking; 277 | }; 278 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 279 | isa = PBXContainerItemProxy; 280 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 281 | proxyType = 2; 282 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 283 | remoteInfo = RCTText; 284 | }; 285 | ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { 286 | isa = PBXContainerItemProxy; 287 | containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 288 | proxyType = 2; 289 | remoteGlobalIDString = 358F4ED71D1E81A9004DF814; 290 | remoteInfo = RCTBlob; 291 | }; 292 | B9902F51220E11A700AD1234 /* PBXContainerItemProxy */ = { 293 | isa = PBXContainerItemProxy; 294 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 295 | proxyType = 2; 296 | remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8; 297 | remoteInfo = jsi; 298 | }; 299 | B9902F53220E11A700AD1234 /* PBXContainerItemProxy */ = { 300 | isa = PBXContainerItemProxy; 301 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 302 | proxyType = 2; 303 | remoteGlobalIDString = EDEBC73B214B45A300DD5AC8; 304 | remoteInfo = jsiexecutor; 305 | }; 306 | B9902F55220E11A700AD1234 /* PBXContainerItemProxy */ = { 307 | isa = PBXContainerItemProxy; 308 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 309 | proxyType = 2; 310 | remoteGlobalIDString = ED296FB6214C9A0900B7C4FE; 311 | remoteInfo = "jsi-tvOS"; 312 | }; 313 | B9902F57220E11A700AD1234 /* PBXContainerItemProxy */ = { 314 | isa = PBXContainerItemProxy; 315 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 316 | proxyType = 2; 317 | remoteGlobalIDString = ED296FEE214C9CF800B7C4FE; 318 | remoteInfo = "jsiexecutor-tvOS"; 319 | }; 320 | B9903063220E217500AD1234 /* PBXContainerItemProxy */ = { 321 | isa = PBXContainerItemProxy; 322 | containerPortal = B990305F220E217500AD1234 /* RNCStatusBar.xcodeproj */; 323 | proxyType = 2; 324 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 325 | remoteInfo = RNCStatusBar; 326 | }; 327 | /* End PBXContainerItemProxy section */ 328 | 329 | /* Begin PBXFileReference section */ 330 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 331 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 332 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 333 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 334 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 335 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 336 | 00E356EE1AD99517003FC87E /* StatusBarExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StatusBarExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 337 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 338 | 00E356F21AD99517003FC87E /* StatusBarExampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StatusBarExampleTests.m; sourceTree = ""; }; 339 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 340 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 341 | 13B07F961A680F5B00A75B9A /* StatusBarExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatusBarExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 342 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = StatusBarExample/AppDelegate.h; sourceTree = ""; }; 343 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = StatusBarExample/AppDelegate.m; sourceTree = ""; }; 344 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 345 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = StatusBarExample/Images.xcassets; sourceTree = ""; }; 346 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = StatusBarExample/Info.plist; sourceTree = ""; }; 347 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = StatusBarExample/main.m; sourceTree = ""; }; 348 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 349 | 2D02E47B1E0B4A5D006451C7 /* StatusBarExample-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "StatusBarExample-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 350 | 2D02E4901E0B4A5D006451C7 /* StatusBarExample-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "StatusBarExample-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 351 | 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; 352 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 353 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 354 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 355 | ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; 356 | B990305F220E217500AD1234 /* RNCStatusBar.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNCStatusBar.xcodeproj; path = ../../ios/RNCStatusBar.xcodeproj; sourceTree = ""; }; 357 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 358 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; 359 | /* End PBXFileReference section */ 360 | 361 | /* Begin PBXFrameworksBuildPhase section */ 362 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 363 | isa = PBXFrameworksBuildPhase; 364 | buildActionMask = 2147483647; 365 | files = ( 366 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 367 | ); 368 | runOnlyForDeploymentPostprocessing = 0; 369 | }; 370 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 371 | isa = PBXFrameworksBuildPhase; 372 | buildActionMask = 2147483647; 373 | files = ( 374 | ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */, 375 | ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, 376 | 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */, 377 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 378 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 379 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 380 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 381 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 382 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 383 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 384 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 385 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 386 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 387 | B9903065220E218F00AD1234 /* libRNCStatusBar.a in Frameworks */, 388 | ); 389 | runOnlyForDeploymentPostprocessing = 0; 390 | }; 391 | 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { 392 | isa = PBXFrameworksBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, 396 | 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */, 397 | 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, 398 | 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, 399 | 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, 400 | 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, 401 | 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, 402 | 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, 403 | 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, 404 | ); 405 | runOnlyForDeploymentPostprocessing = 0; 406 | }; 407 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { 408 | isa = PBXFrameworksBuildPhase; 409 | buildActionMask = 2147483647; 410 | files = ( 411 | 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */, 412 | ); 413 | runOnlyForDeploymentPostprocessing = 0; 414 | }; 415 | /* End PBXFrameworksBuildPhase section */ 416 | 417 | /* Begin PBXGroup section */ 418 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 419 | isa = PBXGroup; 420 | children = ( 421 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 422 | ); 423 | name = Products; 424 | sourceTree = ""; 425 | }; 426 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 427 | isa = PBXGroup; 428 | children = ( 429 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 430 | ); 431 | name = Products; 432 | sourceTree = ""; 433 | }; 434 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 435 | isa = PBXGroup; 436 | children = ( 437 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 438 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, 439 | ); 440 | name = Products; 441 | sourceTree = ""; 442 | }; 443 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 444 | isa = PBXGroup; 445 | children = ( 446 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 447 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, 448 | ); 449 | name = Products; 450 | sourceTree = ""; 451 | }; 452 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 453 | isa = PBXGroup; 454 | children = ( 455 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 456 | ); 457 | name = Products; 458 | sourceTree = ""; 459 | }; 460 | 00E356EF1AD99517003FC87E /* StatusBarExampleTests */ = { 461 | isa = PBXGroup; 462 | children = ( 463 | 00E356F21AD99517003FC87E /* StatusBarExampleTests.m */, 464 | 00E356F01AD99517003FC87E /* Supporting Files */, 465 | ); 466 | path = StatusBarExampleTests; 467 | sourceTree = ""; 468 | }; 469 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 470 | isa = PBXGroup; 471 | children = ( 472 | 00E356F11AD99517003FC87E /* Info.plist */, 473 | ); 474 | name = "Supporting Files"; 475 | sourceTree = ""; 476 | }; 477 | 139105B71AF99BAD00B5F7CC /* Products */ = { 478 | isa = PBXGroup; 479 | children = ( 480 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 481 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, 482 | ); 483 | name = Products; 484 | sourceTree = ""; 485 | }; 486 | 139FDEE71B06529A00C62182 /* Products */ = { 487 | isa = PBXGroup; 488 | children = ( 489 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 490 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, 491 | 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */, 492 | 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */, 493 | ); 494 | name = Products; 495 | sourceTree = ""; 496 | }; 497 | 13B07FAE1A68108700A75B9A /* StatusBarExample */ = { 498 | isa = PBXGroup; 499 | children = ( 500 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 501 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 502 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 503 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 504 | 13B07FB61A68108700A75B9A /* Info.plist */, 505 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 506 | 13B07FB71A68108700A75B9A /* main.m */, 507 | ); 508 | name = StatusBarExample; 509 | sourceTree = ""; 510 | }; 511 | 146834001AC3E56700842450 /* Products */ = { 512 | isa = PBXGroup; 513 | children = ( 514 | 146834041AC3E56700842450 /* libReact.a */, 515 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */, 516 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, 517 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, 518 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, 519 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, 520 | 2DF0FFDF2056DD460020B375 /* libjsinspector.a */, 521 | 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */, 522 | 2DF0FFE32056DD460020B375 /* libthird-party.a */, 523 | 2DF0FFE52056DD460020B375 /* libthird-party.a */, 524 | 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */, 525 | 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */, 526 | B9902F52220E11A700AD1234 /* libjsi.a */, 527 | B9902F54220E11A700AD1234 /* libjsiexecutor.a */, 528 | B9902F56220E11A700AD1234 /* libjsi-tvOS.a */, 529 | B9902F58220E11A700AD1234 /* libjsiexecutor-tvOS.a */, 530 | ); 531 | name = Products; 532 | sourceTree = ""; 533 | }; 534 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 535 | isa = PBXGroup; 536 | children = ( 537 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 538 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */, 539 | 2D16E6891FA4F8E400B85C8A /* libReact.a */, 540 | ); 541 | name = Frameworks; 542 | sourceTree = ""; 543 | }; 544 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 545 | isa = PBXGroup; 546 | children = ( 547 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 548 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, 549 | ); 550 | name = Products; 551 | sourceTree = ""; 552 | }; 553 | 78C398B11ACF4ADC00677621 /* Products */ = { 554 | isa = PBXGroup; 555 | children = ( 556 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 557 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, 558 | ); 559 | name = Products; 560 | sourceTree = ""; 561 | }; 562 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 563 | isa = PBXGroup; 564 | children = ( 565 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 566 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 567 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 568 | ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, 569 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 570 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 571 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 572 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 573 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 574 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 575 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 576 | B990305F220E217500AD1234 /* RNCStatusBar.xcodeproj */, 577 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 578 | ); 579 | name = Libraries; 580 | sourceTree = ""; 581 | }; 582 | 832341B11AAA6A8300B99B32 /* Products */ = { 583 | isa = PBXGroup; 584 | children = ( 585 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 586 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, 587 | ); 588 | name = Products; 589 | sourceTree = ""; 590 | }; 591 | 83CBB9F61A601CBA00E9B192 = { 592 | isa = PBXGroup; 593 | children = ( 594 | 13B07FAE1A68108700A75B9A /* StatusBarExample */, 595 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 596 | 00E356EF1AD99517003FC87E /* StatusBarExampleTests */, 597 | 83CBBA001A601CBA00E9B192 /* Products */, 598 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 599 | ); 600 | indentWidth = 2; 601 | sourceTree = ""; 602 | tabWidth = 2; 603 | usesTabs = 0; 604 | }; 605 | 83CBBA001A601CBA00E9B192 /* Products */ = { 606 | isa = PBXGroup; 607 | children = ( 608 | 13B07F961A680F5B00A75B9A /* StatusBarExample.app */, 609 | 00E356EE1AD99517003FC87E /* StatusBarExampleTests.xctest */, 610 | 2D02E47B1E0B4A5D006451C7 /* StatusBarExample-tvOS.app */, 611 | 2D02E4901E0B4A5D006451C7 /* StatusBarExample-tvOSTests.xctest */, 612 | ); 613 | name = Products; 614 | sourceTree = ""; 615 | }; 616 | ADBDB9201DFEBF0600ED6528 /* Products */ = { 617 | isa = PBXGroup; 618 | children = ( 619 | ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, 620 | 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */, 621 | ); 622 | name = Products; 623 | sourceTree = ""; 624 | }; 625 | B9903060220E217500AD1234 /* Products */ = { 626 | isa = PBXGroup; 627 | children = ( 628 | B9903064220E217500AD1234 /* libRNCStatusBar.a */, 629 | ); 630 | name = Products; 631 | sourceTree = ""; 632 | }; 633 | /* End PBXGroup section */ 634 | 635 | /* Begin PBXNativeTarget section */ 636 | 00E356ED1AD99517003FC87E /* StatusBarExampleTests */ = { 637 | isa = PBXNativeTarget; 638 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StatusBarExampleTests" */; 639 | buildPhases = ( 640 | 00E356EA1AD99517003FC87E /* Sources */, 641 | 00E356EB1AD99517003FC87E /* Frameworks */, 642 | 00E356EC1AD99517003FC87E /* Resources */, 643 | ); 644 | buildRules = ( 645 | ); 646 | dependencies = ( 647 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 648 | ); 649 | name = StatusBarExampleTests; 650 | productName = StatusBarExampleTests; 651 | productReference = 00E356EE1AD99517003FC87E /* StatusBarExampleTests.xctest */; 652 | productType = "com.apple.product-type.bundle.unit-test"; 653 | }; 654 | 13B07F861A680F5B00A75B9A /* StatusBarExample */ = { 655 | isa = PBXNativeTarget; 656 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StatusBarExample" */; 657 | buildPhases = ( 658 | 13B07F871A680F5B00A75B9A /* Sources */, 659 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 660 | 13B07F8E1A680F5B00A75B9A /* Resources */, 661 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 662 | ); 663 | buildRules = ( 664 | ); 665 | dependencies = ( 666 | ); 667 | name = StatusBarExample; 668 | productName = "Hello World"; 669 | productReference = 13B07F961A680F5B00A75B9A /* StatusBarExample.app */; 670 | productType = "com.apple.product-type.application"; 671 | }; 672 | 2D02E47A1E0B4A5D006451C7 /* StatusBarExample-tvOS */ = { 673 | isa = PBXNativeTarget; 674 | buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StatusBarExample-tvOS" */; 675 | buildPhases = ( 676 | 2D02E4771E0B4A5D006451C7 /* Sources */, 677 | 2D02E4781E0B4A5D006451C7 /* Frameworks */, 678 | 2D02E4791E0B4A5D006451C7 /* Resources */, 679 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, 680 | ); 681 | buildRules = ( 682 | ); 683 | dependencies = ( 684 | ); 685 | name = "StatusBarExample-tvOS"; 686 | productName = "StatusBarExample-tvOS"; 687 | productReference = 2D02E47B1E0B4A5D006451C7 /* StatusBarExample-tvOS.app */; 688 | productType = "com.apple.product-type.application"; 689 | }; 690 | 2D02E48F1E0B4A5D006451C7 /* StatusBarExample-tvOSTests */ = { 691 | isa = PBXNativeTarget; 692 | buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StatusBarExample-tvOSTests" */; 693 | buildPhases = ( 694 | 2D02E48C1E0B4A5D006451C7 /* Sources */, 695 | 2D02E48D1E0B4A5D006451C7 /* Frameworks */, 696 | 2D02E48E1E0B4A5D006451C7 /* Resources */, 697 | ); 698 | buildRules = ( 699 | ); 700 | dependencies = ( 701 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, 702 | ); 703 | name = "StatusBarExample-tvOSTests"; 704 | productName = "StatusBarExample-tvOSTests"; 705 | productReference = 2D02E4901E0B4A5D006451C7 /* StatusBarExample-tvOSTests.xctest */; 706 | productType = "com.apple.product-type.bundle.unit-test"; 707 | }; 708 | /* End PBXNativeTarget section */ 709 | 710 | /* Begin PBXProject section */ 711 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 712 | isa = PBXProject; 713 | attributes = { 714 | LastUpgradeCheck = 0940; 715 | ORGANIZATIONNAME = Facebook; 716 | TargetAttributes = { 717 | 00E356ED1AD99517003FC87E = { 718 | CreatedOnToolsVersion = 6.2; 719 | TestTargetID = 13B07F861A680F5B00A75B9A; 720 | }; 721 | 2D02E47A1E0B4A5D006451C7 = { 722 | CreatedOnToolsVersion = 8.2.1; 723 | ProvisioningStyle = Automatic; 724 | }; 725 | 2D02E48F1E0B4A5D006451C7 = { 726 | CreatedOnToolsVersion = 8.2.1; 727 | ProvisioningStyle = Automatic; 728 | TestTargetID = 2D02E47A1E0B4A5D006451C7; 729 | }; 730 | }; 731 | }; 732 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "StatusBarExample" */; 733 | compatibilityVersion = "Xcode 3.2"; 734 | developmentRegion = English; 735 | hasScannedForEncodings = 0; 736 | knownRegions = ( 737 | en, 738 | Base, 739 | ); 740 | mainGroup = 83CBB9F61A601CBA00E9B192; 741 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 742 | projectDirPath = ""; 743 | projectReferences = ( 744 | { 745 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 746 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 747 | }, 748 | { 749 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 750 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 751 | }, 752 | { 753 | ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; 754 | ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; 755 | }, 756 | { 757 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 758 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 759 | }, 760 | { 761 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 762 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 763 | }, 764 | { 765 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 766 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 767 | }, 768 | { 769 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 770 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 771 | }, 772 | { 773 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 774 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 775 | }, 776 | { 777 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 778 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 779 | }, 780 | { 781 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 782 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 783 | }, 784 | { 785 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 786 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 787 | }, 788 | { 789 | ProductGroup = 146834001AC3E56700842450 /* Products */; 790 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 791 | }, 792 | { 793 | ProductGroup = B9903060220E217500AD1234 /* Products */; 794 | ProjectRef = B990305F220E217500AD1234 /* RNCStatusBar.xcodeproj */; 795 | }, 796 | ); 797 | projectRoot = ""; 798 | targets = ( 799 | 13B07F861A680F5B00A75B9A /* StatusBarExample */, 800 | 00E356ED1AD99517003FC87E /* StatusBarExampleTests */, 801 | 2D02E47A1E0B4A5D006451C7 /* StatusBarExample-tvOS */, 802 | 2D02E48F1E0B4A5D006451C7 /* StatusBarExample-tvOSTests */, 803 | ); 804 | }; 805 | /* End PBXProject section */ 806 | 807 | /* Begin PBXReferenceProxy section */ 808 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 809 | isa = PBXReferenceProxy; 810 | fileType = archive.ar; 811 | path = libRCTActionSheet.a; 812 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 813 | sourceTree = BUILT_PRODUCTS_DIR; 814 | }; 815 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 816 | isa = PBXReferenceProxy; 817 | fileType = archive.ar; 818 | path = libRCTGeolocation.a; 819 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 820 | sourceTree = BUILT_PRODUCTS_DIR; 821 | }; 822 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 823 | isa = PBXReferenceProxy; 824 | fileType = archive.ar; 825 | path = libRCTImage.a; 826 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 827 | sourceTree = BUILT_PRODUCTS_DIR; 828 | }; 829 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 830 | isa = PBXReferenceProxy; 831 | fileType = archive.ar; 832 | path = libRCTNetwork.a; 833 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 834 | sourceTree = BUILT_PRODUCTS_DIR; 835 | }; 836 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 837 | isa = PBXReferenceProxy; 838 | fileType = archive.ar; 839 | path = libRCTVibration.a; 840 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 841 | sourceTree = BUILT_PRODUCTS_DIR; 842 | }; 843 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 844 | isa = PBXReferenceProxy; 845 | fileType = archive.ar; 846 | path = libRCTSettings.a; 847 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 848 | sourceTree = BUILT_PRODUCTS_DIR; 849 | }; 850 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 851 | isa = PBXReferenceProxy; 852 | fileType = archive.ar; 853 | path = libRCTWebSocket.a; 854 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 855 | sourceTree = BUILT_PRODUCTS_DIR; 856 | }; 857 | 146834041AC3E56700842450 /* libReact.a */ = { 858 | isa = PBXReferenceProxy; 859 | fileType = archive.ar; 860 | path = libReact.a; 861 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 862 | sourceTree = BUILT_PRODUCTS_DIR; 863 | }; 864 | 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { 865 | isa = PBXReferenceProxy; 866 | fileType = archive.ar; 867 | path = "libRCTBlob-tvOS.a"; 868 | remoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */; 869 | sourceTree = BUILT_PRODUCTS_DIR; 870 | }; 871 | 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = { 872 | isa = PBXReferenceProxy; 873 | fileType = archive.ar; 874 | path = libfishhook.a; 875 | remoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */; 876 | sourceTree = BUILT_PRODUCTS_DIR; 877 | }; 878 | 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = { 879 | isa = PBXReferenceProxy; 880 | fileType = archive.ar; 881 | path = "libfishhook-tvOS.a"; 882 | remoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */; 883 | sourceTree = BUILT_PRODUCTS_DIR; 884 | }; 885 | 2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = { 886 | isa = PBXReferenceProxy; 887 | fileType = archive.ar; 888 | path = libjsinspector.a; 889 | remoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */; 890 | sourceTree = BUILT_PRODUCTS_DIR; 891 | }; 892 | 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = { 893 | isa = PBXReferenceProxy; 894 | fileType = archive.ar; 895 | path = "libjsinspector-tvOS.a"; 896 | remoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */; 897 | sourceTree = BUILT_PRODUCTS_DIR; 898 | }; 899 | 2DF0FFE32056DD460020B375 /* libthird-party.a */ = { 900 | isa = PBXReferenceProxy; 901 | fileType = archive.ar; 902 | path = "libthird-party.a"; 903 | remoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */; 904 | sourceTree = BUILT_PRODUCTS_DIR; 905 | }; 906 | 2DF0FFE52056DD460020B375 /* libthird-party.a */ = { 907 | isa = PBXReferenceProxy; 908 | fileType = archive.ar; 909 | path = "libthird-party.a"; 910 | remoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */; 911 | sourceTree = BUILT_PRODUCTS_DIR; 912 | }; 913 | 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = { 914 | isa = PBXReferenceProxy; 915 | fileType = archive.ar; 916 | path = "libdouble-conversion.a"; 917 | remoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */; 918 | sourceTree = BUILT_PRODUCTS_DIR; 919 | }; 920 | 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = { 921 | isa = PBXReferenceProxy; 922 | fileType = archive.ar; 923 | path = "libdouble-conversion.a"; 924 | remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */; 925 | sourceTree = BUILT_PRODUCTS_DIR; 926 | }; 927 | 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { 928 | isa = PBXReferenceProxy; 929 | fileType = archive.ar; 930 | path = "libRCTImage-tvOS.a"; 931 | remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; 932 | sourceTree = BUILT_PRODUCTS_DIR; 933 | }; 934 | 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { 935 | isa = PBXReferenceProxy; 936 | fileType = archive.ar; 937 | path = "libRCTLinking-tvOS.a"; 938 | remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; 939 | sourceTree = BUILT_PRODUCTS_DIR; 940 | }; 941 | 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { 942 | isa = PBXReferenceProxy; 943 | fileType = archive.ar; 944 | path = "libRCTNetwork-tvOS.a"; 945 | remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; 946 | sourceTree = BUILT_PRODUCTS_DIR; 947 | }; 948 | 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { 949 | isa = PBXReferenceProxy; 950 | fileType = archive.ar; 951 | path = "libRCTSettings-tvOS.a"; 952 | remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; 953 | sourceTree = BUILT_PRODUCTS_DIR; 954 | }; 955 | 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { 956 | isa = PBXReferenceProxy; 957 | fileType = archive.ar; 958 | path = "libRCTText-tvOS.a"; 959 | remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; 960 | sourceTree = BUILT_PRODUCTS_DIR; 961 | }; 962 | 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { 963 | isa = PBXReferenceProxy; 964 | fileType = archive.ar; 965 | path = "libRCTWebSocket-tvOS.a"; 966 | remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; 967 | sourceTree = BUILT_PRODUCTS_DIR; 968 | }; 969 | 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { 970 | isa = PBXReferenceProxy; 971 | fileType = archive.ar; 972 | path = libReact.a; 973 | remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; 974 | sourceTree = BUILT_PRODUCTS_DIR; 975 | }; 976 | 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { 977 | isa = PBXReferenceProxy; 978 | fileType = archive.ar; 979 | path = libyoga.a; 980 | remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; 981 | sourceTree = BUILT_PRODUCTS_DIR; 982 | }; 983 | 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { 984 | isa = PBXReferenceProxy; 985 | fileType = archive.ar; 986 | path = libyoga.a; 987 | remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; 988 | sourceTree = BUILT_PRODUCTS_DIR; 989 | }; 990 | 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { 991 | isa = PBXReferenceProxy; 992 | fileType = archive.ar; 993 | path = libcxxreact.a; 994 | remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; 995 | sourceTree = BUILT_PRODUCTS_DIR; 996 | }; 997 | 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { 998 | isa = PBXReferenceProxy; 999 | fileType = archive.ar; 1000 | path = libcxxreact.a; 1001 | remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; 1002 | sourceTree = BUILT_PRODUCTS_DIR; 1003 | }; 1004 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 1005 | isa = PBXReferenceProxy; 1006 | fileType = archive.ar; 1007 | path = libRCTAnimation.a; 1008 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 1009 | sourceTree = BUILT_PRODUCTS_DIR; 1010 | }; 1011 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 1012 | isa = PBXReferenceProxy; 1013 | fileType = archive.ar; 1014 | path = libRCTAnimation.a; 1015 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 1016 | sourceTree = BUILT_PRODUCTS_DIR; 1017 | }; 1018 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 1019 | isa = PBXReferenceProxy; 1020 | fileType = archive.ar; 1021 | path = libRCTLinking.a; 1022 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 1023 | sourceTree = BUILT_PRODUCTS_DIR; 1024 | }; 1025 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 1026 | isa = PBXReferenceProxy; 1027 | fileType = archive.ar; 1028 | path = libRCTText.a; 1029 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 1030 | sourceTree = BUILT_PRODUCTS_DIR; 1031 | }; 1032 | ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { 1033 | isa = PBXReferenceProxy; 1034 | fileType = archive.ar; 1035 | path = libRCTBlob.a; 1036 | remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; 1037 | sourceTree = BUILT_PRODUCTS_DIR; 1038 | }; 1039 | B9902F52220E11A700AD1234 /* libjsi.a */ = { 1040 | isa = PBXReferenceProxy; 1041 | fileType = archive.ar; 1042 | path = libjsi.a; 1043 | remoteRef = B9902F51220E11A700AD1234 /* PBXContainerItemProxy */; 1044 | sourceTree = BUILT_PRODUCTS_DIR; 1045 | }; 1046 | B9902F54220E11A700AD1234 /* libjsiexecutor.a */ = { 1047 | isa = PBXReferenceProxy; 1048 | fileType = archive.ar; 1049 | path = libjsiexecutor.a; 1050 | remoteRef = B9902F53220E11A700AD1234 /* PBXContainerItemProxy */; 1051 | sourceTree = BUILT_PRODUCTS_DIR; 1052 | }; 1053 | B9902F56220E11A700AD1234 /* libjsi-tvOS.a */ = { 1054 | isa = PBXReferenceProxy; 1055 | fileType = archive.ar; 1056 | path = "libjsi-tvOS.a"; 1057 | remoteRef = B9902F55220E11A700AD1234 /* PBXContainerItemProxy */; 1058 | sourceTree = BUILT_PRODUCTS_DIR; 1059 | }; 1060 | B9902F58220E11A700AD1234 /* libjsiexecutor-tvOS.a */ = { 1061 | isa = PBXReferenceProxy; 1062 | fileType = archive.ar; 1063 | path = "libjsiexecutor-tvOS.a"; 1064 | remoteRef = B9902F57220E11A700AD1234 /* PBXContainerItemProxy */; 1065 | sourceTree = BUILT_PRODUCTS_DIR; 1066 | }; 1067 | B9903064220E217500AD1234 /* libRNCStatusBar.a */ = { 1068 | isa = PBXReferenceProxy; 1069 | fileType = archive.ar; 1070 | path = libRNCStatusBar.a; 1071 | remoteRef = B9903063220E217500AD1234 /* PBXContainerItemProxy */; 1072 | sourceTree = BUILT_PRODUCTS_DIR; 1073 | }; 1074 | /* End PBXReferenceProxy section */ 1075 | 1076 | /* Begin PBXResourcesBuildPhase section */ 1077 | 00E356EC1AD99517003FC87E /* Resources */ = { 1078 | isa = PBXResourcesBuildPhase; 1079 | buildActionMask = 2147483647; 1080 | files = ( 1081 | ); 1082 | runOnlyForDeploymentPostprocessing = 0; 1083 | }; 1084 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 1085 | isa = PBXResourcesBuildPhase; 1086 | buildActionMask = 2147483647; 1087 | files = ( 1088 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 1089 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 1090 | ); 1091 | runOnlyForDeploymentPostprocessing = 0; 1092 | }; 1093 | 2D02E4791E0B4A5D006451C7 /* Resources */ = { 1094 | isa = PBXResourcesBuildPhase; 1095 | buildActionMask = 2147483647; 1096 | files = ( 1097 | 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, 1098 | ); 1099 | runOnlyForDeploymentPostprocessing = 0; 1100 | }; 1101 | 2D02E48E1E0B4A5D006451C7 /* Resources */ = { 1102 | isa = PBXResourcesBuildPhase; 1103 | buildActionMask = 2147483647; 1104 | files = ( 1105 | ); 1106 | runOnlyForDeploymentPostprocessing = 0; 1107 | }; 1108 | /* End PBXResourcesBuildPhase section */ 1109 | 1110 | /* Begin PBXShellScriptBuildPhase section */ 1111 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 1112 | isa = PBXShellScriptBuildPhase; 1113 | buildActionMask = 2147483647; 1114 | files = ( 1115 | ); 1116 | inputPaths = ( 1117 | ); 1118 | name = "Bundle React Native code and images"; 1119 | outputPaths = ( 1120 | ); 1121 | runOnlyForDeploymentPostprocessing = 0; 1122 | shellPath = /bin/sh; 1123 | shellScript = "if [ \"$CONFIGURATION\" == \"Debug\" ]; then\n echo \"Debug Configuration\"\n export NODE_BINARY=node\n ../../node_modules/react-native/scripts/react-native-xcode.sh\nelse\n echo \"Tests: Release Configuration\"\n RESOURCE_PATH=$SRCROOT/../../.tmp\n FILENAME_IN_BUNDLE=main.jsbundle\n BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app\n cp $RESOURCE_PATH/ios-bundle.js $BUILD_APP_DIR/$FILENAME_IN_BUNDLE\n echo \"Tests: Copied main.jsbundle from ./.tmp\"\nfi\n\n"; 1124 | }; 1125 | 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { 1126 | isa = PBXShellScriptBuildPhase; 1127 | buildActionMask = 2147483647; 1128 | files = ( 1129 | ); 1130 | inputPaths = ( 1131 | ); 1132 | name = "Bundle React Native Code And Images"; 1133 | outputPaths = ( 1134 | ); 1135 | runOnlyForDeploymentPostprocessing = 0; 1136 | shellPath = /bin/sh; 1137 | shellScript = "export NODE_BINARY=node\n../../node_modules/react-native/scripts/react-native-xcode.sh"; 1138 | }; 1139 | /* End PBXShellScriptBuildPhase section */ 1140 | 1141 | /* Begin PBXSourcesBuildPhase section */ 1142 | 00E356EA1AD99517003FC87E /* Sources */ = { 1143 | isa = PBXSourcesBuildPhase; 1144 | buildActionMask = 2147483647; 1145 | files = ( 1146 | 00E356F31AD99517003FC87E /* StatusBarExampleTests.m in Sources */, 1147 | ); 1148 | runOnlyForDeploymentPostprocessing = 0; 1149 | }; 1150 | 13B07F871A680F5B00A75B9A /* Sources */ = { 1151 | isa = PBXSourcesBuildPhase; 1152 | buildActionMask = 2147483647; 1153 | files = ( 1154 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 1155 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 1156 | ); 1157 | runOnlyForDeploymentPostprocessing = 0; 1158 | }; 1159 | 2D02E4771E0B4A5D006451C7 /* Sources */ = { 1160 | isa = PBXSourcesBuildPhase; 1161 | buildActionMask = 2147483647; 1162 | files = ( 1163 | 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, 1164 | 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, 1165 | ); 1166 | runOnlyForDeploymentPostprocessing = 0; 1167 | }; 1168 | 2D02E48C1E0B4A5D006451C7 /* Sources */ = { 1169 | isa = PBXSourcesBuildPhase; 1170 | buildActionMask = 2147483647; 1171 | files = ( 1172 | 2DCD954D1E0B4F2C00145EB5 /* StatusBarExampleTests.m in Sources */, 1173 | ); 1174 | runOnlyForDeploymentPostprocessing = 0; 1175 | }; 1176 | /* End PBXSourcesBuildPhase section */ 1177 | 1178 | /* Begin PBXTargetDependency section */ 1179 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 1180 | isa = PBXTargetDependency; 1181 | target = 13B07F861A680F5B00A75B9A /* StatusBarExample */; 1182 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 1183 | }; 1184 | 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { 1185 | isa = PBXTargetDependency; 1186 | target = 2D02E47A1E0B4A5D006451C7 /* StatusBarExample-tvOS */; 1187 | targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; 1188 | }; 1189 | /* End PBXTargetDependency section */ 1190 | 1191 | /* Begin PBXVariantGroup section */ 1192 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 1193 | isa = PBXVariantGroup; 1194 | children = ( 1195 | 13B07FB21A68108700A75B9A /* Base */, 1196 | ); 1197 | name = LaunchScreen.xib; 1198 | path = StatusBarExample; 1199 | sourceTree = ""; 1200 | }; 1201 | /* End PBXVariantGroup section */ 1202 | 1203 | /* Begin XCBuildConfiguration section */ 1204 | 00E356F61AD99517003FC87E /* Debug */ = { 1205 | isa = XCBuildConfiguration; 1206 | buildSettings = { 1207 | BUNDLE_LOADER = "$(TEST_HOST)"; 1208 | GCC_PREPROCESSOR_DEFINITIONS = ( 1209 | "DEBUG=1", 1210 | "$(inherited)", 1211 | ); 1212 | INFOPLIST_FILE = StatusBarExampleTests/Info.plist; 1213 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1214 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1215 | OTHER_LDFLAGS = ( 1216 | "-ObjC", 1217 | "-lc++", 1218 | ); 1219 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 1220 | PRODUCT_NAME = "$(TARGET_NAME)"; 1221 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusBarExample.app/StatusBarExample"; 1222 | }; 1223 | name = Debug; 1224 | }; 1225 | 00E356F71AD99517003FC87E /* Release */ = { 1226 | isa = XCBuildConfiguration; 1227 | buildSettings = { 1228 | BUNDLE_LOADER = "$(TEST_HOST)"; 1229 | COPY_PHASE_STRIP = NO; 1230 | INFOPLIST_FILE = StatusBarExampleTests/Info.plist; 1231 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1232 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1233 | OTHER_LDFLAGS = ( 1234 | "-ObjC", 1235 | "-lc++", 1236 | ); 1237 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 1238 | PRODUCT_NAME = "$(TARGET_NAME)"; 1239 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusBarExample.app/StatusBarExample"; 1240 | }; 1241 | name = Release; 1242 | }; 1243 | 13B07F941A680F5B00A75B9A /* Debug */ = { 1244 | isa = XCBuildConfiguration; 1245 | buildSettings = { 1246 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1247 | CURRENT_PROJECT_VERSION = 1; 1248 | DEAD_CODE_STRIPPING = NO; 1249 | HEADER_SEARCH_PATHS = "$(SRCROOT)/../ios"; 1250 | "HEADER_SEARCH_PATHS[arch=*]" = ""; 1251 | INFOPLIST_FILE = StatusBarExample/Info.plist; 1252 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1253 | OTHER_LDFLAGS = ( 1254 | "$(inherited)", 1255 | "-ObjC", 1256 | "-lc++", 1257 | ); 1258 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 1259 | PRODUCT_NAME = StatusBarExample; 1260 | VERSIONING_SYSTEM = "apple-generic"; 1261 | }; 1262 | name = Debug; 1263 | }; 1264 | 13B07F951A680F5B00A75B9A /* Release */ = { 1265 | isa = XCBuildConfiguration; 1266 | buildSettings = { 1267 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1268 | CURRENT_PROJECT_VERSION = 1; 1269 | HEADER_SEARCH_PATHS = "$(SRCROOT)/../ios"; 1270 | INFOPLIST_FILE = StatusBarExample/Info.plist; 1271 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1272 | OTHER_LDFLAGS = ( 1273 | "$(inherited)", 1274 | "-ObjC", 1275 | "-lc++", 1276 | ); 1277 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; 1278 | PRODUCT_NAME = StatusBarExample; 1279 | VERSIONING_SYSTEM = "apple-generic"; 1280 | }; 1281 | name = Release; 1282 | }; 1283 | 2D02E4971E0B4A5E006451C7 /* Debug */ = { 1284 | isa = XCBuildConfiguration; 1285 | buildSettings = { 1286 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1287 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1288 | CLANG_ANALYZER_NONNULL = YES; 1289 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1290 | CLANG_WARN_INFINITE_RECURSION = YES; 1291 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1292 | DEBUG_INFORMATION_FORMAT = dwarf; 1293 | ENABLE_TESTABILITY = YES; 1294 | GCC_NO_COMMON_BLOCKS = YES; 1295 | INFOPLIST_FILE = "StatusBarExample-tvOS/Info.plist"; 1296 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1297 | OTHER_LDFLAGS = ( 1298 | "-ObjC", 1299 | "-lc++", 1300 | ); 1301 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StatusBarExample-tvOS"; 1302 | PRODUCT_NAME = "$(TARGET_NAME)"; 1303 | SDKROOT = appletvos; 1304 | TARGETED_DEVICE_FAMILY = 3; 1305 | TVOS_DEPLOYMENT_TARGET = 9.2; 1306 | }; 1307 | name = Debug; 1308 | }; 1309 | 2D02E4981E0B4A5E006451C7 /* Release */ = { 1310 | isa = XCBuildConfiguration; 1311 | buildSettings = { 1312 | ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; 1313 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 1314 | CLANG_ANALYZER_NONNULL = YES; 1315 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1316 | CLANG_WARN_INFINITE_RECURSION = YES; 1317 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1318 | COPY_PHASE_STRIP = NO; 1319 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1320 | GCC_NO_COMMON_BLOCKS = YES; 1321 | INFOPLIST_FILE = "StatusBarExample-tvOS/Info.plist"; 1322 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1323 | OTHER_LDFLAGS = ( 1324 | "-ObjC", 1325 | "-lc++", 1326 | ); 1327 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StatusBarExample-tvOS"; 1328 | PRODUCT_NAME = "$(TARGET_NAME)"; 1329 | SDKROOT = appletvos; 1330 | TARGETED_DEVICE_FAMILY = 3; 1331 | TVOS_DEPLOYMENT_TARGET = 9.2; 1332 | }; 1333 | name = Release; 1334 | }; 1335 | 2D02E4991E0B4A5E006451C7 /* Debug */ = { 1336 | isa = XCBuildConfiguration; 1337 | buildSettings = { 1338 | BUNDLE_LOADER = "$(TEST_HOST)"; 1339 | CLANG_ANALYZER_NONNULL = YES; 1340 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1341 | CLANG_WARN_INFINITE_RECURSION = YES; 1342 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1343 | DEBUG_INFORMATION_FORMAT = dwarf; 1344 | ENABLE_TESTABILITY = YES; 1345 | GCC_NO_COMMON_BLOCKS = YES; 1346 | INFOPLIST_FILE = "StatusBarExample-tvOSTests/Info.plist"; 1347 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1348 | OTHER_LDFLAGS = ( 1349 | "-ObjC", 1350 | "-lc++", 1351 | ); 1352 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StatusBarExample-tvOSTests"; 1353 | PRODUCT_NAME = "$(TARGET_NAME)"; 1354 | SDKROOT = appletvos; 1355 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusBarExample-tvOS.app/StatusBarExample-tvOS"; 1356 | TVOS_DEPLOYMENT_TARGET = 10.1; 1357 | }; 1358 | name = Debug; 1359 | }; 1360 | 2D02E49A1E0B4A5E006451C7 /* Release */ = { 1361 | isa = XCBuildConfiguration; 1362 | buildSettings = { 1363 | BUNDLE_LOADER = "$(TEST_HOST)"; 1364 | CLANG_ANALYZER_NONNULL = YES; 1365 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1366 | CLANG_WARN_INFINITE_RECURSION = YES; 1367 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1368 | COPY_PHASE_STRIP = NO; 1369 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1370 | GCC_NO_COMMON_BLOCKS = YES; 1371 | INFOPLIST_FILE = "StatusBarExample-tvOSTests/Info.plist"; 1372 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1373 | OTHER_LDFLAGS = ( 1374 | "-ObjC", 1375 | "-lc++", 1376 | ); 1377 | PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.StatusBarExample-tvOSTests"; 1378 | PRODUCT_NAME = "$(TARGET_NAME)"; 1379 | SDKROOT = appletvos; 1380 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusBarExample-tvOS.app/StatusBarExample-tvOS"; 1381 | TVOS_DEPLOYMENT_TARGET = 10.1; 1382 | }; 1383 | name = Release; 1384 | }; 1385 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 1386 | isa = XCBuildConfiguration; 1387 | buildSettings = { 1388 | ALWAYS_SEARCH_USER_PATHS = NO; 1389 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1390 | CLANG_CXX_LIBRARY = "libc++"; 1391 | CLANG_ENABLE_MODULES = YES; 1392 | CLANG_ENABLE_OBJC_ARC = YES; 1393 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1394 | CLANG_WARN_BOOL_CONVERSION = YES; 1395 | CLANG_WARN_COMMA = YES; 1396 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1397 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1398 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1399 | CLANG_WARN_EMPTY_BODY = YES; 1400 | CLANG_WARN_ENUM_CONVERSION = YES; 1401 | CLANG_WARN_INFINITE_RECURSION = YES; 1402 | CLANG_WARN_INT_CONVERSION = YES; 1403 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1404 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1405 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1406 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1407 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1408 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1409 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1410 | CLANG_WARN_UNREACHABLE_CODE = YES; 1411 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1412 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1413 | COPY_PHASE_STRIP = NO; 1414 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1415 | ENABLE_TESTABILITY = YES; 1416 | GCC_C_LANGUAGE_STANDARD = gnu99; 1417 | GCC_DYNAMIC_NO_PIC = NO; 1418 | GCC_NO_COMMON_BLOCKS = YES; 1419 | GCC_OPTIMIZATION_LEVEL = 0; 1420 | GCC_PREPROCESSOR_DEFINITIONS = ( 1421 | "DEBUG=1", 1422 | "$(inherited)", 1423 | ); 1424 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 1425 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1426 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1427 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1428 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1429 | GCC_WARN_UNUSED_FUNCTION = YES; 1430 | GCC_WARN_UNUSED_VARIABLE = YES; 1431 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1432 | MTL_ENABLE_DEBUG_INFO = YES; 1433 | ONLY_ACTIVE_ARCH = YES; 1434 | SDKROOT = iphoneos; 1435 | }; 1436 | name = Debug; 1437 | }; 1438 | 83CBBA211A601CBA00E9B192 /* Release */ = { 1439 | isa = XCBuildConfiguration; 1440 | buildSettings = { 1441 | ALWAYS_SEARCH_USER_PATHS = NO; 1442 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 1443 | CLANG_CXX_LIBRARY = "libc++"; 1444 | CLANG_ENABLE_MODULES = YES; 1445 | CLANG_ENABLE_OBJC_ARC = YES; 1446 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1447 | CLANG_WARN_BOOL_CONVERSION = YES; 1448 | CLANG_WARN_COMMA = YES; 1449 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1450 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1451 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1452 | CLANG_WARN_EMPTY_BODY = YES; 1453 | CLANG_WARN_ENUM_CONVERSION = YES; 1454 | CLANG_WARN_INFINITE_RECURSION = YES; 1455 | CLANG_WARN_INT_CONVERSION = YES; 1456 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1457 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1458 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1459 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1460 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1461 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1462 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1463 | CLANG_WARN_UNREACHABLE_CODE = YES; 1464 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1465 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 1466 | COPY_PHASE_STRIP = YES; 1467 | ENABLE_NS_ASSERTIONS = NO; 1468 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1469 | GCC_C_LANGUAGE_STANDARD = gnu99; 1470 | GCC_NO_COMMON_BLOCKS = YES; 1471 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1472 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1473 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1474 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1475 | GCC_WARN_UNUSED_FUNCTION = YES; 1476 | GCC_WARN_UNUSED_VARIABLE = YES; 1477 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 1478 | MTL_ENABLE_DEBUG_INFO = NO; 1479 | SDKROOT = iphoneos; 1480 | VALIDATE_PRODUCT = YES; 1481 | }; 1482 | name = Release; 1483 | }; 1484 | /* End XCBuildConfiguration section */ 1485 | 1486 | /* Begin XCConfigurationList section */ 1487 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "StatusBarExampleTests" */ = { 1488 | isa = XCConfigurationList; 1489 | buildConfigurations = ( 1490 | 00E356F61AD99517003FC87E /* Debug */, 1491 | 00E356F71AD99517003FC87E /* Release */, 1492 | ); 1493 | defaultConfigurationIsVisible = 0; 1494 | defaultConfigurationName = Release; 1495 | }; 1496 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "StatusBarExample" */ = { 1497 | isa = XCConfigurationList; 1498 | buildConfigurations = ( 1499 | 13B07F941A680F5B00A75B9A /* Debug */, 1500 | 13B07F951A680F5B00A75B9A /* Release */, 1501 | ); 1502 | defaultConfigurationIsVisible = 0; 1503 | defaultConfigurationName = Release; 1504 | }; 1505 | 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StatusBarExample-tvOS" */ = { 1506 | isa = XCConfigurationList; 1507 | buildConfigurations = ( 1508 | 2D02E4971E0B4A5E006451C7 /* Debug */, 1509 | 2D02E4981E0B4A5E006451C7 /* Release */, 1510 | ); 1511 | defaultConfigurationIsVisible = 0; 1512 | defaultConfigurationName = Release; 1513 | }; 1514 | 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "StatusBarExample-tvOSTests" */ = { 1515 | isa = XCConfigurationList; 1516 | buildConfigurations = ( 1517 | 2D02E4991E0B4A5E006451C7 /* Debug */, 1518 | 2D02E49A1E0B4A5E006451C7 /* Release */, 1519 | ); 1520 | defaultConfigurationIsVisible = 0; 1521 | defaultConfigurationName = Release; 1522 | }; 1523 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "StatusBarExample" */ = { 1524 | isa = XCConfigurationList; 1525 | buildConfigurations = ( 1526 | 83CBBA201A601CBA00E9B192 /* Debug */, 1527 | 83CBBA211A601CBA00E9B192 /* Release */, 1528 | ); 1529 | defaultConfigurationIsVisible = 0; 1530 | defaultConfigurationName = Release; 1531 | }; 1532 | /* End XCConfigurationList section */ 1533 | }; 1534 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 1535 | } 1536 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample.xcodeproj/xcshareddata/xcschemes/StatusBarExample-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample.xcodeproj/xcshareddata/xcschemes/StatusBarExample.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 52 | 53 | 58 | 59 | 61 | 67 | 68 | 69 | 70 | 71 | 77 | 78 | 79 | 80 | 81 | 82 | 92 | 94 | 100 | 101 | 102 | 103 | 104 | 105 | 111 | 113 | 119 | 120 | 121 | 122 | 124 | 125 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | @property (nonatomic, strong) UIWindow *window; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import "AppDelegate.h" 9 | 10 | #import 11 | #import 12 | 13 | @implementation AppDelegate 14 | 15 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 16 | { 17 | NSURL *jsCodeLocation; 18 | 19 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"example/index" fallbackResource:nil]; 20 | 21 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 22 | moduleName:@"StatusBarExample" 23 | initialProperties:nil 24 | launchOptions:launchOptions]; 25 | rootView.backgroundColor = [UIColor blackColor]; 26 | 27 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 28 | UIViewController *rootViewController = [UIViewController new]; 29 | rootViewController.view = rootView; 30 | self.window.rootViewController = rootViewController; 31 | [self.window makeKeyAndVisible]; 32 | return YES; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /example/ios/StatusBarExample/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | StatusBarExample 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSLocationWhenInUseUsageDescription 28 | 29 | UILaunchStoryboardName 30 | LaunchScreen 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | UIInterfaceOrientationLandscapeRight 40 | 41 | UIViewControllerBasedStatusBarAppearance 42 | 43 | NSLocationWhenInUseUsageDescription 44 | 45 | NSAppTransportSecurity 46 | 47 | 48 | NSAllowsArbitraryLoads 49 | 50 | NSExceptionDomains 51 | 52 | localhost 53 | 54 | NSExceptionAllowsInsecureHTTPLoads 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /example/ios/StatusBarExample/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /example/ios/StatusBarExampleTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /example/ios/StatusBarExampleTests/StatusBarExampleTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | #import 10 | 11 | #import 12 | #import 13 | 14 | #define TIMEOUT_SECONDS 600 15 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 16 | 17 | @interface StatusBarExampleTests : XCTestCase 18 | 19 | @end 20 | 21 | @implementation StatusBarExampleTests 22 | 23 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 24 | { 25 | if (test(view)) { 26 | return YES; 27 | } 28 | for (UIView *subview in [view subviews]) { 29 | if ([self findSubviewInView:subview matching:test]) { 30 | return YES; 31 | } 32 | } 33 | return NO; 34 | } 35 | 36 | - (void)testRendersWelcomeScreen 37 | { 38 | UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; 39 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 40 | BOOL foundElement = NO; 41 | 42 | __block NSString *redboxError = nil; 43 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 44 | if (level >= RCTLogLevelError) { 45 | redboxError = message; 46 | } 47 | }); 48 | 49 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 50 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 51 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 52 | 53 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 54 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 55 | return YES; 56 | } 57 | return NO; 58 | }]; 59 | } 60 | 61 | RCTSetLogFunction(RCTDefaultLogFunction); 62 | 63 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 64 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 65 | } 66 | 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | declare module "@react-native-community/status-bar" { 2 | import React from 'react'; 3 | 4 | export type StatusBarStyle = "default" | "light-content" | "dark-content"; 5 | 6 | export type StatusBarAnimation = "none" | "fade" | "slide"; 7 | 8 | export interface StatusBarPropsIOS { 9 | /** 10 | * Sets the color of the status bar text. 11 | */ 12 | barStyle?: StatusBarStyle; 13 | 14 | /** 15 | * If the network activity indicator should be visible. 16 | */ 17 | networkActivityIndicatorVisible?: boolean; 18 | 19 | /** 20 | * The transition effect when showing and hiding the status bar using 21 | * the hidden prop. Defaults to 'fade'. 22 | */ 23 | showHideTransition?: "fade" | "slide"; 24 | } 25 | 26 | export interface StatusBarPropsAndroid { 27 | /** 28 | * The background color of the status bar. 29 | */ 30 | backgroundColor?: string; 31 | 32 | /** 33 | * If the status bar is translucent. When translucent is set to true, 34 | * the app will draw under the status bar. This is useful when using a 35 | * semi transparent status bar color. 36 | */ 37 | translucent?: boolean; 38 | } 39 | 40 | export interface StatusBarProps extends StatusBarPropsIOS, StatusBarPropsAndroid { 41 | /** 42 | * If the transition between status bar property changes should be 43 | * animated. Supported for backgroundColor, barStyle and hidden. 44 | */ 45 | animated?: boolean; 46 | 47 | /** 48 | * If the status bar is hidden. 49 | */ 50 | hidden?: boolean; 51 | } 52 | 53 | export class StatusBar extends React.Component { 54 | /** 55 | * The current height of the status bar on the device. 56 | * @platform android 57 | */ 58 | static currentHeight?: number; 59 | 60 | /** 61 | * Show or hide the status bar 62 | * @param hidden The dialog's title. 63 | * @param animation Optional animation when 64 | * changing the status bar hidden property. 65 | */ 66 | static setHidden: (hidden: boolean, animation?: StatusBarAnimation) => void; 67 | 68 | /** 69 | * Set the status bar style 70 | * @param style Status bar style to set 71 | * @param animated Animate the style change. 72 | */ 73 | static setBarStyle: (style: StatusBarStyle, animated?: boolean) => void; 74 | 75 | /** 76 | * Control the visibility of the network activity indicator 77 | * @param visible Show the indicator. 78 | */ 79 | static setNetworkActivityIndicatorVisible: (visible: boolean) => void; 80 | 81 | /** 82 | * Set the background color for the status bar 83 | * @param color Background color. 84 | * @param animated Animate the style change. 85 | */ 86 | static setBackgroundColor: (color: string, animated?: boolean) => void; 87 | 88 | /** 89 | * Control the translucency of the status bar 90 | * @param translucent Set as translucent. 91 | */ 92 | static setTranslucent: (translucent: boolean) => void; 93 | } 94 | 95 | export default StatusBar; 96 | } 97 | -------------------------------------------------------------------------------- /ios/RNCStatusBar.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | #import 11 | #import 12 | 13 | @interface RCTConvert (UIStatusBar) 14 | 15 | #if !TARGET_OS_TV 16 | + (UIStatusBarStyle)UIStatusBarStyle:(id)json; 17 | + (UIStatusBarAnimation)UIStatusBarAnimation:(id)json; 18 | #endif 19 | 20 | @end 21 | 22 | @interface RNCStatusBarManager : RCTEventEmitter 23 | 24 | @end -------------------------------------------------------------------------------- /ios/RNCStatusBar.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import "RNCStatusBar.h" 9 | 10 | #import 11 | #import 12 | #import 13 | 14 | 15 | #if !TARGET_OS_TV 16 | @implementation RCTConvert (UIStatusBar) 17 | 18 | RCT_ENUM_CONVERTER(UIStatusBarStyle, (@{ 19 | @"default": @(UIStatusBarStyleDefault), 20 | @"light-content": @(UIStatusBarStyleLightContent), 21 | @"dark-content": @(UIStatusBarStyleDefault), 22 | }), UIStatusBarStyleDefault, integerValue); 23 | 24 | RCT_ENUM_CONVERTER(UIStatusBarAnimation, (@{ 25 | @"none": @(UIStatusBarAnimationNone), 26 | @"fade": @(UIStatusBarAnimationFade), 27 | @"slide": @(UIStatusBarAnimationSlide), 28 | }), UIStatusBarAnimationNone, integerValue); 29 | 30 | @end 31 | #endif 32 | 33 | @implementation RNCStatusBarManager 34 | 35 | static BOOL RCTViewControllerBasedStatusBarAppearance() 36 | { 37 | static BOOL value; 38 | static dispatch_once_t onceToken; 39 | dispatch_once(&onceToken, ^{ 40 | value = [[[NSBundle mainBundle] objectForInfoDictionaryKey: 41 | @"UIViewControllerBasedStatusBarAppearance"] ?: @YES boolValue]; 42 | }); 43 | 44 | return value; 45 | } 46 | 47 | RCT_EXPORT_MODULE() 48 | 49 | - (NSArray *)supportedEvents 50 | { 51 | return @[@"statusBarFrameDidChange", 52 | @"statusBarFrameWillChange"]; 53 | } 54 | 55 | #if !TARGET_OS_TV 56 | 57 | - (void)startObserving 58 | { 59 | NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 60 | [nc addObserver:self selector:@selector(applicationDidChangeStatusBarFrame:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; 61 | [nc addObserver:self selector:@selector(applicationWillChangeStatusBarFrame:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; 62 | } 63 | 64 | - (void)stopObserving 65 | { 66 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 67 | } 68 | 69 | - (dispatch_queue_t)methodQueue 70 | { 71 | return dispatch_get_main_queue(); 72 | } 73 | 74 | - (void)emitEvent:(NSString *)eventName forNotification:(NSNotification *)notification 75 | { 76 | CGRect frame = [notification.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue]; 77 | NSDictionary *event = @{ 78 | @"frame": @{ 79 | @"x": @(frame.origin.x), 80 | @"y": @(frame.origin.y), 81 | @"width": @(frame.size.width), 82 | @"height": @(frame.size.height), 83 | }, 84 | }; 85 | [self sendEventWithName:eventName body:event]; 86 | } 87 | 88 | - (void)applicationDidChangeStatusBarFrame:(NSNotification *)notification 89 | { 90 | [self emitEvent:@"statusBarFrameDidChange" forNotification:notification]; 91 | } 92 | 93 | - (void)applicationWillChangeStatusBarFrame:(NSNotification *)notification 94 | { 95 | [self emitEvent:@"statusBarFrameWillChange" forNotification:notification]; 96 | } 97 | 98 | RCT_EXPORT_METHOD(getHeight:(RCTResponseSenderBlock)callback) 99 | { 100 | callback(@[@{ 101 | @"height": @(RCTSharedApplication().statusBarFrame.size.height), 102 | }]); 103 | } 104 | 105 | RCT_EXPORT_METHOD(setStyle:(UIStatusBarStyle)statusBarStyle 106 | animated:(BOOL)animated) 107 | { 108 | if (RCTViewControllerBasedStatusBarAppearance()) { 109 | RCTLogError(@"RCTStatusBarManager module requires that the \ 110 | UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); 111 | } else { 112 | [RCTSharedApplication() setStatusBarStyle:statusBarStyle 113 | animated:animated]; 114 | } 115 | } 116 | 117 | RCT_EXPORT_METHOD(setHidden:(BOOL)hidden 118 | withAnimation:(UIStatusBarAnimation)animation) 119 | { 120 | if (RCTViewControllerBasedStatusBarAppearance()) { 121 | RCTLogError(@"RCTStatusBarManager module requires that the \ 122 | UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO"); 123 | } else { 124 | [RCTSharedApplication() setStatusBarHidden:hidden 125 | withAnimation:animation]; 126 | } 127 | } 128 | 129 | RCT_EXPORT_METHOD(setNetworkActivityIndicatorVisible:(BOOL)visible) 130 | { 131 | RCTSharedApplication().networkActivityIndicatorVisible = visible; 132 | } 133 | 134 | #endif //TARGET_OS_TV 135 | 136 | @end 137 | -------------------------------------------------------------------------------- /ios/RNCStatusBar.podspec: -------------------------------------------------------------------------------- 1 | 2 | Pod::Spec.new do |s| 3 | s.name = "RNCStatusBar" 4 | s.version = "1.0.0" 5 | s.summary = "RNCStatusBar" 6 | s.description = <<-DESC 7 | RNCStatusBar 8 | DESC 9 | s.homepage = "" 10 | s.license = "MIT" 11 | # s.license = { :type => "MIT", :file => "FILE_LICENSE" } 12 | s.author = { "author" => "author@domain.cn" } 13 | s.platform = :ios, "7.0" 14 | s.source = { :git => "https://github.com/author/RNCStatusBar.git", :tag => "master" } 15 | s.source_files = "RNCStatusBar/**/*.{h,m}" 16 | s.requires_arc = true 17 | 18 | 19 | s.dependency "React" 20 | #s.dependency "others" 21 | 22 | end 23 | 24 | -------------------------------------------------------------------------------- /ios/RNCStatusBar.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | B3E7B58A1CC2AC0600A0062D /* RNCStatusBar.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* RNCStatusBar.m */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | 58B511D91A9E6C8500147676 /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = "include/$(PRODUCT_NAME)"; 18 | dstSubfolderSpec = 16; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 0; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | 134814201AA4EA6300B7C361 /* libRNCStatusBar.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNCStatusBar.a; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | B3E7B5881CC2AC0600A0062D /* RNCStatusBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNCStatusBar.h; sourceTree = ""; }; 28 | B3E7B5891CC2AC0600A0062D /* RNCStatusBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNCStatusBar.m; sourceTree = ""; }; 29 | /* End PBXFileReference section */ 30 | 31 | /* Begin PBXFrameworksBuildPhase section */ 32 | 58B511D81A9E6C8500147676 /* Frameworks */ = { 33 | isa = PBXFrameworksBuildPhase; 34 | buildActionMask = 2147483647; 35 | files = ( 36 | ); 37 | runOnlyForDeploymentPostprocessing = 0; 38 | }; 39 | /* End PBXFrameworksBuildPhase section */ 40 | 41 | /* Begin PBXGroup section */ 42 | 134814211AA4EA7D00B7C361 /* Products */ = { 43 | isa = PBXGroup; 44 | children = ( 45 | 134814201AA4EA6300B7C361 /* libRNCStatusBar.a */, 46 | ); 47 | name = Products; 48 | sourceTree = ""; 49 | }; 50 | 58B511D21A9E6C8500147676 = { 51 | isa = PBXGroup; 52 | children = ( 53 | B3E7B5881CC2AC0600A0062D /* RNCStatusBar.h */, 54 | B3E7B5891CC2AC0600A0062D /* RNCStatusBar.m */, 55 | 134814211AA4EA7D00B7C361 /* Products */, 56 | ); 57 | sourceTree = ""; 58 | }; 59 | /* End PBXGroup section */ 60 | 61 | /* Begin PBXNativeTarget section */ 62 | 58B511DA1A9E6C8500147676 /* RNCStatusBar */ = { 63 | isa = PBXNativeTarget; 64 | buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCStatusBar" */; 65 | buildPhases = ( 66 | 58B511D71A9E6C8500147676 /* Sources */, 67 | 58B511D81A9E6C8500147676 /* Frameworks */, 68 | 58B511D91A9E6C8500147676 /* CopyFiles */, 69 | ); 70 | buildRules = ( 71 | ); 72 | dependencies = ( 73 | ); 74 | name = RNCStatusBar; 75 | productName = RCTDataManager; 76 | productReference = 134814201AA4EA6300B7C361 /* libRNCStatusBar.a */; 77 | productType = "com.apple.product-type.library.static"; 78 | }; 79 | /* End PBXNativeTarget section */ 80 | 81 | /* Begin PBXProject section */ 82 | 58B511D31A9E6C8500147676 /* Project object */ = { 83 | isa = PBXProject; 84 | attributes = { 85 | LastUpgradeCheck = 0830; 86 | ORGANIZATIONNAME = Facebook; 87 | TargetAttributes = { 88 | 58B511DA1A9E6C8500147676 = { 89 | CreatedOnToolsVersion = 6.1.1; 90 | }; 91 | }; 92 | }; 93 | buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCStatusBar" */; 94 | compatibilityVersion = "Xcode 3.2"; 95 | developmentRegion = English; 96 | hasScannedForEncodings = 0; 97 | knownRegions = ( 98 | en, 99 | ); 100 | mainGroup = 58B511D21A9E6C8500147676; 101 | productRefGroup = 58B511D21A9E6C8500147676; 102 | projectDirPath = ""; 103 | projectRoot = ""; 104 | targets = ( 105 | 58B511DA1A9E6C8500147676 /* RNCStatusBar */, 106 | ); 107 | }; 108 | /* End PBXProject section */ 109 | 110 | /* Begin PBXSourcesBuildPhase section */ 111 | 58B511D71A9E6C8500147676 /* Sources */ = { 112 | isa = PBXSourcesBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | B3E7B58A1CC2AC0600A0062D /* RNCStatusBar.m in Sources */, 116 | ); 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | /* End PBXSourcesBuildPhase section */ 120 | 121 | /* Begin XCBuildConfiguration section */ 122 | 58B511ED1A9E6C8500147676 /* Debug */ = { 123 | isa = XCBuildConfiguration; 124 | buildSettings = { 125 | ALWAYS_SEARCH_USER_PATHS = NO; 126 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 127 | CLANG_CXX_LIBRARY = "libc++"; 128 | CLANG_ENABLE_MODULES = YES; 129 | CLANG_ENABLE_OBJC_ARC = YES; 130 | CLANG_WARN_BOOL_CONVERSION = YES; 131 | CLANG_WARN_CONSTANT_CONVERSION = YES; 132 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 133 | CLANG_WARN_EMPTY_BODY = YES; 134 | CLANG_WARN_ENUM_CONVERSION = YES; 135 | CLANG_WARN_INFINITE_RECURSION = YES; 136 | CLANG_WARN_INT_CONVERSION = YES; 137 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 138 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 139 | CLANG_WARN_UNREACHABLE_CODE = YES; 140 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 141 | COPY_PHASE_STRIP = NO; 142 | ENABLE_STRICT_OBJC_MSGSEND = YES; 143 | ENABLE_TESTABILITY = YES; 144 | GCC_C_LANGUAGE_STANDARD = gnu99; 145 | GCC_DYNAMIC_NO_PIC = NO; 146 | GCC_NO_COMMON_BLOCKS = YES; 147 | GCC_OPTIMIZATION_LEVEL = 0; 148 | GCC_PREPROCESSOR_DEFINITIONS = ( 149 | "DEBUG=1", 150 | "$(inherited)", 151 | ); 152 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 153 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 154 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 155 | GCC_WARN_UNDECLARED_SELECTOR = YES; 156 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 157 | GCC_WARN_UNUSED_FUNCTION = YES; 158 | GCC_WARN_UNUSED_VARIABLE = YES; 159 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 160 | MTL_ENABLE_DEBUG_INFO = YES; 161 | ONLY_ACTIVE_ARCH = YES; 162 | SDKROOT = iphoneos; 163 | }; 164 | name = Debug; 165 | }; 166 | 58B511EE1A9E6C8500147676 /* Release */ = { 167 | isa = XCBuildConfiguration; 168 | buildSettings = { 169 | ALWAYS_SEARCH_USER_PATHS = NO; 170 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 171 | CLANG_CXX_LIBRARY = "libc++"; 172 | CLANG_ENABLE_MODULES = YES; 173 | CLANG_ENABLE_OBJC_ARC = YES; 174 | CLANG_WARN_BOOL_CONVERSION = YES; 175 | CLANG_WARN_CONSTANT_CONVERSION = YES; 176 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 177 | CLANG_WARN_EMPTY_BODY = YES; 178 | CLANG_WARN_ENUM_CONVERSION = YES; 179 | CLANG_WARN_INFINITE_RECURSION = YES; 180 | CLANG_WARN_INT_CONVERSION = YES; 181 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 182 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 183 | CLANG_WARN_UNREACHABLE_CODE = YES; 184 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 185 | COPY_PHASE_STRIP = YES; 186 | ENABLE_NS_ASSERTIONS = NO; 187 | ENABLE_STRICT_OBJC_MSGSEND = YES; 188 | GCC_C_LANGUAGE_STANDARD = gnu99; 189 | GCC_NO_COMMON_BLOCKS = YES; 190 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 191 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 192 | GCC_WARN_UNDECLARED_SELECTOR = YES; 193 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 194 | GCC_WARN_UNUSED_FUNCTION = YES; 195 | GCC_WARN_UNUSED_VARIABLE = YES; 196 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 197 | MTL_ENABLE_DEBUG_INFO = NO; 198 | SDKROOT = iphoneos; 199 | VALIDATE_PRODUCT = YES; 200 | }; 201 | name = Release; 202 | }; 203 | 58B511F01A9E6C8500147676 /* Debug */ = { 204 | isa = XCBuildConfiguration; 205 | buildSettings = { 206 | HEADER_SEARCH_PATHS = ( 207 | "$(inherited)", 208 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 209 | "$(SRCROOT)/../../React/**", 210 | "$(SRCROOT)/../../react-native/React/**", 211 | ); 212 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 213 | OTHER_LDFLAGS = "-ObjC"; 214 | PRODUCT_NAME = RNCStatusBar; 215 | SKIP_INSTALL = YES; 216 | }; 217 | name = Debug; 218 | }; 219 | 58B511F11A9E6C8500147676 /* Release */ = { 220 | isa = XCBuildConfiguration; 221 | buildSettings = { 222 | HEADER_SEARCH_PATHS = ( 223 | "$(inherited)", 224 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 225 | "$(SRCROOT)/../../React/**", 226 | "$(SRCROOT)/../../react-native/React/**", 227 | ); 228 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 229 | OTHER_LDFLAGS = "-ObjC"; 230 | PRODUCT_NAME = RNCStatusBar; 231 | SKIP_INSTALL = YES; 232 | }; 233 | name = Release; 234 | }; 235 | /* End XCBuildConfiguration section */ 236 | 237 | /* Begin XCConfigurationList section */ 238 | 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "RNCStatusBar" */ = { 239 | isa = XCConfigurationList; 240 | buildConfigurations = ( 241 | 58B511ED1A9E6C8500147676 /* Debug */, 242 | 58B511EE1A9E6C8500147676 /* Release */, 243 | ); 244 | defaultConfigurationIsVisible = 0; 245 | defaultConfigurationName = Release; 246 | }; 247 | 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "RNCStatusBar" */ = { 248 | isa = XCConfigurationList; 249 | buildConfigurations = ( 250 | 58B511F01A9E6C8500147676 /* Debug */, 251 | 58B511F11A9E6C8500147676 /* Release */, 252 | ); 253 | defaultConfigurationIsVisible = 0; 254 | defaultConfigurationName = Release; 255 | }; 256 | /* End XCConfigurationList section */ 257 | }; 258 | rootObject = 58B511D31A9E6C8500147676 /* Project object */; 259 | } 260 | -------------------------------------------------------------------------------- /js/StatusBar.android.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | * @format 8 | * @flow 9 | */ 10 | 11 | 'use strict'; 12 | 13 | import {NativeEventEmitter} from 'react-native'; 14 | 15 | /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found when 16 | * making Flow check .android.js files. */ 17 | module.exports = new NativeEventEmitter('RNCStatusBarManager'); 18 | -------------------------------------------------------------------------------- /js/StatusBar.ios.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | * @format 8 | * @flow strict-local 9 | */ 10 | 11 | 'use strict'; 12 | 13 | import {NativeEventEmitter, NativeModules as Modules} from 'react-native'; 14 | 15 | /** 16 | * Use `StatusBar` for mutating the status bar. 17 | */ 18 | class StatusBarIOS extends NativeEventEmitter {} 19 | 20 | module.exports = new StatusBarIOS(Modules.RNCStatusBarManager); 21 | -------------------------------------------------------------------------------- /js/StatusBar.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | * 7 | * @format 8 | * @flow 9 | */ 10 | 11 | 'use strict'; 12 | 13 | import * as React from 'react'; 14 | import {Platform, NativeModules, processColor} from 'react-native'; 15 | 16 | const StatusBarManager = NativeModules.RNCStatusBarManager; 17 | 18 | /** 19 | * Status bar style 20 | */ 21 | export type StatusBarStyle = $Enum<{ 22 | /** 23 | * Default status bar style (dark for iOS, light for Android) 24 | */ 25 | default: string, 26 | /** 27 | * Dark background, white texts and icons 28 | */ 29 | 'light-content': string, 30 | /** 31 | * Light background, dark texts and icons 32 | */ 33 | 'dark-content': string, 34 | }>; 35 | 36 | /** 37 | * Status bar animation 38 | */ 39 | export type StatusBarAnimation = $Enum<{ 40 | /** 41 | * No animation 42 | */ 43 | none: string, 44 | /** 45 | * Fade animation 46 | */ 47 | fade: string, 48 | /** 49 | * Slide animation 50 | */ 51 | slide: string, 52 | }>; 53 | 54 | type AndroidProps = $ReadOnly<{| 55 | /** 56 | * The background color of the status bar. 57 | * @platform android 58 | */ 59 | backgroundColor?: ?string, 60 | /** 61 | * If the status bar is translucent. 62 | * When translucent is set to true, the app will draw under the status bar. 63 | * This is useful when using a semi transparent status bar color. 64 | * 65 | * @platform android 66 | */ 67 | translucent?: ?boolean, 68 | |}>; 69 | 70 | type IOSProps = $ReadOnly<{| 71 | /** 72 | * If the network activity indicator should be visible. 73 | * 74 | * @platform ios 75 | */ 76 | networkActivityIndicatorVisible?: ?boolean, 77 | /** 78 | * The transition effect when showing and hiding the status bar using the `hidden` 79 | * prop. Defaults to 'fade'. 80 | * 81 | * @platform ios 82 | */ 83 | showHideTransition?: ?('fade' | 'slide'), 84 | |}>; 85 | 86 | type Props = $ReadOnly<{| 87 | ...AndroidProps, 88 | ...IOSProps, 89 | /** 90 | * If the status bar is hidden. 91 | */ 92 | hidden?: ?boolean, 93 | /** 94 | * If the transition between status bar property changes should be animated. 95 | * Supported for backgroundColor, barStyle and hidden. 96 | */ 97 | animated?: ?boolean, 98 | /** 99 | * Sets the color of the status bar text. 100 | */ 101 | barStyle?: ?('default' | 'light-content' | 'dark-content'), 102 | |}>; 103 | 104 | /** 105 | * Merges the prop stack with the default values. 106 | */ 107 | function mergePropsStack( 108 | propsStack: Array, 109 | defaultValues: Object, 110 | ): Object { 111 | return propsStack.reduce((prev, cur) => { 112 | for (const prop in cur) { 113 | if (cur[prop] != null) { 114 | prev[prop] = cur[prop]; 115 | } 116 | } 117 | return prev; 118 | }, Object.assign({}, defaultValues)); 119 | } 120 | 121 | /** 122 | * Returns an object to insert in the props stack from the props 123 | * and the transition/animation info. 124 | */ 125 | function createStackEntry(props: any): any { 126 | return { 127 | backgroundColor: 128 | props.backgroundColor != null 129 | ? { 130 | value: props.backgroundColor, 131 | animated: props.animated, 132 | } 133 | : null, 134 | barStyle: 135 | props.barStyle != null 136 | ? { 137 | value: props.barStyle, 138 | animated: props.animated, 139 | } 140 | : null, 141 | translucent: props.translucent, 142 | hidden: 143 | props.hidden != null 144 | ? { 145 | value: props.hidden, 146 | animated: props.animated, 147 | transition: props.showHideTransition, 148 | } 149 | : null, 150 | networkActivityIndicatorVisible: props.networkActivityIndicatorVisible, 151 | }; 152 | } 153 | 154 | /** 155 | * Component to control the app status bar. 156 | * 157 | * ### Usage with Navigator 158 | * 159 | * It is possible to have multiple `StatusBar` components mounted at the same 160 | * time. The props will be merged in the order the `StatusBar` components were 161 | * mounted. One use case is to specify status bar styles per route using `Navigator`. 162 | * 163 | * ``` 164 | * 165 | * 169 | * 172 | * 173 | * 176 | * } 177 | * /> 178 | * 179 | * ``` 180 | * 181 | * ### Imperative API 182 | * 183 | * For cases where using a component is not ideal, there are static methods 184 | * to manipulate the `StatusBar` display stack. These methods have the same 185 | * behavior as mounting and unmounting a `StatusBar` component. 186 | * 187 | * For example, you can call `StatusBar.pushStackEntry` to update the status bar 188 | * before launching a third-party native UI component, and then call 189 | * `StatusBar.popStackEntry` when completed. 190 | * 191 | * ``` 192 | * const openThirdPartyBugReporter = async () => { 193 | * // The bug reporter has a dark background, so we push a new status bar style. 194 | * const stackEntry = StatusBar.pushStackEntry({barStyle: 'light-content'}); 195 | * 196 | * // `open` returns a promise that resolves when the UI is dismissed. 197 | * await BugReporter.open(); 198 | * 199 | * // Don't forget to call `popStackEntry` when you're done. 200 | * StatusBar.popStackEntry(stackEntry); 201 | * }; 202 | * ``` 203 | * 204 | * There is a legacy imperative API that enables you to manually update the 205 | * status bar styles. However, the legacy API does not update the internal 206 | * `StatusBar` display stack, which means that any changes will be overridden 207 | * whenever a `StatusBar` component is mounted or unmounted. 208 | * 209 | * It is strongly advised that you use `pushStackEntry`, `popStackEntry`, or 210 | * `replaceStackEntry` instead of the static methods beginning with `set`. 211 | * 212 | * ### Constants 213 | * 214 | * `currentHeight` (Android only) The height of the status bar. 215 | */ 216 | class StatusBar extends React.Component { 217 | static _propsStack = []; 218 | 219 | static _defaultProps = createStackEntry({ 220 | animated: false, 221 | showHideTransition: 'fade', 222 | backgroundColor: Platform.select({ 223 | android: StatusBarManager.DEFAULT_BACKGROUND_COLOR ?? 'black', 224 | ios: 'black', 225 | }), 226 | barStyle: 'default', 227 | translucent: false, 228 | hidden: false, 229 | networkActivityIndicatorVisible: false, 230 | }); 231 | 232 | // Timer for updating the native module values at the end of the frame. 233 | static _updateImmediate = null; 234 | 235 | // The current merged values from the props stack. 236 | static _currentValues = null; 237 | 238 | // TODO(janic): Provide a real API to deal with status bar height. See the 239 | // discussion in #6195. 240 | /** 241 | * The current height of the status bar on the device. 242 | * 243 | * @platform android 244 | */ 245 | static currentHeight = StatusBarManager.HEIGHT; 246 | 247 | // Provide an imperative API as static functions of the component. 248 | // See the corresponding prop for more detail. 249 | 250 | /** 251 | * Show or hide the status bar 252 | * @param hidden Hide the status bar. 253 | * @param animation Optional animation when 254 | * changing the status bar hidden property. 255 | */ 256 | static setHidden(hidden: boolean, animation?: StatusBarAnimation) { 257 | animation = animation || 'none'; 258 | StatusBar._defaultProps.hidden.value = hidden; 259 | if (Platform.OS === 'ios') { 260 | StatusBarManager.setHidden(hidden, animation); 261 | } else if (Platform.OS === 'android') { 262 | StatusBarManager.setHidden(hidden); 263 | } 264 | } 265 | 266 | /** 267 | * Set the status bar style 268 | * @param style Status bar style to set 269 | * @param animated Animate the style change. 270 | */ 271 | static setBarStyle(style: StatusBarStyle, animated?: boolean) { 272 | animated = animated || false; 273 | StatusBar._defaultProps.barStyle.value = style; 274 | if (Platform.OS === 'ios') { 275 | StatusBarManager.setStyle(style, animated); 276 | } else if (Platform.OS === 'android') { 277 | StatusBarManager.setStyle(style); 278 | } 279 | } 280 | 281 | /** 282 | * Control the visibility of the network activity indicator 283 | * @param visible Show the indicator. 284 | */ 285 | static setNetworkActivityIndicatorVisible(visible: boolean) { 286 | if (Platform.OS !== 'ios') { 287 | console.warn( 288 | '`setNetworkActivityIndicatorVisible` is only available on iOS', 289 | ); 290 | return; 291 | } 292 | StatusBar._defaultProps.networkActivityIndicatorVisible = visible; 293 | StatusBarManager.setNetworkActivityIndicatorVisible(visible); 294 | } 295 | 296 | /** 297 | * Set the background color for the status bar 298 | * @param color Background color. 299 | * @param animated Animate the style change. 300 | */ 301 | static setBackgroundColor(color: string, animated?: boolean) { 302 | if (Platform.OS !== 'android') { 303 | console.warn('`setBackgroundColor` is only available on Android'); 304 | return; 305 | } 306 | animated = animated || false; 307 | StatusBar._defaultProps.backgroundColor.value = color; 308 | StatusBarManager.setColor(processColor(color), animated); 309 | } 310 | 311 | /** 312 | * Control the translucency of the status bar 313 | * @param translucent Set as translucent. 314 | */ 315 | static setTranslucent(translucent: boolean) { 316 | if (Platform.OS !== 'android') { 317 | console.warn('`setTranslucent` is only available on Android'); 318 | return; 319 | } 320 | StatusBar._defaultProps.translucent = translucent; 321 | StatusBarManager.setTranslucent(translucent); 322 | } 323 | 324 | /** 325 | * Push a StatusBar entry onto the stack. 326 | * The return value should be passed to `popStackEntry` when complete. 327 | * 328 | * @param props Object containing the StatusBar props to use in the stack entry. 329 | */ 330 | static pushStackEntry(props: any) { 331 | const entry = createStackEntry(props); 332 | StatusBar._propsStack.push(entry); 333 | StatusBar._updatePropsStack(); 334 | return entry; 335 | } 336 | 337 | /** 338 | * Pop a StatusBar entry from the stack. 339 | * 340 | * @param entry Entry returned from `pushStackEntry`. 341 | */ 342 | static popStackEntry(entry: any) { 343 | const index = StatusBar._propsStack.indexOf(entry); 344 | if (index !== -1) { 345 | StatusBar._propsStack.splice(index, 1); 346 | } 347 | StatusBar._updatePropsStack(); 348 | } 349 | 350 | /** 351 | * Replace an existing StatusBar stack entry with new props. 352 | * 353 | * @param entry Entry returned from `pushStackEntry` to replace. 354 | * @param props Object containing the StatusBar props to use in the replacement stack entry. 355 | */ 356 | static replaceStackEntry(entry: any, props: any) { 357 | const newEntry = createStackEntry(props); 358 | const index = StatusBar._propsStack.indexOf(entry); 359 | if (index !== -1) { 360 | StatusBar._propsStack[index] = newEntry; 361 | } 362 | StatusBar._updatePropsStack(); 363 | return newEntry; 364 | } 365 | 366 | static defaultProps = { 367 | animated: false, 368 | showHideTransition: 'fade', 369 | }; 370 | 371 | _stackEntry = null; 372 | 373 | componentDidMount() { 374 | // Every time a StatusBar component is mounted, we push it's prop to a stack 375 | // and always update the native status bar with the props from the top of then 376 | // stack. This allows having multiple StatusBar components and the one that is 377 | // added last or is deeper in the view hierachy will have priority. 378 | this._stackEntry = StatusBar.pushStackEntry(this.props); 379 | } 380 | 381 | componentWillUnmount() { 382 | // When a StatusBar is unmounted, remove itself from the stack and update 383 | // the native bar with the next props. 384 | StatusBar.popStackEntry(this._stackEntry); 385 | } 386 | 387 | componentDidUpdate() { 388 | this._stackEntry = StatusBar.replaceStackEntry( 389 | this._stackEntry, 390 | this.props, 391 | ); 392 | } 393 | 394 | /** 395 | * Updates the native status bar with the props from the stack. 396 | */ 397 | static _updatePropsStack = () => { 398 | // Send the update to the native module only once at the end of the frame. 399 | clearImmediate(StatusBar._updateImmediate); 400 | StatusBar._updateImmediate = setImmediate(() => { 401 | const oldProps = StatusBar._currentValues; 402 | const mergedProps = mergePropsStack( 403 | StatusBar._propsStack, 404 | StatusBar._defaultProps, 405 | ); 406 | 407 | // Update the props that have changed using the merged values from the props stack. 408 | if (Platform.OS === 'ios') { 409 | if ( 410 | !oldProps || 411 | oldProps.barStyle.value !== mergedProps.barStyle.value 412 | ) { 413 | StatusBarManager.setStyle( 414 | mergedProps.barStyle.value, 415 | mergedProps.barStyle.animated || false, 416 | ); 417 | } 418 | if (!oldProps || oldProps.hidden.value !== mergedProps.hidden.value) { 419 | StatusBarManager.setHidden( 420 | mergedProps.hidden.value, 421 | mergedProps.hidden.animated 422 | ? mergedProps.hidden.transition 423 | : 'none', 424 | ); 425 | } 426 | 427 | if ( 428 | !oldProps || 429 | oldProps.networkActivityIndicatorVisible !== 430 | mergedProps.networkActivityIndicatorVisible 431 | ) { 432 | StatusBarManager.setNetworkActivityIndicatorVisible( 433 | mergedProps.networkActivityIndicatorVisible, 434 | ); 435 | } 436 | } else if (Platform.OS === 'android') { 437 | if ( 438 | !oldProps || 439 | oldProps.barStyle.value !== mergedProps.barStyle.value 440 | ) { 441 | StatusBarManager.setStyle(mergedProps.barStyle.value); 442 | } 443 | if ( 444 | !oldProps || 445 | oldProps.backgroundColor.value !== mergedProps.backgroundColor.value 446 | ) { 447 | StatusBarManager.setColor( 448 | processColor(mergedProps.backgroundColor.value), 449 | mergedProps.backgroundColor.animated, 450 | ); 451 | } 452 | if (!oldProps || oldProps.hidden.value !== mergedProps.hidden.value) { 453 | StatusBarManager.setHidden(mergedProps.hidden.value); 454 | } 455 | if (!oldProps || oldProps.translucent !== mergedProps.translucent) { 456 | StatusBarManager.setTranslucent(mergedProps.translucent); 457 | } 458 | } 459 | // Update the current prop values. 460 | StatusBar._currentValues = mergedProps; 461 | }); 462 | }; 463 | 464 | render(): React.Node { 465 | return null; 466 | } 467 | } 468 | 469 | module.exports = StatusBar; 470 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@react-native-community/status-bar", 3 | "version": "1.0.3", 4 | "description": "Native module for mutating status bar state", 5 | "main": "./js/StatusBar.js", 6 | "scripts": { 7 | "test:flow": "flow", 8 | "test:typescript": "tsc ./index.d.ts", 9 | "lint": "npx eslint ./js/**/*.js example/**/*.js e2e/**/*.js", 10 | "test:js": "echo 'No test specified'; exit 0;", 11 | "test:e2e:ios": "detox test -c ios.sim.release", 12 | "test:e2e:android": "detox test -c android.emu.release", 13 | "build:e2e:ios": "detox build -c ios.sim.release", 14 | "build:e2e:android": "detox build -c android.emu.release", 15 | "bundle:e2e:android": "mkdir -p .tmp && react-native bundle --max-workers 4 --platform android --dev false --entry-file example/index.js --bundle-output .tmp/android-bundle.js", 16 | "bundle:e2e:ios": "mkdir -p .tmp && react-native bundle --max-workers 4 --platform ios --dev false --entry-file example/index.js --bundle-output .tmp/ios-bundle.js", 17 | "start": "react-native start", 18 | "release": "semantic-release" 19 | }, 20 | "keywords": [ 21 | "react-native", 22 | "status-bar", 23 | "react-native-community" 24 | ], 25 | "author": "Dmitriy Kovalenko ", 26 | "homepage": "https://github.com/react-native-community/react-native-statusbar", 27 | "license": "MIT", 28 | "peerDependencies": { 29 | "react": "^16.0", 30 | "react-native": ">=0.41.2" 31 | }, 32 | "devDependencies": { 33 | "@react-native-community/eslint-config": "^0.0.2", 34 | "babel-core": "^7.0.0-bridge.0", 35 | "babel-jest": "24.1.0", 36 | "babel-plugin-module-resolver": "^3.1.3", 37 | "detox": "^12.1.1", 38 | "eslint": "^5.15.3", 39 | "flow-bin": "^0.86.0", 40 | "jest": "^24.5.0", 41 | "metro-react-native-babel-preset": "0.51.1", 42 | "react": "16.6.3", 43 | "react-native": "0.58.4", 44 | "react-test-renderer": "16.6.3", 45 | "semantic-release": "^15.13.3", 46 | "typescript": "^3.3.4000" 47 | }, 48 | "prettier": { 49 | "requirePragma": true, 50 | "singleQuote": true, 51 | "trailingComma": "all", 52 | "bracketSpacing": false, 53 | "jsxBracketSameLine": true, 54 | "parser": "flow" 55 | }, 56 | "detox": { 57 | "test-runner": "jest", 58 | "configurations": { 59 | "ios.sim.debug": { 60 | "binaryPath": "example/ios/build/Build/Products/Debug-iphonesimulator/StatusBarExample.app", 61 | "build": "export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project example/ios/StatusBarExample.xcodeproj -destination 'platform=iOS Simulator,name=iPhone X' -scheme StatusBarExample -parallelizeTargets -configuration Debug -derivedDataPath example/ios/build -UseModernBuildSystem=YES| xcpretty -k", 62 | "type": "ios.simulator", 63 | "name": "iPhone X" 64 | }, 65 | "ios.sim.release": { 66 | "binaryPath": "example/ios/build/Build/Products/Release-iphonesimulator/StatusBarExample.app", 67 | "build": "export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project example/ios/StatusBarExample.xcodeproj -destination 'platform=iOS Simulator,name=iPhone X' -scheme StatusBarExample -parallelizeTargets -configuration Release -derivedDataPath example/ios/build -UseModernBuildSystem=YES | xcpretty -k", 68 | "type": "ios.simulator", 69 | "name": "iPhone X" 70 | }, 71 | "android.emu.debug": { 72 | "binaryPath": "example/android/app/build/outputs/apk/debug/app-debug.apk", 73 | "build": "export RCT_NO_LAUNCH_PACKAGER=true && pushd example/android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && popd", 74 | "type": "android.emulator", 75 | "name": "TestingAVD" 76 | }, 77 | "android.emu.release": { 78 | "binaryPath": "example/android/app/build/outputs/apk/release/app-release.apk", 79 | "build": "export RCT_NO_LAUNCH_PACKAGER=true && pushd example/android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && popd", 80 | "type": "android.emulator", 81 | "name": "TestingAVD" 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /react-native-statusbar.podspec: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) 4 | 5 | Pod::Spec.new do |s| 6 | s.name = "react-native-statusbar" 7 | s.version = package['version'] 8 | s.summary = package['description'] 9 | s.license = package['license'] 10 | 11 | s.authors = package['author'] 12 | s.homepage = package['homepage'] 13 | s.platform = :ios, "9.0" 14 | 15 | s.source = { :git => "https://github.com/react-native-community/react-native-statusbar.git", :tag => "#{s.version}" } 16 | s.source_files = "ios/**/*.{h,m}" 17 | 18 | s.dependency 'React' 19 | end 20 | --------------------------------------------------------------------------------