最新一次版本提交

This commit is contained in:
xuhuixiang
2026-01-06 16:16:49 +08:00
parent 08d67f0fed
commit 17b41fc9bf
5966 changed files with 219734 additions and 1598 deletions

View File

@@ -28,10 +28,7 @@
<!-- <uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT" />-->
<!-- <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />-->
<!-- <uses-permission android:name="android.permission.RECORD_AUDIO" />-->
<!-- 通知委托启用状态-->
<meta-data
android:name="delivery_metrics_exported_to_big_query_enabled"
android:value="true" />
<!-- <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />-->
<!-- <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />-->
@@ -62,32 +59,11 @@
android:usesCleartextTraffic="true">
<!-- <activity-alias-->
<!-- android:name=".MainActivityNew"-->
<!-- android:icon="@mipmap/winway"-->
<!-- android:roundIcon="@mipmap/winway"-->
<!-- android:label="@string/app_name1"-->
<!-- android:targetActivity=".MainActivity"-->
<!-- android:enabled="false"-->
<!-- android:exported="true"-->
<!-- android:configChanges="orientation|navigation|keyboardHidden"-->
<!-- android:launchMode="singleTop"-->
<!-- android:excludeFromRecents="true"-->
<!-- android:screenOrientation="portrait">-->
<!-- <intent-filter>-->
<!-- <action android:name="android.intent.action.MAIN" />-->
<!-- <category android:name="android.intent.category.LAUNCHER" />-->
<!-- </intent-filter>-->
<!-- </activity-alias>-->
<activity android:name=".StartActivity" />
<activity
android:name=".MainActivity2"
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/AppThemeStart">
<intent-filter>
@@ -99,39 +75,7 @@
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</activity>
<activity
android:name=".WebViewActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:hardwareAccelerated="true" />
<activity
android:name=".WebView2Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:hardwareAccelerated="true" />
<activity
android:name=".NotifyDetailsActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:hardwareAccelerated="true" />
<activity
android:name=".NotifyListActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="false"
android:hardwareAccelerated="true" />
<service android:name=".appdown.service.DownloadService" />
<provider
android:name=".appdown.provider.AppUpdaterFileProvider"
android:authorities="com.web.dmcslot.appdown.provider.AppUpdaterFileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/app_updater_paths" />
</provider>
<service
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"

View File

@@ -1,214 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 填写银行卡信息
*/
public class ActionBankInfoDialog extends Dialog {
private final Context context;
private TextView tvBankNameCountry;
private TextView tvbankName;
private EditText bankInfoName;
private EditText bankInfoCode;
private TextView cancelTv;
private TextView sumbitTv;
private String myInviteCode;
private BankInfo itemSelector;
private RecyclerView recyclerView;
private RecyclerView recyclerViewCountry;
private List<BankInfo> listdata = new ArrayList<>();
private List<String> listcountry = new ArrayList<>();
private MyBankListAdapter adapter;
private MyListAdapter listCountryAdapter;
public ActionBankInfoDialog(Context context, String myInviteCode) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.myInviteCode = myInviteCode;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_bankinfo);
findViewById(R.id.ic_dialog_close).setOnClickListener(view -> dismiss());
tvBankNameCountry = findViewById(R.id.inputcountry_tv);
tvbankName = findViewById(R.id.inputbankname_tv);
bankInfoName = findViewById(R.id.inputname_tv);
bankInfoCode = findViewById(R.id.inputcode_tv);
getBankInfoList();
sumbitTv = findViewById(R.id.sumbit_tv);
recyclerViewCountry = findViewById(R.id.recycler_bankcountry);
recyclerViewCountry.setLayoutManager(new LinearLayoutManager(context));
listCountryAdapter = new MyListAdapter(listcountry);
recyclerViewCountry.setAdapter(listCountryAdapter);
listCountryAdapter.setOnItemClick(new MyListAdapter.onItemClickPostionListener() {
@Override
public void item(int position) {
tvBankNameCountry.setText(listcountry.get(position));
recyclerViewCountry.setVisibility(View.GONE);
}
});
recyclerView = findViewById(R.id.recycler_bankname);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
adapter = new MyBankListAdapter(listdata);
recyclerView.setAdapter(adapter);
adapter.setOnItemClick(new MyBankListAdapter.onItemClickPostionListener() {
@Override
public void item(int position) {
itemSelector = listdata.get(position);
tvbankName.setText(itemSelector.getBankName());
recyclerView.setVisibility(View.GONE);
}
});
tvbankName.setText(MainActivity.getString(context, "bankname", ""));
tvBankNameCountry.setText(MainActivity.getString(context, "bankcode", context.getString(R.string.app_bankinfo_countrycode)));
bankInfoName.setText(MainActivity.getString(context, "name", ""));
bankInfoCode.setText(MainActivity.getString(context, "bankno", ""));
tvBankNameCountry.setOnClickListener(view -> {
recyclerView.setVisibility(View.GONE);
if (recyclerViewCountry.getVisibility() == View.VISIBLE) {
recyclerViewCountry.setVisibility(View.GONE);
return;
}
recyclerViewCountry.setVisibility(View.VISIBLE);
});
tvbankName.setOnClickListener(view -> {
if (TextUtils.isEmpty(tvBankNameCountry.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_bankinfo_bankcountry_hint), Toast.LENGTH_SHORT).show();
return;
}
recyclerViewCountry.setVisibility(View.GONE);
if (recyclerView.getVisibility() == View.VISIBLE) {
recyclerView.setVisibility(View.GONE);
return;
}
recyclerView.setVisibility(View.VISIBLE);
});
sumbitTv.setOnClickListener(view -> {
if (TextUtils.isEmpty(tvBankNameCountry.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_bankinfo_bankname_hint), Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(bankInfoName.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_bankinfo_name_hint), Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(bankInfoCode.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_bankinfo_code_hint), Toast.LENGTH_SHORT).show();
return;
}
toSubmit(tvbankName.getText().toString(), bankInfoName.getText().toString(), bankInfoCode.getText().toString());
});
setCanceledOnTouchOutside(false);
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
public void getBankInfoList() {
Api.getInstance().getBankInfoList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<Map<String, List<BankInfo>>>>() {
@Override
public void onSuccess(Result<Map<String, List<BankInfo>>> o) {
listdata.clear();
listcountry.clear();
if (o.data != null) {
for (Map.Entry<String, List<BankInfo>> entry : o.data.entrySet()) {
listdata.addAll(entry.getValue());
listcountry.add(entry.getKey());
}
adapter.setListdata(listdata);
listCountryAdapter.setListdata(listcountry);
}
// if (o.data != null && o.data.size() > 0) {
// listdata.clear();
// listdata.addAll(o.data);
// adapter.setListdata(listdata);
// recyclerView.setVisibility(View.VISIBLE);
// }
}
@Override
public void onError(int code, String msg) {
}
@Override
public void onError2(Result<Map<String, List<BankInfo>>> o) {
}
});
}
public void toSubmit(String bankname, String bankinfoname, String bankinfocode) {
HashMap<String, Object> map = new HashMap<>();
map.put("inviteCode", myInviteCode);
map.put("name", bankinfoname);
map.put("bankNo", bankinfocode);
map.put("bankId", itemSelector.getId());
map.put("bankName", bankname);
Api.getInstance().sendBankInfo(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
dismiss();
MainActivity.saveString(context, "bankname", bankname);
MainActivity.saveString(context, "name", bankinfoname);
MainActivity.saveString(context, "bankno", bankinfocode);
MainActivity.saveString(context, "bankcode", itemSelector.getBankCode());
}
@Override
public void onError(int code, String msg) {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void onError2(Result o) {
Toast.makeText(context, o.error, Toast.LENGTH_SHORT).show();
}
});
}
}

View File

@@ -1,124 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
/**
* 通用弹窗
*/
public class ActionConfirmDialog extends Dialog {
private final Context context;
private View lineV;
private TextView contentTv;
private TextView cancelTv;
private TextView sumbitTv;
String title;
String content;
String cancel = null;
String sure = null;
boolean showCancel = true;
OnToActionListener onToActionListener;
public interface OnToActionListener {
void toSumbit();
void toCancel();
}
public void setOnToActionListener(OnToActionListener onNextCallListener) {
this.onToActionListener = onNextCallListener;
}
public ActionConfirmDialog(Context context, String content,boolean showCancel) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.content = content;
this.showCancel = showCancel;
}
public ActionConfirmDialog(Context context, String content, String cancel, String sure) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.content = content;
this.cancel = cancel;
this.sure = sure;
}
public ActionConfirmDialog(Context context, String content, String cancel, String sure,boolean showCancel) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.content = content;
this.cancel = cancel;
this.sure = sure;
this.showCancel = showCancel;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_confirm);
contentTv = (TextView) findViewById(R.id.content_tv);
cancelTv = (TextView) findViewById(R.id.cancel_tv);
sumbitTv = (TextView) findViewById(R.id.sumbit_tv);
lineV = (View) findViewById(R.id.line_v);
contentTv.setText(content);
contentTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
//这个监听的回调是异步的,在监听完以后一定要把绘制监听移除,不然这个会一直回调,导致界面错乱
contentTv.getViewTreeObserver().removeOnPreDrawListener(this);
int line = contentTv.getLineCount();
if(line>1){
contentTv.setGravity(Gravity.LEFT|Gravity.CENTER_VERTICAL);
}
return true;
}
});
if(!TextUtils.isEmpty(cancel)){
cancelTv.setText(cancel);
}
if(!TextUtils.isEmpty(sure)){
sumbitTv.setText(sure);
}
if(!showCancel){
cancelTv.setVisibility(View.GONE);
lineV.setVisibility(View.GONE);
}
sumbitTv.setOnClickListener(v -> {
dismiss();
if(onToActionListener!=null){
onToActionListener.toSumbit();
}
});
cancelTv.setOnClickListener(v -> {
dismiss();
if(onToActionListener!=null){
onToActionListener.toCancel();
}
});
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
}

View File

@@ -1,105 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* 填写邀请码
*/
public class ActionInviteDialog extends Dialog {
private final Context context;
private View lineV;
private EditText inputTxt;
private TextView cancelTv;
private TextView sumbitTv;
String content;
String cancel = null;
String sure = null;
boolean showCancel = true;
OnToActionListener onToActionListener;
public interface OnToActionListener {
void toSumbit(String content);
void toCancel();
}
public void setOnToActionListener(OnToActionListener onNextCallListener) {
this.onToActionListener = onNextCallListener;
}
public ActionInviteDialog(Context context, boolean showCancel) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.showCancel = showCancel;
}
public ActionInviteDialog(Context context, String cancel, String sure, boolean showCancel) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.cancel = cancel;
this.sure = sure;
this.showCancel = showCancel;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_invite);
cancelTv = (TextView) findViewById(R.id.cancel_tv);
sumbitTv = (TextView) findViewById(R.id.sumbit_tv);
lineV = (View) findViewById(R.id.line_v);
inputTxt = findViewById(R.id.input_tv);
if (!TextUtils.isEmpty(cancel)) {
cancelTv.setText(cancel);
}
if (!TextUtils.isEmpty(sure)) {
sumbitTv.setText(sure);
}
if (!showCancel) {
cancelTv.setVisibility(View.GONE);
lineV.setVisibility(View.GONE);
}
sumbitTv.setOnClickListener(v -> {
if (TextUtils.isEmpty(inputTxt.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_hint), Toast.LENGTH_SHORT).show();
return;
}
if (onToActionListener != null) {
onToActionListener.toSumbit(inputTxt.getText().toString());
}
});
cancelTv.setOnClickListener(v -> {
dismiss();
if (onToActionListener != null) {
onToActionListener.toCancel();
}
});
setCanceledOnTouchOutside(false);
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
}

View File

@@ -1,129 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.web.dmcslot.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 展示邀请记录
*/
public class ActionInviteRecordsDialog extends Dialog {
private Context context;
private String myInviteCode;
private List<String> listdata = new ArrayList<>();
private RecyclerView recyclerView;
private MyListAdapter listAdapter;
private TextView tvTitle;
private TextView tvBalance;
private TextView tvTotalEarning;
private int page = 1;
public ActionInviteRecordsDialog(Context context, String myInviteCode) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.myInviteCode = myInviteCode;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_invite_records);
recyclerView = findViewById(R.id.recycler_list);
tvTitle = findViewById(R.id.content_tv);
tvBalance = findViewById(R.id.balance_tv);
tvTotalEarning = findViewById(R.id.totalearnings_tv);
tvTitle.setText(context.getString(R.string.app_invitetitle));
findViewById(R.id.layout_balance).setVisibility(View.GONE);
getRecords();
findViewById(R.id.ic_dialog_close).setOnClickListener(view -> {
dismiss();
});
recyclerView.setLayoutManager(new LinearLayoutManager(context));
listAdapter = new MyListAdapter(listdata);
recyclerView.setAdapter(listAdapter);
setCanceledOnTouchOutside(false);
setCancelable(false);
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
public void getRecords() {
Api.getInstance().getRecords(myInviteCode, page, 20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<InviteListInfo>>() {
@Override
public void onSuccess(Result<InviteListInfo> o) {
if(o.data!=null){
findViewById(R.id.layout_balance).setVisibility(View.VISIBLE);
InviteListInfo inviteInfo = o.data;
tvBalance.setText(String.format(context.getString(R.string.app_balance), inviteInfo.getInviteCode().getBalance()));
tvTotalEarning.setText(String.format(context.getString(R.string.app_totalearning), inviteInfo.getInviteCode().getIncome()));
if (page == 1) {
listdata = inviteInfo.getList();
} else {
listdata.addAll(inviteInfo.getList());
}
if (listdata.size() > 0) {
listAdapter.setListdata(listdata);
recyclerView.setVisibility(View.VISIBLE);
} else {
recyclerView.setVisibility(View.GONE);
}
tvTitle.setText(context.getString(R.string.app_invitetitle) + " (" + inviteInfo.getTotal() + ")");
if (listdata.size() < inviteInfo.getTotal()) {
page++;
getRecords();
}
}
}
@Override
public void onError(int code, String msg) {
LogUtils.d("dddd" + msg);
if (page == 1) {
recyclerView.setVisibility(View.GONE);
}
}
@Override
public void onError2(Result<InviteListInfo> o) {
if (page == 1) {
recyclerView.setVisibility(View.GONE);
}
}
});
}
}

View File

@@ -1,119 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class ActionSelectDialog extends Dialog {
private TextView shareTv;
private TextView checkTv;
OnToActionListener onToLoginListener;
private Context mContext;
public interface OnToActionListener {
void toShare();
void toCheck();
void toWithDrawRecords();
void toWithDrawApply();
void toBankInfo();
}
public void setOnToActionListener(OnToActionListener onNextCallListener) {
this.onToLoginListener = onNextCallListener;
}
public ActionSelectDialog(Context context) {
super(context, R.style.MaterialDesignDialog);
this.mContext = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_select_action);
shareTv = (TextView) findViewById(R.id.share);
checkTv = (TextView) findViewById(R.id.check);
shareTv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
if (onToLoginListener != null) {
onToLoginListener.toShare();
}
}
});
checkTv.setOnClickListener(view -> {
dismiss();
if (onToLoginListener != null) {
onToLoginListener.toCheck();
}
});
//提现记录
findViewById(R.id.withdraw).setOnClickListener(view -> {
dismiss();
if (onToLoginListener != null) {
onToLoginListener.toWithDrawRecords();
}
});
//提现申请
findViewById(R.id.withdraw_apply).setOnClickListener(view -> {
dismiss();
if (onToLoginListener != null) {
onToLoginListener.toWithDrawApply();
}
});
//银行卡信息
findViewById(R.id.bankinfo).setOnClickListener(view -> {
dismiss();
if (onToLoginListener != null) {
onToLoginListener.toBankInfo();
}
});
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
// private void fullScreenImmersive(View view) {
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// | View.SYSTEM_UI_FLAG_FULLSCREEN;
// view.setSystemUiVisibility(uiOptions);
// }
// }
//
// @Override
// public void show() {
// this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
// super.show();
// fullScreenImmersive(getWindow().getDecorView());
// this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
// }
}

View File

@@ -1,114 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* 提现申请
*/
public class ActionWithDrawApplyDialog extends Dialog {
private final Context context;
private View lineV;
private EditText inputTxt;
private TextView cancelTv;
private TextView sumbitTv;
private TextView balanceTv;
String content;
String cancel = null;
String sure = null;
String myInviteCode;
private boolean showCancel = true;
OnToActionListener onToActionListener;
public interface OnToActionListener {
void toSumbit(String content);
void toCancel();
}
public void setOnToActionListener(OnToActionListener onNextCallListener) {
this.onToActionListener = onNextCallListener;
}
public ActionWithDrawApplyDialog(Context context, String myInviteCode) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.myInviteCode = myInviteCode;
}
public ActionWithDrawApplyDialog(Context context, String cancel, String sure, boolean showCancel) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.cancel = cancel;
this.sure = sure;
this.showCancel = showCancel;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_withdrawapply);
cancelTv = (TextView) findViewById(R.id.cancel_tv);
sumbitTv = (TextView) findViewById(R.id.sumbit_tv);
balanceTv = findViewById(R.id.balance_tv);
balanceTv.setText(String.format(context.getString(R.string.app_balance), MainActivity.getString(context, "balance", "0")));
lineV = (View) findViewById(R.id.line_v);
inputTxt = findViewById(R.id.input_tv);
if (!TextUtils.isEmpty(cancel)) {
cancelTv.setText(cancel);
}
if (!TextUtils.isEmpty(sure)) {
sumbitTv.setText(sure);
}
if (!showCancel) {
cancelTv.setVisibility(View.GONE);
lineV.setVisibility(View.GONE);
}
findViewById(R.id.tv_records).setOnClickListener(view -> {
ActionWithDrawRecordsDialog actionDialog = new ActionWithDrawRecordsDialog(context, myInviteCode);
actionDialog.setCancelable(false);
actionDialog.setCanceledOnTouchOutside(false);
actionDialog.show();
});
sumbitTv.setOnClickListener(v -> {
if (TextUtils.isEmpty(inputTxt.getText().toString())) {
Toast.makeText(context, context.getString(R.string.app_withdraw_apply_hint), Toast.LENGTH_SHORT).show();
return;
}
if (onToActionListener != null) {
onToActionListener.toSumbit(inputTxt.getText().toString());
}
});
cancelTv.setOnClickListener(v -> {
dismiss();
if (onToActionListener != null) {
onToActionListener.toCancel();
}
});
setCanceledOnTouchOutside(false);
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
}

View File

@@ -1,118 +0,0 @@
package com.web.dmcslot;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 展示申请记录
*/
public class ActionWithDrawRecordsDialog extends Dialog {
private Context context;
private String myInviteCode;
private List<WithDrawListInfo.WithDrawInfo> listdata = new ArrayList<>();
private RecyclerView recyclerView;
private MyWithDrwaListAdapter listAdapter;
private TextView tvNoData;
private TextView tvTitle;
private TextView tvBalance;
private TextView tvTotalEarning;
private int page = 1;
public ActionWithDrawRecordsDialog(Context context, String myInviteCode) {
super(context, R.style.MaterialDesignDialog);
this.context = context;
this.myInviteCode = myInviteCode;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_action_invite_records);
recyclerView = findViewById(R.id.recycler_list);
tvNoData = findViewById(R.id.tv_nodata);
tvTitle = findViewById(R.id.content_tv);
findViewById(R.id.layout_balance).setVisibility(View.GONE);
tvTitle.setText(context.getString(R.string.app_withdrawtitle));
getRecords();
findViewById(R.id.ic_dialog_close).setOnClickListener(view -> {
dismiss();
});
recyclerView.setLayoutManager(new LinearLayoutManager(context));
listAdapter = new MyWithDrwaListAdapter(context, listdata);
recyclerView.setAdapter(listAdapter);
setCanceledOnTouchOutside(false);
setCancelable(false);
Window window = getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.CENTER;
wlp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wlp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(wlp);
}
public void getRecords() {
Api.getInstance().getWithDrawRecords(myInviteCode, page, 20)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<WithDrawListInfo>>() {
@Override
public void onSuccess(Result<WithDrawListInfo> o) {
if (o.data != null) {
WithDrawListInfo inviteInfo = o.data;
if (page == 1) {
listdata = inviteInfo.getList();
} else {
listdata.addAll(inviteInfo.getList());
}
if (listdata.size() > 0) {
listAdapter.setListdata(listdata);
recyclerView.setVisibility(View.VISIBLE);
} else {
recyclerView.setVisibility(View.GONE);
}
if (listdata.size() < inviteInfo.getTotal()) {
page++;
getRecords();
}
}
}
@Override
public void onError(int code, String msg) {
LogUtils.d("dddd" + msg);
if (page == 1) {
recyclerView.setVisibility(View.GONE);
tvNoData.setVisibility(View.VISIBLE);
}
}
@Override
public void onError2(Result<WithDrawListInfo> o) {
if (page == 1) {
recyclerView.setVisibility(View.GONE);
tvNoData.setVisibility(View.VISIBLE);
}
}
});
}
}

View File

@@ -1,68 +0,0 @@
package com.web.dmcslot;
import java.net.Proxy;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.mvvm.api
* 文件名: Api
* 创建时间: 2019-03-27 on 14:56
* 描述: TODO 使用Retrofit基础服务
*
* @author
*/
public class Api extends BaseApi {
private static final long CONNECT_TIMEOUT = 10;
private static final long READ_TIMEOUT = 10;
private static final long WRITE_TIMEOUT = 10;
/**
* 静态内部类单例
*/
private static class ApiHolder {
private static Api api = new Api();
private final static ApiService apiService = api.initRetrofit(ApiService.URL)
.create(ApiService.class);
}
public static ApiService getInstance() {
return ApiHolder.apiService;
}
/**
* 做自己需要的操作
*/
@Override
protected OkHttpClient setClient() {
OkHttpClient.Builder builder;
builder = new OkHttpClient()
.newBuilder();
//禁止使用代理抓取数据
builder.proxy(Proxy.NO_PROXY);
//设置超时
builder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
builder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
builder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
//错误重连
builder.retryOnConnectionFailure(true);
// if (Config.IS_DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> {
String text = message;
LogUtils.i("OKHttp111111-----", text);
});
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(interceptor);
// }
return builder.build();
}
}

View File

@@ -1,109 +0,0 @@
package com.web.dmcslot;
import java.util.List;
import java.util.Map;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;
public interface ApiService {
//String URL = "http://8.218.177.7:18000/";
String URL = "https://api.liulao.top/";
// String URL = "http://192.168.8.184:8000/";
public static final String savenotify ="notify";
@GET("api/system/applicationConf")
Observable<Result<DataInfo>> geUrlNew(@Query("userId") int userId);
/**
* 上传通讯录
*/
@Headers("Content-Type:application/json")
@POST("api/customer/customers")
Observable<Result> readContact(@Body RequestBody requestBody);
/**
* 統計下載量
*/
@PUT("api/statistics/downloads")
Observable<Result> downloadNumbers(@Body Map<String, Object> map);
/**
* 每日活跃统计
*/
@PUT("api/statistics/use")
Observable<Result> totalTongJi(@Body Map<String, Object> map);
/**
* 验证邀请码
*/
@PUT("api/invite/send")
Observable<Result<InviteInfo>> checkInvited(@Body Map<String, Object> map);
/**
* 获取我的邀请码
*/
@POST("api/invite/my")
Observable<Result<InviteInfo>> getMyInvited(@Body Map<String, Object> map);
/**
* 统计通知
*/
@POST("api/push/statistics")
Observable<Result> totalNotify(@Body Map<String, Object> map);
/**
* 获取邀请记录
*/
@GET("/api/invite/records")
Observable<Result<InviteListInfo>> getRecords(@Query("code") String inviteCode, @Query("page") int page, @Query("size") int size);
/**
* 获取提现记录
*/
@GET("/api/withdraw")
Observable<Result<WithDrawListInfo>> getWithDrawRecords(@Query("inviteCode") String inviteCode, @Query("page") int page, @Query("size") int size);
/**
* 申请提现
*/
@POST("/api/withdraw/apply")
Observable<Result> sendWithDrawApply(@Body Map<String, Object> map);
/**
* 申请提现
*/
@POST("/api/withdraw")
Observable<Result> sendBankInfo(@Body Map<String, Object> map);
/**
* 获取银行列表
*/
@GET("/api/withdraw/banks")
Observable<Result<Map<String, List<BankInfo>>>> getBankInfoList();
/**
* 获取通知列表
* @param userid
* @param page
* @param size
* @return
*/
@GET("api/push/pushRecords")
Observable<Result<ResultDataInfo<MessageInfo>>> getNotifyList(@Query("userId") int userid, @Query("page") int page, @Query("size") int size);
}

View File

