react-native-screenshot-aware 1.0.8 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/README.md +20 -0
  2. package/ScreenshotAware.podspec +42 -0
  3. package/android/build.gradle +38 -13
  4. package/android/gradle.properties +4 -4
  5. package/android/src/main/java/com/screenshotaware/ScreenshotAwareModule.kt +4 -2
  6. package/android/src/main/java/com/screenshotaware/ScreenshotAwarePackage.kt +2 -3
  7. package/app.plugin.js +1 -0
  8. package/ios/ScreenshotAware.h +1 -1
  9. package/lib/commonjs/NativeScreenshotAware.js.map +1 -0
  10. package/lib/commonjs/index.js +1 -1
  11. package/lib/commonjs/index.js.map +1 -1
  12. package/lib/commonjs/plugin/withReactNativeScreenshotAware.js +48 -0
  13. package/lib/commonjs/plugin/withReactNativeScreenshotAware.js.map +1 -0
  14. package/lib/module/NativeScreenshotAware.js.map +1 -0
  15. package/lib/module/index.js +1 -1
  16. package/lib/module/index.js.map +1 -1
  17. package/lib/module/plugin/withReactNativeScreenshotAware.js +44 -0
  18. package/lib/module/plugin/withReactNativeScreenshotAware.js.map +1 -0
  19. package/lib/typescript/NativeScreenshotAware.d.ts.map +1 -0
  20. package/lib/typescript/index.d.ts.map +1 -1
  21. package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts +11 -0
  22. package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts.map +1 -0
  23. package/package.json +20 -11
  24. package/src/index.tsx +1 -1
  25. package/src/plugin/withReactNativeScreenshotAware.ts +50 -0
  26. package/lib/commonjs/codegenSpec/NativeScreenshotAware.js.map +0 -1
  27. package/lib/module/codegenSpec/NativeScreenshotAware.js.map +0 -1
  28. package/lib/typescript/codegenSpec/NativeScreenshotAware.d.ts.map +0 -1
  29. package/react-native-screenshot-aware.podspec +0 -23
  30. /package/lib/commonjs/{codegenSpec/NativeScreenshotAware.js → NativeScreenshotAware.js} +0 -0
  31. /package/lib/module/{codegenSpec/NativeScreenshotAware.js → NativeScreenshotAware.js} +0 -0
  32. /package/lib/typescript/{codegenSpec/NativeScreenshotAware.d.ts → NativeScreenshotAware.d.ts} +0 -0
  33. /package/src/{codegenSpec/NativeScreenshotAware.ts → NativeScreenshotAware.ts} +0 -0
package/README.md CHANGED
@@ -37,6 +37,26 @@ npm install react-native-screenshot-aware
37
37
  - Leverages the new `DETECT_SCREEN_CAPTURE` permission introduced in Android 14
38
38
  - Provides a more privacy-friendly and performant approach to screenshot detection
39
39
 
40
+ ## Expo
41
+
42
+ For Expo projects, you can use the Expo plugin in `app.json`
43
+
44
+ ```json
45
+ "plugins": [
46
+ "react-native-screenshot-aware"
47
+ ],
48
+ ```
49
+
50
+ or add the permission manually to your `app.json`:
51
+
52
+ ```json
53
+ "android": {
54
+ "permissions": ["android.permission.DETECT_SCREEN_CAPTURE"]
55
+ }
56
+ ```
57
+
58
+ ## Bare RN
59
+
40
60
  ### Permissions
41
61
 
42
62
  To use the screenshot detection feature on Android, you need to add the following permission to your `AndroidManifest.xml` file:
@@ -0,0 +1,42 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
5
+
6
+ Pod::Spec.new do |s|
7
+ s.name = "ScreenshotAware"
8
+ s.version = package["version"]
9
+ s.summary = package["description"]
10
+ s.homepage = package["homepage"]
11
+ s.license = package["license"]
12
+ s.authors = package["author"]
13
+
14
+ s.platforms = { :ios => min_ios_version_supported }
15
+ s.source = { :git => "https://github.com/huextrat/react-native-screenshot-aware.git", :tag => "#{s.version}" }
16
+
17
+ s.source_files = "ios/**/*.{h,m,mm,cpp}"
18
+ s.private_header_files = "ios/generated/**/*.h"
19
+
20
+ # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
21
+ # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
22
+ if respond_to?(:install_modules_dependencies, true)
23
+ install_modules_dependencies(s)
24
+ else
25
+ s.dependency "React-Core"
26
+
27
+ # Don't install the dependencies when we run `pod install` in the old architecture.
28
+ if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
29
+ s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
30
+ s.pod_target_xcconfig = {
31
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
32
+ "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
33
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
34
+ }
35
+ s.dependency "React-Codegen"
36
+ s.dependency "RCT-Folly"
37
+ s.dependency "RCTRequired"
38
+ s.dependency "RCTTypeSafety"
39
+ s.dependency "ReactCommon/turbomodule/core"
40
+ end
41
+ end
42
+ end
@@ -1,6 +1,7 @@
1
1
  buildscript {
2
- // Buildscript is evaluated before everything else so we can't use getExtOrDefault
3
- def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["ScreenshotAware_kotlinVersion"]
2
+ ext.getExtOrDefault = {name ->
3
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ScreenshotAware_' + name]
4
+ }
4
5
 
5
6
  repositories {
6
7
  google()
@@ -8,12 +9,13 @@ buildscript {
8
9
  }
9
10
 
10
11
  dependencies {
11
- classpath "com.android.tools.build:gradle:7.2.1"
12
+ classpath "com.android.tools.build:gradle:8.7.2"
12
13
  // noinspection DifferentKotlinGradleVersion
13
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
14
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${getExtOrDefault('kotlinVersion')}"
14
15
  }
15
16
  }
16
17
 
18
+
17
19
  def isNewArchitectureEnabled() {
18
20
  return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
19
21
  }
@@ -25,18 +27,28 @@ if (isNewArchitectureEnabled()) {
25
27
  apply plugin: "com.facebook.react"
26
28
  }
27
29
 
28
- def getExtOrDefault(name) {
29
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["ScreenshotAware_" + name]
30
- }
31
-
32
30
  def getExtOrIntegerDefault(name) {
33
31
  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["ScreenshotAware_" + name]).toInteger()
34
32
  }
35
33
 
