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();
+ }
+}
\ No newline at end of file
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/http/OkHttpManager.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/http/OkHttpManager.java
new file mode 100644
index 0000000..8e51fb6
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/http/OkHttpManager.java
@@ -0,0 +1,235 @@
+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}
+ * 使用 OkHttpManager 时必须依赖 OkHttp 库
+ * @author Jenly
+ */
+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 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 {
+
+ private String url;
+
+ private String path;
+
+ private String filename;
+
+ private Map 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 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 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();
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/INotification.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/INotification.java
new file mode 100644
index 0000000..cafcfd5
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/INotification.java
@@ -0,0 +1,25 @@
+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 Jenly
+ */
+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);
+}
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/NotificationImpl.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/NotificationImpl.java
new file mode 100644
index 0000000..5a432e0
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/notify/NotificationImpl.java
@@ -0,0 +1,38 @@
+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 Jenly
+ */
+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);
+ }
+}
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/provider/AppUpdaterFileProvider.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/provider/AppUpdaterFileProvider.java
new file mode 100644
index 0000000..03f2b55
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/provider/AppUpdaterFileProvider.java
@@ -0,0 +1,11 @@
+package com.web.dmcslot.appdown.provider;
+
+
+import androidx.core.content.FileProvider;
+
+/**
+ * @author Jenly Jenly
+ */
+public class AppUpdaterFileProvider extends FileProvider {
+
+}
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/service/DownloadService.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/service/DownloadService.java
new file mode 100644
index 0000000..1941437
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/service/DownloadService.java
@@ -0,0 +1,456 @@
+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 Jenly
+ */
+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);
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/AppUtils.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/AppUtils.java
new file mode 100644
index 0000000..61d66e3
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/AppUtils.java
@@ -0,0 +1,264 @@
+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 Jenly
+ */
+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();
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/LogUtils.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/LogUtils.java
new file mode 100644
index 0000000..6c0a4da
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/LogUtils.java
@@ -0,0 +1,316 @@
+/*
+ Copyright © 2015, 2016 Jenly Yu Jenly
+
+ 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 Jenly
+ */
+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);
+ }
+
+}
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/NotificationUtils.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/NotificationUtils.java
new file mode 100644
index 0000000..48e45f3
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/NotificationUtils.java
@@ -0,0 +1,261 @@
+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 Jenly
+ */
+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;
+ }
+}
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/PermissionUtils.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/PermissionUtils.java
new file mode 100644
index 0000000..3acce16
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/PermissionUtils.java
@@ -0,0 +1,92 @@
+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 Jenly
+ */
+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;
+ }
+
+}
\ No newline at end of file
diff --git a/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/SSLSocketFactoryUtils.java b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/SSLSocketFactoryUtils.java
new file mode 100644
index 0000000..f907b18
--- /dev/null
+++ b/Dmcslot/src/main/java/com/web/dmcslot/appdown/util/SSLSocketFactoryUtils.java
@@ -0,0 +1,168 @@
+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 Jenly
+ */
+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()};
+ }
+
+
+}
diff --git a/Dmcslot/src/main/res/drawable-anydpi/ic_action_back.xml b/Dmcslot/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Dmcslot/src/main/res/drawable-hdpi/ic_action_back.png b/Dmcslot/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Dmcslot/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Dmcslot/src/main/res/drawable-mdpi/ic_action_back.png b/Dmcslot/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Dmcslot/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Dmcslot/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Dmcslot/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable-xhdpi/ic_action_back.png b/Dmcslot/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Dmcslot/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Dmcslot/src/main/res/drawable-xxhdpi/ic_action_back.png b/Dmcslot/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Dmcslot/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Dmcslot/src/main/res/drawable/ic_launcher_background.xml b/Dmcslot/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/drawable/input_bg.xml b/Dmcslot/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/drawable/pass_word_bg.xml b/Dmcslot/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/drawable/pass_word_bg1.xml b/Dmcslot/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/pass_word_bg2.xml b/Dmcslot/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/shape_btn_bg.xml b/Dmcslot/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/shape_dialog_bg2.xml b/Dmcslot/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/shape_dialog_bg3.xml b/Dmcslot/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/shape_dialog_bg_new.xml b/Dmcslot/src/main/res/drawable/shape_dialog_bg_new.xml
new file mode 100644
index 0000000..e96d4e0
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/shape_dialog_bg_new.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/drawable/shape_notify_typebg.xml b/Dmcslot/src/main/res/drawable/shape_notify_typebg.xml
new file mode 100644
index 0000000..3da849f
--- /dev/null
+++ b/Dmcslot/src/main/res/drawable/shape_notify_typebg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/activity_main.xml b/Dmcslot/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..48eacca
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_main.xml
@@ -0,0 +1,351 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/activity_main2.xml b/Dmcslot/src/main/res/layout/activity_main2.xml
new file mode 100644
index 0000000..7c4418c
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_main2.xml
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/layout/activity_main3.xml b/Dmcslot/src/main/res/layout/activity_main3.xml
new file mode 100644
index 0000000..0da4207
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_main3.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/layout/activity_notifydetails.xml b/Dmcslot/src/main/res/layout/activity_notifydetails.xml
new file mode 100644
index 0000000..b685255
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_notifydetails.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/layout/activity_notifylist.xml b/Dmcslot/src/main/res/layout/activity_notifylist.xml
new file mode 100644
index 0000000..29a195b
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_notifylist.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/layout/activity_start.xml b/Dmcslot/src/main/res/layout/activity_start.xml
new file mode 100644
index 0000000..ad49056
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_start.xml
@@ -0,0 +1,294 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/activity_webview.xml b/Dmcslot/src/main/res/layout/activity_webview.xml
new file mode 100644
index 0000000..f52274e
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/activity_webview.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dmcslot/src/main/res/layout/dialog_action_bankinfo.xml b/Dmcslot/src/main/res/layout/dialog_action_bankinfo.xml
new file mode 100644
index 0000000..437c064
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_action_bankinfo.xml
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/dialog_action_confirm.xml b/Dmcslot/src/main/res/layout/dialog_action_confirm.xml
new file mode 100644
index 0000000..1c67709
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_action_confirm.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/dialog_action_invite.xml b/Dmcslot/src/main/res/layout/dialog_action_invite.xml
new file mode 100644
index 0000000..9fd65ee
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_action_invite.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/dialog_action_invite_records.xml b/Dmcslot/src/main/res/layout/dialog_action_invite_records.xml
new file mode 100644
index 0000000..f770481
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_action_invite_records.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/dialog_action_withdrawapply.xml b/Dmcslot/src/main/res/layout/dialog_action_withdrawapply.xml
new file mode 100644
index 0000000..9f0073e
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_action_withdrawapply.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/dialog_select_action.xml b/Dmcslot/src/main/res/layout/dialog_select_action.xml
new file mode 100644
index 0000000..846025f
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/dialog_select_action.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/item_invite_records.xml b/Dmcslot/src/main/res/layout/item_invite_records.xml
new file mode 100644
index 0000000..5e3a4c0
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/item_invite_records.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/item_notify_list.xml b/Dmcslot/src/main/res/layout/item_notify_list.xml
new file mode 100644
index 0000000..9cc22d6
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/item_notify_list.xml
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/layout/item_withdraw_records.xml b/Dmcslot/src/main/res/layout/item_withdraw_records.xml
new file mode 100644
index 0000000..a8e6205
--- /dev/null
+++ b/Dmcslot/src/main/res/layout/item_withdraw_records.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Dmcslot/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/mipmap-hdpi/ic_empty.png b/Dmcslot/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Dmcslot/src/main/res/mipmap-hdpi/ic_pull_down.png b/Dmcslot/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_close.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_email.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_email.png
new file mode 100644
index 0000000..aaacc68
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_email.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_facebook.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_hometo.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_link.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_menu.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_email.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_email.png
new file mode 100644
index 0000000..5a2df8e
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_email.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_normal.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_normal.png
new file mode 100644
index 0000000..f056d32
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_normal.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_shangla.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_shangla.png
new file mode 100644
index 0000000..eb1d3e9
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_shangla.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_xiala.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_xiala.png
new file mode 100644
index 0000000..7999f63
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notify_xiala.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_notifylogo.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notifylogo.png
new file mode 100644
index 0000000..b975e45
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_notifylogo.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_tel.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Dmcslot/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Dmcslot/src/main/res/mipmap-xxhdpi/app_logo.png b/Dmcslot/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..90e78b7
Binary files /dev/null and b/Dmcslot/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Dmcslot/src/main/res/values-en/strings.xml b/Dmcslot/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..54af636
--- /dev/null
+++ b/Dmcslot/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ DMCSLOT
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ No additional data available for now
+ NOTIFICATIONS
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/values-night/themes.xml b/Dmcslot/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Dmcslot/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/values/colors.xml b/Dmcslot/src/main/res/values/colors.xml
new file mode 100644
index 0000000..bd299ee
--- /dev/null
+++ b/Dmcslot/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+
+ #ACDFEE
+ #BDDDB7
+ #C3B5D0
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/values/strings.xml b/Dmcslot/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b415542
--- /dev/null
+++ b/Dmcslot/src/main/res/values/strings.xml
@@ -0,0 +1,76 @@
+
+ DMCSLOT
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 暂无更多数据
+ 通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/values/themes.xml b/Dmcslot/src/main/res/values/themes.xml
new file mode 100644
index 0000000..e47899f
--- /dev/null
+++ b/Dmcslot/src/main/res/values/themes.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/xml/app_updater_paths.xml b/Dmcslot/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Dmcslot/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/xml/network_security_config.xml b/Dmcslot/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Dmcslot/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/main/res/xml/provider_paths.xml b/Dmcslot/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Dmcslot/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dmcslot/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Dmcslot/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Dmcslot/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Gdslot888/.gitignore b/Gdslot888/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Gdslot888/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Gdslot888/build.gradle b/Gdslot888/build.gradle
new file mode 100644
index 0000000..19368e1
--- /dev/null
+++ b/Gdslot888/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.gdslot888"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('gdslot888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('gdslot888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Gdslot888/gdslot888.jks b/Gdslot888/gdslot888.jks
new file mode 100644
index 0000000..c35f5c7
Binary files /dev/null and b/Gdslot888/gdslot888.jks differ
diff --git a/Gdslot888/google-services.json b/Gdslot888/google-services.json
new file mode 100644
index 0000000..af1f5ed
--- /dev/null
+++ b/Gdslot888/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "1031065586711",
+ "project_id": "gdslot888-2f04f",
+ "storage_bucket": "gdslot888-2f04f.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:1031065586711:android:4136ad7324e62f0f966052",
+ "android_client_info": {
+ "package_name": "com.web.gdslot888"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyCbmZ6jonTvi8D_yzgVVGB-QzckF5crzeo"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Gdslot888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Gdslot888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Gdslot888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Gdslot888/proguard-rules.pro b/Gdslot888/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Gdslot888/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Gdslot888/release/Gdslot888.apk b/Gdslot888/release/Gdslot888.apk
new file mode 100644
index 0000000..45d3c68
Binary files /dev/null and b/Gdslot888/release/Gdslot888.apk differ
diff --git a/Gdslot888/release/output-metadata.json b/Gdslot888/release/output-metadata.json
new file mode 100644
index 0000000..c6ca061
--- /dev/null
+++ b/Gdslot888/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.gdslot888",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Gdslot888-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Gdslot888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Gdslot888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Gdslot888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Gdslot888/src/main/AndroidManifest.xml b/Gdslot888/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cb3472f
--- /dev/null
+++ b/Gdslot888/src/main/AndroidManifest.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/java/com/web/gdslot888/MainActivity2.java b/Gdslot888/src/main/java/com/web/gdslot888/MainActivity2.java
new file mode 100644
index 0000000..dc14c7e
--- /dev/null
+++ b/Gdslot888/src/main/java/com/web/gdslot888/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.gdslot888;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 89;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://www.gdslot888.net/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Gdslot888/src/main/java/com/web/gdslot888/MyFirebaseMessageingService.java b/Gdslot888/src/main/java/com/web/gdslot888/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..59b4c7b
--- /dev/null
+++ b/Gdslot888/src/main/java/com/web/gdslot888/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.gdslot888;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Gdslot888/src/main/java/com/web/gdslot888/WebApplication.java b/Gdslot888/src/main/java/com/web/gdslot888/WebApplication.java
new file mode 100644
index 0000000..68dbbbc
--- /dev/null
+++ b/Gdslot888/src/main/java/com/web/gdslot888/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.gdslot888;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Gdslot888/src/main/res/drawable-anydpi/ic_action_back.xml b/Gdslot888/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Gdslot888/src/main/res/drawable-hdpi/ic_action_back.png b/Gdslot888/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Gdslot888/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Gdslot888/src/main/res/drawable-mdpi/ic_action_back.png b/Gdslot888/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Gdslot888/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Gdslot888/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Gdslot888/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/drawable-xhdpi/ic_action_back.png b/Gdslot888/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Gdslot888/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Gdslot888/src/main/res/drawable-xxhdpi/ic_action_back.png b/Gdslot888/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Gdslot888/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Gdslot888/src/main/res/drawable/ic_launcher_background.xml b/Gdslot888/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Gdslot888/src/main/res/drawable/input_bg.xml b/Gdslot888/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Gdslot888/src/main/res/drawable/pass_word_bg.xml b/Gdslot888/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Gdslot888/src/main/res/drawable/pass_word_bg1.xml b/Gdslot888/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/drawable/pass_word_bg2.xml b/Gdslot888/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/drawable/shape_btn_bg.xml b/Gdslot888/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/drawable/shape_dialog_bg2.xml b/Gdslot888/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/drawable/shape_dialog_bg3.xml b/Gdslot888/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Gdslot888/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Gdslot888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/mipmap-hdpi/ic_empty.png b/Gdslot888/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Gdslot888/src/main/res/mipmap-hdpi/ic_pull_down.png b/Gdslot888/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_close.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_facebook.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_hometo.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_link.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_menu.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_tel.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Gdslot888/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Gdslot888/src/main/res/mipmap-xxhdpi/app_logo.jpg b/Gdslot888/src/main/res/mipmap-xxhdpi/app_logo.jpg
new file mode 100644
index 0000000..0bce0b1
Binary files /dev/null and b/Gdslot888/src/main/res/mipmap-xxhdpi/app_logo.jpg differ
diff --git a/Gdslot888/src/main/res/values-en/strings.xml b/Gdslot888/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..13e2b30
--- /dev/null
+++ b/Gdslot888/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ GDSlot888
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/values-night/themes.xml b/Gdslot888/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Gdslot888/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/values/colors.xml b/Gdslot888/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Gdslot888/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/values/strings.xml b/Gdslot888/src/main/res/values/strings.xml
new file mode 100644
index 0000000..317e2f2
--- /dev/null
+++ b/Gdslot888/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ GDSlot888
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/values/style.xml b/Gdslot888/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Gdslot888/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/values/themes.xml b/Gdslot888/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Gdslot888/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/xml/app_updater_paths.xml b/Gdslot888/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Gdslot888/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/xml/network_security_config.xml b/Gdslot888/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Gdslot888/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/main/res/xml/provider_paths.xml b/Gdslot888/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Gdslot888/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Gdslot888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Gdslot888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Gdslot888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Jeslot88/.gitignore b/Jeslot88/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Jeslot88/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Jeslot88/build.gradle b/Jeslot88/build.gradle
new file mode 100644
index 0000000..cc21d84
--- /dev/null
+++ b/Jeslot88/build.gradle
@@ -0,0 +1,91 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.jeslot88"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('jeslot88.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('jeslot88.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Jeslot88/google-services.json b/Jeslot88/google-services.json
new file mode 100644
index 0000000..8ed5288
--- /dev/null
+++ b/Jeslot88/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "54193138344",
+ "project_id": "jeslot88-11954",
+ "storage_bucket": "jeslot88-11954.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:54193138344:android:1d108d4e81451ce5bbf09d",
+ "android_client_info": {
+ "package_name": "com.web.jeslot88"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyD3SVVnmLcXEBg7Uh_ngYJx1_Hvy7WsOAo"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Jeslot88/jeslot88.jks b/Jeslot88/jeslot88.jks
new file mode 100644
index 0000000..4248f26
Binary files /dev/null and b/Jeslot88/jeslot88.jks differ
diff --git a/Jeslot88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Jeslot88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Jeslot88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Jeslot88/proguard-rules.pro b/Jeslot88/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Jeslot88/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Jeslot88/release/Jeslot88.apk b/Jeslot88/release/Jeslot88.apk
new file mode 100644
index 0000000..599d649
Binary files /dev/null and b/Jeslot88/release/Jeslot88.apk differ
diff --git a/Jeslot88/release/output-metadata.json b/Jeslot88/release/output-metadata.json
new file mode 100644
index 0000000..532c027
--- /dev/null
+++ b/Jeslot88/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.jeslot88",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Jeslot88-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Jeslot88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Jeslot88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Jeslot88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Jeslot88/src/main/AndroidManifest.xml b/Jeslot88/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..804578e
--- /dev/null
+++ b/Jeslot88/src/main/AndroidManifest.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/java/com/web/jeslot88/MainActivity2.java b/Jeslot88/src/main/java/com/web/jeslot88/MainActivity2.java
new file mode 100644
index 0000000..74e1b79
--- /dev/null
+++ b/Jeslot88/src/main/java/com/web/jeslot88/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.jeslot88;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 91;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://jeslot88.online/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Jeslot88/src/main/java/com/web/jeslot88/MyFirebaseMessageingService.java b/Jeslot88/src/main/java/com/web/jeslot88/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..ff3aa63
--- /dev/null
+++ b/Jeslot88/src/main/java/com/web/jeslot88/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.jeslot88;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Jeslot88/src/main/java/com/web/jeslot88/WebApplication.java b/Jeslot88/src/main/java/com/web/jeslot88/WebApplication.java
new file mode 100644
index 0000000..a7fd114
--- /dev/null
+++ b/Jeslot88/src/main/java/com/web/jeslot88/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.jeslot88;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Jeslot88/src/main/res/drawable-anydpi/ic_action_back.xml b/Jeslot88/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Jeslot88/src/main/res/drawable-hdpi/ic_action_back.png b/Jeslot88/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Jeslot88/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Jeslot88/src/main/res/drawable-mdpi/ic_action_back.png b/Jeslot88/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Jeslot88/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Jeslot88/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Jeslot88/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/drawable-xhdpi/ic_action_back.png b/Jeslot88/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Jeslot88/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Jeslot88/src/main/res/drawable-xxhdpi/ic_action_back.png b/Jeslot88/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Jeslot88/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Jeslot88/src/main/res/drawable/ic_launcher_background.xml b/Jeslot88/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Jeslot88/src/main/res/drawable/input_bg.xml b/Jeslot88/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Jeslot88/src/main/res/drawable/pass_word_bg.xml b/Jeslot88/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Jeslot88/src/main/res/drawable/pass_word_bg1.xml b/Jeslot88/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/drawable/pass_word_bg2.xml b/Jeslot88/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/drawable/shape_btn_bg.xml b/Jeslot88/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/drawable/shape_dialog_bg2.xml b/Jeslot88/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/drawable/shape_dialog_bg3.xml b/Jeslot88/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Jeslot88/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Jeslot88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/mipmap-hdpi/ic_empty.png b/Jeslot88/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Jeslot88/src/main/res/mipmap-hdpi/ic_pull_down.png b/Jeslot88/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_close.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_facebook.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_hometo.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_link.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_menu.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_tel.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Jeslot88/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Jeslot88/src/main/res/mipmap-xxhdpi/app_logo.png b/Jeslot88/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..be7b8a3
Binary files /dev/null and b/Jeslot88/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Jeslot88/src/main/res/values-en/strings.xml b/Jeslot88/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..18dea38
--- /dev/null
+++ b/Jeslot88/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ JESLOT88
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/values-night/themes.xml b/Jeslot88/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Jeslot88/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/values/colors.xml b/Jeslot88/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Jeslot88/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/values/strings.xml b/Jeslot88/src/main/res/values/strings.xml
new file mode 100644
index 0000000..4fd3377
--- /dev/null
+++ b/Jeslot88/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ JESLOT88
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/values/style.xml b/Jeslot88/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Jeslot88/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/values/themes.xml b/Jeslot88/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Jeslot88/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/xml/app_updater_paths.xml b/Jeslot88/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Jeslot88/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/xml/network_security_config.xml b/Jeslot88/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Jeslot88/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/main/res/xml/provider_paths.xml b/Jeslot88/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Jeslot88/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Jeslot88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Jeslot88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Jeslot88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Judy88/.gitignore b/Judy88/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Judy88/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Judy88/build.gradle b/Judy88/build.gradle
new file mode 100644
index 0000000..957460a
--- /dev/null
+++ b/Judy88/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.judy88"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('judy88.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('judy88.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Judy88/google-services.json b/Judy88/google-services.json
new file mode 100644
index 0000000..908bc34
--- /dev/null
+++ b/Judy88/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "988212673486",
+ "project_id": "judy88-904b7",
+ "storage_bucket": "judy88-904b7.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:988212673486:android:d44bd63db932c6bdf2899f",
+ "android_client_info": {
+ "package_name": "com.web.judy88"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyA2H4KZEBB2fkOJs9ldog9lAAuVSx41Oz0"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Judy88/judy88.jks b/Judy88/judy88.jks
new file mode 100644
index 0000000..d64c1d9
Binary files /dev/null and b/Judy88/judy88.jks differ
diff --git a/Judy88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Judy88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Judy88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Judy88/proguard-rules.pro b/Judy88/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Judy88/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Judy88/release/Judy88.apk b/Judy88/release/Judy88.apk
new file mode 100644
index 0000000..35f1796
Binary files /dev/null and b/Judy88/release/Judy88.apk differ
diff --git a/Judy88/release/output-metadata.json b/Judy88/release/output-metadata.json
new file mode 100644
index 0000000..15f9386
--- /dev/null
+++ b/Judy88/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.judy88",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Judy88-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Judy88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Judy88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Judy88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Judy88/src/main/AndroidManifest.xml b/Judy88/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6fcf2e3
--- /dev/null
+++ b/Judy88/src/main/AndroidManifest.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/java/com/web/judy88/MainActivity2.java b/Judy88/src/main/java/com/web/judy88/MainActivity2.java
new file mode 100644
index 0000000..953797e
--- /dev/null
+++ b/Judy88/src/main/java/com/web/judy88/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.judy88;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 92;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url","https://judy88.online/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Judy88/src/main/java/com/web/judy88/MyFirebaseMessageingService.java b/Judy88/src/main/java/com/web/judy88/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..2e2a684
--- /dev/null
+++ b/Judy88/src/main/java/com/web/judy88/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.judy88;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Judy88/src/main/java/com/web/judy88/WebApplication.java b/Judy88/src/main/java/com/web/judy88/WebApplication.java
new file mode 100644
index 0000000..0862754
--- /dev/null
+++ b/Judy88/src/main/java/com/web/judy88/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.judy88;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Judy88/src/main/res/drawable-anydpi/ic_action_back.xml b/Judy88/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Judy88/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Judy88/src/main/res/drawable-hdpi/ic_action_back.png b/Judy88/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Judy88/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Judy88/src/main/res/drawable-mdpi/ic_action_back.png b/Judy88/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Judy88/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Judy88/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Judy88/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Judy88/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/drawable-xhdpi/ic_action_back.png b/Judy88/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Judy88/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Judy88/src/main/res/drawable-xxhdpi/ic_action_back.png b/Judy88/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Judy88/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Judy88/src/main/res/drawable/ic_launcher_background.xml b/Judy88/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Judy88/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Judy88/src/main/res/drawable/input_bg.xml b/Judy88/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Judy88/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Judy88/src/main/res/drawable/pass_word_bg.xml b/Judy88/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Judy88/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Judy88/src/main/res/drawable/pass_word_bg1.xml b/Judy88/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Judy88/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/drawable/pass_word_bg2.xml b/Judy88/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Judy88/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/drawable/shape_btn_bg.xml b/Judy88/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Judy88/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/drawable/shape_dialog_bg2.xml b/Judy88/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Judy88/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/drawable/shape_dialog_bg3.xml b/Judy88/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Judy88/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Judy88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/mipmap-hdpi/ic_empty.png b/Judy88/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Judy88/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Judy88/src/main/res/mipmap-hdpi/ic_pull_down.png b/Judy88/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Judy88/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_close.png b/Judy88/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_facebook.png b/Judy88/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_hometo.png b/Judy88/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_link.png b/Judy88/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_menu.png b/Judy88/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Judy88/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_tel.png b/Judy88/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Judy88/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Judy88/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Judy88/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Judy88/src/main/res/mipmap-xxhdpi/app_logo.png b/Judy88/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..5c8ccd0
Binary files /dev/null and b/Judy88/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Judy88/src/main/res/values-en/strings.xml b/Judy88/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..05e7cae
--- /dev/null
+++ b/Judy88/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ JUDY88
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/values-night/themes.xml b/Judy88/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Judy88/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/values/colors.xml b/Judy88/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Judy88/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/values/strings.xml b/Judy88/src/main/res/values/strings.xml
new file mode 100644
index 0000000..77c21ea
--- /dev/null
+++ b/Judy88/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ JUDY88
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/values/style.xml b/Judy88/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Judy88/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/values/themes.xml b/Judy88/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Judy88/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/xml/app_updater_paths.xml b/Judy88/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Judy88/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/xml/network_security_config.xml b/Judy88/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Judy88/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/main/res/xml/provider_paths.xml b/Judy88/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Judy88/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Judy88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Judy88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Judy88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Kejapjudi/.gitignore b/Kejapjudi/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Kejapjudi/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Kejapjudi/build.gradle b/Kejapjudi/build.gradle
new file mode 100644
index 0000000..970aa66
--- /dev/null
+++ b/Kejapjudi/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.kejapjudi"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('kj.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('kj.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Kejapjudi/google-services.json b/Kejapjudi/google-services.json
new file mode 100644
index 0000000..50e6a9a
--- /dev/null
+++ b/Kejapjudi/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "39605079051",
+ "project_id": "kejapjudi-704e8",
+ "storage_bucket": "kejapjudi-704e8.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:39605079051:android:906fa6147de70d25e84b0e",
+ "android_client_info": {
+ "package_name": "com.web.kejapjudi"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBZnMbbkQlBjxrF7U3KEl5NR-ObexmAvNg"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Kejapjudi/kj.jks b/Kejapjudi/kj.jks
new file mode 100644
index 0000000..77b3fa4
Binary files /dev/null and b/Kejapjudi/kj.jks differ
diff --git a/Kejapjudi/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Kejapjudi/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Kejapjudi/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Kejapjudi/proguard-rules.pro b/Kejapjudi/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Kejapjudi/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Kejapjudi/release/Kejapjudi.apk b/Kejapjudi/release/Kejapjudi.apk
new file mode 100644
index 0000000..e8b08bf
Binary files /dev/null and b/Kejapjudi/release/Kejapjudi.apk differ
diff --git a/Kejapjudi/release/output-metadata.json b/Kejapjudi/release/output-metadata.json
new file mode 100644
index 0000000..a84ba12
--- /dev/null
+++ b/Kejapjudi/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.kejapjudi",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Kejapjudi-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Kejapjudi/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Kejapjudi/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Kejapjudi/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Kejapjudi/src/main/AndroidManifest.xml b/Kejapjudi/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..db0a4de
--- /dev/null
+++ b/Kejapjudi/src/main/AndroidManifest.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/java/com/web/kejapjudi/MainActivity2.java b/Kejapjudi/src/main/java/com/web/kejapjudi/MainActivity2.java
new file mode 100644
index 0000000..37c1441
--- /dev/null
+++ b/Kejapjudi/src/main/java/com/web/kejapjudi/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.kejapjudi;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 93;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://kejapjudi.online/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Kejapjudi/src/main/java/com/web/kejapjudi/MyFirebaseMessageingService.java b/Kejapjudi/src/main/java/com/web/kejapjudi/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..5204b20
--- /dev/null
+++ b/Kejapjudi/src/main/java/com/web/kejapjudi/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.kejapjudi;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Kejapjudi/src/main/java/com/web/kejapjudi/WebApplication.java b/Kejapjudi/src/main/java/com/web/kejapjudi/WebApplication.java
new file mode 100644
index 0000000..2158c2e
--- /dev/null
+++ b/Kejapjudi/src/main/java/com/web/kejapjudi/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.kejapjudi;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Kejapjudi/src/main/res/drawable-anydpi/ic_action_back.xml b/Kejapjudi/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Kejapjudi/src/main/res/drawable-hdpi/ic_action_back.png b/Kejapjudi/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Kejapjudi/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Kejapjudi/src/main/res/drawable-mdpi/ic_action_back.png b/Kejapjudi/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Kejapjudi/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Kejapjudi/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Kejapjudi/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/drawable-xhdpi/ic_action_back.png b/Kejapjudi/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Kejapjudi/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Kejapjudi/src/main/res/drawable-xxhdpi/ic_action_back.png b/Kejapjudi/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Kejapjudi/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Kejapjudi/src/main/res/drawable/ic_launcher_background.xml b/Kejapjudi/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Kejapjudi/src/main/res/drawable/input_bg.xml b/Kejapjudi/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Kejapjudi/src/main/res/drawable/pass_word_bg.xml b/Kejapjudi/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Kejapjudi/src/main/res/drawable/pass_word_bg1.xml b/Kejapjudi/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/drawable/pass_word_bg2.xml b/Kejapjudi/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/drawable/shape_btn_bg.xml b/Kejapjudi/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/drawable/shape_dialog_bg2.xml b/Kejapjudi/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/drawable/shape_dialog_bg3.xml b/Kejapjudi/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Kejapjudi/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Kejapjudi/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/mipmap-hdpi/ic_empty.png b/Kejapjudi/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-hdpi/ic_pull_down.png b/Kejapjudi/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_close.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_facebook.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_hometo.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_link.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_menu.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_tel.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Kejapjudi/src/main/res/mipmap-xxhdpi/app_logo.jpg b/Kejapjudi/src/main/res/mipmap-xxhdpi/app_logo.jpg
new file mode 100644
index 0000000..b6732cc
Binary files /dev/null and b/Kejapjudi/src/main/res/mipmap-xxhdpi/app_logo.jpg differ
diff --git a/Kejapjudi/src/main/res/values-en/strings.xml b/Kejapjudi/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..a61880f
--- /dev/null
+++ b/Kejapjudi/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ KJ
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/values-night/themes.xml b/Kejapjudi/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Kejapjudi/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/values/colors.xml b/Kejapjudi/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Kejapjudi/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/values/strings.xml b/Kejapjudi/src/main/res/values/strings.xml
new file mode 100644
index 0000000..c68cd74
--- /dev/null
+++ b/Kejapjudi/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ KJ
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/values/style.xml b/Kejapjudi/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Kejapjudi/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/values/themes.xml b/Kejapjudi/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Kejapjudi/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/xml/app_updater_paths.xml b/Kejapjudi/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Kejapjudi/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/xml/network_security_config.xml b/Kejapjudi/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Kejapjudi/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/main/res/xml/provider_paths.xml b/Kejapjudi/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Kejapjudi/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Kejapjudi/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Kejapjudi/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Kejapjudi/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Magnum888/.gitignore b/Magnum888/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Magnum888/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Magnum888/build.gradle b/Magnum888/build.gradle
new file mode 100644
index 0000000..07117cb
--- /dev/null
+++ b/Magnum888/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.magnum888"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('magnum888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('magnum888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Magnum888/google-services.json b/Magnum888/google-services.json
new file mode 100644
index 0000000..4365515
--- /dev/null
+++ b/Magnum888/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "454931833879",
+ "project_id": "magnum888-136ec",
+ "storage_bucket": "magnum888-136ec.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:454931833879:android:448a55f8cb5b8ce10e6852",
+ "android_client_info": {
+ "package_name": "com.web.magnum888"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyDykjEg62UYo3mDaEHAwO_QbWzgbAtRlRQ"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Magnum888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Magnum888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Magnum888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Magnum888/magnum888.jks b/Magnum888/magnum888.jks
new file mode 100644
index 0000000..ae9d5d1
Binary files /dev/null and b/Magnum888/magnum888.jks differ
diff --git a/Magnum888/proguard-rules.pro b/Magnum888/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Magnum888/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Magnum888/release/Magnum888.apk b/Magnum888/release/Magnum888.apk
new file mode 100644
index 0000000..df4c72d
Binary files /dev/null and b/Magnum888/release/Magnum888.apk differ
diff --git a/Magnum888/release/output-metadata.json b/Magnum888/release/output-metadata.json
new file mode 100644
index 0000000..dc193f5
--- /dev/null
+++ b/Magnum888/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.magnum888",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Magnum888-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Magnum888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Magnum888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Magnum888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Magnum888/src/main/AndroidManifest.xml b/Magnum888/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..2a0e046
--- /dev/null
+++ b/Magnum888/src/main/AndroidManifest.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/java/com/web/magnum888/MainActivity2.java b/Magnum888/src/main/java/com/web/magnum888/MainActivity2.java
new file mode 100644
index 0000000..0046533
--- /dev/null
+++ b/Magnum888/src/main/java/com/web/magnum888/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.magnum888;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 94;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url","https://www.magnum888.cash/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Magnum888/src/main/java/com/web/magnum888/MyFirebaseMessageingService.java b/Magnum888/src/main/java/com/web/magnum888/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..0031a0b
--- /dev/null
+++ b/Magnum888/src/main/java/com/web/magnum888/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.magnum888;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Magnum888/src/main/java/com/web/magnum888/WebApplication.java b/Magnum888/src/main/java/com/web/magnum888/WebApplication.java
new file mode 100644
index 0000000..f2ae6c0
--- /dev/null
+++ b/Magnum888/src/main/java/com/web/magnum888/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.magnum888;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Magnum888/src/main/res/drawable-anydpi/ic_action_back.xml b/Magnum888/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Magnum888/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Magnum888/src/main/res/drawable-hdpi/ic_action_back.png b/Magnum888/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Magnum888/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Magnum888/src/main/res/drawable-mdpi/ic_action_back.png b/Magnum888/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Magnum888/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Magnum888/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Magnum888/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Magnum888/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/drawable-xhdpi/ic_action_back.png b/Magnum888/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Magnum888/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Magnum888/src/main/res/drawable-xxhdpi/ic_action_back.png b/Magnum888/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Magnum888/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Magnum888/src/main/res/drawable/ic_launcher_background.xml b/Magnum888/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Magnum888/src/main/res/drawable/input_bg.xml b/Magnum888/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Magnum888/src/main/res/drawable/pass_word_bg.xml b/Magnum888/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Magnum888/src/main/res/drawable/pass_word_bg1.xml b/Magnum888/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/drawable/pass_word_bg2.xml b/Magnum888/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/drawable/shape_btn_bg.xml b/Magnum888/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/drawable/shape_dialog_bg2.xml b/Magnum888/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/drawable/shape_dialog_bg3.xml b/Magnum888/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Magnum888/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Magnum888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/mipmap-hdpi/ic_empty.png b/Magnum888/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Magnum888/src/main/res/mipmap-hdpi/ic_pull_down.png b/Magnum888/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_close.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_facebook.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_hometo.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_link.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_menu.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_tel.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Magnum888/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Magnum888/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Magnum888/src/main/res/mipmap-xxhdpi/app_logo.png b/Magnum888/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..fa5f04f
Binary files /dev/null and b/Magnum888/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Magnum888/src/main/res/values-en/strings.xml b/Magnum888/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..c9d3584
--- /dev/null
+++ b/Magnum888/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ Magnum888
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/values-night/themes.xml b/Magnum888/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Magnum888/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/values/colors.xml b/Magnum888/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Magnum888/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/values/strings.xml b/Magnum888/src/main/res/values/strings.xml
new file mode 100644
index 0000000..40bbbb2
--- /dev/null
+++ b/Magnum888/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ Magnum888
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/values/style.xml b/Magnum888/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Magnum888/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/values/themes.xml b/Magnum888/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Magnum888/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/xml/app_updater_paths.xml b/Magnum888/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Magnum888/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/xml/network_security_config.xml b/Magnum888/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Magnum888/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/main/res/xml/provider_paths.xml b/Magnum888/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Magnum888/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Magnum888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Magnum888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Magnum888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Mahkota8/.gitignore b/Mahkota8/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Mahkota8/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Mahkota8/build.gradle b/Mahkota8/build.gradle
new file mode 100644
index 0000000..6c3a054
--- /dev/null
+++ b/Mahkota8/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.MAHKOTA8"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('mahkota8.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('mahkota8.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Mahkota8/google-services.json b/Mahkota8/google-services.json
new file mode 100644
index 0000000..397c322
--- /dev/null
+++ b/Mahkota8/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "643424299568",
+ "project_id": "mahkota8-186da",
+ "storage_bucket": "mahkota8-186da.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:643424299568:android:7ef0cd13dc9175bafb9bf5",
+ "android_client_info": {
+ "package_name": "com.web.MAHKOTA8"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBuleiR8aPa6Dt3kevaK4wtSoYck31s8AU"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Mahkota8/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Mahkota8/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Mahkota8/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Mahkota8/mahkota8.jks b/Mahkota8/mahkota8.jks
new file mode 100644
index 0000000..bfc85ea
Binary files /dev/null and b/Mahkota8/mahkota8.jks differ
diff --git a/Mahkota8/proguard-rules.pro b/Mahkota8/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Mahkota8/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Mahkota8/release/Mahkota8.apk b/Mahkota8/release/Mahkota8.apk
new file mode 100644
index 0000000..f9612b3
Binary files /dev/null and b/Mahkota8/release/Mahkota8.apk differ
diff --git a/Mahkota8/release/output-metadata.json b/Mahkota8/release/output-metadata.json
new file mode 100644
index 0000000..98d5e51
--- /dev/null
+++ b/Mahkota8/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.MAHKOTA8",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Mahkota8-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Mahkota8/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Mahkota8/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Mahkota8/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Mahkota8/src/main/AndroidManifest.xml b/Mahkota8/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..f9ff485
--- /dev/null
+++ b/Mahkota8/src/main/AndroidManifest.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/java/com/web/MAHKOTA8/MainActivity2.java b/Mahkota8/src/main/java/com/web/MAHKOTA8/MainActivity2.java
new file mode 100644
index 0000000..2deebb8
--- /dev/null
+++ b/Mahkota8/src/main/java/com/web/MAHKOTA8/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.MAHKOTA8;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 95;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://www.mahkota8b.com/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Mahkota8/src/main/java/com/web/MAHKOTA8/MyFirebaseMessageingService.java b/Mahkota8/src/main/java/com/web/MAHKOTA8/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..e9122a0
--- /dev/null
+++ b/Mahkota8/src/main/java/com/web/MAHKOTA8/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.MAHKOTA8;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Mahkota8/src/main/java/com/web/MAHKOTA8/WebApplication.java b/Mahkota8/src/main/java/com/web/MAHKOTA8/WebApplication.java
new file mode 100644
index 0000000..74a81a1
--- /dev/null
+++ b/Mahkota8/src/main/java/com/web/MAHKOTA8/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.MAHKOTA8;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Mahkota8/src/main/res/drawable-anydpi/ic_action_back.xml b/Mahkota8/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Mahkota8/src/main/res/drawable-hdpi/ic_action_back.png b/Mahkota8/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Mahkota8/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Mahkota8/src/main/res/drawable-mdpi/ic_action_back.png b/Mahkota8/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Mahkota8/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Mahkota8/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Mahkota8/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/drawable-xhdpi/ic_action_back.png b/Mahkota8/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Mahkota8/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Mahkota8/src/main/res/drawable-xxhdpi/ic_action_back.png b/Mahkota8/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Mahkota8/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Mahkota8/src/main/res/drawable/ic_launcher_background.xml b/Mahkota8/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mahkota8/src/main/res/drawable/input_bg.xml b/Mahkota8/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mahkota8/src/main/res/drawable/pass_word_bg.xml b/Mahkota8/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mahkota8/src/main/res/drawable/pass_word_bg1.xml b/Mahkota8/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/drawable/pass_word_bg2.xml b/Mahkota8/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/drawable/shape_btn_bg.xml b/Mahkota8/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/drawable/shape_dialog_bg2.xml b/Mahkota8/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/drawable/shape_dialog_bg3.xml b/Mahkota8/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Mahkota8/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mahkota8/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/mipmap-hdpi/ic_empty.png b/Mahkota8/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Mahkota8/src/main/res/mipmap-hdpi/ic_pull_down.png b/Mahkota8/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_close.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_facebook.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_hometo.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_link.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_menu.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_tel.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Mahkota8/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Mahkota8/src/main/res/mipmap-xxhdpi/app_logo.png b/Mahkota8/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..a4e5047
Binary files /dev/null and b/Mahkota8/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Mahkota8/src/main/res/values-en/strings.xml b/Mahkota8/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..a5d300d
--- /dev/null
+++ b/Mahkota8/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ MAHKOTA8
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/values-night/themes.xml b/Mahkota8/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Mahkota8/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/values/colors.xml b/Mahkota8/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Mahkota8/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/values/strings.xml b/Mahkota8/src/main/res/values/strings.xml
new file mode 100644
index 0000000..88897f2
--- /dev/null
+++ b/Mahkota8/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ MAHKOTA8
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/values/style.xml b/Mahkota8/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Mahkota8/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/values/themes.xml b/Mahkota8/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Mahkota8/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/xml/app_updater_paths.xml b/Mahkota8/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Mahkota8/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/xml/network_security_config.xml b/Mahkota8/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Mahkota8/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/main/res/xml/provider_paths.xml b/Mahkota8/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Mahkota8/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mahkota8/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Mahkota8/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Mahkota8/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Mk88aud/.gitignore b/Mk88aud/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Mk88aud/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Mk88aud/build.gradle b/Mk88aud/build.gradle
new file mode 100644
index 0000000..c0bf23b
--- /dev/null
+++ b/Mk88aud/build.gradle
@@ -0,0 +1,86 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.web.mk88"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('mk88aud.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('mk88aud.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+ implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+ implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Mk88aud/google-services.json b/Mk88aud/google-services.json
new file mode 100644
index 0000000..3d619cf
--- /dev/null
+++ b/Mk88aud/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "637535395676",
+ "project_id": "mk88au",
+ "storage_bucket": "mk88au.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:637535395676:android:4a3c0ba171a6445b11ab99",
+ "android_client_info": {
+ "package_name": "com.web.mk88"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBVa3ICPExBtE4YSVn0Fuimd0FoELPCvWA"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Mk88aud/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Mk88aud/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Mk88aud/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Mk88aud/mk88aud.jks b/Mk88aud/mk88aud.jks
new file mode 100644
index 0000000..b12b26b
Binary files /dev/null and b/Mk88aud/mk88aud.jks differ
diff --git a/Mk88aud/proguard-rules.pro b/Mk88aud/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Mk88aud/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Mk88aud/release/mk88aud.apk b/Mk88aud/release/mk88aud.apk
new file mode 100644
index 0000000..3d63569
Binary files /dev/null and b/Mk88aud/release/mk88aud.apk differ
diff --git a/Mk88aud/release/output-metadata.json b/Mk88aud/release/output-metadata.json
new file mode 100644
index 0000000..9b2b426
--- /dev/null
+++ b/Mk88aud/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.mk88",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Mk88aud-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Mk88aud/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Mk88aud/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Mk88aud/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Mk88aud/src/main/AndroidManifest.xml b/Mk88aud/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7d6fd5c
--- /dev/null
+++ b/Mk88aud/src/main/AndroidManifest.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/java/com/web/mk88/MainActivity2.java b/Mk88aud/src/main/java/com/web/mk88/MainActivity2.java
new file mode 100644
index 0000000..31c3693
--- /dev/null
+++ b/Mk88aud/src/main/java/com/web/mk88/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.mk88;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 57;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://mk88au.net/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Mk88aud/src/main/java/com/web/mk88/MyFirebaseMessageingService.java b/Mk88aud/src/main/java/com/web/mk88/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..429ca5d
--- /dev/null
+++ b/Mk88aud/src/main/java/com/web/mk88/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.mk88;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Mk88aud/src/main/java/com/web/mk88/WebApplication.java b/Mk88aud/src/main/java/com/web/mk88/WebApplication.java
new file mode 100644
index 0000000..b89d491
--- /dev/null
+++ b/Mk88aud/src/main/java/com/web/mk88/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.mk88;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Mk88aud/src/main/res/drawable-anydpi/ic_action_back.xml b/Mk88aud/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Mk88aud/src/main/res/drawable-hdpi/ic_action_back.png b/Mk88aud/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Mk88aud/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Mk88aud/src/main/res/drawable-mdpi/ic_action_back.png b/Mk88aud/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Mk88aud/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Mk88aud/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Mk88aud/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable-xhdpi/ic_action_back.png b/Mk88aud/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Mk88aud/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Mk88aud/src/main/res/drawable-xxhdpi/ic_action_back.png b/Mk88aud/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Mk88aud/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Mk88aud/src/main/res/drawable/ic_launcher_background.xml b/Mk88aud/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mk88aud/src/main/res/drawable/input_bg.xml b/Mk88aud/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mk88aud/src/main/res/drawable/pass_word_bg.xml b/Mk88aud/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mk88aud/src/main/res/drawable/pass_word_bg1.xml b/Mk88aud/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable/pass_word_bg2.xml b/Mk88aud/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable/shape_btn_bg.xml b/Mk88aud/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable/shape_dialog_bg2.xml b/Mk88aud/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable/shape_dialog_bg3.xml b/Mk88aud/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/drawable/shape_dialog_bg_new.xml b/Mk88aud/src/main/res/drawable/shape_dialog_bg_new.xml
new file mode 100644
index 0000000..e96d4e0
--- /dev/null
+++ b/Mk88aud/src/main/res/drawable/shape_dialog_bg_new.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mk88aud/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/mipmap-hdpi/ic_empty.png b/Mk88aud/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Mk88aud/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Mk88aud/src/main/res/mipmap-hdpi/ic_pull_down.png b/Mk88aud/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Mk88aud/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Mk88aud/src/main/res/mipmap-xhdpi/ic_close.png b/Mk88aud/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Mk88aud/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Mk88aud/src/main/res/mipmap-xhdpi/ic_menu.png b/Mk88aud/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Mk88aud/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Mk88aud/src/main/res/mipmap-xxhdpi/app_logo.png b/Mk88aud/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..221562f
Binary files /dev/null and b/Mk88aud/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Mk88aud/src/main/res/values-en/strings.xml b/Mk88aud/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..2a49705
--- /dev/null
+++ b/Mk88aud/src/main/res/values-en/strings.xml
@@ -0,0 +1,52 @@
+
+ MK88AUD
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/values-night/themes.xml b/Mk88aud/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Mk88aud/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/values/colors.xml b/Mk88aud/src/main/res/values/colors.xml
new file mode 100644
index 0000000..7895913
--- /dev/null
+++ b/Mk88aud/src/main/res/values/colors.xml
@@ -0,0 +1,18 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/values/strings.xml b/Mk88aud/src/main/res/values/strings.xml
new file mode 100644
index 0000000..30d78da
--- /dev/null
+++ b/Mk88aud/src/main/res/values/strings.xml
@@ -0,0 +1,74 @@
+
+ MK88AUD
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/values/themes.xml b/Mk88aud/src/main/res/values/themes.xml
new file mode 100644
index 0000000..e47899f
--- /dev/null
+++ b/Mk88aud/src/main/res/values/themes.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/xml/app_updater_paths.xml b/Mk88aud/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Mk88aud/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/xml/network_security_config.xml b/Mk88aud/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Mk88aud/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/main/res/xml/provider_paths.xml b/Mk88aud/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Mk88aud/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mk88aud/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Mk88aud/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Mk88aud/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Mko888/.gitignore b/Mko888/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Mko888/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Mko888/build.gradle b/Mko888/build.gradle
new file mode 100644
index 0000000..01afe57
--- /dev/null
+++ b/Mko888/build.gradle
@@ -0,0 +1,91 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.MKO888"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('mko888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('mko888.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+}
\ No newline at end of file
diff --git a/Mko888/google-services.json b/Mko888/google-services.json
new file mode 100644
index 0000000..cf646ca
--- /dev/null
+++ b/Mko888/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "542008271037",
+ "project_id": "mko888",
+ "storage_bucket": "mko888.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:542008271037:android:afa77592f5cb7f5fd957d4",
+ "android_client_info": {
+ "package_name": "com.web.MKO888"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBxl0WvwdSZbH0_Eec_zeRvP7KwOnIqmuY"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Mko888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Mko888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Mko888/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Mko888/mko888.jks b/Mko888/mko888.jks
new file mode 100644
index 0000000..b677fdb
Binary files /dev/null and b/Mko888/mko888.jks differ
diff --git a/Mko888/proguard-rules.pro b/Mko888/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Mko888/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Mko888/release/Mko888.apk b/Mko888/release/Mko888.apk
new file mode 100644
index 0000000..36ce817
Binary files /dev/null and b/Mko888/release/Mko888.apk differ
diff --git a/Mko888/release/output-metadata.json b/Mko888/release/output-metadata.json
new file mode 100644
index 0000000..f1c3107
--- /dev/null
+++ b/Mko888/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.MKO888",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Mko888-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Mko888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Mko888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Mko888/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Mko888/src/main/AndroidManifest.xml b/Mko888/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..1c34d6b
--- /dev/null
+++ b/Mko888/src/main/AndroidManifest.xml
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/java/com/web/MKO888/MainActivity2.java b/Mko888/src/main/java/com/web/MKO888/MainActivity2.java
new file mode 100644
index 0000000..084db10
--- /dev/null
+++ b/Mko888/src/main/java/com/web/MKO888/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.MKO888;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 96;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://www.mko888.net/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Mko888/src/main/java/com/web/MKO888/MyFirebaseMessageingService.java b/Mko888/src/main/java/com/web/MKO888/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..703d0aa
--- /dev/null
+++ b/Mko888/src/main/java/com/web/MKO888/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.MKO888;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Mko888/src/main/java/com/web/MKO888/WebApplication.java b/Mko888/src/main/java/com/web/MKO888/WebApplication.java
new file mode 100644
index 0000000..92fc4bb
--- /dev/null
+++ b/Mko888/src/main/java/com/web/MKO888/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.MKO888;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Mko888/src/main/res/drawable-anydpi/ic_action_back.xml b/Mko888/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Mko888/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Mko888/src/main/res/drawable-hdpi/ic_action_back.png b/Mko888/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Mko888/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Mko888/src/main/res/drawable-mdpi/ic_action_back.png b/Mko888/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Mko888/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Mko888/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Mko888/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Mko888/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/drawable-xhdpi/ic_action_back.png b/Mko888/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Mko888/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Mko888/src/main/res/drawable-xxhdpi/ic_action_back.png b/Mko888/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Mko888/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Mko888/src/main/res/drawable/ic_launcher_background.xml b/Mko888/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Mko888/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Mko888/src/main/res/drawable/input_bg.xml b/Mko888/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Mko888/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mko888/src/main/res/drawable/pass_word_bg.xml b/Mko888/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Mko888/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Mko888/src/main/res/drawable/pass_word_bg1.xml b/Mko888/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Mko888/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/drawable/pass_word_bg2.xml b/Mko888/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Mko888/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/drawable/shape_btn_bg.xml b/Mko888/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Mko888/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/drawable/shape_dialog_bg2.xml b/Mko888/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Mko888/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/drawable/shape_dialog_bg3.xml b/Mko888/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Mko888/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Mko888/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/mipmap-hdpi/ic_empty.png b/Mko888/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Mko888/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Mko888/src/main/res/mipmap-hdpi/ic_pull_down.png b/Mko888/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Mko888/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_close.png b/Mko888/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_facebook.png b/Mko888/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_hometo.png b/Mko888/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_link.png b/Mko888/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_menu.png b/Mko888/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Mko888/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_tel.png b/Mko888/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Mko888/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Mko888/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Mko888/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Mko888/src/main/res/mipmap-xxhdpi/app_logo.png b/Mko888/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..d84ea93
Binary files /dev/null and b/Mko888/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Mko888/src/main/res/values-en/strings.xml b/Mko888/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..8e0c599
--- /dev/null
+++ b/Mko888/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ MKO888
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/values-night/themes.xml b/Mko888/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Mko888/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/values/colors.xml b/Mko888/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Mko888/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/values/strings.xml b/Mko888/src/main/res/values/strings.xml
new file mode 100644
index 0000000..9e0562c
--- /dev/null
+++ b/Mko888/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ MKO888
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/values/style.xml b/Mko888/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Mko888/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/values/themes.xml b/Mko888/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Mko888/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/xml/app_updater_paths.xml b/Mko888/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Mko888/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/xml/network_security_config.xml b/Mko888/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Mko888/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/main/res/xml/provider_paths.xml b/Mko888/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Mko888/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Mko888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Mko888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Mko888/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/Petron777/.gitignore b/Petron777/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/Petron777/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/Petron777/build.gradle b/Petron777/build.gradle
new file mode 100644
index 0000000..81a7f67
--- /dev/null
+++ b/Petron777/build.gradle
@@ -0,0 +1,92 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ applicationId "com.web.petron777"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 106
+ versionName "v1.0.6"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('petron777.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ release {
+ storeFile file('petron777.jks')
+ storePassword "android2014"
+ keyAlias 'key0'
+ keyPassword "android2014"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/Petron777/google-services.json b/Petron777/google-services.json
new file mode 100644
index 0000000..d7146ec
--- /dev/null
+++ b/Petron777/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "58444174936",
+ "project_id": "petron777-7720f",
+ "storage_bucket": "petron777-7720f.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:58444174936:android:cbed18389c63a6b1c8dc2d",
+ "android_client_info": {
+ "package_name": "com.web.petron777"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBwhI_8NkjpJWrvnuETE-HhKnuh1Rv2qKc"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/Petron777/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/Petron777/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/Petron777/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/Petron777/petron777.jks b/Petron777/petron777.jks
new file mode 100644
index 0000000..d6fc58e
Binary files /dev/null and b/Petron777/petron777.jks differ
diff --git a/Petron777/proguard-rules.pro b/Petron777/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/Petron777/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/Petron777/release/Petron777.apk b/Petron777/release/Petron777.apk
new file mode 100644
index 0000000..7b16696
Binary files /dev/null and b/Petron777/release/Petron777.apk differ
diff --git a/Petron777/release/output-metadata.json b/Petron777/release/output-metadata.json
new file mode 100644
index 0000000..d20218d
--- /dev/null
+++ b/Petron777/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.petron777",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 106,
+ "versionName": "v1.0.6",
+ "outputFile": "Petron777-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Petron777/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/Petron777/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/Petron777/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/Petron777/src/main/AndroidManifest.xml b/Petron777/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..65a209c
--- /dev/null
+++ b/Petron777/src/main/AndroidManifest.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/java/com/web/petron777/MainActivity2.java b/Petron777/src/main/java/com/web/petron777/MainActivity2.java
new file mode 100644
index 0000000..9b22845
--- /dev/null
+++ b/Petron777/src/main/java/com/web/petron777/MainActivity2.java
@@ -0,0 +1,54 @@
+package com.web.petron777;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+import com.web.base.MainActivity;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 97;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ MainActivity.saveString(this, "base_url", "https://p777.asia/");
+
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/Petron777/src/main/java/com/web/petron777/MyFirebaseMessageingService.java b/Petron777/src/main/java/com/web/petron777/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..d5022db
--- /dev/null
+++ b/Petron777/src/main/java/com/web/petron777/MyFirebaseMessageingService.java
@@ -0,0 +1,171 @@
+package com.web.petron777;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.ic_launcher)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/Petron777/src/main/java/com/web/petron777/WebApplication.java b/Petron777/src/main/java/com/web/petron777/WebApplication.java
new file mode 100644
index 0000000..f981e78
--- /dev/null
+++ b/Petron777/src/main/java/com/web/petron777/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.petron777;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/Petron777/src/main/res/drawable-anydpi/ic_action_back.xml b/Petron777/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/Petron777/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/Petron777/src/main/res/drawable-hdpi/ic_action_back.png b/Petron777/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/Petron777/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/Petron777/src/main/res/drawable-mdpi/ic_action_back.png b/Petron777/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/Petron777/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/Petron777/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Petron777/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/Petron777/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/drawable-xhdpi/ic_action_back.png b/Petron777/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/Petron777/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/Petron777/src/main/res/drawable-xxhdpi/ic_action_back.png b/Petron777/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/Petron777/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/Petron777/src/main/res/drawable/ic_launcher_background.xml b/Petron777/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/Petron777/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Petron777/src/main/res/drawable/input_bg.xml b/Petron777/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/Petron777/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Petron777/src/main/res/drawable/pass_word_bg.xml b/Petron777/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/Petron777/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/Petron777/src/main/res/drawable/pass_word_bg1.xml b/Petron777/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/Petron777/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/drawable/pass_word_bg2.xml b/Petron777/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/Petron777/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/drawable/shape_btn_bg.xml b/Petron777/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/Petron777/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/drawable/shape_dialog_bg2.xml b/Petron777/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/Petron777/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/drawable/shape_dialog_bg3.xml b/Petron777/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/Petron777/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/Petron777/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/mipmap-hdpi/ic_empty.png b/Petron777/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/Petron777/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/Petron777/src/main/res/mipmap-hdpi/ic_pull_down.png b/Petron777/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/Petron777/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_close.png b/Petron777/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_facebook.png b/Petron777/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_hometo.png b/Petron777/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_link.png b/Petron777/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_menu.png b/Petron777/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_shousuo.png b/Petron777/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_tel.png b/Petron777/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/Petron777/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/Petron777/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/Petron777/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/Petron777/src/main/res/mipmap-xxhdpi/app_logo.png b/Petron777/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..a06c233
Binary files /dev/null and b/Petron777/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/Petron777/src/main/res/values-en/strings.xml b/Petron777/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..8b50030
--- /dev/null
+++ b/Petron777/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ Petron777
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/values-night/themes.xml b/Petron777/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/Petron777/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/values/colors.xml b/Petron777/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/Petron777/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/values/strings.xml b/Petron777/src/main/res/values/strings.xml
new file mode 100644
index 0000000..9923a58
--- /dev/null
+++ b/Petron777/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ Petron777
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/values/style.xml b/Petron777/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/Petron777/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/values/themes.xml b/Petron777/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/Petron777/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/xml/app_updater_paths.xml b/Petron777/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/Petron777/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/xml/network_security_config.xml b/Petron777/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/Petron777/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/main/res/xml/provider_paths.xml b/Petron777/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/Petron777/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Petron777/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/Petron777/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/Petron777/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index d59af97..bb096d3 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1,13 @@
-# web_fengzhuang
+# TestWeb App 封装APP Test版本,新需求修改版本
+# V1.0.0 ~ V1.0.1
+新增银行信息
+新增通知,跳转查看网页
+新增后台接口配置显示关闭权限,跳转打开facebook,telegram等
-## Getting started
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+# V1.0.2 2025年1月8日 start
+新增邮箱通知
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
-
-```
-cd existing_repo
-git remote add origin http://git.dengshikj.com/webapp/web_fengzhuang.git
-git branch -M master
-git push -uf origin master
-```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](http://git.dengshikj.com/webapp/web_fengzhuang/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
-
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
-
-## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
+
\ No newline at end of file
diff --git a/agn888new/.gitignore b/agn888new/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/agn888new/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/agn888new/agn.jks b/agn888new/agn.jks
new file mode 100644
index 0000000..7d66cac
Binary files /dev/null and b/agn888new/agn.jks differ
diff --git a/agn888new/build.gradle b/agn888new/build.gradle
new file mode 100644
index 0000000..4b96aeb
--- /dev/null
+++ b/agn888new/build.gradle
@@ -0,0 +1,94 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ //37
+ compileSdkVersion 31
+
+
+ defaultConfig {
+ //37
+ applicationId "com.web.agn888new"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 104
+ versionName "v1.0.4"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('agn.jks')
+ storePassword "android2025"
+ keyAlias 'key0'
+ keyPassword "android2025"
+ }
+ release {
+ storeFile file('agn.jks')
+ storePassword "android2025"
+ keyAlias 'key0'
+ keyPassword "android2025"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation platform('com.google.firebase:firebase-bom:32.1.0')
+
+ // Add the dependencies for the Firebase Cloud Messaging and Analytics libraries
+ // When using the BoM, you don't specify versions in Firebase library dependencies
+ implementation 'com.google.firebase:firebase-messaging'
+ implementation 'com.google.firebase:firebase-analytics'
+// implementation("com.google.firebase:firebase-messaging:23.2.1")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/agn888new/google-services.json b/agn888new/google-services.json
new file mode 100644
index 0000000..bc5fa57
--- /dev/null
+++ b/agn888new/google-services.json
@@ -0,0 +1,48 @@
+{
+ "project_info": {
+ "project_number": "908864777300",
+ "project_id": "agn888-3b8ef",
+ "storage_bucket": "agn888-3b8ef.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:908864777300:android:682bf12a10bfa0dbac11c1",
+ "android_client_info": {
+ "package_name": "com.web.agn888new"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyB8ISe5W0zOSSvV88sH-u4DMAhO_0Mnjfg"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ },
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:908864777300:android:fc7d3cac6abe01c2ac11c1",
+ "android_client_info": {
+ "package_name": "com.web.agn888newnew"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyB8ISe5W0zOSSvV88sH-u4DMAhO_0Mnjfg"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/agn888new/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/agn888new/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/agn888new/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/agn888new/proguard-rules.pro b/agn888new/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/agn888new/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/agn888new/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/agn888new/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/agn888new/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/agn888new/src/main/AndroidManifest.xml b/agn888new/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..df84a40
--- /dev/null
+++ b/agn888new/src/main/AndroidManifest.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/java/com/web/agn888new/MainActivity2.java b/agn888new/src/main/java/com/web/agn888new/MainActivity2.java
new file mode 100644
index 0000000..2c5ae93
--- /dev/null
+++ b/agn888new/src/main/java/com/web/agn888new/MainActivity2.java
@@ -0,0 +1,51 @@
+package com.web.agn888new;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 37;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+}
diff --git a/agn888new/src/main/java/com/web/agn888new/MyFirebaseMessageingService.java b/agn888new/src/main/java/com/web/agn888new/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..7b925ec
--- /dev/null
+++ b/agn888new/src/main/java/com/web/agn888new/MyFirebaseMessageingService.java
@@ -0,0 +1,172 @@
+package com.web.agn888new;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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.MainActivity2;
+import com.web.base.MessageInfo;
+
+import java.util.Map;
+import java.util.Random;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/agn888new/src/main/java/com/web/agn888new/WebApplication.java b/agn888new/src/main/java/com/web/agn888new/WebApplication.java
new file mode 100644
index 0000000..b8e813a
--- /dev/null
+++ b/agn888new/src/main/java/com/web/agn888new/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.agn888new;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/agn888new/src/main/res/drawable-anydpi/ic_action_back.xml b/agn888new/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/agn888new/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/agn888new/src/main/res/drawable-hdpi/ic_action_back.png b/agn888new/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/agn888new/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/agn888new/src/main/res/drawable-mdpi/ic_action_back.png b/agn888new/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/agn888new/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/agn888new/src/main/res/drawable-v24/ic_launcher_foreground.xml b/agn888new/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/agn888new/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/drawable-xhdpi/ic_action_back.png b/agn888new/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/agn888new/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/agn888new/src/main/res/drawable-xxhdpi/ic_action_back.png b/agn888new/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/agn888new/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/agn888new/src/main/res/drawable/ic_launcher_background.xml b/agn888new/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/agn888new/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/agn888new/src/main/res/drawable/input_bg.xml b/agn888new/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/agn888new/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/agn888new/src/main/res/drawable/pass_word_bg.xml b/agn888new/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/agn888new/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/agn888new/src/main/res/drawable/pass_word_bg1.xml b/agn888new/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/agn888new/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/drawable/pass_word_bg2.xml b/agn888new/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/agn888new/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/drawable/shape_btn_bg.xml b/agn888new/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/agn888new/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/drawable/shape_dialog_bg2.xml b/agn888new/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/agn888new/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/drawable/shape_dialog_bg3.xml b/agn888new/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/agn888new/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/agn888new/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/mipmap-hdpi/ic_empty.png b/agn888new/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/agn888new/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/agn888new/src/main/res/mipmap-hdpi/ic_pull_down.png b/agn888new/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/agn888new/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_close.png b/agn888new/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_facebook.png b/agn888new/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_hometo.png b/agn888new/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_link.png b/agn888new/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_menu.png b/agn888new/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_shousuo.png b/agn888new/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_tel.png b/agn888new/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/agn888new/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/agn888new/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/agn888new/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/agn888new/src/main/res/mipmap-xxhdpi/app_logo.png b/agn888new/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..fdcd8f0
Binary files /dev/null and b/agn888new/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/agn888new/src/main/res/values-en/strings.xml b/agn888new/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..6b880b4
--- /dev/null
+++ b/agn888new/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ AGN888
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ App not installed
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/values-night/themes.xml b/agn888new/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/agn888new/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/values/colors.xml b/agn888new/src/main/res/values/colors.xml
new file mode 100644
index 0000000..ec06067
--- /dev/null
+++ b/agn888new/src/main/res/values/colors.xml
@@ -0,0 +1,19 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+ #DC1927
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/values/strings.xml b/agn888new/src/main/res/values/strings.xml
new file mode 100644
index 0000000..e804ce3
--- /dev/null
+++ b/agn888new/src/main/res/values/strings.xml
@@ -0,0 +1,77 @@
+
+ AGN888
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 应用未安装
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/values/style.xml b/agn888new/src/main/res/values/style.xml
new file mode 100644
index 0000000..bf1389c
--- /dev/null
+++ b/agn888new/src/main/res/values/style.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/values/themes.xml b/agn888new/src/main/res/values/themes.xml
new file mode 100644
index 0000000..a973841
--- /dev/null
+++ b/agn888new/src/main/res/values/themes.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/xml/app_updater_paths.xml b/agn888new/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/agn888new/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/xml/network_security_config.xml b/agn888new/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/agn888new/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/main/res/xml/provider_paths.xml b/agn888new/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/agn888new/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/agn888new/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/agn888new/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/agn888new/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/amb88/.gitignore b/amb88/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/amb88/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/amb88/build.gradle b/amb88/build.gradle
new file mode 100644
index 0000000..fc8bbc4
--- /dev/null
+++ b/amb88/build.gradle
@@ -0,0 +1,86 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ //61
+ applicationId "com.web.amb88"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 11
+ versionName "v1.0.1"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('dskjweb.jks')
+ storePassword "dskj2024"
+ keyAlias 'dskjalias'
+ keyPassword "dskj2024"
+ }
+ release {
+ storeFile file('dskjweb.jks')
+ storePassword "dskj2024"
+ keyAlias 'dskjalias'
+ keyPassword "dskj2024"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+// implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+// implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation("com.google.firebase:firebase-messaging:23.0.0")
+ implementation("com.google.firebase:firebase-analytics:20.0.0")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/amb88/dskjweb.jks b/amb88/dskjweb.jks
new file mode 100644
index 0000000..a303350
Binary files /dev/null and b/amb88/dskjweb.jks differ
diff --git a/amb88/google-services.json b/amb88/google-services.json
new file mode 100644
index 0000000..2d1036f
--- /dev/null
+++ b/amb88/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "12964289424",
+ "project_id": "amb88-4af34",
+ "storage_bucket": "amb88-4af34.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:12964289424:android:eefd01b1203cf5da60f115",
+ "android_client_info": {
+ "package_name": "com.web.amb88"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyBVWdVFuU_okeBn1M__2C0irSwcPNr5gns"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/amb88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/amb88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/amb88/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/amb88/proguard-rules.pro b/amb88/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/amb88/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/amb88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/amb88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/amb88/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/amb88/src/main/AndroidManifest.xml b/amb88/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e8d2842
--- /dev/null
+++ b/amb88/src/main/AndroidManifest.xml
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/java/com/web/amb88/MainActivity2.java b/amb88/src/main/java/com/web/amb88/MainActivity2.java
new file mode 100644
index 0000000..f293801
--- /dev/null
+++ b/amb88/src/main/java/com/web/amb88/MainActivity2.java
@@ -0,0 +1,52 @@
+package com.web.amb88;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 61;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+
+}
diff --git a/amb88/src/main/java/com/web/amb88/MyFirebaseMessageingService.java b/amb88/src/main/java/com/web/amb88/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..67abbb3
--- /dev/null
+++ b/amb88/src/main/java/com/web/amb88/MyFirebaseMessageingService.java
@@ -0,0 +1,172 @@
+package com.web.amb88;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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.MainActivity2;
+import com.web.base.MessageInfo;
+
+import java.util.Map;
+import java.util.Random;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/amb88/src/main/java/com/web/amb88/WebApplication.java b/amb88/src/main/java/com/web/amb88/WebApplication.java
new file mode 100644
index 0000000..846a9f5
--- /dev/null
+++ b/amb88/src/main/java/com/web/amb88/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.amb88;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/amb88/src/main/res/drawable-anydpi/ic_action_back.xml b/amb88/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/amb88/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/amb88/src/main/res/drawable-hdpi/ic_action_back.png b/amb88/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/amb88/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/amb88/src/main/res/drawable-mdpi/ic_action_back.png b/amb88/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/amb88/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/amb88/src/main/res/drawable-v24/ic_launcher_foreground.xml b/amb88/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/amb88/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/drawable-xhdpi/ic_action_back.png b/amb88/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/amb88/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/amb88/src/main/res/drawable-xxhdpi/ic_action_back.png b/amb88/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/amb88/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/amb88/src/main/res/drawable/ic_launcher_background.xml b/amb88/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/amb88/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/amb88/src/main/res/drawable/pass_word_bg.xml b/amb88/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/amb88/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/amb88/src/main/res/drawable/pass_word_bg1.xml b/amb88/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/amb88/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/drawable/pass_word_bg2.xml b/amb88/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/amb88/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/drawable/shape_dialog_bg_new.xml b/amb88/src/main/res/drawable/shape_dialog_bg_new.xml
new file mode 100644
index 0000000..e96d4e0
--- /dev/null
+++ b/amb88/src/main/res/drawable/shape_dialog_bg_new.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/amb88/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/mipmap-xxhdpi/app_logo.png b/amb88/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..295f21a
Binary files /dev/null and b/amb88/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/amb88/src/main/res/values-en/strings.xml b/amb88/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..f8f63af
--- /dev/null
+++ b/amb88/src/main/res/values-en/strings.xml
@@ -0,0 +1,24 @@
+
+ AMB88
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/values-night/themes.xml b/amb88/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/amb88/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/values/colors.xml b/amb88/src/main/res/values/colors.xml
new file mode 100644
index 0000000..85339cd
--- /dev/null
+++ b/amb88/src/main/res/values/colors.xml
@@ -0,0 +1,13 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/values/strings.xml b/amb88/src/main/res/values/strings.xml
new file mode 100644
index 0000000..a2950bc
--- /dev/null
+++ b/amb88/src/main/res/values/strings.xml
@@ -0,0 +1,45 @@
+
+ AMB88
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/values/themes.xml b/amb88/src/main/res/values/themes.xml
new file mode 100644
index 0000000..e47899f
--- /dev/null
+++ b/amb88/src/main/res/values/themes.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/xml/app_updater_paths.xml b/amb88/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/amb88/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/xml/network_security_config.xml b/amb88/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/amb88/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/main/res/xml/provider_paths.xml b/amb88/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/amb88/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/amb88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/amb88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/amb88/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..2d795c3
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,85 @@
+plugins {
+ id 'com.android.application'
+ id 'com.google.gms.google-services'
+}
+
+android {
+ compileSdkVersion 31
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ applicationId "com.web.testapp"
+ minSdkVersion 24
+ targetSdkVersion 31
+ versionCode 107
+ versionName "v1.0.7"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ signingConfigs {
+ debug {
+ storeFile file('test.jks')
+ storePassword "android2025"
+ keyAlias 'key0'
+ keyPassword "android2025"
+ }
+ release {
+ storeFile file('test.jks')
+ storePassword "android2025"
+ keyAlias 'key0'
+ keyPassword "android2025"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ implementation 'com.google.code.gson:gson:2.9.0'
+ implementation 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ // sdk 33
+ implementation platform('com.google.firebase:firebase-bom:32.7.0')
+ // Firebase Cloud Messaging
+ // implementation("com.google.firebase:firebase-messaging")
+// implementation("com.google.firebase:firebase-analytics")
+
+ implementation("com.google.firebase:firebase-messaging:24.0.3")
+// implementation("com.google.firebase:firebase-analytics:21.2.1")
+ // implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0' //直接启动模式
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation project(path: ':base')
+
+}
\ No newline at end of file
diff --git a/app/google-services.json b/app/google-services.json
new file mode 100644
index 0000000..0a474df
--- /dev/null
+++ b/app/google-services.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "514702139781",
+ "project_id": "testapp-c6578",
+ "storage_bucket": "testapp-c6578.firebasestorage.app"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:514702139781:android:4774ebdb1437faf1c864ec",
+ "android_client_info": {
+ "package_name": "com.web.testapp"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyDJtJeU50ZxitGq1pNVE0y1INXMWnFRlpA"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
\ No newline at end of file
diff --git a/app/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/app/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/app/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json
new file mode 100644
index 0000000..e48e90a
--- /dev/null
+++ b/app/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.testapp",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 107,
+ "versionName": "v1.0.7",
+ "outputFile": "app-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/app/release/testweb.apk b/app/release/testweb.apk
new file mode 100644
index 0000000..e33b812
Binary files /dev/null and b/app/release/testweb.apk differ
diff --git a/app/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/app/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/app/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b6e45ae
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/web/testapp/MainActivity2.java b/app/src/main/java/com/web/testapp/MainActivity2.java
new file mode 100644
index 0000000..59cfc6c
--- /dev/null
+++ b/app/src/main/java/com/web/testapp/MainActivity2.java
@@ -0,0 +1,52 @@
+package com.web.testapp;
+
+
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+
+public class MainActivity2 extends com.web.base.MainActivity2 {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ userId = 2;
+ saveInt(MainActivity2.this,"user_code",userId);
+ saveInt(MainActivity2.this,"version_code",getVersion());
+ super.onCreate(savedInstanceState);
+ //订阅主题
+ FirebaseMessaging.getInstance().subscribeToTopic("demo")
+ .addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ String msg = "Subscribed";
+ if (!task.isSuccessful()) {
+ msg = "Subscribe failed";
+ }
+
+ }
+ });
+ }
+
+ public int getVersion(){
+ try {
+ PackageManager packageManager = getPackageManager();
+ PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
+ String StringversionName = packageInfo.versionName; // 版本号
+ int versionCode = packageInfo.versionCode; // 版本码
+ // 在这里可以使用versionName和versionCode进行相关的操作
+// Log.d("VersionInfo", "VersionName: " + versionName + ", VersionCode: " + versionCode);
+ return versionCode;
+ } catch (PackageManager.NameNotFoundException e) {
+ return 0;
+ }
+
+ }
+
+
+}
diff --git a/app/src/main/java/com/web/testapp/MyFirebaseMessageingService.java b/app/src/main/java/com/web/testapp/MyFirebaseMessageingService.java
new file mode 100644
index 0000000..484f622
--- /dev/null
+++ b/app/src/main/java/com/web/testapp/MyFirebaseMessageingService.java
@@ -0,0 +1,172 @@
+package com.web.testapp;
+
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+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.MainActivity2;
+import com.web.base.MessageInfo;
+
+import java.util.Map;
+import java.util.Random;
+
+public class MyFirebaseMessageingService extends FirebaseMessagingService {
+
+ public MyFirebaseMessageingService() {
+ }
+
+ @Override
+ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ Map serviceData = remoteMessage.getData(); //后台推送数据
+ if (serviceData != null && serviceData.containsKey("message")) {
+ String value = serviceData.get("message");
+ 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, com.web.base.MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .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(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(messageInfo.getTitle())
+ .setContentText(messageInfo.getContent())
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ }
+ notificationManager.notify(0, notificationBuilder.build());
+ }
+
+ private void showNotification(String title, String body) {
+ Intent notifyIntent = new Intent(this, MainActivity2.class);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
+ ComponentName launchComponent = null;
+ launchComponent = getApplication()
+ .getPackageManager()
+ .getLaunchIntentForPackage(getApplication().getPackageName())
+ .getComponent();
+ notifyIntent.setComponent(launchComponent);
+ }
+ notifyIntent.putExtra("message", body);
+ 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;
+ NotificationCompat.Builder notificationBuilder = null;
+ MessageInfo messageInfo = GsonUtils.getObjFromJSON(body, MessageInfo.class);
+ if (messageInfo != null) {
+ body = messageInfo.getContent();
+ }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ channelwinway = new NotificationChannel(getString(com.web.base.R.string.app_name), "notify", NotificationManager.IMPORTANCE_DEFAULT);
+ channelwinway.enableLights(true);
+ channelwinway.enableVibration(true);
+ notificationManager.createNotificationChannel(channelwinway);
+ notificationBuilder = new NotificationCompat.Builder(this, channelwinway.getId())
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .setContentIntent(pendingIntent);
+ } else {
+ notificationBuilder = new NotificationCompat.Builder(this, getString(com.web.base.R.string.app_name))
+ .setSmallIcon(com.web.base.R.mipmap.app_logo)
+ .setContentTitle(title)
+ .setContentText(body)
+ .setAutoCancel(true)
+ .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();
+// }
+}
diff --git a/app/src/main/java/com/web/testapp/WebApplication.java b/app/src/main/java/com/web/testapp/WebApplication.java
new file mode 100644
index 0000000..784a133
--- /dev/null
+++ b/app/src/main/java/com/web/testapp/WebApplication.java
@@ -0,0 +1,37 @@
+package com.web.testapp;
+
+import android.app.Application;
+import android.content.Context;
+
+import com.tencent.smtt.export.external.TbsCoreSettings;
+import com.tencent.smtt.sdk.QbSdk;
+
+import java.util.HashMap;
+
+public class WebApplication extends Application {
+
+
+ public static Context application;
+ @Override
+ public void onCreate() {
+ super.onCreate();
+// 设置开启优化方案
+ application = this;
+ HashMap map = new HashMap();
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
+ map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
+ QbSdk.initTbsSettings(map);
+ QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
+ @Override
+ public void onCoreInitFinished() {
+
+ }
+
+ @Override
+ public void onViewInitFinished(boolean b) {
+
+ }
+ });
+ QbSdk.setDownloadWithoutWifi(true);
+ }
+}
diff --git a/app/src/main/res/drawable-anydpi/ic_action_back.xml b/app/src/main/res/drawable-anydpi/ic_action_back.xml
new file mode 100644
index 0000000..013ab07
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_action_back.xml
@@ -0,0 +1,11 @@
+
+
+
diff --git a/app/src/main/res/drawable-hdpi/ic_action_back.png b/app/src/main/res/drawable-hdpi/ic_action_back.png
new file mode 100644
index 0000000..1560c04
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_action_back.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_back.png b/app/src/main/res/drawable-mdpi/ic_action_back.png
new file mode 100644
index 0000000..d5841d2
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_action_back.png differ
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..2b068d1
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_back.png b/app/src/main/res/drawable-xhdpi/ic_action_back.png
new file mode 100644
index 0000000..5c14e41
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_action_back.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_back.png b/app/src/main/res/drawable-xxhdpi/ic_action_back.png
new file mode 100644
index 0000000..0516d08
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_action_back.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..07d5da9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/input_bg.xml b/app/src/main/res/drawable/input_bg.xml
new file mode 100644
index 0000000..4e895aa
--- /dev/null
+++ b/app/src/main/res/drawable/input_bg.xml
@@ -0,0 +1,20 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/pass_word_bg.xml b/app/src/main/res/drawable/pass_word_bg.xml
new file mode 100644
index 0000000..2724e60
--- /dev/null
+++ b/app/src/main/res/drawable/pass_word_bg.xml
@@ -0,0 +1,28 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/pass_word_bg1.xml b/app/src/main/res/drawable/pass_word_bg1.xml
new file mode 100644
index 0000000..962cf11
--- /dev/null
+++ b/app/src/main/res/drawable/pass_word_bg1.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/pass_word_bg2.xml b/app/src/main/res/drawable/pass_word_bg2.xml
new file mode 100644
index 0000000..916d99c
--- /dev/null
+++ b/app/src/main/res/drawable/pass_word_bg2.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_btn_bg.xml b/app/src/main/res/drawable/shape_btn_bg.xml
new file mode 100644
index 0000000..af87a0d
--- /dev/null
+++ b/app/src/main/res/drawable/shape_btn_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_dialog_bg2.xml b/app/src/main/res/drawable/shape_dialog_bg2.xml
new file mode 100644
index 0000000..7837a42
--- /dev/null
+++ b/app/src/main/res/drawable/shape_dialog_bg2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_dialog_bg3.xml b/app/src/main/res/drawable/shape_dialog_bg3.xml
new file mode 100644
index 0000000..ca0a18d
--- /dev/null
+++ b/app/src/main/res/drawable/shape_dialog_bg3.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_dialog_bg_new.xml b/app/src/main/res/drawable/shape_dialog_bg_new.xml
new file mode 100644
index 0000000..e96d4e0
--- /dev/null
+++ b/app/src/main/res/drawable/shape_dialog_bg_new.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_notify_typebg.xml b/app/src/main/res/drawable/shape_notify_typebg.xml
new file mode 100644
index 0000000..3da849f
--- /dev/null
+++ b/app/src/main/res/drawable/shape_notify_typebg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_empty.png b/app/src/main/res/mipmap-hdpi/ic_empty.png
new file mode 100644
index 0000000..72473d6
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_empty.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_pull_down.png b/app/src/main/res/mipmap-hdpi/ic_pull_down.png
new file mode 100644
index 0000000..7dc0ec3
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_pull_down.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_close.png b/app/src/main/res/mipmap-xhdpi/ic_close.png
new file mode 100644
index 0000000..c0b0127
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_close.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_email.png b/app/src/main/res/mipmap-xhdpi/ic_email.png
new file mode 100644
index 0000000..aaacc68
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_email.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_facebook.png b/app/src/main/res/mipmap-xhdpi/ic_facebook.png
new file mode 100644
index 0000000..de378dc
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_facebook.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_hometo.png b/app/src/main/res/mipmap-xhdpi/ic_hometo.png
new file mode 100644
index 0000000..4e93043
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_hometo.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_link.png b/app/src/main/res/mipmap-xhdpi/ic_link.png
new file mode 100644
index 0000000..2f98612
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_link.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_menu.png b/app/src/main/res/mipmap-xhdpi/ic_menu.png
new file mode 100644
index 0000000..2b55ec5
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_menu.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_notify_email.png b/app/src/main/res/mipmap-xhdpi/ic_notify_email.png
new file mode 100644
index 0000000..5a2df8e
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notify_email.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_notify_normal.png b/app/src/main/res/mipmap-xhdpi/ic_notify_normal.png
new file mode 100644
index 0000000..f056d32
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notify_normal.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_notify_shangla.png b/app/src/main/res/mipmap-xhdpi/ic_notify_shangla.png
new file mode 100644
index 0000000..eb1d3e9
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notify_shangla.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_notify_xiala.png b/app/src/main/res/mipmap-xhdpi/ic_notify_xiala.png
new file mode 100644
index 0000000..7999f63
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notify_xiala.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_notifylogo.png b/app/src/main/res/mipmap-xhdpi/ic_notifylogo.png
new file mode 100644
index 0000000..b975e45
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_notifylogo.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_shousuo.png b/app/src/main/res/mipmap-xhdpi/ic_shousuo.png
new file mode 100644
index 0000000..16b38be
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_shousuo.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_tel.png b/app/src/main/res/mipmap-xhdpi/ic_tel.png
new file mode 100644
index 0000000..df82270
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_tel.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_whatsapp.png b/app/src/main/res/mipmap-xhdpi/ic_whatsapp.png
new file mode 100644
index 0000000..7ca41ed
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_whatsapp.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_zhangkai.png b/app/src/main/res/mipmap-xhdpi/ic_zhangkai.png
new file mode 100644
index 0000000..bdc84b3
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_zhangkai.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/app_logo.png b/app/src/main/res/mipmap-xxhdpi/app_logo.png
new file mode 100644
index 0000000..1718e20
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/app_logo.png differ
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
new file mode 100644
index 0000000..c796052
--- /dev/null
+++ b/app/src/main/res/values-en/strings.xml
@@ -0,0 +1,54 @@
+
+ TestApp
+ Please Set Your Password
+ Cancel
+ Sure
+ New Version Update
+ Next Update
+ Update Immediately
+ Click to close notification
+ Click to re-download
+ Download failed
+ Click to install
+ Download completed
+ Downloading...
+ Version update
+ Downloading game
+ Getting download data...
+ Version update
+ Downloading game
+ Need to turn on mobile phone notification permission
+ Exit
+ Setting
+ Tip
+ Please enter the invitation code
+ My invitation code:
+ Superior invitation code:
+ Total number of invites:
+ App download link:
+ Share
+ Check Invitation Records
+ Invitation Records
+ Total number of invitees: %d
+ No Data
+ Withdrawal Record
+ Withdrawal Application
+ Edit Bank Card Information
+ 60
+ Name:
+ Please enter the bank card name
+ Bank card account:
+ Please enter the bank card account
+ Country:
+ Please select a country
+ Bank Name:
+ Please select a bank name
+ Note: Please enter the country code before selecting the bank name!
+ Balance: %s
+ Total Earnings: %s
+ Amount: %s
+ Please enter the withdrawal amount
+ Withdrawal application has been submitted
+ No additional data available for now
+ NOTIFICATIONS
+
\ No newline at end of file
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 0000000..4bf7105
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..bd299ee
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,22 @@
+
+
+ #FFFFFF
+ #FFFFFF
+ #FFFFFF
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+ #EF4723
+ #FFFFFFFF
+
+ #2C2C2E
+ #FFA722
+ #434343
+ #BCBCBC
+
+ #ACDFEE
+ #BDDDB7
+ #C3B5D0
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..93e4586
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,76 @@
+
+ TestApp
+ 请输入6位密码
+ 取消
+ 确定
+ 版本更新
+ 下次更新
+ 立即更新
+ 点击关闭通知
+ 点击重新下载
+ 下载失败
+ 点击安装
+ 下载完成
+ 正在下载…
+ 版本更新
+ 下载游戏中
+ 版本更新
+ 下载游戏中
+ 正在获取下载数据…
+ 需要打开手机通知权限
+ 退出
+ 设置
+ 提示
+ 请输入邀请码
+ 我的邀请码:
+ 上级邀请码:
+ 总邀请人数:
+ 邀请您下载:
+ 分享
+ 查看邀请记录
+ 邀请记录
+ 总邀请人数: %d
+ 暂无数据
+ 提现记录
+ 提现申请
+ 编辑银行卡信息
+ 86
+ 持卡人姓名:
+ 请输入持卡人姓名
+ 国家地区:
+ 请选择国家地区
+ 开户行名称:
+ 请选择开户行名称
+ 银行户口:
+ 请输入银行卡户口
+ (注:请先输入国家区号再选择开户行名称!)
+ 余额: %s
+ 总收益: %s
+ 金额: %s
+ 请输入提现金额
+ 提现申请已提交
+ 暂无更多数据
+ 通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..e47899f
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/app_updater_paths.xml b/app/src/main/res/xml/app_updater_paths.xml
new file mode 100644
index 0000000..1254450
--- /dev/null
+++ b/app/src/main/res/xml/app_updater_paths.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml
new file mode 100644
index 0000000..dca93c0
--- /dev/null
+++ b/app/src/main/res/xml/network_security_config.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000..c9a897a
--- /dev/null
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java b/app/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
new file mode 100644
index 0000000..3259554
--- /dev/null
+++ b/app/src/test/java/Tptogiar/calculcator/ExampleUnitTest.java
@@ -0,0 +1,35 @@
+package Tptogiar.calculcator;
+
+import org.junit.Test;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+
+ @Test
+ public void TestPattern(){
+//
+ Pattern compile = Pattern.compile( "^(\\-|\\+)?\\d+(\\.\\d+)?$");
+ String a="+45.5";
+ boolean matches = compile.matcher(a).matches();
+ System.out.println(matches);
+ String result = compile.matcher(a).replaceAll("");
+ System.out.println(result);
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/test.jks b/app/test.jks
new file mode 100644
index 0000000..42f20c8
Binary files /dev/null and b/app/test.jks differ
diff --git a/base/.gitignore b/base/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/base/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/base/build.gradle b/base/build.gradle
new file mode 100644
index 0000000..e2c58f6
--- /dev/null
+++ b/base/build.gradle
@@ -0,0 +1,50 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ compileSdkVersion 31
+ defaultConfig {
+ minSdkVersion 24
+ targetSdkVersion 31
+
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ api 'androidx.appcompat:appcompat:1.1.0'
+ api 'com.google.android.material:material:1.1.0'
+ api 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.+'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ api files('libs\\tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar')
+
+ // okhttp相关库
+ api 'com.squareup.okhttp3:okhttp:4.9.3'
+
+ // JSON解析库
+ api 'com.google.code.gson:gson:2.9.0'
+ api 'com.alibaba:fastjson:1.1.71.android'
+ api 'com.squareup.retrofit2:retrofit:2.5.0'
+ api 'com.squareup.retrofit2:converter-scalars:2.3.0'
+ api 'com.squareup.retrofit2:converter-gson:2.4.0'
+ api 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
+ api 'io.reactivex.rxjava2:rxjava:2.1.16'
+ api 'io.reactivex.rxjava2:rxandroid:2.0.2'
+ implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx' // (必选)
+ implementation 'com.github.Justson.AgentWeb:agentweb-filechooser:v5.0.6-androidx' // (可选)
+ implementation 'com.github.Justson:Downloader:v5.0.4-androidx'
+ //implementation 'com.tencent.tbs:tbssdk:44286'
+ implementation("com.github.bumptech.glide:glide:4.13.1")
+ implementation 'com.github.jenly1314.AppUpdater:app-updater:1.1.3'
+}
\ No newline at end of file
diff --git a/base/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar b/base/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar
new file mode 100644
index 0000000..465ea1b
Binary files /dev/null and b/base/libs/tbs_sdk_thirdapp_v4.3.0.386_44286_20230210.jar differ
diff --git a/base/proguard-rules.pro b/base/proguard-rules.pro
new file mode 100644
index 0000000..107b7ee
--- /dev/null
+++ b/base/proguard-rules.pro
@@ -0,0 +1,32 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
+
+-dontwarn dalvik.**
+-dontwarn com.tencent.smtt.**
+
+-keep class com.tencent.smtt.** {
+ *;
+}
+
+-keep class com.tencent.tbs.** {
+ *;
+}
\ No newline at end of file
diff --git a/base/release/output-metadata.json b/base/release/output-metadata.json
new file mode 100644
index 0000000..e48e90a
--- /dev/null
+++ b/base/release/output-metadata.json
@@ -0,0 +1,18 @@
+{
+ "version": 2,
+ "artifactType": {
+ "type": "APK",
+ "kind": "Directory"
+ },
+ "applicationId": "com.web.testapp",
+ "variantName": "processReleaseResources",
+ "elements": [
+ {
+ "type": "SINGLE",
+ "filters": [],
+ "versionCode": 107,
+ "versionName": "v1.0.7",
+ "outputFile": "app-release.apk"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/base/release/testweb.apk b/base/release/testweb.apk
new file mode 100644
index 0000000..e33b812
Binary files /dev/null and b/base/release/testweb.apk differ
diff --git a/base/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java b/base/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..44b9f39
--- /dev/null
+++ b/base/src/androidTest/java/Tptogiar/calculcator/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package Tptogiar.calculcator;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("Tptogiar.calculcator", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/base/src/main/AndroidManifest.xml b/base/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..df1c588
--- /dev/null
+++ b/base/src/main/AndroidManifest.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/base/src/main/java/com/web/base/ActionBankInfoDialog.java b/base/src/main/java/com/web/base/ActionBankInfoDialog.java
new file mode 100644
index 0000000..6432fd6
--- /dev/null
+++ b/base/src/main/java/com/web/base/ActionBankInfoDialog.java
@@ -0,0 +1,214 @@
+package com.web.base;
+
+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 listdata = new ArrayList<>();
+ private List 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>>>() {
+ @Override
+ public void onSuccess(Result