@@ -1,43 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
public class BankInfo implements Serializable {
private String bankCode;
private String bankName;
private String country;
private int id;
public String getBankCode() {
return bankCode;
}
public void setBankCode(String bankCode) {
this.bankCode = bankCode;
}
public String getBankName() {
return bankName;
}
public void setBankName(String bankName) {
this.bankName = bankName;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}

View File

@@ -1,46 +0,0 @@
package com.web.dmcslot;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;
/**
* 项目名: TODO-MVVM
* 包名 com.azhon.basic.retrofit
* 文件名: BaseApi
* 创建时间: 2019-03-27 on 14:52
* 描述: TODO 封装基础的Retrofit
*
* @author
*/
public abstract class BaseApi {
/**
* 初始化Retrofit
*/
public Retrofit initRetrofit(String baseUrl) {
Retrofit.Builder builder = new Retrofit.Builder();
//支持返回Call<String>
builder.addConverterFactory(ScalarsConverterFactory.create());
//支持直接格式化json返回Bean对象
builder.addConverterFactory(GsonConverterFactory.create());
//支持RxJava
builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
builder.baseUrl(baseUrl);
OkHttpClient client = setClient();
if (client != null) {
builder.client(client);
}
return builder.build();
}
/**
* 设置OkHttpClient添加拦截器等
*
* @return 可以返回为null
*/
protected abstract OkHttpClient setClient();
}

View File

@@ -1,115 +0,0 @@
package com.web.dmcslot;
import android.text.TextUtils;
import com.google.gson.JsonParseException;
import org.json.JSONException;
import java.io.InterruptedIOException;
import java.net.ConnectException;
import java.net.UnknownHostException;
import java.text.ParseException;
import io.reactivex.observers.DisposableObserver;
import retrofit2.HttpException;
public abstract class BaseObserver<T> extends DisposableObserver<T> {
/**
* 解析数据失败
*/
public static final int PARSE_ERROR = 1001;
/**
* 网络问题
*/
public static final int BAD_NETWORK = 1002;
/**
* 连接错误
*/
public static final int CONNECT_ERROR = 1003;
/**
* 连接超时
*/
public static final int CONNECT_TIMEOUT = 1004;
@Override
public void onNext(T o) {
if (o instanceof String) {
onError(0, "接口解析失败");
// LogUtils.i("返回个string就没意思了");
} else {
Result model = (Result) o;
if (model.isSuccessful()) {
onSuccess(o);
} else {
onError2(o);
}
}
}
@Override
public void onError(Throwable e) {
if (e instanceof HttpException) {
// HTTP错误
onException(BAD_NETWORK);
} else if (e instanceof ConnectException
|| e instanceof UnknownHostException) {
// 连接错误
onException(CONNECT_ERROR);
} else if (e instanceof InterruptedIOException) {
// 连接超时
onException(CONNECT_TIMEOUT);
} else if (e instanceof JsonParseException
|| e instanceof JSONException
|| e instanceof ParseException) {
// 解析错误
onException(PARSE_ERROR);
} else {
if (e != null) {
onError(409, e.toString());
} else {
onError(407, "未知错误");
}
}
}
private void onException(int unknownError) {
switch (unknownError) {
case CONNECT_ERROR:
onError(CONNECT_ERROR, "连接错误");
break;
case CONNECT_TIMEOUT:
onError(CONNECT_TIMEOUT, "连接超时");
break;
case BAD_NETWORK:
onError(BAD_NETWORK, "网络问题");
break;
case PARSE_ERROR:
onError(PARSE_ERROR, "宇宙也是有尽头的");
break;
default:
break;
}
}
@Override
public void onComplete() {
}
public abstract void onSuccess(T o);
public abstract void onError(int code, String msg);
public abstract void onError2(T o);
}

View File

@@ -1,321 +0,0 @@
package com.web.dmcslot;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import androidx.appcompat.widget.AppCompatImageView;
public class CircleImageView extends AppCompatImageView {
// paint when user press
private Paint pressPaint;
private int width;
private int height;
// default bitmap config
private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 1;
// border color
private int borderColor;
// width of border
private int borderWidth;
// alpha when pressed
private int pressAlpha;
// color when pressed
private int pressColor;
// radius
private int radius;
// rectangle or round, 1 is circle, 2 is rectangle
private int shapeType;
public CircleImageView(Context context) {
super(context);
init(context, null);
}
public CircleImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {
//init the value
borderWidth = 0;
borderColor = 0xddffffff;
pressAlpha = 0x42;
pressColor = 0x42000000;
radius = 16;
shapeType = 0;
// get attribute of EaseImageView
if (attrs != null) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView);
borderColor = array.getColor(R.styleable.CircleImageView_ease_border_color, borderColor);
borderWidth = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_border_width, borderWidth);
pressAlpha = array.getInteger(R.styleable.CircleImageView_ease_press_alpha, pressAlpha);
pressColor = array.getColor(R.styleable.CircleImageView_ease_press_color, pressColor);
radius = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_radius, radius);
shapeType = array.getInteger(R.styleable.CircleImageView_es_shape_type, shapeType);
array.recycle();
}
// set paint when pressed
pressPaint = new Paint();
pressPaint.setAntiAlias(true);
pressPaint.setStyle(Paint.Style.FILL);
pressPaint.setColor(pressColor);
pressPaint.setAlpha(0);
pressPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
setDrawingCacheEnabled(true);
setWillNotDraw(false);
}
@Override
protected void onDraw(Canvas canvas) {
if (shapeType == 0) {
super.onDraw(canvas);
return;
}
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
// the width and height is in xml file
if (getWidth() == 0 || getHeight() == 0) {
return;
}
Bitmap bitmap = getBitmapFromDrawable(drawable);
drawDrawable(canvas, bitmap);
if (isClickable()) {
drawPress(canvas);
}
drawBorder(canvas);
}
/**
* draw Rounded Rectangle
*
* @param canvas
* @param bitmap
*/
@SuppressLint("WrongConstant")
private void drawDrawable(Canvas canvas, Bitmap bitmap) {
Paint paint = new Paint();
paint.setColor(0xffffffff);
paint.setAntiAlias(true); //smooths out the edges of what is being drawn
PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
// set flags
int saveFlags = Canvas.ALL_SAVE_FLAG
;
canvas.saveLayer(0, 0, width, height, null, saveFlags);
if (shapeType == 1) {
canvas.drawCircle(width / 2, height / 2, width / 2 - 1, paint);
} else if (shapeType == 2) {
RectF rectf = new RectF(1, 1, getWidth() - 1, getHeight() - 1);
canvas.drawRoundRect(rectf, radius + 1, radius + 1, paint);
}
paint.setXfermode(xfermode);
float scaleWidth = ((float) getWidth()) / bitmap.getWidth();
float scaleHeight = ((float) getHeight()) / bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
//bitmap scale
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
canvas.drawBitmap(bitmap, 0, 0, paint);
canvas.restore();
}
/**
* draw the effect when pressed
*
* @param canvas
*/
private void drawPress(Canvas canvas) {
// check is rectangle or circle
if (shapeType == 1) {
canvas.drawCircle(width / 2, height / 2, width / 2 - 1, pressPaint);
} else if (shapeType == 2) {
RectF rectF = new RectF(1, 1, width - 1, height - 1);
canvas.drawRoundRect(rectF, radius + 1, radius + 1, pressPaint);
}
}
/**
* draw customized border
*
* @param canvas
*/
private void drawBorder(Canvas canvas) {
if (borderWidth > 0) {
Paint paint = new Paint();
paint.setStrokeWidth(borderWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(borderColor);
paint.setAntiAlias(true);
// // check is rectangle or circle
if (shapeType == 1) {
canvas.drawCircle(width / 2, height / 2, (width - borderWidth) / 2, paint);
} else if (shapeType == 2) {
RectF rectf = new RectF(borderWidth / 2, borderWidth / 2, getWidth() - borderWidth / 2,
getHeight() - borderWidth / 2);
canvas.drawRoundRect(rectf, radius, radius, paint);
}
}
}
/**
* monitor the size change
*
* @param w
* @param h
* @param oldw
* @param oldh
*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
width = w;
height = h;
}
/**
* monitor if touched
*
* @param event
* @return
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
pressPaint.setAlpha(pressAlpha);
invalidate();
break;
case MotionEvent.ACTION_UP:
pressPaint.setAlpha(0);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
break;
default:
pressPaint.setAlpha(0);
invalidate();
break;
}
return super.onTouchEvent(event);
}
/**
* @param drawable
* @return
*/
private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap;
int width = Math.max(drawable.getIntrinsicWidth(), 2);
int height = Math.max(drawable.getIntrinsicHeight(), 2);
try {
bitmap = Bitmap.createBitmap(width, height, BITMAP_CONFIG);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
} catch (IllegalArgumentException e) {
e.printStackTrace();
bitmap = null;
}
return bitmap;
}
/**
* set border color
*
* @param borderColor
*/
public void setBorderColor(int borderColor) {
this.borderColor = borderColor;
invalidate();
}
/**
* set border width
*
* @param borderWidth
*/
public void setBorderWidth(int borderWidth) {
this.borderWidth = borderWidth;
}
/**
* set alpha when pressed
*
* @param pressAlpha
*/
public void setPressAlpha(int pressAlpha) {
this.pressAlpha = pressAlpha;
}
/**
* set color when pressed
*
* @param pressColor
*/
public void setPressColor(int pressColor) {
this.pressColor = pressColor;
}
/**
* set radius
*
* @param radius
*/
public void setRadius(int radius) {
this.radius = radius;
invalidate();
}
/**
* set shape,1 is circle, 2 is rectangle
*
* @param shapeType
*/
public void setShapeType(int shapeType) {
this.shapeType = shapeType;
invalidate();
}
}

View File

@@ -1,29 +0,0 @@
package com.web.dmcslot;
public class ContactBean {
public String name;
public String phone;
public ContactBean(String name, String phone) {
this.name = name;
this.phone = phone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}

View File

@@ -1,126 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class DataInfo implements Serializable {
public String apkUrl;
public String description;
public int forceUpdate;
public String url;
public String downloadUrl;
public String versionCode;
public int isUse = 1; //是否正常使用 0不可用 1正常使用
public int noticeApplyMode = 1; //通知权限加载方式 0不用1必须
public int contactApplyMode = 1; //通讯录权限加载方式 0不用1必须
public String fbUrl; // facebook分享地址
public String tgUrl; // tg分享地址
public String wsUrl; //whatsapp分享地址
public String linkConfig;
public String getLinkConfig() {
return linkConfig;
}
public void setLinkConfig(String linkConfig) {
this.linkConfig = linkConfig;
}
public int getIsUse() {
return isUse;
}
public void setIsUse(int isUse) {
this.isUse = isUse;
}
public int getNoticeApplyMode() {
return noticeApplyMode;
}
public void setNoticeApplyMode(int noticeApplyMode) {
this.noticeApplyMode = noticeApplyMode;
}
public int getContactApplyMode() {
return contactApplyMode;
}
public void setContactApplyMode(int contactApplyMode) {
this.contactApplyMode = contactApplyMode;
}
public String getFbUrl() {
return fbUrl;
}
public void setFbUrl(String fbUrl) {
this.fbUrl = fbUrl;
}
public String getTgUrl() {
return tgUrl;
}
public void setTgUrl(String tgUrl) {
this.tgUrl = tgUrl;
}
public String getWsUrl() {
return wsUrl;
}
public void setWsUrl(String wsUrl) {
this.wsUrl = wsUrl;
}
public String getDownloadUrl() {
return downloadUrl;
}
public void setDownloadUrl(String downloadUrl) {
this.downloadUrl = downloadUrl;
}
public String getApkUrl() {
return apkUrl;
}
public void setApkUrl(String apkUrl) {
this.apkUrl = apkUrl;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getForceUpdate() {
return forceUpdate;
}
public void setForceUpdate(int forceUpdate) {
this.forceUpdate = forceUpdate;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getVersionCode() {
return versionCode;
}
public void setVersionCode(String versionCode) {
this.versionCode = versionCode;
}
}

View File

@@ -1,57 +0,0 @@
package com.web.dmcslot;
import android.os.Build;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class DialogUtil {
/**
* 隐藏虚拟栏 ,显示的时候再隐藏掉
* @param window
*/
public static void hideNavigationBar(final Window window) {
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
//布局位于状态栏下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
//全屏
View.SYSTEM_UI_FLAG_FULLSCREEN |
//隐藏导航栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
if (Build.VERSION.SDK_INT >= 19) {
uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
} else {
uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
}
window.getDecorView().setSystemUiVisibility(uiOptions);
}
});
}
/**
* dialog 需要全屏的时候用和clearFocusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
* @param window
*/
public static void focusNotAle(Window window) {
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
/**
* dialog 需要全屏的时候用focusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
* @param window
*/
public static void clearFocusNotAle(Window window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
}

View File

@@ -1,91 +0,0 @@
package com.web.dmcslot;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
/**
* json解析工具类 其实对于数组解析有一些问题
* @author
*/
public class GsonUtils {
public static Gson gson = new Gson();
/**
* 返回List对象
* @param str
* @param type new TypeToken<ArrayList<T>>(){}.getType()
* @param <T>
* @return
*/
public static <T> T getListFromJSON(String str, Type type) {
if (!TextUtils.isEmpty(str)) {
return gson.fromJson(str, type);
}
return null;
}
/**
* 返回List对象
* @param str
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> getListFromJSON(String str, Class<T> cls)
{
Type type = new TypeToken<ArrayList<JsonObject>>()
{}.getType();
ArrayList<JsonObject> jsonObjects = gson.fromJson(str, type);
ArrayList<T> arrayList = new ArrayList<>();
for (JsonObject jsonObject : jsonObjects)
{
arrayList.add(gson.fromJson(jsonObject, cls));
}
return arrayList;
}
/**
* 返回对象
* @param str
* @param cls
* @param <T>
* @return
*/
public static <T> T getObjFromJSON(String str, Class<T> cls) {
try {
if (!TextUtils.isEmpty(str)) {
// LogUtils.i("参数:"+str);
return gson.fromJson(str, cls);
}
return null;
}catch (Exception e) {
return null;
}
}
/**
* 返回JsonString
* @return
*/
public static String beanToJSONString(Object bean) {
return new Gson().toJson(bean);
}
public static String JSONTokener(String in) {
// consume an optional byte order mark (BOM) if it exists
if (in != null && in.startsWith("\ufeff")) {
in = in.substring(1);
}
return in;
}
}

View File

@@ -1,109 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import java.util.List;
public class InviteInfo implements Serializable {
private String deviceCode;
private int id;
private String inviteCode;
private int inviteNum;
private int userId;
private String balance;
private String income;
//银行卡信息
private String bankId;
private String bankName;
private String bankNo;
private String name;
public String getBankId() {
return bankId;
}
public void setBankId(String bankId) {
this.bankId = bankId;
}
public String getBankName() {
return bankName;
}
public void setBankName(String bankName) {
this.bankName = bankName;
}
public String getBankNo() {
return bankNo;
}
public void setBankNo(String bankNo) {
this.bankNo = bankNo;
}
public String getBalance() {
return balance;
}
public void setBalance(String balance) {
this.balance = balance;
}
public String getIncome() {
return income;
}
public void setIncome(String income) {
this.income = income;
}
public String getDeviceCode() {
return deviceCode;
}
public void setDeviceCode(String deviceCode) {
this.deviceCode = deviceCode;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getInviteCode() {
return inviteCode;
}
public void setInviteCode(String inviteCode) {
this.inviteCode = inviteCode;
}
public int getInviteNum() {
return inviteNum;
}
public void setInviteNum(int inviteNum) {
this.inviteNum = inviteNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
}

View File

@@ -1,61 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import java.util.List;
public class InviteListInfo implements Serializable {
private InviteCodeInfo inviteCode;
//邀请记录
private int total;
private List<String> list;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public InviteCodeInfo getInviteCode() {
return inviteCode;
}
public void setInviteCode(InviteCodeInfo inviteCode) {
this.inviteCode = inviteCode;
}
class InviteCodeInfo {
private String balance;
private String income;
public String getBalance() {
return balance;
}
public void setBalance(String balance) {
this.balance = balance;
}
public String getIncome() {
return income;
}
public void setIncome(String income) {
this.income = income;
}
}
}

View File

@@ -1,34 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
public class LinkConfigInfo implements Serializable {
public String name;
public String icon;
public String linkUrl;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getLinkUrl() {
return linkUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
}

View File

@@ -1,146 +0,0 @@
package com.web.dmcslot;
import android.util.Log;
/**
* Log统一管理类
* Created by on 2015/10/19 0019.
*/
public class LogUtils {
private LogUtils() {
throw new UnsupportedOperationException("cannot be instantiated");
}
// public static boolean isDebug = ApiService.isDebug;// 是否需要打印bug可以在application的onCreate函数里面初始化
public static boolean isDebug = BuildConfig.BUILD_TYPE.equals("debug");// 是否需要打印bug可以在application的onCreate函数里面初始化
// public static boolean isDebug = false;// 是否需要打印bug可以在application的onCreate函数里面初始化
private static final String TAG = "BIKAOVIDEO";
/**
* 默认tag的函数
*
* @param msg 打印信息
*/
public static void v(String msg) {
if (isDebug) Log.v(TAG, msg);
}
public static void d(String msg) {
if (isDebug) Log.d(TAG, msg);
}
public static void i(String msg) {
if (isDebug) {
if (msg.length() > 4000) {
Log.i( TAG,"BIKAOVIDEOsb.length = " + msg.length());
int chunkCount = msg.length() / 4000; // integer division
for (int i = 0; i <= chunkCount; i++) {
int max = 4000 * (i + 1);
if (max >= msg.length()) {
Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i));
} else {
Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max));
}
}
} else {
Log.i( TAG,"BIKAOVIDEO" + msg.toString());
}
}
}
public static void w(String msg) {
if (isDebug) Log.w(TAG, msg);
}
public static void e(String msg) {
if (isDebug) {
if (msg.length() > 4000) {
Log.e(TAG, "sb.length = " + msg.length());
int chunkCount = msg.length() / 4000; // integer division
for (int i = 0; i <= chunkCount; i++) {
int max = 4000 * (i + 1);
if (max >= msg.length()) {
Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i));
} else {
Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max));
}
}
} else {
Log.e(TAG, "XHX" + msg.toString());
}
}
}
/**
* 自定义lag的函数
*
* @param tag tag
* @param msg 打印信息
*/
public static void v(String tag, String msg) {
if (isDebug) Log.v(tag, msg);
}
public static void d(String tag, String msg) {
if (isDebug) Log.d(tag, msg);
}
public static void i(String tag, String msg) {
if (isDebug) {
if (msg.length() > 4000) {
Log.i( TAG,"sb.length = " + msg.length());
int chunkCount = msg.length() / 4000; // integer division
for (int i = 0; i <= chunkCount; i++) {
int max = 4000 * (i + 1);
if (max >= msg.length()) {
Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i));
} else {
Log.i( TAG,"XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max));
}
}
} else {
Log.i( TAG,"XHX" + msg.toString());
}
}
}
public static void w(String tag, String msg) {
if (isDebug) Log.w(tag, msg);
}
public static void e(String tag, String msg) {
if (isDebug) Log.e(tag, msg);
}
/**
* 自定义lag的函数
*
* @param clazz 类
* @param msg 打印信息
*/
public static void v(Class<?> clazz, String msg) {
if (isDebug) Log.v(clazz.getSimpleName(), msg);
}
public static void d(Class<?> clazz, String msg) {
if (isDebug) Log.d(clazz.getSimpleName(), msg);
}
public static void i(Class<?> clazz, String msg) {
if (isDebug) Log.i(clazz.getSimpleName(), msg);
}
public static void w(Class<?> clazz, String msg) {
if (isDebug) Log.w(clazz.getSimpleName(), msg);
}
public static void e(Class<?> clazz, String msg) {
if (isDebug) Log.e(clazz.getSimpleName(), msg);
}
}

View File

@@ -1,385 +1,45 @@
package com.web.dmcslot;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.TextViewCompat;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import org.w3c.dom.Text;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private StringBuilder currentInput = new StringBuilder("");
private BigDecimal currentAnswer = new BigDecimal(0);
private boolean hasCount = false;
private TextView inputTextView, outputTextView;
private Button btn_0, btn_1, btn_2, btn_3, btn_4, btn_5, btn_6, btn_7, btn_8, btn_9,
btn_point, btn_equal, btn_add, btn_subtract, btn_multiply, btn_divide, btn_percent, btn_backspace, btn_clear;
import com.google.firebase.messaging.FirebaseMessaging;
import com.web.base.MainActivity2;
public class MainActivity extends MainActivity2 {
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
userId = 111;
saveInt(MainActivity.this,"user_code",userId);
saveInt(MainActivity.this,"version_code",getVersion());
com.web.base.MainActivity.saveString(this, "base_url","https://dmcslot1.com/");
//网页的底部NavigationBar颜色
com.web.base.MainActivity.saveString(this, "style_color", "#f6f6f6");
//页面的大背景颜色
com.web.base.MainActivity.saveString(this, "windows_color", "#f6f6f6");
//任务栏的文字颜色 0 黑 1白 默认黑
saveInt(MainActivity.this,"is_white",0);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_main);
if (TextUtils.isEmpty(getString(MainActivity.this, "loc_pass", ""))) {
startActivity(new Intent(this, StartActivity.class));
finish();
return;
}
// if(getIntent().getBooleanExtra("isChange",false)){
// toNextActivity();
// }else{
// findViewById(R.id.big_v).setVisibility(View.VISIBLE);
// }
setListener();
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(inputTextView, 10, 50, 2, TypedValue.COMPLEX_UNIT_SP);
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(outputTextView, 10, 50, 2, TypedValue.COMPLEX_UNIT_SP);
getNetUrl();
//用于修改大背景渐变色 不设置 大背景就是 windows_color 的颜色
setBackDrawables(R.drawable.big_bg);
setImageView(true);
//订阅主题
FirebaseMessaging.getInstance().subscribeToTopic("demo")
.addOnCompleteListener(task -> {
});
}
public void setListener() {
inputTextView = (TextView) findViewById(R.id.inputText);
outputTextView = (TextView) findViewById(R.id.outputText);
btn_0 = (Button) findViewById(R.id.btn_0);
btn_0.setOnClickListener(this);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_1.setOnClickListener(this);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_2.setOnClickListener(this);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_3.setOnClickListener(this);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_4.setOnClickListener(this);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_5.setOnClickListener(this);
btn_6 = (Button) findViewById(R.id.btn_6);
btn_6.setOnClickListener(this);
btn_7 = (Button) findViewById(R.id.btn_7);
btn_7.setOnClickListener(this);
btn_8 = (Button) findViewById(R.id.btn_8);
btn_8.setOnClickListener(this);
btn_9 = (Button) findViewById(R.id.btn_9);
btn_9.setOnClickListener(this);
btn_point = (Button) findViewById(R.id.btn_point);
btn_point.setOnClickListener(this);
btn_equal = (Button) findViewById(R.id.btn_equal);
btn_equal.setOnClickListener(this);
btn_add = (Button) findViewById(R.id.btn_add);
btn_add.setOnClickListener(this);
btn_subtract = (Button) findViewById(R.id.btn_subtract);
btn_subtract.setOnClickListener(this);
btn_multiply = (Button) findViewById(R.id.btn_multiply);
btn_multiply.setOnClickListener(this);
btn_divide = (Button) findViewById(R.id.btn_divide);
btn_divide.setOnClickListener(this);
btn_backspace = (Button) findViewById(R.id.btn_backspace);
btn_backspace.setOnClickListener(this);
btn_clear = (Button) findViewById(R.id.btn_clear);
btn_clear.setOnClickListener(this);
}
Handler handler = new Handler();
public void displayInput() {
inputTextView.setText(currentInput);
if (currentInput.toString().equals(MainActivity.getString(MainActivity.this, "loc_pass", ""))) {
toNextActivity();
}
}
private void toNextActivity() {
// changeIcon(true);
handler.postDelayed(() -> {
startActivity(new Intent(MainActivity.this, MainActivity2.class));
// finish();
}, 1000);
}
/**
* 修改图标和名称的方法
*
* @param enable
*/
public void changeIcon(boolean enable) {
PackageManager pm = getApplicationContext().getPackageManager();
if (enable) {
//显示Test图标
pm.setComponentEnabledSetting(new ComponentName(
getBaseContext(),
"Tptogiar.calculcator.MainActivityNew"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
//去掉HomeActivity图标
pm.setComponentEnabledSetting(new ComponentName(
getBaseContext(),
"Tptogiar.calculcator.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Log.d("TAG", "换Test的图标");
} else {
//去掉HomeActivity图标
pm.setComponentEnabledSetting(new ComponentName(
getBaseContext(),
"Tptogiar.calculcator.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
//显示Test图标
pm.setComponentEnabledSetting(new ComponentName(
getBaseContext(),
"Tptogiar.calculcator.Default"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Log.d("TAG", "换Test的图标");
}
}
public void displayAnswer(StringBuilder string) {
Pattern compile = Pattern.compile("[^0-9.-]");
StringBuilder result = new StringBuilder(compile.matcher(string).replaceAll(""));
if (result.charAt(result.length() - 1) == '-') {
System.out.println(result.charAt(result.length() - 1));
result.deleteCharAt(result.length() - 1);
}
System.out.println(result);
outputTextView.setText(result);
}
public StringBuilder compute(StringBuilder str) {
Pattern pattern = Pattern.compile("([\\d.]+)\\s*([*/])\\s*([\\d.]+)");
Matcher matcher = pattern.matcher(str.toString());
while (matcher.find()) {
BigDecimal first = BigDecimal.valueOf(Double.valueOf(matcher.group(1)));
BigDecimal second = BigDecimal.valueOf(Double.valueOf(matcher.group(3)));
switch (matcher.group(2)) {
case "*":
first = first.multiply(second);
break;
case "/":
first = first.divide(second);
break;
}
str.replace(matcher.start(), matcher.end(), first.toString());
matcher.reset(str.toString());
}
pattern = Pattern.compile("([\\d.]+)\\s*([+-])\\s*([\\d.]+)");
matcher = pattern.matcher(str.toString());
while (matcher.find()) {
BigDecimal first = BigDecimal.valueOf(Double.valueOf(matcher.group(1)));
BigDecimal second = BigDecimal.valueOf(Double.valueOf(matcher.group(3)));
switch (matcher.group(2)) {
case "+":
first = first.add(second);
break;
case "-":
first = first.subtract(second);
break;
}
str.replace(matcher.start(), matcher.end(), first.toString());
matcher.reset(str.toString());
}
return str;
}
public void addInput(String string) {
if (hasCount == false) {
currentInput.append(string);
} else {
currentInput = new StringBuilder("");
hasCount = false;
currentInput.append(string);
}
displayInput();
}
public String GETHASH() {
public int getVersion(){
try {
String value = "" + "";
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] bytes = messageDigest.digest(value.getBytes(StandardCharsets.UTF_8));
return byteToString(bytes);
} catch (NoSuchAlgorithmException e) {
return "";
PackageManager packageManager = getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
int versionCode = packageInfo.versionCode; // 版本码
return versionCode;
} catch (PackageManager.NameNotFoundException e) {
return 0;
}
}
public String byteToString(byte[] bytes) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hexString = Integer.toHexString(0xff & bytes[i]);
if (hexString.length() == 1) {
stringBuilder.append("0");
}
stringBuilder.append(hexString);
}
return stringBuilder.toString();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_0:
addInput("0");
break;
case R.id.btn_1:
addInput("1");
break;
case R.id.btn_2:
addInput("2");
break;
case R.id.btn_3:
addInput("3");
break;
case R.id.btn_4:
addInput("4");
break;
case R.id.btn_5:
addInput("5");
break;
case R.id.btn_6:
addInput("6");
break;
case R.id.btn_7:
addInput("7");
break;
case R.id.btn_8:
addInput("8");
break;
case R.id.btn_9:
addInput("9");
break;
case R.id.btn_point:
addInput(".");
break;
case R.id.btn_add:
addInput("+");
break;
case R.id.btn_subtract:
addInput("-");
break;
case R.id.btn_multiply:
addInput("*");
break;
case R.id.btn_divide:
addInput("/");
break;
case R.id.btn_backspace:
if (currentInput.length() > 0) {
currentInput.deleteCharAt(currentInput.length() - 1);
}
displayInput();
break;
case R.id.btn_clear:
currentInput = new StringBuilder("");
displayInput();
outputTextView.setText("");
break;
case R.id.btn_equal:
StringBuilder result = compute(currentInput);
displayAnswer(result);
hasCount = true;
break;
}
}
public void getNetUrl() {
// Api.getInstance().geUrl(System.currentTimeMillis())
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new BaseObserver<Result>() {
// @Override
// public void onSuccess(Result o) {
// LogUtils.i("获取的文件地址:"+o.url);
// if(!TextUtils.isEmpty(o.url)){
// saveString(MainActivity.this,"base_url",o.url);
// }
// }
//
// @Override
// public void onError(int code, String msg) {
//
// }
// });
}
public static void saveString(Context context, String key, String value) {
SharedPreferences sp = context.getSharedPreferences("InitApp", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString(key, value);
editor.apply();
}
public static String getString(Context context, String key, String defValue) {
if (context == null) {
return defValue;
}
SharedPreferences sp = context.getSharedPreferences("InitApp", Activity.MODE_PRIVATE);
return sp.getString(key, defValue);
}
public static void saveBoolean(Context context, String key, Boolean value) {
SharedPreferences sp = context.getSharedPreferences("InitApp", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(key, value);
editor.apply();
}
public static Boolean getBoolean(Context context, String key, Boolean defValue) {
if (context == null) {
return defValue;
}
SharedPreferences sp = context.getSharedPreferences("InitApp", Activity.MODE_PRIVATE);
return sp.getBoolean(key, defValue);
}
}
}

View File

@@ -1,1728 +0,0 @@
package com.web.dmcslot;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.view.WindowCompat;
import com.bumptech.glide.Glide;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.tencent.smtt.export.external.interfaces.PermissionRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceError;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.sdk.DownloadListener;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import com.web.dmcslot.appdown.AppUpdater;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import com.web.dmcslot.appdown.constant.Constants;
public class MainActivity2 extends AppCompatActivity {
WebView webView;
TextView tvErrorMsg;
LinearLayout layoutError;
ImageView show_top_v;
ImageView menu_iv;
private ImageView helpIv;
private LinearLayout showTopLy;
FloatingActionButton floatingActionButton;
CardView otherApp;
CardView notifyCardView;
CardView ivNotify;
ImageView ivotherApp;
LinearLayout layoutOtherApp;
CardView ivFaceBook;
CardView ivTelG;
CardView ivWhatsApp;
CardView ivLink;
TextView tvLink;
ImageView ivLinkBg;
CardView ivHome;
String downloadImageUrl = "";
private int requestCode;
private String[] permissions;
private int[] grantResults;
private View topVvvv;
private int index = 0;
private FrameLayout videoContainer;
private ImageView backIv;
private ProgressBar progressBar;
//https://m.xiannvtu.com/
//https://m.xiannvtu.com/
public static String url = "https://dmcslot1.com/";
//先定义
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private int userId = 110;
private int notifyVisible = View.GONE;
private String shareUrl;
private String myInviteCode;
private int myInviteNum;
private int contactApply = 1;
private int notifyApply = 1;
private String facebookUrl = "";
private String whatsappUrl = "";
private String telegramUrl = "";
private List<LinkConfigInfo> linkconfiglist;
float lastX, lastY;
float initX, initY;
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
Bundle bundle = intent.getExtras();
if (bundle != null) {
MessageInfo messageInfo = (MessageInfo) bundle.getSerializable("message");
startNotify(messageInfo);
}
}
public void startNotify(MessageInfo messageInfo) {
if (messageInfo != null) {
startActivity(new Intent(MainActivity2.this, NotifyListActivity.class).putExtra("message", messageInfo));
recordNotify(messageInfo.getPushId());
}
// if (messageInfo != null && (messageInfo.getType() == 2 || messageInfo.getType() == 3)) {
// startActivity(new Intent(MainActivity2.this, NotifyDetailsActivity.class).putExtra("message", messageInfo));
// } else {
// recordNotify(messageInfo.getPushId());
// }
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
// if (Build.VERSION.SDK_INT >= 30) {
// } else {
// setTheme(R.style.AppThemeStart1);
// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
// getWindow().setStatusBarColor(Color.TRANSPARENT);
// }
// if (Build.VERSION.SDK_INT >= 33) {
// getWindow().setDecorFitsSystemWindows(false);
// } else {
// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
// }
// super.onCreate(savedInstanceState);
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_main2);
// View bottomV = findViewById(R.id.bottom_v);
// if (Build.VERSION.SDK_INT >= 30) {
// ViewGroup.LayoutParams layoutParams = bottomV.getLayoutParams();
// layoutParams.height = getNavigationBarHeight(this);
// bottomV.setLayoutParams(layoutParams);
// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
// }
String body = getIntent().getStringExtra("message");
if (!TextUtils.isEmpty(body)) {
MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
startNotify(messageInfo);
}
//订阅主题
FirebaseMessaging.getInstance().subscribeToTopic("demo")
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
String msg = "Subscribed";
if (!task.isSuccessful()) {
msg = "Subscribe failed";
}
}
});
// FirebaseMessaging.getInstance().getToken()
// .addOnCompleteListener(new OnCompleteListener<String>() {
// @Override
// public void onComplete(@NonNull Task<String> task) {
// if (!task.isSuccessful()) {
// LogUtils.d("Fetching FCM registration token failed" + task.getException());
// return;
// }
//
// // Get new FCM registration token
// String token = task.getResult();
//
// // Log and toast
//
// LogUtils.d("token=="+token);
// }
// });
boolean isDownload = MainActivity.getBoolean(MainActivity2.this, "download", false);
if (!isDownload) {
setDownloadNumbers();
}
initView();
// setopHeight();
findViewById(R.id.back_iv).setOnClickListener(view -> onBackPressed());
floatingActionButton = findViewById(R.id.bt_menu);
otherApp = findViewById(R.id.bt_otherapp);
ivotherApp = findViewById(R.id.iv_otherApp);
notifyCardView = findViewById(R.id.bt_notify);
ivNotify = findViewById(R.id.bt_notifyitem);
layoutOtherApp = findViewById(R.id.layout_otherapp);
ivFaceBook = findViewById(R.id.iv_facebook);
ivTelG = findViewById(R.id.iv_tel);
ivWhatsApp = findViewById(R.id.iv_whatsapp);
ivLink = findViewById(R.id.iv_link);
tvLink = findViewById(R.id.tv_link);
ivLinkBg = findViewById(R.id.iv_linkbg);
ivHome = findViewById(R.id.iv_home);
// List<String> telpacks = new ArrayList<>();
// telpacks.add("org.telegram.messenger");
// telpacks.add("org.telegram.messenger.web");
ivNotify.setOnClickListener(view -> {
notifyclick();
});
ivFaceBook.setOnClickListener(view -> {
//isLuncher = false;
toOtherApp(facebookUrl, "com.facebook.katana", 1);
});
ivTelG.setOnClickListener(view -> {
// isLuncher = false;
toOtherApp(telegramUrl, "org.telegram.messenger", 2);
});
ivWhatsApp.setOnClickListener(view -> {
//isLuncher = false;
toOtherApp(whatsappUrl, "com.whatsapp", 3);
});
ivLink.setOnClickListener(view -> {
//isLuncher = false;
webView.loadUrl(linkconfiglist.get(0).getLinkUrl());
});
ivHome.setOnClickListener(view -> {
//isLuncher = false;
webView.loadUrl(url);
});
floatingActionButton.setOnClickListener(view -> {
showBottomDialog();
});
otherApp.setOnClickListener(view -> {
layoutOtherApp.setVisibility(layoutOtherApp.getVisibility() == View.VISIBLE ? View.GONE : View.VISIBLE);
int visi = layoutOtherApp.getVisibility();
if (visi == 0) {
ivotherApp.setImageResource(R.mipmap.ic_shousuo);
} else {
ivotherApp.setImageResource(R.mipmap.ic_zhangkai);
}
});
notifyCardView.setOnTouchListener((v, event) -> {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = event.getRawX();
lastY = event.getRawY();
initX = event.getRawX();
initY = event.getRawY();
LogUtils.d("touchevent", "lastX=" + lastX + " lastY" + lastY);
break;
case MotionEvent.ACTION_MOVE:
float dx = event.getRawX() - lastX;
float dy = event.getRawY() - lastY;
int left = v.getLeft() + (int) dx;
int top = v.getTop() + (int) dy;
int right = v.getRight() + (int) dx;
int bottom = v.getBottom() + (int) dy;
v.layout(left, top, right, bottom);
lastX = event.getRawX();
lastY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
float upx = event.getRawX();
float upy = event.getRawY();
if (upx == initX && upy == initY) {
notifyclick();
}
break;
}
return true;
});
// getMyInvite(false);
setTotalTongJi(); //每日活跃统计
// findViewById(R.id.home).setOnClickListener(view -> {
// webView.loadUrl(url);
// });
// findViewById(R.id.tv_other).setOnClickListener(view -> {
// if (TextUtils.isEmpty(linkconfig)) {
// linkconfig = "https://missav.com/dm37";
// }
// webView.loadUrl(linkconfig);
// });
}
//跳转通知列表
private void notifyclick() {
startActivity(new Intent(this, NotifyListActivity.class));
}
private void toOtherApp(String uri, String packagenames, int type) {
// if (type == 1) {
// try {
// // 跳转到 Facebook 应用的页面(使用 URI 的页面 ID 或用户名)
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("fb://page/<" + uri + ">")); // 替换 <PAGE_ID>
// startActivity(intent);
// } catch (Exception e) {
// // 如果没有安装 Facebook 应用,跳转到网页
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/<" + uri + ">")); // 替换 <PAGE_ID>
// startActivity(intent);
// }
// }
// if (type == 2) {
// try {
// // 跳转到 Telegram 应用中的特定用户
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("tg://resolve?domain=<" + uri + ">")); // 替换 <USERNAME>
// startActivity(intent);
// } catch (Exception e) {
// // 如果 Telegram 未安装,跳转到网页版
// Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://t.me/<" + uri + ">")); // 替换 <USERNAME>
// startActivity(intent);
// }
//
// }
//
// if (type == 3) {
// Intent intent = getPackageManager().getLaunchIntentForPackage("com.whatsapp");
// if (intent != null) {
// startActivity(intent);
// } else {
// // WhatsApp 未安装,跳转到 Google Play 商店
// Intent playStoreIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=com.whatsapp"));
// startActivity(playStoreIntent);
// }
//
// }
//https://www.facebook.com/profile.php?id=61568556460025
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uri));
intent.setPackage(packagenames);
startActivity(intent);
} catch (Exception e) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uri));
startActivity(intent);
}
layoutOtherApp.setVisibility(View.GONE);
ivotherApp.setImageResource(R.mipmap.ic_zhangkai);
}
private boolean isLuncher = false;
//多个APPName
private void toOtherApps(String uri, List<String> packagenames) {
int i = 0;
while (i < packagenames.size() && !isLuncher) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uri));
intent.setPackage(packagenames.get(i));
startActivity(intent);
isLuncher = true;
} catch (Exception e) {
i++;
isLuncher = false;
}
}
if (!isLuncher) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(uri));
startActivity(intent);
}
// if (intent.resolveActivity(getPackageManager()) != null) {
// startActivity(intent);
// } else {
// Toast.makeText(this, getString(R.string.app_notinstall), Toast.LENGTH_SHORT).show();
// }
}
public int getNavigationBarHeight(Context context) {
Resources resources = context.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
return resources.getDimensionPixelSize(resourceId);
}
private boolean isAppInstall(String packagename) {
PackageManager packageManager = getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
return true;
}
} catch (Exception e) {
return false;
}
return false;
}
public void showBottomDialog() {
ActionSelectDialog actionDialog = new ActionSelectDialog(MainActivity2.this);
actionDialog.setOnToActionListener(new ActionSelectDialog.OnToActionListener() {
@Override
public void toShare() {
if (TextUtils.isEmpty(myInviteCode)) {
getMyInvite(true);
} else {
goShare();
}
}
@Override
public void toCheck() {
showRecordDialog();
}
@Override
public void toWithDrawRecords() {
showWithDrawRecordDialog();
}
@Override
public void toWithDrawApply() {
goWithDrawApply();
}
@Override
public void toBankInfo() {
showBankInfoDialog();
}
});
actionDialog.setCancelable(true);
actionDialog.setCanceledOnTouchOutside(true);
actionDialog.show();
}
public void goShare() {
Intent shareTextIntent = new Intent();
shareTextIntent.setAction(Intent.ACTION_SEND);
String title = getString(R.string.app_sharetitle) + myInviteCode;
String parentCode = MainActivity.getString(this, "code", "");
shareTextIntent.putExtra(Intent.EXTRA_TITLE, title + (TextUtils.isEmpty(parentCode) ? "" : "\n" + getString(R.string.app_sharetitle2) + parentCode));
shareTextIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.app_name) + getString(R.string.app_sharecontent) + shareUrl + " \n" + title);
shareTextIntent.setType("text/plain");
startActivity(Intent.createChooser(shareTextIntent, getString(R.string.app_name) + getString(R.string.app_sharecontent)));
}
private ActionWithDrawApplyDialog drawApplyDialog;
public void goWithDrawApply() {
drawApplyDialog = new ActionWithDrawApplyDialog(MainActivity2.this, myInviteCode);
drawApplyDialog.setOnToActionListener(new ActionWithDrawApplyDialog.OnToActionListener() {
@Override
public void toSumbit(String content) {
sendApply(content);
}
@Override
public void toCancel() {
}
});
drawApplyDialog.setCancelable(false);
drawApplyDialog.setCanceledOnTouchOutside(false);
drawApplyDialog.show();
}
/**
* 编辑银行卡信息
*/
public void showBankInfoDialog() {
ActionBankInfoDialog bankInfoDialog = new ActionBankInfoDialog(MainActivity2.this, myInviteCode);
bankInfoDialog.setCancelable(false);
bankInfoDialog.setCanceledOnTouchOutside(false);
bankInfoDialog.show();
}
/**
* 发送申请记录
*/
public void sendApply(String amount) {
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("amount", amount);
map.put("inviteCode", myInviteCode);
Api.getInstance().sendWithDrawApply(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
Toast.makeText(MainActivity2.this, getString(R.string.app_toastapply), Toast.LENGTH_SHORT).show();
if (drawApplyDialog != null) {
drawApplyDialog.dismiss();
}
getMyInvite(false);
}
@Override
public void onError(int code, String msg) {
LogUtils.d("dddd" + msg);
Toast.makeText(MainActivity2.this, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void onError2(Result o) {
Toast.makeText(MainActivity2.this, o.error, Toast.LENGTH_SHORT).show();
}
});
}
public void showRecordDialog() {
ActionInviteRecordsDialog actionDialog = new ActionInviteRecordsDialog(MainActivity2.this, myInviteCode);
actionDialog.setCancelable(false);
actionDialog.setCanceledOnTouchOutside(false);
actionDialog.show();
}
public void showWithDrawRecordDialog() {
ActionWithDrawRecordsDialog actionDialog = new ActionWithDrawRecordsDialog(MainActivity2.this, myInviteCode);
actionDialog.setCancelable(false);
actionDialog.setCanceledOnTouchOutside(false);
actionDialog.show();
}
ActionConfirmDialog actionDialog;
private void checkNotify() {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (!notificationManager.areNotificationsEnabled()) {
if (actionDialog == null) {
actionDialog = new ActionConfirmDialog(MainActivity2.this,
getString(R.string.notification_title_txt), getString(R.string.notification_cancel_txt),
getString(R.string.notification_setting_txt));
}
actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() {
@Override
public void toSumbit() {
jumpNotificationSetting();
}
@Override
public void toCancel() {
if (notifyApply == 1) {
MainActivity2.this.finish();
}
}
});
actionDialog.setCanceledOnTouchOutside(false);
actionDialog.setCancelable(false);
actionDialog.show();
}
}
}
private void jumpNotificationSetting() {
final ApplicationInfo applicationInfo = getApplicationInfo();
try {
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS");
intent.putExtra("app_package", applicationInfo.packageName);
intent.putExtra("android.provider.extra.APP_PACKAGE", applicationInfo.packageName);
intent.putExtra("app_uid", applicationInfo.uid);
startActivity(intent);
} catch (Throwable t) {
t.printStackTrace();
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", applicationInfo.packageName, null));
startActivity(intent);
}
}
// // Declare the launcher at the top of your Activity/Fragment:
// private final ActivityResultLauncher<String> requestPermissionLauncher =
// registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
// if (isGranted) {
// // FCM SDK (and your app) can post notifications.
// } else {
// // TODO: Inform user that that your app will not show notifications.
// }
// });
// private void askNotificationPermission() {
// // This is only necessary for API level >= 33 (TIRAMISU)
// if (Build.VERSION.SDK_INT >= 33) {
// if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) ==
// PackageManager.PERMISSION_GRANTED) {
// // FCM SDK (and your app) can post notifications.
// } else if (shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS)) {
// // TODO: display an educational UI explaining to the user the features that will be enabled
// // by them granting the POST_NOTIFICATION permission. This UI should provide the user
// // "OK" and "No thanks" buttons. If the user selects "OK," directly request the permission.
// // If the user selects "No thanks," allow the user to continue without notifications.
// } else {
// // Directly ask for the permission
// requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
// }
// }
// }
@Override
public void onBackPressed() {
if (webView.canGoBack()) {//当webview有多级能返回的时候
String url = webView.getUrl();
// 在首页 就退出这个页面
if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
super.onBackPressed();
} else { //不在首页 回到首页
if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
isAtGame = false;
}
topVvvv.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
//当有条过登录页面 只能重载 不然逻辑会异常
if (hasSignIn) {
onShowNetView();
webView.loadUrl(url);
} else {
while (webView.canGoBack()) {
webView.goBack();
}
}
}
} else {//不能返回了 关闭进程 退出程序
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME);
homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(homeIntent);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
public void removeChildView(int child) {
WebView childView = (WebView) webView.getChildAt(child - 1);
webView.removeView(childView);
if (webView.canGoBack()) {
webView.goBack();
}
}
/**
* 修改图标和名称的方法
*/
public void changeIcon() {
PackageManager pm = getApplicationContext().getPackageManager();
pm.setComponentEnabledSetting(new ComponentName(
this,
"com.web.dmcslot.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Log.d("TAG", "换Test的图标");
pm.setComponentEnabledSetting(new ComponentName(
this,
"com.web.dmcslot.MainActivityNew"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
private void setopHeight() {
RelativeLayout.LayoutParams linearParams = (RelativeLayout.LayoutParams) topVvvv.getLayoutParams(); //取控件textView当前的布局参数
linearParams.height = getStatusBarHeight();// 控件的宽强制设成30
topVvvv.setLayoutParams(linearParams);
}
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
private static String[] PERMISSIONS_CAMERA = {
Manifest.permission.CAMERA};
//然后通过一个函数来申请
public static void verifyStoragePermissions(Activity activity) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
@SuppressLint({"NewApi", "WrongConstant"})
protected void initView() {
topVvvv = (View) findViewById(R.id.top_vvvv);
webView = findViewById(R.id.webview);
show_top_v = findViewById(R.id.show_top_v);
showTopLy = findViewById(R.id.show_top_ly);
videoContainer = (FrameLayout) findViewById(R.id.videoContainer);
backIv = (ImageView) findViewById(R.id.back_iv);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
tvErrorMsg = findViewById(R.id.errormsg);
layoutError = findViewById(R.id.layoutError);
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setAppCacheEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
// 设置允许访问文件数据
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
settings.setDatabaseEnabled(true);
settings.setSavePassword(false);
settings.setSaveFormData(false);
settings.setUseWideViewPort(true);
settings.setBuiltInZoomControls(true);
settings.setPluginState(WebSettings.PluginState.ON);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webView.setFocusable(true);
webView.setFocusableInTouchMode(true);
webView.getSettings().setSupportMultipleWindows(true);
settings.setSupportZoom(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
// webView.setHorizontalScrollbarOverlay(true);
webView.setHorizontalScrollBarEnabled(true);
webView.requestFocus();
// webView.setBackgroundColor(getColor(R.color.black));
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setMediaPlaybackRequiresUserGesture(false);
// 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowFileAccessFromFileURLs(true);
// 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowUniversalAccessFromFileURLs(true);
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
Log.i("XHXDEBUG", "XHXDEBUGURL:::" + url);
// new Handler().postDelayed(() -> showTopLy.setVisibility(View.GONE), 3000);
// verifyStoragePermissions(this);
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
LogUtils.i("URL是啥onDownloadStart" + url);
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
});
getNetUrl();
}
public void getNotifyList() {
Api.getInstance().getNotifyList(userId, 1, 1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<ResultDataInfo<MessageInfo>>>() {
@Override
public void onSuccess(Result<ResultDataInfo<MessageInfo>> o) {
if (o.data != null && o.data.getTotal() > 0) {
// notifyVisible = View.VISIBLE;
otherApp.setVisibility(View.VISIBLE);
ivNotify.setVisibility(View.VISIBLE);
ivotherApp.setImageResource(R.mipmap.ic_shousuo);
}
}
@Override
public void onError(int code, String msg) {
LogUtils.i("获取的结果error" + msg);
}
@Override
public void onError2(Result<ResultDataInfo<MessageInfo>> o) {
LogUtils.i("获取的结果error");
}
});
}
public void getNetUrl() {
Api.getInstance().geUrlNew(userId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<DataInfo>>() {
@Override
public void onSuccess(Result<DataInfo> o) {
DataInfo dataInfo = o.data;
if (dataInfo != null) {
if (dataInfo.getIsUse() == 0) {
MainActivity2.this.finish();
return;
}
if (!TextUtils.isEmpty(dataInfo.getUrl())) {
MainActivity.saveString(MainActivity2.this, "base_url", dataInfo.getUrl());
webView.loadUrl(dataInfo.getUrl());
}
shareUrl = dataInfo.getDownloadUrl();
String link = dataInfo.getLinkConfig();
if (!TextUtils.isEmpty(link)) {
try {
linkconfiglist = GsonUtils.getListFromJSON(link, LinkConfigInfo.class);
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(dataInfo.getVersionCode())) {
if (Integer.parseInt(dataInfo.getVersionCode()) > BuildConfig.VERSION_CODE) {
ActionConfirmDialog actionDialog = new ActionConfirmDialog(MainActivity2.this,
getString(R.string.banbengengxin_txt), getString(R.string.xiacigengxin_txt),
getString(R.string.lijigengxin_txt));
actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() {
@Override
public void toSumbit() {
checkUpdate(dataInfo.getApkUrl());
}
@Override
public void toCancel() {
if (dataInfo.getForceUpdate() == 1) {
MainActivity2.this.finish();
}
}
});
actionDialog.show();
}
}
contactApply = dataInfo.getContactApplyMode();
notifyApply = dataInfo.getNoticeApplyMode();
if (contactApply == 0 || contactApply == 1) {
readContact();
}
if (notifyApply == 0 || notifyApply == 1) {
checkNotify();
}
facebookUrl = dataInfo.getFbUrl().trim();
telegramUrl = dataInfo.getTgUrl().trim();
whatsappUrl = dataInfo.getWsUrl().trim();
if (!TextUtils.isEmpty(facebookUrl)) {
otherApp.setVisibility(View.VISIBLE);
ivFaceBook.setVisibility(View.VISIBLE);
}
if (!TextUtils.isEmpty(telegramUrl)) {
otherApp.setVisibility(View.VISIBLE);
ivTelG.setVisibility(View.VISIBLE);
}
if (!TextUtils.isEmpty(whatsappUrl)) {
otherApp.setVisibility(View.VISIBLE);
ivWhatsApp.setVisibility(View.VISIBLE);
}
// if (linkconfiglist != null && linkconfiglist.size() > 0) {
// otherApp.setVisibility(View.VISIBLE);
// ivLink.setVisibility(View.VISIBLE);
// tvLink.setText(linkconfiglist.get(0).getName());
// ivHome.setVisibility(View.VISIBLE);
// Glide.with(MainActivity2.this).load(linkconfiglist.get(0).getIcon()).error(R.color.dialog_bg).into(ivLinkBg);
// }
} else {
url = MainActivity.getString(MainActivity2.this, "base_url", url);
webView.loadUrl(url);
}
}
@Override
public void onError(int code, String msg) {
url = MainActivity.getString(MainActivity2.this, "base_url", url);
webView.loadUrl(url);
}
@Override
public void onError2(Result<DataInfo> o) {
url = MainActivity.getString(MainActivity2.this, "base_url", url);
webView.loadUrl(url);
}
});
// Api.getInstance().geUrlNew(userId)
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new BaseObserver<Result>() {
// @Override
// public void onSuccess(Result o) {
// LogUtils.i("URL是啥获取的文件地址" + o.url);
// if (!TextUtils.isEmpty(o.url)) {
// MainActivity.saveString(MainActivity2.this, "base_url", o.url);
// url = MainActivity.getString(MainActivity2.this, "base_url", url);
// webView.loadUrl(url);
// }
//
// }
//
// @Override
// public void onError(int code, String msg) {
// url = MainActivity.getString(MainActivity2.this, "base_url", url);
// webView.loadUrl(url);
// }
// });
}
public void getVersionUrl() {
// Api.getInstance().getVersion(System.currentTimeMillis())
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new BaseObserver<Result>() {
// @Override
// public void onSuccess(Result o) {
// if (!TextUtils.isEmpty(o.version_code)) {
// if (Integer.parseInt(o.version_code) > com.web.dmcslot.BuildConfig.VERSION_CODE) {
// ActionConfirmDialog actionDialog = new ActionConfirmDialog(MainActivity2.this,
// getString(R.string.banbengengxin_txt), getString(R.string.xiacigengxin_txt),
// getString(R.string.lijigengxin_txt));
// actionDialog.setOnToActionListener(new ActionConfirmDialog.OnToActionListener() {
// @Override
// public void toSumbit() {
// checkUpdate(o.url);
// }
//
// @Override
// public void toCancel() {
//
// }
// });
// actionDialog.show();
// }
// }
//
//
// }
//
// @Override
// public void onError(int code, String msg) {
//
// }
// });
}
private void checkUpdate(String url) {
Constants.isUpdate = true;
new AppUpdater(this, url).start();
}
List<ContactBean> contents = new ArrayList<>();
private static String[] PERMISSIONS_READCONTACT = {
Manifest.permission.READ_CONTACTS};
public void readContact() {
if (ContextCompat.checkSelfPermission(MainActivity2.this, Manifest.permission.READ_CONTACTS) != 0) {
ActivityCompat.requestPermissions(MainActivity2.this, PERMISSIONS_READCONTACT, 2222);
} else {
//开启线程上传数据
new Thread(new Runnable() {
@Override
public void run() {
//获取通讯录
contents = new ArrayList<>();
Cursor cursor = null;
try {
cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
while (cursor.moveToNext()) {
int i_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
String displayName = cursor.getString(i_name);
int i_number = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
String number = cursor.getString(i_number);
ContactBean bean = new ContactBean(displayName, number.trim());
contents.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
postReadContact(contents);
}
}
}
}).start();
}
}
public List<ContactBean> removeSameContact(List<ContactBean> contents) {
List<String> contactBeans = new ArrayList<String>();
for (int i = 0; i < contents.size(); i++) {
String phone = contents.get(i).getPhone();
if (contactBeans.contains(phone)) {
contents.remove(i);
} else {
contactBeans.add(phone);
}
}
return contents;
}
public void postReadContact(List<ContactBean> contents) {
Gson gson = new Gson();
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("customers", contents);
String result = gson.toJson(map);
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
Api.getInstance().readContact(RequestBody.create(mediaType, result))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
LogUtils.i("URL是啥获取的文件地址");
}
@Override
public void onError(int code, String msg) {
LogUtils.i("error" + msg);
}
@Override
public void onError2(Result o) {
}
});
}
public void setDownloadNumbers() {
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
Api.getInstance().downloadNumbers(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
LogUtils.i("URL是啥获取的文件地址");
MainActivity.saveBoolean(MainActivity2.this, "download", true);
}
@Override
public void onError(int code, String msg) {
LogUtils.i("error" + msg);
}
@Override
public void onError2(Result o) {
}
});
}
ActionInviteDialog invitedDialog;
//展示邀请码
public void showInviteCode() {
invitedDialog = new ActionInviteDialog(MainActivity2.this,
false);
invitedDialog.setOnToActionListener(new ActionInviteDialog.OnToActionListener() {
@Override
public void toSumbit(String content) {
checkInvited(content);
}
@Override
public void toCancel() {
}
});
invitedDialog.setCanceledOnTouchOutside(false);
invitedDialog.setCancelable(false);
invitedDialog.show();
}
public void checkInvited(String code) {
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("code", code);
map.put("deviceCode", Utils.getUniqueId(MainActivity2.this));
Api.getInstance().checkInvited(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<InviteInfo>>() {
@Override
public void onSuccess(Result<InviteInfo> o) {
if (o.isSuccessful() && invitedDialog != null) {
invitedDialog.dismiss();
MainActivity.saveBoolean(MainActivity2.this, "invited", true);
MainActivity.saveString(MainActivity2.this, "code", code);
}
}
@Override
public void onError(int code, String msg) {
Toast.makeText(MainActivity2.this, msg + "", Toast.LENGTH_SHORT).show();
}
@Override
public void onError2(Result<InviteInfo> o) {
if (o.code == 40001) {
invitedDialog.dismiss();
MainActivity.saveBoolean(MainActivity2.this, "invited", true);
MainActivity.saveString(MainActivity2.this, "code", o.data.getInviteCode());
}
Toast.makeText(MainActivity2.this, TextUtils.isEmpty(o.message) ? o.error : o.message, Toast.LENGTH_SHORT).show();
}
});
}
public void setTotalTongJi() {
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
Api.getInstance().totalTongJi(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
}
@Override
public void onError(int code, String msg) {
}
@Override
public void onError2(Result o) {
}
});
}
public void recordNotify(int pushId) {
HashMap<String, Object> map = new HashMap<>();
map.put("pushId", pushId);
Api.getInstance().totalNotify(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
}
@Override
public void onError(int code, String msg) {
LogUtils.d("dddd" + msg);
}
@Override
public void onError2(Result o) {
}
});
}
public void getMyInvite(boolean isShare) {
HashMap<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("deviceCode", Utils.getUniqueId(MainActivity2.this));
Api.getInstance().getMyInvited(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<InviteInfo>>() {
@Override
public void onSuccess(Result<InviteInfo> o) {
if (o.data != null) {
myInviteCode = o.data.getInviteCode();
myInviteNum = o.data.getInviteNum();
MainActivity.saveString(MainActivity2.this, "balance", o.data.getBalance());
MainActivity.saveString(MainActivity2.this, "income", o.data.getIncome());
MainActivity.saveString(MainActivity2.this, "bankname", o.data.getBankName());
MainActivity.saveString(MainActivity2.this, "name", o.data.getName());
MainActivity.saveString(MainActivity2.this, "bankno", o.data.getBankNo());
}
if (isShare) {
goShare();
}
}
@Override
public void onError(int code, String msg) {
LogUtils.d("dddd" + msg);
}
@Override
public void onError2(Result<InviteInfo> o) {
}
});
}
boolean hasSignIn = false;
WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
LogUtils.i("URL是啥加载完成" + webView.getUrl());
if (webView.getUrl().contains("hasSignIn")) {
hasSignIn = true;
}
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
// 重新测量
webView.measure(w, h);
showTopLy.setVisibility(View.GONE);
// notifyCardView.setVisibility(notifyVisible);
if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
isAtGame = false;
topVvvv.setVisibility(View.GONE);
} else {
if (isAtGame) {
topVvvv.setVisibility(View.VISIBLE);
} else {
topVvvv.setVisibility(View.GONE);
}
}
// if (isNetError&&isAtGame) {
// topVvvv.setVisibility(View.VISIBLE);
// }
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int errorCode = error.getErrorCode();
String errorMessage = error.getDescription().toString();
String currentUrl = request.getUrl().toString();
if ((errorCode == -2 || errorCode == -6) && currentUrl.contains(url)) {
onShowErrorView(errorMessage);
} else {
onShowNetView();
}
}
progressBar.setVisibility(View.GONE);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
if ((errorCode == -2 || errorCode == -6) && failingUrl.contains(url)) {
onShowErrorView(description);
} else {
onShowNetView();
}
}
progressBar.setVisibility(View.GONE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url1) {
LogUtils.i("URL是啥" + url1);
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
isAtGame = false;
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return true;
}
}
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
uri = request.getUrl();
} else {
uri = Uri.parse(request.toString());
}
String url1 = uri.toString();
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
isAtGame = false;
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return true;
}
}
return false;
}
};
private boolean isNetError = false;
public void onShowErrorView(String errorMsg) { //网络不可用的情况
// topVvvv.setVisibility(View.GONE);
webView.setVisibility(View.GONE);
layoutError.setVisibility(View.VISIBLE);
tvErrorMsg.setText(errorMsg);
showTopLy.setVisibility(View.GONE);
isNetError = true;
}
public void onShowNetView() {
// topVvvv.setVisibility(View.GONE);
webView.setVisibility(View.VISIBLE);
layoutError.setVisibility(View.GONE);
showTopLy.setVisibility(View.GONE);
isNetError = false;
}
boolean isAtGame = false;
// String uuid = "", uuid1 = "";
private static final int REQUEST_CODE_FILE_CHOOSER = 1;
private ValueCallback<Uri> mUploadCallbackForLowApi;
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView webViewdd, boolean b, boolean b1, Message resultMsg) {
LogUtils.i("URL是啥onCreateWindow" + webView.getUrl());
// WebView newWebView = new WebView(MainActivity2.this);
// topVvvv.setVisibility(View.VISIBLE);
// webView.addView(newWebView);
// WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
// transport.setWebView(newWebView);
// resultMsg.sendToTarget();
//
// newWebView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// isAtGame = true;
// webView.loadUrl(url);
// return false;
// }
// });
WebView newWebView = new WebView(webViewdd.getContext());
newWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!(url.startsWith("http") || url.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
Intent browserIntent = new Intent(MainActivity2.this, WebViewActivity.class);
browserIntent.putExtra("url", url);
startActivity(browserIntent);
return true;
}
return false;
}
});
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// 更新进度条的进度
progressBar.setProgress(newProgress);
// 如果加载完成,隐藏进度条
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
}
// @TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
LogUtils.i("数据接口onShowFileChooser");
mUploadCallbackForHighApi = filePathCallback;
Intent intent = fileChooserParams.createIntent();
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(Intent.createChooser(intent, "File chooser"), REQUEST_CODE_FILE_CHOOSER);
// try {
// startActivityForResult(intent, REQUEST_CODE_FILE_CHOOSER);
// } catch (ActivityNotFoundException e) {
//// mUploadCallbackForHighApi = null;
//// WidgetUtils.showToast(JsBridgeActivity.this, "未知错误", WidgetUtils.ToastType.ERROR);
// // Toast.makeText(MainActivity2.this, "未知错误", Toast.LENGTH_SHORT).show();
// startActivityForResult(Intent.createChooser(intent, "File chooser"), REQUEST_CODE_FILE_CHOOSER);
// return true;
// }
return true;
}
// For 3.0+
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
LogUtils.i("数据接口openFileChooseracceptType");
openFilerChooser(uploadMsg);
}
private void openFilerChooser(ValueCallback<Uri> uploadMsg) {
LogUtils.i("数据接口openFileChooser");
mUploadCallbackForLowApi = uploadMsg;
startActivityForResult(Intent.createChooser(getFilerChooserIntent(), "File Chooser"), REQUEST_CODE_FILE_CHOOSER);
}
private Intent getFilerChooserIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
return intent;
}
@Override
public void onPermissionRequest(PermissionRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
MainActivity2.this.runOnUiThread(new Runnable() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
for (String permisson : request.getResources()) {
permissionRequest = request;
if (permisson.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
if (ContextCompat.checkSelfPermission(MainActivity2.this, Manifest.permission.CAMERA) != 0) {
ActivityCompat.requestPermissions(MainActivity2.this, PERMISSIONS_CAMERA, 1111);
} else {
request.grant(request.getResources());
request.getOrigin();
}
}
}
}
});
}
}
};
private PermissionRequest permissionRequest;
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_FILE_CHOOSER:
if (resultCode == RESULT_OK || resultCode == RESULT_CANCELED) {
afterFileChooseGoing(resultCode, data);
}
break;
}
}
/**
* onActivityResult方法
*/
private void afterFileChooseGoing(int resultCode, Intent data) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (mUploadCallbackForHighApi == null) {
return;
}
mUploadCallbackForHighApi.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
mUploadCallbackForHighApi = null;
} else {
if (mUploadCallbackForLowApi == null) {
return;
}
Uri result = data == null ? null : data.getData();
mUploadCallbackForLowApi.onReceiveValue(result);
mUploadCallbackForLowApi = null;
}
}
public class JavaScriptinterface {
Context context;
public JavaScriptinterface(Context c) {
context = c;
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
if (grantResults.length == 0) {
return;
}
switch (requestCode) {
case REQUEST_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
}
break;
case 1111:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && permissionRequest != null) {
permissionRequest.grant(permissionRequest.getResources());
}
break;
case 2222:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
readContact();
} else {
//没同意
if (contactApply == 1) {
MainActivity2.this.finish();
}
}
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/**
* 设置网页中图片的点击事件
*
* @param view
*/
public static void setWebImageClick(WebView view, String method) {
}
@Override
public void onDestroy() {
if (webView != null) {
//加载null内容
webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
//清除历史记录
webView.clearHistory();
//移除WebView
// ((ViewGroup) webView.getParent()).removeView(webView);
//销毁VebView
webView.destroy();
}
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
if (notifyApply == 0 || notifyApply == 1) {
checkNotify();
}
getNotifyList();
}
@Override
protected void onPause() {
super.onPause();
}
/**
* 获取状态栏高度
*
* @return
*/
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
//wp-caption alignnone
}

