• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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