master 40c599656b37 cached
150 files
265.6 KB
72.6k tokens
153 symbols
1 requests
Download .txt
Showing preview only (305K chars total). Download the full file or copy to clipboard to get everything.
Repository: EddyVerbruggen/nativescript-local-notifications
Branch: master
Commit: 40c599656b37
Files: 150
Total size: 265.6 KB

Directory structure:
gitextract_jbw4v8s9/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── demo/
│   ├── app/
│   │   ├── App_Resources/
│   │   │   ├── Android/
│   │   │   │   ├── app.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── res/
│   │   │   │               ├── drawable-nodpi/
│   │   │   │               │   └── splash_screen.xml
│   │   │   │               ├── values/
│   │   │   │               │   ├── colors.xml
│   │   │   │               │   └── styles.xml
│   │   │   │               └── values-v21/
│   │   │   │                   ├── colors.xml
│   │   │   │                   └── styles.xml
│   │   │   └── iOS/
│   │   │       ├── Assets.xcassets/
│   │   │       │   ├── AppIcon.appiconset/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── Contents.json
│   │   │       │   ├── LaunchImage.launchimage/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │   │       │   │   └── Contents.json
│   │   │       │   └── LaunchScreen.Center.imageset/
│   │   │       │       └── Contents.json
│   │   │       ├── Info.plist
│   │   │       ├── LaunchScreen.storyboard
│   │   │       └── build.xcconfig
│   │   ├── README.md
│   │   ├── app-root.xml
│   │   ├── app.css
│   │   ├── app.ts
│   │   ├── bundle-config.ts
│   │   ├── main-page.ts
│   │   ├── main-page.xml
│   │   ├── main-view-model.ts
│   │   └── package.json
│   ├── package.json
│   ├── references.d.ts
│   ├── tsconfig.json
│   └── tsconfig.tns.json
├── demo-ng/
│   ├── App_Resources/
│   │   ├── Android/
│   │   │   ├── app.gradle
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── res/
│   │   │               ├── drawable-nodpi/
│   │   │               │   └── splash_screen.xml
│   │   │               ├── values/
│   │   │               │   ├── colors.xml
│   │   │               │   └── styles.xml
│   │   │               └── values-v21/
│   │   │                   ├── colors.xml
│   │   │                   └── styles.xml
│   │   └── iOS/
│   │       ├── Assets.xcassets/
│   │       │   ├── AppIcon.appiconset/
│   │       │   │   └── Contents.json
│   │       │   ├── Contents.json
│   │       │   ├── LaunchImage.launchimage/
│   │       │   │   └── Contents.json
│   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │       │   │   └── Contents.json
│   │       │   └── LaunchScreen.Center.imageset/
│   │       │       └── Contents.json
│   │       ├── Info.plist
│   │       ├── LaunchScreen.storyboard
│   │       └── build.xcconfig
│   ├── README.md
│   ├── angular.json
│   ├── nsconfig.json
│   ├── package.json
│   ├── references.d.ts
│   ├── src/
│   │   ├── app/
│   │   │   ├── app-routing.module.ts
│   │   │   ├── app.component.html
│   │   │   ├── app.component.ts
│   │   │   ├── app.module.ts
│   │   │   └── item/
│   │   │       ├── items.component.html
│   │   │       └── items.component.ts
│   │   ├── app.css
│   │   ├── main.ts
│   │   └── package.json
│   ├── tsconfig.json
│   └── tsconfig.tns.json
├── demo-vue/
│   ├── .gitignore
│   ├── README.md
│   ├── app/
│   │   ├── App_Resources/
│   │   │   ├── Android/
│   │   │   │   ├── app.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── res/
│   │   │   │               ├── drawable-nodpi/
│   │   │   │               │   └── splash_screen.xml
│   │   │   │               ├── values/
│   │   │   │               │   ├── colors.xml
│   │   │   │               │   ├── strings.xml
│   │   │   │               │   └── styles.xml
│   │   │   │               └── values-v21/
│   │   │   │                   ├── colors.xml
│   │   │   │                   ├── strings.xml
│   │   │   │                   └── styles.xml
│   │   │   └── iOS/
│   │   │       ├── Assets.xcassets/
│   │   │       │   ├── AppIcon.appiconset/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── Contents.json
│   │   │       │   ├── LaunchImage.launchimage/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │   │       │   │   └── Contents.json
│   │   │       │   └── LaunchScreen.Center.imageset/
│   │   │       │       └── Contents.json
│   │   │       ├── Info.plist
│   │   │       ├── LaunchScreen.storyboard
│   │   │       └── build.xcconfig
│   │   ├── app.scss
│   │   ├── components/
│   │   │   └── App.vue
│   │   ├── fonts/
│   │   │   └── .gitkeep
│   │   ├── main.js
│   │   └── package.json
│   └── package.json
├── native-src/
│   ├── android/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── android.iml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── app.iml
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── telerik/
│   │   │           │           └── localnotifications/
│   │   │           │               ├── Action.java
│   │   │           │               ├── ActionGroup.java
│   │   │           │               ├── Builder.java
│   │   │           │               ├── DownloadFileFromUrl.java
│   │   │           │               ├── LifecycleCallbacks.java
│   │   │           │               ├── LocalNotificationsPlugin.java
│   │   │           │               ├── LocalNotificationsPluginListener.java
│   │   │           │               ├── NotificationActionReceiver.java
│   │   │           │               ├── NotificationAlarmReceiver.java
│   │   │           │               ├── NotificationClearedReceiver.java
│   │   │           │               ├── NotificationRestoreReceiver.java
│   │   │           │               └── Store.java
│   │   │           └── res/
│   │   │               └── values/
│   │   │                   └── strings.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── locnotplugin.iml
│   │   └── settings.gradle
│   └── ios/
│       ├── .gitattributes
│       ├── .gitignore
│       ├── LocalNotificationsPlugin/
│       │   ├── Info.plist
│       │   ├── LocalNotificationsPlugin.h
│       │   ├── Notification.h
│       │   ├── Notification.m
│       │   ├── NotificationManager.h
│       │   └── NotificationManager.m
│       ├── LocalNotificationsPlugin.xcodeproj/
│       │   ├── project.pbxproj
│       │   └── project.xcworkspace/
│       │       ├── contents.xcworkspacedata
│       │       └── xcshareddata/
│       │           └── PushPlugin.xccheckout
│       └── README.md
├── publish/
│   ├── pack.sh
│   ├── package.json
│   └── publish.sh
├── src/
│   ├── .npmignore
│   ├── index.d.ts
│   ├── local-notifications-common.ts
│   ├── local-notifications.android.ts
│   ├── local-notifications.ios.ts
│   ├── package.json
│   ├── platforms/
│   │   ├── android/
│   │   │   └── app-release.aar
│   │   └── ios/
│   │       ├── LocalNotificationsPlugin.framework/
│   │       │   ├── Headers/
│   │       │   │   ├── LocalNotificationsPlugin.h
│   │       │   │   ├── Notification.h
│   │       │   │   └── NotificationManager.h
│   │       │   ├── Info.plist
│   │       │   ├── LocalNotificationsPlugin
│   │       │   └── Modules/
│   │       │       └── module.modulemap
│   │       └── typings/
│   │           └── objc!LocalNotificationsPlugin.d.ts
│   ├── references.d.ts
│   └── tsconfig.json
└── tslint.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.idea/
.vscode/
node_modules/
*.js
!demo-vue/app/main.js
src/*.d.ts
!src/index.d.ts
!src/references.d.ts
demo/platforms
demo-ng/platforms
publish/package/
native-src/android/.project
native-src/android/local.properties
native-src/android/.settings/

================================================
FILE: .travis.yml
================================================
matrix:
  include:
    - stage: "Lint"
      language: node_js
      os: linux
      node_js: "10"
      script: cd src && npm run ci.tslint
    - stage: "WebPack, Build"
      os: osx
      env:
        - WebPack="iOS"
      osx_image: xcode11.2
      language: node_js
      node_js: "10"
      jdk: oraclejdk8
      before_script: pod repo update
      script: cd demo && npm run build.plugin && npm i && tns build ios --bundle --env.uglify
    - language: android
      os: linux
      env:
        - WebPack="Android"
      jdk: oraclejdk8
      before_install: nvm install 8
      script: cd demo && npm run build.plugin && npm i && tns build android --bundle --env.uglify --env.snapshot
    - language: android
      env:
        - BuildAndroid="28"
      os: linux
      dist: trusty
      jdk: oraclejdk8
      before_install: nvm install 10
      script:
        - cd src && npm run build && cd ../demo && tns build android
    - os: osx
      osx_image: xcode11.2
      language: node_js
      node_js: "10"
      jdk: oraclejdk8
      before_script: pod repo update
      script:
        - cd src && npm run build && cd ../demo && tns build ios

android:
  components:
    - tools
    - platform-tools
    - build-tools-28.0.3
    - android-28
    - extra-android-m2repository
    - sys-img-armeabi-v7a-android-21

before_install:
  - sudo pip install --upgrade pip
  - sudo pip install six

install:
  - echo no | npm install -g nativescript@6
  - tns usage-reporting disable
  - tns error-reporting disable

================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: README.md
================================================
# NativeScript Local Notifications Plugin

[![NPM version][npm-image]][npm-url]
[![Downloads][downloads-image]][npm-url]
[![Twitter Follow][twitter-image]][twitter-url]

[build-status]:https://travis-ci.org/EddyVerbruggen/nativescript-local-notifications.svg?branch=master
[build-url]:https://travis-ci.org/EddyVerbruggen/nativescript-local-notifications
[npm-image]:http://img.shields.io/npm/v/nativescript-local-notifications.svg
[npm-url]:https://npmjs.org/package/nativescript-local-notifications
[downloads-image]:http://img.shields.io/npm/dm/nativescript-local-notifications.svg
[twitter-image]:https://img.shields.io/twitter/follow/eddyverbruggen.svg?style=social&label=Follow%20me
[twitter-url]:https://twitter.com/eddyverbruggen

The Local Notifications plugin allows your app to show notifications when the app is not running.
Just like remote push notifications, but a few orders of magnitude easier to set up.

> ⚠️ Plugin version 4.0.0 should be used with NativeScript 6+. If you have an older `tns --version`, please use an older plugin version.

> ⚠️ Looking for NativeScript 7 compatibilty? Go to [the NativeScript/plugins repo](https://github.com/NativeScript/plugins/tree/master/packages/local-notifications).

## Installation
From the command prompt go to your app's root folder and execute:
```bash
tns plugin add nativescript-local-notifications
```

## Setup (since plugin version 3.0.0)
Add this so for iOS 10+ we can do some wiring (set the iOS `UNUserNotificationCenter.delegate`, to be precise).
Not needed if your app loads the plugin on startup anyway.

You'll know you need this if on iOS 10+ notifications are not received by your app or `addOnMessageReceivedCallback` is not invoked... better safe than sorry, though!

```js
require ("nativescript-local-notifications");
```

Now you can import the plugin as an object into your `.ts` file as follows:

```typescript
// either
import { LocalNotifications } from "nativescript-local-notifications";
// or (if that doesn't work for you)
import * as LocalNotifications from "nativescript-local-notifications";

// then use it as:
LocalNotifications.hasPermission()
```

## Demo apps

### NativeScript-Core (XML)
This demo is the one with the most options, so it's a cool one to check out:

```bash
git clone https://github.com/EddyVerbruggen/nativescript-local-notifications
cd nativescript-local-notifications/src
npm run demo.ios # or demo.android
```

### NativeScript-Angular
This plugin is part of the [plugin showcase app](https://github.com/EddyVerbruggen/nativescript-pluginshowcase/tree/master/app/feedback) I built using Angular.

There's also a simple Angular [demo in this repo](https://github.com/EddyVerbruggen/nativescript-local-notifications/tree/master/demo-ng):

```bash
git clone https://github.com/EddyVerbruggen/nativescript-local-notifications
cd nativescript-local-notifications/src
npm run demo-ng.ios # or demo-ng.android
```

### NativeScript-Vue
We also have a [Vue demo](https://github.com/EddyVerbruggen/nativescript-local-notifications/tree/master/demo-vue):

```bash
git clone https://github.com/EddyVerbruggen/nativescript-local-notifications
cd nativescript-local-notifications/src
npm run demo-vue.ios # or demo-vue.android
```

## Plugin API

### schedule
On iOS you need to ask permission to schedule a notification.
You can have the `schedule` funtion do that for you automatically (the notification will be scheduled in case the user granted permission),
or you can manually invoke `requestPermission` if that's your thing.

You can pass several options to this function, everything is optional:

|option|description|
|------|-----------|
|`id`     |A number so you can easily distinguish your notifications. Will be generated if not set.|
|`title`  |The title which is shown in the statusbar. Default not set.|
|`subtitle`  |Shown below the title on iOS, and next to the App name on Android. Default not set. All android and iOS >= 10 only.|
|`body`   |The text below the title. If not provided, the subtitle or title (in this order or priority) will be swapped for it on iOS, as iOS won't display notifications without a body. Default not set on Android, `' '` on iOS, as otherwise the notification won't show up at all.|
|`color` |Custom color for the notification icon and title that will be applied when the notification center is expanded. (**Android Only**)|
|`bigTextStyle`  |Allow more than 1 line of the body text to show in the notification centre. Mutually exclusive with `image`. Default `false`. (**Android Only**)|
|`groupedMessages`| An array of atmost 5 messages that would be displayed using android's notification [inboxStyle](https://developer.android.com/reference/android/app/Notification.InboxStyle.html). Note: The array would be trimed from the top if the messages exceed five. Default not set |
|`groupSummary`| An [inboxStyle](https://developer.android.com/reference/android/app/Notification.InboxStyle.html) notification summary. Default empty|
|`ticker` |On Android you can show a different text in the statusbar, instead of the `body`. Default not set, so `body` is used.|
|`at`     |A JavaScript Date object indicating when the notification should be shown. Default not set (the notification will be shown immediately).|
|`badge`  |On iOS (and some Android devices) you see a number on top of the app icon. On most Android devices you'll see this number in the notification center. Default not set (0).|
|`sound`  |Notification sound. For custom notification sound (iOS only), copy the file to `App_Resources/iOS`. Set this to "default" (or do not set at all) in order to use default OS sound. Set this to `null` to suppress sound.|
|`interval` |Set to one of `second`, `minute`, `hour`, `day`, `week`, `month`, `year` if you want a recurring notification.|
|`icon`|On Android you can set a custom icon in the system tray. Pass in `res://filename` (without the extension) which lives in `App_Resouces/Android/drawable` folders. If not passed, we'll look there for a file named `ic_stat_notify.png`. By default the app icon is used. Android < Lollipop (21) only (see `silhouetteIcon` below).|
|`silhouetteIcon`|Same as `icon`, but for Android >= Lollipop (21). Should be an alpha-only image. Defaults to `res://ic_stat_notify_silhouette`, or the app icon if not present.|
|`image` |*URL* (`http..`) of the image to use as an expandable notification image. On Android this is mutually exclusive with `bigTextStyle`.|
|`thumbnail` |Custom thumbnail/icon to show in the notification center (to the right) on Android, this can be either: `true` (if you want to use the `image` as the thumbnail), a resource URL (that lives in the `App_Resouces/Android/drawable` folders, e.g.: `res://filename`), or a http URL from anywhere on the web. (**Android Only**). Default not set.|
|`ongoing` |Default is (`false`). Set whether this is an `ongoing` notification. Ongoing notifications cannot be dismissed by the user, so your application must take care of canceling them. (**Android Only**) |
|`channel` |Default is (`Channel`). Set the channel name for Android API >= 26, which is shown when the user longpresses a  notification. (**Android Only**) |
|`forceShowWhenInForeground` |Default is `false`. Set to `true` to always show the notification. Note that on iOS < 10 this is ignored (the notification is not shown), and on newer Androids it's currently ignored as well (the notification always shows, per platform default). |
|`priority` |Default is `0`. Will override `forceShowWhenInForeground` if set. This can be set to `2` for Android "heads-up" notifications. See [#114](https://github.com/EddyVerbruggen/nativescript-local-notifications/issues/114) for details. |
|`actions` |Add an array of `NotificationAction` objects (see below) to add buttons or text input to a notification. |
|`notificationLed` |Enable the notification LED light on Android (if supported by the device), this can be either: `true` (if you want to use the default color), or a custom color for the notification LED light (if supported by the device). (**Android Only**). Default not set.|

#### `NotificationAction`

|option|description|
|------|-----------|
|`id`     |An id so you can easily distinguish your actions.|
|`type`   |Either `button` or `input`.|
|`title`  |The label for `type` = `button`.|
|`launch` |Launch the app when the action completes.|
|`submitLabel` |The submit button label for `type` = `input`.|
|`placeholder` |The placeholder text for `type` = `input`.|

```js
  LocalNotifications.schedule([{
    id: 1, // generated id if not set
    title: 'The title',
    body: 'Recurs every minute until cancelled',
    ticker: 'The ticker',
    color: new Color("red"),
    badge: 1,
    groupedMessages:["The first", "Second", "Keep going", "one more..", "OK Stop"], //android only
    groupSummary:"Summary of the grouped messages above", //android only
    ongoing: true, // makes the notification ongoing (Android only)
    icon: 'res://heart',
    image: "https://cdn-images-1.medium.com/max/1200/1*c3cQvYJrVezv_Az0CoDcbA.jpeg",
    thumbnail: true,
    interval: 'minute',
    channel: 'My Channel', // default: 'Channel'
    sound: "customsound-ios.wav", // falls back to the default sound on Android
    at: new Date(new Date().getTime() + (10 * 1000)) // 10 seconds from now
  }]).then(
      function(scheduledIds) {
        console.log("Notification id(s) scheduled: " + JSON.stringify(scheduledIds));
      },
      function(error) {
        console.log("scheduling error: " + error);
      }
  )
```

### Notification icons (Android)

These options default to `res://ic_stat_notify` and `res://ic_stat_notify_silhouette` respectively, or the app icon if not present.

`silhouetteIcon` should be an alpha-only image and will be used in Android >= Lollipop (21).

[These are the official icon size guidelines](https://developer.android.com/guide/practices/ui_guidelines/icon_design_status_bar.html),
and [here's a great guide on how to easily create these icons on Android](https://developer.android.com/studio/write/image-asset-studio).

| Density qualifier | px | dpi
| ------- | ------- | ---
|    ldpi | 18 × 18 | 120
|    mdpi | 24 × 24 | 160
|    hdpi | 36 × 36 | 240
|   xhdpi | 48 × 48 | 320
|  xxhdpi | 72 × 72 | 480
| xxxhdpi | 96 × 96 | 640 approx.

__Source:__ [Density Qualifier Docs](https://developer.android.com/guide/topics/resources/providing-resources.html#DensityQualifier)


### addOnMessageReceivedCallback
Tapping a notification in the notification center will launch your app.
But what if you scheduled two notifications and you want to know which one the user tapped?

Use this function to have a callback invoked when a notification was used to launch your app.
Note that on iOS it will even be triggered when your app is in the foreground and a notification is received.

```js
  LocalNotifications.addOnMessageReceivedCallback(
      function (notification) {
        console.log("ID: " + notification.id);
        console.log("Title: " + notification.title);
        console.log("Body: " + notification.body);
      }
  ).then(
      function() {
        console.log("Listener added");
      }
  )
```

### getScheduledIds
If you want to know the ID's of all notifications which have been scheduled, do this:

Note that all functions have an error handler as well (see `schedule`), but to keep things readable we won't repeat ourselves.

```js
  LocalNotifications.getScheduledIds().then(
      function(ids) {
        console.log("ID's: " + ids);
      }
  )
```

### cancel
If you want to cancel a previously scheduled notification (and you know its ID), you can cancel it:

```js
  LocalNotifications.cancel(5 /* the ID */).then(
      function(foundAndCanceled) {
          if (foundAndCanceled) {
            console.log("OK, it's gone!");
          } else {
            console.log("No ID 5 was scheduled");
          }
      }
  )
```

### cancelAll
If you just want to cancel all previously scheduled notifications, do this:

```js
  LocalNotifications.cancelAll();
```

### requestPermission
On Android you don't need permission, but on iOS you do. Android will simply return true.

If the `requestPermission` or `schedule` function previously ran the user has already been prompted to grant permission.
If the user granted permission this function returns `true`, but if he denied permission this function will return `false`,
since an iOS can only request permission once. In which case the user needs to go to the iOS settings app and manually
enable permissions for your app.

```js
  LocalNotifications.requestPermission().then(
      function(granted) {
        console.log("Permission granted? " + granted);
      }
  )
```

### hasPermission
On Android you don't need permission, but on iOS you do. Android will simply return true.

If the `requestPermission` or `schedule` functions previously ran you may want to check whether or not the user granted permission:

```js
  LocalNotifications.hasPermission().then(
      function(granted) {
        console.log("Permission granted? " + granted);
      }
  )
