1 // Copyright 2013 The Flutter Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package io.flutter.app; 6 7 import android.app.Activity; 8 import android.content.Context; 9 import android.content.Intent; 10 11 import io.flutter.embedding.engine.FlutterEngine; 12 import io.flutter.plugin.common.BinaryMessenger; 13 import io.flutter.plugin.common.PluginRegistry; 14 import io.flutter.plugin.platform.PlatformViewRegistry; 15 import io.flutter.plugin.platform.PlatformViewsController; 16 import io.flutter.view.FlutterMain; 17 import io.flutter.view.FlutterNativeView; 18 import io.flutter.view.FlutterView; 19 import io.flutter.view.TextureRegistry; 20 21 import java.util.ArrayList; 22 import java.util.LinkedHashMap; 23 import java.util.List; 24 import java.util.Map; 25 26 public class FlutterPluginRegistry 27 implements PluginRegistry, 28 PluginRegistry.RequestPermissionsResultListener, 29 PluginRegistry.ActivityResultListener, 30 PluginRegistry.NewIntentListener, 31 PluginRegistry.UserLeaveHintListener, 32 PluginRegistry.ViewDestroyListener { 33 private static final String TAG = "FlutterPluginRegistry"; 34 35 private Activity mActivity; 36 private Context mAppContext; 37 private FlutterNativeView mNativeView; 38 private FlutterView mFlutterView; 39 40 private final PlatformViewsController mPlatformViewsController; 41 private final Map<String, Object> mPluginMap = new LinkedHashMap<>(0); 42 private final List<RequestPermissionsResultListener> mRequestPermissionsResultListeners = new ArrayList<>(0); 43 private final List<ActivityResultListener> mActivityResultListeners = new ArrayList<>(0); 44 private final List<NewIntentListener> mNewIntentListeners = new ArrayList<>(0); 45 private final List<UserLeaveHintListener> mUserLeaveHintListeners = new ArrayList<>(0); 46 private final List<ViewDestroyListener> mViewDestroyListeners = new ArrayList<>(0); 47 FlutterPluginRegistry(FlutterNativeView nativeView, Context context)48 public FlutterPluginRegistry(FlutterNativeView nativeView, Context context) { 49 mNativeView = nativeView; 50 mAppContext = context; 51 mPlatformViewsController = new PlatformViewsController(); 52 } 53 FlutterPluginRegistry(FlutterEngine engine, Context context)54 public FlutterPluginRegistry(FlutterEngine engine, Context context) { 55 // TODO(mattcarroll): implement use of engine instead of nativeView. 56 mAppContext = context; 57 mPlatformViewsController = new PlatformViewsController(); 58 } 59 60 @Override hasPlugin(String key)61 public boolean hasPlugin(String key) { 62 return mPluginMap.containsKey(key); 63 } 64 65 @Override 66 @SuppressWarnings("unchecked") valuePublishedByPlugin(String pluginKey)67 public <T> T valuePublishedByPlugin(String pluginKey) { 68 return (T) mPluginMap.get(pluginKey); 69 } 70 71 @Override registrarFor(String pluginKey)72 public Registrar registrarFor(String pluginKey) { 73 if (mPluginMap.containsKey(pluginKey)) { 74 throw new IllegalStateException("Plugin key " + pluginKey + " is already in use"); 75 } 76 mPluginMap.put(pluginKey, null); 77 return new FlutterRegistrar(pluginKey); 78 } 79 attach(FlutterView flutterView, Activity activity)80 public void attach(FlutterView flutterView, Activity activity) { 81 mFlutterView = flutterView; 82 mActivity = activity; 83 mPlatformViewsController.attach(activity, flutterView, flutterView.getDartExecutor()); 84 } 85 detach()86 public void detach() { 87 mPlatformViewsController.detach(); 88 mPlatformViewsController.onFlutterViewDestroyed(); 89 mFlutterView = null; 90 mActivity = null; 91 } 92 onPreEngineRestart()93 public void onPreEngineRestart() { 94 mPlatformViewsController.onPreEngineRestart(); 95 } 96 getPlatformViewsController()97 public PlatformViewsController getPlatformViewsController() { 98 return mPlatformViewsController; 99 } 100 101 private class FlutterRegistrar implements Registrar { 102 private final String pluginKey; 103 FlutterRegistrar(String pluginKey)104 FlutterRegistrar(String pluginKey) { 105 this.pluginKey = pluginKey; 106 } 107 108 @Override activity()109 public Activity activity() { 110 return mActivity; 111 } 112 113 @Override context()114 public Context context() { 115 return mAppContext; 116 } 117 118 @Override activeContext()119 public Context activeContext() { 120 return (mActivity != null) ? mActivity : mAppContext; 121 } 122 123 @Override messenger()124 public BinaryMessenger messenger() { 125 return mNativeView; 126 } 127 128 @Override textures()129 public TextureRegistry textures() { 130 return mFlutterView; 131 } 132 133 @Override platformViewRegistry()134 public PlatformViewRegistry platformViewRegistry() { 135 return mPlatformViewsController.getRegistry(); 136 } 137 138 @Override view()139 public FlutterView view() { 140 return mFlutterView; 141 } 142 143 @Override lookupKeyForAsset(String asset)144 public String lookupKeyForAsset(String asset) { 145 return FlutterMain.getLookupKeyForAsset(asset); 146 } 147 148 @Override lookupKeyForAsset(String asset, String packageName)149 public String lookupKeyForAsset(String asset, String packageName) { 150 return FlutterMain.getLookupKeyForAsset(asset, packageName); 151 } 152 153 @Override publish(Object value)154 public Registrar publish(Object value) { 155 mPluginMap.put(pluginKey, value); 156 return this; 157 } 158 159 @Override addRequestPermissionsResultListener( RequestPermissionsResultListener listener)160 public Registrar addRequestPermissionsResultListener( 161 RequestPermissionsResultListener listener) { 162 mRequestPermissionsResultListeners.add(listener); 163 return this; 164 } 165 166 @Override addActivityResultListener(ActivityResultListener listener)167 public Registrar addActivityResultListener(ActivityResultListener listener) { 168 mActivityResultListeners.add(listener); 169 return this; 170 } 171 172 @Override addNewIntentListener(NewIntentListener listener)173 public Registrar addNewIntentListener(NewIntentListener listener) { 174 mNewIntentListeners.add(listener); 175 return this; 176 } 177 178 @Override addUserLeaveHintListener(UserLeaveHintListener listener)179 public Registrar addUserLeaveHintListener(UserLeaveHintListener listener) { 180 mUserLeaveHintListeners.add(listener); 181 return this; 182 } 183 184 @Override addViewDestroyListener(ViewDestroyListener listener)185 public Registrar addViewDestroyListener(ViewDestroyListener listener) { 186 mViewDestroyListeners.add(listener); 187 return this; 188 } 189 } 190 191 @Override onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)192 public boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 193 for (RequestPermissionsResultListener listener : mRequestPermissionsResultListeners) { 194 if (listener.onRequestPermissionsResult(requestCode, permissions, grantResults)) { 195 return true; 196 } 197 } 198 return false; 199 } 200 201 @Override onActivityResult(int requestCode, int resultCode, Intent data)202 public boolean onActivityResult(int requestCode, int resultCode, Intent data) { 203 for (ActivityResultListener listener : mActivityResultListeners) { 204 if (listener.onActivityResult(requestCode, resultCode, data)) { 205 return true; 206 } 207 } 208 return false; 209 } 210 211 @Override onNewIntent(Intent intent)212 public boolean onNewIntent(Intent intent) { 213 for (NewIntentListener listener : mNewIntentListeners) { 214 if (listener.onNewIntent(intent)) { 215 return true; 216 } 217 } 218 return false; 219 } 220 221 @Override onUserLeaveHint()222 public void onUserLeaveHint() { 223 for (UserLeaveHintListener listener : mUserLeaveHintListeners) { 224 listener.onUserLeaveHint(); 225 } 226 } 227 228 @Override onViewDestroy(FlutterNativeView view)229 public boolean onViewDestroy(FlutterNativeView view) { 230 boolean handled = false; 231 for (ViewDestroyListener listener : mViewDestroyListeners) { 232 if (listener.onViewDestroy(view)) { 233 handled = true; 234 } 235 } 236 return handled; 237 } 238 destroy()239 public void destroy() { 240 mPlatformViewsController.onFlutterViewDestroyed(); 241 } 242 } 243