Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
flutter_boost_1.22.4
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李增强
flutter_boost_1.22.4
Commits
6afc509d
Commit
6afc509d
authored
Oct 11, 2019
by
yangwu.jia
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.9版本升级
parent
d9ac3683
Changes
29
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
29 changed files
with
885 additions
and
2213 deletions
+885
-2213
android/src/main/java/com/idlefish/flutterboost/BoostEngineProvider.java
...n/java/com/idlefish/flutterboost/BoostEngineProvider.java
+0
-76
android/src/main/java/com/idlefish/flutterboost/BoostFlutterEngine.java
...in/java/com/idlefish/flutterboost/BoostFlutterEngine.java
+0
-392
android/src/main/java/com/idlefish/flutterboost/BoostFlutterView.java
...main/java/com/idlefish/flutterboost/BoostFlutterView.java
+0
-411
android/src/main/java/com/idlefish/flutterboost/BoostPluginRegistry.java
...n/java/com/idlefish/flutterboost/BoostPluginRegistry.java
+3
-3
android/src/main/java/com/idlefish/flutterboost/ContainerRecord.java
.../main/java/com/idlefish/flutterboost/ContainerRecord.java
+0
-1
android/src/main/java/com/idlefish/flutterboost/Debuger.java
android/src/main/java/com/idlefish/flutterboost/Debuger.java
+1
-1
android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java
...src/main/java/com/idlefish/flutterboost/FlutterBoost.java
+0
-283
android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java
...in/java/com/idlefish/flutterboost/FlutterBoostPlugin.java
+6
-7
android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java
.../main/java/com/idlefish/flutterboost/NewFlutterBoost.java
+83
-20
android/src/main/java/com/idlefish/flutterboost/Platform.java
...oid/src/main/java/com/idlefish/flutterboost/Platform.java
+34
-16
android/src/main/java/com/idlefish/flutterboost/SnapshotView.java
...src/main/java/com/idlefish/flutterboost/SnapshotView.java
+0
-97
android/src/main/java/com/idlefish/flutterboost/StateListener.java
...rc/main/java/com/idlefish/flutterboost/StateListener.java
+0
-47
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterActivity.java
...dlefish/flutterboost/containers/BoostFlutterActivity.java
+0
-271
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterDefaultActivity.java
.../flutterboost/containers/BoostFlutterDefaultActivity.java
+0
-41
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterFragment.java
...dlefish/flutterboost/containers/BoostFlutterFragment.java
+0
-159
android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java
...rboost/containers/FlutterActivityAndFragmentDelegate.java
+42
-68
android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java
...com/idlefish/flutterboost/containers/FlutterFragment.java
+682
-0
android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java
...m/idlefish/flutterboost/containers/FlutterSplashView.java
+1
-2
android/src/main/java/com/idlefish/flutterboost/containers/NewBoostFlutterActivity.java
...fish/flutterboost/containers/NewBoostFlutterActivity.java
+20
-7
android/src/main/java/com/idlefish/flutterboost/interfaces/IFlutterEngineProvider.java
...efish/flutterboost/interfaces/IFlutterEngineProvider.java
+0
-55
android/src/main/java/com/idlefish/flutterboost/interfaces/IFlutterViewContainer.java
...lefish/flutterboost/interfaces/IFlutterViewContainer.java
+0
-1
android/src/main/java/com/idlefish/flutterboost/interfaces/INativeRouter.java
...a/com/idlefish/flutterboost/interfaces/INativeRouter.java
+0
-1
android/src/main/java/com/idlefish/flutterboost/interfaces/IPlatform.java
.../java/com/idlefish/flutterboost/interfaces/IPlatform.java
+0
-75
android/src/main/java/com/idlefish/flutterboost/interfaces/IStateListener.java
.../com/idlefish/flutterboost/interfaces/IStateListener.java
+0
-18
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterFragment.java
.../taobao/idlefish/flutterboostexample/FlutterFragment.java
+0
-51
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterFragmentPageActivity.java
...fish/flutterboostexample/FlutterFragmentPageActivity.java
+5
-5
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterPageActivity.java
...bao/idlefish/flutterboostexample/FlutterPageActivity.java
+0
-56
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/MyApplication.java
...om/taobao/idlefish/flutterboostexample/MyApplication.java
+7
-48
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/PageRouter.java
...a/com/taobao/idlefish/flutterboostexample/PageRouter.java
+1
-1
No files found.
android/src/main/java/com/idlefish/flutterboost/BoostEngineProvider.java
deleted
100755 → 0
View file @
d9ac3683
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com.idlefish.flutterboost
;
import
android.content.Context
;
import
com.idlefish.flutterboost.interfaces.IFlutterEngineProvider
;
import
com.idlefish.flutterboost.interfaces.IStateListener
;
import
io.flutter.embedding.engine.FlutterEngine
;
import
io.flutter.embedding.engine.FlutterShellArgs
;
import
io.flutter.view.FlutterMain
;
public
class
BoostEngineProvider
implements
IFlutterEngineProvider
{
private
FlutterEngine
mEngine
=
null
;
public
BoostEngineProvider
()
{}
@Override
public
BoostFlutterEngine
createEngine
(
Context
context
)
{
return
new
BoostFlutterEngine
(
context
.
getApplicationContext
());
}
@Override
public
FlutterEngine
provideEngine
(
Context
context
)
{
Utils
.
assertCallOnMainThread
();
if
(
mEngine
==
null
)
{
FlutterShellArgs
flutterShellArgs
=
new
FlutterShellArgs
(
new
String
[
0
]);
FlutterMain
.
ensureInitializationComplete
(
context
.
getApplicationContext
(),
flutterShellArgs
.
toArray
());
mEngine
=
new
FlutterEngine
(
context
.
getApplicationContext
());
// final IStateListener stateListener = FlutterBoost.sInstance.mStateListener;
// if(stateListener != null) {
// stateListener.onEngineCreated(mEngine);
// }
}
return
mEngine
;
}
@Override
public
FlutterEngine
tryGetEngine
()
{
return
mEngine
;
}
public
static
void
assertEngineRunning
(){
final
FlutterEngine
engine
=
NewFlutterBoost
.
instance
().
engineProvider
().
tryGetEngine
();
// if(engine == null || !engine.isRunning()) {
// throw new RuntimeException("engine is not running yet!");
// }
}
}
android/src/main/java/com/idlefish/flutterboost/BoostFlutterEngine.java
deleted
100644 → 0
View file @
d9ac3683
This diff is collapsed.
Click to expand it.
android/src/main/java/com/idlefish/flutterboost/BoostFlutterView.java
deleted
100644 → 0
View file @
d9ac3683
This diff is collapsed.
Click to expand it.
android/src/main/java/com/idlefish/flutterboost/BoostPluginRegistry.java
View file @
6afc509d
...
...
@@ -46,13 +46,13 @@ public class BoostPluginRegistry extends FlutterPluginRegistry {
Activity
activity
;
IContainerRecord
record
;
record
=
FlutterBoost
.
singleton
().
containerManager
().
getCurrentTopRecord
();
record
=
NewFlutterBoost
.
instance
().
containerManager
().
getCurrentTopRecord
();
if
(
record
==
null
)
{
record
=
FlutterBoost
.
singleton
().
containerManager
().
getLastGenerateRecord
();
record
=
NewFlutterBoost
.
instance
().
containerManager
().
getLastGenerateRecord
();
}
if
(
record
==
null
)
{
activity
=
FlutterBoost
.
singleton
().
currentActivity
();
activity
=
NewFlutterBoost
.
instance
().
currentActivity
();
}
else
{
activity
=
record
.
getContainer
().
getContextActivity
();
}
...
...
android/src/main/java/com/idlefish/flutterboost/ContainerRecord.java
View file @
6afc509d
...
...
@@ -69,7 +69,6 @@ public class ContainerRecord implements IContainerRecord {
@Override
public
void
onCreate
()
{
Utils
.
assertCallOnMainThread
();
BoostEngineProvider
.
assertEngineRunning
();
if
(
mState
!=
STATE_UNKNOW
)
{
Debuger
.
exception
(
"state error"
);
...
...
android/src/main/java/com/idlefish/flutterboost/Debuger.java
View file @
6afc509d
...
...
@@ -60,7 +60,7 @@ public class Debuger {
public
static
boolean
isDebug
(){
try
{
return
FlutterBoost
.
singleton
().
platform
().
isDebug
();
return
NewFlutterBoost
.
instance
().
platform
().
isDebug
();
}
catch
(
Throwable
t
){
return
false
;
}
...
...
android/src/main/java/com/idlefish/flutterboost/FlutterBoost.java
deleted
100755 → 0
View file @
d9ac3683
This diff is collapsed.
Click to expand it.
android/src/main/java/com/idlefish/flutterboost/FlutterBoostPlugin.java
View file @
6afc509d
...
...
@@ -3,7 +3,6 @@ package com.idlefish.flutterboost;
import
android.support.annotation.Nullable
;
import
com.idlefish.flutterboost.interfaces.IContainerRecord
;
import
com.idlefish.flutterboost.interfaces.IStateListener
;
import
java.io.Serializable
;
import
java.util.HashMap
;
...
...
@@ -50,12 +49,12 @@ public class FlutterBoostPlugin {
a
.
onChannelRegistered
(
sInstance
);
}
if
(
FlutterBoost
.
sInstance
!=
null
)
{
final
IStateListener
stateListener
=
FlutterBoost
.
sInstance
.
mStateListener
;
if
(
stateListener
!=
null
)
{
stateListener
.
onChannelRegistered
(
registrar
,
sInstance
);
}
}
// if (NewFlutterBoost.instance()
!= null) {
// final IStateListener stateListener = NewFlutterBoost.instance()
.mStateListener;
//
if (stateListener != null) {
//
stateListener.onChannelRegistered(registrar, sInstance);
//
}
//
}
sActions
.
clear
();
}
...
...
android/src/main/java/com/idlefish/flutterboost/NewFlutterBoost.java
View file @
6afc509d
...
...
@@ -7,8 +7,11 @@ import android.content.Context;
import
android.os.Bundle
;
import
android.support.annotation.NonNull
;
import
com.idlefish.flutterboost.interfaces.*
;
import
io.flutter.app.FlutterPluginRegistry
;
import
io.flutter.Log
;
import
io.flutter.embedding.android.FlutterView
;
import
io.flutter.embedding.engine.FlutterEngine
;
import
io.flutter.embedding.engine.dart.DartExecutor
;
import
io.flutter.view.FlutterMain
;
import
java.util.HashMap
;
import
java.util.Map
;
...
...
@@ -16,8 +19,9 @@ import java.util.Map;
public
class
NewFlutterBoost
{
private
Platform
mPlatform
;
private
FlutterViewContainerManager
mManager
;
private
IFlutterEngineProvider
mEngineProvider
;
private
Activity
mCurrentActiveActivity
;
static
NewFlutterBoost
sInstance
=
null
;
...
...
@@ -35,15 +39,22 @@ public class NewFlutterBoost {
mPlatform
=
platform
;
mManager
=
new
FlutterViewContainerManager
();
mEngineProvider
=
platform
.
engineProvider
();
if
(
mPlatform
.
whenEngineStart
()
==
ConfigBuilder
.
IMMEDIATELY
)
{
doInitialFlutterViewRun
(
mPlatform
);
}
platform
.
getApplication
().
registerActivityLifecycleCallbacks
(
new
Application
.
ActivityLifecycleCallbacks
()
{
@Override
public
void
onActivityCreated
(
Activity
activity
,
Bundle
savedInstanceState
)
{
if
(
mPlatform
.
whenEngineStart
()
==
IPlatform
.
ANY_ACTIVITY_CREATED
)
{
Log
.
e
(
"bbbb1"
,
"xxxxx"
);
if
(
mPlatform
.
whenEngineStart
()
==
ConfigBuilder
.
ANY_ACTIVITY_CREATED
)
{
Log
.
e
(
"bbbb2"
,
"xxxxx"
);
doInitialFlutterViewRun
(
mPlatform
);
}
}
...
...
@@ -52,7 +63,7 @@ public class NewFlutterBoost {
if
(
mCurrentActiveActivity
==
null
)
{
Debuger
.
log
(
"Application entry foreground"
);
if
(
NewFlutterBoost
.
instance
().
engineProvider
()
.
tryGetEngine
()
!=
null
)
{
if
(
NewFlutterBoost
.
instance
().
engineProvider
()
!=
null
)
{
HashMap
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
"type"
,
"foreground"
);
channel
().
sendEvent
(
"lifecycle"
,
map
);
...
...
@@ -76,7 +87,7 @@ public class NewFlutterBoost {
if
(
mCurrentActiveActivity
==
activity
)
{
Debuger
.
log
(
"Application entry background"
);
if
(
m
EngineProvider
.
tryGetEngine
()
!=
null
)
{
if
(
m
Platform
.
engineProvider
()
!=
null
)
{
HashMap
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
"type"
,
"background"
);
channel
().
sendEvent
(
"lifecycle"
,
map
);
...
...
@@ -95,7 +106,7 @@ public class NewFlutterBoost {
if
(
mCurrentActiveActivity
==
activity
)
{
Debuger
.
log
(
"Application entry background"
);
if
(
m
EngineProvider
.
tryGetEngine
()
!=
null
)
{
if
(
m
Platform
.
engineProvider
()
!=
null
)
{
HashMap
<
String
,
String
>
map
=
new
HashMap
<>();
map
.
put
(
"type"
,
"background"
);
channel
().
sendEvent
(
"lifecycle"
,
map
);
...
...
@@ -106,21 +117,60 @@ public class NewFlutterBoost {
});
BoostPluginRegistry
registry
=
new
BoostPluginRegistry
(
this
.
engineProvider
().
provideEngine
(
mPlatform
.
getApplication
()
),
BoostPluginRegistry
registry
=
new
BoostPluginRegistry
(
this
.
engineProvider
(
),
mPlatform
.
getApplication
());
mPlatform
.
registerPlugins
(
registry
);
}
private
void
doInitialFlutterViewRun
(
Platform
platform
)
{
// Don't attempt to start a FlutterEngine if we're using a cached FlutterEngine.
// if (host.getCachedEngineId() != null) {
// return;
// }
FlutterEngine
flutterEngine
=
platform
.
engineProvider
();
if
(
flutterEngine
.
getDartExecutor
().
isExecutingDart
())
{
// No warning is logged because this situation will happen on every config
// change if the developer does not choose to retain the Fragment instance.
// So this is expected behavior in many cases.
return
;
}
Log
.
e
(
"bbbb3"
,
"xxxxx"
);
// The engine needs to receive the Flutter app's initial route before executing any
// Dart code to ensure that the initial route arrives in time to be applied.
if
(
platform
.
initialRoute
()
!=
null
)
{
flutterEngine
.
getNavigationChannel
().
setInitialRoute
(
platform
.
initialRoute
());
}
// Configure the Dart entrypoint and execute it.
DartExecutor
.
DartEntrypoint
entrypoint
=
new
DartExecutor
.
DartEntrypoint
(
FlutterMain
.
findAppBundlePath
(),
"main"
);
flutterEngine
.
getDartExecutor
().
executeDartEntrypoint
(
entrypoint
);
}
public
static
class
ConfigBuilder
{
protected
static
final
String
DEFAULT_DART_ENTRYPOINT
=
"main"
;
protected
static
final
String
DEFAULT_INITIAL_ROUTE
=
"/"
;
public
static
final
String
DEFAULT_DART_ENTRYPOINT
=
"main"
;
public
static
final
String
DEFAULT_INITIAL_ROUTE
=
"/"
;
public
static
int
IMMEDIATELY
=
0
;
//立即启动引擎
public
static
int
ANY_ACTIVITY_CREATED
=
1
;
//当有任何Activity创建时,启动引擎
private
String
dartEntrypoint
=
DEFAULT_DART_ENTRYPOINT
;
private
String
initialRoute
=
DEFAULT_INITIAL_ROUTE
;
private
int
whenEngineStart
=
ANY_ACTIVITY_CREATED
;
private
boolean
isDebug
=
false
;
private
int
whenEngineStart
=
1
;
private
FlutterView
.
RenderMode
renderMode
=
FlutterView
.
RenderMode
.
surface
;
private
Application
mApp
;
private
INativeRouter
router
=
null
;
...
...
@@ -130,11 +180,21 @@ public class NewFlutterBoost {
this
.
mApp
=
app
;
}
public
ConfigBuilder
renderMode
(
FlutterView
.
RenderMode
renderMode
)
{
this
.
renderMode
=
renderMode
;
return
this
;
}
public
ConfigBuilder
dartEntrypoint
(
@NonNull
String
dartEntrypoint
)
{
this
.
dartEntrypoint
=
dartEntrypoint
;
return
this
;
}
public
ConfigBuilder
initialRoute
(
@NonNull
String
initialRoute
)
{
this
.
initialRoute
=
initialRoute
;
return
this
;
}
public
ConfigBuilder
isDebug
(
boolean
isDebug
)
{
this
.
isDebug
=
isDebug
;
return
this
;
...
...
@@ -148,7 +208,7 @@ public class NewFlutterBoost {
public
Platform
build
()
{
Platform
platform
=
new
Platform
()
{
@Override
public
Application
getApplication
()
{
return
ConfigBuilder
.
this
.
mApp
;
}
...
...
@@ -159,19 +219,22 @@ public class NewFlutterBoost {
}
@Override
public
String
initialRoute
()
{
return
ConfigBuilder
.
this
.
initialRoute
;
}
public
void
openContainer
(
Context
context
,
String
url
,
Map
<
String
,
Object
>
urlParams
,
int
requestCode
,
Map
<
String
,
Object
>
exts
)
{
router
.
openContainer
(
context
,
url
,
urlParams
,
requestCode
,
exts
);
}
@Override
public
IFlutterEngineProvider
engineProvider
()
{
return
new
BoostEngineProvider
();
}
public
int
whenEngineStart
()
{
return
ConfigBuilder
.
this
.
whenEngineStart
;
}
public
FlutterView
.
RenderMode
renderMode
()
{
return
ConfigBuilder
.
this
.
renderMode
;
}
};
return
platform
;
...
...
@@ -181,15 +244,15 @@ public class NewFlutterBoost {
}
public
IFlutterEngineProvider
engineProvider
()
{
return
sInstance
.
m
EngineProvider
;
public
FlutterEngine
engineProvider
()
{
return
sInstance
.
m
Platform
.
engineProvider
()
;
}
public
IContainerManager
containerManager
()
{
return
sInstance
.
mManager
;
}
public
I
Platform
platform
()
{
public
Platform
platform
()
{
return
sInstance
.
mPlatform
;
}
...
...
android/src/main/java/com/idlefish/flutterboost/Platform.java
View file @
6afc509d
package
com.idlefish.flutterboost
;
import
android.app.Application
;
import
android.content.Context
;
import
com.idlefish.flutterboost.interfaces.IContainerRecord
;
import
com.idlefish.flutterboost.interfaces.IFlutterEngineProvider
;
import
com.idlefish.flutterboost.interfaces.IPlatform
;
import
java.lang.reflect.Method
;
import
java.util.Map
;
import
io.flutter.embedding.android.FlutterView
;
import
io.flutter.embedding.engine.FlutterEngine
;
import
io.flutter.embedding.engine.FlutterShellArgs
;
import
io.flutter.plugin.common.PluginRegistry
;
import
io.flutter.view.FlutterMain
;
public
abstract
class
Platform
implements
IPlatform
{
public
abstract
class
Platform
{
public
FlutterEngine
mEngine
;
public
abstract
Application
getApplication
();
public
abstract
void
openContainer
(
Context
context
,
String
url
,
Map
<
String
,
Object
>
urlParams
,
int
requestCode
,
Map
<
String
,
Object
>
exts
);
public
abstract
int
whenEngineStart
()
;
public
abstract
FlutterView
.
RenderMode
renderMode
();
public
abstract
boolean
isDebug
()
;
public
abstract
String
initialRoute
();
@Override
public
boolean
isDebug
()
{
return
false
;
}
@Override
public
void
closeContainer
(
IContainerRecord
record
,
Map
<
String
,
Object
>
result
,
Map
<
String
,
Object
>
exts
)
{
if
(
record
==
null
)
return
;
record
.
getContainer
().
finishContainer
(
result
);
}
@Override
public
IFlutterEngineProvider
engineProvider
()
{
return
new
BoostEngineProvider
();
public
FlutterEngine
engineProvider
()
{
if
(
mEngine
==
null
)
{
FlutterShellArgs
flutterShellArgs
=
new
FlutterShellArgs
(
new
String
[
0
]);
FlutterMain
.
ensureInitializationComplete
(
getApplication
().
getApplicationContext
(),
flutterShellArgs
.
toArray
());
mEngine
=
new
FlutterEngine
(
getApplication
().
getApplicationContext
());
}
return
mEngine
;
}
@Override
public
void
registerPlugins
(
PluginRegistry
registry
)
{
try
{
Class
clz
=
Class
.
forName
(
"io.flutter.plugins.GeneratedPluginRegistrant"
);
...
...
@@ -39,8 +60,5 @@ public abstract class Platform implements IPlatform {
}
}
@Override
public
int
whenEngineStart
()
{
return
ANY_ACTIVITY_CREATED
;
}
}
android/src/main/java/com/idlefish/flutterboost/SnapshotView.java
deleted
100644 → 0
View file @
d9ac3683
package
com.idlefish.flutterboost
;
import
android.content.Context
;
import
android.graphics.Bitmap
;
import
android.graphics.Color
;
import
android.support.annotation.NonNull
;
import
android.support.annotation.Nullable
;
import
android.util.AttributeSet
;
import
android.view.Gravity
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.widget.FrameLayout
;
import
android.widget.ImageView
;
import
java.util.LinkedList
;
import
java.util.List
;
public
class
SnapshotView
extends
FrameLayout
{
private
ImageView
mImg
;
public
SnapshotView
(
@NonNull
Context
context
)
{
super
(
context
);
init
();
}
public
SnapshotView
(
@NonNull
Context
context
,
@Nullable
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
init
();
}
public
SnapshotView
(
@NonNull
Context
context
,
@Nullable
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
init
();
}
private
void
init
(){
setBackgroundColor
(
Color
.
RED
);
mImg
=
new
ImageView
(
getContext
());
FrameLayout
.
LayoutParams
params
=
new
FrameLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
MATCH_PARENT
);
params
.
gravity
=
Gravity
.
CENTER
;
mImg
.
setScaleType
(
ImageView
.
ScaleType
.
FIT_XY
);
mImg
.
setLayoutParams
(
params
);
addView
(
mImg
);
}
public
void
toggleSnapshot
(
BoostFlutterView
flutterView
){
if
(!
dismissSnapshot
(
flutterView
))
{
showSnapshot
(
flutterView
);
}
}
public
boolean
showSnapshot
(
BoostFlutterView
flutterView
){
if
(
flutterView
==
null
)
return
false
;
dismissSnapshot
(
flutterView
);
final
Bitmap
bitmap
=
flutterView
.
getEngine
().
getRenderer
().
getBitmap
();
if
(
bitmap
==
null
||
bitmap
.
isRecycled
())
{
return
false
;
}
mImg
.
setImageBitmap
(
bitmap
);
flutterView
.
addView
(
this
,
new
FrameLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
MATCH_PARENT
));
Debuger
.
log
(
"showSnapshot"
);
return
true
;
}
public
boolean
dismissSnapshot
(
BoostFlutterView
flutterView
){
List
<
View
>
snapshots
=
new
LinkedList
<>();
for
(
int
index
=
0
;
index
<
flutterView
.
getChildCount
();
index
++){
View
view
=
flutterView
.
getChildAt
(
index
);
if
(
view
instanceof
SnapshotView
)
{
snapshots
.
add
(
view
);
}
}
if
(
snapshots
.
isEmpty
())
{
return
false
;
}
else
{
for
(
View
v:
snapshots
)
{
flutterView
.
removeView
(
v
);
}
Debuger
.
log
(
"dismissSnapshot"
);
return
true
;
}
}
}
android/src/main/java/com/idlefish/flutterboost/StateListener.java
deleted
100644 → 0
View file @
d9ac3683
package
com.idlefish.flutterboost
;
import
com.idlefish.flutterboost.interfaces.IStateListener
;
import
io.flutter.plugin.common.PluginRegistry
;
public
class
StateListener
implements
IStateListener
{
@Override
public
void
onEngineCreated
(
BoostFlutterEngine
engine
)
{
Debuger
.
log
(
">>onEngineCreated"
);
}
@Override
public
void
onEngineStarted
(
BoostFlutterEngine
engine
)
{
Debuger
.
log
(
">>onEngineStarted"
);
}
@Override
public
void
onChannelRegistered
(
PluginRegistry
.
Registrar
registrar
,
FlutterBoostPlugin
channel
)
{
Debuger
.
log
(
">>onFlutterViewInited"
);
}
@Override
public
void
onFlutterViewInited
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
)
{
Debuger
.
log
(
">>onFlutterViewInited"
);
}
@Override
public
void
beforeEngineAttach
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
)
{
Debuger
.
log
(
">>beforeEngineAttach"
);
}
@Override
public
void
afterEngineAttached
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
)
{
Debuger
.
log
(
">>afterEngineAttached"
);
}
@Override
public
void
beforeEngineDetach
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
)
{
Debuger
.
log
(
">>beforeEngineDetach"
);
}
@Override
public
void
afterEngineDetached
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
)
{
Debuger
.
log
(
">>afterEngineDetached"
);
}
}
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterActivity.java
deleted
100644 → 0
View file @
d9ac3683
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com.idlefish.flutterboost.containers
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.graphics.Color
;
import
android.graphics.drawable.ColorDrawable
;
import
android.os.Build
;
import
android.os.Bundle
;
import
android.os.Handler
;
import
android.os.Looper
;
import
android.view.Gravity
;
import
android.view.KeyEvent
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
android.widget.FrameLayout
;
import
android.widget.LinearLayout
;
import
android.widget.ProgressBar
;
import
android.widget.TextView
;
import
com.idlefish.flutterboost.BoostFlutterEngine
;
import
com.idlefish.flutterboost.BoostFlutterView
;
import
com.idlefish.flutterboost.FlutterBoost
;
import
com.idlefish.flutterboost.Utils
;
import
com.idlefish.flutterboost.interfaces.IFlutterViewContainer
;
import
com.idlefish.flutterboost.interfaces.IOperateSyncer
;
import
java.io.Serializable
;
import
java.util.HashMap
;
import
java.util.Map
;
import
io.flutter.embedding.android.FlutterView
;
import
io.flutter.plugin.platform.PlatformPlugin
;
public
abstract
class
BoostFlutterActivity
extends
Activity
implements
IFlutterViewContainer
{
protected
BoostFlutterEngine
mFlutterEngine
;
protected
BoostFlutterView
mFlutterView
;
protected
IOperateSyncer
mSyncer
;
private
Handler
mHandler
=
new
Handler
(
Looper
.
getMainLooper
());
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
configureWindowForTransparency
();
mSyncer
=
FlutterBoost
.
singleton
().
containerManager
().
generateSyncer
(
this
);
mFlutterEngine
=
createFlutterEngine
();
mFlutterView
=
createFlutterView
(
mFlutterEngine
);
setContentView
(
mFlutterView
);
mSyncer
.
onCreate
();
configureStatusBarForFullscreenFlutterExperience
();
}
@Override
public
void
onAttachedToWindow
()
{
super
.
onAttachedToWindow
();
mHandler
.
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
configureStatusBarForFullscreenFlutterExperience
();
}
});
}
protected
void
configureWindowForTransparency
()
{
if
(
isBackgroundTransparent
())
{
getWindow
().
setBackgroundDrawable
(
new
ColorDrawable
(
Color
.
TRANSPARENT
));
getWindow
().
setFlags
(
WindowManager
.
LayoutParams
.
FLAG_LAYOUT_NO_LIMITS
,
WindowManager
.
LayoutParams
.
FLAG_LAYOUT_NO_LIMITS
);
}
}
protected
void
configureStatusBarForFullscreenFlutterExperience
()
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
LOLLIPOP
)
{
Window
window
=
getWindow
();
window
.
addFlags
(
WindowManager
.
LayoutParams
.
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
);
window
.
setStatusBarColor
(
Color
.
TRANSPARENT
);
window
.
getDecorView
().
setSystemUiVisibility
(
PlatformPlugin
.
DEFAULT_SYSTEM_UI
);
}
Utils
.
setStatusBarLightMode
(
this
,
true
);
}
protected
BoostFlutterEngine
createFlutterEngine
(){
// return FlutterBoost.singleton().engineProvider().provideEngine(this);
return
null
;
}
protected
BoostFlutterView
createFlutterView
(
BoostFlutterEngine
engine
){
BoostFlutterView
.
Builder
builder
=
new
BoostFlutterView
.
Builder
(
this
);
return
builder
.
flutterEngine
(
engine
)
.
renderMode
(
FlutterView
.
RenderMode
.
texture
)
.
transparencyMode
(
isBackgroundTransparent
()
?
FlutterView
.
TransparencyMode
.
transparent
:
FlutterView
.
TransparencyMode
.
opaque
)
.
renderingProgressCoverCreator
(
new
BoostFlutterView
.
RenderingProgressCoverCreator
()
{
@Override
public
View
createRenderingProgressCover
(
Context
context
)
{
return
BoostFlutterActivity
.
this
.
createRenderingProgressCover
();
}
})
.
build
();
}
protected
boolean
isBackgroundTransparent
(){
return
false
;
}
protected
View
createRenderingProgressCover
(){
FrameLayout
frameLayout
=
new
FrameLayout
(
this
);
LinearLayout
linearLayout
=
new
LinearLayout
(
this
);
linearLayout
.
setOrientation
(
LinearLayout
.
VERTICAL
);
FrameLayout
.
LayoutParams
layoutParams
=
new
FrameLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
);
layoutParams
.
gravity
=
Gravity
.
CENTER
;
frameLayout
.
addView
(
linearLayout
,
layoutParams
);
ProgressBar
progressBar
=
new
ProgressBar
(
this
);
LinearLayout
.
LayoutParams
params
=
new
LinearLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
);
params
.
gravity
=
Gravity
.
CENTER_HORIZONTAL
;
linearLayout
.
addView
(
progressBar
,
params
);
TextView
textView
=
new
TextView
(
this
);
params
=
new
LinearLayout
.
LayoutParams
(
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
);
params
.
gravity
=
Gravity
.
CENTER_HORIZONTAL
;
textView
.
setText
(
"Frame Rendering..."
);
linearLayout
.
addView
(
textView
,
params
);
return
frameLayout
;
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
mSyncer
.
onAppear
();
mFlutterEngine
.
getLifecycleChannel
().
appIsResumed
();
}
@Override
protected
void
onPause
()
{
mSyncer
.
onDisappear
();
super
.
onPause
();
mFlutterEngine
.
getLifecycleChannel
().
appIsInactive
();
}
@Override
protected
void
onDestroy
()
{
Utils
.
fixInputMethodManagerLeak
(
this
);
mSyncer
.
onDestroy
();
super
.
onDestroy
();
}
@Override
public
void
onBackPressed
()
{
mSyncer
.
onBackPressed
();
}
@Override
protected
void
onNewIntent
(
Intent
intent
)
{
super
.
onNewIntent
(
intent
);
mSyncer
.
onNewIntent
(
intent
);
}
@Override
protected
void
onActivityResult
(
int
requestCode
,
int
resultCode
,
Intent
data
)
{
super
.
onActivityResult
(
requestCode
,
resultCode
,
data
);
mSyncer
.
onActivityResult
(
requestCode
,
resultCode
,
data
);
Map
<
String
,
Object
>
result
=
null
;
if
(
data
!=
null
)
{
Serializable
rlt
=
data
.
getSerializableExtra
(
RESULT_KEY
);
if
(
rlt
instanceof
Map
)
{
result
=
(
Map
<
String
,
Object
>)
rlt
;
}
}
mSyncer
.
onContainerResult
(
requestCode
,
resultCode
,
result
);
}
@Override
public
void
onRequestPermissionsResult
(
int
requestCode
,
String
[]
permissions
,
int
[]
grantResults
)
{
super
.
onRequestPermissionsResult
(
requestCode
,
permissions
,
grantResults
);
mSyncer
.
onRequestPermissionsResult
(
requestCode
,
permissions
,
grantResults
);
}
@Override
public
void
onTrimMemory
(
int
level
)
{
super
.
onTrimMemory
(
level
);
mSyncer
.
onTrimMemory
(
level
);
}
@Override
public
void
onLowMemory
()
{
super
.
onLowMemory
();
mSyncer
.
onLowMemory
();
}
@Override
protected
void
onUserLeaveHint
()
{
super
.
onUserLeaveHint
();
mSyncer
.
onUserLeaveHint
();
}
@Override
public
Activity
getContextActivity
()
{
return
this
;
}
// @Override
// public BoostFlutterView getBoostFlutterView() {
// return mFlutterView;
// }
@Override
public
void
finishContainer
(
Map
<
String
,
Object
>
result
)
{
if
(
result
!=
null
)
{
FlutterBoost
.
setBoostResult
(
this
,
new
HashMap
<>(
result
));
finish
();
}
else
{
finish
();
}
}
@Override
public
void
onContainerShown
()
{}
@Override
public
void
onContainerHidden
()
{}
}
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterDefaultActivity.java
deleted
100644 → 0
View file @
d9ac3683
package
com.idlefish.flutterboost.containers
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.content.Intent
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
BoostFlutterDefaultActivity
extends
BoostFlutterActivity
{
@Override
public
FlutterSplashView
getBoostFlutterView
()
{
return
null
;
}
@Override
public
String
getContainerUrl
()
{
return
getIntent
().
getStringExtra
(
"url"
);
}
@Override
public
Map
getContainerUrlParams
()
{
return
(
Map
)(
getIntent
().
getSerializableExtra
(
"params"
));
}
private
static
Intent
intent
(
Context
context
,
String
url
,
HashMap
<
String
,
Object
>
params
)
{
final
Intent
intent
=
new
Intent
(
context
,
BoostFlutterDefaultActivity
.
class
);
intent
.
putExtra
(
"url"
,
url
);
intent
.
putExtra
(
"params"
,
params
);
return
intent
;
}
public
static
void
open
(
Context
context
,
String
url
,
HashMap
<
String
,
Object
>
params
)
{
context
.
startActivity
(
intent
(
context
,
url
,
params
));
}
public
static
void
open
(
Activity
activity
,
String
url
,
HashMap
<
String
,
Object
>
params
,
int
requestCode
)
{
activity
.
startActivityForResult
(
intent
(
activity
,
url
,
params
),
requestCode
);
}
}
\ No newline at end of file
android/src/main/java/com/idlefish/flutterboost/containers/BoostFlutterFragment.java
deleted
100755 → 0
View file @
d9ac3683
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com.idlefish.flutterboost.containers
;
import
android.app.Activity
;
import
android.content.Intent
;
import
android.os.Build
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
android.support.v4.app.Fragment
;
import
android.view.LayoutInflater
;
import
android.view.View
;
import
android.view.ViewGroup
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
com.idlefish.flutterboost.BoostFlutterEngine
;
import
com.idlefish.flutterboost.BoostFlutterView
;
import
com.idlefish.flutterboost.FlutterBoost
;
import
com.idlefish.flutterboost.Utils
;
import
com.idlefish.flutterboost.interfaces.IFlutterViewContainer
;
import
com.idlefish.flutterboost.interfaces.IOperateSyncer
;
import
java.util.Map
;
import
io.flutter.embedding.android.FlutterView
;
import
io.flutter.plugin.platform.PlatformPlugin
;
abstract
public
class
BoostFlutterFragment
extends
Fragment
implements
IFlutterViewContainer
{
protected
BoostFlutterEngine
mFlutterEngine
;
protected
BoostFlutterView
mFlutterView
;
protected
IOperateSyncer
mSyncer
;
@Nullable
@Override
public
View
onCreateView
(
LayoutInflater
inflater
,
@Nullable
ViewGroup
container
,
@Nullable
Bundle
savedInstanceState
)
{
mSyncer
=
FlutterBoost
.
singleton
().
containerManager
().
generateSyncer
(
this
);
mFlutterEngine
=
createFlutterEngine
();
mFlutterView
=
createFlutterView
(
mFlutterEngine
);
mSyncer
.
onCreate
();
return
mFlutterView
;
}
protected
BoostFlutterEngine
createFlutterEngine
(){
// return FlutterBoost.singleton().engineProvider().provideEngine(getContext());
return
null
;
}
protected
BoostFlutterView
createFlutterView
(
BoostFlutterEngine
engine
){
BoostFlutterView
.
Builder
builder
=
new
BoostFlutterView
.
Builder
(
getContextActivity
());
return
builder
.
flutterEngine
(
engine
)
.
renderMode
(
FlutterView
.
RenderMode
.
texture
)
.
transparencyMode
(
FlutterView
.
TransparencyMode
.
opaque
)
.
build
();
}
@Override
public
void
onResume
()
{
super
.
onResume
();
mSyncer
.
onAppear
();
mFlutterEngine
.
getLifecycleChannel
().
appIsResumed
();
}
@Override
public
void
onPause
()
{
mSyncer
.
onDisappear
();
super
.
onPause
();
mFlutterEngine
.
getLifecycleChannel
().
appIsInactive
();
}
@Override
public
void
onDestroy
()
{
mSyncer
.
onDestroy
();
super
.
onDestroy
();
}
public
void
onBackPressed
()
{
mSyncer
.
onBackPressed
();
}
public
void
onNewIntent
(
Intent
intent
)
{
mSyncer
.
onNewIntent
(
intent
);
}
@Override
public
void
onActivityResult
(
int
requestCode
,
int
resultCode
,
Intent
data
)
{
super
.
onActivityResult
(
requestCode
,
resultCode
,
data
);
mSyncer
.
onActivityResult
(
requestCode
,
resultCode
,
data
);
}
@Override
public
void
onRequestPermissionsResult
(
int
requestCode
,
String
[]
permissions
,
int
[]
grantResults
)
{
super
.
onRequestPermissionsResult
(
requestCode
,
permissions
,
grantResults
);
mSyncer
.
onRequestPermissionsResult
(
requestCode
,
permissions
,
grantResults
);
}
public
void
onTrimMemory
(
int
level
)
{
mSyncer
.
onTrimMemory
(
level
);
}
@Override
public
void
onLowMemory
()
{
super
.
onLowMemory
();
mSyncer
.
onLowMemory
();
}
public
void
onUserLeaveHint
()
{
mSyncer
.
onUserLeaveHint
();
}
@Override
public
Activity
getContextActivity
()
{
return
getActivity
();
}
// @Override
// public BoostFlutterView getBoostFlutterView() {
// return mFlutterView;
// }
@Override
public
void
finishContainer
(
Map
<
String
,
Object
>
result
)
{
getFragmentManager
().
popBackStack
();
}
@Override
public
void
onContainerShown
()
{}
@Override
public
void
onContainerHidden
()
{}
}
android/src/main/java/com/idlefish/flutterboost/containers/FlutterActivityAndFragmentDelegate.java
View file @
6afc509d
...
...
@@ -19,8 +19,7 @@ import java.util.Arrays;
import
java.util.HashMap
;
import
java.util.Map
;
import
com.idlefish.flutterboost.BoostFlutterView
;
import
com.idlefish.flutterboost.FlutterBoost
;
import
com.idlefish.flutterboost.NewFlutterBoost
;
import
com.idlefish.flutterboost.interfaces.IFlutterViewContainer
;
import
com.idlefish.flutterboost.interfaces.IOperateSyncer
;
...
...
@@ -63,7 +62,9 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
private
final
OnFirstFrameRenderedListener
onFirstFrameRenderedListener
=
new
OnFirstFrameRenderedListener
()
{
@Override
public
void
onFirstFrameRendered
()
{
host
.
onFirstFrameRendered
();
if
(
host
!=
null
){
host
.
onFirstFrameRendered
();
}
}
};
...
...
@@ -136,15 +137,15 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
Log
.
d
(
TAG
,
"Setting up FlutterEngine."
);
// First, check if the host wants to use a cached FlutterEngine.
String
cachedEngineId
=
host
.
getCachedEngineId
();
if
(
cachedEngineId
!=
null
)
{
flutterEngine
=
FlutterEngineCache
.
getInstance
().
get
(
cachedEngineId
);
isFlutterEngineFromHost
=
true
;
if
(
flutterEngine
==
null
)
{
throw
new
IllegalStateException
(
"The requested cached FlutterEngine did not exist in the FlutterEngineCache: '"
+
cachedEngineId
+
"'"
);
}
return
;
}
//
String cachedEngineId = host.getCachedEngineId();
//
if (cachedEngineId != null) {
//
flutterEngine = FlutterEngineCache.getInstance().get(cachedEngineId);
//
isFlutterEngineFromHost = true;
//
if (flutterEngine == null) {
//
throw new IllegalStateException("The requested cached FlutterEngine did not exist in the FlutterEngineCache: '" + cachedEngineId + "'");
//
}
//
return;
//
}
// Second, defer to subclasses for a custom FlutterEngine.
flutterEngine
=
host
.
provideFlutterEngine
(
host
.
getContext
());
...
...
@@ -170,7 +171,8 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
mSyncer
=
NewFlutterBoost
.
instance
().
containerManager
().
generateSyncer
(
this
);
ensureAlive
();
flutterView
=
new
FlutterView
(
host
.
getActivity
(),
host
.
getRenderMode
(),
host
.
getTransparencyMode
());
flutterView
=
new
FlutterView
(
host
.
getActivity
(),
NewFlutterBoost
.
instance
().
platform
().
renderMode
(),
host
.
getTransparencyMode
());
flutterView
.
addOnFirstFrameRenderedListener
(
onFirstFrameRenderedListener
);
flutterSplashView
=
new
FlutterSplashView
(
host
.
getContext
());
...
...
@@ -197,48 +199,10 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
// causes launching Activitys to wait a second or two before launching. By post()'ing this
// behavior we are able to move this blocking logic to after the Activity's launch.
// TODO(mattcarroll): figure out how to avoid blocking the MAIN thread when connecting a surface
new
Handler
().
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
Log
.
v
(
TAG
,
"Attaching FlutterEngine to FlutterView."
);
flutterView
.
attachToFlutterEngine
(
flutterEngine
);
doInitialFlutterViewRun
();
}
});
}
private
void
doInitialFlutterViewRun
()
{
// Don't attempt to start a FlutterEngine if we're using a cached FlutterEngine.
if
(
host
.
getCachedEngineId
()
!=
null
)
{
return
;
}
if
(
flutterEngine
.
getDartExecutor
().
isExecutingDart
())
{
// No warning is logged because this situation will happen on every config
// change if the developer does not choose to retain the Fragment instance.
// So this is expected behavior in many cases.
return
;
}
Log
.
d
(
TAG
,
"Executing Dart entrypoint: "
+
host
.
getDartEntrypointFunctionName
()
+
", and sending initial route: "
+
host
.
getInitialRoute
());
// The engine needs to receive the Flutter app's initial route before executing any
// Dart code to ensure that the initial route arrives in time to be applied.
if
(
host
.
getInitialRoute
()
!=
null
)
{
flutterEngine
.
getNavigationChannel
().
setInitialRoute
(
host
.
getInitialRoute
());
}
// Configure the Dart entrypoint and execute it.
DartExecutor
.
DartEntrypoint
entrypoint
=
new
DartExecutor
.
DartEntrypoint
(
host
.
getAppBundlePath
(),
host
.
getDartEntrypointFunctionName
()
);
flutterEngine
.
getDartExecutor
().
executeDartEntrypoint
(
entrypoint
);
}
void
onResume
()
{
mSyncer
.
onAppear
();
...
...
@@ -267,7 +231,6 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
void
onPause
()
{
Log
.
v
(
TAG
,
"onPause()"
);
mSyncer
.
onDisappear
();
ensureAlive
();
flutterEngine
.
getLifecycleChannel
().
appIsInactive
();
...
...
@@ -277,8 +240,9 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
void
onStop
()
{
Log
.
v
(
TAG
,
"onStop()"
);
ensureAlive
();
mSyncer
.
onDisappear
();
flutterEngine
.
getLifecycleChannel
().
appIsPaused
();
flutterView
.
detachFromFlutterEngine
();
//
flutterView.detachFromFlutterEngine();
}
void
onDestroyView
()
{
...
...
@@ -286,7 +250,7 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
mSyncer
.
onDestroy
();
ensureAlive
();
flutterView
.
removeOnFirstFrameRenderedListener
(
onFirstFrameRenderedListener
);
//
flutterView.removeOnFirstFrameRenderedListener(onFirstFrameRenderedListener);
}
...
...
@@ -312,15 +276,15 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
}
// Destroy our FlutterEngine if we're not set to retain it.
if
(
host
.
shouldDestroyEngineWithHost
())
{
flutterEngine
.
destroy
();
if
(
host
.
getCachedEngineId
()
!=
null
)
{
FlutterEngineCache
.
getInstance
().
remove
(
host
.
getCachedEngineId
());
}
flutterEngine
=
null
;
}
//
if (host.shouldDestroyEngineWithHost()) {
//
flutterEngine.destroy();
//
//
if (host.getCachedEngineId() != null) {
//
FlutterEngineCache.getInstance().remove(host.getCachedEngineId());
//
}
//
//
flutterEngine = null;
//
}
}
...
...
@@ -440,7 +404,7 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
@Override
public
Activity
getContextActivity
()
{
return
(
Activity
)
this
.
host
;
return
(
Activity
)
this
.
host
.
getActivity
()
;
}
@Override
...
...
@@ -450,19 +414,19 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
@Override
public
void
finishContainer
(
Map
<
String
,
Object
>
result
)
{
Activity
activity
=
(
Activity
)
this
.
host
;
this
.
host
.
finishContainer
(
result
)
;
activity
.
finish
();
}
@Override
public
String
getContainerUrl
()
{
return
"flutterPage"
;
return
this
.
host
.
getContainerUrl
()
;
}
@Override
public
Map
getContainerUrlParams
()
{
return
null
;
return
this
.
host
.
getContainerUrlParams
();
}
@Override
...
...
@@ -590,6 +554,16 @@ public class FlutterActivityAndFragmentDelegate implements IFlutterViewContaine
* frame.
*/
void
onFirstFrameRendered
();
void
finishContainer
(
Map
<
String
,
Object
>
result
)
;
String
getContainerUrl
()
;
Map
getContainerUrlParams
()
;
}
...
...
android/src/main/java/com/idlefish/flutterboost/containers/FlutterFragment.java
0 → 100644
View file @
6afc509d
This diff is collapsed.
Click to expand it.
android/src/main/java/com/idlefish/flutterboost/containers/FlutterSplashView.java
View file @
6afc509d
...
...
@@ -11,7 +11,6 @@ import android.view.View;
import
android.widget.FrameLayout
;
import
com.idlefish.flutterboost.*
;
import
com.idlefish.flutterboost.interfaces.IStateListener
;
import
io.flutter.Log
;
import
io.flutter.embedding.android.FlutterView
;
import
io.flutter.embedding.android.SplashScreen
;
...
...
@@ -84,7 +83,7 @@ public class FlutterSplashView extends FrameLayout {
setSaveEnabled
(
true
);
if
(
mFlutterEngine
==
null
)
{
mFlutterEngine
=
NewFlutterBoost
.
instance
().
engineProvider
()
.
provideEngine
(
context
)
;
mFlutterEngine
=
NewFlutterBoost
.
instance
().
engineProvider
();
}
}
...
...
android/src/main/java/com/idlefish/flutterboost/containers/NewBoostFlutterActivity.java
View file @
6afc509d
...
...
@@ -4,11 +4,7 @@ package com.idlefish.flutterboost.containers;
import
android.app.Activity
;
import
android.arch.lifecycle.Lifecycle
;
import
android.arch.lifecycle.LifecycleOwner
;
import
android.arch.lifecycle.Lifecycle
;
import
android.arch.lifecycle.LifecycleOwner
;
import
android.arch.lifecycle.LifecycleRegistry
;
import
android.arch.lifecycle.Lifecycle.Event
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.pm.ActivityInfo
;
...
...
@@ -24,8 +20,6 @@ import android.support.annotation.Nullable;
import
android.view.View
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
com.idlefish.flutterboost.FlutterBoost
;
import
com.idlefish.flutterboost.NewFlutterBoost
;
import
com.idlefish.flutterboost.Utils
;
import
io.flutter.Log
;
...
...
@@ -554,7 +548,7 @@ public class NewBoostFlutterActivity extends Activity
@Override
public
FlutterEngine
provideFlutterEngine
(
@NonNull
Context
context
)
{
// No-op. Hook for subclasses.
return
NewFlutterBoost
.
instance
().
engineProvider
()
.
provideEngine
(
this
)
;
return
NewFlutterBoost
.
instance
().
engineProvider
();
}
/**
...
...
@@ -597,6 +591,25 @@ public class NewBoostFlutterActivity extends Activity
public
void
onFirstFrameRendered
()
{
}
@Override
public
void
finishContainer
(
Map
<
String
,
Object
>
result
)
{
Activity
activity
=
this
.
getActivity
();
activity
.
finish
();
}
@Override
public
String
getContainerUrl
()
{
return
"flutterPage"
;
}
@Override
public
Map
getContainerUrlParams
()
{
Map
<
String
,
String
>
params
=
new
HashMap
<>();
params
.
put
(
"aaa"
,
"bbb"
);
return
params
;
}
/**
* The mode of the background of a {@code FlutterActivity}, either opaque or transparent.
*/
...
...
android/src/main/java/com/idlefish/flutterboost/interfaces/IFlutterEngineProvider.java
deleted
100755 → 0
View file @
d9ac3683
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com.idlefish.flutterboost.interfaces
;
import
android.content.Context
;
import
com.idlefish.flutterboost.BoostFlutterEngine
;
import
io.flutter.embedding.engine.FlutterEngine
;
/**
* a flutter engine provider
*/
public
interface
IFlutterEngineProvider
{
/**
* create flutter engine, we just hold a single instance now
* @param context
* @return
*/
FlutterEngine
createEngine
(
Context
context
);
/**
* provide a flutter engine
* @param context
* @return
*/
FlutterEngine
provideEngine
(
Context
context
);
/**
* may return null
* @return
*/
FlutterEngine
tryGetEngine
();
}
android/src/main/java/com/idlefish/flutterboost/interfaces/IFlutterViewContainer.java
View file @
6afc509d
...
...
@@ -25,7 +25,6 @@ package com.idlefish.flutterboost.interfaces;
import
android.app.Activity
;
import
com.idlefish.flutterboost.BoostFlutterView
;
import
com.idlefish.flutterboost.containers.FlutterSplashView
;
import
java.util.Map
;
...
...
android/src/main/java/com/idlefish/flutterboost/interfaces/INativeRouter.java
View file @
6afc509d
...
...
@@ -9,5 +9,4 @@ public interface INativeRouter {
void
openContainer
(
Context
context
,
String
url
,
Map
<
String
,
Object
>
urlParams
,
int
requestCode
,
Map
<
String
,
Object
>
exts
);
void
closeContainer
(
IContainerRecord
record
,
Map
<
String
,
Object
>
result
,
Map
<
String
,
Object
>
exts
);
}
android/src/main/java/com/idlefish/flutterboost/interfaces/IPlatform.java
deleted
100755 → 0
View file @
d9ac3683
/*
* The MIT License (MIT)
*
* Copyright (c) 2019 Alibaba Group
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package
com.idlefish.flutterboost.interfaces
;
import
android.app.Application
;
import
android.content.Context
;
import
java.util.Map
;
import
io.flutter.plugin.common.PluginRegistry
;
/**
* APIs that platform(Android App) must provide
*/
public
interface
IPlatform
{
int
IMMEDIATELY
=
0
;
//立即启动引擎
int
ANY_ACTIVITY_CREATED
=
1
;
//当有任何Activity创建时,启动引擎
/**
* get current application
* @return
*/
Application
getApplication
();
/**
* debug or not
* @return
*/
boolean
isDebug
();
/**
* register plugins
* @return
*/
void
registerPlugins
(
PluginRegistry
registry
);
void
openContainer
(
Context
context
,
String
url
,
Map
<
String
,
Object
>
urlParams
,
int
requestCode
,
Map
<
String
,
Object
>
exts
);
void
closeContainer
(
IContainerRecord
record
,
Map
<
String
,
Object
>
result
,
Map
<
String
,
Object
>
exts
);
IFlutterEngineProvider
engineProvider
();
/**
* @return
*
* IMMEDIATELY //立即
* ANY_ACTIVITY_CREATED //当有任何Activity创建的时候
* LAZY //懒加载,尽可能延后
*/
int
whenEngineStart
();
}
android/src/main/java/com/idlefish/flutterboost/interfaces/IStateListener.java
deleted
100644 → 0
View file @
d9ac3683
package
com.idlefish.flutterboost.interfaces
;
import
com.idlefish.flutterboost.FlutterBoostPlugin
;
import
com.idlefish.flutterboost.BoostFlutterEngine
;
import
com.idlefish.flutterboost.BoostFlutterView
;
import
io.flutter.plugin.common.PluginRegistry
;
public
interface
IStateListener
{
void
onEngineCreated
(
BoostFlutterEngine
engine
);
void
onEngineStarted
(
BoostFlutterEngine
engine
);
void
onChannelRegistered
(
PluginRegistry
.
Registrar
registrar
,
FlutterBoostPlugin
channel
);
void
onFlutterViewInited
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
);
void
beforeEngineAttach
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
);
void
afterEngineAttached
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
);
void
beforeEngineDetach
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
);
void
afterEngineDetached
(
BoostFlutterEngine
engine
,
BoostFlutterView
flutterView
);
}
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterFragment.java
deleted
100755 → 0
View file @
d9ac3683
package
com.taobao.idlefish.flutterboostexample
;
import
android.os.Bundle
;
import
android.support.annotation.Nullable
;
import
com.idlefish.flutterboost.containers.BoostFlutterFragment
;
import
com.idlefish.flutterboost.containers.FlutterSplashView
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
FlutterFragment
extends
BoostFlutterFragment
{
@Override
public
void
setArguments
(
@Nullable
Bundle
args
)
{
if
(
args
==
null
)
{
args
=
new
Bundle
();
args
.
putString
(
"tag"
,
""
);
}
super
.
setArguments
(
args
);
}
public
void
setTabTag
(
String
tag
)
{
Bundle
args
=
new
Bundle
();
args
.
putString
(
"tag"
,
tag
);
super
.
setArguments
(
args
);
}
@Override
public
FlutterSplashView
getBoostFlutterView
()
{
return
null
;
}
@Override
public
String
getContainerUrl
()
{
return
"flutterFragment"
;
}
@Override
public
Map
getContainerUrlParams
()
{
Map
<
String
,
String
>
params
=
new
HashMap
<>();
params
.
put
(
"tag"
,
getArguments
().
getString
(
"tag"
));
return
params
;
}
public
static
FlutterFragment
instance
(
String
tag
){
FlutterFragment
fragment
=
new
FlutterFragment
();
fragment
.
setTabTag
(
tag
);
return
fragment
;
}
}
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterFragmentPageActivity.java
View file @
6afc509d
...
...
@@ -9,7 +9,7 @@ import android.support.v7.app.AppCompatActivity;
import
android.view.View
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
com.idlefish.flutterboost.containers.FlutterFragment
;
import
io.flutter.plugin.platform.PlatformPlugin
;
public
class
FlutterFragmentPageActivity
extends
AppCompatActivity
implements
View
.
OnClickListener
{
...
...
@@ -61,16 +61,16 @@ public class FlutterFragmentPageActivity extends AppCompatActivity implements Vi
if
(
mTab1
==
v
)
{
mTab1
.
setBackgroundColor
(
Color
.
YELLOW
);
mFragment
=
FlutterFragment
.
instance
(
"tab1"
);
mFragment
=
FlutterFragment
.
createDefault
(
);
}
else
if
(
mTab2
==
v
)
{
mTab2
.
setBackgroundColor
(
Color
.
YELLOW
);
mFragment
=
FlutterFragment
.
instance
(
"tab2"
);
mFragment
=
FlutterFragment
.
createDefault
(
);
}
else
if
(
mTab3
==
v
)
{
mTab3
.
setBackgroundColor
(
Color
.
YELLOW
);
mFragment
=
FlutterFragment
.
instance
(
"tab3"
);
mFragment
=
FlutterFragment
.
createDefault
(
);
}
else
{
mTab4
.
setBackgroundColor
(
Color
.
YELLOW
);
mFragment
=
FlutterFragment
.
instance
(
"tab4"
);
mFragment
=
FlutterFragment
.
createDefault
(
);
}
getSupportFragmentManager
()
...
...
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/FlutterPageActivity.java
deleted
100755 → 0
View file @
d9ac3683
package
com.taobao.idlefish.flutterboostexample
;
import
com.idlefish.flutterboost.containers.BoostFlutterActivity
;
import
com.idlefish.flutterboost.containers.FlutterSplashView
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
FlutterPageActivity
extends
BoostFlutterActivity
{
@Override
public
FlutterSplashView
getBoostFlutterView
()
{
return
null
;
}
/**
* 该方法返回当前Activity在Flutter层对应的name,
* 混合栈将会在flutter层根据这个名字,在注册的Route表中查找对应的Widget
*
* 在flutter层有注册函数:
* FlutterBoost.singleton.registerPageBuilders({
* 'first': (pageName, params, _) => FirstRouteWidget(),
* 'second': (pageName, params, _) => SecondRouteWidget(),
* ...
* });
*
* 该方法中返回的就是注册的key:first , second
*
* @return
*/
@Override
public
String
getContainerUrl
()
{
return
"flutterPage"
;
}
/**
* 该方法返回的参数将会传递给上层的flutter对应的Widget
*
* 在flutter层有注册函数:
* FlutterBoost.singleton.registerPageBuilders({
* 'first': (pageName, params, _) => FirstRouteWidget(),
* 'second': (pageName, params, _) => SecondRouteWidget(),
* ...
* });
*
* 该方法返回的参数就会封装成上面的params
*
* @return
*/
@Override
public
Map
getContainerUrlParams
()
{
Map
<
String
,
String
>
params
=
new
HashMap
<>();
params
.
put
(
"aaa"
,
"bbb"
);
return
params
;
}
}
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/MyApplication.java
View file @
6afc509d
...
...
@@ -5,7 +5,6 @@ import android.content.Context;
import
com.idlefish.flutterboost.*
;
import
com.idlefish.flutterboost.interfaces.IContainerRecord
;
import
com.idlefish.flutterboost.interfaces.IFlutterEngineProvider
;
import
java.util.Map
;
...
...
@@ -16,48 +15,6 @@ public class MyApplication extends FlutterApplication {
@Override
public
void
onCreate
()
{
super
.
onCreate
();
//
// FlutterBoost.init(new Platform() {
//
// @Override
// public Application getApplication() {
// return MyApplication.this;
// }
//
// @Override
// public boolean isDebug() {
// return true;
// }
//
// @Override
// public void openContainer(Context context, String url, Map<String, Object> urlParams, int requestCode, Map<String, Object> exts) {
// PageRouter.openPageByUrl(context, url, urlParams, requestCode);
// }
//
// @Override
// public IFlutterEngineProvider engineProvider() {
// return new BoostEngineProvider() {
// @Override
// public BoostFlutterEngine createEngine(Context context) {
// return new BoostFlutterEngine(context);
// }
// };
// }
//
// @Override
// public int whenEngineStart() {
// return ANY_ACTIVITY_CREATED;
// }
// });
// FlutterBoostPlugin.addActionAfterRegistered(new FlutterBoostPlugin.ActionAfterRegistered() {
// @Override
// public void onChannelRegistered(FlutterBoostPlugin channel) {
// //platform view register should use FlutterPluginRegistry instread of BoostPluginRegistry
// TextPlatformViewPlugin.register(FlutterBoost.singleton().engineProvider().tryGetEngine().getPluginRegistry());
// }
// });
INativeRouter
router
=
new
INativeRouter
()
{
@Override
...
...
@@ -65,12 +22,14 @@ public class MyApplication extends FlutterApplication {
PageRouter
.
openPageByUrl
(
context
,
url
,
urlParams
);
}
@Override
public
void
closeContainer
(
IContainerRecord
record
,
Map
<
String
,
Object
>
result
,
Map
<
String
,
Object
>
exts
)
{
}
};
Platform
platform
=
new
NewFlutterBoost
.
ConfigBuilder
(
this
,
router
).
build
();
Platform
platform
=
new
NewFlutterBoost
.
ConfigBuilder
(
this
,
router
)
.
isDebug
(
true
)
.
whenEngineStart
(
NewFlutterBoost
.
ConfigBuilder
.
ANY_ACTIVITY_CREATED
)
.
build
();
NewFlutterBoost
.
instance
().
init
(
platform
);
}
}
example/android/app/src/main/java/com/taobao/idlefish/flutterboostexample/PageRouter.java
View file @
6afc509d
...
...
@@ -24,7 +24,7 @@ public class PageRouter {
context
.
startActivity
(
NewBoostFlutterActivity
.
createDefaultIntent
(
context
));
return
true
;
}
else
if
(
url
.
startsWith
(
FLUTTER_FRAGMENT_PAGE_URL
))
{
//
context.startActivity(new Intent(context, FlutterFragmentPageActivity.class));
context
.
startActivity
(
new
Intent
(
context
,
FlutterFragmentPageActivity
.
class
));
return
true
;
}
else
if
(
url
.
startsWith
(
NATIVE_PAGE_URL
))
{
context
.
startActivity
(
new
Intent
(
context
,
NativePageActivity
.
class
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment