roulljdh
Committed by GitHub

Added web support (#40)

* Added web support

* Use JS interop library; Add null check for releasing WakeLockSentinel;

* Update dependencies

* Update dependencies

* Refactoring

* Update gitignore

* Format wakelock_web folder

* Remove unused JS variable

* Bump github action versions

* Bump checkout version

* Update checks.yml

* Use relative changelog

Co-authored-by: creativecreatorormaybenot <creativecreatorormaybenot@gmail.com>
@@ -27,8 +27,8 @@ jobs: @@ -27,8 +27,8 @@ jobs:
27 fail-fast: false 27 fail-fast: false
28 28
29 steps: 29 steps:
30 - - uses: actions/checkout@v2  
31 - - uses: subosito/flutter-action@v1.2.0 30 + - uses: actions/checkout@v2.3.3
  31 + - uses: subosito/flutter-action@v1.3.2
32 with: 32 with:
33 channel: ${{ matrix.channel }} 33 channel: ${{ matrix.channel }}
34 - name: Setup projects (root & example) 34 - name: Setup projects (root & example)
@@ -51,7 +51,7 @@ jobs: @@ -51,7 +51,7 @@ jobs:
51 strategy: 51 strategy:
52 matrix: 52 matrix:
53 device: 53 device:
54 - - 'iPhone 11 Pro Max (13.5)' 54 + - 'iPhone 11 Pro Max (13.7)'
55 - 'Android' 55 - 'Android'
56 channel: 56 channel:
57 - 'stable' 57 - 'stable'
@@ -72,8 +72,8 @@ jobs: @@ -72,8 +72,8 @@ jobs:
72 '$1 == device { print $2 }' 72 '$1 == device { print $2 }'
73 ) 73 )
74 xcrun simctl boot "${UDID:?simulator not found}" 74 xcrun simctl boot "${UDID:?simulator not found}"
75 - - uses: actions/checkout@v2  
76 - - uses: subosito/flutter-action@v1.2.0 75 + - uses: actions/checkout@v2.3.3
  76 + - uses: subosito/flutter-action@v1.3.2
77 with: 77 with:
78 channel: ${{ matrix.channel }} 78 channel: ${{ matrix.channel }}
79 - name: Setup projects (root & example) 79 - name: Setup projects (root & example)
@@ -19,7 +19,7 @@ jobs: @@ -19,7 +19,7 @@ jobs:
19 runs-on: ubuntu-latest 19 runs-on: ubuntu-latest
20 20
21 steps: 21 steps:
22 - - uses: actions/checkout@v2  
23 - - uses: axel-op/dart-package-analyzer@v2.0.0 22 + - uses: actions/checkout@v2.3.3
  23 + - uses: axel-op/dart-package-analyzer@v3
24 with: 24 with:
25 githubToken: ${{ secrets.GITHUB_TOKEN }} 25 githubToken: ${{ secrets.GITHUB_TOKEN }}
@@ -11,8 +11,8 @@ jobs: @@ -11,8 +11,8 @@ jobs:
11 name: Check format, analyze, and test 11 name: Check format, analyze, and test
12 12
13 steps: 13 steps:
14 - - uses: actions/checkout@v2  
15 - - uses: subosito/flutter-action@v1.2.0 14 + - uses: actions/checkout@v2.3.3
  15 + - uses: subosito/flutter-action@v1.3.2
16 with: 16 with:
17 channel: stable 17 channel: stable
18 - name: Setup projects (root & example) 18 - name: Setup projects (root & example)
@@ -41,8 +41,8 @@ jobs: @@ -41,8 +41,8 @@ jobs:
41 name: Publish plugin 41 name: Publish plugin
42 42
43 steps: 43 steps:
44 - - uses: actions/checkout@v2  
45 - - uses: sakebook/actions-flutter-pub-publisher@v1.2.1 44 + - uses: actions/checkout@v2.3.3
  45 + - uses: sakebook/actions-flutter-pub-publisher@v1.3.1
