blob: c71ce3c5b8f799014a1186bb568a6e6d6b12b71a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.alibaba.weex.commons;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.weex.commons.util.AssertUtil;
import com.alibaba.weex.commons.util.ScreenUtil;
import com.taobao.weex.common.Constants;
import com.taobao.weex.IWXRenderListener;
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.common.WXRenderStrategy;
import com.taobao.weex.utils.WXUtils;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* Created by sospartan on 5/30/16.
*/
public abstract class AbstractWeexActivity extends AppCompatActivity implements IWXRenderListener {
private static final String TAG = "AbstractWeexActivity";
private ViewGroup mContainer;
private WXSDKInstance mInstance;
protected WXAnalyzerDelegate mWxAnalyzerDelegate;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createWeexInstance();
mInstance.onActivityCreate();
mWxAnalyzerDelegate = new WXAnalyzerDelegate(this);
mWxAnalyzerDelegate.onCreate();
getWindow().setFormat(PixelFormat.TRANSLUCENT);
}
protected final void setContainer(ViewGroup container){
mContainer = container;
}
protected final ViewGroup getContainer(){
return mContainer;
}
protected void destoryWeexInstance(){
if(mInstance != null){
mInstance.registerRenderListener(null);
mInstance.destroy();
mInstance = null;
}
}
protected void createWeexInstance(){
destoryWeexInstance();
Rect outRect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);
mInstance = new WXSDKInstance(this);
mInstance.registerRenderListener(this);
}
protected void renderPage(String template,String source){
renderPage(template,source,null);
}
protected void renderPage(String template,String source,String jsonInitData){
AssertUtil.throwIfNull(mContainer,new RuntimeException("Can't render page, container is null"));
Map<String, Object> options = new HashMap<>();
options.put(WXSDKInstance.BUNDLE_URL, source);
// Set options.bundleDigest
try {
String banner = WXUtils.getBundleBanner(template);
JSONObject jsonObj = JSONObject.parseObject(banner);
String digest = null;
if (jsonObj != null) {
digest = jsonObj.getString(Constants.CodeCache.BANNER_DIGEST);
}
if (digest != null) {
options.put(Constants.CodeCache.DIGEST, digest);
}
} catch (Throwable t) {}
//Set options.codeCachePath
String path = WXEnvironment.getFilesDir(getApplicationContext());
path += File.separator;
path += Constants.CodeCache.SAVE_PATH;
path += File.separator;
options.put(Constants.CodeCache.PATH, path);
mInstance.setTrackComponent(true);
mInstance.render(
getPageName(),
template,
options,
jsonInitData,
ScreenUtil.getDisplayWidth(this),
ScreenUtil.getDisplayHeight(this),
WXRenderStrategy.APPEND_ASYNC);
}
protected void renderPageByURL(String url){
renderPageByURL(url,null);
}
protected void renderPageByURL(String url,String jsonInitData){
AssertUtil.throwIfNull(mContainer,new RuntimeException("Can't render page, container is null"));
Map<String, Object> options = new HashMap<>();
options.put(WXSDKInstance.BUNDLE_URL, url);
mInstance.setTrackComponent(true);
mInstance.renderByUrl(
getPageName(),
url,
options,
jsonInitData,
ScreenUtil.getDisplayWidth(this),
ScreenUtil.getDisplayHeight(this),
WXRenderStrategy.APPEND_ASYNC);
}
protected String getPageName(){
return TAG;
}
@Override
public void onStart() {
super.onStart();
if(mInstance!=null){
mInstance.onActivityStart();
}
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onStart();
}
}
@Override
public void onResume() {
super.onResume();
if(mInstance!=null){
mInstance.onActivityResume();
}
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onResume();
}
}
@Override
public void onPause() {
super.onPause();
if(mInstance!=null){
mInstance.onActivityPause();
}
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onPause();
}
}
@Override
public void onStop() {
super.onStop();
if(mInstance!=null){
mInstance.onActivityStop();
}
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onStop();
}
}
@Override
public void onDestroy() {
super.onDestroy();
if(mInstance!=null){
mInstance.onActivityDestroy();
}
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onDestroy();
}
}
@Override
public void onViewCreated(WXSDKInstance wxsdkInstance, View view) {
View wrappedView = null;
if(mWxAnalyzerDelegate != null){
wrappedView = mWxAnalyzerDelegate.onWeexViewCreated(wxsdkInstance,view);
}
if(wrappedView != null){
view = wrappedView;
}
if (mContainer != null) {
mContainer.removeAllViews();
mContainer.addView(view);
}
}
@Override
public void onRefreshSuccess(WXSDKInstance wxsdkInstance, int i, int i1) {
}
@Override
@CallSuper
public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onWeexRenderSuccess(instance);
}
}
@Override
@CallSuper
public void onException(WXSDKInstance instance, String errCode, String msg) {
if(mWxAnalyzerDelegate != null){
mWxAnalyzerDelegate.onException(instance,errCode,msg);
}
}
@Override
@CallSuper
public boolean onKeyUp(int keyCode, KeyEvent event) {
return (mWxAnalyzerDelegate != null && mWxAnalyzerDelegate.onKeyUp(keyCode,event)) || super.onKeyUp(keyCode, event);
}
}