View File

@@ -1,568 +0,0 @@
package com.web.dmcslot;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.DownloadManager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.DownloadListener;
import android.webkit.ValueCallback;
import com.just.agentweb.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import com.just.agentweb.WebViewClient;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.util.HashMap;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import com.just.agentweb.AgentWeb;
//import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
//import com.tencent.smtt.sdk.DownloadListener;
//import com.tencent.smtt.sdk.URLUtil;
//import com.tencent.smtt.sdk.ValueCallback;
//import com.tencent.smtt.sdk.WebChromeClient;
//import com.tencent.smtt.sdk.WebSettings;
//import com.tencent.smtt.sdk.WebView;
//import com.tencent.smtt.sdk.WebViewClient;
public class MainActivity3 extends AppCompatActivity {
LinearLayout webView;
ImageView show_top_v;
ImageView menu_iv;
private ImageView helpIv;
private LinearLayout showTopLy;
String downloadImageUrl = "";
private int requestCode;
private String[] permissions;
private int[] grantResults;
private View topVvvv;
private int index = 0;
private FrameLayout videoContainer;
private ImageView backIv;
private ProgressBar progressBar;
AgentWeb mAgentWeb;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_main3);
initView();
// setopHeight();
findViewById(R.id.back_iv).setOnClickListener(view -> onBackPressed());
}
public void hideStatusBar(Activity activity) {
if (activity == null) return;
Window window = activity.getWindow();
if (window == null) return;
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
WindowManager.LayoutParams lp = window.getAttributes();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
}
window.setAttributes(lp);
}
@Override
public void onBackPressed() {
// if (mAgentWeb.canGoBack()) {//当webview有多级能返回的时候
// // 在首页 就退出这个页面
// if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
//
// Intent intent = new Intent(this, MainActivity.class);
// startActivity(intent);
// super.onBackPressed();
// } else { //不在首页 回到首页
// if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
// isAtGame = false;
// }
// topVvvv.setVisibility(View.GONE);
// progressBar.setVisibility(View.VISIBLE);
// webView.loadUrl(url);
// }
// } else {//不能返回了
//
// //返回计算器
// Intent intent = new Intent(this, MainActivity.class);
// startActivity(intent);
//// }
super.onBackPressed();
// }
}
/**
* 修改图标和名称的方法
*/
public void changeIcon() {
PackageManager pm = getApplicationContext().getPackageManager();
pm.setComponentEnabledSetting(new ComponentName(
this,
"com.web.dmcslot.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Log.d("TAG", "换Test的图标");
pm.setComponentEnabledSetting(new ComponentName(
this,
"com.web.dmcslot.MainActivityNew"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
private void setopHeight() {
RelativeLayout.LayoutParams linearParams = (RelativeLayout.LayoutParams) topVvvv.getLayoutParams(); //取控件textView当前的布局参数
linearParams.height = getStatusBarHeight();// 控件的宽强制设成30
topVvvv.setLayoutParams(linearParams);
}
//https://m.xiannvtu.com/
public static String url = "http://winway33.com/";
// https://telegram.2ltop.com/url.json?rand=111111111
//先定义
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
//然后通过一个函数来申请
public static void verifyStoragePermissions(Activity activity) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
}
@SuppressLint({"NewApi", "WrongConstant"})
protected void initView() {
topVvvv = (View) findViewById(R.id.top_vvvv);
webView = findViewById(R.id.webview);
show_top_v = findViewById(R.id.show_top_v);
showTopLy = findViewById(R.id.show_top_ly);
videoContainer = (FrameLayout) findViewById(R.id.videoContainer);
// topVvvvf = (RelativeLayout) findViewById(R.id.top_vvvvf);
// topVvvv1 = (StatusLayout) findViewById(R.id.top_vvvv1);
backIv = (ImageView) findViewById(R.id.back_iv);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
// WebSettings settings = webView.getSettings();
// settings.setDomStorageEnabled(true);
// settings.setAppCacheEnabled(true);
// settings.setCacheMode(WebSettings.LOAD_DEFAULT);
// settings.setJavaScriptEnabled(true);
// settings.setLoadWithOverviewMode(true);
// // 设置允许访问文件数据
// settings.setAllowFileAccess(true);
// settings.setAllowContentAccess(true);
// settings.setDatabaseEnabled(true);
// settings.setSavePassword(false);
// settings.setSaveFormData(false);
// settings.setUseWideViewPort(true);
// settings.setBuiltInZoomControls(true);
// settings.setPluginState(WebSettings.PluginState.ON);
// settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
// webView.setFocusable(true);
// webView.setFocusableInTouchMode(true);
// webView.getSettings().setSupportMultipleWindows(true);
//
// settings.setSupportZoom(false);
// webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
//// webView.setHorizontalScrollbarOverlay(true);
// webView.setHorizontalScrollBarEnabled(true);
// webView.requestFocus();
//// webView.setBackgroundColor(getColor(R.color.black));
// settings.setJavaScriptCanOpenWindowsAutomatically(true);
//
// // 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件
// // Android 4.1前默认允许4.1后默认禁止
// settings.setAllowFileAccessFromFileURLs(true);
// // 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
// // Android 4.1前默认允许4.1后默认禁止
// settings.setAllowUniversalAccessFromFileURLs(true);
//
//
// webView.setWebChromeClient(webChromeClient);
// webView.setWebViewClient(webViewClient);
// Log.i("XHXDEBUG", "XHXDEBUGURL:::" + url);
//
//// new Handler().postDelayed(() -> showTopLy.setVisibility(View.GONE), 3000);
//// verifyStoragePermissions(this);
//
// webView.setDownloadListener(new DownloadListener() {
// @Override
// public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
// LogUtils.i("URL是啥onDownloadStart" + url);
//
// try {
// Intent intent = new Intent();
// intent.setAction(Intent.ACTION_VIEW);
// intent.setData(Uri.parse(url));
// startActivity(intent);
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
// });
getNetUrl();
}
public void getNetUrl(){
// Api.getInstance().geUrl(System.currentTimeMillis())
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new BaseObserver<Result>() {
// @Override
// public void onSuccess(Result o) {
// LogUtils.i("URL是啥获取的文件地址"+o.url);
// if(!TextUtils.isEmpty(o.url)){
// MainActivity.saveString(MainActivity3.this,"base_url",o.url);
// url = MainActivity.getString(MainActivity3.this, "base_url", url);
// toUrl(url);
// }
// }
//
// @Override
// public void onError(int code, String msg) {
// url = MainActivity.getString(MainActivity3.this, "base_url", url);
// toUrl(url);
// }
// });
}
private void toUrl(String url) {
mAgentWeb = AgentWeb.with(this)
.setAgentWebParent( webView, new LinearLayout.LayoutParams(-1, -1))
.useDefaultIndicator()
.setWebViewClient(webViewClient)
.setWebChromeClient(webChromeClient)
.createAgentWeb()
.ready()
.go(url);
}
WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
LogUtils.i("URL是啥加载完成" + webView.getUrl());
int w = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED);
// 重新测量
webView.measure(w, h);
showTopLy.setVisibility(View.GONE);
if (webView.getUrl().equals(url + "index") || webView.getUrl().equals(url + "/index")) {
isAtGame = false;
topVvvv.setVisibility(View.GONE);
} else {
if (isAtGame) {
topVvvv.setVisibility(View.VISIBLE);
} else {
topVvvv.setVisibility(View.GONE);
}
}
}
// @Override
// public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
// super.onReceivedError(view, request, error);
// if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// int errorCode = error.getErrorCode();
// String errorMessage = error.getDescription().toString();
// Log.i("CustomWebViewClient", "onReceivedError errorCode : " + errorCode + " errorMessage : " + errorMessage);
// }
// progressBar.setVisibility(View.GONE);
// }
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Log.i("CustomWebViewClient", "onReceivedError errorCode : " + errorCode + " description : " + description);
}
progressBar.setVisibility(View.GONE);
}
// @Override
// public boolean shouldOverrideUrlLoading(WebView webView, String s) {
// LogUtils.i("URL是啥"+s);
// return super.shouldOverrideUrlLoading(webView, s);
// }
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url1) {
LogUtils.i("URL是啥" + url1);
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
isAtGame = false;
topVvvv.setVisibility(View.GONE);
}else{
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return true;
}
return true;
}
};
boolean isAtGame = false;
// String uuid = "", uuid1 = "";
private static final int REQUEST_CODE_FILE_CHOOSER = 1;
private ValueCallback<Uri> mUploadCallbackForLowApi;
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
WebChromeClient webChromeClient = new WebChromeClient() {
// @Override
// public boolean onCreateWindow(WebView webViewdd, boolean b, boolean b1, Message resultMsg) {
// LogUtils.i("URL是啥onCreateWindow" + webViewdd.getUrl());
//
// WebView newWebView = new WebView(MainActivity3.this);
// newWebView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// isAtGame = true;
// mAgentWeb.getUrlLoader().loadUrl(url);
// return true;
// }
// });
// return true;
// }
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// 更新进度条的进度
progressBar.setProgress(newProgress);
// 如果加载完成,隐藏进度条
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
}
};
@RequiresApi(api = Build.VERSION_CODES.Q)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_FILE_CHOOSER:
if (resultCode == RESULT_OK || resultCode == RESULT_CANCELED) {
afterFileChooseGoing(resultCode, data);
}
break;
}
}
/**
* onActivityResult方法
*/
private void afterFileChooseGoing(int resultCode, Intent data) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (mUploadCallbackForHighApi == null) {
return;
}
mUploadCallbackForHighApi.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
mUploadCallbackForHighApi = null;
} else {
if (mUploadCallbackForLowApi == null) {
return;
}
Uri result = data == null ? null : data.getData();
mUploadCallbackForLowApi.onReceiveValue(result);
mUploadCallbackForLowApi = null;
}
}
public class JavaScriptinterface {
Context context;
public JavaScriptinterface(Context c) {
context = c;
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case REQUEST_EXTERNAL_STORAGE:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
}
break;
default:
break;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
/**
* 设置网页中图片的点击事件
*
* @param view
*/
public static void setWebImageClick(WebView view, String method) {
}
// @Override
// public boolean onKeyDown(int keyCode, KeyEvent event) {
//
// if (keyCode == KeyEvent.KEYCODE_BACK) {
//
// if (webView.canGoBack()) {
// webView.goBack();
// return true;
// } else {
// return super.onKeyDown(keyCode, event);
//
// }
//
// }
// return super.onKeyDown(keyCode, event);
// }
@Override
public void onDestroy() {
if (webView != null) {
//加载null内容
// webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
// //清除历史记录
// webView.clearHistory();
//移除WebView
// ((ViewGroup) webView.getParent()).removeView(webView);
//销毁VebView
mAgentWeb.destroy();
}
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onPause() {
super.onPause();
}
/**
* 获取状态栏高度
*
* @return
*/
public int getStatusBarHeight() {
int result = 0;
//获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
//wp-caption alignnone
}

View File

@@ -1,96 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
public class MessageInfo implements Serializable {
private String title;
private String content;
private String image = "";
private int type; // 1文字 2图片 3链接跳转
private int pushId;
private String createTime;
private int recordId;
public int status;
private String jumpUrl;
private boolean isShowAll = false;
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public int getRecordId() {
return recordId;
}
public void setRecordId(int recordId) {
this.recordId = recordId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public boolean isShowAll() {
return isShowAll;
}
public void setShowAll(boolean showAll) {
isShowAll = showAll;
}
public String getJumpUrl() {
return jumpUrl;
}
public void setJumpUrl(String jumpUrl) {
this.jumpUrl = jumpUrl;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public int getPushId() {
return pushId;
}
public void setPushId(int pushId) {
this.pushId = pushId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}

View File

@@ -1,74 +0,0 @@
package com.web.dmcslot;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyBankListAdapter extends RecyclerView.Adapter<MyBankListAdapter.ViewHolder> {
private List<BankInfo> listdata;
private onItemClickPostionListener itemClickPostionListener;
public MyBankListAdapter(List<BankInfo> listdata) {
this.listdata = listdata;
}
public void setListdata(List<BankInfo> listdata) {
this.listdata = listdata;
notifyDataSetChanged();
}
public void setOnItemClick(onItemClickPostionListener onItemClick) {
this.itemClickPostionListener = onItemClick;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_invite_records, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.getTextView().setText(listdata.get(position).getBankName());
holder.itemView.setOnClickListener(view -> {
if (itemClickPostionListener != null) {
itemClickPostionListener.item(position);
}
});
}
@Override
public int getItemCount() {
return listdata != null ? listdata.size() : 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_invitecode);
}
public TextView getTextView() {
return textView;
}
}
public interface onItemClickPostionListener {
void item(int position);
}
}

View File

@@ -1,17 +1,12 @@
package com.web.dmcslot;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
@@ -19,6 +14,8 @@ import androidx.core.app.NotificationCompat;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import com.google.gson.Gson;
import com.web.base.GsonUtils;
import com.web.base.MessageInfo;
import java.util.Map;
import java.util.Random;
@@ -37,21 +34,16 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
Gson gson = new Gson();
MessageInfo messageInfo = gson.fromJson(value, MessageInfo.class);
showNotification(messageInfo);
// if (remoteMessage.getNotification() != null) {
// showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
// }
} else {
//收到通知 创建notify
if (remoteMessage.getNotification() != null) {
showNotification(remoteMessage.getNotification().getTitle(), remoteMessage.getNotification().getBody());
}
}
}
private void showNotification(MessageInfo messageInfo) {
Intent notifyIntent = new Intent(this, MainActivity2.class);
Intent notifyIntent = new Intent(this, MainActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
ComponentName launchComponent = null;
launchComponent = getApplication()
@@ -60,28 +52,16 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
.getComponent();
notifyIntent.setComponent(launchComponent);
}
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
notifyIntent.setAction(Intent.ACTION_VIEW);
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
notifyIntent.putExtra("message", messageInfo);
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
// Intent notifyIntent = new Intent(this, MainActivity2.class);
// notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
// // notifyIntent.putExtra("message", messageInfo);
// notifyIntent.setAction(Intent.ACTION_VIEW);
// notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
// PendingIntent pendingIntent;
// pendingIntent = PendingIntent.getActivity
// (this, 0, notifyIntent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channelwinway = null;
NotificationCompat.Builder notificationBuilder = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
channelwinway.enableLights(true);
channelwinway.enableVibration(true);
notificationManager.createNotificationChannel(channelwinway);
@@ -92,7 +72,7 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
.setAutoCancel(true)
.setContentIntent(pendingIntent);
} else {
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
.setSmallIcon(R.mipmap.app_logo)
.setContentTitle(messageInfo.getTitle())
.setContentText(messageInfo.getContent())
@@ -103,7 +83,7 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
}
private void showNotification(String title, String body) {
Intent notifyIntent = new Intent(this, MainActivity2.class);
Intent notifyIntent = new Intent(this, MainActivity.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
ComponentName launchComponent = null;
launchComponent = getApplication()
@@ -116,8 +96,6 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
notifyIntent.setAction(Intent.ACTION_VIEW);
notifyIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 必须
PendingIntent pendingIntent = PendingIntent.getActivity(this, new Random().nextInt(10000), notifyIntent, PendingIntent.FLAG_IMMUTABLE);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channelwinway = null;
@@ -127,7 +105,7 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
body = messageInfo.getContent();
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
channelwinway = new NotificationChannel(getString(R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
channelwinway.enableLights(true);
channelwinway.enableVibration(true);
notificationManager.createNotificationChannel(channelwinway);
@@ -138,7 +116,7 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
.setAutoCancel(true)
.setContentIntent(pendingIntent);
} else {
notificationBuilder = new NotificationCompat.Builder(this, getString(R.string.app_name))
notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
.setSmallIcon(R.mipmap.app_logo)
.setContentTitle(title)
.setContentText(body)
@@ -146,29 +124,5 @@ public class MyFirebaseMessageingService extends FirebaseMessagingService {
.setContentIntent(pendingIntent);
}
notificationManager.notify(0, notificationBuilder.build());
//存储数据
// saveNotifyMessage(body);
}
// public void saveNotifyMessage(String body) {
// MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
// String savenotify = Utils.get(getApplication(),ApiService.savenotify,"");
// if(messageInfo!=null){
// if(TextUtils.isEmpty(savenotify)){
// GsonUtils.getListFromJSON(savenotify,)
// }
// }
// String jsonString = GsonUtils.beanToJSONString(chatMessageBeans);
// }
//
// /**
// * @param key 要设置的key
// */
// public static void set(Context activity, String key, String is) {
// SharedPreferences nameSetting = getConfigShared(activity);
// SharedPreferences.Editor namePref = nameSetting.edit();
// namePref.putString(key, is);
// namePref.commit();
// }
}

View File

@@ -1,75 +0,0 @@
package com.web.dmcslot;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder> {
private List<String> listdata;
private onItemClickPostionListener itemClickPostionListener;
public MyListAdapter(List<String> listdata) {
this.listdata = listdata;
}
public void setListdata(List<String> listdata) {
this.listdata = listdata;
notifyDataSetChanged();
}
public void setOnItemClick(onItemClickPostionListener onItemClick) {
this.itemClickPostionListener = onItemClick;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_invite_records, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.getTextView().setText(listdata.get(position));
holder.itemView.setOnClickListener(view -> {
if (itemClickPostionListener != null) {
itemClickPostionListener.item(position);
}
});
}
@Override
public int getItemCount() {
return listdata != null ? listdata.size() : 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.tv_invitecode);
}
public TextView getTextView() {
return textView;
}
}
public interface onItemClickPostionListener {
void item(int position);
}
}

View File

@@ -1,154 +0,0 @@
package com.web.dmcslot;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.util.List;
/**
* 通知列表适配器
*/
public class MyNotifyListAdapter extends RecyclerView.Adapter<MyNotifyListAdapter.ViewHolder> {
private List<MessageInfo> listdata;
private onItemClickPostionListener itemClickPostionListener;
private Context context;
private MessageInfo messageItem;
public MyNotifyListAdapter(Context context, List<MessageInfo> listdata, MessageInfo messageItem) {
this.context = context;
this.listdata = listdata;
this.messageItem = messageItem;
}
public void setListdata(List<MessageInfo> listdata) {
this.listdata = listdata;
notifyDataSetChanged();
}
public void setOnItemClick(onItemClickPostionListener onItemClick) {
this.itemClickPostionListener = onItemClick;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_notify_list, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
// holder.itemView.setOnClickListener(view -> {
// if (itemClickPostionListener != null) {
// itemClickPostionListener.item(position);
// }
// });
MessageInfo messageInfo = listdata.get(position);
if (messageItem != null && messageInfo.getRecordId() == messageItem.getPushId()) {
messageInfo.setShowAll(true);
messageItem = null;
}
int type = messageInfo.getType();
if (type == 1) {
holder.root.setBackgroundColor(context.getColor(R.color.notify_textcolor));
holder.tvType.setText("Text");
}
if (type == 2) {
holder.root.setBackgroundColor(context.getColor(R.color.notify_imagecolor));
holder.tvType.setText("Image");
}
if (type == 3) {
holder.root.setBackgroundColor(context.getColor(R.color.notify_jumplinkcolor));
holder.tvType.setText("Jump link");
}
holder.tvTitle.setText(messageInfo.getTitle());
holder.layoutMore.setVisibility(View.GONE);
holder.tvContent.setText(messageInfo.getContent());
holder.ivMsg.setVisibility(View.GONE);
holder.tvTime.setText(messageInfo.getCreateTime());
holder.tvJumpLink.setVisibility(View.GONE);
if (!TextUtils.isEmpty(messageInfo.getImage())) {
holder.ivMsg.setVisibility(View.VISIBLE);
Glide.with(context).load(messageInfo.getImage()).into(holder.ivMsg);
}
if (!TextUtils.isEmpty(messageInfo.getJumpUrl())) {
holder.tvJumpLink.setVisibility(View.VISIBLE);
holder.tvJumpLink.setText(messageInfo.getJumpUrl());
holder.tvJumpLink.setOnClickListener(view -> {
if (itemClickPostionListener != null) {
itemClickPostionListener.item(position);
}
});
}
if (messageInfo.isShowAll()) {
holder.ivNotifyPull.setBackgroundResource(R.mipmap.ic_notify_shangla);
holder.layoutMore.setVisibility(View.VISIBLE);
} else {
holder.ivNotifyPull.setBackgroundResource(R.mipmap.ic_notify_xiala);
holder.layoutMore.setVisibility(View.GONE);
}
holder.itemView.setOnClickListener(view -> {
messageInfo.setShowAll(!messageInfo.isShowAll());
notifyItemChanged(position);
});
}
@Override
public int getItemCount() {
return listdata != null ? listdata.size() : 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView tvType;
private final TextView tvTime;
private final TextView tvContent;
private final TextView tvTitle;
private final TextView tvJumpLink;
private final ImageView ivType;
private final ImageView ivNotifyPull;
private final ImageView ivMsg;
private ConstraintLayout root;
private LinearLayout layoutMore;
public ViewHolder(@NonNull View itemView) {
super(itemView);
root = itemView.findViewById(R.id.big_bg);
// tvType = itemView.findViewById(R.id.iv_readtype);
tvType = itemView.findViewById(R.id.tv_msg_type);
ivType = itemView.findViewById(R.id.iv_icon);
ivNotifyPull = itemView.findViewById(R.id.ic_notify_pull);
ivMsg = itemView.findViewById(R.id.iv_notifyimage);
tvContent = itemView.findViewById(R.id.iv_notifycontent);
tvTitle = itemView.findViewById(R.id.tv_msg_title);
tvTime = itemView.findViewById(R.id.tv_msg_time);
tvJumpLink = itemView.findViewById(R.id.iv_notifyjumpclick);
layoutMore = itemView.findViewById(R.id.layout_more);
}
}
public interface onItemClickPostionListener {
void item(int position);
}
}

View File

@@ -1,70 +0,0 @@
package com.web.dmcslot;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
/**
* 提现记录
*/
public class MyWithDrwaListAdapter extends RecyclerView.Adapter<MyWithDrwaListAdapter.ViewHolder> {
private List<WithDrawListInfo.WithDrawInfo> listdata;
private Context context;
public MyWithDrwaListAdapter(Context context, List<WithDrawListInfo.WithDrawInfo> listdata) {
this.context = context;
this.listdata = listdata;
}
public void setListdata(List<WithDrawListInfo.WithDrawInfo> listdata) {
this.listdata = listdata;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_withdraw_records, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
WithDrawListInfo.WithDrawInfo withDrawInfo = listdata.get(position);
holder.tvWithDrawName.setText(withDrawInfo.getName() + "(" + withDrawInfo.getBankName() + ")");
holder.tvWithDrawAmount.setText(String.format(context.getString(R.string.app_withdraw_amount), withDrawInfo.getAmount()));
holder.tvWithDrawBalance.setText(String.format(context.getString(R.string.app_balance), withDrawInfo.getBalance()));
}
@Override
public int getItemCount() {
return listdata != null ? listdata.size() : 0;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView tvWithDrawName;
private TextView tvWithDrawAmount;
private TextView tvWithDrawBalance;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvWithDrawName = itemView.findViewById(R.id.tv_withdrawname);
tvWithDrawAmount = itemView.findViewById(R.id.tv_withdrawamount);
tvWithDrawBalance = itemView.findViewById(R.id.tv_withdrawbalance);
}
}
}

View File

@@ -1,386 +0,0 @@
package com.web.dmcslot;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.bumptech.glide.Glide;
import com.tencent.smtt.export.external.interfaces.PermissionRequest;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.sdk.DownloadListener;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import java.util.HashMap;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
//通知详情
public class NotifyDetailsActivity extends AppCompatActivity {
WebView webView;
private LinearLayout showTopLy;
private ImageView backIv;
private ImageView contentIv;
public static String url = "https://vv88.io/";
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE"};
private static String[] PERMISSIONS_CAMERA = {
Manifest.permission.CAMERA};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_notifydetails);
initView();
MessageInfo messageInfo = (MessageInfo) getIntent().getSerializableExtra("message");
if (messageInfo != null) {
recordNotify(messageInfo.getPushId());
if (messageInfo.getType() == 3) {
webView.setVisibility(View.VISIBLE);
webView.loadUrl(messageInfo.getJumpUrl());
}
if (messageInfo.getType() == 2) {
contentIv.setVisibility(View.VISIBLE);
Glide.with(NotifyDetailsActivity.this).load(messageInfo.getImage()).into(contentIv);
}
}
}
public void recordNotify(int pushId) {
HashMap<String, Object> map = new HashMap<>();
map.put("pushId", pushId);
Api.getInstance().totalNotify(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result>() {
@Override
public void onSuccess(Result o) {
}
@Override
public void onError(int code, String msg) {
}
@Override
public void onError2(Result o) {
}
});
}
@SuppressLint({"NewApi", "WrongConstant"})
protected void initView() {
webView = findViewById(R.id.webview);
showTopLy = findViewById(R.id.show_top_ly);
backIv = (ImageView) findViewById(R.id.back_iv);
contentIv = findViewById(R.id.image);
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setAppCacheEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
// 设置允许访问文件数据
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
settings.setDatabaseEnabled(true);
settings.setSavePassword(false);
settings.setSaveFormData(false);
settings.setUseWideViewPort(true);
settings.setBuiltInZoomControls(true);
settings.setPluginState(WebSettings.PluginState.ON);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webView.setFocusable(true);
webView.setFocusableInTouchMode(true);
webView.getSettings().setSupportMultipleWindows(true);
settings.setSupportZoom(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
// webView.setHorizontalScrollbarOverlay(true);
webView.setHorizontalScrollBarEnabled(true);
webView.requestFocus();
// webView.setBackgroundColor(getColor(R.color.black));
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setMediaPlaybackRequiresUserGesture(false);
// 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowFileAccessFromFileURLs(true);
// 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowUniversalAccessFromFileURLs(true);
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
showTopLy.setVisibility(View.GONE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest webResourceRequest) {
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
uri = webResourceRequest.getUrl();
} else {
uri = Uri.parse(webResourceRequest.toString());
}
String url1 = uri.toString();
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return true;
}
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url1) {
LogUtils.i("URL是啥" + url1);
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return true;
}
return false;
}
});
// new Handler().postDelayed(() -> showTopLy.setVisibility(View.GONE), 3000);
// verifyStoragePermissions(this);
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
LogUtils.i("URL是啥onDownloadStart" + url);
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
});
backIv.setOnClickListener(view -> finish());
}
private static final int REQUEST_CODE_FILE_CHOOSER = 1;
private ValueCallback<Uri> mUploadCallbackForLowApi;
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView webViewdd, boolean b, boolean b1, Message resultMsg) {
LogUtils.i("URL是啥onCreateWindow" + webView.getUrl());
// WebView newWebView = new WebView(MainActivity2.this);
// topVvvv.setVisibility(View.VISIBLE);
// webView.addView(newWebView);
// WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
// transport.setWebView(newWebView);
// resultMsg.sendToTarget();
//
// newWebView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// isAtGame = true;
// webView.loadUrl(url);
// return false;
// }
// });
WebView newWebView = new WebView(webViewdd.getContext());
newWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!(url.startsWith("http") || url.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
Intent browserIntent = new Intent(NotifyDetailsActivity.this, WebViewActivity.class);
browserIntent.putExtra("url", url);
startActivity(browserIntent);
return true;
}
return false;
}
});
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// 更新进度条的进度
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
LogUtils.i("数据接口onShowFileChooser");
mUploadCallbackForHighApi = filePathCallback;
Intent intent = fileChooserParams.createIntent();
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(intent, REQUEST_CODE_FILE_CHOOSER);
} catch (ActivityNotFoundException e) {
// mUploadCallbackForHighApi = null;
// WidgetUtils.showToast(JsBridgeActivity.this, "未知错误", WidgetUtils.ToastType.ERROR);
// Toast.makeText(MainActivity2.this, "未知错误", Toast.LENGTH_SHORT).show();
startActivityForResult(Intent.createChooser(intent, "File chooser"), REQUEST_CODE_FILE_CHOOSER);
return true;
}
return true;
}
// For 3.0+
protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
LogUtils.i("数据接口openFileChooseracceptType");
openFilerChooser(uploadMsg);
}
private void openFilerChooser(ValueCallback<Uri> uploadMsg) {
LogUtils.i("数据接口openFileChooser");
mUploadCallbackForLowApi = uploadMsg;
startActivityForResult(Intent.createChooser(getFilerChooserIntent(), "File Chooser"), REQUEST_CODE_FILE_CHOOSER);
}
private Intent getFilerChooserIntent() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
return intent;
}
@Override
public void onPermissionRequest(PermissionRequest request) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
NotifyDetailsActivity.this.runOnUiThread(new Runnable() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
for (String permisson : request.getResources()) {
permissionRequest = request;
if (permisson.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) {
if (ContextCompat.checkSelfPermission(NotifyDetailsActivity.this, Manifest.permission.CAMERA) != 0) {
ActivityCompat.requestPermissions(NotifyDetailsActivity.this, PERMISSIONS_CAMERA, 1111);
} else {
request.grant(request.getResources());
request.getOrigin();
}
}
}
}
});
}
}
};
private PermissionRequest permissionRequest;
}

