|
package com.electric.chargingpile.activity;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.webkit.CookieManager;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebSettings.ZoomDensity;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.electric.chargingpile.R;
import com.electric.chargingpile.application.MainApplication;
import com.electric.chargingpile.util.BarColorUtil;
import com.electric.chargingpile.util.DES3;
import java.net.URLEncoder;
import java.util.Stack;
/**
* Version 1.0.1
*
* @author duiba
* 1、设置toolbar标题title为单行显示。
* 2、设置tile最大宽度为200dp。
* 3、修改toolbar高度为dip单位,20dip。
* 4、修改返回图标为靠左居中,margin-left=10dp。
* 5、添加dip2px()单位转换方法。
* <p>
* Version 1.0.2
* @author duiba
* 1、修复未登录用户登录后回到页面,后退到之前的页面时会刷新一次,去掉未登录状态。
* 2、后退刷新方法修复。
* 3、将栈内Activity对象改为CreditActivity。
* <p>
* Version 1.0.3
* @author duiba fxt
* 1、添加分享功能,支持分享的页面的导航栏会显示“分享”,需到兑吧管理后台配置并开启。
* 2、添加各个功能的注释信息。
* 3、分享接口和自动登录接口改为AlertDialog的展示形式。
* <p>
* Version 1.0.4
* @author duiba fxt
* 删除webview配置: settings.setLoadWithOverviewMode(true);
* 上面配置可能导致页面无法点击,页面适配等问题。
* <p>
* Version 1.0.5
* @author duiba fxt
* 在onConsume方法中加入刷新积分的js请求。如果页面含有onDBNewOpenBack()方法,则调用该js方法(刷新积分)
* 根据api版本,4.4之后使用evaluateJavascript方法。
* <p>
* Version 1.0.6
* @author duiba fxt
* 1.分享功能从js调java代码接口方式改为使用特定uri拦截的方式,消除因页面加载慢导致的分享按钮不出现问题。
* 2.修复网络慢时,分享按钮可能不出现的bug:改为url拦截方式触发,消除注入js延迟问题。
* 3.修复分享监听事件空指针的bug:添加creditsListener非空判断。
* 4.添加处理电话链接,启动本地通话应用。
* <p>
* Version 1.0.7
* @author duiba fxt
* 提供券码复制功能接口。
* js触发,券码传值
* 提供监听返回首页时,积分刷新动作。
* 删除掉不使用的工具方法
*/
/**
* Version 1.0.2
* @author duiba
* 1、修复未登录用户登录后回到页面,后退到之前的页面时会刷新一次,去掉未登录状态。
* 2、后退刷新方法修复。
* 3、将栈内Activity对象改为CreditActivity。
*/
/**
* Version 1.0.3
* @author duiba fxt
* 1、添加分享功能,支持分享的页面的导航栏会显示“分享”,需到兑吧管理后台配置并开启。
* 2、添加各个功能的注释信息。
* 3、分享接口和自动登录接口改为AlertDialog的展示形式。
*/
/**
* Version 1.0.4
* @author duiba fxt
* 删除webview配置: settings.setLoadWithOverviewMode(true);
* 上面配置可能导致页面无法点击,页面适配等问题。
*/
/**
* Version 1.0.5
* @author duiba fxt
* 在onConsume方法中加入刷新积分的js请求。如果页面含有onDBNewOpenBack()方法,则调用该js方法(刷新积分)
* 根据api版本,4.4之后使用evaluateJavascript方法。
*/
/**
* Version 1.0.6
* @author duiba fxt
* 1.分享功能从js调java代码接口方式改为使用特定uri拦截的方式,消除因页面加载慢导致的分享按钮不出现问题。
* 2.修复网络慢时,分享按钮可能不出现的bug:改为url拦截方式触发,消除注入js延迟问题。
* 3.修复分享监听事件空指针的bug:添加creditsListener非空判断。
* 4.添加处理电话链接,启动本地通话应用。
*/
/**
* Version 1.0.7
* @author duiba fxt
* 提供券码复制功能接口。
* js触发,券码传值
* 提供监听返回首页时,积分刷新动作。
* 删除掉不使用的工具方法
*/
/**
* Version 1.0.8
* 修改唤醒登录后历史页面返回刷新的功能,同时修复了一个唤醒登录历史页面不刷新的bug。
* 改为使用IS_WAKEUP_LOGIN静态变量标记唤醒登录状态,在onResume方法里加入判断,
* 实现历史页面返回刷新的功能。
*/
public class CreditActivity extends Activity {
private static String ua;
private static Stack<CreditActivity> activityStack;
public static final String VERSION = "1.0.8";
public static CreditsListener creditsListener;
public static boolean IS_WAKEUP_LOGIN = false;
public static boolean canFresh = false;
public static String INDEX_URI = "/chome/index";
private String type;
public interface CreditsListener {
/**
* 当点击分享按钮被点击
* @param shareUrl 分享的地址
* @param shareThumbnail 分享的缩略图
* @param shareTitle 分享的标题
* @param shareSubtitle 分享的副标题
*/
public void onShareClick(WebView webView, String shareUrl, String shareThumbnail, String shareTitle, String shareSubtitle);
/**
* 当点击登录
* @param webView 用于登录成功后返回到当前的webview并刷新。
* @param currentUrl 当前页面的url
*/
public void onLoginClick(WebView webView, String currentUrl);
/**
* 当点复制券码时
* @param mWebView mWebView对象。
* @param code 复制的券码
*/
public void onCopyCode(WebView mWebView, String code);
/**
* 通知本地,刷新积分
* @param mWebView
* @param credits
*/
public void onLocalRefresh(WebView mWebView, String credits);
}
protected String url;
protected String shareUrl; //分享的url
protected String shareThumbnail; //分享的缩略图
protected String shareTitle; //分享的标题
protected String shareSubtitle; //分享的副标题
protected Boolean ifRefresh = false;
protected Boolean delayRefresh = false;
protected String navColor;
protected String titleColor;
protected Long shareColor;
protected WebView mWebView;
protected LinearLayout mLinearLayout;
protected RelativeLayout mNavigationBar;
protected TextView mTitle;
protected ImageView mBackView;
protected TextView mShare;
private int tag = 0;
private int RequestCode = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); // 锁定竖屏显示
BarColorUtil.initStatusBarColor(CreditActivity.this);
url = getIntent().getStringExtra("url");
if (url == null) {
throw new RuntimeException("url can't be blank");
}
// 管理匿名类栈,用于模拟原生应用的页面跳转。
if (activityStack == null) {
activityStack = new Stack<CreditActivity>();
}
activityStack.push(this);
// 配置导航条文本颜色
titleColor = getIntent().getStringExtra("titleColor");
String titleColorTemp = "0xff" + titleColor.substring(1, titleColor.length());
Long titlel = Long.parseLong(titleColorTemp.substring(2), 16);
// 配置分享文案颜色,同title
shareColor = titlel;
// 配置导航栏背景颜色
navColor = getIntent().getStringExtra("navColor");
String navColorTemp = "0xff" + navColor.substring(1, navColor.length());
Long navl = Long.parseLong(navColorTemp.substring(2), 16);
// 初始化页面
try {
initView();
} catch (Exception e) {
e.printStackTrace();
}
setContentView(mLinearLayout);
// api11以上的系统隐藏系统默认的ActionBar
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.hide();
}
}
mTitle.setTextColor(titlel.intValue());
mNavigationBar.setBackgroundResource(R.drawable.bg_shop);
mBackView.setPadding(50, 50, 50, 50);
mBackView.setClickable(true);
// 添加后退按钮监听事件
mBackView.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
onBackClick();
}
});
// 添加分享按钮的监听事件
if (mShare != null) {
mShare.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
if (creditsListener != null) {
creditsListener.onShareClick(mWebView, shareUrl, shareThumbnail, shareTitle, shareSubtitle);
}
}
});
}
//js调java代码接口。
mWebView.addJavascriptInterface(new Object() {
//用于跳转用户登录页面事件。
@JavascriptInterface
public void login() {
if (creditsListener != null) {
mWebView.post(new Runnable() {
@Override
public void run() {
creditsListener.onLoginClick(mWebView, mWebView.getUrl());
}
});
}
}
//复制券码
@JavascriptInterface
public void copyCode(final String code) {
if (creditsListener != null) {
mWebView.post(new Runnable() {
@Override
public void run() {
creditsListener.onCopyCode(mWebView, code);
}
});
}
}
//客户端本地触发刷新积分。
@JavascriptInterface
public void localRefresh(final String credits) {
if (creditsListener != null) {
mWebView.post(new Runnable() {
@Override
public void run() {
creditsListener.onLocalRefresh(mWebView, credits);
}
});
}
}
}, "duiba_app");
if (ua == null) {
ua = mWebView.getSettings().getUserAgentString() + " Duiba/" + VERSION;
}
mWebView.getSettings().setUserAgentString(ua);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
CreditActivity.this.onReceivedTitle(view, title);
}
});
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
return shouldOverrideUrlByDuiba(view, url);
}
});
// ToastUtil.showToast(getApplicationContext(),url, Toast.LENGTH_LONG);
Log.e("url===", url);
mWebView.loadUrl(url);
}
protected void onBackClick() {
Intent intent = new Intent();
setResult(99, intent);
finishActivity(this);
MainMapActivity.back = "1";
}
// 初始化页面
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
protected void initView() throws Exception {
mLinearLayout = new LinearLayout(this);
mLinearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mLinearLayout.setOrientation(LinearLayout.VERTICAL);
int height50dp = dip2px(this, 45);
// 自定义导航栏
initNavigationBar();
LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, height50dp);
mLinearLayout.addView(mNavigationBar, mLayoutParams);
// 初始化WebView配置
initWebView();
mLinearLayout.addView(mWebView);
}
//自定义导航栏,包含 后退按钮,页面标题,分享按钮(默认隐藏)
protected void initNavigationBar() {
int dp200 = dip2px(this, 200);
int dp50 = dip2px(this, 50);
int dp20 = dip2px(this, 20);
int dp10 = dip2px(this, 10);
int dp16 = dip2px(this, 16);
int dp12 = dip2px(this, 12);
int dp4 = dip2px(this, 4);
mNavigationBar = new RelativeLayout(this);
mNavigationBar.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, dp20));
mTitle = new TextView(this);
mTitle.setMaxWidth(dp200);
mTitle.setLines(1);
mTitle.setTextSize(16.0f);
mNavigationBar.addView(mTitle);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) mTitle.getLayoutParams();
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
mBackView = new ImageView(this);
mBackView.setBackgroundResource(R.drawable.icon_lvback1119);
mBackView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
MainMapActivity.back = "1";
}
});
RelativeLayout.LayoutParams mBackLayout = new RelativeLayout.LayoutParams(dp12, dp20);
mBackLayout.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
mBackLayout.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
mBackLayout.setMargins(dp16, dp4, 0, dp4);
mNavigationBar.addView(mBackView, mBackLayout);
//在导航栏的右侧添加分享按钮(无分享信息的页面隐藏)
mShare = new TextView(this);
mShare.setLines(1);
mShare.setTextSize(15.0f);
mShare.setText("分享");
mShare.setPadding(0, 0, dp16, 0);
mShare.setTextColor(getResources().getColor(R.color.lvse));
mNavigationBar.addView(mShare);
RelativeLayout.LayoutParams shareLp = (RelativeLayout.LayoutParams) mShare.getLayoutParams();
shareLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
shareLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
//设置为默认不显示
mShare.setVisibility(View.INVISIBLE);
mShare.setClickable(false);
}
//初始化WebView配置
protected void initWebView() {
mWebView = new WebView(this);
mWebView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
WebSettings settings = mWebView.getSettings();
// User settings
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)) {
WebView.setWebContentsDebuggingEnabled(true);
}
}
settings.setJavaScriptEnabled(true); //设置webview支持javascript
settings.setLoadsImagesAutomatically(true); //支持自动加载图片
settings.setUseWideViewPort(true); //设置webview推荐使用的窗口,使html界面自适应屏幕
settings.setLoadWithOverviewMode(true);
settings.setSaveFormData(true); //设置webview保存表单数据
settings.setSavePassword(true); //设置webview保存密码
settings.setDefaultZoom(ZoomDensity.MEDIUM); //设置中等像素密度,medium=160dpi
settings.setSupportZoom(true); //支持缩放
CookieManager.getInstance().setAcceptCookie(true);
if (Build.VERSION.SDK_INT > 8) {
settings.setPluginState(PluginState.ON_DEMAND);
}
// Technical settings
settings.setSupportMultipleWindows(true);
mWebView.setLongClickable(true);
mWebView.setScrollbarFadingEnabled(true);
mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mWebView.setDrawingCacheEnabled(true);
settings.setAppCacheEnabled(true);
settings.setDatabaseEnabled(true);
settings.setDomStorageEnabled(true);
}
protected void onReceivedTitle(WebView view, String title) {
// LogUtils.e("title-"+title);
if (title.contains("cdz.")) {
mTitle.setText("");
} else {
if ("充电币商城".equals(title)) {
mTitle.setText("车主商城");
} else {
mTitle.setText(title);
}
}
}
/**
* 拦截url请求,根据url结尾执行相应的动作。 (重要)
* 用途:模仿原生应用体验,管理页面历史栈。
* @param view
* @param url
* @return
*/
protected boolean shouldOverrideUrlByDuiba(WebView view, String url) {
Log.e("url====", url);
Uri uri = Uri.parse(url);
if (this.url.equals(url)) {
view.loadUrl(url);
return true;
}
// 处理电话链接,启动本地通话应用。
if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent);
return true;
}
if (!url.startsWith("http://") && !url.startsWith("https://")) {
return false;
}
Log.e("url===", uri.getPath());
// 截获页面分享请求,分享数据
if ("/client/dbshare".equals(uri.getPath())) {
String content = uri.getQueryParameter("content");
if (creditsListener != null && content != null) {
String[] dd = content.split("\\|");
if (dd.length == 4) {
setShareInfo(dd[0], dd[1], dd[2], dd[3]);
mShare.setVisibility(View.VISIBLE);
mShare.setClickable(true);
mShare.setTextColor(getResources().getColor(R.color.lvse));
}
}
return true;
}
// 截获页面唤起登录请求。(目前暂时还是用js回调的方式,这里仅作预留。)
if ("/client/dblogin".equals(uri.getPath())) {
if (creditsListener != null) {
mWebView.post(new Runnable() {
@Override
public void run() {
creditsListener.onLoginClick(mWebView, mWebView.getUrl());
}
});
}
return true;
}
if (url.contains("dbnewopen")) { // 新开页面
Intent intent = new Intent();
intent.setClass(CreditActivity.this, CreditActivity.this.getClass());
intent.putExtra("navColor", navColor);
intent.putExtra("titleColor", titleColor);
url = url.replace("dbnewopen", "none");
intent.putExtra("url", url);
startActivityForResult(intent, RequestCode);
} else if (url.contains("dbbackrefresh")) { // 后退并刷新
url = url.replace("dbbackrefresh", "none");
Intent intent = new Intent();
intent.putExtra("url", url);
intent.putExtra("navColor", navColor);
intent.putExtra("titleColor", titleColor);
setResult(RequestCode, intent);
finishActivity(this);
} else if (url.contains("dbbackrootrefresh")) { // 回到积分商城首页并刷新
url = url.replace("dbbackrootrefresh", "none");
MainMapActivity.back = "1";
if (activityStack.size() == 1) {
finishActivity(this);
MainMapActivity.back = "1";
} else {
activityStack.get(0).ifRefresh = true;
finishUpActivity();
}
} else if (url.contains("dbbackroot")) { // 回到积分商城首页
url = url.replace("dbbackroot", "none");
MainMapActivity.back = "1";
if (activityStack.size() == 1) {
finishActivity(this);
} else {
finishUpActivity();
}
} else if (url.contains("dbback")) { // 后退
url = url.replace("dbback", "none");
finishActivity(this);
MainMapActivity.back = "1";
} else {
if (url.endsWith(".apk") || url.contains(".apk?")) { // 支持应用链接下载
Intent viewIntent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(viewIntent);
return true;
}
view.loadUrl(url);
}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (resultCode == 100) {
if (intent.getStringExtra("url") != null) {
this.url = intent.getStringExtra("url");
mWebView.loadUrl(this.url);
ifRefresh = false;
}
}
}
@Override
protected void onResume() {
super.onResume();
if (MainApplication.isLogin()) {
IS_WAKEUP_LOGIN = true;
}
if (ifRefresh) {
if (!MainApplication.isLogin()) {
this.url = getIntent().getStringExtra("url");
} else {
IS_WAKEUP_LOGIN = true;
this.url = getIntent().getStringExtra("url") + "&user_id=" + MainApplication.userId;
}
mWebView.loadUrl(this.url);
ifRefresh = false;
//如果首页含有登录的入口,返回时需要同时刷新首页的话,
// 需要把下面判断语句中的 && this.url.indexOf(INDEX_URI) > 0 去掉。
} else if (IS_WAKEUP_LOGIN && canFresh == true) {
long appTime11 = System.currentTimeMillis() / 1000;
Log.i("appTime(long)---", appTime11 + "");
long updatetime1 = appTime11 - MainMapActivity.cha - 5;
Log.i("updatetime(long)---", updatetime1 + "");
Log.i("cha---", MainMapActivity.cha + "");
String token1 = String.valueOf(updatetime1);
String encode_token = null;
try {
encode_token = DES3.encode(token1);
} catch (Exception e) {
e.printStackTrace();
}
String replace = URLEncoder.encode(encode_token);
if (MainApplication.goods_type.equals("shop")) {
this.url = "http://cdz.evcharge.cc/zhannew/basic/web/index.php/duiba/active?token=" + replace + "&user_id=" + MainApplication.userId + "&url=" + MainApplication.current_url;
} else {
this.url = "http://cdz.evcharge.cc/zhannew/basic/web/index.php/duiba/active?token=" + replace + "&user_id=" + MainApplication.userId + "&url=" + MainApplication.current_url;
}
Log.e("url==", getIntent().getStringExtra("url"));
Log.e("url===", this.url);
// mWebView.reload();
mWebView.loadUrl(this.url);
IS_WAKEUP_LOGIN = false;
canFresh = false;
} else {
// 返回页面时,如果页面含有onDBNewOpenBack()方法,则调用该js方法。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.evaluateJavascript("if(window.onDBNewOpenBack){onDBNewOpenBack()}", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
}
});
} else {
mWebView.loadUrl("javascript:if(window.onDBNewOpenBack){onDBNewOpenBack()}");
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackClick();
MainMapActivity.back = "1";
return true;
} else {
MainMapActivity.back = "1";
return super.onKeyDown(keyCode, event);
}
}
//--------------------------------------------以下为工具方法----------------------------------------------
/**
* 配置分享信息
*/
protected void setShareInfo(String shareUrl, String shareThumbnail, String shareTitle, String shareSubtitle) {
this.shareUrl = shareUrl;
this.shareThumbnail = shareThumbnail;
this.shareSubtitle = shareSubtitle;
this.shareTitle = shareTitle;
}
/**
* 结束除了最底部一个以外的所有Activity
*/
public void finishUpActivity() {
int size = activityStack.size();
for (int i = 0; i < size - 1; i++) {
activityStack.pop().finish();
}
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
}
}
/**
* (已弃用此方法,改为使用静态变量IS_WAKEUP_LOGIN来做通过唤醒登录的判断,从而设置返回后刷新)
* 设置栈内所有Activity为返回待刷新。
* 作用:未登录用户唤起登录后,将所有栈内的Activity设置为onResume时刷新页面。
*/
// public void setAllActivityDelayRefresh(){
// int size = activityStack.size();
// for (int i = 0;i < size; i++) {
// if(activityStack.get(i)!=this){
// activityStack.get(i).delayRefresh = true;
// }
// }
// }
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
}
|