Skip to content

Commit

Permalink
add flutter support
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangweihui committed Sep 20, 2018
1 parent f6fa8b9 commit c11e10f
Show file tree
Hide file tree
Showing 37 changed files with 3,559 additions and 50 deletions.
14 changes: 5 additions & 9 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ apply from: 'tinkerpatch.gradle'
android {
signingConfigs {
release {
// keyAlias 'keystore'
// keyPassword 'zwh12583258'
// storeFile file('C:/Users/Administrator/Desktop/keystore.jks')
// storePassword 'zwh12583258'
keyAlias 'keystore'
keyPassword 'zwh12583258'
storeFile file("$rootDir/keystore.jks")
storePassword 'zwh12583258'
}
}
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
Expand Down Expand Up @@ -58,9 +58,6 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
abiFilters "armeabi-v7a"
abiFilters "armeabi"
abiFilters "x86"
abiFilters "x86_64"
}
}

Expand All @@ -76,7 +73,6 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
abiFilters "armeabi-v7a"
abiFilters "armeabi"
}
}
}
Expand Down Expand Up @@ -157,7 +153,7 @@ dependencies {
implementation rootProject.ext.dependencies["paginate"]
//arms
implementation project(':arms')
// compile 'me.jessyan:arms:2.1.5'
implementation project(':flutter')
implementation rootProject.ext.dependencies["multidex"]
testImplementation rootProject.ext.dependencies["junit"]
testImplementation rootProject.ext.dependencies["mockito-core"]
Expand Down
8 changes: 7 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,13 @@ public static java.lang.String TABLENAME;
-keep class com.google.android.exoplayer.* {*; }
-keepclasseswithmembernames class tv.danmaku.ijk.media.player.IjkMediaPlayer{*;}
-keepclasseswithmembernames class tv.danmaku.ijk.media.player.ffmpeg.FFmpegApi{*;}

################Flutter Wrapper#################
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
# 如果你需要兼容6.0系统,请不要混淆org.apache.http.legacy.jar
-dontwarn android.net.compatibility.**
-dontwarn android.net.http.**
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,25 @@
<!-- <category android:name="android.intent.category.LAUNCHER"/> -->
<!-- </intent-filter> -->
</activity>

<activity
android:name=".mvp.ui.activity.AppFlutterActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/FlutterAppTheme"
android:windowSoftInputMode="adjustPan|stateHidden">
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true"/>
</activity>
<activity
android:name=".mvp.ui.activity.VideoDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/title_activity_video_detail"
android:screenOrientation="portrait" />
<activity
android:name=".mvp.ui.activity.FlutterVideoDetailActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait" />
<activity
android:name=".mvp.ui.activity.SearchActivity"
android:screenOrientation="portrait"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ public class Constants {
public static final String HOME = "home";
public static final String SPLASH = "splash";
public static final String VIDEO = "video";
public static final String FLUTTER_VIDEO = "flutter_video";
public static final String FULL_VIDEO = "full_video";
public static final String TEST = "test";
public static final String MAIN = "main";
public static final String FLUTTER = "flutter";
public static final String SETTINGS = "settings";
public static final String SEARCH = "search";
public static final String CATEGORY = "category";
Expand Down Expand Up @@ -55,6 +57,7 @@ public class Constants {
public static final String SETTING_FLOW = "setting_flow";
public static final String SETTING_WIFI = "setting_wifi";
public static final String SETTING_SPLASH = "setting_splash";
public static final String SETTING_FLUTTER = "setting_flutter";


//==================SDKScrete============//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.zwh.mvparms.eyepetizer.di.component;

import com.jess.arms.di.component.AppComponent;
import com.jess.arms.di.scope.ActivityScope;
import com.zwh.mvparms.eyepetizer.di.module.VideoDetailModule;
import com.zwh.mvparms.eyepetizer.mvp.ui.activity.FlutterVideoDetailActivity;

import dagger.Component;


@ActivityScope
@Component(modules = VideoDetailModule.class, dependencies = AppComponent.class)
public interface FlutterVideoDetailComponent {
void inject(FlutterVideoDetailActivity activity);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
package com.zwh.mvparms.eyepetizer.mvp.ui.activity;

import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.FrameLayout;

import com.apt.TRouter;
import com.google.gson.Gson;
import com.zwh.annotation.apt.Router;
import com.zwh.mvparms.eyepetizer.R;
import com.zwh.mvparms.eyepetizer.app.constants.Constants;
import com.zwh.mvparms.eyepetizer.mvp.model.entity.DataExtra;
import com.zwh.mvparms.eyepetizer.mvp.model.entity.VideoListInfo;

import io.flutter.app.FlutterActivityDelegate;
import io.flutter.app.FlutterActivityDelegate.ViewFactory;
import io.flutter.app.FlutterActivityEvents;
import io.flutter.facade.Flutter;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.view.FlutterMain;
import io.flutter.view.FlutterNativeView;
import io.flutter.view.FlutterView;
import io.flutter.view.FlutterView.Provider;

/**
* Created by Zhangwh on 2018/9/7.
*/
@Router(Constants.FLUTTER)
public class AppFlutterActivity extends AppCompatActivity implements Provider, PluginRegistry, ViewFactory {

String CHANNEL = "com.zwh.mvparms.eyepetizer/main";
private FlutterView flutterView;
private Gson gson;

private final FlutterActivityDelegate delegate = new FlutterActivityDelegate(this, this);
private final FlutterActivityEvents eventDelegate;
private final Provider viewProvider;
private final PluginRegistry pluginRegistry;

public AppFlutterActivity() {
this.eventDelegate = this.delegate;
this.viewProvider = this.delegate;
this.pluginRegistry = this.delegate;
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
FlutterMain.startInitialization(this);
super.onCreate(savedInstanceState);
this.eventDelegate.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
setContentView(R.layout.activity_flutter);
final FrameLayout layout = findViewById(R.id.fl_content);
flutterView = Flutter.createView(this,getLifecycle(),"mainRoute");
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT
, FrameLayout.LayoutParams.MATCH_PARENT);
layout.addView(flutterView,params);
// final FlutterView.FirstFrameListener[] listeners = new FlutterView.FirstFrameListener[1];
// listeners[0] = () -> {
// flutterView.setVisibility(View.VISIBLE);
// flutterView.removeFirstFrameListener(listeners[0]);
// };
// flutterView.addFirstFrameListener(listeners[0]);
registerFlutterPlugin();
}

private void registerFlutterPlugin() {
gson = new Gson();
new MethodChannel(flutterView, CHANNEL).setMethodCallHandler((call, result) -> {
if (call.method.equals("gotoVideo")) {
String video = call.argument("video");
if (video != null){
VideoListInfo.Video videoInfo =
gson.fromJson(video,VideoListInfo.Video.class);
if (videoInfo.getData() == null){
VideoListInfo.Video.VideoData videoData = gson.fromJson(video,VideoListInfo.Video.VideoData.class);
videoInfo.setData(videoData);
}
TRouter.go(Constants.FLUTTER_VIDEO,new DataExtra(Constants.VIDEO_INFO, videoInfo).build());
}
} else {
result.notImplemented();
}
});
}

public FlutterView getFlutterView() {
return this.viewProvider.getFlutterView();
}

public FlutterView createFlutterView(Context context) {
return null;
}

public FlutterNativeView createFlutterNativeView() {
return null;
}

public boolean retainFlutterNativeView() {
return false;
}

public final boolean hasPlugin(String key) {
return this.pluginRegistry.hasPlugin(key);
}

public final <T> T valuePublishedByPlugin(String pluginKey) {
return this.pluginRegistry.valuePublishedByPlugin(pluginKey);
}

public final Registrar registrarFor(String pluginKey) {
return this.pluginRegistry.registrarFor(pluginKey);
}

protected void onStart() {
super.onStart();
this.eventDelegate.onStart();
}

protected void onResume() {
super.onResume();
this.eventDelegate.onResume();
}

protected void onDestroy() {
this.eventDelegate.onDestroy();
super.onDestroy();
}

public void onBackPressed() {
if(!this.eventDelegate.onBackPressed()) {
super.onBackPressed();
}

}

protected void onStop() {
this.eventDelegate.onStop();
super.onStop();
}

protected void onPause() {
super.onPause();
this.eventDelegate.onPause();
}

protected void onPostResume() {
super.onPostResume();
this.eventDelegate.onPostResume();
}

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
this.eventDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(!this.eventDelegate.onActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}

}

protected void onNewIntent(Intent intent) {
this.eventDelegate.onNewIntent(intent);
}

public void onUserLeaveHint() {
this.eventDelegate.onUserLeaveHint();
}

public void onTrimMemory(int level) {
this.eventDelegate.onTrimMemory(level);
}

public void onLowMemory() {
this.eventDelegate.onLowMemory();
}

public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
this.eventDelegate.onConfigurationChanged(newConfig);
}
}
Loading

0 comments on commit c11e10f

Please sign in to comment.