content: /*
   * 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 org.apache.weex.commons;
  
  import android.graphics.PixelFormat;
  import android.graphics.Rect;
  import android.os.Bundle;
  import android.support.annotation.CallSuper;
  import android.support.annotation.NonNull;
  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 org.apache.weex.commons.util.AssertUtil;
  import com.taobao.weex.IWXRenderListener;
  import com.taobao.weex.WXEnvironment;
  import com.taobao.weex.WXSDKInstance;
  import com.taobao.weex.common.Constants;
  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,
        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,
        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);
    }
  
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      if (mInstance != null) {
        mInstance.onRequestPermissionsResult(requestCode, permissions, grantResults);
      }
    }
  }
  