```


================================================
FILE: demo/app/App_Resources/Android/app.gradle
================================================
// Add your native dependencies here:

// Uncomment to add recyclerview-v7 dependency
//dependencies {
//	compile 'com.android.support:recyclerview-v7:+'
//}

android {  
  defaultConfig {  
    generatedDensities = []
    applicationId = "org.nativescript.plugindemo.localnotifications"  
  }  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
} 


================================================
FILE: demo/app/App_Resources/Android/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="__PACKAGE__"
	android:versionCode="1"
	android:versionName="1.0">

	<supports-screens
		android:smallScreens="true"
		android:normalScreens="true"
		android:largeScreens="true"
		android:xlargeScreens="true"/>

	<uses-sdk
		android:minSdkVersion="17"
		android:targetSdkVersion="__APILEVEL__"/>

	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.INTERNET"/>

	<application
		android:name="com.tns.NativeScriptApplication"
		android:allowBackup="true"
		android:icon="@drawable/icon"
		android:label="@string/app_name"
		android:theme="@style/AppTheme">

		<activity
			android:name="com.tns.NativeScriptActivity"
			android:label="@string/title_activity_kimera"
			android:configChanges="keyboardHidden|orientation|screenSize"
			android:theme="@style/LaunchScreenTheme">

			<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />

			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<activity android:name="com.tns.ErrorReportActivity"/>
	</application>
</manifest>


================================================
FILE: demo/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
================================================
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="fill">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background" />
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/logo" />
    </item>
</layer-list>

================================================
FILE: demo/app/App_Resources/Android/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ns_primary">#F5F5F5</color>
	<color name="ns_primaryDark">#757575</color>
	<color name="ns_accent">#33B5E5</color>
    <color name="ns_blue">#272734</color>
</resources>

================================================
FILE: demo/app/App_Resources/Android/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- theme to use FOR launch screen-->
    <style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>

        <item name="android:windowBackground">@drawable/splash_screen</item>
        
        <item name="android:windowActionBarOverlay">true</item>  
        <item name="android:windowTranslucentStatus">true</item>

    </style>

    <style name="LaunchScreenTheme" parent="LaunchScreenThemeBase">
    </style>

    <!-- theme to use AFTER launch screen is loaded-->
    <style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>

    </style>

    <style name="AppTheme" parent="AppThemeBase">
    </style>

    <!-- theme for action-bar -->
    <style name="NativeScriptToolbarStyleBase" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">@color/ns_primary</item>
        <item name="theme">@style/ThemeOverlay.AppCompat.ActionBar</item>
        <item name="popupTheme">@style/ThemeOverlay.AppCompat</item>

    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
    </style>
</resources> 


================================================
FILE: demo/app/App_Resources/Android/src/main/res/values-v21/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<color name="ns_accent">#3d5afe</color>
</resources>

================================================
FILE: demo/app/App_Resources/Android/src/main/res/values-v21/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Application theme -->
    <style name="AppTheme" parent="AppThemeBase">
        <item name="android:datePickerStyle">@style/SpinnerDatePicker</item>
        <item name="android:timePickerStyle">@style/SpinnerTimePicker</item>
    </style>

    <!-- Default style for DatePicker - in spinner mode -->
    <style name="SpinnerDatePicker" parent="android:Widget.Material.Light.DatePicker">
        <item name="android:datePickerMode">spinner</item>
    </style>

    <!-- Default style for TimePicker - in spinner mode -->
    <style name="SpinnerTimePicker" parent="android:Widget.Material.Light.TimePicker">
        <item name="android:timePickerMode">spinner</item>
    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
        <item name="android:elevation">4dp</item>
    </style>    
</resources>

================================================
FILE: demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40.png",
      "scale" : "1x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "icon-83.5@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "icon-1024.png",
      "scale" : "1x"
    } 
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo/app/App_Resources/iOS/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
================================================
{
  "images" : [
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2436h",
      "filename" : "Default-1125h.png",
      "minimum-system-version" : "11.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "filename" : "Default-Landscape-X.png",
      "minimum-system-version" : "11.0",
      "subtype" : "2436h",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-736h@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-Landscape@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "landscape",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "667h",
      "filename" : "Default-667h@2x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "retina4",
      "filename" : "Default-568h@2x.png",
      "minimum-system-version" : "7.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default-568h@2x.png",
      "extent" : "full-screen",
      "subtype" : "retina4",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo/app/App_Resources/iOS/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleDisplayName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundleExecutable</key>
	<string>${EXECUTABLE_NAME}</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiresFullScreen</key>
	<true/>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: demo/app/App_Resources/iOS/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <device id="retina5_9" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.AspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="wtH-rr-YfP">
                                <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                            </imageView>
                            <imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.Center" translatesAutoresizingMaskIntoConstraints="NO" id="s1z-aa-wYv">
                                <rect key="frame" x="0.0" y="150" width="375" height="512"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="trailing" secondItem="s1z-aa-wYv" secondAttribute="trailing" id="4Rf-kf-vql"/>
                            <constraint firstAttribute="bottom" secondItem="wtH-rr-YfP" secondAttribute="bottom" id="5CS-At-4ka"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="Awn-b8-xf1"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="BpJ-vb-eKA"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="trailing" secondItem="wtH-rr-YfP" secondAttribute="trailing" id="QIM-7J-OZz"/>
                            <constraint firstAttribute="trailing" secondItem="wtH-rr-YfP" secondAttribute="trailing" id="RXg-rW-UK8"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="Rcp-LG-48z"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="cch-8E-tYu"/>
                        </constraints>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="509.60000000000002" y="237.93103448275863"/>
        </scene>
    </scenes>
    <resources>
        <image name="LaunchScreen.AspectFill" width="768" height="1024"/>
        <image name="LaunchScreen.Center" width="384" height="512"/>
    </resources>
</document>


================================================
FILE: demo/app/App_Resources/iOS/build.xcconfig
================================================
// You can add custom settings here
// for example you can uncomment the following line to force distribution code signing
// CODE_SIGN_IDENTITY = iPhone Distribution 
// To build for device with XCode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;


================================================
FILE: demo/app/README.md
================================================
# NativeScript TypeScript Template

This template creates a NativeScript app with the NativeScript hello world example,
however, in this template the example is built with TypeScript.

You can create a new app that uses this template with either the `--template` option.

```
tns create my-app-name --template tns-template-hello-world-ts
```

Or the `--tsc` shorthand.

```
tns create my-app-name --tsc
```

> Note: Both commands will create a new NativeScript app that uses the latest version of this template published to [npm] (https://www.npmjs.com/package/tns-template-hello-world-ts).

If you want to create a new app that uses the source of the template from the `master` branch, you can execute the following:

```
tns create my-app-name --template https://github.com/NativeScript/template-hello-world-ts.git#master
```


================================================
FILE: demo/app/app-root.xml
================================================
<Frame defaultPage="main-page">
</Frame>


================================================
FILE: demo/app/app.css
================================================
@import '~nativescript-theme-core/css/core.light.css';

page {
  background-color: #F4F4F4;
}

.tab-content {
  color: #808080;
  padding: 18;
}

.title {
  font-size: 18;
  margin: 0 0 8 0;
  color: #3c3c3c;
  /*horizontal-align: center;*/
}

label {
  font-size: 16;
}

Label.notification,
Label.hint {
  font-size: 14;
  margin: 8;
}

button {
  background-color: #E0A458;
  padding: 8;
  margin: 8;
  font-size: 14;
  border-radius: 4;
}

.button {
  color: #FFFFFF;
}

.button-positive {
  background-color: #90A959;
}

.button-danger {
  background-color: #A63D40;
}

.button-neutral {
  background-color: #6494AA;
}


================================================
FILE: demo/app/app.ts
================================================
import "./bundle-config";
import * as application from "tns-core-modules/application";

// Add this so for iOS 10+ we can do some wiring (set the iOS UNUserNotificationCenter delegate, to be precise).
// Not needed if your app loads the plugin on startup anyway.
// You'll know you need this if on iOS 10+ notifications are not received by your app.
require ("nativescript-local-notifications");

application.run({moduleName: "app-root"});


================================================
FILE: demo/app/bundle-config.ts
================================================
if ((<any>global).TNS_WEBPACK) {
  // Register tns-core-modules UI framework modules
  require("bundle-entry-points");

  // Register application modules
  // This will register each `root`, `page`, `fragment` postfixed xml, css, js, ts, scss file in the app/ folder
  const context = (<any>require).context("~/", true, /(root|page|fragment)\.(xml|css|js|ts|scss|less|sass)$/);
  global.registerWebpackModules(context);
}


================================================
FILE: demo/app/main-page.ts
================================================
import { EventData } from "tns-core-modules/data/observable";
import { Page } from "tns-core-modules/ui/page";
import { HelloWorldModel } from "./main-view-model";

export function navigatingTo(args: EventData) {
  const page = <Page>args.object;
  page.bindingContext = new HelloWorldModel();
}


================================================
FILE: demo/app/main-page.xml
================================================
<Page xmlns="http://www.nativescript.org/tns.xsd" navigatingTo="navigatingTo">
  <TabView>
    <TabView.items>

      <TabViewItem title="Demo">
        <TabViewItem.view>
          <ScrollView>
            <GridLayout columns="*,*" rows="auto, auto, auto, auto, auto, auto, auto, auto, auto, auto" horizontalAlignment="center" class="tab-content">

              <Label row="0" colSpan="2" text="You need permission before being able to schedule local notifications. Either defer to when you schedule it, or do it when the app first loads." class="hint" textWrap="true" />
              <Button row="1" col="0" text="has permission?" tap="{{ doCheckHasPermission }}" class="button button-neutral"/>
              <iOS>
                <Button row="1" col="1" text="request perm." tap="{{ doRequestPermission }}" class="button button-neutral"/>
              </iOS>

              <Label row="2" colSpan="2" text="After scheduling a notification, it pops up after 10 sec. In some cases you'll need to close the app first (see 'forceShowWhenInForeground')." class="hint" textWrap="true" />

              <Button row="3" col="0" text="1. with buttons" tap="{{ doScheduleWithButtons }}" class="button"/>
              <Button row="3" col="1"  text="2. with img" tap="{{ doScheduleNoSound }}" class="button" />

              <Button row="4" col="0" text="3. with badge+img" tap="{{ doScheduleAndSetBadgeNumber }}" class="button"/>
              <Button row="4" col="1" text="4. custom icon" tap="{{ doScheduleId4GroupedWithCustomIcon }}" class="button"/>

              <Button row="5" col="0" text="5. with input" tap="{{ doScheduleId5WithInput }}" class="button"/>
              <Button row="5" col="1" text="6. repeat minutely" tap="{{ doScheduleEveryMinute }}" class="button"/>

              <Button row="6" colSpan="2" text="7-10. schedule multiple" tap="{{ doScheduleMultiple }}" class="button"/>

              <Button row="7" col="0" colSpan="2" text="get scheduled id's" tap="{{ doGetScheduledIds }}" class="button button-neutral"/>

              <Button row="8" col="0"  text="cancel all" tap="{{ doCancelAll }}" class="button button-danger"/>
              <Button row="8" col="1"  text="cancel id 6" tap="{{ doCancelId6 }}" class="button button-danger"/>

              <Label row="9" colSpan="2" text="{{ notification }}" class="notification" textWrap="true"/>

            </GridLayout>
          </ScrollView>
        </TabViewItem.view>
      </TabViewItem>

      <TabViewItem title="About">
        <TabViewItem.view>
          <ScrollView>
            <StackLayout class="tab-content">
              <Label text="Local Notifications plugin demo" class="title"/>
              <Label text="The Local Notifications plugin allows your app to show notifications when the app is not running. Just like remote push notifications, but a few orders of magnitude easier to set up." textWrap="true"/>
            </StackLayout>
          </ScrollView>
        </TabViewItem.view>
      </TabViewItem>

    </TabView.items>
  </TabView>
</Page>


================================================
FILE: demo/app/main-view-model.ts
================================================
import { Observable } from "tns-core-modules/data/observable";
import { alert } from "tns-core-modules/ui/dialogs";
import { LocalNotifications } from "nativescript-local-notifications";
import { Color } from "tns-core-modules/color";
import { ScheduleOptions } from "../../src";

export class HelloWorldModel extends Observable {

  public notification: string;

  constructor() {
    super();
    LocalNotifications.addOnMessageReceivedCallback(notificationData => {
      console.log("Notification received: " + JSON.stringify(notificationData));
      this.set("notification", "Notification received: " + JSON.stringify(notificationData));
    });
  }

  public doCheckHasPermission(): void {
    LocalNotifications.hasPermission()
        .then(granted => {
          alert({
            title: "Permission granted?",
            message: granted ? "YES" : "NO",
            okButtonText: "OK"
          });
        });
  };

  public doRequestPermission(): void {
    LocalNotifications.requestPermission()
        .then(granted => {
          alert({
            title: "Permission granted?",
            message: granted ? "YES" : "NO",
            okButtonText: "OK"
          });
        });
  }

  public doScheduleWithButtons(): void {
    const options: Array<ScheduleOptions> = [
      {
        id: 1,
        title: 'THE TITLE',
        subtitle: 'The subtitle',
        body: 'The big body. The big body. The big body. The big body. The big body. The big body. The big body. The big body. The big fat body. The big fat body. The big fat body. The big fat body. The big fat body. The big fat body. The big fat body.',
        bigTextStyle: true, // Allow more than 1 row of the 'body' text
        sound: "customsound",
        color: new Color("green"),
        forceShowWhenInForeground: true,
        channel: "My Awesome Channel", // not that this is revealed in the notification tray when you longpress it on Android
        ticker: "Special ticker text (Android only)",
        at: new Date(new Date().getTime() + (10 * 1000)),
        notificationLed: true,
        actions: [
          {
            id: "yes",
            type: "button",
            title: "Yes (and launch app)",
            launch: true
          },
          {
            id: "no",
            type: "button",
            title: "No",
            launch: false
          }
        ]
      },
      {
        title: 'Generated ID',
        at: new Date(new Date().getTime() + (5 * 1000))
      }
    ];
    LocalNotifications.schedule(options)
        .then((scheduledIds: Array<number>) => {
          alert({
            title: "Notification scheduled",
            message: `ID: ${JSON.stringify(scheduledIds)}`,
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doSchedule error: " + error))
  };

  public doScheduleNoSound(): void {
    LocalNotifications.schedule(
        [{
          id: 2,
          title: "Red Alert",
          subtitle: "Remember this game?",
          icon: 'res://ic_stat_notify',
          color: new Color("red"),
          image: "https://images-na.ssl-images-amazon.com/images/I/61mx-VbrS0L.jpg",
          thumbnail: "https://2.bp.blogspot.com/-H_SZ3nAmNsI/VrJeARpbuSI/AAAAAAAABfc/szsV7_F609k/s200/emoji.jpg",
          forceShowWhenInForeground: false, // default
          body: "RTS FTW!",
          sound: null,
          at: new Date(new Date().getTime() + 10 * 1000)
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: 'ID: 2',
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleSilent error: " + error));
  }

  public doScheduleAndSetBadgeNumber(): void {
    LocalNotifications.schedule(
        [{
          id: 3,
          title: 'Hi',
          subtitle: 'Whatsubtitle',
          image: "https://2.bp.blogspot.com/-H_SZ3nAmNsI/VrJeARpbuSI/AAAAAAAABfc/szsV7_F609k/s200/emoji.jpg",
          thumbnail: true,
          // body: 'You should see a \'3\' somewhere',
          at: new Date(new Date().getTime() + 10 * 1000),
          badge: 3
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: 'ID: 3',
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleAndSetBadgeNumber error: " + error));
  }

  public doScheduleId4GroupedWithCustomIcon(): void {
    LocalNotifications.schedule(
        [{
          id: 4,
          title: 'Custom icon',
          body: 'Check it out!',
          thumbnail: "https://2.bp.blogspot.com/-H_SZ3nAmNsI/VrJeARpbuSI/AAAAAAAABfc/szsV7_F609k/s200/emoji.jpg",
          icon: 'res://ic_stat_smiley',
          at: new Date(new Date().getTime() + 10 * 1000),
          groupedMessages: ["The first", "Second", "Keep going", "one more..", "OK Stop"], // android only
          groupSummary: "Summary of the grouped messages above" // android only
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: 'ID: 4',
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleId4WithCustomIcon error: " + error));
  }

  public doScheduleId5WithInput(): void {
    LocalNotifications.schedule(
        [{
          id: 5,
          thumbnail: true,
          title: 'Richard wants your input',
          body: '"Hey man, what do you think of the new design?" (swipe down to reply, or tap to open the app)',
          forceShowWhenInForeground: true,
          at: new Date(new Date().getTime() + 10 * 1000),
          actions: [
            {
              id: "input-richard",
              type: "input",
              title: "Tap here to reply",
              placeholder: "Type to reply..",
              submitLabel: "Reply",
              launch: true,
              editable: true,
              // choices: ["Red", "Yellow", "Green"] // TODO Android only, but yet to see it in action
            }
          ]
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: "ID: 5",
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleId5WithInput error: " + error));
  }

  public doScheduleEveryMinute(): void {
    LocalNotifications.schedule(
        [{
          id: 6,
          title: 'Every minute!',
          interval: 'minute', // some constant
          body: 'I\'m repeating until cancelled',
          icon: 'res://ic_stat_smiley',
          thumbnail: "res://ic_stat_notify",
          forceShowWhenInForeground: true,
          at: new Date(new Date().getTime() + 10 * 1000)
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: 'ID: 6, repeating',
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleEveryMinute error: " + error));
  }

  public doScheduleMultiple(): void {
    LocalNotifications.schedule(
        [
          {
            id: 7,
            title: 'Multiple - id 7',
            icon: 'res://ic_stat_smiley',
            at: new Date(new Date().getTime() + 5 * 1000)
          },
          {
            id: 8,
            title: 'Multiple - id 8',
            icon: 'res://ic_stat_notify',
            at: new Date(new Date().getTime() + 6 * 1000)
          },
          {
            id: 9,
            title: 'Multiple - id 9',
            icon: 'res://ic_stat_smiley',
            at: new Date(new Date().getTime() + 7 * 1000)
          },
          {
            id: 10,
            title: 'Multiple - id 10',
            icon: 'res://ic_stat_smiley',
            at: new Date(new Date().getTime() + 8 * 1000)
          },
        ])
        .then(() => {
          alert({
            title: "Notification 7-10 scheduled",
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleMultiple error: " + error));
  }

  public doGetScheduledIds(): void {
    LocalNotifications.getScheduledIds()
        .then(ids => {
          alert({
            title: "Scheduled ID's",
            message: 'ID\'s: ' + ids,
            okButtonText: "Sweet!"
          });
        })
        .catch(error => console.log("doGetScheduledIds error: " + error));
  }

  public doCancelAll(): void {
    LocalNotifications.cancelAll()
        .then(() => {
          alert({
            title: "All canceled",
            okButtonText: "Awesome!"
          });
        })
        .catch(error => console.log("doCancelAll error: " + error));
  }

  public doCancelId6(): void {
    LocalNotifications.cancel(6)
        .then(foundAndCanceled => {
          if (foundAndCanceled) {
            alert({
              title: "ID 6 canceled",
              okButtonText: "OK, coolness"
            });
          } else {
            alert({
              title: "No ID 6 was scheduled",
              okButtonText: "OK, woops"
            });
          }
        })
        .catch(error => console.log("doCancelId6 error: " + error));
  }
}


================================================
FILE: demo/app/package.json
================================================
{
  "android": {
    "v8Flags": "--expose_gc",
    "markingMode": "none"
  },
  "main": "app.js",
  "name": "tns-template-hello-world-ts",
  "version": "4.1.0"
}

================================================
FILE: demo/package.json
================================================
{
  "description": "NativeScript Application",
  "license": "SEE LICENSE IN <your-license-filename>",
  "readme": "NativeScript Application",
  "repository": "<fill-your-repository-here>",
  "nativescript": {
    "id": "org.nativescript.plugindemo.localnotifications",
    "tns-ios": {
      "version": "6.0.1"
    },
    "tns-android": {
      "version": "6.0.0"
    }
  },
  "dependencies": {
    "nativescript-local-notifications": "file:../src",
    "nativescript-theme-core": "~1.0.6",
    "tns-core-modules": "~6.0.0"
  },
  "devDependencies": {
    "babel-traverse": "6.26.0",
    "babel-types": "6.26.0",
    "babylon": "6.18.0",
    "lazy": "1.0.11",
    "nativescript-dev-webpack": "1.0.1",
    "tns-platform-declarations": "~6.0.0",
    "typescript": "3.4.5"
  },
  "scripts": {
    "build.plugin": "cd ../src && npm run build"
  }
}


================================================
FILE: demo/references.d.ts
================================================
/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />

/// <reference path="./node_modules/nativescript-local-notifications/platforms/ios/typings/objc!LocalNotificationsPlugin.d.ts" />

================================================
FILE: demo/tsconfig.json
================================================
{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "declaration": false,
        "removeComments": true,
        "noLib": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "pretty": true,
        "allowUnreachableCode": false,
        "allowUnusedLabels": false,
        "noEmitHelpers": true,
        "noEmitOnError": false,
        "noImplicitAny": false,
        "noImplicitReturns": true,
        "noImplicitUseStrict": false,
        "noFallthroughCasesInSwitch": true,
        "typeRoots": [
            "./node_modules/@types",
            "./node_modules"
        ],
        "types": [],
        "lib": [
            "es6",
            "dom"
        ],
        "baseUrl": ".",
        "paths": {
            "~/*": [
                "app/*"
            ],
            "*": [
                "./node_modules/tns-core-modules/*",
                "./node_modules/*"
            ]
        }
    },
    "exclude": [
        "node_modules",
        "platforms"
    ],
    "compileOnSave": false
}

================================================
FILE: demo/tsconfig.tns.json
================================================
{
    "extends": "./tsconfig",
    "compilerOptions": {
        "module": "es2015",
        "moduleResolution": "node"
    }
}


================================================
FILE: demo-ng/App_Resources/Android/app.gradle
================================================
// Add your native dependencies here:

// Uncomment to add recyclerview-v7 dependency
//dependencies {
//	implementation 'com.android.support:recyclerview-v7:+'
//}

// If you want to add something to be applied before applying plugins' include.gradle files 
// e.g. project.ext.googlePlayServicesVersion = "15.0.1"
// create a file named before-plugins.gradle in the current directory and place it there
 
android {  
  defaultConfig {  
    generatedDensities = []
  }  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
} 


================================================
FILE: demo-ng/App_Resources/Android/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="__PACKAGE__"
	android:versionCode="1"
	android:versionName="1.0">

	<supports-screens
		android:smallScreens="true"
		android:normalScreens="true"
		android:largeScreens="true"
		android:xlargeScreens="true"/>

	<uses-sdk
		android:minSdkVersion="17"
		android:targetSdkVersion="__APILEVEL__"/>

	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.INTERNET"/>

	<application
		android:name="com.tns.NativeScriptApplication"
		android:allowBackup="true"
		android:icon="@drawable/icon"
		android:label="@string/app_name"
		android:theme="@style/AppTheme">

		<activity
			android:name="com.tns.NativeScriptActivity"
			android:label="@string/title_activity_kimera"
			android:configChanges="keyboardHidden|orientation|screenSize"
			android:theme="@style/LaunchScreenTheme">

			<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />

			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
		<activity android:name="com.tns.ErrorReportActivity"/>
	</application>
</manifest>


================================================
FILE: demo-ng/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
================================================
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="fill">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background" />
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/logo" />
    </item>
</layer-list>

================================================
FILE: demo-ng/App_Resources/Android/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ns_primary">#F5F5F5</color>
	<color name="ns_primaryDark">#757575</color>
	<color name="ns_accent">#33B5E5</color>
    <color name="ns_blue">#272734</color>
</resources>

================================================
FILE: demo-ng/App_Resources/Android/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- theme to use FOR launch screen-->
    <style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>

        <item name="android:windowBackground">@drawable/splash_screen</item>
        
        <item name="android:windowActionBarOverlay">true</item>  
        <item name="android:windowTranslucentStatus">true</item>

    </style>

    <style name="LaunchScreenTheme" parent="LaunchScreenThemeBase">
    </style>

    <!-- theme to use AFTER launch screen is loaded-->
    <style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>

    </style>

    <style name="AppTheme" parent="AppThemeBase">
    </style>

    <!-- theme for action-bar -->
    <style name="NativeScriptToolbarStyleBase" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">@color/ns_primary</item>
        <item name="theme">@style/ThemeOverlay.AppCompat.ActionBar</item>
        <item name="popupTheme">@style/ThemeOverlay.AppCompat</item>

    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
    </style>
</resources> 


================================================
FILE: demo-ng/App_Resources/Android/src/main/res/values-v21/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<color name="ns_accent">#3d5afe</color>
</resources>

================================================
FILE: demo-ng/App_Resources/Android/src/main/res/values-v21/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Application theme -->
    <style name="AppTheme" parent="AppThemeBase">
        <item name="android:datePickerStyle">@style/SpinnerDatePicker</item>
        <item name="android:timePickerStyle">@style/SpinnerTimePicker</item>
    </style>

    <!-- Default style for DatePicker - in spinner mode -->
    <style name="SpinnerDatePicker" parent="android:Widget.Material.Light.DatePicker">
        <item name="android:datePickerMode">spinner</item>
    </style>

    <!-- Default style for TimePicker - in spinner mode -->
    <style name="SpinnerTimePicker" parent="android:Widget.Material.Light.TimePicker">
        <item name="android:timePickerMode">spinner</item>
    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
        <item name="android:elevation">4dp</item>
    </style>    
</resources>

================================================
FILE: demo-ng/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "icon-20@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "20x20",
      "idiom" : "iphone",
      "filename" : "icon-20@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "20x20",
      "idiom" : "ipad",
      "filename" : "icon-20.png",
      "scale" : "1x"
    },
    {
      "size" : "20x20",
      "idiom" : "ipad",
      "filename" : "icon-20@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40.png",
      "scale" : "1x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "icon-83.5@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "icon-1024.png",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-ng/App_Resources/iOS/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-ng/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
================================================
{
  "images" : [
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2688h",
      "filename" : "Phone XS Max - Portarit iOS 12.png",
      "minimum-system-version" : "12.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2688h",
      "filename" : "iPhone XS Max – Landscape iOS 12.png",
      "minimum-system-version" : "12.0",
      "orientation" : "landscape",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "1792h",
      "filename" : "iPhone XR - Portarit iOS 12.png",
      "minimum-system-version" : "12.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "1792h",
      "filename" : "iPhone XR - Landscape iOS 12.png",
      "minimum-system-version" : "12.0",
      "orientation" : "landscape",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2436h",
      "filename" : "Default-1125h.png",
      "minimum-system-version" : "11.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2436h",
      "filename" : "Default-Landscape-X.png",
      "minimum-system-version" : "11.0",
      "orientation" : "landscape",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-736h@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-Landscape@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "landscape",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "667h",
      "filename" : "Default-667h@2x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "retina4",
      "filename" : "Default-568h@2x.png",
      "minimum-system-version" : "7.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default-568h@2x.png",
      "extent" : "full-screen",
      "subtype" : "retina4",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-ng/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScree.AspectFill@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-ng/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen.Center@3x.png",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-ng/App_Resources/iOS/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleDisplayName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundleExecutable</key>
	<string>${EXECUTABLE_NAME}</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiresFullScreen</key>
	<true/>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: demo-ng/App_Resources/iOS/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <device id="retina5_9" orientation="portrait">
        <adaptation id="fullscreen"/>
    </device>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.AspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="wtH-rr-YfP">
                                <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                            </imageView>
                            <imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.Center" translatesAutoresizingMaskIntoConstraints="NO" id="s1z-aa-wYv">
                                <rect key="frame" x="0.0" y="150" width="375" height="512"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstAttribute="trailing" secondItem="s1z-aa-wYv" secondAttribute="trailing" id="4Rf-kf-vql"/>
                            <constraint firstAttribute="bottom" secondItem="wtH-rr-YfP" secondAttribute="bottom" id="5CS-At-4ka"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="Awn-b8-xf1"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="BpJ-vb-eKA"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="trailing" secondItem="wtH-rr-YfP" secondAttribute="trailing" id="QIM-7J-OZz"/>
                            <constraint firstAttribute="trailing" secondItem="wtH-rr-YfP" secondAttribute="trailing" id="RXg-rW-UK8"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="Rcp-LG-48z"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="cch-8E-tYu"/>
                        </constraints>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="509.60000000000002" y="237.93103448275863"/>
        </scene>
    </scenes>
    <resources>
        <image name="LaunchScreen.AspectFill" width="768" height="1024"/>
        <image name="LaunchScreen.Center" width="384" height="512"/>
    </resources>
</document>


================================================
FILE: demo-ng/App_Resources/iOS/build.xcconfig
================================================
// You can add custom settings here
// for example you can uncomment the following line to force distribution code signing
// CODE_SIGN_IDENTITY = iPhone Distribution 
// To build for device with Xcode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;


================================================
FILE: demo-ng/README.md
================================================
# NativeScript Angular Template

This template creates a "Hello, world" NativeScript app using TypeScript and Angular.

You can create a new app that uses this template with either the `--template` option.

```
tns create my-app-name --template tns-template-hello-world-ng
```

Or the `--ng` shorthand.

```
tns create my-app-name --ng
```

> Note: Both commands will create a new NativeScript app that uses the latest version of this template published to [npm] (https://www.npmjs.com/package/tns-template-hello-world-ng).

If you want to create a new app that uses the source of the template from the `master` branch, you can execute the following:

```
tns create my-app-name --template https://github.com/NativeScript/template-hello-world-ng.git#master
```

**NB:** Please, have in mind that the master branch may refer to dependencies that are not on NPM yet!

# Issues

Issues related to `template-hello-world-ng` template should be logged in the https://github.com/NativeScript/NativeScript repository.


================================================
FILE: demo-ng/angular.json
================================================
{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "cli": {
    "defaultCollection": "@nativescript/schematics"
  },
  "projects": {
    "hello-world": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "prefix": "ns"
    }
  },
  "defaultProject": "hello-world"
}


================================================
FILE: demo-ng/nsconfig.json
================================================
{
  "appResourcesPath": "App_Resources",
  "appPath": "src"
}


================================================
FILE: demo-ng/package.json
================================================
{
    "nativescript": {
        "id": "org.nativescript.demong",
        "tns-android": {
            "version": "5.1.0"
        },
        "tns-ios": {
            "version": "5.1.0"
        }
    },
    "description": "NativeScript Application",
    "license": "SEE LICENSE IN <your-license-filename>",
    "repository": "<fill-your-repository-here>",
    "dependencies": {
        "@angular/animations": "~7.1.0",
        "@angular/common": "~7.1.0",
        "@angular/compiler": "~7.1.0",
        "@angular/core": "~7.1.0",
        "@angular/forms": "~7.1.0",
        "@angular/http": "~7.1.0",
        "@angular/platform-browser": "~7.1.0",
        "@angular/platform-browser-dynamic": "~7.1.0",
        "@angular/router": "~7.1.0",
        "nativescript-angular": "~7.1.0",
        "nativescript-local-notifications": "file:../src",
        "nativescript-theme-core": "~1.0.4",
        "reflect-metadata": "~0.1.8",
        "rxjs": "~6.3.0",
        "tns-core-modules": "~5.1.0",
        "zone.js": "^0.8.26"
    },
    "devDependencies": {
        "@nativescript/schematics": "~0.5.0",
        "nativescript-dev-typescript": "libs",
        "nativescript-dev-webpack": "~0.19.0",
        "@angular/compiler-cli": "~7.1.0",
        "@ngtools/webpack": "~7.1.0"
    },
    "readme": "NativeScript Application"
}


================================================
FILE: demo-ng/references.d.ts
================================================
/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />
/// <reference path="./node_modules/nativescript-local-notifications/platforms/ios/typings/objc!LocalNotificationsPlugin.d.ts" />

================================================
FILE: demo-ng/src/app/app-routing.module.ts
================================================
import { NgModule } from "@angular/core";
import { Routes } from "@angular/router";
import { NativeScriptRouterModule } from "nativescript-angular/router";

import { ItemsComponent } from "./item/items.component";

const routes: Routes = [
  {path: "", redirectTo: "/items", pathMatch: "full"},
  {path: "items", component: ItemsComponent}
];

@NgModule({
  imports: [NativeScriptRouterModule.forRoot(routes)],
  exports: [NativeScriptRouterModule]
})
export class AppRoutingModule {
}

================================================
FILE: demo-ng/src/app/app.component.html
================================================
<!-- https://docs.nativescript.org/angular/core-concepts/angular-navigation.html#page-router-outlet -->
<page-router-outlet></page-router-outlet>


================================================
FILE: demo-ng/src/app/app.component.ts
================================================
import { Component } from "@angular/core";

@Component({
    selector: "ns-app",
    moduleId: module.id,
    templateUrl: "./app.component.html",
})
export class AppComponent { }


================================================
FILE: demo-ng/src/app/app.module.ts
================================================
import { NgModule, NO_ERRORS_SCHEMA } from "@angular/core";
import { NativeScriptModule } from "nativescript-angular/nativescript.module";

import { AppRoutingModule } from "./app-routing.module";
import { AppComponent } from "./app.component";
import { ItemsComponent } from "./item/items.component";

// Uncomment and add to NgModule imports if you need to use two-way binding
// import { NativeScriptFormsModule } from "nativescript-angular/forms";

// Uncomment and add to NgModule imports if you need to use the HttpClient wrapper
// import { NativeScriptHttpClientModule } from "nativescript-angular/http-client";

@NgModule({
  bootstrap: [
    AppComponent
  ],
  imports: [
    NativeScriptModule,
    AppRoutingModule
  ],
  declarations: [
    AppComponent,
    ItemsComponent
  ],
  providers: [],
  schemas: [
    NO_ERRORS_SCHEMA
  ]
})

export class AppModule {
}


================================================
FILE: demo-ng/src/app/item/items.component.html
================================================
<!--
The template defines the view of the component - what is actually rendered.
In NativeScript applications the template is defined with XML using NativeScript UI elements.
It is different from HTML. So instead of <input>, <span>, <div> etc. - we have <TextField>, <Label> and layouts.
The important thing is that although the elements are different - all of the Angular’s template syntax works exactly the same.
So you can still use template expressions, bindings, templates as well as all the built-in directives.
-->

<!--
The ActionBar is the NativeScript common abstraction over the Android ActionBar and iOS NavigationBar.
http://docs.nativescript.org/ui/action-bar
-->
<ActionBar title="My App" class="action-bar">
</ActionBar>

<!--
The StackLayout stacks UI components on the screen — either vertically or horizontally.
In this case, the StackLayout does vertical stacking; you can change the stacking to
horizontal by applying a orientation="horizontal" attribute to the <StackLayout> element.
You can learn more about NativeScript layouts at https://docs.nativescript.org/ui/layout-containers.

These components make use of several CSS class names that are part of the NativeScript
core theme, such as p-20, btn, h2, and list-group. You can view a full list of the
class names available for styling your app at https://docs.nativescript.org/ui/theme.
-->
<StackLayout class="page">
  <Button (tap)="schedule()" text="Schedule"></Button>
</StackLayout>


================================================
FILE: demo-ng/src/app/item/items.component.ts
================================================
import { Component } from "@angular/core";
import { LocalNotifications } from "nativescript-local-notifications";

@Component({
  selector: "ns-items",
  moduleId: module.id,
  templateUrl: "./items.component.html",
})
export class ItemsComponent {

  constructor() {
    LocalNotifications.addOnMessageReceivedCallback(notificationData => {
      console.log("Notification received: " + JSON.stringify(notificationData));
    });
  }

  schedule(): void {
    LocalNotifications.schedule(
        [{
          id: 5,
          thumbnail: true,
          title: 'Richard wants your input',
          body: '"Hey man, what do you think of the new design?" (swipe down to reply, or tap to open the app)',
          forceShowWhenInForeground: true,
          at: new Date(new Date().getTime() + 10 * 1000),
          actions: [
            {
              id: "input-richard",
              type: "input",
              title: "Tap here to reply",
              placeholder: "Type to reply..",
              submitLabel: "Reply",
              launch: true,
              editable: true,
              // choices: ["Red", "Yellow", "Green"] // TODO Android only, but yet to see it in action
            }
          ]
        }])
        .then(() => {
          alert({
            title: "Notification scheduled",
            message: "ID: 5",
            okButtonText: "OK, thanks"
          });
        })
        .catch(error => console.log("doScheduleId5WithInput error: " + error));
  }
}

================================================
FILE: demo-ng/src/app.css
================================================
/*
In NativeScript, the app.css file is where you place CSS rules that
you would like to apply to your entire application. Check out
http://docs.nativescript.org/ui/styling for a full list of the CSS
selectors and properties you can use to style UI components.

/*
In many cases you may want to use the NativeScript core theme instead
of writing your own CSS rules. For a full list of class names in the theme
refer to http://docs.nativescript.org/ui/theme.
*/
@import '~nativescript-theme-core/css/core.light.css';


================================================
FILE: demo-ng/src/main.ts
================================================
// this import should be first in order to load some required settings (like globals and reflect-metadata)
import { platformNativeScriptDynamic } from "nativescript-angular/platform";

import { AppModule } from "./app/app.module";

// Add this so for iOS 10+ we can do some wiring (set the iOS UNUserNotificationCenter delegate, to be precise).
// Not needed if your app loads the plugin on startup anyway.
// You'll know you need this if on iOS 10+ notifications are not received by your app.
require ("nativescript-local-notifications");

// A traditional NativeScript application starts by initializing global objects, setting up global CSS rules, creating, and navigating to the main page.
// Angular applications need to take care of their own initialization: modules, components, directives, routes, DI providers.
// A NativeScript Angular app needs to make both paradigms work together, so we provide a wrapper platform object, platformNativeScriptDynamic,
// that sets up a NativeScript application and can bootstrap the Angular framework.
platformNativeScriptDynamic().bootstrapModule(AppModule);


================================================
FILE: demo-ng/src/package.json
================================================
{
    "main": "main.js",
    "android": {
        "v8Flags": "--expose_gc"
    }
}

================================================
FILE: demo-ng/tsconfig.json
================================================
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "experimentalDecorators": true,
        "emitDecoratorMetadata": true,
        "noEmitHelpers": true,
        "noEmitOnError": true,
        "lib": [
            "es6",
            "dom",
            "es2015.iterable"
        ],
        "baseUrl": ".",
        "paths": {
            "~/*": [
                "src/*"
            ],
            "*": [
                "./node_modules/tns-core-modules/*",
                "./node_modules/*"
            ]
        }
    },
    "exclude": [
        "node_modules",
        "platforms"
    ]
}

================================================
FILE: demo-ng/tsconfig.tns.json
================================================
{
    "extends": "./tsconfig",
    "compilerOptions": {
        "module": "es2015",
        "moduleResolution": "node"
    }
}


================================================
FILE: demo-vue/.gitignore
================================================
# JetBrains project files
.idea

# NPM
node_modules

# NativeScript application
hooks
platforms


================================================
FILE: demo-vue/README.md
================================================
# Local Notifications

> Vue demo app for the Local Notifications plugin

## Usage

``` bash
# Install dependencies
npm install

# Build for production
tns build <platform> --bundle

# Build, watch for changes and debug the application
tns debug <platform> --bundle

# Build, watch for changes and run the application
tns run <platform> --bundle
```

================================================
FILE: demo-vue/app/App_Resources/Android/app.gradle
================================================
// Add your native dependencies here:

android {
  defaultConfig {  
    generatedDensities = []
    applicationId = "org.nativescript.plugindemo.vue.localnotifications"
  }
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
} 


================================================
FILE: demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android" package="__PACKAGE__" android:versionCode="10000" android:versionName="1.0.0">
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" />
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="__APILEVEL__" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application android:name="com.tns.NativeScriptApplication" android:allowBackup="true" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/AppTheme">
        <activity android:name="com.tns.NativeScriptActivity" android:label="@string/title_activity_kimera" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@style/LaunchScreenTheme">
            <meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.tns.ErrorReportActivity" />
    </application>
</manifest>

================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml
================================================
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:gravity="fill">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background" />
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/logo" />
    </item>
</layer-list>

================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ns_primary">#F5F5F5</color>
    <color name="ns_primaryDark">#53ba82</color>
    <color name="ns_accent">#33B5E5</color>
    <color name="ns_blue">#272734</color>
</resources>


================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Local Notifications</string>
    <string name="title_activity_kimera">Local Notifications</string>
</resources>


================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- theme to use FOR launch screen-->
    <style name="LaunchScreenThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>

        <item name="android:windowBackground">@drawable/splash_screen</item>
        
        <item name="android:windowActionBarOverlay">true</item>  
        <item name="android:windowTranslucentStatus">true</item>
    </style>

    <style name="LaunchScreenTheme" parent="LaunchScreenThemeBase">
    </style>

    <!-- theme to use AFTER launch screen is loaded-->
    <style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="toolbarStyle">@style/NativeScriptToolbarStyle</item>

        <item name="colorPrimary">@color/ns_primary</item>
        <item name="colorPrimaryDark">@color/ns_primaryDark</item>
        <item name="colorAccent">@color/ns_accent</item>
    </style>

    <style name="AppTheme" parent="AppThemeBase">
    </style>

    <!-- theme for actioon-bar -->
    <style name="NativeScriptToolbarStyleBase" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">@color/ns_primary</item>
        <item name="theme">@style/ThemeOverlay.AppCompat.ActionBar</item>
        <item name="popupTheme">@style/ThemeOverlay.AppCompat</item>
    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
    </style>
</resources>


================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values-v21/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
	<color name="ns_accent">#3d5afe</color>
</resources>

================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values-v21/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Local Notifications</string>
    <string name="title_activity_kimera">Local Notifications</string>
</resources>


================================================
FILE: demo-vue/app/App_Resources/Android/src/main/res/values-v21/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <!-- Application theme -->
    <style name="AppTheme" parent="AppThemeBase">
        <item name="android:datePickerStyle">@style/SpinnerDatePicker</item>
        <item name="android:timePickerStyle">@style/SpinnerTimePicker</item>
    </style>

    <!-- Default style for DatePicker - in spinner mode -->
    <style name="SpinnerDatePicker" parent="android:Widget.Material.Light.DatePicker">
        <item name="android:datePickerMode">spinner</item>
    </style>

    <!-- Default style for TimePicker - in spinner mode -->
    <style name="SpinnerTimePicker" parent="android:Widget.Material.Light.TimePicker">
        <item name="android:timePickerMode">spinner</item>
    </style>

    <style name="NativeScriptToolbarStyle" parent="NativeScriptToolbarStyleBase">
        <item name="android:elevation">4dp</item>
    </style>
</resources>

================================================
FILE: demo-vue/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "29x29",
      "idiom" : "iphone",
      "filename" : "icon-29@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "iphone",
      "filename" : "icon-40@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "60x60",
      "idiom" : "iphone",
      "filename" : "icon-60@3x.png",
      "scale" : "3x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29.png",
      "scale" : "1x"
    },
    {
      "size" : "29x29",
      "idiom" : "ipad",
      "filename" : "icon-29@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40.png",
      "scale" : "1x"
    },
    {
      "size" : "40x40",
      "idiom" : "ipad",
      "filename" : "icon-40@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76.png",
      "scale" : "1x"
    },
    {
      "size" : "76x76",
      "idiom" : "ipad",
      "filename" : "icon-76@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "83.5x83.5",
      "idiom" : "ipad",
      "filename" : "icon-83.5@2x.png",
      "scale" : "2x"
    },
    {
      "size" : "1024x1024",
      "idiom" : "ios-marketing",
      "filename" : "icon-1024.png",
      "scale" : "1x"
    } 
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-vue/app/App_Resources/iOS/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json
================================================
{
  "images" : [
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "2436h",
      "filename" : "Default-1125h.png",
      "minimum-system-version" : "11.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "filename" : "Default-Landscape-X.png",
      "minimum-system-version" : "11.0",
      "subtype" : "2436h",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-736h@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "Default-Landscape@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "landscape",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "667h",
      "filename" : "Default-667h@2x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "retina4",
      "filename" : "Default-568h@2x.png",
      "minimum-system-version" : "7.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "filename" : "Default-568h@2x.png",
      "extent" : "full-screen",
      "subtype" : "retina4",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape.png",
      "extent" : "full-screen",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "filename" : "Default-Portrait@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "to-status-bar",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "filename" : "Default-Landscape@2x.png",
      "extent" : "full-screen",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-AspectFill@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "filename" : "LaunchScreen-Center@2x.png",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: demo-vue/app/App_Resources/iOS/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleDisplayName</key>
	<string>Local Notifications</string>
	<key>CFBundleExecutable</key>
	<string>${EXECUTABLE_NAME}</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0.0</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIRequiresFullScreen</key>
	<true/>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: demo-vue/app/App_Resources/iOS/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10116" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
                        <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.AspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="wtH-rr-YfP">
                                <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                            </imageView>
                            <imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="LaunchScreen.Center" translatesAutoresizingMaskIntoConstraints="NO" id="s1z-aa-wYv">
                                <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                            </imageView>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                        <constraints>
                            <constraint firstItem="xb3-aO-Qok" firstAttribute="top" secondItem="wtH-rr-YfP" secondAttribute="bottom" id="5FO-pR-qKb"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="Awn-b8-xf1"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="CiP-yX-1sg"/>
                            <constraint firstAttribute="trailing" secondItem="wtH-rr-YfP" secondAttribute="trailing" id="RXg-rW-UK8"/>
                            <constraint firstItem="s1z-aa-wYv" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="agC-wa-3bd"/>
                            <constraint firstItem="wtH-rr-YfP" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="cch-8E-tYu"/>
                            <constraint firstItem="xb3-aO-Qok" firstAttribute="top" secondItem="s1z-aa-wYv" secondAttribute="bottom" id="fNc-Ro-KaG"/>
                            <constraint firstAttribute="trailing" secondItem="s1z-aa-wYv" secondAttribute="trailing" id="qoI-OC-Zk7"/>
                        </constraints>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="510" y="238"/>
        </scene>
    </scenes>
    <resources>
        <image name="LaunchScreen.AspectFill" width="768" height="1024"/>
        <image name="LaunchScreen.Center" width="40" height="40"/>
    </resources>
</document>


================================================
FILE: demo-vue/app/App_Resources/iOS/build.xcconfig
================================================
// You can add custom settings here
// for example you can uncomment the following line to force distribution code signing
// CODE_SIGN_IDENTITY = iPhone Distribution 
// To build for device with Xcode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;


================================================
FILE: demo-vue/app/app.scss
================================================
// NativeScript core theme
// @see https://docs.nativescript.org/ui/theme
@import '~nativescript-theme-core/scss/dark';

// Override variables here

@import '~nativescript-theme-core/scss/index';

// Global SCSS styling
// @see https://docs.nativescript.org/ui/styling


================================================
FILE: demo-vue/app/components/App.vue
================================================
<template>
  <Page>
    <ActionBar title="Local Notifications demo"></ActionBar>

    <StackLayout>
      <Button @tap="onTapHasPermission" class="btn" text="Has Permission?"></Button>
      <Button @tap="onTapScheduleNotification" class="btn" text="Schedule Notification"></Button>
      <Button @tap="onTapCancelAll" class="btn" text="Cancel notifications"></Button>
      <Label class="message" :text="message" textWrap="true"></Label>
    </StackLayout>
  </Page>
</template>

<script>
  import { alert } from "tns-core-modules/ui/dialogs";
  import { Color } from "tns-core-modules/color";
  import { LocalNotifications } from "nativescript-local-notifications";

  export default {
    created() {
      LocalNotifications.addOnMessageReceivedCallback(notificationData => {
        this.message = "Notification received: " + JSON.stringify(notificationData);
      });
    },

    data() {
      return {
        message: "Tap a button above.."
      }
    },

    methods: {
      onTapHasPermission() {
        LocalNotifications.hasPermission()
            .then(granted => {
              alert({
                title: "Permission granted?",
                message: granted ? "YES" : "NO",
                okButtonText: "OK"
              });
            });
      },

      onTapScheduleNotification() {
        LocalNotifications.schedule(
            [{
              id: 1,
              title: 'Would you like a Red Alert poster?',
              subtitle: 'This poster is awesome!',
              body: 'The big brown Vue app jumped over the lazy Angular app. The big brown Vue app jumped over the lazy Angular app. The big brown Vue app jumped over the lazy Angular app. The big brown Vue app jumped over the lazy Angular app.',
              bigTextStyle: false, // Allow more than 1 row of the 'body' text on Android, but setting this to true denies showing the 'image'
              color: new Color("green"),
              image: "https://images-na.ssl-images-amazon.com/images/I/61mx-VbrS0L.jpg",
              thumbnail: "https://2.bp.blogspot.com/-H_SZ3nAmNsI/VrJeARpbuSI/AAAAAAAABfc/szsV7_F609k/s200/emoji.jpg",
              forceShowWhenInForeground: true,
              channel: "vue-channel",
              ticker: "Special ticker text for Vue (Android only)",
              at: new Date(new Date().getTime() + (5 * 1000)), // 5 seconds from now
              actions: [
                {
                  id: "yes",
                  type: "button",
                  title: "Yes (and launch app)",
                  launch: true
                },
                {
                  id: "no",
                  type: "button",
                  title: "No",
                  launch: false
                }
              ]
            }])
            .then(() => {
              alert({
                title: "Notification scheduled",
                message: "ID: 1",
                okButtonText: "OK, thanks"
              });
            })
            .catch(error => console.log("doSchedule error: " + error));
      },

      onTapCancelAll() {
        LocalNotifications.cancelAll()
            .then(() => {
              alert({
                title: "All canceled",
                okButtonText: "Awesome!"
              });
            })
            .catch(error => console.log("doCancelAll error: " + error));
      }
    }
  }
</script>

<style scoped>
  ActionBar {
    background-color: #53ba82;
    color: #ffffff;
  }

  .message {
    font-size: 14;
    margin: 16;
    color: #53ba82;
  }

  Button.btn {
    font-size: 14;
    border-radius: 3;
    border-width: 2;
    border-color: #63d4a5;
    color: #63d4a5;
    padding: 12;
    margin: 16;
  }
</style>


================================================
FILE: demo-vue/app/fonts/.gitkeep
================================================


================================================
FILE: demo-vue/app/main.js
================================================
import Vue from 'nativescript-vue'
import App from './components/App'

require ("nativescript-local-notifications");

// Prints Vue logs when --env.production is *NOT* set while building
Vue.config.silent = (TNS_ENV === 'production')


new Vue({
  render: h => h('frame', [h(App)])
}).$start()


================================================
FILE: demo-vue/app/package.json
================================================
{
  "android": {
    "v8Flags": "--expose_gc"
  },
  "main": "main",
  "name": "demo-vue",
  "version": "1.0.0"
}


================================================
FILE: demo-vue/package.json
================================================
{
  "name": "demo-vue",
  "version": "1.0.0",
  "description": "Vue demo app for the Local Notifications plugin",
  "author": "EddyVerbruggen <eddyverbruggen@gmail.com>",
  "license": "MIT",
  "nativescript": {
    "id": "org.nativescript.plugindemo.vue.localnotifications",
    "tns-ios": {
      "version": "5.1.0"
    },
    "tns-android": {
      "version": "5.1.0"
    }
  },
  "dependencies": {
    "nativescript-local-notifications": "file:../src",
    "nativescript-theme-core": "^1.0.4",
    "nativescript-vue": "^2.0.0",
    "tns-core-modules": "~5.1.0"
  },
  "devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/preset-env": "^7.0.0",
    "babel-loader": "^8.0.2",
    "babel-traverse": "6.26.0",
    "babel-types": "6.26.0",
    "babylon": "6.18.0",
    "clean-webpack-plugin": "^0.1.19",
    "copy-webpack-plugin": "^4.5.2",
    "css-loader": "^1.0.0",
    "lazy": "1.0.11",
    "nativescript-dev-webpack": "next",
    "nativescript-vue-template-compiler": "^2.0.0",
    "nativescript-worker-loader": "~0.9.0",
    "node-sass": "^4.9.2",
    "sass-loader": "^7.1.0",
    "terser-webpack-plugin": "^1.1.0",
    "typescript": "~3.1.6",
    "vue-loader": "^15.2.6",
    "webpack": "^4.16.4",
    "webpack-bundle-analyzer": "~3.6.0",
    "webpack-cli": "^3.1.0"
  }
}


================================================
FILE: native-src/android/.gitattributes
================================================
* -crlf

================================================
FILE: native-src/android/.gitignore
================================================
out/
.idea/
.gradle/
local.properties
build/

================================================
FILE: native-src/android/README.md
================================================
# Local Notifications Plugin library for NativeScript Android apps

## Building the framework
- Open this folder as "an existing project" in Android Studio
- Change anything needed
- In the Gradle build window run `app > Tasks > build > clean` and `app > Tasks > build > build`
- Copy the release .aar: from the plugin project root, run: `cp native-src/android/app/build/outputs/aar/app-release.aar src/platforms/android/` 


================================================
FILE: native-src/android/android.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="android" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="java-gradle" name="Java-Gradle">
      <configuration>
        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
        <option name="BUILDABLE" value="false" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

================================================
FILE: native-src/android/app/.gitignore
================================================
/build


================================================
FILE: native-src/android/app/app.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":app" />
        <option name="LAST_SUCCESSFUL_SYNC_AGP_VERSION" value="3.4.1" />
        <option name="LAST_KNOWN_AGP_VERSION" value="3.4.1" />
      </configuration>
    </facet>
    <facet type="android" name="Android">
      <configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
        <afterSyncTasks>
          <task>generateDebugSources</task>
        </afterSyncTasks>
        <option name="ALLOW_USER_CONFIGURATION" value="false" />
        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
        <option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />
        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
        <option name="PROJECT_TYPE" value="1" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
    <output url="file://$MODULE_DIR$/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes" />
    <output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTestDebug/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build" />
    </content>
    <orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" name="Gradle: androidx.collection:collection:1.0.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-common:2.0.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.arch.core:core-common:2.0.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.annotation:annotation:1.0.0@jar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-v4:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.media:media:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.fragment:fragment:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-ui:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.legacy:legacy-support-core-utils:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.loader:loader:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.viewpager:viewpager:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.coordinatorlayout:coordinatorlayout:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.drawerlayout:drawerlayout:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.slidingpanelayout:slidingpanelayout:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.customview:customview:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.swiperefreshlayout:swiperefreshlayout:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.asynclayoutinflater:asynclayoutinflater:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.core:core:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.versionedparcelable:versionedparcelable:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-runtime:2.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.documentfile:documentfile:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.print:print:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.interpolator:interpolator:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.cursoradapter:cursoradapter:1.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-viewmodel:2.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata:2.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.lifecycle:lifecycle-livedata-core:2.0.0@aar" level="project" />
    <orderEntry type="library" name="Gradle: androidx.arch.core:core-runtime:2.0.0@aar" level="project" />
  </component>
</module>

================================================
FILE: native-src/android/app/build.gradle
================================================
apply plugin: 'com.android.library'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 28
        versionCode 2
        versionName "1.1.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}


================================================
FILE: native-src/android/app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\Users\gprodano\AppData\Local\Android\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}


================================================
FILE: native-src/android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.telerik.localnotifications">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <application>
        <service
            android:name="com.telerik.localnotifications.NotificationActionReceiver"
            android:exported="false" />

        <receiver
            android:name="com.telerik.localnotifications.NotificationClearedReceiver"
            android:exported="false" />

        <receiver
            android:name="com.telerik.localnotifications.NotificationAlarmReceiver"
            android:exported="false" />

        <receiver
            android:name="com.telerik.localnotifications.NotificationRestoreReceiver"
            android:directBootAware="true"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Action.java
================================================
package com.telerik.localnotifications;

import android.content.Context;
import androidx.core.app.RemoteInput;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

import static com.telerik.localnotifications.LocalNotificationsPlugin.TAG;


/**
 * Holds the icon and title components that would be used in a
 * NotificationCompat.Action object. Does not include the PendingIntent so
 * that it may be generated each time the notification is built. Necessary to
 * compensate for missing functionality in the support library.
 */
public final class Action {

  // The id for the click action
  public static final String CLICK_ACTION_ID = "default_action";

  // The application context
  private final Context context;

  // The action spec
  private final JSONObject options;

  /**
   * Structure to encapsulate a named action that can be shown as part of
   * this notification.
   *
   * @param context The application context.
   * @param options The action options.
   */
  Action(Context context, JSONObject options) {
    this.context = context;
    this.options = options;
  }

  /**
   * Gets the ID for the action.
   */
  public String getId() {
    return options.optString("id", getTitle());
  }

  /**
   * Gets the Title for the action.
   */
  public String getTitle() {
    return options.optString("title", "Tap here");
  }

  /**
   * Gets the icon for the action.
   */
  public int getIcon() {
    // TODO
    return android.R.drawable.screen_background_dark;
    /*
    AssetUtil assets = AssetUtil.getInstance(context);
    String resPath = options.optString("icon");
    int resId = assets.getResId(resPath);

    if (resId == 0) {
      resId = android.R.drawable.screen_background_dark;
    }

    return resId;
    */
  }

  /**
   * Gets the value of the launch flag.
   */
  public boolean isLaunchingApp() {
    return options.optBoolean("launch", true);
  }

  /**
   * Gets the type for the action.
   */
  public boolean isWithInput() {
    String type = options.optString("type");
    return "input".equals(type);
  }

  /**
   * Gets the input config in case of the action is of type input.
   */
  public RemoteInput getInput() {
    return new RemoteInput.Builder(getId())
        .setLabel(options.optString("placeholder"))
        .setAllowFreeFormInput(options.optBoolean("editable", true))
        .setChoices(getChoices())
        .build();
  }

  /**
   * List of possible choices for input actions.
   */
  private String[] getChoices() {
    JSONArray opts = options.optJSONArray("choices");

    Log.d(TAG, "getChoices, opts: " + opts);

    if (opts == null) {
      return null;
    }

    String[] choices = new String[opts.length()];

    for (int i = 0; i < choices.length; i++) {
      choices[i] = opts.optString(i);
    }

    Log.d(TAG, "getChoices, choices: " + choices);
    Log.d(TAG, "getChoices, choices.length: " + choices.length);

    return choices;
  }

}

================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/ActionGroup.java
================================================
package com.telerik.localnotifications;

import android.content.Context;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.N;

public final class ActionGroup {

  // Saves all groups for later lookup.
  private static final Map<String, ActionGroup> groups = new HashMap<String, ActionGroup>();

  // The ID of the action group.
  private final String id;

  // List of actions
  private final Action[] actions;

  /**
   * Lookup the action groups with the specified group id.
   *
   * @param id The ID of the action group to find.
   * @return Null if no group was found.
   */
  public static ActionGroup lookup(String id) {
    return groups.get(id);
  }

  /**
   * Register the action group for later lookup.
   *
   * @param group The action group to register.
   */
  public static void register(ActionGroup group) {
    groups.put(group.getId(), group);
  }

  /**
   * Unregister the action group.
   *
   * @param id The id of the action group to remove.
   */
  public static void unregister(String id) {
    groups.remove(id);
  }

  /**
   * Check if a action group with that id is registered.
   *
   * @param id The id of the action group to check for.
   */
  public static boolean isRegistered(String id) {
    return groups.containsKey(id);
  }

  /**
   * Creates an action group by parsing the specified action specs.
   *
   * @param list The list of actions.
   * @return A new action group.
   */
  public static ActionGroup parse(Context context, JSONArray list) {
    return parse(context, null, list);
  }

  /**
   * Creates an action group by parsing the specified action specs.
   *
   * @param id   The id for the action group.
   * @param list The list of actions.
   * @return A new action group.
   */
  public static ActionGroup parse(Context context, String id, JSONArray list) {
    List<Action> actions = new ArrayList<Action>(list.length());

    for (int i = 0; i < list.length(); i++) {
      JSONObject opts = list.optJSONObject(i);
      String type = opts.optString("type", "button");

      if (type.equals("input") && SDK_INT < N) {
        Log.w("Action", "Type input is not supported");
        continue;
      }

      if (!(type.equals("button") || type.equals("input"))) {
        Log.w("Action", "Unknown type: " + type);
        continue;
      }

      actions.add(new Action(context, opts));
    }

    return new ActionGroup(id, actions.toArray(new Action[actions.size()]));
  }

  /**
   * Creates an action group.
   *
   * @param id      The ID of the group.
   * @param actions The list of actions.
   */
  private ActionGroup(String id, Action[] actions) {
    this.id = id;
    this.actions = actions;
  }

  /**
   * Gets the action group id.
   */
  public String getId() {
    return id;
  }

  /**
   * Gets the action list.
   */
  public Action[] getActions() {
    return actions;
  }

}

================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Builder.java
================================================
package com.telerik.localnotifications;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import android.util.Log;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.concurrent.ExecutionException;

import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;

public final class Builder {

    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";

    private static final String TAG = "Builder";
    private static final String DEFAULT_CHANNEL = "Notifications";

    private static final int DEFAULT_NOTIFICATION_COLOR = Color.parseColor("#ffffffff");
    private static final int DEFAULT_NOTIFICATION_LED_ON = 500;
    private static final int DEFAULT_NOTIFICATION_LED_OFF = 2000;

    // Methods to build notifications:

    static Notification build(JSONObject options, Context context, int notificationID) {
        // We use options.channel as both channel id and name. If not set, both default to DEFAULT_CHANNEL:
        return build(options, context, notificationID, options.optString("channel", DEFAULT_CHANNEL));
    }

    static Notification build(JSONObject options, Context context, int notificationID, String channelID) {
        // Set channel for Android 8+:

        if (android.os.Build.VERSION.SDK_INT >= 26) {
            final NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

            if (notificationManager != null && notificationManager.getNotificationChannel(channelID) == null) {
                NotificationChannel channel = new NotificationChannel(channelID, channelID, NotificationManager.IMPORTANCE_HIGH);
                if (shouldEnableNotificationLed(options)) {
                    channel.enableLights(true);
                    channel.setLightColor(getLedColor(options));
                }
                notificationManager.createNotificationChannel(channel);
            }
        }

        // Create the builder:

        NotificationCompat.Builder builder = android.os.Build.VERSION.SDK_INT >= 26 ? new NotificationCompat.Builder(context, channelID) : new NotificationCompat.Builder(context);

        builder
            .setDefaults(0)
            .setContentTitle(options.optString("title", null))
            .setSubText(options.optString("subtitle", null))
            .setContentText(options.optString("body", null))
            .setSmallIcon(options.optInt("icon"))
            .setAutoCancel(true) // Remove the notification from the status bar once tapped.
            .setNumber(options.optInt("badge"))
            .setColor(options.optInt("color"))
            .setOngoing(options.optBoolean("ongoing"))
            .setPriority(options.optInt("priority", options.optBoolean("forceShowWhenInForeground") ? 1 : 0))
            .setTicker(options.optString("ticker", null)); // Let the OS handle the default value for the ticker.

        final Object thumbnail = options.opt("thumbnail");

        if (thumbnail instanceof String) {
            builder.setLargeIcon(getBitmap(context, (String) thumbnail));
        }

        // TODO sound preference is not doing anything
        // builder.setSound(options.has("sound") ? Uri.parse("android.resource://" + context.getPackageName() + "/raw/" + options.getString("sound")) : Uri.parse("android.resource://" + context.getPackageName() + "/raw/notify"))
        if (options.has("sound")) {
            builder.setSound(android.media.RingtoneManager.getDefaultUri(android.media.RingtoneManager.TYPE_NOTIFICATION));
        }

        applyNotificationLed(options, builder);
        applyStyle(options, builder, context);
        applyTapReceiver(options, builder, context, notificationID);
        applyClearReceiver(builder, context, notificationID);
        applyActions(options, builder, context, notificationID);

        return builder.build();
    }


    // Notification styles:

    private static void applyNotificationLed(JSONObject options, NotificationCompat.Builder builder) {
        if (shouldEnableNotificationLed(options)) {
            builder.setLights(getLedColor(options), DEFAULT_NOTIFICATION_LED_ON, DEFAULT_NOTIFICATION_LED_OFF);
        }
    }

    private static void applyStyle(JSONObject options, NotificationCompat.Builder builder, Context context) {
        if (options.has("groupedMessages")) {
            applyGroup(options, builder);
        } else if (options.optBoolean("bigTextStyle")) {
            applyBigTextStyle(options, builder);
        } else if (options.has("image")) {
            applyImage(options, builder, context);
        }
    }

    private static void applyImage(JSONObject options, NotificationCompat.Builder builder, Context context) {
        Bitmap bitmap = getBitmap(context, options.optString("image", ""));

        if (bitmap == null) {
            return;
        }

        final NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle().bigPicture(bitmap);

        builder.setStyle(bigPictureStyle);

        final Object thumbnail = options.opt("thumbnail");

        if (Boolean.TRUE.equals(thumbnail)) {
            builder.setLargeIcon(bitmap); // Set the thumbnail...
            bigPictureStyle.bigLargeIcon(null); // ...which goes away when expanded.
        }

    }

    private static void applyBigTextStyle(JSONObject options, NotificationCompat.Builder builder) {
        // set big text style (adds an 'expansion arrow' to the notification)
        if (options.optBoolean("bigTextStyle")) {
            final NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
            bigTextStyle.setBigContentTitle(options.optString("title"));
            bigTextStyle.bigText(options.optString("body"));
            builder.setStyle(bigTextStyle);
        }
    }

    private static void applyGroup(JSONObject options, NotificationCompat.Builder builder) {
        JSONArray groupedMessages = options.optJSONArray("groupedMessages");

        if (groupedMessages == null) {
            return;
        }

        final NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();

        // Sets a title for the Inbox in expanded layout
        // TODO: Is this needed? Should we add a different option for it (bigTitle)?
        inboxStyle.setBigContentTitle(options.optString("title", null));
        inboxStyle.setSummaryText(options.optString("groupSummary", null));

        int messagesToDisplay = Math.min(groupedMessages.length(), 5);

        for (int i = 0; i < messagesToDisplay; ++i) {
            try {
                inboxStyle.addLine(groupedMessages.getString(i));
            } catch (JSONException e) {
                Log.e(TAG, "Error parsing message at index " + i, e);
            }

        }

        builder
            .setGroup("myGroup") // TODO not sure this needs to be configurable
            .setStyle(inboxStyle);
    }


    // Notification click and cancel handlers:

    /**
     * Add the intent that handles the event when the notification is clicked (which should launch the app).
     */
    private static void applyTapReceiver(JSONObject options, NotificationCompat.Builder builder, Context context, int notificationID) {
        final Intent intent = new Intent(context, NotificationActionReceiver.class)
                .putExtra(NOTIFICATION_ID, notificationID)
                .putExtra("NOTIFICATION_LAUNCH", options.optBoolean("launch", true))
                .setAction(Action.CLICK_ACTION_ID)
                .setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        builder.setContentIntent(PendingIntent.getService(
            context,
            notificationID,
            intent,
            FLAG_UPDATE_CURRENT
        ));
    }

    /**
    * Add the intent that handles the delete event (which is fired when the X or 'clear all'
    * was pressed in the notification center).
    */
    private static void applyClearReceiver(NotificationCompat.Builder builder, Context context, int notificationID) {
        final Intent intent = new Intent(context, NotificationClearedReceiver.class)
            .putExtra(NOTIFICATION_ID, notificationID);

        builder.setDeleteIntent(PendingIntent.getBroadcast(
            context,
            notificationID,
            intent,
            FLAG_UPDATE_CURRENT
        ));
    }

    private static void applyActions(JSONObject options, NotificationCompat.Builder builder, Context context, int notificationID) {
        Action[] actions = getActions(options, context);

        if (actions == null || actions.length == 0) {
            return;
        }

        NotificationCompat.Action.Builder btn;
        for (Action action : actions) {
            btn = new NotificationCompat.Action.Builder(
                    action.getIcon(),
                    action.getTitle(),
                    getPendingIntentForAction(options, context, action, notificationID));

            if (action.isWithInput()) {
                Log.d(TAG, "applyActions, isWithInput");
                btn.addRemoteInput(action.getInput());
            } else {
                Log.d(TAG, "applyActions, not isWithInput");
            }

            builder.addAction(btn.build());
        }
    }

    private static Action[] getActions(JSONObject options, Context context) {
        Object value = options.opt("actions");
        String groupId = null;
        JSONArray actions = null;
        ActionGroup group = null;

        if (value instanceof String) {
            groupId = (String) value;
        } else if (value instanceof JSONArray) {
            actions = (JSONArray) value;
        }

        if (groupId != null) {
            group = ActionGroup.lookup(groupId);
        } else if (actions != null && actions.length() > 0) {
            group = ActionGroup.parse(context, actions);
        }

        return (group != null) ? group.getActions() : null;
    }

    private static PendingIntent getPendingIntentForAction(JSONObject options, Context context, Action action, int notificationID) {
        Log.d(TAG, "getPendingIntentForAction action.id " + action.getId() + ", action.isLaunchingApp(): " + action.isLaunchingApp());
        Intent intent = new Intent(context, NotificationActionReceiver.class)
                .putExtra(NOTIFICATION_ID, options.optInt("id", 0))
                // TODO see https://github.com/katzer/cordova-plugin-local-notifications/blob/ca1374325bb27ec983332d55dcb6975d929bca4b/src/android/notification/Builder.java#L396
                .putExtra("NOTIFICATION_LAUNCH", action.isLaunchingApp())
                .setAction(action.getId())
                .setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

        return PendingIntent.getService(context, notificationID, intent, FLAG_UPDATE_CURRENT);
    }

    // Utility methods:

    private static @Nullable Bitmap getBitmap(Context context, String src) {
        if (src.indexOf("res://") == 0) {
            final int resourceId = context.getResources().getIdentifier(src.substring(6), "drawable", context.getApplicationInfo().packageName);

            return resourceId == 0 ? null : android.graphics.BitmapFactory.decodeResource(context.getResources(), resourceId);
        } else if (src.indexOf("http") == 0) {
            try {
                return new DownloadFileFromUrl(src).execute().get();
            } catch (InterruptedException | ExecutionException e) {
                return null;
            }
        }

        return null;
    }

    private static boolean shouldEnableNotificationLed(JSONObject options) {
        return options.has("notificationLed");
    }

    private static int getLedColor(JSONObject options) {
        Object notificationLed = options.opt("notificationLed");

        if (Boolean.TRUE.equals(notificationLed)) {
            return DEFAULT_NOTIFICATION_COLOR;
        } else if (notificationLed instanceof Integer) {
            return (int) notificationLed;
        } else {
            Log.e(TAG, "Unable to parse option.notificationLed, using default notification color");
            return DEFAULT_NOTIFICATION_COLOR;
        }
    }
}


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/DownloadFileFromUrl.java
================================================
package com.telerik.localnotifications;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

class DownloadFileFromUrl extends AsyncTask<String, Void, Bitmap> {

  private static final String TAG = "DownloadFileFromUrl";

  private String imageUrl;

  DownloadFileFromUrl(final String imageUrl) {
    super();

    this.imageUrl = imageUrl;
  }

  @Override
  protected Bitmap doInBackground(String... strings) {
    try {
      HttpURLConnection connection = (HttpURLConnection) new URL(this.imageUrl).openConnection();
      connection.setDoInput(true);
      connection.connect();

      BitmapFactory.Options opts = new BitmapFactory.Options();
      opts.inJustDecodeBounds = false;

      InputStream is = connection.getInputStream();

      Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);

      try {
        is.close();
      } catch (IOException e) {
        Log.e(TAG, "Error closing image InputStream: " + e.getMessage(), e);
      }

      return bitmap;
    } catch (IOException e) {
      Log.d(TAG, "Error while loading image: " + e.getMessage(), e);
    }

    return null;
  }
}


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LifecycleCallbacks.java
================================================
package com.telerik.localnotifications;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.util.Log;

/**
 * Subscribe to the Pause and Resume activity events in order to toggle the plugin's status.
 */
public class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {

  private static LifecycleCallbacks callbacks = new LifecycleCallbacks();

  /**
   * Register for the application's events
   * @param app
   */
  public static void registerCallbacks(Application app) {
    if (app == null) {
      Log.d("LifecycleCallbacks", "The application is null, it's not passed correctly!");
      throw new RuntimeException("The application is null, it's not passed correctly!");
    }

    // clean up, not to leak and register it N times...
    Log.d("LifecycleCallbacks", "Unregistering the activity lifecycle callbacks...");
    app.unregisterActivityLifecycleCallbacks(callbacks);

    Log.d("LifecycleCallbacks", "Registering the activity lifecycle callbacks...");
    app.registerActivityLifecycleCallbacks(callbacks);
  }

  public void onActivityPaused(Activity activity) {
    Log.d(LocalNotificationsPlugin.TAG, "onActivityPaused: Application has been stopped.");

    // the application is being stopped -> the push plugin is not in active/foreground state anymore
    LocalNotificationsPlugin.isActive = false;
  }

  public void onActivityResumed(Activity activity) {
    Log.d(LocalNotificationsPlugin.TAG, "onActivityPaused: Application has been started");

    // the application has been resumed-> the push plugin is now in active/foreground state
    LocalNotificationsPlugin.isActive = true;
  }

  public void onActivityCreated(Activity activity, Bundle bundle) {
  }

  public void onActivityDestroyed(Activity activity) {
  }

  public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
  }

  public void onActivityStarted(Activity activity) {
  }

  public void onActivityStopped(Activity activity) {
  }
}

================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPlugin.java
================================================
package com.telerik.localnotifications;

import android.content.Context;
import android.util.Log;

import org.json.JSONObject;

public class LocalNotificationsPlugin {
  static final String TAG = "LocalNotifyPlugin";

  static boolean isActive = false;
  private static JSONObject cachedData;
  private static LocalNotificationsPluginListener onMessageReceivedCallback;
  private static LocalNotificationsPluginListener onMessageClearedCallback;
  private static LocalNotificationsPluginListener onMessageClickedCallback;
  /**
   * Set the on message received callback
   *
   * @param callbacks
   */
  public static void setOnMessageReceivedCallback(LocalNotificationsPluginListener callbacks) {
    onMessageReceivedCallback = callbacks;

    if (cachedData != null) {
      executeOnMessageReceivedCallback(cachedData);
      cachedData = null;
    }
  }

  /**
   * Execute the onMessageReceivedCallback with the data passed.
   * In case the callback is not present, cache the data;
   *
   * @param data
   */
  public static void executeOnMessageReceivedCallback(JSONObject data) {
    if (onMessageReceivedCallback != null) {
      Log.d(TAG, "Sending message to client");
      onMessageReceivedCallback.success(data);
    } else {
      Log.d(TAG, "No callback function - caching the data for later retrieval.");
      cachedData = data;
    }
  }

  /**
   * Set the on message clicked callback
   *
   * @param callbacks
   */
  public static void setOnMessageClickedCallback(LocalNotificationsPluginListener callbacks) {
    onMessageClickedCallback = callbacks;
  }

  /**
   * Execute the onMessageClickedCallback with the click on notification Message.
   * @param data
   */
  public static void executeOnMessageClickedCallback(JSONObject data) {
    if (onMessageClickedCallback != null) {
      onMessageClickedCallback.success(data);
    }
  }


  /**
   * Set the on message cleared callback
   *
   * @param callbacks
   */
  public static void setOnMessageClearedCallback(LocalNotificationsPluginListener callbacks) {
    onMessageClearedCallback = callbacks;
  }

  /**
   * Execute the onMessageClearedCallback with the data passed.
   * In case the callback is not present, cache the data;
   *
   * @param data
   */
  public static void executeOnMessageClearedCallback(JSONObject data) {
    if (onMessageClearedCallback != null) {
      onMessageClearedCallback.success(data);
    }
  }

  public static void scheduleNotification(JSONObject options, Context context) throws Exception {
    // Persist the options so that we can access them later to:
    // - Restore a notification after reboot.
    // - Create a notification after an alarm triggers (for recurrent or scheduled notifications).
    // - Pass them back to the notification clicked or notification cleared callbacks.
    //
    // This way we don't need to pass them around as extras in the Intents.

    Store.save(context, options);

    // Display or schedule the notification, depending on the options:
    // If there's already a notification with the same ID, the intent flags should take care of updating all the
    // intents but the alarm one, which would be cancelled and rescheduled.

    NotificationRestoreReceiver.scheduleNotification(options, context);
  }
}





================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPluginListener.java
================================================
package com.telerik.localnotifications;

/**
 * Defines methods for Success and Error callbacks
 */
public interface LocalNotificationsPluginListener {
    /**
     * Defines a success callback method, which is used to pass success function reference
     * from the nativescript to the Java plugin
     *
     * @param data
     */
    void success(Object data);


    /**
     * Defines a error callback method, which is used to pass error function reference
     * from the nativescript to the Java plugin
     *
     * @param data
     */
    void error(Object data);
}


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationActionReceiver.java
================================================
package com.telerik.localnotifications;

import android.app.IntentService;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.RemoteInput;

import org.json.JSONException;
import org.json.JSONObject;

import static com.telerik.localnotifications.Action.CLICK_ACTION_ID;

/**
 * IntentService which is an entry point, whenever a notification from the bar is tapped and executed.
 * The activity fires, notifies the callback.
 */
public class NotificationActionReceiver extends IntentService {
  private static String TAG = "NotificationActionReceiver";

  // Hold a reference to the intent to handle.
  private Intent intent;

  public NotificationActionReceiver() {
    super("NotificationActionReceiver");
  }

  @Override
  protected void onHandleIntent(@Nullable Intent intent) {
    this.intent = intent;

    if (intent == null) {
      return;
    }

    Bundle bundle = intent.getExtras();

    if (bundle == null) {
      return;
    }

    try {
      final JSONObject jsonData = new JSONObject();
      jsonData.put("event", Builder.NOTIFICATION_ID);
      LocalNotificationsPlugin.executeOnMessageClickedCallback(jsonData);

      onClick(intent.getAction(), bundle);
    } catch (JSONException e) {
      Log.e(TAG, e.getMessage(), e);
    }
  }

  private void onClick(String action, Bundle bundle) throws JSONException {
    final Context context = getApplicationContext();

    // Note that for the non-default action this will be empty:
    final JSONObject opts = Store.get(context, bundle.getInt(Builder.NOTIFICATION_ID), false);

    boolean isAppActive = LocalNotificationsPlugin.isActive;
    boolean doLaunch = intent.getBooleanExtra("NOTIFICATION_LAUNCH", true);

    Log.d(TAG, "doLaunch = " + doLaunch);

    if (!isAppActive && doLaunch) {
      forceMainActivityReload();
    }

    if (setTextInput(action, opts)) {
      opts.put("event", "input");
    } else if (!CLICK_ACTION_ID.equals(action)) {
      opts.put("event", "button");
      opts.put("response", action);
    } else {
      opts.put("event", "default");
    }

    opts.put("foreground", isAppActive);
    // opts.put("coldstart", !isPluginActive);

    LocalNotificationsPlugin.executeOnMessageReceivedCallback(opts);

    if (opts.has("id") && !opts.optBoolean("ongoing", false) && opts.optInt("repeatInterval", 0) == 0) {
      int id = opts.getInt("id");

      // Clear the notification from the tray, unless it's marker as ongoing/sticky:
      ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)).cancel(id);

      // And also unpersist it:
      Store.remove(context, id);
    }
  }

  private boolean setTextInput(String action, JSONObject data) throws JSONException {
    Bundle input = RemoteInput.getResultsFromIntent(intent);
    if (input != null) {
      data.put("response", input.getCharSequence(action));
      return true;
    }
    return false;
  }

  private void forceMainActivityReload() {
    PackageManager pm = getPackageManager();
    Intent launchIntent = pm.getLaunchIntentForPackage(getApplicationContext().getPackageName());
    Log.d(TAG, "starting activity for package: " + getApplicationContext().getPackageName());
    launchIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(launchIntent);
  }
}

================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationAlarmReceiver.java
================================================
package com.telerik.localnotifications;

import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import org.json.JSONObject;

public class NotificationAlarmReceiver extends BroadcastReceiver {

  private static final String TAG = "NotificationAlarmRcvr";

  public void onReceive(Context context, Intent intent) {
    final int id = intent.getIntExtra(Builder.NOTIFICATION_ID, 0);
    final JSONObject opts = Store.get(context, id);

    if (opts == null) {
      Log.e(TAG, "Notification could not be restored, options are null");

      return;
    }

    // Create the notification:

    try {
      ((NotificationManager) context
        .getSystemService(Context.NOTIFICATION_SERVICE))
        .notify(id, Builder.build(opts, context, id));
    } catch (Throwable t) {
      Log.e(TAG, "Notification could not be restored!" + t.getMessage(), t);
    }

    // Note we don't unpersist this notification just yet, as it might still need to be restored
    // after a reboot.
  }
}


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationClearedReceiver.java
================================================
package com.telerik.localnotifications;

import android.content.Context;
import android.content.Intent;

import android.content.BroadcastReceiver;
import androidx.annotation.Nullable;

import org.json.JSONObject;

public class NotificationClearedReceiver extends BroadcastReceiver {
  private static String TAG = "NotificationClearedReceiver";

  /**
   * Called when the notification is cleared from the notification center.
   *
   * @param context Application context
   * @param intent  Received intent with notification ID
   */
  @Override
  public void onReceive(Context context, @Nullable Intent intent) {
    if (intent == null || !intent.hasExtra(Builder.NOTIFICATION_ID)) {
      return;
    }

    // Default value not used as above check ensures we have an actual value:
    final int id = intent.getIntExtra(Builder.NOTIFICATION_ID, 0);
    final JSONObject opts = Store.get(context, id);

    if (opts != null) {
      if (opts.optInt("repeatInterval", 0) == 0) {
        // Remove the persisted notification data if it's not repeating:
        Store.remove(context, id);
      }

      LocalNotificationsPlugin.executeOnMessageClearedCallback(opts);
    }
  }
}

================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationRestoreReceiver.java
================================================
package com.telerik.localnotifications;

import android.app.AlarmManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import java.util.Date;
import java.util.Map;

import org.json.JSONException;
import org.json.JSONObject;

/**
 * Notifications need to be restored when the device is rebooted,
 * that's what's this class is for.
 */
public class NotificationRestoreReceiver extends BroadcastReceiver {

  private static final String TAG = "NotifyRestoreReceiver";

  @Override
  public void onReceive(Context context, Intent intent) {
    if (context == null || !Intent.ACTION_BOOT_COMPLETED.equalsIgnoreCase(intent.getAction())) {
      return;
    }

    try {
      for (Map.Entry<String, String> entry : Store.getAll(context).entrySet()) {
        final String notificationString = entry.getValue();

        Log.e(TAG, "Will restore previously scheduled notification: " + notificationString);

        scheduleNotification(new JSONObject(notificationString), context);
      }
    } catch (IllegalStateException | JSONException e) {
      Log.e(TAG, "Notification could not be scheduled! " + e.getMessage(), e);
    }
  }

  static void scheduleNotification(JSONObject options, Context context) {

    // We might create the notification IMMEDIATELY:

    // If no ID is provided, we automatically assign different IDs so that all notifications are persisted:
    final int notificationID = options.optInt("id", 0);
    final long triggerTime = options.optLong("atTime", 0);

    if (triggerTime == 0) {
      // If we just want to show the notification immediately, there's no need to create an Intent,
      // we just send the notification to the Notification Service:
      ((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE)).notify(
          notificationID, com.telerik.localnotifications.Builder.build(options, context, notificationID)
      );

      return;
    }

    // Check if the notification has EXPIRED:

    final long interval = options.optLong("repeatInterval", 0); // in ms
    final Date triggerDate = new Date(triggerTime);

    if (interval == 0 && new Date().after(triggerDate)) {
      Store.remove(context, notificationID);

      return;
    }

    // Or SCHEDULE it for later:

    final AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    try {
      final Intent notificationIntent = new Intent(context, NotificationAlarmReceiver.class)
          .setAction(options.getString("id"))
          .putExtra(Builder.NOTIFICATION_ID, notificationID);

      final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

      if (interval > 0) {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, triggerTime, interval, pendingIntent);
      } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
      }
    } catch (Exception e) {
      Log.e(TAG, "Notification could not be scheduled!" + e.getMessage(), e);
    }
  }
}


================================================
FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Store.java
================================================
package com.telerik.localnotifications;

import android.content.Context;
import androidx.annotation.Nullable;
import android.util.Log;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Map;

public final class Store {

    private static final String TAG = "Store";
    private static final String SHARED_PREFERENCES_KEY = "LocalNotificationsPlugin";

    public static @Nullable JSONObject get(Context context, int id) {
        return get(context, id, true);
    }

    public static @Nullable JSONObject get(Context context, int id, boolean nullable) {
        try {
            return new JSONObject(context
                .getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE)
                .getString(String.valueOf(id), ""));
        } catch (JSONException e) {
            Log.e(TAG, "Error parsing options" + e.getMessage(), e);
        }

        return nullable ? null : new JSONObject();
    }

    public static Map<String, String> getAll(Context context) {
        return (Map<String, String>) context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE).getAll();
    }

    public static String[] getKeys(Context context) {
        return getAll(context).keySet().toArray(new String[0]);
    }

    public static void save(Context context, JSONObject opts) {
        save(context, opts.optInt("id", 0), opts);
    }

    public static void save(Context context, int id, String opts) {
        try {
            save(context, id, new JSONObject(opts));
        } catch (JSONException e) {
            Log.e(TAG, "Error saving options" + e.getMessage(), e);
        }
    }

    public static void save(Context context, int id, JSONObject opts) {
        context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE).edit().putString(String.valueOf(id), opts.toString()).apply();
    }

    public static void remove(Context context, int id) {
        context.getSharedPreferences(SHARED_PREFERENCES_KEY, Context.MODE_PRIVATE).edit().remove(String.valueOf(id)).apply();
    }
}


================================================
FILE: native-src/android/app/src/main/res/values/strings.xml
================================================
<resources>
  <string name="app_name">locnotplugin</string>
</resources>


================================================
FILE: native-src/android/build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://maven.google.com" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: native-src/android/gradle/wrapper/gradle-wrapper.properties
================================================
#Thu Jul 04 12:57:28 CEST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip


================================================
FILE: native-src/android/gradle.properties
================================================
# Project-wide Gradle settings.

# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
android.enableJetifier=true
android.useAndroidX=true

================================================
FILE: native-src/android/gradlew
================================================
#!/usr/bin/env bash

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""

APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`

# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"

warn ( ) {
    echo "$*"
}

die ( ) {
    echo
    echo "$*"
    echo
    exit 1
}

# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
  CYGWIN* )
    cygwin=true
    ;;
  Darwin* )
    darwin=true
    ;;
  MINGW* )
    msys=true
    ;;
esac

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null

CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar

# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
        # IBM's JDK on AIX uses strange locations for the executables
        JAVACMD="$JAVA_HOME/jre/sh/java"
    else
        JAVACMD="$JAVA_HOME/bin/java"
    fi
    if [ ! -x "$JAVACMD" ] ; then
        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
    fi
else
    JAVACMD="java"
    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi

# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
    MAX_FD_LIMIT=`ulimit -H -n`
    if [ $? -eq 0 ] ; then
        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
            MAX_FD="$MAX_FD_LIMIT"
        fi
        ulimit -n $MAX_FD
        if [ $? -ne 0 ] ; then
            warn "Could not set maximum file descriptor limit: $MAX_FD"
        fi
    else
        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    fi
fi

# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi

# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    JAVACMD=`cygpath --unix "$JAVACMD"`

    # We build the pattern for arguments to be converted via cygpath
    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    SEP=""
    for dir in $ROOTDIRSRAW ; do
        ROOTDIRS="$ROOTDIRS$SEP$dir"
        SEP="|"
    done
    OURCYGPATTERN="(^($ROOTDIRS))"
    # Add a user-defined pattern to the cygpath arguments
    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    fi
    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    i=0
    for arg in "$@" ; do
        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option

        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
        else
            eval `echo args$i`="\"$arg\""
        fi
        i=$((i+1))
    done
    case $i in
        (0) set -- ;;
        (1) set -- "$args0" ;;
        (2) set -- "$args0" "$args1" ;;
        (3) set -- "$args0" "$args1" "$args2" ;;
        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    esac