34
+ def supportsNamespace() {
35
+ def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
36
+ def major = parsed[0].toInteger()
37
+ def minor = parsed[1].toInteger()
38
+
39
+ // Namespace support was added in 7.3.0
40
+ return (major == 7 && minor >= 3) || major >= 8
41
+ }
42
+
36
43
  android {
37
- def agpVersion = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION
38
- if (agpVersion.tokenize('.')[0].toInteger() >= 7) {
44
+ if (supportsNamespace()) {
39
45
  namespace "com.screenshotaware"
46
+
47
+ sourceSets {
48
+ main {
49
+ manifest.srcFile "src/main/AndroidManifestNew.xml"
50
+ }
51
+ }
40
52
  }
41
53
 
42
54
  compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
@@ -44,6 +56,7 @@ android {
44
56
  defaultConfig {
45
57
  minSdkVersion getExtOrIntegerDefault("minSdkVersion")
46
58
  targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
59
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
47
60
  }
48
61
 
49
62
  buildFeatures {
@@ -68,7 +81,11 @@ android {
68
81
  sourceSets {
69
82
  main {
70
83
  if (isNewArchitectureEnabled()) {
71
- java.srcDirs += ["src/newarch"]
84
+ java.srcDirs += [
85
+ "src/newarch",
86
+ "generated/java",
87
+ "generated/jni"
88
+ ]
72
89
  } else {
73
90
  java.srcDirs += ["src/oldarch"]
74
91
  }
@@ -84,7 +101,15 @@ repositories {
84
101
  def kotlin_version = getExtOrDefault("kotlinVersion")
85
102
 
86
103
  dependencies {
87
- //noinspection GradleDynamicVersion
88
- implementation "com.facebook.react:react-native:+"
104
+ implementation "com.facebook.react:react-android"
89
105
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
106
+ implementation "com.google.android.play:review:2.0.1"
90
107
  }
108
+
109
+ if (isNewArchitectureEnabled()) {
110
+ react {
111
+ jsRootDir = file("../src/")
112
+ libraryName = "ScreenshotAware"
113
+ codegenJavaPackageName = "com.screenshotaware"
114
+ }
115
+ }
@@ -1,5 +1,5 @@
1
- ScreenshotAware_kotlinVersion=1.9.24
2
- ScreenshotAware_minSdkVersion=21
1
+ ScreenshotAware_kotlinVersion=2.0.21
2
+ ScreenshotAware_minSdkVersion=24
3
3
  ScreenshotAware_targetSdkVersion=34
4
- ScreenshotAware_compileSdkVersion=34
5
- ScreenshotAware_ndkversion=26.1.10909125
4
+ ScreenshotAware_compileSdkVersion=35
5
+ ScreenshotAware_ndkVersion=27.1.12297006
@@ -5,9 +5,11 @@ import android.os.Build
5
5
  import com.facebook.react.bridge.ReactApplicationContext
6
6
  import com.facebook.react.bridge.ReactMethod
7
7
  import com.facebook.react.modules.core.DeviceEventManagerModule
8
+ import com.facebook.react.module.annotations.ReactModule
8
9
 
9
- class ScreenshotAwareModule internal constructor(context: ReactApplicationContext) :
10
- ScreenshotAwareSpec(context) {
10
+ @ReactModule(name = ScreenshotAwareModule.NAME)
11
+ class ScreenshotAwareModule internal constructor(reactContext: ReactApplicationContext) :
12
+ ScreenshotAwareSpec(reactContext) {
11
13
 
12
14
  private var screenCaptureCallback: Any? = null
13
15
 
@@ -1,13 +1,13 @@
1
1
  package com.screenshotaware
2
2
 
3
- import com.facebook.react.TurboReactPackage
3
+ import com.facebook.react.BaseReactPackage
4
4
  import com.facebook.react.bridge.ReactApplicationContext
5
5
  import com.facebook.react.bridge.NativeModule
6
6
  import com.facebook.react.module.model.ReactModuleInfoProvider
7
7
  import com.facebook.react.module.model.ReactModuleInfo
8
8
  import java.util.HashMap
9
9
 
10
- class ScreenshotAwarePackage : TurboReactPackage() {
10
+ class ScreenshotAwarePackage : BaseReactPackage() {
11
11
  override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
12
12
  return if (name == ScreenshotAwareModule.NAME) {
13
13
  ScreenshotAwareModule(reactContext)
@@ -24,7 +24,6 @@ class ScreenshotAwarePackage : TurboReactPackage() {
24
24
  ScreenshotAwareModule.NAME,
25
25
  false, // canOverrideExistingModule
26
26
  false, // needsEagerInit
27
- true, // hasConstants
28
27
  false, // isCxxModule
29
28
  true // isTurboModule
30
29
  )
package/app.plugin.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require("./lib/commonjs/plugin/withReactNativeScreenshotAware");
@@ -1,7 +1,7 @@
1
1
  #import <React/RCTEventEmitter.h>
2
2
 
3
3
  #ifdef RCT_NEW_ARCH_ENABLED
4
- #import "ScreenshotAwareSpec.h"
4
+ #import "generated/RNScreenshotAwareSpec/RNScreenshotAwareSpec.h"
5
5
 
6
6
  @interface ScreenshotAware : RCTEventEmitter <RCTBridgeModule>
7
7
  #else
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeScreenshotAware.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAOpCC,gCAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.useScreenshotAware = exports.default = void 0;
7
7
  var _react = require("react");
8
8
  var _reactNative = require("react-native");
9
- var _NativeScreenshotAware = _interopRequireDefault(require("./codegenSpec/NativeScreenshotAware"));
9
+ var _NativeScreenshotAware = _interopRequireDefault(require("./NativeScreenshotAware"));
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
11
  /**
12
12
  * @fileoverview This module provides functionality to detect screenshot events in a React Native application.
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_NativeScreenshotAware","_interopRequireDefault","e","__esModule","default","moduleEventEmitter","NativeEventEmitter","NativeScreenshotAware","useScreenshotAware","callback","useEffect","subscription","addListener","remove","exports","ScreenshotAware","removeAllListeners","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAC,sBAAA,CAAAH,OAAA;AAAwE,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAExE;AACA;AACA;AACA;;AAEA,MAAMG,kBAAkB,GAAG,IAAIC,+BAAkB,CAACC,8BAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,kBAAkB,GAAIC,QAAoB,IAAK;EAC1D,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,YAAY,GAAGN,kBAAkB,CAACO,WAAW,CACjD,sBAAsB,EACtBH,QACF,CAAC;IACD,OAAO,MAAME,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACJ,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxBAK,OAAA,CAAAN,kBAAA,GAAAA,kBAAA;AAyBA,MAAMO,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEH,WAAW,EAAGH,QAAoB,IAAK;IACrC,OAAOJ,kBAAkB,CAACO,WAAW,CAAC,sBAAsB,EAAEH,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEO,kBAAkB,EAAEA,CAAA,KAClBX,kBAAkB,CAACW,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAV,OAAA,GAEaW,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_NativeScreenshotAware","_interopRequireDefault","e","__esModule","default","moduleEventEmitter","NativeEventEmitter","NativeScreenshotAware","useScreenshotAware","callback","useEffect","subscription","addListener","remove","exports","ScreenshotAware","removeAllListeners","_default"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAC,sBAAA,CAAAH,OAAA;AAA4D,SAAAG,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE5D;AACA;AACA;AACA;;AAEA,MAAMG,kBAAkB,GAAG,IAAIC,+BAAkB,CAACC,8BAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,kBAAkB,GAAIC,QAAoB,IAAK;EAC1D,IAAAC,gBAAS,EAAC,MAAM;IACd,MAAMC,YAAY,GAAGN,kBAAkB,CAACO,WAAW,CACjD,sBAAsB,EACtBH,QACF,CAAC;IACD,OAAO,MAAME,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACJ,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAxBAK,OAAA,CAAAN,kBAAA,GAAAA,kBAAA;AAyBA,MAAMO,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEH,WAAW,EAAGH,QAAoB,IAAK;IACrC,OAAOJ,kBAAkB,CAACO,WAAW,CAAC,sBAAsB,EAAEH,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEO,kBAAkB,EAAEA,CAAA,KAClBX,kBAAkB,CAACW,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAV,OAAA,GAEaW,eAAe","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _configPlugins = require("@expo/config-plugins");
8
+ /**
9
+ * Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
10
+ * allowing the app to detect screen capture.
11
+ *
12
+ * @param {ConfigPlugin} config - The Expo configuration object.
13
+ * @returns {ConfigPlugin} - The modified Expo configuration.
14
+ */
15
+ const withCustomAndroidManifest = config => {
16
+ return (0, _configPlugins.withAndroidManifest)(config, config => {
17
+ const androidManifest = config.modResults;
18
+ if (!androidManifest.manifest["uses-permission"]) {
19
+ androidManifest.manifest["uses-permission"] = [];
20
+ }
21
+
22
+ // Check if the permission already exists
23
+ const permissionExists = androidManifest.manifest["uses-permission"].some(permission => permission.$?.["android:name"] === "android.permission.DETECT_SCREEN_CAPTURE");
24
+
25
+ // Only add the permission if it doesn't already exist
26
+ if (!permissionExists) {
27
+ androidManifest.manifest["uses-permission"].push({
28
+ $: {
29
+ "android:name": "android.permission.DETECT_SCREEN_CAPTURE"
30
+ }
31
+ });
32
+ }
33
+ return config;
34
+ });
35
+ };
36
+
37
+ /**
38
+ * Applies `withCustomAndroidManifest`
39
+ * to enable screenshot detection on Android.
40
+ *
41
+ * @param {ConfigPlugin} config - The Expo configuration object.
42
+ * @returns {ConfigPlugin} - The modified Expo configuration.
43
+ */
44
+ const withReactNativeScreenshotAware = config => {
45
+ return withCustomAndroidManifest(config);
46
+ };
47
+ var _default = exports.default = withReactNativeScreenshotAware;
48
+ //# sourceMappingURL=withReactNativeScreenshotAware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_configPlugins","require","withCustomAndroidManifest","config","withAndroidManifest","androidManifest","modResults","manifest","permissionExists","some","permission","$","push","withReactNativeScreenshotAware","_default","exports","default"],"sourceRoot":"../../../src","sources":["plugin/withReactNativeScreenshotAware.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,yBAAuC,GAAIC,MAAM,IAAK;EAC1D,OAAO,IAAAC,kCAAmB,EAACD,MAAM,EAAGA,MAAM,IAAK;IAC7C,MAAME,eAAe,GAAGF,MAAM,CAACG,UAAU;IAEzC,IAAI,CAACD,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,EAAE;MAChDF,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;IAClD;;IAEA;IACA,MAAMC,gBAAgB,GAAGH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACE,IAAI,CACtEC,UAAU,IACTA,UAAU,CAACC,CAAC,GAAG,cAAc,CAAC,KAC9B,0CACJ,CAAC;;IAED;IACA,IAAI,CAACH,gBAAgB,EAAE;MACrBH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACK,IAAI,CAAC;QAC/CD,CAAC,EAAE;UACD,cAAc,EAAE;QAClB;MACF,CAAC,CAAC;IACJ;IAEA,OAAOR,MAAM;EACf,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMU,8BAA4C,GAAIV,MAAM,IAAK;EAC/D,OAAOD,yBAAyB,CAACC,MAAM,CAAC;AAC1C,CAAC;AAAC,IAAAW,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEaH,8BAA8B","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeScreenshotAware.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAOlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useEffect } from "react";
4
4
  import { NativeEventEmitter } from "react-native";
5
- import NativeScreenshotAware from "./codegenSpec/NativeScreenshotAware";
5
+ import NativeScreenshotAware from "./NativeScreenshotAware";
6
6
 
7
7
  /**
8
8
  * @fileoverview This module provides functionality to detect screenshot events in a React Native application.
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","NativeEventEmitter","NativeScreenshotAware","moduleEventEmitter","useScreenshotAware","callback","subscription","addListener","remove","ScreenshotAware","removeAllListeners"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,kBAAkB,QAAQ,cAAc;AACjD,OAAOC,qBAAqB,MAAM,qCAAqC;;AAEvE;AACA;AACA;AACA;;AAEA,MAAMC,kBAAkB,GAAG,IAAIF,kBAAkB,CAACC,qBAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,kBAAkB,GAAIC,QAAoB,IAAK;EAC1DL,SAAS,CAAC,MAAM;IACd,MAAMM,YAAY,GAAGH,kBAAkB,CAACI,WAAW,CACjD,sBAAsB,EACtBF,QACF,CAAC;IACD,OAAO,MAAMC,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEF,WAAW,EAAGF,QAAoB,IAAK;IACrC,OAAOF,kBAAkB,CAACI,WAAW,CAAC,sBAAsB,EAAEF,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEK,kBAAkB,EAAEA,CAAA,KAClBP,kBAAkB,CAACO,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAED,eAAeD,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","NativeEventEmitter","NativeScreenshotAware","moduleEventEmitter","useScreenshotAware","callback","subscription","addListener","remove","ScreenshotAware","removeAllListeners"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,SAASC,kBAAkB,QAAQ,cAAc;AACjD,OAAOC,qBAAqB,MAAM,yBAAyB;;AAE3D;AACA;AACA;AACA;;AAEA,MAAMC,kBAAkB,GAAG,IAAIF,kBAAkB,CAACC,qBAAqB,CAAC;;AAExE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAME,kBAAkB,GAAIC,QAAoB,IAAK;EAC1DL,SAAS,CAAC,MAAM;IACd,MAAMM,YAAY,GAAGH,kBAAkB,CAACI,WAAW,CACjD,sBAAsB,EACtBF,QACF,CAAC;IACD,OAAO,MAAMC,YAAY,CAACE,MAAM,CAAC,CAAC;EACpC,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;AAChB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,eAAe,GAAG;EACtB;AACF;AACA;AACA;AACA;AACA;EACEF,WAAW,EAAGF,QAAoB,IAAK;IACrC,OAAOF,kBAAkB,CAACI,WAAW,CAAC,sBAAsB,EAAEF,QAAQ,CAAC;EACzE,CAAC;EAED;AACF;AACA;EACEK,kBAAkB,EAAEA,CAAA,KAClBP,kBAAkB,CAACO,kBAAkB,CAAC,sBAAsB;AAChE,CAAC;AAED,eAAeD,eAAe","ignoreList":[]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ import { withAndroidManifest } from "@expo/config-plugins";
4
+ /**
5
+ * Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
6
+ * allowing the app to detect screen capture.
7
+ *
8
+ * @param {ConfigPlugin} config - The Expo configuration object.
9
+ * @returns {ConfigPlugin} - The modified Expo configuration.
10
+ */
11
+ const withCustomAndroidManifest = config => {
12
+ return withAndroidManifest(config, config => {
13
+ const androidManifest = config.modResults;
14
+ if (!androidManifest.manifest["uses-permission"]) {
15
+ androidManifest.manifest["uses-permission"] = [];
16
+ }
17
+
18
+ // Check if the permission already exists
19
+ const permissionExists = androidManifest.manifest["uses-permission"].some(permission => permission.$?.["android:name"] === "android.permission.DETECT_SCREEN_CAPTURE");
20
+
21
+ // Only add the permission if it doesn't already exist
22
+ if (!permissionExists) {
23
+ androidManifest.manifest["uses-permission"].push({
24
+ $: {
25
+ "android:name": "android.permission.DETECT_SCREEN_CAPTURE"
26
+ }
27
+ });
28
+ }
29
+ return config;
30
+ });
31
+ };
32
+
33
+ /**
34
+ * Applies `withCustomAndroidManifest`
35
+ * to enable screenshot detection on Android.
36
+ *
37
+ * @param {ConfigPlugin} config - The Expo configuration object.
38
+ * @returns {ConfigPlugin} - The modified Expo configuration.
39
+ */
40
+ const withReactNativeScreenshotAware = config => {
41
+ return withCustomAndroidManifest(config);
42
+ };
43
+ export default withReactNativeScreenshotAware;
44
+ //# sourceMappingURL=withReactNativeScreenshotAware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["withAndroidManifest","withCustomAndroidManifest","config","androidManifest","modResults","manifest","permissionExists","some","permission","$","push","withReactNativeScreenshotAware"],"sourceRoot":"../../../src","sources":["plugin/withReactNativeScreenshotAware.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,sBAAsB;AAG1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,yBAAuC,GAAIC,MAAM,IAAK;EAC1D,OAAOF,mBAAmB,CAACE,MAAM,EAAGA,MAAM,IAAK;IAC7C,MAAMC,eAAe,GAAGD,MAAM,CAACE,UAAU;IAEzC,IAAI,CAACD,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,EAAE;MAChDF,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE;IAClD;;IAEA;IACA,MAAMC,gBAAgB,GAAGH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACE,IAAI,CACtEC,UAAU,IACTA,UAAU,CAACC,CAAC,GAAG,cAAc,CAAC,KAC9B,0CACJ,CAAC;;IAED;IACA,IAAI,CAACH,gBAAgB,EAAE;MACrBH,eAAe,CAACE,QAAQ,CAAC,iBAAiB,CAAC,CAACK,IAAI,CAAC;QAC/CD,CAAC,EAAE;UACD,cAAc,EAAE;QAClB;MACF,CAAC,CAAC;IACJ;IAEA,OAAOP,MAAM;EACf,CAAC,CAAC;AACJ,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMS,8BAA4C,GAAIT,MAAM,IAAK;EAC/D,OAAOD,yBAAyB,CAACC,MAAM,CAAC;AAC1C,CAAC;AAED,eAAeS,8BAA8B","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../src/NativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAyE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,aAAc,MAAM,IAAI,SAQtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,eAAe;IACnB;;;;;OAKG;4BACqB,MAAM,IAAI;IAIlC;;OAEG;;CAGJ,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.tsx"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,SAQtD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,QAAA,MAAM,eAAe;IACnB;;;;;OAKG;4BACqB,MAAM,IAAI;IAIlC;;OAEG;;CAGJ,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ConfigPlugin } from "expo/config-plugins";
2
+ /**
3
+ * Applies `withCustomAndroidManifest`
4
+ * to enable screenshot detection on Android.
5
+ *
6
+ * @param {ConfigPlugin} config - The Expo configuration object.
7
+ * @returns {ConfigPlugin} - The modified Expo configuration.
8
+ */
9
+ declare const withReactNativeScreenshotAware: ConfigPlugin;
10
+ export default withReactNativeScreenshotAware;
11
+ //# sourceMappingURL=withReactNativeScreenshotAware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withReactNativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../src/plugin/withReactNativeScreenshotAware.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAqCxD;;;;;;GAMG;AACH,QAAA,MAAM,8BAA8B,EAAE,YAErC,CAAC;AAEF,eAAe,8BAA8B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-screenshot-aware",
3
- "version": "1.0.8",
3
+ "version": "1.2.0",
4
4
  "description": "React Native module for real-time screenshot detection on Android and iOS",
5
5
  "source": "src/index.tsx",
6
6
  "main": "lib/commonjs/index.js",
@@ -23,7 +23,8 @@
23
23
  "!**/__tests__",
24
24
  "!**/__fixtures__",
25
25
  "!**/__mocks__",
26
- "!**/.*"
26
+ "!**/.*",
27
+ "app.plugin.js"
27
28
  ],
28
29
  "scripts": {
29
30
  "example": "yarn workspace react-native-screenshot-aware-example",
@@ -62,14 +63,16 @@
62
63
  "@biomejs/biome": "1.9.4",
63
64
  "@commitlint/cli": "19.7.1",
64
65
  "@commitlint/config-conventional": "19.7.1",
66
+ "@react-native-community/cli": "15.1.3",
65
67
  "@semantic-release/changelog": "6.0.3",
66
68
  "@semantic-release/git": "10.0.1",
67
- "@testing-library/react-native": "13.0.1",
69
+ "@testing-library/react-native": "13.1.0",
68
70
  "@types/jest": "29.5.14",
69
71
  "@types/react": "19.0.10",
70
72
  "@types/react-test-renderer": "19.0.0",
71
73
  "commitlint": "19.7.1",
72
74
  "del-cli": "6.0.0",
75
+ "expo": "^52.0.37",
73
76
  "husky": "9.1.7",
74
77
  "jest": "29.7.0",
75
78
  "react": "19.0.0",
@@ -77,8 +80,8 @@
77
80
  "react-native-builder-bob": "0.37.0",
78
81
  "react-test-renderer": "19.0.0",
79
82
  "semantic-release": "24.2.3",
80
- "turbo": "2.4.2",
81
- "typescript": "5.7.3"
83
+ "turbo": "2.4.4",
84
+ "typescript": "5.8.2"
82
85
  },
83
86
  "resolutions": {
84
87
  "@types/react": "19.0.10"
@@ -87,6 +90,11 @@
87
90
  "react": "*",
88
91
  "react-native": "*"
89
92
  },
93
+ "peerDependenciesMeta": {
94
+ "expo": {
95
+ "optional": true
96
+ }
97
+ },
90
98
  "workspaces": [
91
99
  "example"
92
100
  ],
@@ -133,20 +141,21 @@
133
141
  ]
134
142
  },
135
143
  "codegenConfig": {
136
- "name": "ScreenshotAwareSpec",
137
- "type": "all",
138
- "jsSrcsDir": "./src/codegenSpec",
144
+ "name": "RNScreenshotAwareSpec",
145
+ "type": "modules",
146
+ "jsSrcsDir": "src",
139
147
  "outputDir": {
140
148
  "ios": "ios/generated",
141
149
  "android": "android/generated"
142
150
  },
143
151
  "android": {
144
152
  "javaPackageName": "com.screenshotaware"
145
- }
153
+ },
154
+ "includesGeneratedCode": true
146
155
  },
147
156
  "create-react-native-library": {
148
- "type": "module-mixed",
157
+ "type": "turbo-module",
149
158
  "languages": "kotlin-objc",
150
- "version": "0.41.2"
159
+ "version": "0.48.3"
151
160
  }
152
161
  }
package/src/index.tsx CHANGED
@@ -1,6 +1,6 @@
1
1
  import { useEffect } from "react";
2
2
  import { NativeEventEmitter } from "react-native";
3
- import NativeScreenshotAware from "./codegenSpec/NativeScreenshotAware";
3
+ import NativeScreenshotAware from "./NativeScreenshotAware";
4
4
 
5
5
  /**
6
6
  * @fileoverview This module provides functionality to detect screenshot events in a React Native application.
@@ -0,0 +1,50 @@
1
+ import { withAndroidManifest } from "@expo/config-plugins";
2
+ import type { ConfigPlugin } from "expo/config-plugins";
3
+
4
+ /**
5
+ * Modifies the `AndroidManifest.xml` file to add `DETECT_SCREEN_CAPTURE` permission,
6
+ * allowing the app to detect screen capture.
7
+ *
8
+ * @param {ConfigPlugin} config - The Expo configuration object.
9
+ * @returns {ConfigPlugin} - The modified Expo configuration.
10
+ */
11
+ const withCustomAndroidManifest: ConfigPlugin = (config) => {
12
+ return withAndroidManifest(config, (config) => {
13
+ const androidManifest = config.modResults;
14
+
15
+ if (!androidManifest.manifest["uses-permission"]) {
16
+ androidManifest.manifest["uses-permission"] = [];
17
+ }
18
+
19
+ // Check if the permission already exists
20
+ const permissionExists = androidManifest.manifest["uses-permission"].some(
21
+ (permission) =>
22
+ permission.$?.["android:name"] ===
23
+ "android.permission.DETECT_SCREEN_CAPTURE",
24
+ );
25
+
26
+ // Only add the permission if it doesn't already exist
27
+ if (!permissionExists) {
28
+ androidManifest.manifest["uses-permission"].push({
29
+ $: {
30
+ "android:name": "android.permission.DETECT_SCREEN_CAPTURE",
31
+ },
32
+ });
33
+ }
34
+
35
+ return config;
36
+ });
37
+ };
38
+
39
+ /**
40
+ * Applies `withCustomAndroidManifest`
41
+ * to enable screenshot detection on Android.
42
+ *
43
+ * @param {ConfigPlugin} config - The Expo configuration object.
44
+ * @returns {ConfigPlugin} - The modified Expo configuration.
45
+ */
46
+ const withReactNativeScreenshotAware: ConfigPlugin = (config) => {
47
+ return withCustomAndroidManifest(config);
48
+ };
49
+
50
+ export default withReactNativeScreenshotAware;
@@ -1 +0,0 @@
1
- {"version":3,"names":["_reactNative","require","_default","exports","default","TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeScreenshotAware.ts"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAAmD,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAOpCC,gCAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../../src","sources":["codegenSpec/NativeScreenshotAware.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;AAOlD,eAAeA,mBAAmB,CAACC,YAAY,CAAO,iBAAiB,CAAC","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"NativeScreenshotAware.d.ts","sourceRoot":"","sources":["../../../src/codegenSpec/NativeScreenshotAware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;;AAED,wBAAyE"}
@@ -1,23 +0,0 @@
1
- require "json"
2
-
3
- package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
-
5
- Pod::Spec.new do |s|
6
- s.name = "react-native-screenshot-aware"
7
- s.version = package["version"]
8
- s.summary = package["description"]
9
- s.homepage = package["homepage"]
10
- s.license = package["license"]
11
- s.authors = package["author"]
12
-
13
- s.platforms = { :ios => min_ios_version_supported }
14
- s.source = { :git => "https://github.com/huextrat/react-native-screenshot-aware.git", :tag => "v#{s.version}" }
15
-
16
- s.source_files = "ios/**/*.{h,m,mm,cpp}"
17
-
18
- if defined?(install_modules_dependencies()) != nil
19
- install_modules_dependencies(s)
20
- else
21
- s.dependency "React-Core"
22
- end
23
- end