diff --git a/README.md b/README.md index c460d9d..20f1b56 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ import RNLockTask from 'react-native-lock-task'; RNLockTask.startLockTask(); +RNLockTask.startLockTaskWith(["com.google.android.youtube", "com.sega.sonicdash"]); RNLockTask.stopLockTask(); RNLockTask.clearDeviceOwnerApp(); ``` diff --git a/android/build.gradle b/android/build.gradle index f73411e..1a541a4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,18 +6,18 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:4.0.0' } } apply plugin: 'com.android.library' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { - minSdkVersion 16 - targetSdkVersion 28 + minSdkVersion 21 + targetSdkVersion 29 versionCode 1 versionName "1.0" } @@ -28,9 +28,10 @@ android { repositories { mavenCentral() + google() } dependencies { - compile 'com.facebook.react:react-native:+' + implementation 'com.facebook.react:react-native:+' } diff --git a/android/src/main/java/com/rnlocktask/RNLockTaskModule.java b/android/src/main/java/com/rnlocktask/RNLockTaskModule.java index 94f2eca..a680256 100644 --- a/android/src/main/java/com/rnlocktask/RNLockTaskModule.java +++ b/android/src/main/java/com/rnlocktask/RNLockTaskModule.java @@ -2,24 +2,29 @@ package com.rnlocktask; import android.app.Activity; -import android.view.WindowManager; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; -import android.os.Build; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.ReadableArray; + +import java.util.ArrayList; public class RNLockTaskModule extends ReactContextBaseJavaModule { - private final ReactApplicationContext reactContext; + + private static final String ACTIVITY_GONE = "ACTIVITY_GONE"; + private static final String DEVICE_OWNER_CLEARED = "DEVICE_OWNER_CLEARED"; + private static final String LOCKED_TASK = "LOCKED_TASK"; + private static final String LOCKED_TASK_AS_OWNER = "LOCKED_TASK_AS_OWNER"; + private static final String UNLOCKED_TASK = "UNLOCKED_TASK"; public RNLockTaskModule(ReactApplicationContext reactContext) { super(reactContext); - this.reactContext = reactContext; } @Override @@ -28,45 +33,68 @@ public String getName() { } @ReactMethod - public void clearDeviceOwnerApp() { + public void clearDeviceOwnerApp(Promise promise) { try { - Activity mActivity = reactContext.getCurrentActivity(); + Activity mActivity = getCurrentActivity(); if (mActivity != null) { DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) mActivity.getSystemService(Context.DEVICE_POLICY_SERVICE); myDevicePolicyManager.clearDeviceOwnerApp(mActivity.getPackageName()); + promise.resolve(DEVICE_OWNER_CLEARED); } + promise.reject(ACTIVITY_GONE, "Activity gone or mismatch"); } catch (Exception e) { + promise.reject(e); } } @ReactMethod - public void startLockTask() { + public void startLockTaskWith(ReadableArray additionalPackages, Promise promise) { try { - Activity mActivity = reactContext.getCurrentActivity(); + Activity mActivity = getCurrentActivity(); if (mActivity != null) { DevicePolicyManager myDevicePolicyManager = (DevicePolicyManager) mActivity.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName mDPM = new ComponentName(mActivity, MyAdmin.class); if (myDevicePolicyManager.isDeviceOwnerApp(mActivity.getPackageName())) { - String[] packages = {mActivity.getPackageName()}; - myDevicePolicyManager.setLockTaskPackages(mDPM, packages); + ArrayList packages = new ArrayList<>(); + packages.add(mActivity.getPackageName()); + if(additionalPackages != null){ + for (int i = 0; i < additionalPackages.size(); i++) { + packages.add(additionalPackages.getString(i)); + } + } + myDevicePolicyManager.setLockTaskPackages(mDPM, packages.toArray(new String[0])); mActivity.startLockTask(); + promise.resolve(LOCKED_TASK_AS_OWNER); } else { mActivity.startLockTask(); + promise.resolve(LOCKED_TASK); } + } else{ + promise.reject(ACTIVITY_GONE, "Activity gone or mismatch"); } } catch (Exception e) { + promise.reject(e); } } @ReactMethod - public void stopLockTask() { + public void startLockTask(Promise promise) { + startLockTaskWith(null, promise); + } + + @ReactMethod + public void stopLockTask(Promise promise) { try { - Activity mActivity = reactContext.getCurrentActivity(); + Activity mActivity = getCurrentActivity(); if (mActivity != null) { mActivity.stopLockTask(); + promise.resolve(UNLOCKED_TASK); + } else { + promise.reject(ACTIVITY_GONE, "Activity gone or mismatch"); } } catch (Exception e) { + promise.reject(e); } } } diff --git a/android/src/main/java/com/rnlocktask/RNLockTaskPackage.java b/android/src/main/java/com/rnlocktask/RNLockTaskPackage.java index bbeb8a9..43fc2ed 100644 --- a/android/src/main/java/com/rnlocktask/RNLockTaskPackage.java +++ b/android/src/main/java/com/rnlocktask/RNLockTaskPackage.java @@ -1,15 +1,15 @@ package com.rnlocktask; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - import com.facebook.react.ReactPackage; +import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager; -import com.facebook.react.bridge.JavaScriptModule; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; public class RNLockTaskPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) {