fi

# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
    JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"

exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"


================================================
FILE: native-src/android/gradlew.bat
================================================
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem  Gradle startup script for Windows
@rem
@rem ##########################################################################

@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal

@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=

set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%

@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome

set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init

echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

if exist "%JAVA_EXE%" goto init

echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.

goto fail

:init
@rem Get command-line arguments, handling Windowz variants

if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args

:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2

:win9xME_args_slurp
if "x%~1" == "x" goto execute

set CMD_LINE_ARGS=%*
goto execute

:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line

set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd

:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1

:mainEnd
if "%OS%"=="Windows_NT" endlocal

:omega


================================================
FILE: native-src/android/locnotplugin.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="pushplugin" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="java-gradle" name="Java-Gradle">
      <configuration>
        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
        <option name="BUILDABLE" value="false" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

================================================
FILE: native-src/android/settings.gradle
================================================
include ':app'


================================================
FILE: native-src/ios/.gitattributes
================================================
* -crlf

================================================
FILE: native-src/ios/.gitignore
================================================
build/
xcuserdata/

================================================
FILE: native-src/ios/LocalNotificationsPlugin/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>FMWK</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>$(CURRENT_PROJECT_VERSION)</string>
	<key>NSPrincipalClass</key>
	<string></string>