View File

@@ -1,129 +0,0 @@
package com.web.dmcslot;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 通知列表
*/
public class NotifyListActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private LinearLayoutManager manager;
private MyNotifyListAdapter adapter;
private List<MessageInfo> listdata = new ArrayList<>();
private int userId = 2;
private int page = 1;
private boolean isNextPages = false;
private MessageInfo messageInfoItem;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_notifylist);
messageInfoItem = (MessageInfo) getIntent().getSerializableExtra("message");
findViewById(R.id.back_iv).setOnClickListener(view -> finish());
recyclerView = findViewById(R.id.recycler_nofity);
manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
int visibleCount = manager.getChildCount();
int totalCount = manager.getItemCount();
int firstvisibleCount = manager.findFirstVisibleItemPosition();
if (visibleCount > 0 && visibleCount + firstvisibleCount == totalCount) { //滑动到底部
if (!isNextPages) {
Toast.makeText(NotifyListActivity.this, getString(R.string.app_toastloading), Toast.LENGTH_SHORT).show();
return;
}
page++;
getNotifyList();
}
// super.onScrolled(recyclerView, dx, dy);
}
});
adapter = new MyNotifyListAdapter(NotifyListActivity.this, listdata,messageInfoItem);
recyclerView.setAdapter(adapter);
adapter.setOnItemClick(new MyNotifyListAdapter.onItemClickPostionListener() {
@Override
public void item(int position) {
try{
MessageInfo messageInfo = listdata.get(position);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(messageInfo.getJumpUrl()));
startActivity(intent);
}catch (Exception e){
}
}
});
getNotifyList();
}
public void getNotifyList() {
//通知列表
Api.getInstance().getNotifyList(userId, page, 10)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<Result<ResultDataInfo<MessageInfo>>>() {
@Override
public void onSuccess(Result<ResultDataInfo<MessageInfo>> o) {
if(o.data!=null){
isNextPages = o.data.isHasNextPage();
if (page == 1) {
listdata.clear();
}
listdata.addAll(o.data.getList());
adapter.setListdata(listdata);
}
}
@Override
public void onError(int code, String msg) {
LogUtils.i("获取的结果error" + msg);
if (page > 1) {
page--;
}
}
@Override
public void onError2(Result<ResultDataInfo<MessageInfo>> o) {
LogUtils.i("获取的结果error");
if (page > 1) {
page--;
}
}
});
}
}

View File

@@ -1,31 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import com.web.dmcslot.GsonUtils;
/**
* created by wmm on 2020/9/8
*/
public class Result<T> implements Serializable {
public String error;
public int code;
public T data;
public String message;
public boolean isSuccessful() {
return code == 1;
}
@Override
public String toString() {
return "Result{" +
"message='" + error + '\'' +
", code=" + code +
", data=" + GsonUtils.beanToJSONString(data) +
'}';
}
}

View File

@@ -1,45 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import java.util.List;
public class ResultDataInfo<T> implements Serializable {
public List<T> list;
public int pages;
public int total;
public boolean hasNextPage;
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getPages() {
return pages;
}
public void setPages(int pages) {
this.pages = pages;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}

View File

@@ -1,233 +0,0 @@
package com.web.dmcslot;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.widget.TextViewCompat;
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
public class StartActivity extends AppCompatActivity implements View.OnClickListener {
private StringBuilder currentInput = new StringBuilder("");
private BigDecimal currentAnswer = new BigDecimal(0);
private boolean hasCount = false;
private Button btn_0, btn_1, btn_2, btn_3, btn_4, btn_5, btn_6, btn_7, btn_8, btn_9, btn_equal;
private TextView password1;
private TextView password2;
private TextView password3;
private TextView password4;
private TextView password5;
private TextView password6;
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_start);
setListener();
getNetUrl();
}
public void setListener() {
password1 = (TextView) findViewById(R.id.password_1);
password2 = (TextView) findViewById(R.id.password_2);
password3 = (TextView) findViewById(R.id.password_3);
password4 = (TextView) findViewById(R.id.password_4);
password5 = (TextView) findViewById(R.id.password_5);
password6 = (TextView) findViewById(R.id.password_6);
btn_0 = (Button) findViewById(R.id.btn_0);
btn_0.setOnClickListener(this);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_1.setOnClickListener(this);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_2.setOnClickListener(this);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_3.setOnClickListener(this);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_4.setOnClickListener(this);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_5.setOnClickListener(this);
btn_6 = (Button) findViewById(R.id.btn_6);
btn_6.setOnClickListener(this);
btn_7 = (Button) findViewById(R.id.btn_7);
btn_7.setOnClickListener(this);
btn_8 = (Button) findViewById(R.id.btn_8);
btn_8.setOnClickListener(this);
btn_9 = (Button) findViewById(R.id.btn_9);
btn_9.setOnClickListener(this);
btn_equal = (Button) findViewById(R.id.btn_equal);
btn_equal.setOnClickListener(this);
}
String password = "";
/**
* 0 正常增加 1 删除 2 更新
*
* @param string
* @param type
*/
public void addInput(String string, int type) {
if (type == 0) {
if (password.length() < 6) {
password += string;
}
} else if (type == 1) {
password = password.substring(0, password.length() - 1);
}
if (password.length() == 6) {
password6.setText(password.charAt(5) + "");
toNext();
} else {
password6.setText("");
if (password.length() == 5) {
password5.setText(password.charAt(4) + "");
} else {
password5.setText("");
if (password.length() == 4) {
password4.setText(password.charAt(3) + "");
} else {
password4.setText("");
if (password.length() == 3) {
password3.setText(password.charAt(2) + "");
} else {
password3.setText("");
if (password.length() == 2) {
password2.setText(password.charAt(1) + "");
} else {
password2.setText("");
if (password.length() == 1) {
password1.setText(password.charAt(0) + "");
} else {
password1.setText("");
}
}
}
}
}
}
}
public void getNetUrl(){
// Api.getInstance().geUrl(System.currentTimeMillis())
// .subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread())
// .subscribe(new BaseObserver<Result>() {
// @Override
// public void onSuccess(Result o) {
// LogUtils.i("获取的文件地址:"+o.url);
// if(!TextUtils.isEmpty(o.url)){
// MainActivity.saveString(StartActivity.this,"base_url",o.url);
// }
// }
//
// @Override
// public void onError(int code, String msg) {
//
// }
// });
}
Handler handler = new Handler();
private void toNext() {
MainActivity.saveString(StartActivity.this, "loc_pass", password);
Intent intent = new Intent(StartActivity.this, MainActivity2.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_0:
addInput("0", 0);
break;
case R.id.btn_1:
addInput("1", 0);
break;
case R.id.btn_2:
addInput("2", 0);
break;
case R.id.btn_3:
addInput("3", 0);
break;
case R.id.btn_4:
addInput("4", 0);
break;
case R.id.btn_5:
addInput("5", 0);
break;
case R.id.btn_6:
addInput("6", 0);
break;
case R.id.btn_7:
addInput("7", 0);
break;
case R.id.btn_8:
addInput("8", 0);
break;
case R.id.btn_9:
addInput("9", 0);
break;
case R.id.btn_equal:
deleteInput();
break;
}
}
private void deleteInput() {
if (TextUtils.isEmpty(password)) {
addInput("", 2);
} else {
addInput(password, 1);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}

View File

@@ -1,44 +0,0 @@
package com.web.dmcslot;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
/**
* Created by kiun_2007 on 2018/3/29.
*/
public class StatusLayout extends LinearLayout {
public StatusLayout(Context context) {
this(context, null);
}
public StatusLayout(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public StatusLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
@Override
protected void onAttachedToWindow() {
ViewGroup.LayoutParams lp = this.getLayoutParams();
lp.width = -1;
lp.height = getStatusBarHeight(getContext());
this.setLayoutParams(lp);
super.onAttachedToWindow();
}
}

View File

@@ -1,70 +0,0 @@
package com.web.dmcslot;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.provider.Settings;
import java.security.NoSuchAlgorithmException;
public class Utils {
public static boolean isImageUrl(String url) {
String end = url.substring(url.lastIndexOf(".") + 1).toLowerCase();
String[] images = new String[]{"jpeg", "png", "jpg", "bmp", "webp", "gif"};
for (String name : images) {
if (end.equals(name)) {
return true;
}
}
return false;
}
public static String getUniqueId(Context context) {
@SuppressLint("HardwareIds")
// ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数当设备被wipe后该数重置。
String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
// @SuppressLint("HardwareIds")
// String id = androidID + Build.SERIAL; // +硬件序列号
return androidID;
// try {
// return toMD5(id);
// } catch (NoSuchAlgorithmException e) {
// e.printStackTrace();
// return id;
// }
}
/**
* @param @param key 要获取的key
*/
public static String get(Context context, String key, String defaultValue) {
SharedPreferences nameSetting = getConfigShared(context);
return nameSetting.getString(key, defaultValue);
}
/**
* @param key 要设置的key
*/
public static void set(Context activity, String key, String is) {
SharedPreferences nameSetting = getConfigShared(activity);
SharedPreferences.Editor namePref = nameSetting.edit();
namePref.putString(key, is);
namePref.commit();
}
public static SharedPreferences getConfigShared(Context context) {
if (context == null) {
context = WebApplication.application;
}
SharedPreferences sharedPreferences =
context.getSharedPreferences("notify_data", Context.MODE_MULTI_PROCESS);
return sharedPreferences;
}
}

View File

@@ -1,340 +0,0 @@
package com.web.dmcslot;
import android.annotation.TargetApi;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.tencent.smtt.export.external.interfaces.ConsoleMessage;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import com.web.dmcslot.appdown.AppUpdater;
import com.web.dmcslot.appdown.UpdateConfig;
import com.web.dmcslot.appdown.constant.Constants;
import com.web.dmcslot.appdown.util.AppUtils;
import com.web.dmcslot.appdown.util.NotificationUtils;
public class WebView2Activity extends AppCompatActivity {
private String url;
WebView webView;
ImageView show_top_v;
ImageView menu_iv;
private ImageView helpIv;
private LinearLayout showTopLy;
private FrameLayout videoContainer;
private ImageView backIv;
private ProgressBar progressBar;
private View topVvvv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_webview);
findViewById(R.id.back_iv).setOnClickListener(view -> finish());
url = getIntent().getStringExtra("url");
initView();
}
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
public void initView() {
topVvvv = (View) findViewById(R.id.top_vvvv);
webView = findViewById(R.id.webview);
show_top_v = findViewById(R.id.show_top_v);
showTopLy = findViewById(R.id.show_top_ly);
videoContainer = (FrameLayout) findViewById(R.id.videoContainer);
backIv = (ImageView) findViewById(R.id.back_iv);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setAppCacheEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
// 设置允许访问文件数据
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
settings.setDatabaseEnabled(true);
settings.setSavePassword(false);
settings.setSaveFormData(false);
settings.setUseWideViewPort(true);
settings.setBuiltInZoomControls(true);
settings.setPluginState(WebSettings.PluginState.ON);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webView.setFocusable(true);
webView.setFocusableInTouchMode(true);
webView.getSettings().setSupportMultipleWindows(true);
settings.setSupportZoom(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
// webView.setHorizontalScrollbarOverlay(true);
webView.setHorizontalScrollBarEnabled(true);
webView.requestFocus();
// webView.setBackgroundColor(getColor(R.color.black));
settings.setJavaScriptCanOpenWindowsAutomatically(false);
settings.setMediaPlaybackRequiresUserGesture(false);
// 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowFileAccessFromFileURLs(true);
// 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowUniversalAccessFromFileURLs(true);
// settings.setBuiltInZoomControls(false); // 启用缩放功能
// settings.setDisplayZoomControls(false); // 隐藏缩放控件
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(WebView2Activity.this);
topVvvv.setVisibility(View.VISIBLE);
webView.addView(newWebView);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
newWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// isAtGame = true;
progressBar.setVisibility(View.GONE);
webView.loadUrl(url);
return true;
}
});
// WebView newWebView = new WebView(view.getContext());
// newWebView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Intent browserIntent = new Intent(WebViewActivity.this, WebViewActivity.class);
// browserIntent.putExtra("url", url);
// startActivity(browserIntent);
// return true;
// }
// });
// WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
// transport.setWebView(newWebView);
// resultMsg.sendToTarget();
// return true;
return true;
}
@Override
public void onCloseWindow(WebView window) {
super.onCloseWindow(window);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
LogUtils.d("consolemessage==" + consoleMessage.message());
return true;
}
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
}
});
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
showTopLy.setVisibility(View.GONE);
progressBar.setVisibility(View.GONE);
topVvvv.setVisibility(View.VISIBLE);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
topVvvv.setVisibility(View.VISIBLE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
uri = request.getUrl();
} else {
uri = Uri.parse(request.toString());
}
String url1 = uri.toString();
LogUtils.d("url1111111111==" + url1);
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
if (url1.contains(".apk")) { //下载
Toast.makeText(WebView2Activity.this, "下载开始,请稍后...", Toast.LENGTH_SHORT).show();
Constants.isUpdate = false;
new AppUpdater(WebView2Activity.this, url1).start();
return false;
}
//其它的该怎么处理就怎么处理
LogUtils.d("url1111111111==2" + url1);
webView.loadUrl(url1);
return true;
}
}
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url1) {
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
if (url1.contains(".apk")) { //下载
new AppUpdater(WebView2Activity.this, url1).start();
return false;
}
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return false;
}
}
return false;
}
});
// webView.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View view, MotionEvent motionEvent) {
// if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
// webView.loadUrl("javascript:_IntervalResize(+\" + view + \",false)");
// return true;
// } else {
// return false;
// }
// }
// });
// webView.onWindowFocusChanged(true);
// webView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
// @Override
// public void onFocusChange(View view, boolean b) {
// LogUtils.d("B==" + b);
// view.invalidate();
// }
// });
if (url != null) {
webView.loadUrl(url);
}
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {//当webview有多级能返回的时候
webView.goBack();
} else {//不能返回了
WebView2Activity.this.finish();
}
}
@Override
protected void onDestroy() {
if (webView != null) {
//加载null内容
// webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
//清除历史记录
// webView.clearHistory();
//移除WebView
// ((ViewGroup) webView.getParent()).removeView(webView);
//销毁VebView
webView.destroy();
}
super.onDestroy();
}
}

View File

@@ -1,389 +0,0 @@
package com.web.dmcslot;
import android.annotation.TargetApi;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.tencent.smtt.export.external.interfaces.ConsoleMessage;
import com.tencent.smtt.export.external.interfaces.WebResourceError;
import com.tencent.smtt.export.external.interfaces.WebResourceRequest;
import com.tencent.smtt.sdk.ValueCallback;
import com.tencent.smtt.sdk.WebChromeClient;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import com.web.dmcslot.appdown.AppUpdater;
import com.web.dmcslot.appdown.UpdateConfig;
import com.web.dmcslot.appdown.constant.Constants;
import com.web.dmcslot.appdown.util.AppUtils;
import com.web.dmcslot.appdown.util.NotificationUtils;
public class WebViewActivity extends AppCompatActivity {
private String url;
WebView webView;
TextView tvErrorMsg;
LinearLayout layoutError;
ImageView show_top_v;
ImageView menu_iv;
private ImageView helpIv;
private LinearLayout showTopLy;
private FrameLayout videoContainer;
private ImageView backIv;
private ProgressBar progressBar;
private View topVvvv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
getWindow().setNavigationBarColor(getColor(R.color.white));
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
super.onCreate(savedInstanceState);
View decor = getWindow().getDecorView();
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.hide();
}
setContentView(R.layout.activity_main2);
findViewById(R.id.back_iv).setOnClickListener(view -> finish());
url = getIntent().getStringExtra("url");
initView();
}
private ValueCallback<Uri[]> mUploadCallbackForHighApi;
public void initView() {
topVvvv = (View) findViewById(R.id.top_vvvv);
webView = findViewById(R.id.webview);
show_top_v = findViewById(R.id.show_top_v);
showTopLy = findViewById(R.id.show_top_ly);
tvErrorMsg = findViewById(R.id.errormsg);
layoutError = findViewById(R.id.layoutError);
videoContainer = (FrameLayout) findViewById(R.id.videoContainer);
backIv = (ImageView) findViewById(R.id.back_iv);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
WebSettings settings = webView.getSettings();
settings.setDomStorageEnabled(true);
settings.setAppCacheEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setJavaScriptEnabled(true);
settings.setLoadWithOverviewMode(true);
// 设置允许访问文件数据
settings.setAllowFileAccess(true);
settings.setAllowContentAccess(true);
settings.setDatabaseEnabled(true);
settings.setSavePassword(false);
settings.setSaveFormData(false);
settings.setUseWideViewPort(true);
settings.setBuiltInZoomControls(true);
settings.setPluginState(WebSettings.PluginState.ON);
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webView.setFocusable(true);
webView.setFocusableInTouchMode(true);
webView.getSettings().setSupportMultipleWindows(true);
settings.setSupportZoom(false);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
// webView.setHorizontalScrollbarOverlay(true);
webView.setHorizontalScrollBarEnabled(true);
webView.requestFocus();
// webView.setBackgroundColor(getColor(R.color.black));
settings.setJavaScriptCanOpenWindowsAutomatically(false);
// 设置在WebView内部是否允许通过file url加载的 Js代码读取其他的本地文件
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowFileAccessFromFileURLs(true);
// 设置WebView内部是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源)
// Android 4.1前默认允许4.1后默认禁止
settings.setAllowUniversalAccessFromFileURLs(true);
// settings.setBuiltInZoomControls(false); // 启用缩放功能
// settings.setDisplayZoomControls(false); // 隐藏缩放控件
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(WebViewActivity.this);
topVvvv.setVisibility(View.VISIBLE);
webView.addView(newWebView);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
newWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// isAtGame = true;
progressBar.setVisibility(View.GONE);
webView.loadUrl(url);
return true;
}
});
// WebView newWebView = new WebView(view.getContext());
// newWebView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Intent browserIntent = new Intent(WebViewActivity.this, WebViewActivity.class);
// browserIntent.putExtra("url", url);
// startActivity(browserIntent);
// return true;
// }
// });
// WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
// transport.setWebView(newWebView);
// resultMsg.sendToTarget();
// return true;
return true;
}
});
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
showTopLy.setVisibility(View.GONE);
progressBar.setVisibility(View.GONE);
topVvvv.setVisibility(View.VISIBLE);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
topVvvv.setVisibility(View.VISIBLE);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int errorCode = error.getErrorCode();
String errorMessage = error.getDescription().toString();
String currentUrl = request.getUrl().toString();
LogUtils.d("onReceivedError2 url==" + url + " errorCode ==" + errorCode);
if ((errorCode == -2 || errorCode == -6) && currentUrl.contains(url)) {
onShowErrorView(errorMessage);
} else {
onShowNetView();
}
}
progressBar.setVisibility(View.GONE);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
LogUtils.d("onReceivedError2 url==" + failingUrl + " errorCode ==" + errorCode);
if ((errorCode == -2 || errorCode == -6) && failingUrl.contains(url)) {
onShowErrorView(description);
} else {
onShowNetView();
}
}
progressBar.setVisibility(View.GONE);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
uri = request.getUrl();
} else {
uri = Uri.parse(request.toString());
}
String url1 = uri.toString();
LogUtils.d("url1111111111==" + url1);
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
if (url1.contains(".apk")) { //下载
Toast.makeText(WebViewActivity.this, "下载开始,请稍后...", Toast.LENGTH_SHORT).show();
Constants.isUpdate = false;
new AppUpdater(WebViewActivity.this, url1).start();
return false;
}
//其它的该怎么处理就怎么处理
LogUtils.d("url1111111111==2" + url1);
webView.loadUrl(url1);
return true;
}
}
return false;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url1) {
if (url1.equals(url + "index") || url1.equals(url + "/index")) {
topVvvv.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
if (!(url1.startsWith("http") || url1.startsWith("https"))) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url1));
startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
} else {
if ((url1.equals(url + "index") || url1.equals(url + "/index")) && webView.canGoBack()) {
return false;
} else {
if (url1.contains(".apk")) { //下载
new AppUpdater(WebViewActivity.this, url1).start();
return false;
}
//其它的该怎么处理就怎么处理
webView.loadUrl(url1);
return false;
}
}
return false;
}
});
webView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
@Override
public boolean onGenericMotion(View view, MotionEvent motionEvent) {
return false;
}
});
// webView.setOnTouchListener(new View.OnTouchListener() {
// @Override
// public boolean onTouch(View view, MotionEvent motionEvent) {
// if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
// webView.loadUrl("javascript:_IntervalResize(+\" + view + \",false)");
// return true;
// } else {
// return false;
// }
// }
// });
// webView.onWindowFocusChanged(true);
// webView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
// @Override
// public void onFocusChange(View view, boolean b) {
// LogUtils.d("B==" + b);
// view.invalidate();
// }
// });
if (url != null) {
webView.loadUrl(url);
}
}
private boolean isNetError = false;
public void onShowErrorView(String errorMsg) { //网络不可用的情况
topVvvv.setVisibility(View.VISIBLE);
webView.setVisibility(View.GONE);
layoutError.setVisibility(View.VISIBLE);
tvErrorMsg.setText(errorMsg);
showTopLy.setVisibility(View.GONE);
isNetError = true;
}
public void onShowNetView() {
topVvvv.setVisibility(View.VISIBLE);
webView.setVisibility(View.VISIBLE);
layoutError.setVisibility(View.GONE);
showTopLy.setVisibility(View.GONE);
isNetError = false;
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {//当webview有多级能返回的时候
onShowNetView();
webView.goBack();
} else {//不能返回了
WebViewActivity.this.finish();
}
}
@Override
protected void onDestroy() {
if (webView != null) {
//加载null内容
// webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
//清除历史记录
// webView.clearHistory();
//移除WebView
// ((ViewGroup) webView.getParent()).removeView(webView);
//销毁VebView
webView.destroy();
}
super.onDestroy();
}
}

View File