46 with: 46 with:
47 credential: ${{ secrets.PUB_CREDENTIALS }} 47 credential: ${{ secrets.PUB_CREDENTIALS }}
48 flutter_package: true 48 flutter_package: true
  1 +var webm =
  2 + 'data:video/webm;base64,GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA=';
  3 +var mp4 =
  4 + 'data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQAD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';
  5 +
  6 +var _createClass = (function () {
  7 + function defineProperties(target, props) {
  8 + for (var i = 0; i < props.length; i++) {
  9 + var descriptor = props[i];
  10 + descriptor.enumerable = descriptor.enumerable || false;
  11 + descriptor.configurable = true;
  12 + if ('value' in descriptor) descriptor.writable = true;
  13 + Object.defineProperty(target, descriptor.key, descriptor);
  14 + }
  15 + }
  16 + return function (Constructor, protoProps, staticProps) {
  17 + if (protoProps) defineProperties(Constructor.prototype, protoProps);
  18 + if (staticProps) defineProperties(Constructor, staticProps);
  19 + return Constructor;
  20 + };
  21 +})();
  22 +
  23 +function _classCallCheck(instance, Constructor) {
  24 + if (!(instance instanceof Constructor)) {
  25 + throw new TypeError('Cannot call a class as a function');
  26 + }
  27 +}
  28 +
  29 +// Detect iOS browsers < version 10
  30 +var oldIOS =
  31 + typeof navigator !== 'undefined' &&
  32 + parseFloat(
  33 + (
  34 + '' +
  35 + (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(
  36 + navigator.userAgent
  37 + ) || [0, ''])[1]
  38 + )
  39 + .replace('undefined', '3_2')
  40 + .replace('_', '.')
  41 + .replace('_', '')
  42 + ) < 10 &&
  43 + !window.MSStream;
  44 +
  45 +// Detect native Wake Lock API support
  46 +var nativeWakeLock = 'wakeLock' in navigator;
  47 +
  48 +var NoSleep = (function () {
  49 + function NoSleep() {
  50 + var _this = this;
  51 +
  52 + _classCallCheck(this, NoSleep);
  53 +
  54 + if (nativeWakeLock) {
  55 + this._wakeLock = null;
  56 + var handleVisibilityChange = function handleVisibilityChange() {
  57 + if (
  58 + _this._wakeLock !== null &&
  59 + document.visibilityState === 'visible'
  60 + ) {
  61 + _this.enable();
  62 + }
  63 + };
  64 + document.addEventListener('visibilitychange', handleVisibilityChange);
  65 + document.addEventListener('fullscreenchange', handleVisibilityChange);
  66 + } else if (oldIOS) {
  67 + this.noSleepTimer = null;
  68 + } else {
  69 + // Set up no sleep video element
  70 + this.noSleepVideo = document.createElement('video');
  71 +
  72 + this.noSleepVideo.setAttribute('title', 'No Sleep');
  73 + this.noSleepVideo.setAttribute('playsinline', '');
  74 +
  75 + this._addSourceToVideo(this.noSleepVideo, 'webm', webm);
  76 + this._addSourceToVideo(this.noSleepVideo, 'mp4', mp4);
  77 +
  78 + this.noSleepVideo.addEventListener('loadedmetadata', function () {
  79 + if (_this.noSleepVideo.duration <= 1) {
  80 + // webm source
  81 + _this.noSleepVideo.setAttribute('loop', '');
  82 + } else {
  83 + // mp4 source
  84 + _this.noSleepVideo.addEventListener('timeupdate', function () {
  85 + if (_this.noSleepVideo.currentTime > 0.5) {
  86 + _this.noSleepVideo.currentTime = Math.random();
  87 + }
  88 + });
  89 + }
  90 + });
  91 + }
  92 + }
  93 +
  94 + _createClass(NoSleep, [
  95 + {
  96 + key: '_addSourceToVideo',
  97 + value: function _addSourceToVideo(element, type, dataURI) {
  98 + var source = document.createElement('source');
  99 + source.src = dataURI;
  100 + source.type = 'video/' + type;
  101 + element.appendChild(source);
  102 + },
  103 + },
  104 + {
  105 + key: 'enable',
  106 + value: function enable() {
  107 + var _this2 = this;
  108 +
  109 + if (nativeWakeLock) {
  110 + navigator.wakeLock
  111 + .request('screen')
  112 + .then(function (wakeLock) {
  113 + _this2._wakeLock = wakeLock;
  114 + console.log('Wake Lock active.');
  115 + _this2._wakeLock.addEventListener('release', function () {
  116 + // ToDo: Potentially emit an event for the page to observe since
  117 + // Wake Lock releases happen when page visibility changes.
  118 + // (https://web.dev/wakelock/#wake-lock-lifecycle)
  119 + console.log('Wake Lock released.');
  120 + });
  121 + })
  122 + .catch(function (err) {
  123 + console.error(err.name + ', ' + err.message);
  124 + });
  125 + } else if (oldIOS) {
  126 + this.disable();
  127 + console.warn(
  128 + '\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n '
  129 + );
  130 + this.noSleepTimer = window.setInterval(function () {
  131 + if (!document.hidden) {
  132 + window.location.href = window.location.href.split('#')[0];
  133 + window.setTimeout(window.stop, 0);
  134 + }
  135 + }, 15000);
  136 + } else {
  137 + this.noSleepVideo.play();
  138 + }
  139 + },
  140 + },
  141 + {
  142 + key: 'disable',
  143 + value: function disable() {
  144 + if (nativeWakeLock) {
  145 + if(this._wakeLock != null) {
  146 + this._wakeLock.release();
  147 + }
  148 +
  149 + this._wakeLock = null;
  150 + } else if (oldIOS) {
  151 + if (this.noSleepTimer) {
  152 + console.warn(
  153 + '\n NoSleep now disabled for older iOS devices.\n '
  154 + );
  155 + window.clearInterval(this.noSleepTimer);
  156 + this.noSleepTimer = null;
  157 + }
  158 + } else {
  159 + this.noSleepVideo.pause();
  160 + }
  161 + },
  162 + },
  163 + {
  164 + key: 'isEnabled',
  165 + value: function isEnabled() {
  166 + if (oldIOS) {
  167 + return this.noSleepTimer != null;
  168 + } else {
  169 + return !this.noSleepVideo.paused;
  170 + }
  171 + },
  172 + },
  173 + ]);
  174 +
  175 + return NoSleep;
  176 +})();
  177 +
  178 +var Wakelock = new NoSleep();
@@ -10,6 +10,8 @@ environment: @@ -10,6 +10,8 @@ environment:
10 dependencies: 10 dependencies:
11 flutter: 11 flutter:
12 sdk: flutter 12 sdk: flutter
  13 + wakelock_web:
  14 + path: wakelock_web/
13 15
14 dev_dependencies: 16 dev_dependencies:
15 pedantic: 1.9.0 17 pedantic: 1.9.0
@@ -28,3 +30,8 @@ flutter: @@ -28,3 +30,8 @@ flutter:
28 pluginClass: WakelockPlugin 30 pluginClass: WakelockPlugin
29 ios: 31 ios:
30 pluginClass: WakelockPlugin 32 pluginClass: WakelockPlugin
  33 + web:
  34 + default_package: wakelock_web
  35 +
  36 + assets:
  37 + - assets/NoSleep.js
  1 +# Miscellaneous
  2 +*.class
  3 +*.log
  4 +*.pyc
  5 +*.swp
  6 +.DS_Store
  7 +.atom/
  8 +.buildlog/
  9 +.history
  10 +.svn/
  11 +
  12 +# IntelliJ related
  13 +*.iml
  14 +*.ipr
  15 +*.iws
  16 +.idea/
  17 +
  18 +# The .vscode folder contains launch configuration and tasks you configure in
  19 +# VS Code which you may wish to be included in version control, so this line
  20 +# is commented out by default.
  21 +#.vscode/
  22 +
  23 +# Flutter/Dart/Pub related
  24 +**/doc/api/
  25 +.dart_tool/
  26 +.flutter-plugins
  27 +.flutter-plugins-dependencies
  28 +.packages
  29 +.pub-cache/
  30 +.pub/
  31 +/build/
  32 +
  33 +# Web related
  34 +lib/generated_plugin_registrant.dart
  35 +
  36 +# Symbolication related
  37 +app.*.symbols
  38 +
  39 +# Obfuscation related
  40 +app.*.map.json
  41 +
  42 +# Exceptions to above rules.
  43 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
  44 +
  45 +# Cleanliness
  46 +pubspec.lock
  47 +.metadata
  48 +test
  49 +ios
  50 +android
  51 +web
  1 +../CHANGELOG.md
  1 +../LICENSE
  1 +../README.md
  1 +@JS('Wakelock')
  2 +library wakelock.js;
  3 +
  4 +import 'package:js/js.dart';
  5 +
  6 +external enable();
  7 +external disable();
  8 +external bool isEnabled();
  1 +import 'dart:async';
  2 +
  3 +import 'dart:js';
  4 +
  5 +import 'package:flutter/services.dart';
  6 +import 'package:flutter_web_plugins/flutter_web_plugins.dart';
  7 +import 'package:import_js_library/import_js_library.dart';
  8 +
  9 +import 'wakelock_js.dart' as wakelock;
  10 +
  11 +/// A web implementation of the Wakelock plugin.
  12 +class WakelockWebPlugin {
  13 + final _isNativeWakelockSupported =
  14 + context['navigator'].hasProperty('wakeLock');
  15 + var _enabled = false;
  16 +
  17 + static void registerWith(Registrar registrar) {
  18 + final MethodChannel channel = MethodChannel(
  19 + 'wakelock',
  20 + const StandardMethodCodec(),
  21 + registrar.messenger,
  22 + );
  23 +
  24 + /// Import JS library
  25 + importJsLibrary(url: './assets/NoSleep.js', flutterPluginName: 'wakelock');
  26 +
  27 + final pluginInstance = WakelockWebPlugin();
  28 + channel.setMethodCallHandler(pluginInstance.handleMethodCall);
  29 + }
  30 +
  31 + /// Handles method calls over the MethodChannel of this plugin.
  32 + /// Note: Check the "federated" architecture for a new way of doing this:
  33 + /// https://flutter.dev/go/federated-plugins
  34 + Future<dynamic> handleMethodCall(MethodCall call) async {
  35 + switch (call.method) {
  36 + case 'toggle':
  37 + final bool enable = call.arguments['enable'];
  38 + return Future.value(_toggle(enable));
  39 + break;
  40 + case 'isEnabled':
  41 + return Future.value(_isEnabled());
  42 + break;
  43 + default:
  44 + throw PlatformException(
  45 + code: 'Unimplemented',
  46 + details: 'wakelock_web for web doesn\'t implement \'${call.method}\'',
  47 + );
  48 + }
  49 + }
  50 +
  51 + _toggle(bool enable) {
  52 + if (enable) {
  53 + wakelock.enable();
  54 + } else {
  55 + wakelock.disable();
  56 + }
  57 +
  58 + _enabled = enable;
  59 + }
  60 +
  61 + bool _isEnabled() {
  62 + /// If the native WebLock API is supported
  63 + /// since these APIs are async in nature
  64 + /// Give immediate boolean value based on `_enabled`
  65 + if (_isNativeWakelockSupported) {
  66 + return _enabled;
  67 + }
  68 +
  69 + return wakelock.isEnabled();
  70 + }
  71 +}
  1 +name: wakelock_web
  2 +description: This plugin allows you to keep the browser devices awake, i.e. prevent the screen from sleeping by toggling the wakelock of the device on or off.
  3 +version: 0.1.4+2
  4 +homepage: https://github.com/creativecreatorormaybenot/wakelock
  5 +
  6 +environment:
  7 + sdk: ">=2.7.0 <3.0.0"
  8 + flutter: ">=1.20.0 <2.0.0"
  9 +
  10 +dependencies:
  11 + flutter:
  12 + sdk: flutter
  13 + flutter_web_plugins:
  14 + sdk: flutter
  15 + import_js_library: ^1.0.1
  16 + js: ^0.6.2
  17 +
  18 +dev_dependencies:
  19 + flutter_test:
  20 + sdk: flutter
  21 +
  22 +# For information on the generic Dart part of this file, see the
  23 +# following page: https://dart.dev/tools/pub/pubspec
  24 +
  25 +# The following section is specific to Flutter.
  26 +flutter:
  27 + # This section identifies this Flutter project as a plugin project.
  28 + # The 'pluginClass' and Android 'package' identifiers should not ordinarily
  29 + # be modified. They are used by the tooling to maintain consistency when
  30 + # adding or updating assets for this project.
  31 + plugin:
  32 + platforms:
  33 + web:
  34 + pluginClass: WakelockWebPlugin
  35 + fileName: wakelock_web.dart
  36 +
  37 + #
  38 + # For details regarding assets in packages, see
  39 + # https://flutter.dev/assets-and-images/#from-packages
  40 + #
  41 + # An image asset can refer to one or more resolution-specific "variants", see
  42 + # https://flutter.dev/assets-and-images/#resolution-aware.
  43 +
  44 + # To add custom fonts to your plugin package, add a fonts section here,
  45 + # in this "flutter" section. Each entry in this list should have a
  46 + # "family" key with the font family name, and a "fonts" key with a
  47 + # list giving the asset and other descriptors for the font. For
  48 + # example:
  49 + # fonts:
  50 + # - family: Schyler
  51 + # fonts:
  52 + # - asset: fonts/Schyler-Regular.ttf
  53 + # - asset: fonts/Schyler-Italic.ttf
  54 + # style: italic
  55 + # - family: Trajan Pro
  56 + # fonts:
  57 + # - asset: fonts/TrajanPro.ttf
  58 + # - asset: fonts/TrajanPro_Bold.ttf
  59 + # weight: 700
  60 + #
  61 + # For details regarding fonts in packages, see
  62 + # https://flutter.dev/custom-fonts/#from-packages