</dict>
</plist>


================================================
FILE: native-src/ios/LocalNotificationsPlugin/LocalNotificationsPlugin.h
================================================
#import <UIKit/UIKit.h>

//! Project version number for LocalNotificationsPlugin.
FOUNDATION_EXPORT double LocalNotificationsVersionNumber;

//! Project version string for LocalNotificationsPlugin.
FOUNDATION_EXPORT const unsigned char LocalNotificationsPluginVersionString[];

// In this header, you should import all the public headers of your framework
#import <Notification.h>
#import <NotificationManager.h>

================================================
FILE: native-src/ios/LocalNotificationsPlugin/Notification.h
================================================
#import <Foundation/Foundation.h>
#import <UIKit/UIApplication.h>

@interface Notification : NSObject <UIApplicationDelegate>
{
    UILocalNotification *notificationMessage;
    BOOL isInline;
}

@property (nonatomic, strong) UILocalNotification *notificationMessage;
@property BOOL isInline;
@property (nonatomic, retain) UILocalNotification *launchNotification;

+ (instancetype)sharedInstance;

//-(void)register:(NSMutableDictionary *)options;
//-(void)registerUserNotificationSettings:(NSDictionary*)options;
-(void)setApplicationIconBadgeNumber:(NSMutableDictionary *)options;
-(void)didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings;
-(void)notificationReceived;
-(void)success:(NSString *)eventName WithMessage:(NSString *)message;
-(void)success:(NSString *)eventName WithDictionary:(NSMutableDictionary *)userInfo;
-(void)fail:(NSString *)eventName WithMessage:(NSString *)message withError:(NSError *)error;
@end


================================================
FILE: native-src/ios/LocalNotificationsPlugin/Notification.m
================================================
#import "Notification.h"
#import <UIKit/UIKit.h>
#import <UIKit/UIUserNotificationSettings.h>
#import <objc/runtime.h>

const NSString * badgeKey = @"badge";
const NSString * soundKey = @"sound";
const NSString * alertKey = @"alert";
static NSString * didRegisterUserNotificationsEventName = @"didRegisterUserNotificationSettings";
const NSString * notificationReceivedEventName = @"notificationReceived";
const NSString * setBadgeNumberEventName = @"setApplicationIconBadgeNumber";
const NSString * didRegisterUserNotificationSettingsEventName = @"didRegisterUserNotificationSettings";
const NSString * failToRegisterUserNotificationSettingsEventName = @"failToRegisterUserNotificationSettings";

static char launchNotificationKey;

@implementation Notification

@synthesize notificationMessage;
@synthesize isInline;

+ (instancetype)sharedInstance
{
    static Notification *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[Notification alloc] init];
    });
    return sharedInstance;
}

/*
-(void)register:(NSMutableDictionary *)options
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    UIUserNotificationType UserNotificationTypes = UIUserNotificationTypeNone;
    if([self isTrue: badgeKey fromOptions: options]) UserNotificationTypes |= UIUserNotificationTypeBadge;
    if([self isTrue: soundKey fromOptions: options]) UserNotificationTypes |= UIUserNotificationTypeSound;
    if([self isTrue: alertKey fromOptions: options]) UserNotificationTypes |= UIUserNotificationTypeAlert;
#endif
    UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeNone;
    notificationTypes |= UIRemoteNotificationTypeNewsstandContentAvailability;
    
    if([self isTrue: badgeKey fromOptions: options]) notificationTypes |= UIRemoteNotificationTypeBadge;
    if([self isTrue: soundKey fromOptions: options]) notificationTypes |= UIRemoteNotificationTypeSound;
    if([self isTrue: alertKey fromOptions: options]) notificationTypes |= UIRemoteNotificationTypeAlert;

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    UserNotificationTypes |= UIUserNotificationActivationModeBackground;
#endif
    
    if (notificationTypes == UIRemoteNotificationTypeNone)
        NSLog(@"LocalNotificationsPlugin.register: Notification type is set to none");
    
    isInline = NO;
    
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if ([[UIApplication sharedApplication]respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UserNotificationTypes categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
    }
#else
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:notificationTypes];
#endif

    [self notificationReceived];
}
*/

- (BOOL)isTrue:(NSString *)key fromOptions:(NSMutableDictionary *)options
{
    id arg = [options objectForKey:key];
    
    if([arg isKindOfClass:[NSString class]]) return [arg isEqualToString:@"true"];

    if([arg boolValue]) return true;
    
    return false;
}

- (void)didRegisterUserNotificationSettings:(UIUserNotificationSettings *)settings
{
    UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound;
    bool ok = settings.types & types;
    [self success:didRegisterUserNotificationsEventName WithMessage:[NSString stringWithFormat:@"%@", ok ? @"true" : @"false"]];
}

- (void)notificationReceived
{
    if (self.notificationMessage)
    {
       NSMutableString *jsonStr = [NSMutableString stringWithString:@"{"];
        
        if (self.notificationMessage.userInfo != nil) {
            [self parseDictionary:self.notificationMessage.userInfo intoJSON:jsonStr];
        }

        if (isInline) {
            [jsonStr appendFormat:@"\"foreground\":true"];
            isInline = NO;
        } else {
            [jsonStr appendFormat:@"\"foreground\":false"];
        }
        
        [jsonStr appendString:@"}"];
        [self success:notificationReceivedEventName WithMessage:jsonStr];
        self.notificationMessage = nil;
    }
}

-(void)parseDictionary:(NSDictionary *)inDictionary intoJSON:(NSMutableString *)jsonString
{
    NSArray         *keys = [inDictionary allKeys];
    NSString        *key;
    
    for (key in keys)
    {
        id thisObject = [inDictionary objectForKey:key];
        
        if ([thisObject isKindOfClass:[NSDictionary class]])
            [self parseDictionary:thisObject intoJSON:jsonString];
        else if ([thisObject isKindOfClass:[NSString class]])
            [jsonString appendFormat:@"\"%@\":\"%@\",",
             key,
             [[[[inDictionary objectForKey:key]
                stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]
               stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]
              stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]];
        else {
            [jsonString appendFormat:@"\"%@\":\"%@\",", key, [inDictionary objectForKey:key]];
        }
    }
}

- (void)setApplicationIconBadgeNumber:(NSMutableDictionary *)options
{
    int badge = [[options objectForKey:badgeKey] intValue] ?: 0;
    
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:badge];
    
    [self success:setBadgeNumberEventName WithMessage:[NSString stringWithFormat:@"app badge count set to %d", badge]];
}

/*
- (void)registerUserNotificationSettings:(NSDictionary*)options
{
    NSLog(@"--- in registerUserNotificationSettings");

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if (![[UIApplication sharedApplication]respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        [self success:didRegisterUserNotificationSettingsEventName WithMessage:[NSString stringWithFormat:@"%@", @"user notifications not supported for this ios version."]];
        return;
    }
    
    NSArray *categories = [options objectForKey:@"categories"];
    if (categories == nil) {
        [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:@"No categories specified" withError:nil];
        return;
    }
    NSMutableArray *nsCategories = [[NSMutableArray alloc] initWithCapacity:[categories count]];
    
    for (NSDictionary *category in categories) {
        // ** 1. create the actions for this category
        NSMutableArray *nsActionsForDefaultContext = [[NSMutableArray alloc] initWithCapacity:4];
        NSArray *actionsForDefaultContext = [category objectForKey:@"actionsForDefaultContext"];
        if (actionsForDefaultContext == nil) {
            [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:@"Category doesn't contain actionsForDefaultContext" withError:nil];
            return;
        }
        if (![self createNotificationAction:category actions:actionsForDefaultContext nsActions:nsActionsForDefaultContext]) {
            return;
        }
        
        NSMutableArray *nsActionsForMinimalContext = [[NSMutableArray alloc] initWithCapacity:2];
        NSArray *actionsForMinimalContext = [category objectForKey:@"actionsForMinimalContext"];
        if (actionsForMinimalContext == nil) {
            [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:@"Category doesn't contain actionsForMinimalContext" withError:nil];
            return;
        }
        if (![self createNotificationAction:category actions:actionsForMinimalContext nsActions:nsActionsForMinimalContext]) {
            return;
        }
        
        // ** 2. create the category
        UIMutableUserNotificationCategory *nsCategory = [[UIMutableUserNotificationCategory alloc] init];
        // Identifier to include in your push payload and local notification
        NSString *identifier = [category objectForKey:@"identifier"];
        if (identifier == nil) {
            [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:@"Category doesn't contain identifier" withError:nil];
            return;
        }
        nsCategory.identifier = identifier;
        // Add the actions to the category and set the action context
        [nsCategory setActions:nsActionsForDefaultContext forContext:UIUserNotificationActionContextDefault];
        // Set the actions to present in a minimal context
        [nsCategory setActions:nsActionsForMinimalContext forContext:UIUserNotificationActionContextMinimal];
        [nsCategories addObject:nsCategory];
    }
    
    // ** 3. Determine the notification types
    NSArray *types = [options objectForKey:@"types"];
    if (types == nil) {
        [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:@"No types specified" withError:nil];
        return;
    }
    UIUserNotificationType nsTypes = UIUserNotificationTypeNone;
    for (NSString *type in types) {
        if ([type isEqualToString:badgeKey]) {
            nsTypes |= UIUserNotificationTypeBadge;
        } else if ([type isEqualToString:alertKey]) {
            nsTypes |= UIUserNotificationTypeAlert;
        } else if ([type isEqualToString:soundKey]) {
            nsTypes |= UIUserNotificationTypeSound;
        } else {
            [self fail:failToRegisterUserNotificationSettingsEventName WithMessage:[NSString stringWithFormat:@"Unsupported type: %@, use one of badge, alert, sound", type] withError:nil];
        }
    }
    
    // ** 4. Register the notification categories
    NSSet *nsCategorySet = [NSSet setWithArray:nsCategories];
    
    
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:nsTypes categories:nsCategorySet];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];

    UIUserNotificationSettings *settings = [[UIApplication sharedApplication] currentUserNotificationSettings];
    UIUserNotificationType types = settings.types|UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
    settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    
#endif
    [self success:didRegisterUserNotificationSettingsEventName
      WithMessage:[NSString stringWithFormat:@"%@", @"user notifications registered!"]];

//    [self checkPendingNotification];
}
*/