@@ -1,81 +0,0 @@
package com.web.dmcslot;
import java.io.Serializable;
import java.util.List;
/**
* 提现记录
*/
public class WithDrawListInfo implements Serializable {
//邀请记录
private int total;
private List<WithDrawInfo> list;
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<WithDrawInfo> getList() {
return list;
}
public void setList(List<WithDrawInfo> list) {
this.list = list;
}
class WithDrawInfo{
private String amount;
private String balance;
private String bankName;
private String createTime;
private String name;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getBalance() {
return balance;
}
public void setBalance(String balance) {
this.balance = balance;
}
public String getBankName() {
return bankName;
}
public void setBankName(String bankName) {
this.bankName = bankName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}

View File

@@ -1,384 +0,0 @@
package com.web.dmcslot.appdown;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import com.web.dmcslot.appdown.callback.UpdateCallback;
import com.web.dmcslot.appdown.constant.Constants;
import com.web.dmcslot.appdown.http.HttpManager;
import com.web.dmcslot.appdown.http.IHttpManager;
import com.web.dmcslot.appdown.http.OkHttpManager;
import com.web.dmcslot.appdown.service.DownloadService;
import com.web.dmcslot.appdown.util.PermissionUtils;
import java.util.Map;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class AppUpdater {
/**
* {@link #mContext}不强制要求是{@link Activity},但能传{@link Activity}尽量传。AppUpdater本应该只专注于App更新尽量不涉及动态权限相关的处理。如果mContext传的是{@link Activity},则默认会校验一次动态权限。
*/
private Context mContext;
/**
* 配置信息
*/
private UpdateConfig mConfig;
/**
* 更新回调
*/
private UpdateCallback mCallback;
/**
* http管理接口可自定义实现。如使用okHttp
*/
private IHttpManager mHttpManager;
private ServiceConnection mServiceConnection;
public AppUpdater(@NonNull Context context,@NonNull UpdateConfig config){
this.mContext = context;
this.mConfig = config;
}
public AppUpdater(@NonNull Context context,@NonNull String url){
this.mContext = context;
mConfig = new UpdateConfig();
mConfig.setUrl(url);
}
/**
* 设置下载更新进度回调
* @param callback
* @return
*/
public AppUpdater setUpdateCallback(UpdateCallback callback){
this.mCallback = callback;
return this;
}
/**
* 设置一个IHttpManager
* @param httpManager AppUpdater内置提供{@link HttpManager} 和 {@link OkHttpManager}两种实现。
* 如果不设置,将默认使用{@link HttpManager},你也可以使用{@link OkHttpManager}或自己去实现一个
* {@link IHttpManager}。
* 当使用{@link OkHttpManager}时必需依赖okhttp库
* @return
*/
public AppUpdater setHttpManager(IHttpManager httpManager){
this.mHttpManager = httpManager;
return this;
}
/**
* 开始下载
*/
public void start(){
if(mConfig != null && !TextUtils.isEmpty(mConfig.getUrl())){
//如果mContext是Activity,并且配置了下载路径,则默认会校验一次动态权限。
if(mContext instanceof Activity && !TextUtils.isEmpty(mConfig.getPath())){
PermissionUtils.verifyReadAndWritePermissions((Activity) mContext,Constants.RE_CODE_STORAGE_PERMISSION);
}
if(mConfig.isShowNotification() && !PermissionUtils.isNotificationEnabled(mContext)){
Log.w(Constants.TAG,"Notification permission not enabled.");
}
startDownloadService();
}else{
throw new NullPointerException("Url must not be empty.");
}
}
/**
* 启动下载服务
*/
private void startDownloadService(){
Intent intent = new Intent(mContext, DownloadService.class);
if(mCallback!=null || mHttpManager!=null){//bindService
mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
DownloadService.DownloadBinder binder = ((DownloadService.DownloadBinder)service);
binder.start(mConfig,mHttpManager,mCallback);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
mContext.getApplicationContext().bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
}else{//startService
intent.putExtra(Constants.KEY_UPDATE_CONFIG,mConfig);
mContext.startService(intent);
}
}
/**
* 取消下载
*/
public void stop(){
stopDownloadService();
}
/**
* 停止下载服务
*/
private void stopDownloadService(){
Intent intent = new Intent(mContext, DownloadService.class);
intent.putExtra(Constants.KEY_STOP_DOWNLOAD_SERVICE,true);
mContext.startService(intent);
}
/**
* AppUpdater建造者
*/
public static class Builder{
private UpdateConfig mConfig;
public Builder(){
mConfig = new UpdateConfig();
}
/**
* 设置APK下载地址
* @param url 下载地址
* @return
*/
public Builder setUrl(@NonNull String url){
mConfig.setUrl(url);
return this;
}
/**
* 设置保存的路径,(建议使用默认,不做设置)
* @param path 下载保存的文件路径
* @return
* @deprecated 因为适配Android Q的分区存储所以此方法已弃用不建议再使用
*/
@Deprecated
public Builder setPath(String path){
mConfig.setPath(path);
return this;
}
/**
* 设置保存的文件名
* @param filename 下载的保存的apk文件名 默认优先取url文件名
* @return
*/
public Builder setFilename(String filename){
mConfig.setFilename(filename);
return this;
}
/**
* 设置是否显示通知栏
* @param isShowNotification 是否显示通知栏 默认true
* @return
*/
public Builder setShowNotification(boolean isShowNotification) {
mConfig.setShowNotification(isShowNotification);
return this;
}
/**
* 设置通知ID
* @param notificationId 通知ID
* @return
*/
public Builder setNotificationId(int notificationId) {
mConfig.setNotificationId(notificationId);
return this;
}
/**
* 设置通知渠道ID
* @param channelId 通知渠道ID 默认兼容O
* @return
*/
public Builder setChannelId(String channelId) {
mConfig.setChannelId(channelId);
return this;
}
/**
* 设置通知渠道名称
* @param channelName 通知渠道名称 默认兼容O
* @return
*/
public Builder setChannelName(String channelName) {
mConfig.setChannelName(channelName);
return this;
}
/**
* 设置通知图标
* @param icon 通知栏图标 默认取App的icon
* @return
*/
public Builder setNotificationIcon(@DrawableRes int icon) {
mConfig.setNotificationIcon(icon);
return this;
}
/**
* 设置通知是否震动提示
* @param vibrate 是否震动提示为true时使用通知默认震动Android O(8.0)以上设置只有初次创建channel时有效后续修改属性无效想要重新有效需修改channelId或卸载App重装。
* @return
*/
public Builder setVibrate(boolean vibrate) {
mConfig.setVibrate(vibrate);
return this;
}
/**
* 设置通知是否铃声提示
* @param sound 是否铃声提示为true时使用通知默认铃声Android O(8.0)以上设置只有初次创建channel时有效后续修改属性无效想要重新有效需修改channelId或卸载App重装。
* @return
*/
public Builder setSound(boolean sound) {
mConfig.setSound(sound);
return this;
}
/**
* 设置下载完成后知否自动触发安装APK
* @param isInstallApk 下载完成后是否自动调用安装APK默认true
* @return
*/
public Builder setInstallApk(boolean isInstallApk){
mConfig.setInstallApk(isInstallApk);
return this;
}
/**
* 设置FileProvider的authority
* @param authority FileProvider的authority默认兼容N默认值{@link Context#getPackageName() + ".AppUpdaterFileProvider"}
* @return
*/
public Builder setAuthority(String authority){
mConfig.setAuthority(authority);
return this;
}
/**
* 设置下载时,通知栏是否显示下载百分比
* @param showPercentage 下载时通知栏是否显示百分比
* @return
*/
public Builder setShowPercentage(boolean showPercentage) {
mConfig.setShowPercentage(showPercentage);
return this;
}
/**
* 设置下载失败时,是否支持点击通知栏重新下载。与之相关联的方法{@link #setReDownloads(int)}
* @param reDownload 下载失败时是否支持点击通知栏重新下载默认true
* @return
*/
public Builder setReDownload(boolean reDownload) {
mConfig.setReDownload(reDownload);
return this;
}
/**
* 设置下载失败时,最多重新下载次数。与之相关联的方法{@link #setReDownload(boolean)}
* @param reDownloads 下载失败时是否支持点击通知栏重新下载默认最多重新下载3次
* @return
*/
public Builder setReDownloads(int reDownloads) {
mConfig.setReDownloads(reDownloads);
return this;
}
/**
* 设置要下载APK的versionCode用于优先取缓存时通过versionCode校验APK文件是否一致。
* 缓存校验目前支持两种方式一种是通过versionCode校验即{@link #setVersionCode(Integer)}一种是文件MD5校验即{@link #setApkMD5(String)}。推荐使用MD5校验方式
* 如果两种方式都设置了则只校验MD5
* @param versionCode 为null表示不处理默认不存在则下载存在则重新下载。不为null时表示会优先校验本地是否存在已下载版本号为versionCode的APK。
* 如果存在则不会重新下载(AppUpdater会自动校验packageName一致性)直接取本地APK反之重新下载。
* @return
*/
public Builder setVersionCode(Integer versionCode) {
mConfig.setVersionCode(versionCode);
return this;
}
/**
* 设置APK文件的MD5用于优先取缓存时通过MD5校验文件APK是否一致。
* 缓存校验目前支持两种方式一种是通过versionCode校验即{@link #setVersionCode(Integer)}一种是文件MD5校验即{@link #setApkMD5(String)}。推荐使用MD5校验方式
* 如果两种方式都设置了则只校验MD5
* @param md5 为null表示不处理如果设置了MD5则缓存APK的MD5相同时只下载一次优先取本地缓存
* @return
*/
public Builder setApkMD5(String md5) {
mConfig.setApkMD5(md5);
return this;
}
/**
* 请求头添加参数
* @param key
* @param value
* @return
*/
public Builder addHeader(String key, String value){
mConfig.addHeader(key,value);
return this;
}
/**
* 请求头添加参数
* @param headers
* @return
*/
public Builder addHeader(Map<String,String> headers){
mConfig.addHeader(headers);
return this;
}
/**
* 设置是否自动删除取消下载的文件
* @param deleteCancelFile 是否删除取消下载的文件默认为true
*/
public Builder setDeleteCancelFile(boolean deleteCancelFile){
mConfig.setDeleteCancelFile(deleteCancelFile);
return this;
}
/**
* 是否支持通过删除通知栏来取消下载默认为false
* @param cancelDownload
* @return
*/
public Builder setCancelDownload(boolean cancelDownload){
mConfig.setCancelDownload(cancelDownload);
return this;
}
public AppUpdater build(@NonNull Context context){
return new AppUpdater(context,mConfig);
}
}
}

View File

@@ -1,460 +0,0 @@
package com.web.dmcslot.appdown;
import android.content.Context;
import android.os.Parcel;
import android.os.Parcelable;
import com.web.dmcslot.appdown.constant.Constants;
import java.util.HashMap;
import java.util.Map;
import androidx.annotation.DrawableRes;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class UpdateConfig implements Parcelable {
/**
* APK下载的Url
*/
private String mUrl;
/**
* 保存路径
*/
private String mPath;
/**
* 保存文件名
*/
private String mFilename;
/**
* 是否显示通知栏
*/
private boolean isShowNotification = true;
/**
* 下载完成后是否自动弹出安装
*/
private boolean isInstallApk = true;
/**
* 通知栏图标默认取app图标
*/
private int mNotificationIcon;
/**
* 通知栏ID
*/
private int mNotificationId = Constants.DEFAULT_NOTIFICATION_ID;
/**
* 通知栏渠道ID
*/
private String mChannelId;
/**
* 通知栏渠道名称
*/
private String mChannelName;
/**
* 默认{@link Context#getPackageName() + ".AppUpdaterFileProvider"}
*/
private String mAuthority;
/**
* 下载失败是否支持点击通知栏重新下载
*/
private boolean isReDownload = true;
/**
* 下载失败后,最大重新下载次数
*/
private int reDownloads = 3;
/**
* 是否显示百分比
*/
private boolean isShowPercentage = true;
/**
* 是否震动提示为true时使用通知默认震动
*/
private boolean isVibrate;
/**
* 是否铃声提示,为true时使用通知默认铃声
*/
private boolean isSound;
/**
* 要下载的APK的versionCode
*/
private Integer versionCode;
/**
* 请求头参数
*/
private Map<String,String> mRequestProperty;
/**
* 是否删除取消下载的文件
*/
private boolean isDeleteCancelFile = true;
/**
* 是否支持通过删除通知栏来取消下载
*/
private boolean isCancelDownload = false;
/**
* APK文件的MD5
*/
private String apkMD5;
public UpdateConfig() {
}
public String getUrl() {
return mUrl;
}
/**
* 设置APK下载地址
* @param url 下载地址
*/
public void setUrl(String url) {
this.mUrl = url;
}
public String getPath() {
return mPath;
}
/**
* 设置保存的路径,(建议使用默认,不做设置)
* @param path 下载保存的文件路径
* @return
* @deprecated 因为适配Android Q的分区存储所以此方法已弃用不建议再使用
*/
@Deprecated
public void setPath(String path) {
this.mPath = path;
}
public String getFilename() {
return mFilename;
}
/**
* 设置保存的文件名
* @param filename 下载的保存的apk文件名 默认优先取url文件名
*/
public void setFilename(String filename) {
this.mFilename = filename;
}
public boolean isShowNotification() {
return isShowNotification;
}
/**
* 设置是否显示通知栏
* @param isShowNotification 是否显示通知栏 默认true
*/
public void setShowNotification(boolean isShowNotification) {
this.isShowNotification = isShowNotification;
}
public String getChannelId() {
return mChannelId;
}
/**
* 设置通知渠道ID
* @param channelId 通知渠道ID 默认兼容O
*/
public void setChannelId(String channelId) {
this.mChannelId = channelId;
}
public String getChannelName() {
return mChannelName;
}
/**
* 设置通知渠道名称
* @param channelName 通知渠道名称 默认兼容O
*/
public void setChannelName(String channelName) {
this.mChannelName = channelName;
}
/**
* 设置通知ID
* @param notificationId 通知ID
*/
public void setNotificationId(int notificationId){
this.mNotificationId = notificationId;
}
public int getNotificationId(){
return this.mNotificationId;
}
/**
* 设置通知图标
* @param icon 通知栏图标 默认取App的icon
*/
public void setNotificationIcon(@DrawableRes int icon){
this.mNotificationIcon = icon;
}
public int getNotificationIcon(){
return this.mNotificationIcon;
}
public boolean isInstallApk() {
return isInstallApk;
}
/**
* 设置下载完成后知否自动触发安装APK
* @param isInstallApk 下载完成后是否自动调用安装APK默认true
*/
public void setInstallApk(boolean isInstallApk) {
this.isInstallApk = isInstallApk;
}
public String getAuthority() {
return mAuthority;
}
/**
* 设置FileProvider的authority
* @param authority FileProvider的authority默认兼容N默认值{@link Context#getPackageName() + ".AppUpdaterFileProvider"}
*/
public void setAuthority(String authority) {
this.mAuthority = authority;
}
public boolean isShowPercentage() {
return isShowPercentage;
}
/**
* 设置下载时,通知栏是否显示下载百分比
* @param showPercentage 下载时通知栏是否显示百分比
*/
public void setShowPercentage(boolean showPercentage) {
isShowPercentage = showPercentage;
}
public boolean isReDownload() {
return isReDownload;
}
/**
* 设置下载失败时,是否支持点击通知栏重新下载。与之相关联的方法{@link #setReDownloads(int)}
* @param reDownload 下载失败时是否支持点击通知栏重新下载默认true
*/
public void setReDownload(boolean reDownload) {
isReDownload = reDownload;
}
public int getReDownloads() {
return reDownloads;
}
/**
* 设置下载失败时,最多重新下载次数。与之相关联的方法{@link #setReDownload(boolean)}
* @param reDownloads 下载失败时是否支持点击通知栏重新下载默认最多重新下载3次
*/
public void setReDownloads(int reDownloads) {
this.reDownloads = reDownloads;
}
public boolean isVibrate() {
return isVibrate;
}
/**
* 设置通知是否震动提示
* @param vibrate 是否震动提示为true时使用通知默认震动Android O(8.0)以上设置只有初次创建channel时有效后续修改属性无效想要重新有效需修改channelId或卸载App重装。
*/
public void setVibrate(boolean vibrate) {
isVibrate = vibrate;
}
public boolean isSound() {
return isSound;
}
/**
* 设置通知是否铃声提示
* @param sound 是否铃声提示为true时使用通知默认铃声Android O(8.0)以上设置只有初次创建channel时有效后续修改属性无效想要重新有效需修改channelId或卸载App重装。
*/
public void setSound(boolean sound) {
isSound = sound;
}
public Integer getVersionCode(){
return versionCode;
}
/**
* 设置要下载APK的versionCode用于优先取缓存时通过versionCode校验APK文件是否一致。
* 缓存校验目前支持两种方式一种是通过versionCode校验即{@link #setVersionCode(Integer)}一种是文件MD5校验即{@link #setApkMD5(String)}。推荐使用MD5校验方式
* 如果两种方式都设置了则只校验MD5
* @param versionCode 为null表示不处理默认不存在则下载存在则重新下载。不为null时表示会优先校验本地是否存在已下载版本号为versionCode的APK。
* 如果存在则不会重新下载(AppUpdater会自动校验packageName一致性)直接取本地APK反之重新下载。
*/
public void setVersionCode(Integer versionCode){
this.versionCode = versionCode;
}
public Map<String, String> getRequestProperty() {
return mRequestProperty;
}
/**
* 设置APK文件的MD5用于优先取缓存时通过MD5校验文件APK是否一致。
* 缓存校验目前支持两种方式一种是通过versionCode校验即{@link #setVersionCode(Integer)}一种是文件MD5校验即{@link #setApkMD5(String)}。推荐使用MD5校验方式
* 如果两种方式都设置了则只校验MD5
* @param md5 为null表示不处理如果设置了MD5则缓存APK的MD5相同时只下载一次优先取本地缓存
*/
public void setApkMD5(String md5){
this.apkMD5 = md5;
}
public String getApkMD5(){
return apkMD5;
}
/**
* 请求头添加参数
* @param key
* @param value
*/
public void addHeader(String key, String value){
initRequestProperty();
mRequestProperty.put(key,value);
}
/**
* 请求头添加参数
* @param headers
*/
public void addHeader(Map<String,String> headers){
initRequestProperty();
mRequestProperty.putAll(headers);
}
private void initRequestProperty(){
if(mRequestProperty == null){
mRequestProperty = new HashMap<>();
}
}
public boolean isDeleteCancelFile() {
return isDeleteCancelFile;
}
/**
* 设置是否自动删除取消下载的文件
* @param deleteCancelFile 是否删除取消下载的文件默认为true
*/
public void setDeleteCancelFile(boolean deleteCancelFile) {
isDeleteCancelFile = deleteCancelFile;
}
public boolean isCancelDownload(){
return isCancelDownload;
}
/**
* 是否支持通过删除通知栏来取消下载默认为false
* @param cancelDownload
*/
public void setCancelDownload(boolean cancelDownload) {
isCancelDownload = cancelDownload;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.mUrl);
dest.writeString(this.mPath);
dest.writeString(this.mFilename);
dest.writeByte(this.isShowNotification ? (byte) 1 : (byte) 0);
dest.writeByte(this.isInstallApk ? (byte) 1 : (byte) 0);
dest.writeInt(this.mNotificationIcon);
dest.writeInt(this.mNotificationId);
dest.writeString(this.mChannelId);
dest.writeString(this.mChannelName);
dest.writeString(this.mAuthority);
dest.writeByte(this.isReDownload ? (byte) 1 : (byte) 0);
dest.writeInt(this.reDownloads);
dest.writeByte(this.isShowPercentage ? (byte) 1 : (byte) 0);
dest.writeByte(this.isVibrate ? (byte) 1 : (byte) 0);
dest.writeByte(this.isSound ? (byte) 1 : (byte) 0);
dest.writeValue(this.versionCode);
if(mRequestProperty!=null){
dest.writeInt(this.mRequestProperty.size());
for (Map.Entry<String, String> entry : this.mRequestProperty.entrySet()) {
dest.writeString(entry.getKey());
dest.writeString(entry.getValue());
}
}else{
dest.writeInt(0);
}
dest.writeByte(this.isDeleteCancelFile ? (byte) 1 : (byte) 0);
dest.writeByte(this.isCancelDownload ? (byte) 1 : (byte) 0);
dest.writeString(this.apkMD5);
}
protected UpdateConfig(Parcel in) {
this.mUrl = in.readString();
this.mPath = in.readString();
this.mFilename = in.readString();
this.isShowNotification = in.readByte() != 0;
this.isInstallApk = in.readByte() != 0;
this.mNotificationIcon = in.readInt();
this.mNotificationId = in.readInt();
this.mChannelId = in.readString();
this.mChannelName = in.readString();
this.mAuthority = in.readString();
this.isReDownload = in.readByte() != 0;
this.reDownloads = in.readInt();
this.isShowPercentage = in.readByte() != 0;
this.isVibrate = in.readByte() != 0;
this.isSound = in.readByte() != 0;
this.versionCode = (Integer) in.readValue(Integer.class.getClassLoader());
int mRequestPropertySize = in.readInt();
this.mRequestProperty = new HashMap<>(mRequestPropertySize);
for (int i = 0; i < mRequestPropertySize; i++) {
String key = in.readString();
String value = in.readString();
this.mRequestProperty.put(key, value);
}
this.isDeleteCancelFile = in.readByte() != 0;
this.isCancelDownload = in.readByte() != 0;
this.apkMD5 = in.readString();
}
public static final Creator<UpdateConfig> CREATOR = new Creator<UpdateConfig>() {
@Override
public UpdateConfig createFromParcel(Parcel source) {
return new UpdateConfig(source);
}
@Override
public UpdateConfig[] newArray(int size) {
return new UpdateConfig[size];
}
};
}

View File

@@ -1,26 +0,0 @@
package com.web.dmcslot.appdown.callback;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public abstract class AppUpdateCallback implements UpdateCallback {
@Override
public void onDownloading(boolean isDownloading) {
}
@Override
public void onStart(String url) {
}
@Override
public void onError(Exception e) {
}
@Override
public void onCancel() {
}
}

View File

@@ -1,46 +0,0 @@
package com.web.dmcslot.appdown.callback;
import java.io.File;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public interface UpdateCallback {
/**
* 最开始调用(在onStart之前调用)
* @param isDownloading true 表示已经在下载false表示当前未开始下载即将开始下载
*/
void onDownloading(boolean isDownloading);
/**
* 开始
*/
void onStart(String url);
/**
* 加载进度…
* @param progress
* @param total
* @param isChange 进度百分比是否有改变,(主要可以用来过滤无用的刷新,从而降低刷新频率)
*/
void onProgress(long progress,long total,boolean isChange);
/**
* 完成
* @param file
*/
void onFinish(File file);
/**
* 错误
* @param e
*/
void onError(Exception e);
/**
* 取消
*/
void onCancel();
}

View File

@@ -1,32 +0,0 @@
package com.web.dmcslot.appdown.constant;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public final class Constants {
public static final String TAG = "AppUpdater";
public static final String KEY_UPDATE_CONFIG = "app_update_config";
public static final int DEFAULT_NOTIFICATION_ID = 0x66;
public static final String DEFAULT_NOTIFICATION_CHANNEL_ID = "0x66";
public static final String DEFAULT_NOTIFICATION_CHANNEL_NAME = "AppUpdater";
public static final String KEY_STOP_DOWNLOAD_SERVICE = "stop_download_service";
public static final String KEY_RE_DOWNLOAD = "app_update_re_download";
public static final int RE_CODE_STORAGE_PERMISSION = 0x66;
public static final int NONE = -1;
public static final String DEFAULT_FILE_PROVIDER = ".appdown.provider.AppUpdaterFileProvider";
public static final String DEFAULT_DIR = "apk";
public static boolean isUpdate = true;
}

View File

@@ -1,240 +0,0 @@
package com.web.dmcslot.appdown.http;
import android.os.AsyncTask;
import android.os.Build;
import com.web.dmcslot.appdown.util.LogUtils;
import com.web.dmcslot.appdown.util.SSLSocketFactoryUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import javax.net.ssl.HttpsURLConnection;
import androidx.annotation.Nullable;
/**
* HttpManager使用 {@link HttpURLConnection} 实现的 {@link IHttpManager}
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class HttpManager implements IHttpManager {
private static final int HTTP_TEMP_REDIRECT = 307;
private static final int HTTP_PERM_REDIRECT = 308;
private static final int DEFAULT_TIME_OUT = 20000;
private int mTimeout;
private DownloadTask mDownloadTask;
private static volatile HttpManager INSTANCE;
public static HttpManager getInstance(){
if(INSTANCE == null){
synchronized (HttpManager.class){
if(INSTANCE == null){
INSTANCE = new HttpManager();
}
}
}
return INSTANCE;
}
private HttpManager(){
this(DEFAULT_TIME_OUT);
}
/**
* HttpManager对外暴露。如果没有特殊需求推荐使用{@link HttpManager#getInstance()}
*/
public HttpManager(int timeout){
this.mTimeout = timeout;
}
@Override
public void download(String url, String path, String filename, @Nullable Map<String,String> requestProperty, DownloadCallback callback) {
mDownloadTask = new DownloadTask(url, path, filename, mTimeout, requestProperty, callback);
mDownloadTask.execute();
}
@Override
public void cancel() {
if(mDownloadTask != null){
mDownloadTask.isCancel = true;
}
}
/**
* 异步下载任务
*/
private static class DownloadTask extends AsyncTask<Void,Long,File> {
private String url;
private String path;
private String filename;
private Map<String,String> requestProperty;
private DownloadCallback callback;
private Exception exception;
private int timeout;
private volatile boolean isCancel;
public DownloadTask(String url, String path, String filename, int timeout, @Nullable Map<String,String> requestProperty, DownloadCallback callback){
this.url = url;
this.path = path;
this.filename = filename;
this.timeout = timeout;
this.callback = callback;
this.requestProperty = requestProperty;
}
private File download(String url) throws Exception{
HttpURLConnection connect = (HttpURLConnection)new URL(url).openConnection();
connect.setRequestMethod("GET");
connect.setRequestProperty("Accept-Encoding", "identity");
connect.setReadTimeout(timeout);
connect.setConnectTimeout(timeout);
if(requestProperty != null){
for(Map.Entry<String,String> entry : requestProperty.entrySet()){
connect.setRequestProperty(entry.getKey(),entry.getValue());
}
}
connect.connect();
LogUtils.d("Content-Type:" + connect.getContentType());
int responseCode = connect.getResponseCode();
switch (responseCode){
case HttpURLConnection.HTTP_OK: {
InputStream is = connect.getInputStream();
long length = connect.getContentLength();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
length = connect.getContentLengthLong();
}
LogUtils.d( "contentLength:" + length);
long progress = 0;
byte[] buffer = new byte[8192];
int len;
File file = new File(path, filename);
FileOutputStream fos = new FileOutputStream(file);
while ((len = is.read(buffer)) != -1) {
if (isCancel) {
cancel(true);
break;
}
fos.write(buffer, 0, len);
progress += len;
// 更新进度
if (length > 0) {
publishProgress(progress, length);
}
}
fos.flush();
fos.close();
is.close();
connect.disconnect();
if(progress <= 0 && length <= 0){
throw new IllegalStateException(String.format("contentLength = %d",length));
}
return file;
}
case HttpURLConnection.HTTP_MULT_CHOICE:
case HttpURLConnection.HTTP_MOVED_PERM:
case HttpURLConnection.HTTP_MOVED_TEMP:
case HttpURLConnection.HTTP_SEE_OTHER:
case HTTP_TEMP_REDIRECT:
case HTTP_PERM_REDIRECT: {// 重定向
String redirectUrl = connect.getHeaderField("Location");
LogUtils.d("redirectUrl = " + redirectUrl);
connect.disconnect();
return download(redirectUrl);
}
default://连接失败
throw new ConnectException(String.format("responseCode = %d",responseCode));
}
}
@Override
protected File doInBackground(Void... voids) {
try{
HttpsURLConnection.setDefaultSSLSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactoryUtils.createTrustAllHostnameVerifier());
return download(url);
} catch (Exception e) {
this.exception = e;
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(callback != null){
callback.onStart(url);
}
}
@Override
protected void onPostExecute(File file) {
super.onPostExecute(file);
if(callback != null){
if(file != null){
callback.onFinish(file);
}else{
callback.onError(exception);
}
}
}
@Override
protected void onProgressUpdate(Long... values) {
super.onProgressUpdate(values);
if(callback != null){
if(!isCancelled()){
callback.onProgress(values[0],values[1]);
}
}
}
@Override
protected void onCancelled() {
super.onCancelled();
if(callback != null){
callback.onCancel();
}
}
}
}

View File

@@ -1,64 +0,0 @@
package com.web.dmcslot.appdown.http;
import java.io.File;
import java.io.Serializable;
import java.util.Map;
import androidx.annotation.Nullable;
/**
* IHttpManager 默认提供 {@link HttpManager} 和 {@link OkHttpManager} 两种实现。
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public interface IHttpManager {
/**
* 下载
* @param url
* @param path
* @param filename
* @param requestProperty
* @param callback
*/
void download(String url, String path, String filename, @Nullable Map<String,String> requestProperty, DownloadCallback callback);
/**
* 取消下载
*/
void cancel();
interface DownloadCallback extends Serializable{
/**
* 开始
* @param url
*/
void onStart(String url);
/**
* 加载进度…
* @param progress
* @param total
*/
void onProgress(long progress,long total);
/**
* 完成
* @param file
*/
void onFinish(File file);
/**
* 错误
* @param e
*/
void onError(Exception e);
/**
* 取消
*/
void onCancel();
}
}

View File

@@ -1,235 +0,0 @@
package com.web.dmcslot.appdown.http;
import android.os.AsyncTask;
import com.web.dmcslot.appdown.util.LogUtils;
import com.web.dmcslot.appdown.util.SSLSocketFactoryUtils;
import org.apache.http.conn.ssl.SSLSocketFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ConnectException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* OkHttpManager使用 {@link OkHttpClient} 实现的 {@link IHttpManager}
* <p>使用 OkHttpManager 时必须依赖 OkHttp 库
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class OkHttpManager implements IHttpManager {
private static final int DEFAULT_TIME_OUT = 20000;
private OkHttpClient okHttpClient;
private DownloadTask mDownloadTask;
private static volatile OkHttpManager INSTANCE;
public static OkHttpManager getInstance(){
if(INSTANCE == null){
synchronized (HttpManager.class){
if(INSTANCE == null){
INSTANCE = new OkHttpManager();
}
}
}
return INSTANCE;
}
private OkHttpManager(){
this(DEFAULT_TIME_OUT);
}
/**
* HttpManager对外暴露。如果没有特殊需求推荐使用{@link HttpManager#getInstance()}
* @param timeout 超时时间,单位:毫秒
*/
public OkHttpManager(int timeout){
this(new OkHttpClient.Builder()
.readTimeout(timeout, TimeUnit.MILLISECONDS)
.connectTimeout(timeout, TimeUnit.MILLISECONDS)
.sslSocketFactory(SSLSocketFactoryUtils.createSSLSocketFactory(),SSLSocketFactoryUtils.createTrustAllManager())
.hostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)
.build());
}
/**
* HttpManager对外暴露推荐使用{@link HttpManager#getInstance()}
* @param okHttpClient {@link OkHttpClient}
*/
public OkHttpManager(@NonNull OkHttpClient okHttpClient){
this.okHttpClient = okHttpClient;
}
@Override
public void download(String url,final String path,final String filename, @Nullable Map<String, String> requestProperty,final DownloadCallback callback) {
mDownloadTask = new DownloadTask(okHttpClient, url, path, filename, requestProperty, callback);
mDownloadTask.execute();
}
@Override
public void cancel() {
if(mDownloadTask != null){
mDownloadTask.isCancel = true;
}
}
/**
* 异步下载任务
*/
private static class DownloadTask extends AsyncTask<Void,Long,File> {
private String url;
private String path;
private String filename;
private Map<String,String> requestProperty;
private DownloadCallback callback;
private Exception exception;
private OkHttpClient okHttpClient;
private volatile boolean isCancel;
public DownloadTask(OkHttpClient okHttpClient,String url, String path, String filename ,@Nullable Map<String,String> requestProperty, DownloadCallback callback){
this.okHttpClient = okHttpClient;
this.url = url;
this.path = path;
this.filename = filename;
this.callback = callback;
this.requestProperty = requestProperty;
}
@Override
protected File doInBackground(Void... voids) {
try{
Request.Builder builder = new Request.Builder()
.url(url)
.addHeader("Accept-Encoding", "identity")
.get();
if(requestProperty!=null){
for(Map.Entry<String,String> entry : requestProperty.entrySet()){
builder.addHeader(entry.getKey(),entry.getValue());
}
}
Call call = okHttpClient.newCall(builder.build());
Response response = call.execute();
if(response.isSuccessful()){
InputStream is = response.body().byteStream();
long length = response.body().contentLength();
LogUtils.d("contentLength:" + length);
long progress = 0;
byte[] buffer = new byte[8192];
int len;
File file = new File(path,filename);
FileOutputStream fos = new FileOutputStream(file);
while ((len = is.read(buffer)) != -1){
if(isCancel){
if(call != null){
call.cancel();
}
cancel(true);
break;
}
fos.write(buffer,0,len);
progress += len;
// 更新进度
if(length > 0){
publishProgress(progress,length);
}
}
fos.flush();
fos.close();
is.close();
response.close();
if(progress <= 0 && length <= 0){
throw new IllegalStateException(String.format("contentLength = %d",length));
}
return file;
}else {// 连接失败
throw new ConnectException(String.format("responseCode = %d",response.code()));
}
}catch (Exception e){
this.exception = e;
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
if(callback != null){
callback.onStart(url);
}
}
@Override
protected void onPostExecute(File file) {
super.onPostExecute(file);
if(callback != null){
if(file != null){
callback.onFinish(file);
}else{
callback.onError(exception);
}
}
}
@Override
protected void onProgressUpdate(Long... values) {
super.onProgressUpdate(values);
if(callback != null){
if(!isCancelled()){
callback.onProgress(values[0],values[1]);
}
}
}
@Override
protected void onCancelled() {
super.onCancelled();
if(callback != null){
callback.onCancel();
}
}
}
}

View File

@@ -1,25 +0,0 @@
package com.web.dmcslot.appdown.notify;
import android.content.Context;
import com.web.dmcslot.appdown.UpdateConfig;
import java.io.File;
import androidx.annotation.DrawableRes;
/**
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public interface INotification {
void onStart(Context context, int notifyId, String channelId, String channelName, @DrawableRes int icon, CharSequence title, CharSequence content, boolean isVibrate, boolean isSound, boolean isCancelDownload);
void onProgress(Context context, int notifyId, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, int progress, int size, boolean isCancelDownload);
void onFinish(Context context, int notifyId, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, File file, String authority);
void onError(Context context, int notifyId, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, boolean isReDownload, UpdateConfig config);
void onCancel(Context context, int notifyId);
}

View File

@@ -1,38 +0,0 @@
package com.web.dmcslot.appdown.notify;
import android.content.Context;
import com.web.dmcslot.appdown.UpdateConfig;
import com.web.dmcslot.appdown.util.NotificationUtils;
import java.io.File;
/**
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class NotificationImpl implements INotification {
@Override
public void onStart(Context context, int notifyId, String channelId, String channelName, int icon, CharSequence title, CharSequence content, boolean isVibrate, boolean isSound, boolean isCancelDownload) {
NotificationUtils.showStartNotification(context, notifyId, channelId, channelName, icon, title, content, isVibrate, isSound, isCancelDownload);
}
@Override
public void onProgress(Context context, int notifyId, String channelId, int icon, CharSequence title, CharSequence content, int progress, int size, boolean isCancelDownload) {
NotificationUtils.showProgressNotification(context, notifyId, channelId, icon, title, content, progress, size, isCancelDownload);
}
@Override
public void onFinish(Context context, int notifyId, String channelId, int icon, CharSequence title, CharSequence content, File file, String authority) {
NotificationUtils.showFinishNotification(context, notifyId, channelId, icon, title, content, file, authority);
}
@Override
public void onError(Context context, int notifyId, String channelId, int icon, CharSequence title, CharSequence content, boolean isReDownload, UpdateConfig config) {
NotificationUtils.showErrorNotification(context, notifyId, channelId, icon, title, content, isReDownload, config);
}
@Override
public void onCancel(Context context, int notifyId) {
NotificationUtils.cancelNotification(context, notifyId);
}
}

View File

@@ -1,11 +0,0 @@
package com.web.dmcslot.appdown.provider;
import androidx.core.content.FileProvider;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class AppUpdaterFileProvider extends FileProvider {
}

View File

@@ -1,456 +0,0 @@
package com.web.dmcslot.appdown.service;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Build;
import android.os.IBinder;
import android.text.TextUtils;
import com.web.dmcslot.R;
import com.web.dmcslot.appdown.UpdateConfig;
import com.web.dmcslot.appdown.callback.UpdateCallback;
import com.web.dmcslot.appdown.constant.Constants;
import com.web.dmcslot.appdown.http.HttpManager;
import com.web.dmcslot.appdown.http.IHttpManager;
import com.web.dmcslot.appdown.notify.INotification;
import com.web.dmcslot.appdown.notify.NotificationImpl;
import com.web.dmcslot.appdown.util.AppUtils;
import com.web.dmcslot.appdown.util.LogUtils;
import java.io.File;
import java.util.Locale;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
/**
* 下载服务
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class DownloadService extends Service {
private DownloadBinder mDownloadBinder = new DownloadBinder();
/**
* 是否在下载,防止重复下载。
*/
private boolean isDownloading;
/**
* 失败后重新下载次数
*/
private int mCount = 0;
/**
* Http管理器
*/
private IHttpManager mHttpManager;
private File mApkFile;
private Context getContext(){
return this;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(intent != null){
boolean isStop = intent.getBooleanExtra(Constants.KEY_STOP_DOWNLOAD_SERVICE,false);
if(isStop){
stopDownload();
} else if(!isDownloading){
//是否实通过通知栏触发重复下载
boolean isReDownload = intent.getBooleanExtra(Constants.KEY_RE_DOWNLOAD,false);
if(isReDownload){
mCount++;
}
//获取配置信息
UpdateConfig config = intent.getParcelableExtra(Constants.KEY_UPDATE_CONFIG);
startDownload(config,null,null, new NotificationImpl());
}else{
LogUtils.w("Please do not duplicate downloads.");
}
}
return super.onStartCommand(intent, flags, startId);
}
//----------------------------------------
/**
* 开始下载
* @param config
* @param httpManager
* @param callback
*/
public void startDownload(@NonNull UpdateConfig config,@Nullable IHttpManager httpManager,@Nullable UpdateCallback callback, @Nullable INotification notification){
if(callback != null){
callback.onDownloading(isDownloading);
}
if(isDownloading){
LogUtils.w("Please do not duplicate downloads.");
return;
}
String url = config.getUrl();
String path = config.getPath();
String filename = config.getFilename();
//如果保存路径为空则使用缓存路径
if(TextUtils.isEmpty(path)){
path = getCacheFilesDir(getContext());
}
File dirFile = new File(path);
if(!dirFile.exists()){
dirFile.mkdirs();
}
//如果文件名为空则使用路径
if(TextUtils.isEmpty(filename)){
filename = AppUtils.getAppFullName(getContext(),url,getResources().getString(R.string.app_name));
}
mApkFile = new File(path, filename);
if(mApkFile.exists()){//文件是否存在
Integer versionCode = config.getVersionCode();
String apkMD5 = config.getApkMD5();
//是否存在相同的apk
boolean isExistApk = false;
if(!TextUtils.isEmpty(apkMD5)){//如果存在MD5则优先校验MD5
LogUtils.d(String.format(Locale.getDefault(),"UpdateConfig.apkMD5:%s",apkMD5));
isExistApk = AppUtils.checkFileMD5(mApkFile,apkMD5);
}else if(versionCode != null){//如果存在versionCode则校验versionCode
LogUtils.d(String.format(Locale.getDefault(),"UpdateConfig.versionCode:%d",versionCode));
isExistApk = AppUtils.apkExists(getContext(),versionCode,mApkFile);
}
if(isExistApk){
//本地已经存在要下载的APK
LogUtils.d("CacheFile:" + mApkFile);
if(config.isInstallApk()){
String authority = config.getAuthority();
if(TextUtils.isEmpty(authority)){//如果为空则默认
authority = AppUtils.getFileProviderAuthority(getContext());
}
AppUtils.installApk(getContext(), mApkFile, authority);
}
if(callback != null){
callback.onFinish(mApkFile);
}
stopService();
return;
}
//删除旧文件
mApkFile.delete();
}
LogUtils.d("File:" + mApkFile);
mHttpManager = httpManager != null ? httpManager : HttpManager.getInstance();
IHttpManager.DownloadCallback downloadCallback = new AppDownloadCallback(getContext(),this, config, mApkFile, callback, notification);
mHttpManager.download(url,path,filename,config.getRequestProperty(), downloadCallback);
}
/**
* 停止下载
*/
public void stopDownload(){
if(mHttpManager != null){
mHttpManager.cancel();
}
}
/**
* 获取缓存路径
* @param context
* @return
*/
private String getCacheFilesDir(Context context) {
File[] files = ContextCompat.getExternalFilesDirs(context, Constants.DEFAULT_DIR);
if(files != null && files.length > 0){
return files[0].getAbsolutePath();
}
File externalFilesDir = context.getExternalFilesDir(Constants.DEFAULT_DIR);
if(externalFilesDir != null){
return externalFilesDir.getAbsolutePath();
}
return new File(context.getFilesDir(), Constants.DEFAULT_DIR).getAbsolutePath();
}
/**
* 停止服务
*/
private void stopService(){
mCount = 0;
stopSelf();
}
//---------------------------------------- DownloadCallback
/**
* App下载回调接口
*/
public static class AppDownloadCallback implements IHttpManager.DownloadCallback {
private Context context;
private DownloadService downloadService;
public UpdateConfig config;
private boolean isShowNotification;
private int notifyId;
private String channelId;
private String channelName;
private int notificationIcon;
private boolean isInstallApk;
private String authority;
private boolean isShowPercentage;
private boolean isReDownload;
private boolean isDeleteCancelFile;
private boolean isCancelDownload;
private UpdateCallback callback;
private INotification notification;
/**
* 最后更新进度,用来降频刷新
*/
private int lastProgress;
/**
* 最后进度更新时间,用来降频刷新
*/
private long lastTime;
/**
* APK文件
*/
private File apkFile;
private AppDownloadCallback(Context context, DownloadService downloadService, UpdateConfig config, File apkFile, UpdateCallback callback, INotification notification){
this.context = context;
this.downloadService = downloadService;
this.config = config;
this.apkFile = apkFile;
this.callback = callback;
this.notification = notification;
this.isShowNotification = config.isShowNotification();
this.notifyId = config.getNotificationId();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
this.channelId = TextUtils.isEmpty(config.getChannelId()) ? Constants.DEFAULT_NOTIFICATION_CHANNEL_ID : config.getChannelId();
this.channelName = TextUtils.isEmpty(config.getChannelName()) ? Constants.DEFAULT_NOTIFICATION_CHANNEL_NAME : config.getChannelName();
}
if(config.getNotificationIcon() <= 0){
this.notificationIcon = AppUtils.getAppIcon(context);
}else{
this.notificationIcon = config.getNotificationIcon();
}
this.isInstallApk = config.isInstallApk();
this.authority = config.getAuthority();
if(TextUtils.isEmpty(config.getAuthority())){//如果为空则默认
authority = AppUtils.getFileProviderAuthority(context);
}
this.isShowPercentage = config.isShowPercentage();
this.isDeleteCancelFile = config.isDeleteCancelFile();
this.isCancelDownload = config.isCancelDownload();
//支持下载失败时重新下载,当重新下载次数不超过限制时才被允许
this.isReDownload = config.isReDownload() && downloadService.mCount < config.getReDownloads();
}
@Override
public void onStart(String url) {
LogUtils.i("url:" + url);
downloadService.isDownloading = true;
lastProgress = 0;
if(isShowNotification && notification != null){
String title="";
if(Constants.isUpdate){
title = getString(R.string.app_updater_start_notification_title);
}else{
title = getString(R.string.app_updater_start_notification_title_2);
}
notification.onStart(context,notifyId,channelId,channelName,notificationIcon,title,getString(R.string.app_updater_start_notification_content),config.isVibrate(),config.isSound(),isCancelDownload);
}
if(callback != null){
callback.onStart(url);
}
}
@Override
public void onProgress(long progress, long total) {
boolean isChange = false;
long curTime = System.currentTimeMillis();
if(lastTime + 200 < curTime || progress == total) {//降低更新频率
lastTime = curTime;
int currProgress = Math.round(progress * 1.0f / total * 100.0f);
if(currProgress != lastProgress){//百分比改变了才更新
isChange = true;
lastProgress = currProgress;
String percentage = currProgress + "%";
LogUtils.i(String.format(Locale.getDefault(),"%s \t(%d/%d)", percentage, progress, total));
if(isShowNotification && notification != null) {
String content = context.getString(R.string.app_updater_progress_notification_content);
if (isShowPercentage) {
content += percentage;
}
String title="";
if(Constants.isUpdate){
title = getString(R.string.app_updater_progress_notification_title);
}else{
title = getString(R.string.app_updater_progress_notification_title_2);
}
notification.onProgress(context,notifyId, channelId, notificationIcon, title, content, currProgress, 100,isCancelDownload);
}
}
}
if(callback != null){
callback.onProgress(progress,total,isChange);
}
}
@Override
public void onFinish(File file) {
LogUtils.d("File:" + file);
downloadService.isDownloading = false;
if(isShowNotification && notification != null){
notification.onFinish(context,notifyId,channelId,notificationIcon,getString(R.string.app_updater_finish_notification_title),getString(R.string.app_updater_finish_notification_content),file,authority);
}
if(isInstallApk){
AppUtils.installApk(context,file,authority);
}
if(callback != null){
callback.onFinish(file);
}
downloadService.stopService();
}
@Override
public void onError(Exception e) {
LogUtils.w(e.getMessage());
downloadService.isDownloading = false;
if(isShowNotification && notification != null){
String content = isReDownload ? getString(R.string.app_updater_error_notification_content_re_download) : getString(R.string.app_updater_error_notification_content);
notification.onError(context,notifyId,channelId,notificationIcon,getString(R.string.app_updater_error_notification_title),content,isReDownload,config);
}
if(callback != null){
callback.onError(e);
}
if(!isReDownload){
downloadService.stopService();
}
}
@Override
public void onCancel() {
LogUtils.d("Cancel download.");
downloadService.isDownloading = false;
if(isShowNotification && notification != null){
notification.onCancel(context,notifyId);
}
if(callback != null){
callback.onCancel();
}
if(isDeleteCancelFile && apkFile != null){
apkFile.delete();
}
downloadService.stopService();
}
private String getString(@StringRes int resId){
return context.getString(resId);
}
}
@Override
public void onDestroy() {
isDownloading = false;
mHttpManager = null;
super.onDestroy();
}
//---------------------------------------- Binder
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mDownloadBinder;
}
/**
* 提供绑定服务的方式进行下载
*/
public class DownloadBinder extends Binder {
/**
* 开始下载
* @param config {@link UpdateConfig}
*/
public void start(@NonNull UpdateConfig config){
start(config,null);
}
/**
* 开始下载
* @param config {@link UpdateConfig}
* @param callback {@link UpdateCallback}
*/
public void start(@NonNull UpdateConfig config, @Nullable UpdateCallback callback){
start(config,null, callback);
}
/**
* 开始下载
* @param config {@link UpdateConfig}
* @param httpManager {@link IHttpManager}
* @param callback {@link UpdateCallback}
*/
public void start(@NonNull UpdateConfig config, @Nullable IHttpManager httpManager, @Nullable UpdateCallback callback){
start(config, httpManager, callback, new NotificationImpl());
}
/**
* 开始下载
* @param config {@link UpdateConfig}
* @param httpManager {@link IHttpManager}
* @param callback {@link UpdateCallback}
* @param notification {@link INotification}
*/
public void start(@NonNull UpdateConfig config, @Nullable IHttpManager httpManager, @Nullable UpdateCallback callback,@NonNull INotification notification){
startDownload(config, httpManager, callback, notification);
}
}
}

View File

