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.appfram.navigator;
  
  import android.app.Activity;
  import android.content.Context;
  import android.content.Intent;
  import android.net.Uri;
  import android.support.v7.app.AppCompatActivity;
  import android.text.TextUtils;
  
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONException;
  import com.alibaba.fastjson.JSONObject;
  import org.apache.weex.WXSDKEngine;
  import org.apache.weex.annotation.JSMethod;
  import org.apache.weex.bridge.JSCallback;
  import org.apache.weex.bridge.WXBridgeManager;
  import org.apache.weex.common.Constants;
  import org.apache.weex.common.WXModule;
  import org.apache.weex.utils.WXLogUtils;
  
  
  public class WXNavigatorModule extends WXModule {
  
      public static final String MSG_SUCCESS = "WX_SUCCESS";
      public static final String MSG_FAILED = "WX_FAILED";
      public static final String MSG_PARAM_ERR = "WX_PARAM_ERR";
  
      public static final String CALLBACK_RESULT = "result";
      public static final String CALLBACK_MESSAGE = "message";
  
      private final static String INSTANCE_ID = "instanceId";
      private final static String TAG = "Navigator";
      private final static String WEEX = "com.taobao.android.intent.category.WEEX";
      private final static String URL = "url";
  
      @JSMethod(uiThread = true)
      public void open(JSONObject options, JSCallback success, JSCallback failure) {
          if (options != null) {
              String url = options.getString(Constants.Value.URL);
              JSCallback callback = success;
              JSONObject result = new JSONObject();
              if (!TextUtils.isEmpty(url)) {
                  Uri rawUri = Uri.parse(url);
                  String scheme = rawUri.getScheme();
                  if (TextUtils.isEmpty(scheme) || Constants.Scheme.HTTP.equalsIgnoreCase(scheme) || Constants.Scheme.HTTPS.equalsIgnoreCase(scheme)) {
                      this.push(options.toJSONString(), success);
                  } else {
                      try {
                          Intent intent = new Intent(Intent.ACTION_VIEW, rawUri);
                          mWXSDKInstance.getContext().startActivity(intent);
                          result.put(CALLBACK_RESULT, MSG_SUCCESS);
                      } catch (Throwable e) {
                          e.printStackTrace();
                          result.put(CALLBACK_RESULT, MSG_FAILED);
                          result.put(CALLBACK_MESSAGE, "Open page failed.");
                          callback = failure;
                      }
                  }
              } else {
                  result.put(CALLBACK_RESULT, MSG_PARAM_ERR);
                  result.put(CALLBACK_MESSAGE, "The URL parameter is empty.");
                  callback = failure;
              }
  
              if(callback != null){
                  callback.invoke(result);
              }
          }
      }
  
      @JSMethod(uiThread = true)
      public void close(JSONObject options, JSCallback success, JSCallback failure) {
          JSONObject result = new JSONObject();
          JSCallback callback = null;
          if (mWXSDKInstance.getContext() instanceof Activity) {
              callback = success;
              ((Activity) mWXSDKInstance.getContext()).finish();
          } else {
              result.put(CALLBACK_RESULT, MSG_FAILED);
              result.put(CALLBACK_MESSAGE, "Close page failed.");
              callback = failure;
          }
          if (callback != null) {
              callback.invoke(result);
          }
      }
  
      @JSMethod(uiThread = true)
      public void push(String param, JSCallback callback) {
  
          if (!TextUtils.isEmpty(param)) {
              if (WXSDKEngine.getActivityNavBarSetter() != null) {
                  if (WXSDKEngine.getActivityNavBarSetter().push(param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
  
              if (mWXSDKInstance.getContext() instanceof Activity){
                  Activity activity = (Activity)mWXSDKInstance.getContext();
  
                  if (WXSDKEngine.getNavigator()!= null
                      && WXSDKEngine.getNavigator().push(activity,param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
  
              try {
                  JSONObject jsonObject = JSON.parseObject(param);
                  String url = jsonObject.getString(URL);
                  if (!TextUtils.isEmpty(url)) {
                      Uri rawUri = Uri.parse(url);
                      String scheme = rawUri.getScheme();
                      Uri.Builder builder = rawUri.buildUpon();
                      if (TextUtils.isEmpty(scheme)) {
                          builder.scheme(Constants.Scheme.HTTP);
                      }
                      Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
                      intent.addCategory(WEEX);
                      intent.putExtra(INSTANCE_ID, mWXSDKInstance.getInstanceId());
                      mWXSDKInstance.getContext().startActivity(intent);
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                  }
              } catch (Exception e) {
                  WXLogUtils.eTag(TAG, e);
                  if (callback != null) {
                      callback.invoke(MSG_FAILED);
                  }
              }
          } else if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void pop(String param, JSCallback callback) {
  
          if (WXSDKEngine.getActivityNavBarSetter() != null) {
              if (WXSDKEngine.getActivityNavBarSetter().pop(param)) {
                  if (callback != null) {
                      callback.invoke(MSG_SUCCESS);
                  }
                  return;
              }
          }
  
          if (mWXSDKInstance.getContext() instanceof Activity) {
              Activity activity = (Activity) mWXSDKInstance.getContext();
              if (WXSDKEngine.getNavigator() != null) {
                  if (WXSDKEngine.getNavigator().pop(activity, param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
  
              if (callback != null) {
                  callback.invoke(MSG_SUCCESS);
              }
              ((Activity) mWXSDKInstance.getContext()).finish();
          }
      }
  
      @JSMethod(uiThread = true)
      public void setNavBarRightItem(String param, JSCallback callback) {
          if (!TextUtils.isEmpty(param)) {
              if (WXSDKEngine.getActivityNavBarSetter() != null) {
                  if (WXSDKEngine.getActivityNavBarSetter().setNavBarRightItem(param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
          }
  
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void clearNavBarRightItem(String param, JSCallback callback) {
          if (WXSDKEngine.getActivityNavBarSetter() != null) {
              if (WXSDKEngine.getActivityNavBarSetter().clearNavBarRightItem(param)) {
                  if (callback != null) {
                      callback.invoke(MSG_SUCCESS);
                  }
                  return;
              }
          }
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void setNavBarLeftItem(String param, JSCallback callback) {
          if (!TextUtils.isEmpty(param)) {
              if (WXSDKEngine.getActivityNavBarSetter() != null) {
                  if (WXSDKEngine.getActivityNavBarSetter().setNavBarLeftItem(param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
          }
  
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
  
      }
  
      @JSMethod(uiThread = true)
      public void clearNavBarLeftItem(String param, JSCallback callback) {
          if (WXSDKEngine.getActivityNavBarSetter() != null) {
              if (WXSDKEngine.getActivityNavBarSetter().clearNavBarLeftItem(param)) {
                  if (callback != null) {
                      callback.invoke(MSG_SUCCESS);
                  }
                  return;
              }
          }
  
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void setNavBarMoreItem(String param, JSCallback callback) {
          if (!TextUtils.isEmpty(param)) {
              if (WXSDKEngine.getActivityNavBarSetter() != null) {
                  if (WXSDKEngine.getActivityNavBarSetter().setNavBarMoreItem(param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
          }
  
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void clearNavBarMoreItem(String param, JSCallback callback) {
          if (WXSDKEngine.getActivityNavBarSetter() != null) {
              if (WXSDKEngine.getActivityNavBarSetter().clearNavBarMoreItem(param)) {
                  if (callback != null) {
                      callback.invoke(MSG_SUCCESS);
                  }
                  return;
              }
          }
  
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod(uiThread = true)
      public void setNavBarTitle(String param, JSCallback callback) {
          if (!TextUtils.isEmpty(param)) {
              if (WXSDKEngine.getActivityNavBarSetter() != null) {
                  if (WXSDKEngine.getActivityNavBarSetter().setNavBarTitle(param)) {
                      if (callback != null) {
                          callback.invoke(MSG_SUCCESS);
                      }
                      return;
                  }
              }
          }
          if (callback != null) {
              callback.invoke(MSG_FAILED);
          }
      }
  
      @JSMethod
      public void setNavBarHidden(String param, final String callback) {
          String message = MSG_FAILED;
          try {
              JSONObject jsObj = JSON.parseObject(param);
              int visibility = jsObj.getInteger(Constants.Name.NAV_BAR_VISIBILITY);
              boolean success = changeVisibilityOfActionBar(mWXSDKInstance.getContext(), visibility);
              if (success) {
                  message = MSG_SUCCESS;
              }
          } catch (JSONException e) {
              WXLogUtils.e(TAG, WXLogUtils.getStackTrace(e));
          }
          WXBridgeManager.getInstance().callback(mWXSDKInstance.getInstanceId(), callback, message);
      }
  
      private boolean changeVisibilityOfActionBar(Context context, int visibility) {
          boolean result = false;
          boolean hasAppCompatActivity = false;
          try {
              Class.forName("android.support.v7.app.AppCompatActivity");
              hasAppCompatActivity = true;
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          }
          if (hasAppCompatActivity && mWXSDKInstance.getContext() instanceof AppCompatActivity) {
              android.support.v7.app.ActionBar actionbar = ((AppCompatActivity) mWXSDKInstance.getContext()).getSupportActionBar();
              if (actionbar != null) {
                  switch (visibility) {
                      case Constants.Value.NAV_BAR_HIDDEN:
                          actionbar.hide();
                          result = true;
                          break;
                      case Constants.Value.NAV_BAR_SHOWN:
                          actionbar.show();
                          result = true;
                          break;
                  }
              }
          } else if (mWXSDKInstance.getContext() instanceof Activity) {
              android.app.ActionBar actionbar = ((Activity) mWXSDKInstance.getContext()).getActionBar();
              if (actionbar != null) {
                  switch (visibility) {
                      case Constants.Value.NAV_BAR_HIDDEN:
                          actionbar.hide();
                          result = true;
                          break;
                      case Constants.Value.NAV_BAR_SHOWN:
                          actionbar.show();
                          result = true;
                          break;
                  }
              }
          }
          return result;
      }
  }
  