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.
- package/README.md +20 -0
- package/ScreenshotAware.podspec +42 -0
- package/android/build.gradle +38 -13
- package/android/gradle.properties +4 -4
- package/android/src/main/java/com/screenshotaware/ScreenshotAwareModule.kt +4 -2
- package/android/src/main/java/com/screenshotaware/ScreenshotAwarePackage.kt +2 -3
- package/app.plugin.js +1 -0
- package/ios/ScreenshotAware.h +1 -1
- package/lib/commonjs/NativeScreenshotAware.js.map +1 -0
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/plugin/withReactNativeScreenshotAware.js +48 -0
- package/lib/commonjs/plugin/withReactNativeScreenshotAware.js.map +1 -0
- package/lib/module/NativeScreenshotAware.js.map +1 -0
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/plugin/withReactNativeScreenshotAware.js +44 -0
- package/lib/module/plugin/withReactNativeScreenshotAware.js.map +1 -0
- package/lib/typescript/NativeScreenshotAware.d.ts.map +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts +11 -0
- package/lib/typescript/plugin/withReactNativeScreenshotAware.d.ts.map +1 -0
- package/package.json +20 -11
- package/src/index.tsx +1 -1
- package/src/plugin/withReactNativeScreenshotAware.ts +50 -0
- package/lib/commonjs/codegenSpec/NativeScreenshotAware.js.map +0 -1
- package/lib/module/codegenSpec/NativeScreenshotAware.js.map +0 -1
- package/lib/typescript/codegenSpec/NativeScreenshotAware.d.ts.map +0 -1
- package/react-native-screenshot-aware.podspec +0 -23
- /package/lib/commonjs/{codegenSpec/NativeScreenshotAware.js → NativeScreenshotAware.js} +0 -0
- /package/lib/module/{codegenSpec/NativeScreenshotAware.js → NativeScreenshotAware.js} +0 -0
- /package/lib/typescript/{codegenSpec/NativeScreenshotAware.d.ts → NativeScreenshotAware.d.ts} +0 -0
- /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
|
package/android/build.gradle
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
buildscript {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
12
|
+
classpath "com.android.tools.build:gradle:8.7.2"
|
|
12
13
|
// noinspection DifferentKotlinGradleVersion
|
|
13
|
-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$
|
|
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
|
-
|
|
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 += [
|
|
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
|
-
|
|
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=
|
|
2
|
-
ScreenshotAware_minSdkVersion=
|
|
1
|
+
ScreenshotAware_kotlinVersion=2.0.21
|
|
2
|
+
ScreenshotAware_minSdkVersion=24
|
|
3
3
|
ScreenshotAware_targetSdkVersion=34
|
|
4
|
-
ScreenshotAware_compileSdkVersion=
|
|
5
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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.
|
|
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 :
|
|
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");
|
package/ios/ScreenshotAware.h
CHANGED
|
@@ -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":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -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("./
|
|
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;
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect } from "react";
|
|
4
4
|
import { NativeEventEmitter } from "react-native";
|
|
5
|
-
import NativeScreenshotAware from "./
|
|
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.
|
package/lib/module/index.js.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
|
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
|
|
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.
|
|
81
|
-
"typescript": "5.
|
|
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": "
|
|
137
|
-
"type": "
|
|
138
|
-
"jsSrcsDir": "
|
|
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
|
|
157
|
+
"type": "turbo-module",
|
|
149
158
|
"languages": "kotlin-objc",
|
|
150
|
-
"version": "0.
|
|
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 "./
|
|
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
|
|
File without changes
|
|
File without changes
|
/package/lib/typescript/{codegenSpec/NativeScreenshotAware.d.ts → NativeScreenshotAware.d.ts}
RENAMED
|
File without changes
|
|
File without changes
|