@@ -1,264 +0,0 @@
package com.web.dmcslot.appdown.util;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.AssetFileDescriptor;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.Log;
import androidx.core.content.FileProvider;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import com.web.dmcslot.appdown.constant.Constants;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public final class AppUtils {
private AppUtils(){
throw new AssertionError();
}
/**
* 通过url获取App的全名称
* @param context
* @return AppName.apk
*/
public static String getAppFullName(Context context,String url,String defaultName){
if(url.endsWith(".apk")){
String apkName = url.substring(url.lastIndexOf("/") + 1);
if(apkName.length() <= 64){
return apkName;
}
}
String filename = getAppName(context);
Log.d(Constants.TAG, "AppName:" + filename);
if(TextUtils.isEmpty(filename)){
filename = defaultName;
}
if(filename.endsWith(".apk")){
return filename;
}
return String.format("%s.apk",filename);
}
/**
* 获取包信息
* @param context
* @return
* @throws PackageManager.NameNotFoundException
*/
public static PackageInfo getPackageInfo(Context context) throws PackageManager.NameNotFoundException {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
return packageInfo;
}
/**
* 通过APK路径获取包信息
* @param context
* @param archiveFilePath
* @return
*/
public static PackageInfo getPackageInfo(Context context, String archiveFilePath) {
PackageManager packageManager = context.getPackageManager();
PackageInfo packageInfo = packageManager.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
return packageInfo;
}
/**
* 获取App的名称
*/
public static String getAppName(Context context) {
try{
int labelRes = getPackageInfo(context).applicationInfo.labelRes;
return context.getResources().getString(labelRes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取App的图标
* @param context
* @return
*/
public static int getAppIcon(Context context){
try{
return getPackageInfo(context).applicationInfo.icon;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
/**
* 安装apk
* @param context
* @param file
*/
public static void installApk(Context context,File file,String authority){
Intent intent = getInstallIntent(context,file,authority);
context.startActivity(intent);
}
/**
* 获取安装Intent
* @param context
* @param file
* @param authority
* @return
*/
public static Intent getInstallIntent(Context context,File file,String authority){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_DEFAULT);
Uri uriData;
String type = "application/vnd.android.package-archive";
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
uriData = FileProvider.getUriForFile(context, authority, file);
}else{
uriData = Uri.fromFile(file);
}
intent.setDataAndType(uriData, type);
return intent;
}
/**
* APK是否存在
* @param context
* @param versionCode
* @param file
* @return
* @throws Exception
*/
public static boolean apkExists(Context context,int versionCode,File file){
if(file != null && file.exists()){
String packageName = context.getPackageName();
PackageInfo packageInfo = AppUtils.getPackageInfo(context,file.getAbsolutePath());
if(packageInfo != null){// 比对versionCode
Log.d(Constants.TAG,String.format("ApkVersionCode:%d",packageInfo.versionCode));
if(versionCode == packageInfo.versionCode){
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if(applicationInfo != null && packageName.equals(applicationInfo.packageName)){//比对packageName
return true;
}
}
}
}
return false;
}
/**
* 判断文件是否存在
* @param context
* @param path
* @return
*/
public static boolean isAndroidQFileExists(Context context,String path){
return isAndroidQFileExists(context,new File(path));
}
/**
* 判断文件是否存在
* @param context
* @param file
* @return
*/
public static boolean isAndroidQFileExists(Context context,File file){
AssetFileDescriptor descriptor = null;
ContentResolver contentResolver = context.getContentResolver();
try {
Uri uri = Uri.fromFile(file);
descriptor = contentResolver.openAssetFileDescriptor(uri, "r");
if (descriptor == null) {
return false;
} else {
close(descriptor);
}
return true;
} catch (FileNotFoundException e) {
}finally {
close(descriptor);
}
return false;
}
/**
* 校验文件MD5
* @param file
* @param md5
* @return
*/
public static boolean checkFileMD5(File file,String md5){
String fileMD5 = getFileMD5(file);
Log.d(Constants.TAG,"FileMD5:"+ fileMD5);
if(!TextUtils.isEmpty(md5)){
return md5.equalsIgnoreCase(fileMD5);
}
return false;
}
/**
* 获取文件MD5
* @param file
* @return
*/
public static String getFileMD5(File file){
try {
FileInputStream fis = new FileInputStream(file);
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1){
messageDigest.update(buffer,0,length);
}
BigInteger bigInteger = new BigInteger(1,messageDigest.digest());
return bigInteger.toString(16);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getFileProviderAuthority(Context context){
return context.getPackageName() + Constants.DEFAULT_FILE_PROVIDER;
}
/**
* 关闭
* @param descriptor
*/
private static void close(AssetFileDescriptor descriptor){
if(descriptor != null){
try {
descriptor.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -1,316 +0,0 @@
/*
Copyright © 2015, 2016 Jenly Yu <a href="mailto:jenly1314@gmail.com">Jenly</a>
Licensed 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 com.web.dmcslot.appdown.util;
import android.util.Log;
import java.util.Locale;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class LogUtils {
public static final String TAG = "AppUpdater";
public static final String VERTICAL = "|";
/** 是否显示Log日志 */
private static boolean isShowLog = true;
/** Log日志优先权 */
private static int priority = 1;
/**
* Priority constant for the println method;use System.out.println
*/
public static final int PRINTLN = 1;
/**
* Priority constant for the println method; use Log.v.
*/
public static final int VERBOSE = 2;
/**
* Priority constant for the println method; use Log.d.
*/
public static final int DEBUG = 3;
/**
* Priority constant for the println method; use Log.i.
*/
public static final int INFO = 4;
/**
* Priority constant for the println method; use Log.w.
*/
public static final int WARN = 5;
/**
* Priority constant for the println method; use Log.e.
*/
public static final int ERROR = 6;
/**
* Priority constant for the println method.use Log.wtf.
*/
public static final int ASSERT = 7;
public static final String TAG_FORMAT = "%s.%s(%s:%d)";
private LogUtils(){
throw new AssertionError();
}
public static void setShowLog(boolean isShowLog) {
LogUtils.isShowLog = isShowLog;
}
public static boolean isShowLog() {
return isShowLog;
}
public static int getPriority() {
return priority;
}
public static void setPriority(int priority) {
LogUtils.priority = priority;
}
/**
* 根据堆栈生成TAG
* @return TAG|className.methodName(fileName:lineNumber)
*/
private static String generateTag(StackTraceElement caller) {
String tag = TAG_FORMAT;
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(Locale.getDefault(),tag,callerClazzName, caller.getMethodName(),caller.getFileName(),caller.getLineNumber());
return new StringBuilder().append(TAG).append(VERTICAL).append(tag).toString();
}
/**
* 获取堆栈
* @param n
* n=0 VMStack
* n=1 Thread
* n=3 CurrentStack
* n=4 CallerStack
* ...
* @return
*/
public static StackTraceElement getStackTraceElement(int n) {
return Thread.currentThread().getStackTrace()[n];
}
/**
* 获取调用方的堆栈TAG
* @return
*/
private static String getCallerStackLogTag(){
return generateTag(getStackTraceElement(5));
}
/**
*
* @param t
* @return
*/
private static String getStackTraceString(Throwable t){
return Log.getStackTraceString(t);
}
// -----------------------------------Log.v
/**
* Log.v
* @param msg
*/
public static void v(String msg) {
if (isShowLog && priority <= VERBOSE)
Log.v(getCallerStackLogTag(), String.valueOf(msg));
}
public static void v(Throwable t) {
if (isShowLog && priority <= VERBOSE)
Log.v(getCallerStackLogTag(), getStackTraceString(t));
}
public static void v(String msg,Throwable t) {
if (isShowLog && priority <= VERBOSE)
Log.v(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------Log.d
/**
* Log.d
* @param msg
*/
public static void d(String msg) {
if (isShowLog && priority <= DEBUG)
Log.d(getCallerStackLogTag(), String.valueOf(msg));
}
public static void d(Throwable t) {
if (isShowLog && priority <= DEBUG)
Log.d(getCallerStackLogTag(), getStackTraceString(t));
}
public static void d(String msg,Throwable t) {
if (isShowLog && priority <= DEBUG)
Log.d(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------Log.i
/**
* Log.i
* @param msg
*/
public static void i(String msg) {
if (isShowLog && priority <= INFO)
Log.i(getCallerStackLogTag(), String.valueOf(msg));
}
public static void i(Throwable t) {
if (isShowLog && priority <= INFO)
Log.i(getCallerStackLogTag(), getStackTraceString(t));
}
public static void i(String msg,Throwable t) {
if (isShowLog && priority <= INFO)
Log.i(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------Log.w
/**
* Log.w
* @param msg
*/
public static void w(String msg) {
if (isShowLog && priority <= WARN)
Log.w(getCallerStackLogTag(), String.valueOf(msg));
}
public static void w(Throwable t) {
if (isShowLog && priority <= WARN)
Log.w(getCallerStackLogTag(), getStackTraceString(t));
}
public static void w(String msg,Throwable t) {
if (isShowLog && priority <= WARN)
Log.w(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------Log.e
/**
* Log.e
* @param msg
*/
public static void e(String msg) {
if (isShowLog && priority <= ERROR)
Log.e(getCallerStackLogTag(), String.valueOf(msg));
}
public static void e(Throwable t) {
if (isShowLog && priority <= ERROR)
Log.e(getCallerStackLogTag(), getStackTraceString(t));
}
public static void e(String msg,Throwable t) {
if (isShowLog && priority <= ERROR)
Log.e(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------Log.wtf
/**
* Log.wtf
* @param msg
*/
public static void wtf(String msg) {
if (isShowLog && priority <= ASSERT)
Log.wtf(getCallerStackLogTag(), String.valueOf(msg));
}
public static void wtf(Throwable t) {
if (isShowLog && priority <= ASSERT)
Log.wtf(getCallerStackLogTag(), getStackTraceString(t));
}
public static void wtf(String msg,Throwable t) {
if (isShowLog && priority <= ASSERT)
Log.wtf(getCallerStackLogTag(), String.valueOf(msg), t);
}
// -----------------------------------System.out.print
/**
* System.out.print
*
* @param msg
*/
public static void print(String msg) {
if (isShowLog && priority <= PRINTLN)
System.out.print(msg);
}
public static void print(Object obj) {
if (isShowLog && priority <= PRINTLN)
System.out.print(obj);
}
// -----------------------------------System.out.printf
/**
* System.out.printf
*
* @param msg
*/
public static void printf(String msg) {
if (isShowLog && priority <= PRINTLN)
System.out.printf(msg);
}
// -----------------------------------System.out.println
/**
* System.out.println
*
* @param msg
*/
public static void println(String msg) {
if (isShowLog && priority <= PRINTLN)
System.out.println(msg);
}
public static void println(Object obj) {
if (isShowLog && priority <= PRINTLN)
System.out.println(obj);
}
}

View File

@@ -1,261 +0,0 @@
package com.web.dmcslot.appdown.util;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import androidx.annotation.DrawableRes;
import androidx.annotation.RequiresApi;
import androidx.core.app.NotificationCompat;
import java.io.File;
import com.web.dmcslot.appdown.UpdateConfig;
import com.web.dmcslot.appdown.constant.Constants;
import com.web.dmcslot.appdown.service.DownloadService;
/**
* @author <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public class NotificationUtils {
private NotificationUtils(){
throw new AssertionError();
}
/**
* 显示开始下载时的通知
* @param notifyId
* @param channelId
* @param channelName
* @param icon
* @param title
* @param content
*/
public static void showStartNotification(Context context, int notifyId,String channelId, String channelName,@DrawableRes int icon,CharSequence title,CharSequence content,boolean isVibrate,boolean isSound, boolean isCancelDownload){
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
createNotificationChannel(context,channelId,channelName,isVibrate,isSound);
}
NotificationCompat.Builder builder = buildNotification(context,channelId,icon,title,content);
builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
if(isVibrate && isSound){
builder.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND);
}else if(isVibrate){
builder.setDefaults(Notification.DEFAULT_VIBRATE);
}else if(isSound){
builder.setDefaults(Notification.DEFAULT_SOUND);
}
if(isCancelDownload){
Intent intent = new Intent(context, DownloadService.class);
intent.putExtra(Constants.KEY_STOP_DOWNLOAD_SERVICE,true);
PendingIntent deleteIntent = PendingIntent.getService(context, notifyId,intent, getPendingIntentFlags(PendingIntent.FLAG_CANCEL_CURRENT));
builder.setDeleteIntent(deleteIntent);
}
Notification notification = builder.build();
if(isCancelDownload){
notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
}else{
notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONLY_ALERT_ONCE;
}
notifyNotification(context,notifyId,notification);
}
/**
* 显示下载中的通知(更新进度)
* @param notifyId
* @param channelId
* @param icon
* @param title
* @param content
* @param progress
* @param size
*/
public static void showProgressNotification(Context context, int notifyId,String channelId,@DrawableRes int icon,CharSequence title,CharSequence content,int progress,int size, boolean isCancelDownload){
NotificationCompat.Builder builder = buildNotification(context,channelId,icon,title,content,progress,size);
if(isCancelDownload){
Intent intent = new Intent(context, DownloadService.class);
intent.putExtra(Constants.KEY_STOP_DOWNLOAD_SERVICE,true);
PendingIntent deleteIntent = PendingIntent.getService(context, notifyId, intent, getPendingIntentFlags(PendingIntent.FLAG_CANCEL_CURRENT));
builder.setDeleteIntent(deleteIntent);
}
Notification notification = builder.build();
if(isCancelDownload){
notification.flags = Notification.FLAG_ONLY_ALERT_ONCE;
}else{
notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONLY_ALERT_ONCE;
}
notifyNotification(context,notifyId,notification);
}
/**
* 显示下载完成时的通知(点击安装)
* @param notifyId
* @param channelId
* @param icon
* @param title
* @param content
* @param file
*/
public static void showFinishNotification(Context context, int notifyId, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, File file, String authority){
cancelNotification(context,notifyId);
NotificationCompat.Builder builder = buildNotification(context,channelId,icon,title,content);
builder.setAutoCancel(true);
Intent intent = AppUtils.getInstallIntent(context,file,authority);
PendingIntent clickIntent = PendingIntent.getActivity(context, notifyId, intent, getPendingIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT));
builder.setContentIntent(clickIntent);
Notification notification = builder.build();
notification.flags = Notification.FLAG_AUTO_CANCEL;
notifyNotification(context,notifyId,notification);
}
/**
* 现在下载失败通知
* @param context
* @param notifyId
* @param channelId
* @param icon
* @param title
* @param content
* @param isReDownload
* @param config
*/
public static void showErrorNotification(Context context, int notifyId, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, boolean isReDownload, UpdateConfig config){
NotificationCompat.Builder builder = buildNotification(context,channelId,icon,title,content);
builder.setAutoCancel(true);
int flag = getPendingIntentFlags(PendingIntent.FLAG_UPDATE_CURRENT);
if(isReDownload){// 重新下载
Intent intent = new Intent(context, DownloadService.class);
intent.putExtra(Constants.KEY_RE_DOWNLOAD,true);
intent.putExtra(Constants.KEY_UPDATE_CONFIG,config);
PendingIntent clickIntent = PendingIntent.getService(context, notifyId,intent, flag);
builder.setContentIntent(clickIntent);
}else{
PendingIntent clickIntent = PendingIntent.getService(context, notifyId, new Intent(), flag);
builder.setContentIntent(clickIntent);
}
Notification notification = builder.build();
notification.flags = Notification.FLAG_AUTO_CANCEL;
notifyNotification(context,notifyId,notification);
}
/**
* 显示通知信息(非第一次)
* @param notifyId
* @param channelId
* @param icon
* @param title
* @param content
*/
public static void showNotification(Context context, int notifyId,String channelId,@DrawableRes int icon,CharSequence title,CharSequence content,boolean isAutoCancel){
NotificationCompat.Builder builder = buildNotification(context,channelId,icon,title,content);
builder.setAutoCancel(isAutoCancel);
Notification notification = builder.build();
notification.flags = Notification.FLAG_AUTO_CANCEL;
notifyNotification(context,notifyId,notification);
}
/**
* 取消通知
* @param notifyId
*/
public static void cancelNotification(Context context, int notifyId){
getNotificationManager(context).cancel(notifyId);
}
/**
* 获取通知管理器
* @return
*/
public static NotificationManager getNotificationManager(Context context){
return (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
}
/**
* 创建一个通知渠道兼容0以上版本
* @param channelId
* @param channelName
*/
@RequiresApi(api = Build.VERSION_CODES.O)
public static void createNotificationChannel(Context context, String channelId, String channelName,boolean isVibrate,boolean isSound){
NotificationChannel channel = new NotificationChannel(channelId,channelName, NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(isVibrate);
if(!isSound){
channel.setSound(null,null);
}
getNotificationManager(context).createNotificationChannel(channel);
}
/**
* 构建一个通知构建器
* @param channelId
* @param icon
* @param title
* @param content
* @return
*/
private static NotificationCompat.Builder buildNotification(Context context, String channelId, @DrawableRes int icon,CharSequence title,CharSequence content){
return buildNotification(context,channelId,icon,title,content,Constants.NONE,Constants.NONE);
}
/**
* 构建一个通知构建器
* @param channelId
* @param icon
* @param title
* @param content
* @param progress
* @param size
* @return
*/
private static NotificationCompat.Builder buildNotification(Context context, String channelId, @DrawableRes int icon, CharSequence title, CharSequence content, int progress, int size){
NotificationCompat.Builder builder = new NotificationCompat.Builder(context,channelId);
builder.setSmallIcon(icon);
builder.setContentTitle(title);
builder.setContentText(content);
builder.setOngoing(true);
if(progress != Constants.NONE && size != Constants.NONE){
builder.setProgress(size,progress,false);
}
return builder;
}
/**
* 更新通知栏
* @param id
* @param notification
*/
private static void notifyNotification(Context context, int id, Notification notification){
getNotificationManager(context).notify(id,notification);
}
/**
* 获取 PendingIntent 的 flags
* @param flag
* @return
*/
private static int getPendingIntentFlags(int flag){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return flag | PendingIntent.FLAG_IMMUTABLE;
}
return flag;
}
}

View File

@@ -1,92 +0,0 @@
package com.web.dmcslot.appdown.util;
import android.Manifest;
import android.app.Activity;
import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public final class PermissionUtils {
private PermissionUtils() {
throw new AssertionError();
}
/**
* 校验权限
*
* @param activity
* @param requestCode
* @return
*/
public static boolean verifyReadAndWritePermissions(@NonNull Activity activity, int requestCode) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
int readResult = checkPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
int writeResult = checkPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (readResult != PackageManager.PERMISSION_GRANTED || writeResult != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE}, requestCode);
return false;
}
}
return true;
}
public static int checkPermission(@NonNull Activity activity, @NonNull String permission) {
return ActivityCompat.checkSelfPermission(activity, permission);
}
/**
* 获取通知权限
*
* @param context
*/
public static boolean isNotificationEnabled(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager.getImportance() == NotificationManager.IMPORTANCE_NONE) {
return false;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
String CHECK_OP_NO_THROW = "checkOpNoThrow";
String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
ApplicationInfo appInfo = context.getApplicationInfo();
String pkg = context.getApplicationContext().getPackageName();
int uid = appInfo.uid;
try {
Class appOpsClass = Class.forName(AppOpsManager.class.getName());
Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);
Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
int value = (Integer) opPostNotificationValue.get(Integer.class);
return ((Integer) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
return true;
}
}

View File

@@ -1,168 +0,0 @@
package com.web.dmcslot.appdown.util;
import android.content.Context;
import android.text.TextUtils;
import androidx.annotation.RawRes;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public final class SSLSocketFactoryUtils {
private static final String[] VERIFY_HOST_NAME = new String[]{};
private SSLSocketFactoryUtils() {
throw new AssertionError();
}
public static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory sslSocketFactory = null;
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, getTrustAllManager(), new SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
} catch (Exception e) {
}
return sslSocketFactory;
}
public static X509TrustManager createTrustAllManager() {
X509TrustManager tm = null;
try {
tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
//do nothing
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
//do nothing
}
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};
} catch (Exception e) {
e.printStackTrace();
}
return tm;
}
public static TrustAllHostnameVerifier createTrustAllHostnameVerifier() {
return new TrustAllHostnameVerifier();
}
public static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
if (TextUtils.isEmpty(hostname)) {
return false;
}
return !Arrays.asList(VERIFY_HOST_NAME).contains(hostname);
}
}
/**
* @param context
* @param keyServerStoreID
* @return
*/
public static SSLSocketFactory createSSLSocketFactory(Context context, @RawRes int keyServerStoreID) {
InputStream trustStream = context.getResources().openRawResource(keyServerStoreID);
return createSSLSocketFactory(trustStream);
}
/**
* @param certificates
* @return
*/
public static SSLSocketFactory createSSLSocketFactory(InputStream... certificates) {
SSLSocketFactory sSLSocketFactory = null;
if (sSLSocketFactory == null) {
synchronized (SSLSocketFactoryUtils.class) {
if (sSLSocketFactory == null) {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, getTrustManager(certificates), new SecureRandom());
sSLSocketFactory = sslContext.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return sSLSocketFactory;
}
/**
* 获得指定流中的服务器端证书库
*
* @param certificates
* @return
*/
public static TrustManager[] getTrustManager(InputStream... certificates) {
try {
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
int index = 0;
for (InputStream certificate : certificates) {
if (certificate == null) {
continue;
}
Certificate certificate1;
try {
certificate1 = certificateFactory.generateCertificate(certificate);
} finally {
certificate.close();
}
String certificateAlias = Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, certificate1);
}
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory
.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
return trustManagerFactory.getTrustManagers();
} catch (Exception e) {
e.printStackTrace();
}
return getTrustAllManager();
}
/**
* 获得信任所有服务器端证书库
*/
public static TrustManager[] getTrustAllManager() {
return new TrustManager[]{createTrustAllManager()};
}
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:startColor="#f6f6f6"
android:endColor="#f6f6f6"/>
</shape>

View File

@@ -1,351 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity"
android:background="@color/white"
android:id="@+id/homePage">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/big_v"
android:visibility="visible"
android:background="@android:color/transparent"
>
<TextView
android:id="@+id/inputText"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="6"
android:padding="10dp"
android:textSize="40dp"
android:textColor="@color/black"
android:gravity="center_vertical" />
<TextView
android:id="@+id/outputText"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="end"
android:textColor="@color/black"
android:textAlignment="textEnd"
android:autoSizeTextType="uniform"
android:textSize="80dp" />
<LinearLayout
android:id="@+id/allBtn"
android:layout_weight="3"
android:background="#EEEEEE"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="AC"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_clear"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="←"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_backspace"
>
</Button>
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="3"
android:background="@android:color/transparent"
android:text="÷"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_divide"
>
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:id="@+id/btn_7"
android:text="7"
android:textColor="@color/black"
android:textSize="35dp">
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:id="@+id/btn_8"
android:text="8"
android:textColor="@color/black"
android:textSize="35dp"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:id="@+id/btn_9"
android:text="9"
android:textColor="@color/black"
android:textSize="35dp"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="×"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_multiply"
>
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="4"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_4"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="5"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_5"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="6"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_6"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="-"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_subtract"
>
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="1"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_1"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="2"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_2"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="3"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_3"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="+"
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_add"
>
</Button>
</LinearLayout>
<LinearLayout
android:id="@+id/fiveLow"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text=""
android:textSize="35dp"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="0"
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_0"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="."
android:textColor="@color/black"
android:textSize="35dp"
android:id="@+id/btn_point"
>
</Button>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="="
android:textSize="35dp"
android:textColor="#e67e22"
android:id="@+id/btn_equal"
>
</Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -1,387 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
android:keepScreenOn="true"
android:orientation="vertical">
<com.web.dmcslot.StatusLayout
android:id="@+id/top_vvvv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/top_vvvv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/top_vvvv1"
android:background="@color/white"
android:visibility="gone">
<ImageView
android:id="@+id/back_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_action_back" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:src="@mipmap/app_logo" />
</RelativeLayout>
<!-- webview 全屏状态 start -->
<!-- <androidx.constraintlayout.widget.ConstraintLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_below="@id/top_vvvv">-->
<!-- <androidx.constraintlayout.widget.ConstraintLayout-->
<!-- android:id="@+id/layouttop_config"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center_vertical"-->
<!-- android:visibility="gone"-->
<!-- app:layout_constraintTop_toTopOf="parent">-->
<!-- <ImageView-->
<!-- android:id="@+id/iv_topconfig"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:background="@color/color_red"-->
<!-- android:minHeight="80dp"-->
<!-- app:layout_constraintTop_toTopOf="parent" />-->
<!-- <LinearLayout-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:orientation="horizontal"-->
<!-- android:layout_marginBottom="10dp"-->
<!-- app:layout_constraintBottom_toBottomOf="@+id/iv_topconfig">-->
<!-- <TextView-->
<!-- android:id="@+id/home"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:gravity="center"-->
<!-- android:paddingStart="5dp"-->
<!-- android:paddingEnd="5dp"-->
<!-- android:text="Home"-->
<!-- android:textColor="@android:color/white"-->
<!-- android:textSize="20sp"-->
<!-- android:textStyle="bold" />-->
<!-- <TextView-->
<!-- android:id="@+id/tv_other"-->
<!-- android:layout_width="wrap_content"-->
<!-- android:layout_height="wrap_content"-->
<!-- android:layout_marginStart="10dp"-->
<!-- android:gravity="center"-->
<!-- android:paddingStart="5dp"-->
<!-- android:paddingEnd="5dp"-->
<!-- android:text="Miss AV"-->
<!-- android:textColor="@android:color/white"-->
<!-- android:textSize="20sp"-->
<!-- android:textStyle="bold" />-->
<!-- </LinearLayout>-->
<!-- </androidx.constraintlayout.widget.ConstraintLayout>-->
<!-- <com.tencent.smtt.sdk.WebView-->
<!-- android:id="@+id/webview"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="0dp"-->
<!-- app:layout_constraintBottom_toTopOf="@+id/bottom_v"-->
<!-- app:layout_constraintTop_toBottomOf="@+id/layouttop_config"-->
<!-- app:layout_goneMarginTop="40dp" />-->
<!-- <View-->
<!-- android:id="@+id/bottom_v"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="0dp"-->
<!-- app:layout_constraintBottom_toBottomOf="parent" />-->
<!-- </androidx.constraintlayout.widget.ConstraintLayout>-->
<!-- webview 全屏状态 end -->
<com.tencent.smtt.sdk.WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv" />
<LinearLayout
android:id="@+id/layoutError"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="vertical"
android:visibility="gone">
<ProgressBar
android:id="@+id/progress_error"
style="@android:style/Widget.ProgressBar.Large"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="10dp"
android:text="@string/agentweb_loading" />
<TextView
android:id="@+id/errormsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textColor="#999999"
android:textSize="16sp" />
</LinearLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/bt_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="50dp"
android:layout_marginBottom="80dp"
android:visibility="gone"
app:backgroundTint="@color/dialog_bg"
app:srcCompat="@mipmap/ic_menu" />
<androidx.cardview.widget.CardView
android:id="@+id/bt_otherapp"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_marginTop="120dp"
android:layout_marginRight="20dp"
android:visibility="gone"
app:cardBackgroundColor="@color/dialog_bg"
app:cardCornerRadius="50dp">
<ImageView
android:id="@+id/iv_otherApp"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:src="@mipmap/ic_shousuo" />
</androidx.cardview.widget.CardView>
<!-- 分享的app -->
<LinearLayout
android:id="@+id/layout_otherapp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/bt_otherapp"
android:layout_alignStart="@+id/bt_otherapp"
android:layout_alignEnd="@+id/bt_otherapp"
android:layout_marginTop="10dp"
android:gravity="center_horizontal"
android:orientation="vertical"
android:visibility="visible">
<androidx.cardview.widget.CardView
android:id="@+id/iv_home"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@android:color/white"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_hometo" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/iv_link"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:id="@+id/iv_linkbg"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv_link"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:gravity="center"
android:text="MISV"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp"
android:textStyle="bold" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/iv_facebook"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@android:color/white"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_facebook" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/iv_whatsapp"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@android:color/white"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_whatsapp" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/iv_tel"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@android:color/white"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_tel" />
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:id="@+id/bt_notifyitem"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginTop="10dp"
android:background="@android:color/black"
android:visibility="gone"
app:cardCornerRadius="50dp"
app:cardElevation="0dp">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_email" />
</androidx.cardview.widget.CardView>
</LinearLayout>
<androidx.cardview.widget.CardView
android:id="@+id/bt_notify"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="20dp"
android:layout_marginTop="160dp"
android:visibility="gone"
app:cardBackgroundColor="@color/black"
app:cardCornerRadius="50dp">
<ImageView
android:id="@+id/iv_notify"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="center"
android:src="@mipmap/ic_email" />
</androidx.cardview.widget.CardView>
<LinearLayout
android:id="@+id/show_top_ly"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv"
android:background="@color/white"
android:orientation="vertical"
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="4"
android:gravity="center">
<com.web.dmcslot.CircleImageView
android:id="@+id/show_top_v"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/app_logo"
android:visibility="visible"
app:ease_border_color="#EEEEEE"
app:ease_border_width="1dp"
app:es_shape_type="round" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="6"
android:gravity="center">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:indeterminateDrawable="@drawable/pass_word_bg1" />
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/videoContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentRight="true"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"
android:indeterminateDrawable="@drawable/pass_word_bg2"
android:visibility="gone" />
</RelativeLayout>

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.web.dmcslot.StatusLayout
android:id="@+id/top_vvvv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/top_vvvv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/top_vvvv1"
android:background="@color/white"
android:visibility="gone">
<ImageView
android:id="@+id/back_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_action_back" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:src="@mipmap/app_logo" />
</RelativeLayout>
<LinearLayout
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_below="@id/top_vvvv" />
<LinearLayout
android:id="@+id/show_top_ly"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv"
android:background="@color/white"
android:orientation="vertical"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="4"
android:gravity="center">
<com.web.dmcslot.CircleImageView
android:id="@+id/show_top_v"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/app_logo"
android:visibility="visible"
app:ease_border_color="#EEEEEE"
app:ease_border_width="1dp"
app:es_shape_type="round" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="6"
android:gravity="center">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/pass_word_bg1"
android:layout_centerHorizontal="true" />
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/videoContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="20dp"
android:layout_height="20dp"
android:visibility="gone"
android:layout_marginRight="15dp"
android:layout_marginTop="10dp"
android:layout_alignParentRight="true"
android:indeterminateDrawable="@drawable/pass_word_bg2"
/>
</RelativeLayout>

View File

@@ -1,95 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/top_vvvv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:visibility="visible">
<ImageView
android:id="@+id/back_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_action_back" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:src="@mipmap/app_logo" />
</RelativeLayout>
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_vvvv"
android:scaleType="centerCrop"
android:visibility="gone" />
<com.tencent.smtt.sdk.WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv"
android:visibility="gone" />
<LinearLayout
android:id="@+id/show_top_ly"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv"
android:background="@color/white"
android:orientation="vertical"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="4"
android:gravity="center">
<com.web.dmcslot.CircleImageView
android:id="@+id/show_top_v"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/app_logo"
android:visibility="visible"
app:ease_border_color="#EEEEEE"
app:ease_border_width="1dp"
app:es_shape_type="round" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="6"
android:gravity="center">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:indeterminateDrawable="@drawable/pass_word_bg1" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>

View File

@@ -1,43 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/top_vvvv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:visibility="visible">
<ImageView
android:id="@+id/back_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_action_back" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"
android:text="@string/app_notify_title"
android:textColor="@color/dialog_bg"
android:textSize="16sp" />
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_nofity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/top_vvvv" />
</RelativeLayout>

View File

@@ -1,294 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/homePage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/white"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:layout_weight="6">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#333333"
android:text="@string/qsrlwmm_txt"
android:textSize="20dp">
</TextView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_1"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_2"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_3"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_4"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_5"/>
<TextView
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp"
android:gravity="center"
android:textSize="20sp"
android:textColor="#333333"
android:background="@drawable/pass_word_bg"
android:id="@+id/password_6"/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/allBtn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE"
android:layout_weight="4"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/btn_7"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="7"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_8"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="8"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_9"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="9"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal">
<Button
android:id="@+id/btn_4"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="4"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_5"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="5"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_6"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="6"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:id="@+id/btn_1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="1"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="2"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="3"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
</LinearLayout>
<LinearLayout
android:id="@+id/fiveLow"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="horizontal"
>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text=""
android:textColor="#e67e22"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_0"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="0"
android:textColor="@color/black"
android:textSize="25dp">
</Button>
<Button
android:id="@+id/btn_equal"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="DEL"
android:textColor="#e67e22"
android:textSize="25dp">
</Button>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical">
<com.web.dmcslot.StatusLayout
android:id="@+id/top_vvvv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:visibility="gone" />
<RelativeLayout
android:id="@+id/top_vvvv"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_below="@id/top_vvvv1"
android:background="@color/white"
android:visibility="gone">
<ImageView
android:id="@+id/back_iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_action_back" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerInParent="true"
android:src="@mipmap/app_logo" />
</RelativeLayout>
<com.tencent.smtt.sdk.WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv" />
<LinearLayout
android:id="@+id/show_top_ly"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/top_vvvv"
android:background="@color/white"
android:orientation="vertical"
android:visibility="visible">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="4"
android:gravity="center">
<com.web.dmcslot.CircleImageView
android:id="@+id/show_top_v"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/app_logo"
android:visibility="visible"
app:ease_border_color="#EEEEEE"
app:ease_border_width="1dp"
app:es_shape_type="round" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="6"
android:gravity="center">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminateDrawable="@drawable/pass_word_bg1"
android:layout_centerHorizontal="true" />
</LinearLayout>
</LinearLayout>
<FrameLayout
android:id="@+id/videoContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="20dp"
android:layout_height="20dp"
android:visibility="gone"
android:layout_marginRight="15dp"
android:layout_marginTop="10dp"
android:layout_alignParentRight="true"
android:indeterminateDrawable="@drawable/pass_word_bg2"
/>
</RelativeLayout>

View File

@@ -1,228 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg3"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="144dp"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/layout_top"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/ic_dialog_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="15dp"
android:layout_marginEnd="15dp"
android:tint="@color/white"
android:src="@mipmap/ic_close" />
<TextView
android:id="@+id/content_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="25dp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:text="@string/app_bankinfo_title"
android:textColor="@color/dialog_textcolor"
android:textSize="18sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layout_bankinfo_name"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/layout_top"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_bankinfo_name"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:text="@string/app_bankinfo_name"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<EditText
android:id="@+id/inputname_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginStart="10dp"
android:layout_toRightOf="@+id/tv_bankinfo_name"
android:background="@drawable/input_bg"
android:gravity="center"
android:hint="@string/app_bankinfo_name_hint"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layout_bankinfo_country"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/layout_bankinfo_name"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_bankinfo_country"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:text="@string/app_bankinfo_bankcountry"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<TextView
android:id="@+id/inputcountry_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginStart="10dp"
android:layout_toRightOf="@+id/tv_bankinfo_country"
android:drawableEnd="@mipmap/ic_pull_down"
android:background="@drawable/input_bg"
android:gravity="center"
android:paddingEnd="10dp"
android:hint="@string/app_bankinfo_bankcountry_hint"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layout_bankcountry"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/layout_bankinfo_country"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_bank_name"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:drawablePadding="10dp"
android:text="@string/app_bankinfo_bankname"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<TextView
android:id="@+id/inputbankname_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_gravity="center_horizontal"
android:layout_marginStart="10dp"
android:layout_toEndOf="@+id/tv_bank_name"
android:background="@drawable/input_bg"
android:drawableRight="@mipmap/ic_pull_down"
android:gravity="center"
android:hint="@string/app_bankinfo_bankname_hint"
android:inputType="number"
android:lineSpacingExtra="4dp"
android:paddingEnd="10dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/layout_bankinfo_code"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_below="@+id/layout_bankcountry"
android:layout_marginStart="10dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_bank_code"
android:layout_width="90dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:text="@string/app_bankinfo_code"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<EditText
android:id="@+id/inputcode_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginStart="10dp"
android:layout_toRightOf="@+id/tv_bank_code"
android:background="@drawable/input_bg"
android:gravity="center"
android:hint="@string/app_bankinfo_code_hint"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
</RelativeLayout>
<TextView
android:id="@+id/sumbit_tv"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_below="@+id/layout_bankinfo_code"
android:layout_marginStart="10dp"
android:layout_marginTop="70dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="50dp"
android:background="@drawable/shape_btn_bg"
android:gravity="center"
android:text="@string/sure_txt"
android:textColor="@android:color/white"
android:textSize="16sp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_bankname"
android:layout_width="match_parent"
android:layout_height="220dp"
android:layout_marginBottom="10dp"
android:layout_below="@+id/layout_bankcountry"
android:background="@color/dialog_bg"
android:visibility="gone"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_bankcountry"
android:layout_width="match_parent"
android:layout_height="260dp"
android:layout_below="@+id/layout_bankinfo_country"
android:layout_marginBottom="20dp"
android:background="@color/dialog_bg"
android:visibility="gone" />
</RelativeLayout>
</LinearLayout>

View File

@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg3"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="285dp"
android:layout_height="wrap_content"
android:minHeight="144dp"
android:orientation="vertical">
<TextView
android:id="@+id/content_tv"
android:layout_width="245dp"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:layout_marginBottom="30dp"
android:layout_weight="1"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:textColor="@color/white"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="62dp"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/cancel_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/cancel_txt"
android:textColor="@color/white"
android:textSize="16sp" />
<View
android:id="@+id/line_v"
android:layout_width="0.5dp"
android:layout_height="42dp"
android:background="@color/white" />
<TextView
android:id="@+id/sumbit_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/sure_txt"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</LinearLayout>

View File

@@ -1,89 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg3"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="285dp"
android:layout_height="wrap_content"
android:minHeight="144dp"
android:orientation="vertical">
<TextView
android:id="@+id/content_tv"
android:layout_width="245dp"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_weight="1"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:text="@string/app_tishi"
android:textColor="@color/white"
android:textSize="16sp" />
<EditText
android:id="@+id/input_tv"
android:layout_width="245dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="30dp"
android:layout_weight="1"
android:background="@drawable/input_bg"
android:gravity="center"
android:hint="@string/app_hint"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="62dp"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/cancel_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/cancel_txt"
android:textColor="@color/white"
android:textSize="16sp" />
<View
android:id="@+id/line_v"
android:layout_width="0.5dp"
android:layout_height="42dp"
android:background="@color/white" />
<TextView
android:id="@+id/sumbit_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/sure_txt"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</LinearLayout>

View File

@@ -1,105 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg3"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="144dp"
android:orientation="vertical">
<ImageView
android:id="@+id/ic_dialog_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginTop="15dp"
android:layout_marginEnd="10dp"
android:tint="@color/white"
android:src="@mipmap/ic_close" />
<TextView
android:id="@+id/content_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="30dp"
android:gravity="center"
android:textColor="@color/dialog_textcolor"
android:textSize="18sp" />
<RelativeLayout
android:id="@+id/layout_balance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/content_tv"
android:layout_marginTop="15dp"
android:visibility="gone">
<TextView
android:id="@+id/balance_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_marginStart="10dp"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<TextView
android:id="@+id/totalearnings_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
</RelativeLayout>
<LinearLayout
android:id="@+id/layout_empty"
android:layout_width="match_parent"
android:layout_height="360dp"
android:gravity="center"
android:orientation="vertical"
android:visibility="visible">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:tint="@color/dialog_textcolor"
android:src="@mipmap/ic_empty" />
<TextView
android:id="@+id/tv_nodata"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/layout_balance"
android:layout_marginTop="15dp"
android:layout_marginBottom="20dp"
android:text="@string/app_nodata"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_list"
android:layout_width="match_parent"
android:layout_height="360dp"
android:layout_below="@+id/layout_balance"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@color/dialog_bg"
android:visibility="visible" />
</RelativeLayout>
</LinearLayout>

View File

@@ -1,121 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_dialog_bg3"
android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="285dp"
android:layout_height="wrap_content"
android:minHeight="144dp"
android:orientation="vertical">
<TextView
android:id="@+id/content_tv"
android:layout_width="245dp"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_weight="1"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:text="@string/app_withdrawapply_title"
android:textStyle="bold"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:id="@+id/balance_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_gravity="center_vertical"
android:layout_marginStart="20dp"
android:layout_weight="1"
android:gravity="left|center_vertical"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_records"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="20dp"
android:layout_weight="1"
android:gravity="right|center_vertical"
android:text="@string/app_withdrawtitle"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
</LinearLayout>
<EditText
android:id="@+id/input_tv"
android:layout_width="245dp"
android:layout_height="45dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:layout_marginBottom="30dp"
android:layout_weight="1"
android:background="@drawable/input_bg"
android:gravity="center"
android:hint="@string/app_withdraw_apply_hint"
android:inputType="numberDecimal"
android:lineSpacingExtra="4dp"
android:textColor="@color/dialog_textcolor"
android:textColorHint="#BCBCBC"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#D8D8D8" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="62dp"
android:layout_alignParentBottom="true"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/cancel_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/cancel_txt"
android:textColor="@color/white"
android:textSize="16sp" />
<View
android:id="@+id/line_v"
android:layout_width="0.5dp"
android:layout_height="42dp"
android:background="#d8d8d8" />
<TextView
android:id="@+id/sumbit_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="@string/sure_txt"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</LinearLayout>

View File

@@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@drawable/shape_dialog_bg2"
android:gravity="bottom"
android:orientation="vertical">
<TextView
android:id="@+id/share"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="@string/app_share"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog_input_bg" />
<TextView
android:id="@+id/check"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="@string/app_invitetitle"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog_input_bg" />
<TextView
android:id="@+id/withdraw"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="@string/app_withdrawtitle"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog_input_bg" />
<TextView
android:id="@+id/withdraw_apply"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="@string/app_withdrawapply_title"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog_input_bg" />
<TextView
android:id="@+id/bankinfo"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:text="@string/app_bankinfo_title"
android:textColor="@color/dialog_textcolor"
android:textSize="20sp" />
</LinearLayout>

View File

@@ -1,22 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_invitecode"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="@color/dialog_input_bg" />
</LinearLayout>

View File

@@ -1,146 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:gravity="center_vertical"
android:orientation="vertical"
tools:ignore="MissingDefaultResource">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/big_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/notify_imagecolor"
android:paddingStart="10dp"
android:paddingEnd="10dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@mipmap/ic_notifylogo"
app:layout_constraintBottom_toBottomOf="@+id/tv_msg_type"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/tv_msg_type" />
<TextView
android:id="@+id/tv_msg_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:background="@drawable/shape_notify_typebg"
android:paddingStart="10dp"
android:paddingTop="2dp"
android:paddingEnd="10dp"
android:paddingBottom="2dp"
android:textColor="@android:color/white"
android:textSize="12sp"
android:textStyle="bold"
app:layout_constraintStart_toEndOf="@+id/iv_icon"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_msg_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="2025-1-8"
android:textColor="@color/black"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/tv_msg_type"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/tv_msg_type" />
<TextView
android:id="@+id/iv_readtype"
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_marginTop="5dp"
android:background="@drawable/shape_btn_bg"
android:visibility="gone"
app:layout_constraintRight_toRightOf="@+id/iv_icon"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_msg_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginEnd="15dp"
android:paddingStart="5dp"
android:textColor="#383838"
android:textSize="14sp"
app:layout_constraintStart_toStartOf="@+id/iv_icon"
app:layout_constraintTop_toBottomOf="@+id/iv_icon" />
<ImageView
android:id="@+id/ic_notify_pull"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginBottom="5dp"
android:background="@mipmap/ic_notify_xiala"
android:paddingStart="5dp"
android:textColor="#6d80ff"
android:textSize="14sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_msg_title" />
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:id="@+id/layout_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="5dp"
android:background="@android:color/black" />
<ImageView
android:id="@+id/iv_notifyimage"
android:layout_width="match_parent"
android:layout_marginBottom="5dp"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/iv_notifycontent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:layout_marginBottom="5dp"
android:textColor="#383838"
android:textSize="16sp" />
<TextView
android:id="@+id/iv_notifyjumpclick"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:textColor="#4169E1"
android:visibility="gone"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -1,59 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_withdrawname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingStart="10dp"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:textColor="@color/dialog_textcolor"
android:textSize="16sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="right|center_vertical"
android:orientation="vertical"
android:paddingEnd="10dp">
<TextView
android:id="@+id/tv_withdrawamount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#4BCD6D"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_withdrawbalance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#EF4723"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginStart="10dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="10dp"
android:background="@color/dialog_input_bg" />
</LinearLayout>