/*
-(void)checkPendingNotification {
    if (notificationMessage) {
        NSLog(@"--- in checkPendingNotification, notificationMessage");
        [self notificationReceived];
    } else if (self.launchN
Download .txt
gitextract_jbw4v8s9/

├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── demo/
│   ├── app/
│   │   ├── App_Resources/
│   │   │   ├── Android/
│   │   │   │   ├── app.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── res/
│   │   │   │               ├── drawable-nodpi/
│   │   │   │               │   └── splash_screen.xml
│   │   │   │               ├── values/
│   │   │   │               │   ├── colors.xml
│   │   │   │               │   └── styles.xml
│   │   │   │               └── values-v21/
│   │   │   │                   ├── colors.xml
│   │   │   │                   └── styles.xml
│   │   │   └── iOS/
│   │   │       ├── Assets.xcassets/
│   │   │       │   ├── AppIcon.appiconset/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── Contents.json
│   │   │       │   ├── LaunchImage.launchimage/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │   │       │   │   └── Contents.json
│   │   │       │   └── LaunchScreen.Center.imageset/
│   │   │       │       └── Contents.json
│   │   │       ├── Info.plist
│   │   │       ├── LaunchScreen.storyboard
│   │   │       └── build.xcconfig
│   │   ├── README.md
│   │   ├── app-root.xml
│   │   ├── app.css
│   │   ├── app.ts
│   │   ├── bundle-config.ts
│   │   ├── main-page.ts
│   │   ├── main-page.xml
│   │   ├── main-view-model.ts
│   │   └── package.json
│   ├── package.json
│   ├── references.d.ts
│   ├── tsconfig.json
│   └── tsconfig.tns.json
├── demo-ng/
│   ├── App_Resources/
│   │   ├── Android/
│   │   │   ├── app.gradle
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           └── res/
│   │   │               ├── drawable-nodpi/
│   │   │               │   └── splash_screen.xml
│   │   │               ├── values/
│   │   │               │   ├── colors.xml
│   │   │               │   └── styles.xml
│   │   │               └── values-v21/
│   │   │                   ├── colors.xml
│   │   │                   └── styles.xml
│   │   └── iOS/
│   │       ├── Assets.xcassets/
│   │       │   ├── AppIcon.appiconset/
│   │       │   │   └── Contents.json
│   │       │   ├── Contents.json
│   │       │   ├── LaunchImage.launchimage/
│   │       │   │   └── Contents.json
│   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │       │   │   └── Contents.json
│   │       │   └── LaunchScreen.Center.imageset/
│   │       │       └── Contents.json
│   │       ├── Info.plist
│   │       ├── LaunchScreen.storyboard
│   │       └── build.xcconfig
│   ├── README.md
│   ├── angular.json
│   ├── nsconfig.json
│   ├── package.json
│   ├── references.d.ts
│   ├── src/
│   │   ├── app/
│   │   │   ├── app-routing.module.ts
│   │   │   ├── app.component.html
│   │   │   ├── app.component.ts
│   │   │   ├── app.module.ts
│   │   │   └── item/
│   │   │       ├── items.component.html
│   │   │       └── items.component.ts
│   │   ├── app.css
│   │   ├── main.ts
│   │   └── package.json
│   ├── tsconfig.json
│   └── tsconfig.tns.json
├── demo-vue/
│   ├── .gitignore
│   ├── README.md
│   ├── app/
│   │   ├── App_Resources/
│   │   │   ├── Android/
│   │   │   │   ├── app.gradle
│   │   │   │   └── src/
│   │   │   │       └── main/
│   │   │   │           ├── AndroidManifest.xml
│   │   │   │           └── res/
│   │   │   │               ├── drawable-nodpi/
│   │   │   │               │   └── splash_screen.xml
│   │   │   │               ├── values/
│   │   │   │               │   ├── colors.xml
│   │   │   │               │   ├── strings.xml
│   │   │   │               │   └── styles.xml
│   │   │   │               └── values-v21/
│   │   │   │                   ├── colors.xml
│   │   │   │                   ├── strings.xml
│   │   │   │                   └── styles.xml
│   │   │   └── iOS/
│   │   │       ├── Assets.xcassets/
│   │   │       │   ├── AppIcon.appiconset/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── Contents.json
│   │   │       │   ├── LaunchImage.launchimage/
│   │   │       │   │   └── Contents.json
│   │   │       │   ├── LaunchScreen.AspectFill.imageset/
│   │   │       │   │   └── Contents.json
│   │   │       │   └── LaunchScreen.Center.imageset/
│   │   │       │       └── Contents.json
│   │   │       ├── Info.plist
│   │   │       ├── LaunchScreen.storyboard
│   │   │       └── build.xcconfig
│   │   ├── app.scss
│   │   ├── components/
│   │   │   └── App.vue
│   │   ├── fonts/
│   │   │   └── .gitkeep
│   │   ├── main.js
│   │   └── package.json
│   └── package.json
├── native-src/
│   ├── android/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── android.iml
│   │   ├── app/
│   │   │   ├── .gitignore
│   │   │   ├── app.iml
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── telerik/
│   │   │           │           └── localnotifications/
│   │   │           │               ├── Action.java
│   │   │           │               ├── ActionGroup.java
│   │   │           │               ├── Builder.java
│   │   │           │               ├── DownloadFileFromUrl.java
│   │   │           │               ├── LifecycleCallbacks.java
│   │   │           │               ├── LocalNotificationsPlugin.java
│   │   │           │               ├── LocalNotificationsPluginListener.java
│   │   │           │               ├── NotificationActionReceiver.java
│   │   │           │               ├── NotificationAlarmReceiver.java
│   │   │           │               ├── NotificationClearedReceiver.java
│   │   │           │               ├── NotificationRestoreReceiver.java
│   │   │           │               └── Store.java
│   │   │           └── res/
│   │   │               └── values/
│   │   │                   └── strings.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── locnotplugin.iml
│   │   └── settings.gradle
│   └── ios/
│       ├── .gitattributes
│       ├── .gitignore
│       ├── LocalNotificationsPlugin/
│       │   ├── Info.plist
│       │   ├── LocalNotificationsPlugin.h
│       │   ├── Notification.h
│       │   ├── Notification.m
│       │   ├── NotificationManager.h
│       │   └── NotificationManager.m
│       ├── LocalNotificationsPlugin.xcodeproj/
│       │   ├── project.pbxproj
│       │   └── project.xcworkspace/
│       │       ├── contents.xcworkspacedata
│       │       └── xcshareddata/
│       │           └── PushPlugin.xccheckout
│       └── README.md
├── publish/
│   ├── pack.sh
│   ├── package.json
│   └── publish.sh
├── src/
│   ├── .npmignore
│   ├── index.d.ts
│   ├── local-notifications-common.ts
│   ├── local-notifications.android.ts
│   ├── local-notifications.ios.ts
│   ├── package.json
│   ├── platforms/
│   │   ├── android/
│   │   │   └── app-release.aar
│   │   └── ios/
│   │       ├── LocalNotificationsPlugin.framework/
│   │       │   ├── Headers/
│   │       │   │   ├── LocalNotificationsPlugin.h
│   │       │   │   ├── Notification.h
│   │       │   │   └── NotificationManager.h
│   │       │   ├── Info.plist
│   │       │   ├── LocalNotificationsPlugin
│   │       │   └── Modules/
│   │       │       └── module.modulemap
│   │       └── typings/
│   │           └── objc!LocalNotificationsPlugin.d.ts
│   ├── references.d.ts
│   └── tsconfig.json
└── tslint.json
Download .txt
SYMBOL INDEX (153 symbols across 24 files)

FILE: demo-ng/src/app/app-routing.module.ts
  class AppRoutingModule (line 16) | class AppRoutingModule {

FILE: demo-ng/src/app/app.component.ts
  class AppComponent (line 8) | class AppComponent { }

FILE: demo-ng/src/app/app.module.ts
  class AppModule (line 32) | class AppModule {

FILE: demo-ng/src/app/item/items.component.ts
  class ItemsComponent (line 9) | class ItemsComponent {
    method constructor (line 11) | constructor() {
    method schedule (line 17) | schedule(): void {

FILE: demo/app/main-page.ts
  function navigatingTo (line 5) | function navigatingTo(args: EventData) {

FILE: demo/app/main-view-model.ts
  class HelloWorldModel (line 7) | class HelloWorldModel extends Observable {
    method constructor (line 11) | constructor() {
    method doCheckHasPermission (line 19) | public doCheckHasPermission(): void {
    method doRequestPermission (line 30) | public doRequestPermission(): void {
    method doScheduleWithButtons (line 41) | public doScheduleWithButtons(): void {
    method doScheduleNoSound (line 87) | public doScheduleNoSound(): void {
    method doScheduleAndSetBadgeNumber (line 112) | public doScheduleAndSetBadgeNumber(): void {
    method doScheduleId4GroupedWithCustomIcon (line 134) | public doScheduleId4GroupedWithCustomIcon(): void {
    method doScheduleId5WithInput (line 156) | public doScheduleId5WithInput(): void {
    method doScheduleEveryMinute (line 188) | public doScheduleEveryMinute(): void {
    method doScheduleMultiple (line 210) | public doScheduleMultiple(): void {
    method doGetScheduledIds (line 247) | public doGetScheduledIds(): void {
    method doCancelAll (line 259) | public doCancelAll(): void {
    method doCancelId6 (line 270) | public doCancelId6(): void {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Action.java
  class Action (line 19) | public final class Action {
    method Action (line 37) | Action(Context context, JSONObject options) {
    method getId (line 45) | public String getId() {
    method getTitle (line 52) | public String getTitle() {
    method getIcon (line 59) | public int getIcon() {
    method isLaunchingApp (line 78) | public boolean isLaunchingApp() {
    method isWithInput (line 85) | public boolean isWithInput() {
    method getInput (line 93) | public RemoteInput getInput() {
    method getChoices (line 104) | private String[] getChoices() {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/ActionGroup.java
  class ActionGroup (line 17) | public final class ActionGroup {
    method lookup (line 34) | public static ActionGroup lookup(String id) {
    method register (line 43) | public static void register(ActionGroup group) {
    method unregister (line 52) | public static void unregister(String id) {
    method isRegistered (line 61) | public static boolean isRegistered(String id) {
    method parse (line 71) | public static ActionGroup parse(Context context, JSONArray list) {
    method parse (line 82) | public static ActionGroup parse(Context context, String id, JSONArray ...
    method ActionGroup (line 111) | private ActionGroup(String id, Action[] actions) {
    method getId (line 119) | public String getId() {
    method getActions (line 126) | public Action[] getActions() {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Builder.java
  class Builder (line 23) | public final class Builder {
    method build (line 36) | static Notification build(JSONObject options, Context context, int not...
    method build (line 41) | static Notification build(JSONObject options, Context context, int not...
    method applyNotificationLed (line 98) | private static void applyNotificationLed(JSONObject options, Notificat...
    method applyStyle (line 104) | private static void applyStyle(JSONObject options, NotificationCompat....
    method applyImage (line 114) | private static void applyImage(JSONObject options, NotificationCompat....
    method applyBigTextStyle (line 134) | private static void applyBigTextStyle(JSONObject options, Notification...
    method applyGroup (line 144) | private static void applyGroup(JSONObject options, NotificationCompat....
    method applyTapReceiver (line 180) | private static void applyTapReceiver(JSONObject options, NotificationC...
    method applyClearReceiver (line 199) | private static void applyClearReceiver(NotificationCompat.Builder buil...
    method applyActions (line 211) | private static void applyActions(JSONObject options, NotificationCompa...
    method getActions (line 236) | private static Action[] getActions(JSONObject options, Context context) {
    method getPendingIntentForAction (line 257) | private static PendingIntent getPendingIntentForAction(JSONObject opti...
    method getBitmap (line 271) | private static @Nullable Bitmap getBitmap(Context context, String src) {
    method shouldEnableNotificationLed (line 287) | private static boolean shouldEnableNotificationLed(JSONObject options) {
    method getLedColor (line 291) | private static int getLedColor(JSONObject options) {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/DownloadFileFromUrl.java
  class DownloadFileFromUrl (line 13) | class DownloadFileFromUrl extends AsyncTask<String, Void, Bitmap> {
    method DownloadFileFromUrl (line 19) | DownloadFileFromUrl(final String imageUrl) {
    method doInBackground (line 25) | @Override

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LifecycleCallbacks.java
  class LifecycleCallbacks (line 11) | public class LifecycleCallbacks implements Application.ActivityLifecycle...
    method registerCallbacks (line 19) | public static void registerCallbacks(Application app) {
    method onActivityPaused (line 33) | public void onActivityPaused(Activity activity) {
    method onActivityResumed (line 40) | public void onActivityResumed(Activity activity) {
    method onActivityCreated (line 47) | public void onActivityCreated(Activity activity, Bundle bundle) {
    method onActivityDestroyed (line 50) | public void onActivityDestroyed(Activity activity) {
    method onActivitySaveInstanceState (line 53) | public void onActivitySaveInstanceState(Activity activity, Bundle outS...
    method onActivityStarted (line 56) | public void onActivityStarted(Activity activity) {
    method onActivityStopped (line 59) | public void onActivityStopped(Activity activity) {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPlugin.java
  class LocalNotificationsPlugin (line 8) | public class LocalNotificationsPlugin {
    method setOnMessageReceivedCallback (line 21) | public static void setOnMessageReceivedCallback(LocalNotificationsPlug...
    method executeOnMessageReceivedCallback (line 36) | public static void executeOnMessageReceivedCallback(JSONObject data) {
    method setOnMessageClickedCallback (line 51) | public static void setOnMessageClickedCallback(LocalNotificationsPlugi...
    method executeOnMessageClickedCallback (line 59) | public static void executeOnMessageClickedCallback(JSONObject data) {
    method setOnMessageClearedCallback (line 71) | public static void setOnMessageClearedCallback(LocalNotificationsPlugi...
    method executeOnMessageClearedCallback (line 81) | public static void executeOnMessageClearedCallback(JSONObject data) {
    method scheduleNotification (line 87) | public static void scheduleNotification(JSONObject options, Context co...

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPluginListener.java
  type LocalNotificationsPluginListener (line 6) | public interface LocalNotificationsPluginListener {
    method success (line 13) | void success(Object data);
    method error (line 22) | void error(Object data);

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationActionReceiver.java
  class NotificationActionReceiver (line 23) | public class NotificationActionReceiver extends IntentService {
    method NotificationActionReceiver (line 29) | public NotificationActionReceiver() {
    method onHandleIntent (line 33) | @Override
    method onClick (line 58) | private void onClick(String action, Bundle bundle) throws JSONException {
    method setTextInput (line 98) | private boolean setTextInput(String action, JSONObject data) throws JS...
    method forceMainActivityReload (line 107) | private void forceMainActivityReload() {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationAlarmReceiver.java
  class NotificationAlarmReceiver (line 11) | public class NotificationAlarmReceiver extends BroadcastReceiver {
    method onReceive (line 15) | public void onReceive(Context context, Intent intent) {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationClearedReceiver.java
  class NotificationClearedReceiver (line 11) | public class NotificationClearedReceiver extends BroadcastReceiver {
    method onReceive (line 20) | @Override

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationRestoreReceiver.java
  class NotificationRestoreReceiver (line 21) | public class NotificationRestoreReceiver extends BroadcastReceiver {
    method onReceive (line 25) | @Override
    method scheduleNotification (line 44) | static void scheduleNotification(JSONObject options, Context context) {

FILE: native-src/android/app/src/main/java/com/telerik/localnotifications/Store.java
  class Store (line 12) | public final class Store {
    method get (line 17) | public static @Nullable JSONObject get(Context context, int id) {
    method get (line 21) | public static @Nullable JSONObject get(Context context, int id, boolea...
    method getAll (line 33) | public static Map<String, String> getAll(Context context) {
    method getKeys (line 37) | public static String[] getKeys(Context context) {
    method save (line 41) | public static void save(Context context, JSONObject opts) {
    method save (line 45) | public static void save(Context context, int id, String opts) {
    method save (line 53) | public static void save(Context context, int id, JSONObject opts) {
    method remove (line 57) | public static void remove(Context context, int id) {

FILE: native-src/ios/LocalNotificationsPlugin/Notification.h
  function interface (line 4) | interface Notification : NSObject <UIApplicationDelegate>

FILE: src/local-notifications-common.ts
  type ScheduleInterval (line 3) | type ScheduleInterval = "second" | "minute" | "hour" | "day" | "week" | ...
  type NotificationAction (line 5) | interface NotificationAction {
  type ScheduleOptions (line 32) | interface ScheduleOptions {
  type ReceivedNotification (line 189) | interface ReceivedNotification {
  type LocalNotificationsApi (line 198) | interface LocalNotificationsApi {
  method merge (line 270) | protected static merge(obj1: {}, obj2: {}): any {
  method generateUUID (line 288) | protected static generateUUID(): string {
  method generateNotificationID (line 294) | protected static generateNotificationID(): number {
  method ensureID (line 298) | protected static ensureID(opts: ScheduleOptions): number {

FILE: src/local-notifications.android.ts
  function useAndroidX (line 15) | function useAndroidX () {
  class LocalNotificationsImpl (line 32) | class LocalNotificationsImpl extends LocalNotificationsCommon implements...
    method getInterval (line 36) | private static getInterval(interval: ScheduleInterval): number {
    method getIcon (line 56) | private static getIcon(context: any /* android.content.Context */, res...
    method cancelById (line 66) | private static cancelById(id: number): void {
    method hasPermission (line 78) | hasPermission(): Promise<boolean> {
    method requestPermission (line 89) | requestPermission(): Promise<boolean> {
    method addOnMessageReceivedCallback (line 101) | addOnMessageReceivedCallback(onReceived: (data: ReceivedNotification) ...
    method addOnMessageClearedCallback (line 120) | addOnMessageClearedCallback(onReceived: (data: ReceivedNotification) =...
    method cancel (line 139) | cancel(id: number): Promise<boolean> {
    method cancelAll (line 151) | cancelAll(): Promise<void> {
    method getScheduledIds (line 178) | getScheduledIds(): Promise<number[]> {
    method schedule (line 196) | schedule(scheduleOptions: ScheduleOptions[]): Promise<Array<number>> {
    method hasPermission (line 250) | private static hasPermission(): boolean {

FILE: src/local-notifications.ios.ts
  class LocalNotificationsImpl (line 8) | class LocalNotificationsImpl extends LocalNotificationsCommon implements...
    method constructor (line 18) | constructor() {
    method isUNUserNotificationCenterAvailable (line 36) | static isUNUserNotificationCenterAvailable(): boolean {
    method hasPermission (line 45) | private static hasPermission(): boolean {
    method getImageName (line 51) | private static getImageName(imageURL: string = "", extension: "png" | ...
    method addObserver (line 56) | private static addObserver(eventName, callback): any {
    method getInterval (line 60) | private static getInterval(interval: ScheduleInterval): NSCalendarUnit {
    method getIntervalSeconds (line 78) | private static getIntervalSeconds(interval: ScheduleInterval, ticks: n...
    method schedulePendingNotifications (line 102) | private static schedulePendingNotifications(pending: ScheduleOptions[]...
    method schedulePendingNotificationsNew (line 110) | private static schedulePendingNotificationsNew(pending: ScheduleOption...
    method calendarWithMondayAsFirstDay (line 235) | private static calendarWithMondayAsFirstDay(): NSCalendar {
    method schedulePendingNotificationsLegacy (line 242) | private static schedulePendingNotificationsLegacy(pending: ScheduleOpt...
    method addOrProcessNotification (line 290) | addOrProcessNotification(notificationDetails: ReceivedNotification): v...
    method hasPermission (line 298) | hasPermission(): Promise<boolean> {
    method requestPermission (line 309) | requestPermission(): Promise<boolean> {
    method addOnMessageReceivedCallback (line 334) | addOnMessageReceivedCallback(onReceived: (data: ReceivedNotification) ...
    method addOnMessageClearedCallback (line 351) | addOnMessageClearedCallback(onReceived: (data: ReceivedNotification) =...
    method cancel (line 361) | cancel(id: number): Promise<boolean> {
    method cancelAll (line 387) | cancelAll(): Promise<any> {
    method getScheduledIds (line 404) | getScheduledIds(): Promise<number[]> {
    method schedule (line 434) | schedule(options: ScheduleOptions[]): Promise<Array<number>> {
  class LocalNotificationsDelegateObserverImpl (line 456) | class LocalNotificationsDelegateObserverImpl implements DelegateObserver {
    method constructor (line 463) | constructor(owner: WeakRef<LocalNotificationsImpl>) {
    method userNotificationCenterDidReceiveNotificationResponseWithCompletionHandler (line 470) | userNotificationCenterDidReceiveNotificationResponseWithCompletionHand...
    method userNotificationCenterWillPresentNotificationWithCompletionHandler (line 514) | userNotificationCenterWillPresentNotificationWithCompletionHandler(cen...

FILE: src/platforms/ios/LocalNotificationsPlugin.framework/Headers/Notification.h
  function interface (line 4) | interface Notification : NSObject <UIApplicationDelegate>

FILE: src/platforms/ios/typings/objc!LocalNotificationsPlugin.d.ts
  class Notification (line 7) | class Notification extends NSObject implements UIApplicationDelegate {
  class NotificationManager (line 164) | class NotificationManager extends NSObject {
Condensed preview — 150 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (301K chars).
[
  {
    "path": ".gitignore",
    "chars": 248,
    "preview": ".idea/\n.vscode/\nnode_modules/\n*.js\n!demo-vue/app/main.js\nsrc/*.d.ts\n!src/index.d.ts\n!src/references.d.ts\ndemo/platforms\n"
  },
  {
    "path": ".travis.yml",
    "chars": 1520,
    "preview": "matrix:\n  include:\n    - stage: \"Lint\"\n      language: node_js\n      os: linux\n      node_js: \"10\"\n      script: cd src "
  },
  {
    "path": "LICENSE",
    "chars": 1045,
    "preview": "The MIT License (MIT)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and"
  },
  {
    "path": "README.md",
    "chars": 13106,
    "preview": "# NativeScript Local Notifications Plugin\n\n[![NPM version][npm-image]][npm-url]\n[![Downloads][downloads-image]][npm-url]"
  },
  {
    "path": "demo/app/App_Resources/Android/app.gradle",
    "chars": 373,
    "preview": "// Add your native dependencies here:\n\n// Uncomment to add recyclerview-v7 dependency\n//dependencies {\n//\tcompile 'com.a"
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/AndroidManifest.xml",
    "chars": 1393,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tpackage=\"__"
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml",
    "chars": 304,
    "preview": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" android:gravity=\"fill\">\n    <item>\n        <bitma"
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/res/values/colors.xml",
    "chars": 237,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ns_primary\">#F5F5F5</color>\n\t<color name=\"ns_primary"
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/res/values/styles.xml",
    "chars": 1724,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <!-- "
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/res/values-v21/colors.xml",
    "chars": 104,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<color name=\"ns_accent\">#3d5afe</color>\n</resources>"
  },
  {
    "path": "demo/app/App_Resources/Android/src/main/res/values-v21/styles.xml",
    "chars": 902,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Application theme -->\n    <style name=\"AppTheme\" parent=\"Ap"
  },
  {
    "path": "demo/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1887,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-29.png\",\n      \"scale\""
  },
  {
    "path": "demo/app/App_Resources/iOS/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "demo/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "chars": 4246,
    "preview": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2436h\",\n      \"filen"
  },
  {
    "path": "demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json",
    "chars": 373,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-AspectFill.png\",\n      \"scale\" : \"1"
  },
  {
    "path": "demo/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json",
    "chars": 365,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-Center.png\",\n      \"scale\" : \"1x\"\n "
  },
  {
    "path": "demo/app/App_Resources/iOS/Info.plist",
    "chars": 1471,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "demo/app/App_Resources/iOS/LaunchScreen.storyboard",
    "chars": 4139,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "demo/app/App_Resources/iOS/build.xcconfig",
    "chars": 504,
    "preview": "// You can add custom settings here\n// for example you can uncomment the following line to force distribution code signi"
  },
  {
    "path": "demo/app/README.md",
    "chars": 828,
    "preview": "# NativeScript TypeScript Template\n\nThis template creates a NativeScript app with the NativeScript hello world example,\n"
  },
  {
    "path": "demo/app/app-root.xml",
    "chars": 41,
    "preview": "<Frame defaultPage=\"main-page\">\n</Frame>\n"
  },
  {
    "path": "demo/app/app.css",
    "chars": 624,
    "preview": "@import '~nativescript-theme-core/css/core.light.css';\n\npage {\n  background-color: #F4F4F4;\n}\n\n.tab-content {\n  color: "
  },
  {
    "path": "demo/app/app.ts",
    "chars": 441,
    "preview": "import \"./bundle-config\";\nimport * as application from \"tns-core-modules/application\";\n\n// Add this so for iOS 10+ we c"
  },
  {
    "path": "demo/app/bundle-config.ts",
    "chars": 422,
    "preview": "if ((<any>global).TNS_WEBPACK) {\n  // Register tns-core-modules UI framework modules\n  require(\"bundle-entry-points\");\n\n"
  },
  {
    "path": "demo/app/main-page.ts",
    "chars": 296,
    "preview": "import { EventData } from \"tns-core-modules/data/observable\";\nimport { Page } from \"tns-core-modules/ui/page\";\nimport { "
  },
  {
    "path": "demo/app/main-page.xml",
    "chars": 3053,
    "preview": "<Page xmlns=\"http://www.nativescript.org/tns.xsd\" navigatingTo=\"navigatingTo\">\n  <TabView>\n    <TabView.items>\n\n      <T"
  },
  {
    "path": "demo/app/main-view-model.ts",
    "chars": 9240,
    "preview": "import { Observable } from \"tns-core-modules/data/observable\";\nimport { alert } from \"tns-core-modules/ui/dialogs\";\nimpo"
  },
  {
    "path": "demo/app/package.json",
    "chars": 161,
    "preview": "{\n  \"android\": {\n    \"v8Flags\": \"--expose_gc\",\n    \"markingMode\": \"none\"\n  },\n  \"main\": \"app.js\",\n  \"name\": \"tns-templat"
  },
  {
    "path": "demo/package.json",
    "chars": 845,
    "preview": "{\n  \"description\": \"NativeScript Application\",\n  \"license\": \"SEE LICENSE IN <your-license-filename>\",\n  \"readme\": \"Nativ"
  },
  {
    "path": "demo/references.d.ts",
    "chars": 284,
    "preview": "/// <reference path=\"./node_modules/tns-platform-declarations/ios.d.ts\" />\n/// <reference path=\"./node_modules/tns-platf"
  },
  {
    "path": "demo/tsconfig.json",
    "chars": 1081,
    "preview": "{\n    \"compilerOptions\": {\n        \"target\": \"es6\",\n        \"module\": \"commonjs\",\n        \"declaration\": false,\n        "
  },
  {
    "path": "demo/tsconfig.tns.json",
    "chars": 127,
    "preview": "{\n    \"extends\": \"./tsconfig\",\n    \"compilerOptions\": {\n        \"module\": \"es2015\",\n        \"moduleResolution\": \"node\"\n "
  },
  {
    "path": "demo-ng/App_Resources/Android/app.gradle",
    "chars": 550,
    "preview": "// Add your native dependencies here:\n\n// Uncomment to add recyclerview-v7 dependency\n//dependencies {\n//\timplementation"
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/AndroidManifest.xml",
    "chars": 1393,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tpackage=\"__"
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml",
    "chars": 304,
    "preview": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" android:gravity=\"fill\">\n    <item>\n        <bitma"
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/res/values/colors.xml",
    "chars": 237,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ns_primary\">#F5F5F5</color>\n\t<color name=\"ns_primary"
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/res/values/styles.xml",
    "chars": 1724,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <!-- "
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/res/values-v21/colors.xml",
    "chars": 104,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<color name=\"ns_accent\">#3d5afe</color>\n</resources>"
  },
  {
    "path": "demo-ng/App_Resources/Android/src/main/res/values-v21/styles.xml",
    "chars": 902,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Application theme -->\n    <style name=\"AppTheme\" parent=\"Ap"
  },
  {
    "path": "demo-ng/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 2363,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-20@2x.png\",\n      \"sca"
  },
  {
    "path": "demo-ng/App_Resources/iOS/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "demo-ng/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "chars": 5249,
    "preview": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2688h\",\n      \"filen"
  },
  {
    "path": "demo-ng/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json",
    "chars": 425,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-AspectFill.png\",\n      \"scale\" : \"1"
  },
  {
    "path": "demo-ng/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json",
    "chars": 414,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-Center.png\",\n      \"scale\" : \"1x\"\n "
  },
  {
    "path": "demo-ng/App_Resources/iOS/Info.plist",
    "chars": 1471,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "demo-ng/App_Resources/iOS/LaunchScreen.storyboard",
    "chars": 4139,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "demo-ng/App_Resources/iOS/build.xcconfig",
    "chars": 504,
    "preview": "// You can add custom settings here\n// for example you can uncomment the following line to force distribution code signi"
  },
  {
    "path": "demo-ng/README.md",
    "chars": 1010,
    "preview": "# NativeScript Angular Template\n\nThis template creates a \"Hello, world\" NativeScript app using TypeScript and Angular.\n\n"
  },
  {
    "path": "demo-ng/angular.json",
    "chars": 371,
    "preview": "{\n  \"$schema\": \"./node_modules/@angular/cli/lib/config/schema.json\",\n  \"version\": 1,\n  \"newProjectRoot\": \"projects\",\n  \""
  },
  {
    "path": "demo-ng/nsconfig.json",
    "chars": 62,
    "preview": "{\n  \"appResourcesPath\": \"App_Resources\",\n  \"appPath\": \"src\"\n}\n"
  },
  {
    "path": "demo-ng/package.json",
    "chars": 1317,
    "preview": "{\n    \"nativescript\": {\n        \"id\": \"org.nativescript.demong\",\n        \"tns-android\": {\n            \"version\": \"5.1.0\""
  },
  {
    "path": "demo-ng/references.d.ts",
    "chars": 283,
    "preview": "/// <reference path=\"./node_modules/tns-platform-declarations/ios.d.ts\" />\n/// <reference path=\"./node_modules/tns-platf"
  },
  {
    "path": "demo-ng/src/app/app-routing.module.ts",
    "chars": 485,
    "preview": "import { NgModule } from \"@angular/core\";\nimport { Routes } from \"@angular/router\";\nimport { NativeScriptRouterModule } "
  },
  {
    "path": "demo-ng/src/app/app.component.html",
    "chars": 146,
    "preview": "<!-- https://docs.nativescript.org/angular/core-concepts/angular-navigation.html#page-router-outlet -->\n<page-router-out"
  },
  {
    "path": "demo-ng/src/app/app.component.ts",
    "chars": 180,
    "preview": "import { Component } from \"@angular/core\";\n\n@Component({\n    selector: \"ns-app\",\n    moduleId: module.id,\n    templateUr"
  },
  {
    "path": "demo-ng/src/app/app.module.ts",
    "chars": 879,
    "preview": "import { NgModule, NO_ERRORS_SCHEMA } from \"@angular/core\";\nimport { NativeScriptModule } from \"nativescript-angular/nat"
  },
  {
    "path": "demo-ng/src/app/item/items.component.html",
    "chars": 1465,
    "preview": "<!--\nThe template defines the view of the component - what is actually rendered.\nIn NativeScript applications the templa"
  },
  {
    "path": "demo-ng/src/app/item/items.component.ts",
    "chars": 1490,
    "preview": "import { Component } from \"@angular/core\";\nimport { LocalNotifications } from \"nativescript-local-notifications\";\n\n@Comp"
  },
  {
    "path": "demo-ng/src/app.css",
    "chars": 516,
    "preview": "/*\nIn NativeScript, the app.css file is where you place CSS rules that\nyou would like to apply to your entire applicatio"
  },
  {
    "path": "demo-ng/src/main.ts",
    "chars": 1106,
    "preview": "// this import should be first in order to load some required settings (like globals and reflect-metadata)\nimport { plat"
  },
  {
    "path": "demo-ng/src/package.json",
    "chars": 82,
    "preview": "{\n    \"main\": \"main.js\",\n    \"android\": {\n        \"v8Flags\": \"--expose_gc\"\n    }\n}"
  },
  {
    "path": "demo-ng/tsconfig.json",
    "chars": 628,
    "preview": "{\n    \"compilerOptions\": {\n        \"module\": \"commonjs\",\n        \"target\": \"es5\",\n        \"experimentalDecorators\": true"
  },
  {
    "path": "demo-ng/tsconfig.tns.json",
    "chars": 127,
    "preview": "{\n    \"extends\": \"./tsconfig\",\n    \"compilerOptions\": {\n        \"module\": \"es2015\",\n        \"moduleResolution\": \"node\"\n "
  },
  {
    "path": "demo-vue/.gitignore",
    "chars": 96,
    "preview": "# JetBrains project files\n.idea\n\n# NPM\nnode_modules\n\n# NativeScript application\nhooks\nplatforms\n"
  },
  {
    "path": "demo-vue/README.md",
    "chars": 349,
    "preview": "# Local Notifications\n\n> Vue demo app for the Local Notifications plugin\n\n## Usage\n\n``` bash\n# Install dependencies\nnpm "
  },
  {
    "path": "demo-vue/app/App_Resources/Android/app.gradle",
    "chars": 251,
    "preview": "// Add your native dependencies here:\n\nandroid {\n  defaultConfig {  \n    generatedDensities = []\n    applicationId = \"or"
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/AndroidManifest.xml",
    "chars": 1454,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest\n    xmlns:android=\"http://schemas.android.com/apk/res/android\" package="
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/drawable-nodpi/splash_screen.xml",
    "chars": 304,
    "preview": "<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" android:gravity=\"fill\">\n    <item>\n        <bitma"
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values/colors.xml",
    "chars": 244,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ns_primary\">#F5F5F5</color>\n    <color name=\"ns_prim"
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values/strings.xml",
    "chars": 191,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">Local Notifications</string>\n    <string "
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values/styles.xml",
    "chars": 1721,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <!-- "
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values-v21/colors.xml",
    "chars": 104,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<color name=\"ns_accent\">#3d5afe</color>\n</resources>"
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values-v21/strings.xml",
    "chars": 191,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">Local Notifications</string>\n    <string "
  },
  {
    "path": "demo-vue/app/App_Resources/Android/src/main/res/values-v21/styles.xml",
    "chars": 898,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- Application theme -->\n    <style name=\"AppTheme\" parent=\"Ap"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1887,
    "preview": "{\n  \"images\" : [\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"icon-29.png\",\n      \"scale\""
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "chars": 4246,
    "preview": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2436h\",\n      \"filen"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json",
    "chars": 373,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-AspectFill.png\",\n      \"scale\" : \"1"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json",
    "chars": 365,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"LaunchScreen-Center.png\",\n      \"scale\" : \"1x\"\n "
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/Info.plist",
    "chars": 1479,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/LaunchScreen.storyboard",
    "chars": 3933,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "demo-vue/app/App_Resources/iOS/build.xcconfig",
    "chars": 504,
    "preview": "// You can add custom settings here\n// for example you can uncomment the following line to force distribution code signi"
  },
  {
    "path": "demo-vue/app/app.scss",
    "chars": 269,
    "preview": "// NativeScript core theme\n// @see https://docs.nativescript.org/ui/theme\n@import '~nativescript-theme-core/scss/dark';\n"
  },
  {
    "path": "demo-vue/app/components/App.vue",
    "chars": 3718,
    "preview": "<template>\n  <Page>\n    <ActionBar title=\"Local Notifications demo\"></ActionBar>\n\n    <StackLayout>\n      <Button @tap=\""
  },
  {
    "path": "demo-vue/app/fonts/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "demo-vue/app/main.js",
    "chars": 294,
    "preview": "import Vue from 'nativescript-vue'\nimport App from './components/App'\n\nrequire (\"nativescript-local-notifications\");\n\n//"
  },
  {
    "path": "demo-vue/app/package.json",
    "chars": 114,
    "preview": "{\n  \"android\": {\n    \"v8Flags\": \"--expose_gc\"\n  },\n  \"main\": \"main\",\n  \"name\": \"demo-vue\",\n  \"version\": \"1.0.0\"\n}\n"
  },
  {
    "path": "demo-vue/package.json",
    "chars": 1287,
    "preview": "{\n  \"name\": \"demo-vue\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Vue demo app for the Local Notifications plugin\",\n  \"aut"
  },
  {
    "path": "native-src/android/.gitattributes",
    "chars": 7,
    "preview": "* -crlf"
  },
  {
    "path": "native-src/android/.gitignore",
    "chars": 48,
    "preview": "out/\r\n.idea/\r\n.gradle/\r\nlocal.properties\r\nbuild/"
  },
  {
    "path": "native-src/android/README.md",
    "chars": 424,
    "preview": "# Local Notifications Plugin library for NativeScript Android apps\n\n## Building the framework\n- Open this folder as \"an "
  },
  {
    "path": "native-src/android/android.iml",
    "chars": 861,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"android\" external.linked.project.path=\"$MODUL"
  },
  {
    "path": "native-src/android/app/.gitignore",
    "chars": 8,
    "preview": "/build\r\n"
  },
  {
    "path": "native-src/android/app/app.iml",
    "chars": 11003,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\":app\" external.linked.project.path=\"$MODULE_D"
  },
  {
    "path": "native-src/android/app/build.gradle",
    "chars": 577,
    "preview": "apply plugin: 'com.android.library'\r\n\r\nandroid {\r\n    compileSdkVersion 28\r\n    buildToolsVersion \"28.0.3\"\r\n\r\n    defaul"
  },
  {
    "path": "native-src/android/app/proguard-rules.pro",
    "chars": 699,
    "preview": "# Add project specific ProGuard rules here.\r\n# By default, the flags in this file are appended to flags specified\r\n# in "
  },
  {
    "path": "native-src/android/app/src/main/AndroidManifest.xml",
    "chars": 1205,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n    package=\"com.telerik.localnotifications\">\r\n\r\n "
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/Action.java",
    "chars": 2950,
    "preview": "package com.telerik.localnotifications;\n\nimport android.content.Context;\nimport androidx.core.app.RemoteInput;\nimport an"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/ActionGroup.java",
    "chars": 3081,
    "preview": "package com.telerik.localnotifications;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport org.json.JSONA"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/Builder.java",
    "chars": 12479,
    "preview": "package com.telerik.localnotifications;\n\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/DownloadFileFromUrl.java",
    "chars": 1296,
    "preview": "package com.telerik.localnotifications;\n\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport a"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/LifecycleCallbacks.java",
    "chars": 2017,
    "preview": "package com.telerik.localnotifications;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.os."
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPlugin.java",
    "chars": 3274,
    "preview": "package com.telerik.localnotifications;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport org.json.JSONO"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/LocalNotificationsPluginListener.java",
    "chars": 597,
    "preview": "package com.telerik.localnotifications;\r\n\r\n/**\r\n * Defines methods for Success and Error callbacks\r\n */\r\npublic interfac"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationActionReceiver.java",
    "chars": 3630,
    "preview": "package com.telerik.localnotifications;\r\n\r\nimport android.app.IntentService;\r\nimport android.app.NotificationManager;\r\ni"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationAlarmReceiver.java",
    "chars": 1099,
    "preview": "package com.telerik.localnotifications;\n\nimport android.app.NotificationManager;\nimport android.content.BroadcastReceive"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationClearedReceiver.java",
    "chars": 1215,
    "preview": "package com.telerik.localnotifications;\r\n\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\n\r\nimport and"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/NotificationRestoreReceiver.java",
    "chars": 3197,
    "preview": "package com.telerik.localnotifications;\n\nimport android.app.AlarmManager;\nimport android.app.NotificationManager;\nimport"
  },
  {
    "path": "native-src/android/app/src/main/java/com/telerik/localnotifications/Store.java",
    "chars": 2063,
    "preview": "package com.telerik.localnotifications;\n\nimport android.content.Context;\nimport androidx.annotation.Nullable;\nimport and"
  },
  {
    "path": "native-src/android/app/src/main/res/values/strings.xml",
    "chars": 76,
    "preview": "<resources>\r\n  <string name=\"app_name\">locnotplugin</string>\r\n</resources>\r\n"
  },
  {
    "path": "native-src/android/build.gradle",
    "chars": 607,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\r\n\r\nbuildscript {\r\n  "
  },
  {
    "path": "native-src/android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 233,
    "preview": "#Thu Jul 04 12:57:28 CEST 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
  },
  {
    "path": "native-src/android/gradle.properties",
    "chars": 927,
    "preview": "# Project-wide Gradle settings.\r\n\r\n# IDE (e.g. Android Studio) users:\r\n# Gradle settings configured through the IDE *wil"
  },
  {
    "path": "native-src/android/gradlew",
    "chars": 4971,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "native-src/android/gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "native-src/android/locnotplugin.iml",
    "chars": 941,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module external.linked.project.id=\"pushplugin\" external.linked.project.path=\"$MO"
  },
  {
    "path": "native-src/android/settings.gradle",
    "chars": 16,
    "preview": "include ':app'\r\n"
  },
  {
    "path": "native-src/ios/.gitattributes",
    "chars": 7,
    "preview": "* -crlf"
  },
  {
    "path": "native-src/ios/.gitignore",
    "chars": 18,
    "preview": "build/\nxcuserdata/"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/Info.plist",
    "chars": 806,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/LocalNotificationsPlugin.h",
    "chars": 422,
    "preview": "#import <UIKit/UIKit.h>\r\n\r\n//! Project version number for LocalNotificationsPlugin.\r\nFOUNDATION_EXPORT double LocalNotif"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/Notification.h",
    "chars": 985,
    "preview": "#import <Foundation/Foundation.h>\r\n#import <UIKit/UIApplication.h>\r\n\r\n@interface Notification : NSObject <UIApplicationD"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/Notification.m",
    "chars": 14664,
    "preview": "#import \"Notification.h\"\r\n#import <UIKit/UIKit.h>\r\n#import <UIKit/UIUserNotificationSettings.h>\r\n#import <objc/runtime.h"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/NotificationManager.h",
    "chars": 112,
    "preview": "#import <Foundation/Foundation.h>\r\n#import \"Notification.h\"\r\n\r\n@interface NotificationManager : NSObject\r\n@end\r\n"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin/NotificationManager.m",
    "chars": 8209,
    "preview": "#import \"NotificationManager.h\"\r\n#import <UIKit/UIApplication.h>\r\n#import <UIKit/UILocalNotification.h>\r\n#import <objc/r"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin.xcodeproj/project.pbxproj",
    "chars": 19046,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXAggregateTarget sec"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 249,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/eddyverb"
  },
  {
    "path": "native-src/ios/LocalNotificationsPlugin.xcodeproj/project.xcworkspace/xcshareddata/PushPlugin.xccheckout",
    "chars": 1545,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/"
  },
  {
    "path": "native-src/ios/README.md",
    "chars": 786,
    "preview": "# Local Notifications Plugin library for NativeScript iOS apps\r\n\r\nThis is the native iOS for the Telerik NativeScript Lo"
  },
  {
    "path": "publish/pack.sh",
    "chars": 1024,
    "preview": "#!/bin/bash\n\nSOURCE_DIR=../src;\nTO_SOURCE_DIR=src;\nPACK_DIR=package;\nROOT_DIR=..;\nPUBLISH=--publish\n\ninstall(){\n    npm "
  },
  {
    "path": "publish/package.json",
    "chars": 166,
    "preview": "{\n  \"name\": \"nativescript-publish\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Publish helper\",\n  \"devDependencies\": {\n    "
  },
  {
    "path": "publish/publish.sh",
    "chars": 139,
    "preview": "#!/bin/bash\n\nPACK_DIR=package;\n\npublish() {\n    cd $PACK_DIR\n    echo 'Publishing to npm...'\n    npm publish *.tgz\n}\n\n./"
  },
  {
    "path": "src/.npmignore",
    "chars": 71,
    "preview": ".idea/\n.vscode/\nnative-src/\n*.ts\n!*.d.ts\ntsconfig.json\nreferences.d.ts\n"
  },
  {
    "path": "src/index.d.ts",
    "chars": 264,
    "preview": "/**\n * iOS and Android apis should match.\n * It doesn't matter if you export `.ios` or `.android`, either one but only o"
  },
  {
    "path": "src/local-notifications-common.ts",
    "chars": 8801,
    "preview": "import { Color } from \"tns-core-modules/color/color\";\n\nexport type ScheduleInterval = \"second\" | \"minute\" | \"hour\" | \"da"
  },
  {
    "path": "src/local-notifications.android.ts",
    "chars": 9440,
    "preview": "import * as app from \"tns-core-modules/application\";\nimport * as utils from \"tns-core-modules/utils/utils\";\nimport {\n  L"
  },
  {
    "path": "src/local-notifications.ios.ts",
    "chars": 22553,
    "preview": "import { DelegateObserver, SharedNotificationDelegate } from \"nativescript-shared-notification-delegate\";\nimport * as fi"
  },
  {
    "path": "src/package.json",
    "chars": 3300,
    "preview": "{\n  \"name\": \"nativescript-local-notifications\",\n  \"version\": \"4.2.1\",\n  \"description\": \"The Local Notifications plugin a"
  },
  {
    "path": "src/platforms/ios/LocalNotificationsPlugin.framework/Headers/LocalNotificationsPlugin.h",
    "chars": 412,
    "preview": "#import <UIKit/UIKit.h>\n\n//! Project version number for LocalNotificationsPlugin.\nFOUNDATION_EXPORT double LocalNotifica"
  },
  {
    "path": "src/platforms/ios/LocalNotificationsPlugin.framework/Headers/Notification.h",
    "chars": 961,
    "preview": "#import <Foundation/Foundation.h>\n#import <UIKit/UIApplication.h>\n\n@interface Notification : NSObject <UIApplicationDele"
  },
  {
    "path": "src/platforms/ios/LocalNotificationsPlugin.framework/Headers/NotificationManager.h",
    "chars": 107,
    "preview": "#import <Foundation/Foundation.h>\n#import \"Notification.h\"\n\n@interface NotificationManager : NSObject\n@end\n"
  },
  {
    "path": "src/platforms/ios/LocalNotificationsPlugin.framework/Modules/module.modulemap",
    "chars": 129,
    "preview": "framework module LocalNotificationsPlugin {\n  umbrella header \"LocalNotificationsPlugin.h\"\n\n  export *\n  module * { expo"
  },
  {
    "path": "src/platforms/ios/typings/objc!LocalNotificationsPlugin.d.ts",
    "chars": 7842,
    "preview": "\ndeclare var LocalNotificationsPluginVersionString: interop.Reference<number>;\n\ndeclare var LocalNotificationsVersionNum"
  },
  {
    "path": "src/references.d.ts",
    "chars": 238,
    "preview": "/// <reference path=\"./node_modules/tns-platform-declarations/ios.d.ts\" />\n/// <reference path=\"./node_modules/tns-platf"
  },
  {
    "path": "src/tsconfig.json",
    "chars": 645,
    "preview": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"module\": \"commonjs\",\n    \"declaration\": true,\n    \"removeComments\": t"
  },
  {
    "path": "tslint.json",
    "chars": 1321,
    "preview": "{\n    \"rules\": {\n        \"class-name\": true,\n        \"comment-format\": [\n            true,\n            \"check-space\"\n   "
  }
]

// ... and 4 more files (download for full content)

About this extraction

This page contains the full source code of the EddyVerbruggen/nativescript-local-notifications GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 150 files (265.6 KB), approximately 72.6k tokens, and a symbol index with 153 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!