diff --git a/platforms/android/app/build.gradle b/platforms/android/app/build.gradle
index 6accf75..ea173f1 100755
--- a/platforms/android/app/build.gradle
+++ b/platforms/android/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "com.instapp.natex"
minSdkVersion 15
targetSdkVersion 23
- versionCode 7
- versionName "1.0.2"
+ versionCode 8
+ versionName "1.0.3"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
abiFilters "x86"
diff --git a/platforms/android/app/src/main/AndroidManifest.xml b/platforms/android/app/src/main/AndroidManifest.xml
index 2454b2c..b44af62 100755
--- a/platforms/android/app/src/main/AndroidManifest.xml
+++ b/platforms/android/app/src/main/AndroidManifest.xml
@@ -54,7 +54,7 @@
-
+
diff --git a/platforms/android/app/src/main/java/com/instapp/natex/SplashActivity.java b/platforms/android/app/src/main/java/com/instapp/natex/SplashActivity.java
index 74ca7c2..449838e 100755
--- a/platforms/android/app/src/main/java/com/instapp/natex/SplashActivity.java
+++ b/platforms/android/app/src/main/java/com/instapp/natex/SplashActivity.java
@@ -34,7 +34,7 @@ protected void onCreate(Bundle savedInstanceState) {
Uri uri = Uri.parse(builder.toString());
intent.setData(uri);
- intent.addCategory("com.taobao.android.intent.category.WEEX");
+ intent.addCategory("com.instapp.natex.android.intent.category.WEEX");
intent.setPackage(getPackageName());
startActivity(intent);
finish();
diff --git a/platforms/android/app/src/main/java/com/instapp/natex/WXApplication.java b/platforms/android/app/src/main/java/com/instapp/natex/WXApplication.java
index b9e75ba..a0b6013 100755
--- a/platforms/android/app/src/main/java/com/instapp/natex/WXApplication.java
+++ b/platforms/android/app/src/main/java/com/instapp/natex/WXApplication.java
@@ -2,10 +2,10 @@
import android.app.Application;
-import com.instapp.natex.ApiKey;
import com.instapp.natex.commons.adapter.ImageAdapter;
import com.instapp.natex.commons.util.AppConfig;
-import com.instapp.natex.extend.module.WXEventModule;
+import com.instapp.natex.extend.module.EventModule;
+import com.instapp.natex.extend.module.NavigatorModule;
import com.instapp.natex.pluginmanager.PluginManager;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.taobao.weex.InitConfig;
@@ -35,7 +35,8 @@ public void onCreate() {
AVAnalytics.enableCrashReport(this, true);
try {
- WXSDKEngine.registerModule("event", WXEventModule.class);
+ WXSDKEngine.registerModule("event", EventModule.class);
+ WXSDKEngine.registerModule("navigator", NavigatorModule.class);
} catch (WXException e) {
e.printStackTrace();
}
diff --git a/platforms/android/app/src/main/java/com/instapp/natex/WXPageActivity.java b/platforms/android/app/src/main/java/com/instapp/natex/WXPageActivity.java
index 3c3abed..763c8db 100755
--- a/platforms/android/app/src/main/java/com/instapp/natex/WXPageActivity.java
+++ b/platforms/android/app/src/main/java/com/instapp/natex/WXPageActivity.java
@@ -1,11 +1,6 @@
package com.instapp.natex;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
-import android.hardware.SensorManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
@@ -16,15 +11,11 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
-import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.instapp.natex.commons.AbsWeexActivity;
-import com.instapp.natex.commons.util.CommonUtils;
-import com.instapp.natex.commons.util.DevOptionHandler;
-import com.instapp.natex.commons.util.ShakeDetector;
import com.instapp.natex.constants.Constants;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
@@ -35,8 +26,6 @@
import com.taobao.weex.ui.component.NestedContainer;
import com.taobao.weex.utils.WXSoInstallMgrSdk;
-import java.util.LinkedHashMap;
-
public class WXPageActivity extends AbsWeexActivity implements
WXSDKInstance.NestedInstanceInterceptor {
@@ -44,11 +33,6 @@ public class WXPageActivity extends AbsWeexActivity implements
private static final String TAG = "WXPageActivity";
private ProgressBar mProgressBar;
private TextView mTipView;
- private AlertDialog mDevOptionsDialog;
- private boolean mIsShakeDetectorStarted = false;
- private boolean mIsDevSupportEnabled = WXEnvironment.isApkDebugable();
- private final LinkedHashMap mCustomDevOptions = new LinkedHashMap<>();
- private ShakeDetector mShakeDetector;
@Override
public void onCreateNestInstance(WXSDKInstance instance, NestedContainer container) {
@@ -63,16 +47,6 @@ protected void onCreate(Bundle savedInstanceState) {
mProgressBar = (ProgressBar) findViewById(R.id.progress);
mTipView = (TextView) findViewById(R.id.index_tip);
- if (mIsDevSupportEnabled && !CommonUtils.hasHardwareMenuKey()) {
- mShakeDetector = new ShakeDetector(new ShakeDetector.ShakeListener() {
-
- @Override
- public void onShake() {
- showDevOptionsDialog();
- }
- });
- }
-
Uri uri = getIntent().getData();
Bundle bundle = getIntent().getExtras();
@@ -106,19 +80,11 @@ public void onShake() {
@Override
public void onResume() {
super.onResume();
- if (!mIsShakeDetectorStarted && mShakeDetector != null) {
- mShakeDetector.start((SensorManager) getApplicationContext().getSystemService(Context.SENSOR_SERVICE));
- mIsShakeDetectorStarted = true;
- }
}
@Override
public void onPause() {
super.onPause();
- if (mIsShakeDetectorStarted && mShakeDetector != null) {
- mShakeDetector.stop();
- mIsShakeDetectorStarted = false;
- }
}
private String getUrl(Uri uri) {
@@ -249,72 +215,5 @@ private void handleDecodeInternally(String code) {
@Override
public void onDestroy() {
super.onDestroy();
- if (mShakeDetector != null) {
- mShakeDetector.stop();
- }
- }
-
- public void showDevOptionsDialog() {
- if (mDevOptionsDialog != null || !mIsDevSupportEnabled || ActivityManager.isUserAMonkey()) {
- return;
- }
- LinkedHashMap options = new LinkedHashMap<>();
- /* register standard options */
- options.put(
- getString(R.string.scan_qr_code), new DevOptionHandler() {
- @Override
- public void onOptionSelected() {
- IntentIntegrator integrator = new IntentIntegrator(WXPageActivity.this);
- integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);
- integrator.setPrompt("Scan a barcode");
- //integrator.setCameraId(0); // Use a specific camera of the device
- integrator.setBeepEnabled(true);
- integrator.setOrientationLocked(false);
- integrator.setBarcodeImageEnabled(true);
- integrator.setPrompt(getString(R.string.capture_qrcode_prompt));
- integrator.initiateScan();
- }
- });
- options.put(
- getString(R.string.page_refresh), new DevOptionHandler() {
- @Override
- public void onOptionSelected() {
- createWeexInstance();
- renderPage();
- }
- });
-
- if (mCustomDevOptions.size() > 0) {
- options.putAll(mCustomDevOptions);
- }
-
- final DevOptionHandler[] optionHandlers = options.values().toArray(new DevOptionHandler[0]);
-
- mDevOptionsDialog =
- new AlertDialog.Builder(WXPageActivity.this)
- .setItems(
- options.keySet().toArray(new String[0]),
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- optionHandlers[which].onOptionSelected();
- mDevOptionsDialog = null;
- }
- })
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- mDevOptionsDialog = null;
- }
- })
- .create();
- mDevOptionsDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
- mDevOptionsDialog.show();
- }
-
- public void addCustomDevOption(
- String optionName,
- DevOptionHandler optionHandler) {
- mCustomDevOptions.put(optionName, optionHandler);
}
}
diff --git a/platforms/android/appframework/build.gradle b/platforms/android/appframework/build.gradle
index bde4286..9facec1 100644
--- a/platforms/android/appframework/build.gradle
+++ b/platforms/android/appframework/build.gradle
@@ -45,6 +45,7 @@ dependencies {
provided 'com.google.code.findbugs:jsr305:2.0.1'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.facebook.fresco:fresco:0.10.0'
+ compile 'com.alibaba:fastjson:1.2.38'
testCompile 'junit:junit:4.12'
testCompile 'org.hamcrest:hamcrest-core:1.3'
testCompile 'org.javassist:javassist:3.20.0-GA'
diff --git a/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/WXEventModule.java b/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/EventModule.java
similarity index 96%
rename from platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/WXEventModule.java
rename to platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/EventModule.java
index 760a19f..adea7d4 100755
--- a/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/WXEventModule.java
+++ b/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/EventModule.java
@@ -8,7 +8,7 @@
import com.taobao.weex.common.WXModuleAnno;
-public class WXEventModule extends WXModule {
+public class EventModule extends WXModule {
private static final String WEEX_CATEGORY = "com.taobao.android.intent.category.WEEX";
diff --git a/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/NavigatorModule.java b/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/NavigatorModule.java
new file mode 100644
index 0000000..06820e2
--- /dev/null
+++ b/platforms/android/appframework/src/main/java/com/instapp/natex/extend/module/NavigatorModule.java
@@ -0,0 +1,328 @@
+package com.instapp.natex.extend.module;
+
+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 com.taobao.weex.WXSDKEngine;
+import com.taobao.weex.annotation.JSMethod;
+import com.taobao.weex.bridge.JSCallback;
+import com.taobao.weex.bridge.WXBridgeManager;
+import com.taobao.weex.common.Constants;
+import com.taobao.weex.common.WXModule;
+import com.taobao.weex.utils.WXLogUtils;
+
+/**
+ * Created by Acathur on 10/09/2017.
+ */
+
+public class NavigatorModule 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.instapp.natex.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;
+ }
+ }
+
+ 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) {
+ 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;
+ }
+}