From 588d27f0a463b15e526183325efa92ec8dae26ec Mon Sep 17 00:00:00 2001 From: Mattermost Build Date: Wed, 20 Nov 2019 23:32:47 +0100 Subject: [PATCH] Use LifecycleEventListener for MattermostManagedModule (#3585) --- .../mattermost/rnbeta/MainApplication.java | 5 +- .../ManagedActivityLifecycleCallbacks.java | 145 ----------------- .../rnbeta/MattermostManagedModule.java | 146 ++++++++++++++++-- .../mattermost-managed.android.js | 4 +- 4 files changed, 139 insertions(+), 161 deletions(-) delete mode 100644 android/app/src/main/java/com/mattermost/rnbeta/ManagedActivityLifecycleCallbacks.java diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java index 904387cae..8efa5ab61 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MainApplication.java @@ -12,7 +12,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; - import com.mattermost.share.ShareModule; import com.learnium.RNDeviceInfo.RNDeviceModule; import com.imagepicker.ImagePickerModule; @@ -209,8 +208,6 @@ public class MainApplication extends NavigationApplication implements INotificat super.onCreate(); instance = this; - registerActivityLifecycleCallbacks(new ManagedActivityLifecycleCallbacks()); - // Delete any previous temp files created by the app File tempFolder = new File(getApplicationContext().getCacheDir(), "mmShare"); RealPathUtil.deleteTempFiles(tempFolder); @@ -270,7 +267,7 @@ public class MainApplication extends NavigationApplication implements INotificat } public synchronized Bundle getManagedConfig() { - if (mManagedConfig!= null && mManagedConfig.size() > 0) { + if (mManagedConfig != null && mManagedConfig.size() > 0) { return mManagedConfig; } diff --git a/android/app/src/main/java/com/mattermost/rnbeta/ManagedActivityLifecycleCallbacks.java b/android/app/src/main/java/com/mattermost/rnbeta/ManagedActivityLifecycleCallbacks.java deleted file mode 100644 index cebf7a187..000000000 --- a/android/app/src/main/java/com/mattermost/rnbeta/ManagedActivityLifecycleCallbacks.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.mattermost.rnbeta; - -import android.os.Bundle; -import android.app.Activity; -import android.app.Application.ActivityLifecycleCallbacks; -import android.content.Context; -import android.content.RestrictionsManager; -import android.content.BroadcastReceiver; -import android.content.Intent; -import android.content.IntentFilter; -import android.view.WindowManager; -import android.view.WindowManager.LayoutParams; -import android.util.ArraySet; -import android.util.Log; - -import java.util.Set; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.ReactContext; -import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.core.DeviceEventManagerModule; - -public class ManagedActivityLifecycleCallbacks implements ActivityLifecycleCallbacks { - private static final String TAG = ManagedActivityLifecycleCallbacks.class.getSimpleName(); - - private final IntentFilter restrictionsFilter = - new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED); - - private final BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() { - @Override public void onReceive(Context ctx, Intent intent) { - if (ctx != null) { - Bundle managedConfig = MainApplication.instance.loadManagedConfig(ctx); - - // Check current configuration settings, change your app's UI and - // functionality as necessary. - Log.i(TAG, "Managed Configuration Changed"); - sendConfigChanged(managedConfig); - } - } - }; - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - MattermostManagedModule managedModule = MattermostManagedModule.getInstance(); - if (managedModule != null && managedModule.isBlurAppScreenEnabled() && activity != null) { - activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, - LayoutParams.FLAG_SECURE); - } - - Bundle managedConfig = MainApplication.instance.getManagedConfig(); - if (managedConfig != null && activity != null) { - activity.registerReceiver(restrictionsReceiver, restrictionsFilter); - } - } - - @Override - public void onActivityResumed(Activity activity) { - ReactContext ctx = MainApplication.instance.getRunningReactContext(); - Bundle managedConfig = MainApplication.instance.getManagedConfig(); - - if (ctx != null) { - Bundle newConfig = MainApplication.instance.loadManagedConfig(ctx); - if (!equalBundles(newConfig, managedConfig)) { - Log.i(TAG, "onResumed Managed Configuration Changed"); - sendConfigChanged(newConfig); - } - } - } - - @Override - public void onActivityStopped(Activity activity) { - Bundle managedConfig = MainApplication.instance.getManagedConfig(); - - if (managedConfig != null) { - try { - activity.unregisterReceiver(restrictionsReceiver); - } catch (IllegalArgumentException e) { - // Just ignore this cause the receiver wasn't registered for this activity - } - } - } - - @Override - public void onActivityStarted(Activity activity) { - } - - @Override - public void onActivityPaused(Activity activity) { - } - - @Override - public void onActivitySaveInstanceState(Activity activity, Bundle outState) { - } - - @Override - public void onActivityDestroyed(Activity activity) { - } - - private void sendConfigChanged(Bundle config) { - WritableMap result = Arguments.createMap(); - if (config != null) { - result = Arguments.fromBundle(config); - } - ReactContext ctx = MainApplication.instance.getRunningReactContext(); - - if (ctx != null) { - ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("managedConfigDidChange", result); - } - } - - private boolean equalBundles(Bundle one, Bundle two) { - if (one == null || two == null) - return false; - - if(one.size() != two.size()) - return false; - - Set setOne = new ArraySet(); - setOne.addAll(one.keySet()); - setOne.addAll(two.keySet()); - Object valueOne; - Object valueTwo; - - for(String key : setOne) { - if (!one.containsKey(key) || !two.containsKey(key)) - return false; - - valueOne = one.get(key); - valueTwo = two.get(key); - if(valueOne instanceof Bundle && valueTwo instanceof Bundle && - !equalBundles((Bundle) valueOne, (Bundle) valueTwo)) { - return false; - } - else if(valueOne == null) { - if(valueTwo != null) - return false; - } - else if(!valueOne.equals(valueTwo)) - return false; - } - - return true; - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/mattermost/rnbeta/MattermostManagedModule.java b/android/app/src/main/java/com/mattermost/rnbeta/MattermostManagedModule.java index f267dd95b..728cc7cfb 100644 --- a/android/app/src/main/java/com/mattermost/rnbeta/MattermostManagedModule.java +++ b/android/app/src/main/java/com/mattermost/rnbeta/MattermostManagedModule.java @@ -4,8 +4,15 @@ import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; import android.os.Bundle; import android.provider.Settings; +import android.view.WindowManager.LayoutParams; +import android.util.ArraySet; +import android.util.Log; + +import java.util.Set; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.NativeModule; @@ -15,14 +22,34 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.LifecycleEventListener; +import com.facebook.react.modules.core.DeviceEventManagerModule; -public class MattermostManagedModule extends ReactContextBaseJavaModule { +public class MattermostManagedModule extends ReactContextBaseJavaModule implements LifecycleEventListener { private static MattermostManagedModule instance; - private boolean shouldBlurAppScreen = false; + private static final String TAG = MattermostManagedModule.class.getSimpleName(); + + private final IntentFilter restrictionsFilter = + new IntentFilter(Intent.ACTION_APPLICATION_RESTRICTIONS_CHANGED); + + private final BroadcastReceiver restrictionsReceiver = new BroadcastReceiver() { + @Override public void onReceive(Context ctx, Intent intent) { + if (ctx != null) { + Bundle managedConfig = MainApplication.instance.loadManagedConfig(ctx); + + // Check current configuration settings, change your app's UI and + // functionality as necessary. + Log.i(TAG, "Managed Configuration Changed"); + sendConfigChanged(managedConfig); + handleBlurScreen(managedConfig); + } + } + }; private MattermostManagedModule(ReactApplicationContext reactContext) { super(reactContext); + reactContext.addLifecycleEventListener(this); } public static MattermostManagedModule getInstance(ReactApplicationContext reactContext) { @@ -42,15 +69,6 @@ public class MattermostManagedModule extends ReactContextBaseJavaModule { return "MattermostManaged"; } - @ReactMethod - public void blurAppScreen(boolean enabled) { - shouldBlurAppScreen = enabled; - } - - public boolean isBlurAppScreenEnabled() { - return shouldBlurAppScreen; - } - @ReactMethod public void getConfig(final Promise promise) { try { @@ -96,4 +114,110 @@ public class MattermostManagedModule extends ReactContextBaseJavaModule { getCurrentActivity().finish(); System.exit(0); } + + @Override + public void onHostResume() { + Activity activity = getCurrentActivity(); + Bundle managedConfig = MainApplication.instance.getManagedConfig(); + + if (activity != null && managedConfig != null) { + activity.registerReceiver(restrictionsReceiver, restrictionsFilter); + } + + ReactContext ctx = MainApplication.instance.getRunningReactContext(); + Bundle newManagedConfig = null; + if (ctx != null) { + newManagedConfig = MainApplication.instance.loadManagedConfig(ctx); + if (!equalBundles(newManagedConfig, managedConfig)) { + Log.i(TAG, "onResumed Managed Configuration Changed"); + sendConfigChanged(newManagedConfig); + } + } + + handleBlurScreen(newManagedConfig); + } + + @Override + public void onHostPause() { + Activity activity = getCurrentActivity(); + Bundle managedConfig = MainApplication.instance.getManagedConfig(); + + if (activity != null && managedConfig != null) { + try { + activity.unregisterReceiver(restrictionsReceiver); + } catch (IllegalArgumentException e) { + // Just ignore this cause the receiver wasn't registered for this activity + } + } + } + + @Override + public void onHostDestroy() { + } + + private void handleBlurScreen(Bundle config) { + Activity activity = getCurrentActivity(); + boolean blurAppScreen = false; + + if (config != null) { + blurAppScreen = Boolean.parseBoolean(config.getString("blurApplicationScreen")); + } + + if (blurAppScreen) { + activity.getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); + } else { + activity.getWindow().clearFlags(LayoutParams.FLAG_SECURE); + } + } + + private void sendConfigChanged(Bundle config) { + WritableMap result = Arguments.createMap(); + if (config != null) { + result = Arguments.fromBundle(config); + } + ReactContext ctx = MainApplication.instance.getRunningReactContext(); + + if (ctx != null) { + ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("managedConfigDidChange", result); + } + } + + private boolean equalBundles(Bundle one, Bundle two) { + if (one == null && two == null) { + return true; + } + + if (one == null || two == null) + return false; + + if(one.size() != two.size()) + return false; + + Set setOne = new ArraySet(); + setOne.addAll(one.keySet()); + setOne.addAll(two.keySet()); + Object valueOne; + Object valueTwo; + + for(String key : setOne) { + if (!one.containsKey(key) || !two.containsKey(key)) + return false; + + valueOne = one.get(key); + valueTwo = two.get(key); + if(valueOne instanceof Bundle && valueTwo instanceof Bundle && + !equalBundles((Bundle) valueOne, (Bundle) valueTwo)) { + return false; + } + else if(valueOne == null) { + if(valueTwo != null) + return false; + } + else if(!valueOne.equals(valueTwo)) + return false; + } + + return true; + } } diff --git a/app/mattermost_managed/mattermost-managed.android.js b/app/mattermost_managed/mattermost-managed.android.js index 2c2e24176..e1fb45426 100644 --- a/app/mattermost_managed/mattermost-managed.android.js +++ b/app/mattermost_managed/mattermost-managed.android.js @@ -5,6 +5,8 @@ import {NativeModules, DeviceEventEmitter} from 'react-native'; import LocalAuth from 'react-native-local-auth'; import JailMonkey from 'jail-monkey'; +import {emptyFunction} from 'app/utils/general'; + const {MattermostManaged} = NativeModules; const listeners = []; @@ -35,7 +37,7 @@ export default { } }, authenticate: LocalAuth.auth, - blurAppScreen: MattermostManaged.blurAppScreen, + blurAppScreen: emptyFunction, appGroupIdentifier: null, hasSafeAreaInsets: null, isRunningInSplitView: MattermostManaged.isRunningInSplitView,