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; + } +}