Merge remote-tracking branch 'origin/appbase' into aes
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,3 @@ | ||||
| [submodule "winboll-x"] | ||||
| 	path = winboll-x | ||||
| 	url = https://gitea.winboll.cc/Studio/WinBollX.git | ||||
| [submodule "libjc/jcc/libs"] | ||||
| 	path = libjc/jcc/libs | ||||
| 	url = https://gitea.winboll.cc/Studio/APP_libjc_jcc_libs.git | ||||
|   | ||||
| @@ -1,60 +0,0 @@ | ||||
| package cc.winboll.studio.aes; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.os.Bundle; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import cc.winboll.studio.libaes.beans.AESThemeBean; | ||||
| import cc.winboll.studio.libaes.utils.AESThemeUtil; | ||||
| import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; | ||||
| import android.view.MenuItem; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/30 00:34:02 | ||||
|  * @Describe WinBoLL 活动窗口通用基类 | ||||
|  */ | ||||
| public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLActivity"; | ||||
|  | ||||
|     protected volatile AESThemeBean.ThemeType mThemeType; | ||||
|  | ||||
|     @Override | ||||
|     public Activity getActivity() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getTag() { | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         mThemeType = getThemeType(); | ||||
|         setThemeStyle(); | ||||
|         super.onCreate(savedInstanceState); | ||||
|     } | ||||
|  | ||||
|     AESThemeBean.ThemeType getThemeType() { | ||||
|         /*SharedPreferences sharedPreferences = getSharedPreferences( | ||||
|          SHAREDPREFERENCES_NAME, MODE_PRIVATE); | ||||
|          return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))]; | ||||
|          */ | ||||
|         return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext())); | ||||
|     } | ||||
|  | ||||
|     void setThemeStyle() { | ||||
|         //setTheme(AESThemeBean.getThemeStyle(getThemeType())); | ||||
|         setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext())); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|         if(item.getItemId() == android.R.id.home) { | ||||
|             finish(); | ||||
|             return true; | ||||
|         } | ||||
|         return super.onOptionsItemSelected(item); | ||||
|     } | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Tue Apr 29 14:47:34 HKT 2025 | ||||
| #Sat May 03 10:32:21 GMT 2025 | ||||
| stageCount=7 | ||||
| libraryProject=libappbase | ||||
| baseVersion=15.7 | ||||
| publishVersion=15.7.6 | ||||
| buildCount=0 | ||||
| buildCount=4 | ||||
| baseBetaVersion=15.7.7 | ||||
|   | ||||
| @@ -1,51 +0,0 @@ | ||||
| package cc.winboll.studio.apputils; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 17:11:37 | ||||
|  * @Describe 应用活动窗口基类 | ||||
|  */ | ||||
| import android.app.Activity; | ||||
| import android.os.Bundle; | ||||
| import android.os.PersistableBundle; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; | ||||
| import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager; | ||||
|  | ||||
| public class WinBoLLActivityBase extends Activity implements IWinBoLLActivity { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLActivityBase"; | ||||
|  | ||||
|     @Override | ||||
|     public Activity getActivity() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getTag() { | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     WinBoLLActivityManager getWinBoLLActivityManager() { | ||||
|         return WinBoLLActivityManager.getInstance(GlobalApplication.getInstance()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         getWinBoLLActivityManager().add(this); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) { | ||||
|         super.onPostCreate(savedInstanceState, persistentState); | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     protected void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|         getWinBoLLActivityManager().registeRemove(this); | ||||
|     } | ||||
| } | ||||
| @@ -31,6 +31,11 @@ buildscript { | ||||
|  | ||||
| allprojects { | ||||
|     repositories { | ||||
|         // 本地 Maven 仓库(默认路径为 ~/.m2/repository) | ||||
|         mavenLocal() | ||||
|         // 或自定义本地仓库路径 | ||||
|         maven { url "file:///sdcard/.m2/repository" } | ||||
|          | ||||
|         // Nexus Maven 库地址 | ||||
|         // "WinBoLL Release" | ||||
|         maven { url "https://nexus.winboll.cc/repository/maven-public/" } | ||||
|   | ||||
| @@ -1,17 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 19:08:45 | ||||
|  * @Describe WinBoLLService 服务 Binder。 | ||||
|  */ | ||||
| import android.graphics.drawable.Drawable; | ||||
|  | ||||
| public interface IWinBoLLClientServiceBinder { | ||||
|  | ||||
|     public static final String TAG = "IWinBoLLClientServiceBinder"; | ||||
|  | ||||
|     public WinBoLLClientService getService(); | ||||
|  | ||||
|     public Drawable getCurrentStatusIconDrawable(); | ||||
| } | ||||
| @@ -1,192 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 19:06:54 | ||||
|  * @Describe WinBoLL 客户端服务 | ||||
|  */ | ||||
| import android.app.Service; | ||||
| import android.content.ComponentName; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.ServiceConnection; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.IBinder; | ||||
| import cc.winboll.studio.libaes.winboll.AssistantService; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libappbase.utils.ServiceUtils; | ||||
| import cc.winboll.studio.libapputils.utils.PrefUtils; | ||||
| import com.hjq.toast.ToastUtils; | ||||
|  | ||||
| public class WinBoLLClientService extends Service implements IWinBoLLClientServiceBinder { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLClientService"; | ||||
|  | ||||
|     WinBoLLClientServiceBean mWinBoLLClientServiceBean; | ||||
|     MyServiceConnection mMyServiceConnection; | ||||
|     volatile boolean mIsWinBoLLClientThreadRunning; | ||||
|     volatile boolean mIsEnableService; | ||||
|     volatile WinBoLLClientThread mWinBoLLClientThread; | ||||
|  | ||||
|     public boolean isWinBoLLClientThreadRunning() { | ||||
|         return mIsWinBoLLClientThreadRunning; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public WinBoLLClientService getService() { | ||||
|         return WinBoLLClientService.this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Drawable getCurrentStatusIconDrawable() { | ||||
|         return mIsWinBoLLClientThreadRunning ? | ||||
|             getDrawable(EWUIStatusIconDrawable.getIconDrawableId(EWUIStatusIconDrawable.NORMAL)) | ||||
|             : getDrawable(EWUIStatusIconDrawable.getIconDrawableId(EWUIStatusIconDrawable.NEWS)); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public IBinder onBind(Intent intent) { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         //ToastUtils.show("onCreate"); | ||||
|         super.onCreate(); | ||||
|         mWinBoLLClientThread = null; | ||||
|         mWinBoLLClientServiceBean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(this); | ||||
|         mIsEnableService = mWinBoLLClientServiceBean.isEnable(); | ||||
|  | ||||
|         if (mMyServiceConnection == null) { | ||||
|             mMyServiceConnection = new MyServiceConnection(); | ||||
|         } | ||||
|  | ||||
|         // 由系统启动时,应用可以通过下面函数实例化实际服务进程。 | ||||
|         runMainThread(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public int onStartCommand(Intent intent, int flags, int startId) { | ||||
|         //ToastUtils.show("onStartCommand"); | ||||
|         // 由应用 Intent 启动时,应用可以通过下面函数实例化实际服务进程。 | ||||
|         runMainThread(); | ||||
|  | ||||
|         // 返回运行参数持久化存储后,服务状态控制参数 | ||||
|         // 无论 Intent 传入如何,服务状态一直以持久化存储后的参数控制, | ||||
|         // PS: 另外当然可以通过 Intent 传入的指标来修改 mWinBoLLServiceBean, | ||||
|         //     不过本服务的应用方向会变得繁琐, | ||||
|         //     现阶段只要满足手机端启动与停止本服务,WinBoLL 客户端实例运行在手机端就可以了。 | ||||
|         return mIsEnableService ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); | ||||
|     } | ||||
|  | ||||
|     synchronized void runMainThread() { | ||||
|         if (mWinBoLLClientThread == null) { | ||||
|             //ToastUtils.show("runMainThread()"); | ||||
|             mWinBoLLClientThread = new WinBoLLClientThread(); | ||||
|             mWinBoLLClientThread.start(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void syncWinBoLLClientThreadStatus() { | ||||
|         mWinBoLLClientServiceBean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(this); | ||||
|         mIsEnableService = mWinBoLLClientServiceBean.isEnable(); | ||||
|         LogUtils.d(TAG, String.format("mIsEnableService %s", mIsEnableService)); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     // 唤醒和绑定守护进程 | ||||
|     // | ||||
|     void wakeupAndBindAssistant() { | ||||
|         if (ServiceUtils.isServiceRunning(getApplicationContext(), AssistantService.class.getName()) == false) { | ||||
|             startService(new Intent(WinBoLLClientService.this, AssistantService.class)); | ||||
|             //LogUtils.d(TAG, "call wakeupAndBindAssistant() : Binding... AssistantService"); | ||||
|             bindService(new Intent(WinBoLLClientService.this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // 主进程与守护进程连接时需要用到此类 | ||||
|     // | ||||
|     private class MyServiceConnection implements ServiceConnection { | ||||
|         @Override | ||||
|         public void onServiceConnected(ComponentName name, IBinder service) { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onServiceDisconnected(ComponentName name) {             | ||||
|             mWinBoLLClientServiceBean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(WinBoLLClientService.this); | ||||
|             if (mWinBoLLClientServiceBean.isEnable()) { | ||||
|                 // 唤醒守护进程 | ||||
|                 wakeupAndBindAssistant(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         super.onDestroy(); | ||||
|         //ToastUtils.show("onDestroy"); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onStart(Intent intent, int startId) { | ||||
|         super.onStart(intent, startId); | ||||
|     } | ||||
|  | ||||
|     void setWinBoLLServiceEnableStatus(boolean isEnable) { | ||||
|         WinBoLLClientServiceBean bean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(this); | ||||
|         bean.setIsEnable(isEnable); | ||||
|         WinBoLLClientServiceBean.saveWinBoLLServiceBean(this, bean); | ||||
|     } | ||||
|  | ||||
|     boolean getWinBoLLServiceEnableStatus(Context context) { | ||||
|         mWinBoLLClientServiceBean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(context); | ||||
|         return mWinBoLLClientServiceBean.isEnable(); | ||||
|     } | ||||
|  | ||||
|     /*public interface OnServiceStatusChangeListener { | ||||
|      void onServerStatusChange(boolean isServiceAlive); | ||||
|      } | ||||
|  | ||||
|      public void setOnServerStatusChangeListener(OnServiceStatusChangeListener l) { | ||||
|      mOnServerStatusChangeListener = l; | ||||
|      }*/ | ||||
|  | ||||
|     class WinBoLLClientThread extends Thread { | ||||
|         @Override | ||||
|         public void run() { | ||||
|             super.run(); | ||||
|             LogUtils.d(TAG, "run syncWinBoLLClientThreadStatus"); | ||||
|             syncWinBoLLClientThreadStatus(); | ||||
|             if (mIsEnableService) { | ||||
|                 if (mIsWinBoLLClientThreadRunning == false) { | ||||
|                     // 设置运行状态 | ||||
|                     mIsWinBoLLClientThreadRunning = true; | ||||
|                     LogUtils.d(TAG, "WinBoLLClientThread run()"); | ||||
|  | ||||
|                     // 唤醒守护进程 | ||||
|                     //wakeupAndBindAssistant(); | ||||
|                      | ||||
|                     while (mIsEnableService) { | ||||
|                         // 显示运行状态 | ||||
|                         WinBoLLServiceStatusView.startConnection(); | ||||
|                         LogUtils.d(TAG, String.format("while mIsEnableService is %s", mIsEnableService)); | ||||
|                          | ||||
|                         try { | ||||
|                             Thread.sleep(10 * 1000); | ||||
|                         } catch (InterruptedException e) { | ||||
|                             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|                         } | ||||
|                         syncWinBoLLClientThreadStatus(); | ||||
|                     } | ||||
|  | ||||
|                     // 服务进程退出, 重置进程运行状态 | ||||
|                     WinBoLLServiceStatusView.stopConnection(); | ||||
|                     mIsWinBoLLClientThreadRunning = false; | ||||
|                     mWinBoLLClientThread = null; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,78 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 19:05:15 | ||||
|  * @Describe WinBoLLService 运行参数配置 | ||||
|  */ | ||||
| import android.content.Context; | ||||
| import android.util.JsonReader; | ||||
| import android.util.JsonWriter; | ||||
| import cc.winboll.studio.libappbase.BaseBean; | ||||
| import java.io.IOException; | ||||
|  | ||||
| public class WinBoLLClientServiceBean extends BaseBean { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLClientServiceBean"; | ||||
|  | ||||
|     volatile boolean isEnable; | ||||
|  | ||||
|     public WinBoLLClientServiceBean() { | ||||
|         isEnable = false; | ||||
|     } | ||||
|  | ||||
|     public void setIsEnable(boolean isEnable) { | ||||
|         this.isEnable = isEnable; | ||||
|     } | ||||
|  | ||||
|     public boolean isEnable() { | ||||
|         return isEnable; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return WinBoLLClientServiceBean.class.getName(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { | ||||
|         super.writeThisToJsonWriter(jsonWriter); | ||||
|         WinBoLLClientServiceBean bean = this; | ||||
|         jsonWriter.name("isEnable").value(bean.isEnable()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { | ||||
|         if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { | ||||
|             if (name.equals("isEnable")) { | ||||
|                 setIsEnable(jsonReader.nextBoolean()); | ||||
|             } else { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException { | ||||
|         jsonReader.beginObject(); | ||||
|         while (jsonReader.hasNext()) { | ||||
|             String name = jsonReader.nextName(); | ||||
|             if (!initObjectsFromJsonReader(jsonReader, name)) { | ||||
|                 jsonReader.skipValue(); | ||||
|             } | ||||
|         } | ||||
|         // 结束 JSON 对象 | ||||
|         jsonReader.endObject(); | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     public static WinBoLLClientServiceBean loadWinBoLLClientServiceBean(Context context) { | ||||
|         WinBoLLClientServiceBean bean = WinBoLLClientServiceBean.loadBean(context, WinBoLLClientServiceBean.class); | ||||
|         return bean == null ? new WinBoLLClientServiceBean() : bean; | ||||
|     } | ||||
|  | ||||
|     public static boolean saveWinBoLLServiceBean(WinBoLLClientService service, WinBoLLClientServiceBean bean) { | ||||
|         return WinBoLLClientServiceBean.saveBean(service, bean); | ||||
|     } | ||||
| } | ||||
| @@ -1,22 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 19:13:20 | ||||
|  * @Describe WinBoLL 邮件服务 | ||||
|  */ | ||||
| import android.app.Service; | ||||
| import android.content.Intent; | ||||
| import android.os.IBinder; | ||||
|  | ||||
| public class WinBoLLMail extends Service { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLMail"; | ||||
|  | ||||
|     @Override | ||||
|     public IBinder onBind(Intent intent) { | ||||
|  | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,106 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/29 15:57:28 | ||||
|  * @Describe WinBoLL 服务器服务情况测试访问进程。 | ||||
|  */ | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import java.io.IOException; | ||||
| import okhttp3.Call; | ||||
| import okhttp3.Callback; | ||||
| import okhttp3.Credentials; | ||||
| import okhttp3.OkHttpClient; | ||||
| import okhttp3.Request; | ||||
| import okhttp3.Response; | ||||
|  | ||||
| // 新增自定义回调接口 | ||||
| interface TextCallback { | ||||
|     void onSuccess(String text); | ||||
|     void onFailure(Exception e); | ||||
| } | ||||
|  | ||||
| public class WinBoLLServerConnectionThread extends Thread { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLClientService"; | ||||
|  | ||||
|     private final String url; | ||||
|     private final String username; | ||||
|     private final String password; | ||||
|     private final int connectTimeout; | ||||
|     private final int readTimeout; | ||||
|     private final int maxRetries; | ||||
|     private final TextCallback callback; // 新增回调成员变量 | ||||
|  | ||||
|     // 新增带回调的构造函数 | ||||
|     public WinBoLLServerConnectionThread(String url, String username, String password, TextCallback callback) { | ||||
|         this(url, username, password, 10000, 10000, 5, callback); | ||||
|     } | ||||
|  | ||||
|     // 修改原有构造函数,添加回调参数 | ||||
|     public WinBoLLServerConnectionThread(String url, String username, String password,  | ||||
|                                              int connectTimeout, int readTimeout, int maxRetries, TextCallback callback) { | ||||
|         this.url = url; | ||||
|         this.username = username; | ||||
|         this.password = password; | ||||
|         this.connectTimeout = connectTimeout; | ||||
|         this.readTimeout = readTimeout; | ||||
|         this.maxRetries = maxRetries; | ||||
|         this.callback = callback; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void run() { | ||||
|         LogUtils.d(TAG, String.format("run() url %s\nusername %s\npassword %s", url, username, password)); | ||||
|         String credential = Credentials.basic(username, password); | ||||
|         LogUtils.d(TAG, String.format("credential %s", credential)); | ||||
|  | ||||
|         OkHttpClient client = new OkHttpClient(); | ||||
|         Request request = new Request.Builder() | ||||
|             .url(url) | ||||
|             .header("Accept", "text/plain") | ||||
|             .header("Authorization", credential) | ||||
|             .build(); | ||||
|              | ||||
|         Call call = client.newCall(request); | ||||
|         call.enqueue(new Callback() { | ||||
|                 @Override | ||||
|                 public void onFailure(Call call, IOException e) { | ||||
|                     // 优先调用自定义回调 | ||||
|                     if (callback != null) { | ||||
|                         callback.onFailure(e); | ||||
|                     } else { | ||||
|                         LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 @Override | ||||
|                 public void onResponse(Call call, Response response) throws IOException { | ||||
|                     if (!response.isSuccessful()) { | ||||
|                         if (callback != null) { | ||||
|                             callback.onFailure(new Exception("Unexpected code " + response)); | ||||
|                         } else { | ||||
|                             LogUtils.d(TAG, "Unexpected code " + response, Thread.currentThread().getStackTrace()); | ||||
|                         } | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     try { | ||||
|                         String text = response.body().string(); | ||||
|                         // 优先调用自定义回调 | ||||
|                         if (callback != null) { | ||||
|                             callback.onSuccess(text); | ||||
|                         } else { | ||||
|                             LogUtils.d(TAG, text); | ||||
|                         } | ||||
|                     } catch (Exception e) { | ||||
|                         if (callback != null) { | ||||
|                             callback.onFailure(e); | ||||
|                         } else { | ||||
|                             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             }); | ||||
|     } | ||||
| } | ||||
| @@ -1,473 +0,0 @@ | ||||
| package cc.winboll.studio.libaes.winboll; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@AliYun.Com | ||||
|  * @Date 2025/03/28 17:41:55 | ||||
|  * @Describe WinBoLL 服务主机连接状态视图 | ||||
|  */ | ||||
| import cc.winboll.studio.libaes.R; | ||||
| import android.content.ComponentName; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.content.ServiceConnection; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import android.os.Handler; | ||||
| import android.os.IBinder; | ||||
| import android.os.Message; | ||||
| import android.util.AttributeSet; | ||||
| import android.view.View; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.TextView; | ||||
| import cc.winboll.studio.libaes.winboll.WinBoLLClientService; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libapputils.utils.PrefUtils; | ||||
| import java.time.LocalDateTime; | ||||
| import java.time.format.DateTimeFormatter; | ||||
| //import okhttp3.Authenticator; | ||||
| //import okhttp3.Credentials; | ||||
| //import okhttp3.OkHttpClient; | ||||
| //import okhttp3.Request; | ||||
| //import okhttp3.Response; | ||||
| //import okhttp3.Route; | ||||
|  | ||||
| public class WinBoLLServiceStatusView extends LinearLayout { | ||||
|  | ||||
|     public static final String TAG = "WinBoLLServiceStatusView"; | ||||
|  | ||||
|     public static final int MSG_CONNECTION_INFO = 0; | ||||
|     public static final int MSG_UPDATE_CONNECTION_STATUS = 1; | ||||
|  | ||||
|     static WinBoLLServiceStatusView _WinBoLLServiceStatusView; | ||||
|     Context mContext; | ||||
|     //boolean mIsConnected; | ||||
|     volatile ConnectionThread mConnectionThread; | ||||
|  | ||||
|     String mszServerHost; | ||||
|     WinBoLLClientService mWinBoLLService; | ||||
|     ImageView mImageView; | ||||
|     TextView mTextView; | ||||
|     WinBoLLServiceViewHandler mWinBoLLServiceViewHandler; | ||||
|     //WebView mWebView; | ||||
|     static volatile ConnectionStatus mConnectionStatus; | ||||
|     View.OnClickListener mViewOnClickListener; | ||||
|     static String _mUserName; | ||||
|     static String _mPassword; | ||||
|  | ||||
|     static enum ConnectionStatus { | ||||
|         DISCONNECTED, | ||||
|         START_CONNECT, | ||||
|         CONNECTING, | ||||
|         CONNECTED; | ||||
|     }; | ||||
|  | ||||
|     boolean isBound = false; | ||||
|     ServiceConnection connection = new ServiceConnection() { | ||||
|         @Override | ||||
|         public void onServiceConnected(ComponentName name, IBinder service) { | ||||
|             IWinBoLLClientServiceBinder binder = (IWinBoLLClientServiceBinder) service; | ||||
|             mWinBoLLService = binder.getService(); | ||||
|             isBound = true; | ||||
|             // 可以在这里调用Service的方法进行通信,比如获取数据 | ||||
|             mImageView.setBackgroundDrawable(mWinBoLLService.getCurrentStatusIconDrawable()); | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onServiceDisconnected(ComponentName name) { | ||||
|             isBound = false; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     public WinBoLLServiceStatusView(Context context) { | ||||
|         super(context); | ||||
|         mContext = context; | ||||
|         initView(); | ||||
|     } | ||||
|  | ||||
|     public WinBoLLServiceStatusView(Context context, AttributeSet attrs) { | ||||
|         super(context, attrs); | ||||
|         mContext = context; | ||||
|         initView(); | ||||
|     } | ||||
|  | ||||
|     public WinBoLLServiceStatusView(Context context, AttributeSet attrs, int defStyleAttr) { | ||||
|         super(context, attrs, defStyleAttr); | ||||
|         mContext = context; | ||||
|         initView(); | ||||
|     } | ||||
|  | ||||
|     public WinBoLLServiceStatusView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | ||||
|         super(context, attrs, defStyleAttr, defStyleRes); | ||||
|         mContext = context; | ||||
|         initView(); | ||||
|     } | ||||
|  | ||||
|     ConnectionStatus getConnectionStatus() { | ||||
|         return false ? | ||||
|             ConnectionStatus.CONNECTED  | ||||
|             : ConnectionStatus.DISCONNECTED; | ||||
|     } | ||||
|  | ||||
|     void initView() { | ||||
|         _WinBoLLServiceStatusView = this; | ||||
|  | ||||
|         mImageView = new ImageView(mContext); | ||||
|         setImageViewByConnection(mImageView, false); | ||||
|         mConnectionStatus = getConnectionStatus(); | ||||
|         //mIsConnected = false; | ||||
|         //mWinBoLLServerHostConnectionStatus = WinBoLLServerHostConnectionStatus.DISCONNECTED; | ||||
|         //ToastUtils.show("initView()"); | ||||
|  | ||||
|         mViewOnClickListener = new View.OnClickListener(){ | ||||
|             @Override | ||||
|             public void onClick(View v) { | ||||
|                 LogUtils.d(TAG, "onClick()"); | ||||
|                 if (mConnectionStatus == ConnectionStatus.CONNECTED) { | ||||
|                     LogUtils.d(TAG, "Click to stop service."); | ||||
|                     WinBoLLClientServiceBean bean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(mContext); | ||||
|                     bean.setIsEnable(false); | ||||
|                     WinBoLLClientServiceBean.saveBean(mContext, bean); | ||||
|                     Intent intent = new Intent(mContext, WinBoLLClientService.class); | ||||
|                     mContext.stopService(intent); | ||||
|                     //stopConnectionThread(); | ||||
|                     mTextView.setText(""); | ||||
|                     setImageViewByConnection(mImageView, false); | ||||
|                     mConnectionStatus = ConnectionStatus.DISCONNECTED; | ||||
|                 } else if (mConnectionStatus == ConnectionStatus.DISCONNECTED) { | ||||
|                     LogUtils.d(TAG, "Click to start service."); | ||||
|                     WinBoLLClientServiceBean bean = WinBoLLClientServiceBean.loadWinBoLLClientServiceBean(mContext); | ||||
|                     bean.setIsEnable(true); | ||||
|                     WinBoLLClientServiceBean.saveBean(mContext, bean); | ||||
|                     Intent intent = new Intent(mContext, WinBoLLClientService.class); | ||||
|                     mContext.startService(intent); | ||||
|                     //startConnectionThread(); | ||||
|                 } | ||||
|             } | ||||
|         }; | ||||
|         setOnClickListener(mViewOnClickListener); | ||||
|         addView(mImageView); | ||||
|         mTextView = new TextView(mContext); | ||||
|         mWinBoLLServiceViewHandler = new WinBoLLServiceViewHandler(this); | ||||
|         addView(mTextView); | ||||
|         /*mWebView = new WebView(mContext); | ||||
|          mWebView.setWebViewClient(new WebViewClient() { | ||||
|          @Override | ||||
|          public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { | ||||
|          // 弹出系统基本HTTP验证窗口 | ||||
|          handler.proceed("username", "password"); | ||||
|          } | ||||
|          }); | ||||
|          addView(mWebView);*/ | ||||
|     } | ||||
|  | ||||
|     void checkWinBoLLServerStatusAndUpdateCurrentView() { | ||||
|         LogUtils.d(TAG, "checkWinBoLLServerStatusAndUpdateCurrentView()"); | ||||
|         /*if (getConnectionStatus() == ConnectionStatus.CONNECTED) { | ||||
|          mConnectionStatus = ConnectionStatus.CONNECTED; | ||||
|          } else { | ||||
|          mConnectionStatus = ConnectionStatus.DISCONNECTED; | ||||
|          }*/ | ||||
|     } | ||||
|  | ||||
|     public void setServerHost(String szWinBoLLServerHost) { | ||||
|         mszServerHost = szWinBoLLServerHost; | ||||
|     } | ||||
|  | ||||
|     public void setAuthInfo(String username, String password) { | ||||
|         _mUserName = username; | ||||
|         _mPassword = password; | ||||
|     } | ||||
|  | ||||
|     void setImageViewByConnection(ImageView imageView, boolean isConnected) { | ||||
|         //mIsConnected = isConnected; | ||||
|         // 获取vector drawable | ||||
|         Drawable drawable = mContext.getDrawable(isConnected ? R.drawable.ic_dev_connected : R.drawable.ic_dev_disconnected); | ||||
|         if (drawable != null) { | ||||
|             imageView.setImageDrawable(drawable); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     TextCallback apiTextCallback = new TextCallback() { | ||||
|         @Override | ||||
|         public void onSuccess(String text) { | ||||
|             // 处理成功响应 | ||||
|             LogUtils.d(TAG, text); | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onFailure(Exception e) { | ||||
|             // 处理失败情况 | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     TextCallback cipTextCallback = new TextCallback() { | ||||
|         @Override | ||||
|         public void onSuccess(String text) { | ||||
|             // 处理成功响应 | ||||
|             LogUtils.d(TAG, text); | ||||
|             LogUtils.d(TAG, "Develop Host Connection IP is : " + text); | ||||
|             mConnectionStatus = ConnectionStatus.CONNECTED; | ||||
|             // 获取当前时间 | ||||
|             LocalDateTime now = LocalDateTime.now(); | ||||
|             // 定义时间格式 | ||||
|             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); | ||||
|             // 按照指定格式格式化时间并输出 | ||||
|             String formattedDateTime = now.format(formatter); | ||||
|             String msg = "ClientIP<" + formattedDateTime + ">: " + text; | ||||
|             mWinBoLLServiceViewHandler.postMessageText(msg); | ||||
|             mWinBoLLServiceViewHandler.postMessageConnectionStatus(true); | ||||
|  | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void onFailure(Exception e) { | ||||
|             // 处理失败情况 | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|             // 处理网络请求失败 | ||||
|             setImageViewByConnection(mImageView, false); | ||||
|             mWinBoLLServiceViewHandler.postMessageText(e.getMessage()); | ||||
|             mWinBoLLServiceViewHandler.postMessageConnectionStatus(false); | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     public void requestAPIWithBasicAuth() { | ||||
|         String targetUrl = "https://" + (GlobalApplication.isDebuging() ?"dev.winboll": "winboll") + ".cc/api/"; // 替换为实际测试的URL | ||||
|         requestWithBasicAuth(targetUrl, apiTextCallback); | ||||
|     } | ||||
|  | ||||
|     public void requestCIPWithBasicAuth() { | ||||
|         String targetUrl = mszServerHost + "/cip/?simple=true"; | ||||
|         requestWithBasicAuth(targetUrl, cipTextCallback); | ||||
|     } | ||||
|  | ||||
|     public void requestWithBasicAuth(String targetUrl, TextCallback callback) { | ||||
|         String username = ""; | ||||
|         String password = ""; | ||||
|         if (GlobalApplication.isDebuging()) { | ||||
|             username = PrefUtils.getString(mContext, "metDevUserName", ""); | ||||
|             password = PrefUtils.getString(mContext, "metDevUserPassword", ""); | ||||
|         } else { | ||||
|             username = "WinBoLL"; | ||||
|             password = "WinBoLLPowerByZhanGSKen"; | ||||
|         } | ||||
|          | ||||
|         LogUtils.d(TAG, String.format("Connection Start. targetUrl %s", targetUrl)); | ||||
|         WinBoLLServerConnectionThread thread = new WinBoLLServerConnectionThread( | ||||
|             targetUrl, | ||||
|             username, | ||||
|             password, | ||||
|             cipTextCallback | ||||
|         ); | ||||
|         thread.start(); | ||||
|     } | ||||
|  | ||||
|     /*void requestWithBasicAuth(final WinBoLLServiceViewHandler textViewHandler, String targetUrl, final String username, final String password) { | ||||
|      // 用户名和密码,替换为实际的认证信息 | ||||
|      //String username = "your_username"; | ||||
|      //String password = "your_password"; | ||||
|      LogUtils.d(TAG, "requestWithBasicAuth(...)"); | ||||
|      LogUtils.d(TAG, String.format("targetUrl %s", targetUrl)); | ||||
|  | ||||
|      // 构建包含认证信息的请求 | ||||
|      String credential = Credentials.basic(username, password); | ||||
|      LogUtils.d(TAG, String.format("credential %s", credential)); | ||||
|  | ||||
|      OkHttpClient client = new OkHttpClient(); | ||||
|      Request request = new Request.Builder() | ||||
|      .url(targetUrl) | ||||
|      .header("Accept", "text/plain") // 设置正确的Content-Type头 | ||||
|      .header("Authorization", credential) | ||||
|      .build(); | ||||
|  | ||||
|      Call call = client.newCall(request); | ||||
|      call.enqueue(new Callback() { | ||||
|      @Override | ||||
|      public void onFailure(Call call, IOException e) { | ||||
|      // 处理网络请求失败 | ||||
|      setImageViewByConnection(mImageView, false); | ||||
|      textViewHandler.postMessageText(e.getMessage()); | ||||
|      textViewHandler.postMessageConnectionStatus(false); | ||||
|      LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|      //String sz = "请求失败,状态码: " + response.code(); | ||||
|      //setImageViewByConnection(mImageView, false); | ||||
|      //LogUtils.d(TAG, sz); | ||||
|      } | ||||
|  | ||||
|      @Override | ||||
|      public void onResponse(Call call, Response response) throws IOException { | ||||
|      if (!response.isSuccessful()) { | ||||
|      setImageViewByConnection(mImageView, false); | ||||
|      textViewHandler.postMessageText("Unexpected code " + response); | ||||
|      textViewHandler.postMessageConnectionStatus(false); | ||||
|      LogUtils.d(TAG, "Unexpected code " + response, Thread.currentThread().getStackTrace()); | ||||
|      return; | ||||
|      } | ||||
|  | ||||
|      try { | ||||
|      // 读取响应体作为字符串,注意这里可能需要解码 | ||||
|      String text = response.body().string(); | ||||
|      LogUtils.d(TAG, "Develop Host Connection IP is : " + text); | ||||
|      mConnectionStatus = ConnectionStatus.CONNECTED; | ||||
|      // 获取当前时间 | ||||
|      LocalDateTime now = LocalDateTime.now(); | ||||
|      // 定义时间格式 | ||||
|      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); | ||||
|      // 按照指定格式格式化时间并输出 | ||||
|      String formattedDateTime = now.format(formatter); | ||||
|      textViewHandler.postMessageText("ClientIP<" + formattedDateTime + ">: " + text); | ||||
|      textViewHandler.postMessageConnectionStatus(true); | ||||
|  | ||||
|      //org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(text); | ||||
|      //LogUtils.d(TAG, doc.text()); | ||||
|  | ||||
|      // 使用id选择器找到具有特定id的元素 | ||||
|      //org.jsoup.nodes.Element elementWithId = doc.select("#LastRelease").first(); // 获取第一个匹配的元素 | ||||
|  | ||||
|      // 提取并打印元素的文本内容 | ||||
|      //mszNewestAppPackageName = elementWithId.text(); | ||||
|      //ToastUtils.delayedShow(text + "\n" + mszNewestAppPackageName, 5000); | ||||
|  | ||||
|      //mHandler.sendMessage(mHandler.obtainMessage(MSG_APPUPDATE_CHECKED)); | ||||
|      //System.out.println(response.body().string()); | ||||
|      //                        mConnectionStatus = ConnectionStatus.CONNECTED; | ||||
|      //                        // 获取当前时间 | ||||
|      //                        LocalDateTime now = LocalDateTime.now(); | ||||
|      // | ||||
|      //                        // 定义时间格式 | ||||
|      //                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); | ||||
|      //                        // 按照指定格式格式化时间并输出 | ||||
|      //                        String formattedDateTime = now.format(formatter); | ||||
|      //                        //System.out.println(formattedDateTime); | ||||
|      //                        textViewHandler.postMessageText("ClientIP<" + formattedDateTime + ">: " + response.body().string()); | ||||
|      //                        textViewHandler.postMessageConnectionStatus(true); | ||||
|      } catch (Exception e) { | ||||
|      LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|      } | ||||
|      } | ||||
|      }); | ||||
|  | ||||
|      }*/ | ||||
|  | ||||
|     class WinBoLLServiceViewHandler extends Handler { | ||||
|         WinBoLLServiceStatusView mDevelopHostConnectionStatusView; | ||||
|  | ||||
|         public WinBoLLServiceViewHandler(WinBoLLServiceStatusView view) { | ||||
|             mDevelopHostConnectionStatusView = view; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void handleMessage(Message msg) { | ||||
|             if (msg.what == MSG_CONNECTION_INFO) { | ||||
|                 mDevelopHostConnectionStatusView.mTextView.setText((String)msg.obj); | ||||
|             } else if (msg.what == MSG_UPDATE_CONNECTION_STATUS) { | ||||
|                 mDevelopHostConnectionStatusView.setImageViewByConnection(mImageView, (boolean)msg.obj); | ||||
|                 mDevelopHostConnectionStatusView.mConnectionStatus = ((boolean)msg.obj) ? ConnectionStatus.CONNECTED : ConnectionStatus.DISCONNECTED; | ||||
|             } | ||||
|             super.handleMessage(msg); | ||||
|         } | ||||
|  | ||||
|         void postMessageText(String szMSG) { | ||||
|             Message msg = new Message(); | ||||
|             msg.what = MSG_CONNECTION_INFO; | ||||
|             msg.obj = szMSG; | ||||
|             sendMessage(msg); | ||||
|         } | ||||
|  | ||||
|         void postMessageConnectionStatus(boolean isConnected) { | ||||
|             Message msg = new Message(); | ||||
|             msg.what = MSG_UPDATE_CONNECTION_STATUS; | ||||
|             msg.obj = isConnected; | ||||
|             sendMessage(msg); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void startConnection() { | ||||
|         if (_WinBoLLServiceStatusView != null) { | ||||
|             _WinBoLLServiceStatusView.startConnectionThread(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void stopConnection() { | ||||
|         if (_WinBoLLServiceStatusView != null) { | ||||
|             _WinBoLLServiceStatusView.stopConnectionThread(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void startConnectionThread() { | ||||
|         if (mConnectionStatus == ConnectionStatus.DISCONNECTED) { | ||||
|             mConnectionStatus = ConnectionStatus.START_CONNECT; | ||||
|             LogUtils.d(TAG, "startConnectionThread"); | ||||
|             if (mConnectionThread != null) { | ||||
|                 LogUtils.d(TAG, "mConnectionThread != null"); | ||||
|                 mConnectionThread.mIsExist = true; | ||||
|             } | ||||
|             mConnectionThread = new ConnectionThread(); | ||||
|             mConnectionThread.start(); | ||||
|         } else if (mConnectionStatus == ConnectionStatus.CONNECTING) { | ||||
|             //LogUtils.d(TAG, "mConnectionStatus == ConnectionStatus.CONNECTING"); | ||||
|         } else if (mConnectionStatus == ConnectionStatus.CONNECTED) { | ||||
|             //LogUtils.d(TAG, "mConnectionStatus == ConnectionStatus.CONNECTED"); | ||||
|         } else { | ||||
|             LogUtils.d(TAG, String.format("Unknow mConnectionStatus %s, can not start ConnectionThread.", mConnectionStatus)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void stopConnectionThread() { | ||||
|         LogUtils.d(TAG, "stopConnectionThread"); | ||||
|         if (mConnectionThread != null) { | ||||
|             LogUtils.d(TAG, "mConnectionThread != null"); | ||||
|             mConnectionThread.mIsExist = true; | ||||
|             mConnectionThread = null; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|  | ||||
|     class ConnectionThread extends Thread { | ||||
|  | ||||
|         public volatile boolean mIsExist; | ||||
|  | ||||
|         //DevelopHostConnectionStatusViewHandler mDevelopHostConnectionStatusViewHandler; | ||||
|  | ||||
|         //public ConnectionThread(DevelopHostConnectionStatusViewHandler developHostConnectionStatusViewHandler) { | ||||
|         //mDevelopHostConnectionStatusViewHandler = developHostConnectionStatusViewHandler; | ||||
|         //} | ||||
|         public ConnectionThread() { | ||||
|             mIsExist = false; | ||||
|         } | ||||
|  | ||||
|         @Override | ||||
|         public void run() { | ||||
|             super.run(); | ||||
|             while (mIsExist == false) { | ||||
|                 if (mConnectionStatus == ConnectionStatus.START_CONNECT) { | ||||
|                     mConnectionStatus = ConnectionStatus.CONNECTING; | ||||
|                     //requestAPIWithBasicAuth(); | ||||
|                     requestCIPWithBasicAuth(); | ||||
|                 } else if (mConnectionStatus == ConnectionStatus.CONNECTED | ||||
|                            || mConnectionStatus == ConnectionStatus.DISCONNECTED) { | ||||
|                     //ToastUtils.show("mWinBoLLServerHostConnectionStatus " + mConnectionStatus); | ||||
|                     LogUtils.d(TAG, String.format("mConnectionStatus done %s", mConnectionStatus)); | ||||
|                 } else { | ||||
|                     LogUtils.d(TAG, String.format("mConnectionStatus unknow %s", mConnectionStatus)); | ||||
|                 } | ||||
|  | ||||
|                 try { | ||||
|                     Thread.sleep(5 * 1000); | ||||
|                 } catch (InterruptedException e) { | ||||
|                     LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|                 } | ||||
|             } | ||||
|             //ToastUtils.show("ConnectionThread exit."); | ||||
|             LogUtils.d(TAG, "ConnectionThread exit."); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /*WinBoLLService.OnServiceStatusChangeListener mOnServerStatusChangeListener = new WinBoLLService.OnServiceStatusChangeListener(){ | ||||
|      @Override | ||||
|      public void onServerStatusChange(boolean isServiceAlive) { | ||||
|      } | ||||
|      };*/ | ||||
| } | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Tue Apr 29 14:47:16 HKT 2025 | ||||
| #Sat May 03 10:32:21 GMT 2025 | ||||
| stageCount=7 | ||||
| libraryProject=libappbase | ||||
| baseVersion=15.7 | ||||
| publishVersion=15.7.6 | ||||
| buildCount=0 | ||||
| buildCount=4 | ||||
| baseBetaVersion=15.7.7 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen