更新类库,重构基础活动窗口类为实际活动窗口类。
This commit is contained in:
		| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Wed Feb 05 02:35:15 GMT 2025 | ||||
| #Wed Feb 05 23:35:25 GMT 2025 | ||||
| stageCount=1 | ||||
| libraryProject=libapputils | ||||
| baseVersion=9.3 | ||||
| publishVersion=9.3.0 | ||||
| buildCount=58 | ||||
| buildCount=63 | ||||
| baseBetaVersion=9.3.1 | ||||
|   | ||||
| @@ -5,18 +5,86 @@ package cc.winboll.studio.apputils; | ||||
|  * @Date 2024/12/08 15:10:51 | ||||
|  * @Describe 全局应用类 | ||||
|  */ | ||||
| import android.app.Application; | ||||
| import android.content.Context; | ||||
| import android.view.Gravity; | ||||
| import android.widget.Toast; | ||||
| import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libapputils.app.MyActivityLifecycleCallbacks; | ||||
| import cc.winboll.studio.libapputils.app.WinBollActivityManager; | ||||
| import cc.winboll.studio.libapputils.bean.DebugBean; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import com.hjq.toast.style.WhiteToastStyle; | ||||
|  | ||||
| public class App extends WinBollGlobalApplication { | ||||
| public class App extends GlobalApplication { | ||||
|  | ||||
|     public static final String TAG = "App"; | ||||
|  | ||||
|     public static final String _ACTION_DEBUGVIEW = App.class.getName() + "_ACTION_DEBUGVIEW"; | ||||
|  | ||||
|     //static volatile WinBollApplication _WinBollApplication = null; | ||||
|     MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks; | ||||
|  | ||||
|     // 标记当前应用是否处于调试状态 | ||||
|     static volatile boolean isDebug = false; | ||||
|  | ||||
|     public synchronized static void setIsDebug(boolean isDebug) { | ||||
|         App.isDebug = isDebug; | ||||
|     } | ||||
|  | ||||
|     public static boolean isDebug() { | ||||
|         return isDebug; | ||||
|     } | ||||
|  | ||||
|     MyActivityLifecycleCallbacks getMyActivityLifecycleCallbacks() { | ||||
|         return mMyActivityLifecycleCallbacks; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Context getApplicationContext() { | ||||
|         return super.getApplicationContext(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Application getApplication() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         super.onCreate(); | ||||
|         //Toast.makeText(getApplication(), "Toast Test", Toast.LENGTH_SHORT).show(); | ||||
|         // 应用环境初始化, 基本调试环境 | ||||
|         // | ||||
|         // 初始化日志模块 | ||||
|         LogUtils.init(this); | ||||
|  | ||||
|         try { | ||||
|             // 初始化 Toast 框架 | ||||
|             ToastUtils.init(this); | ||||
|             // 设置 Toast 布局样式 | ||||
|             //ToastUtils.setView(R.layout.view_toast); | ||||
|             ToastUtils.setStyle(new WhiteToastStyle()); | ||||
|             ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); | ||||
|             // 设置应用调试标志 | ||||
|             DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class); | ||||
|             if (debugBean == null) { | ||||
|                 //ToastUtils.show("debugBean == null"); | ||||
|                 setIsDebug(false); | ||||
|             } else { | ||||
|                 //ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")"); | ||||
|                 setIsDebug(debugBean.isDebuging()); | ||||
|             } | ||||
|             // 应用窗口管理模块参数设置 | ||||
|             // | ||||
|             mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks(); | ||||
|             registerActivityLifecycleCallbacks(mMyActivityLifecycleCallbacks); | ||||
|             // 设置默认 WinBoll 应用 UI 类型 | ||||
|             WinBollActivityManager.getInstance(this).setWinBollUI_TYPE(WinBollActivityManager.WinBollUI_TYPE.Service); | ||||
|             //ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE()); | ||||
|         } catch (Exception e) { | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|             Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| package cc.winboll.studio.apputils; | ||||
|  | ||||
| import android.content.ComponentName; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.content.pm.ResolveInfo; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| @@ -12,22 +16,25 @@ import cc.winboll.studio.apputils.R; | ||||
| import cc.winboll.studio.libapputils.activities.AboutActivity; | ||||
| import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; | ||||
| import cc.winboll.studio.libapputils.activities.QRCodeDecodeActivity; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.WinBollActivityManager; | ||||
| import cc.winboll.studio.libapputils.app.WinBollFactory; | ||||
| import cc.winboll.studio.libapputils.bean.APPInfo; | ||||
| import cc.winboll.studio.libapputils.log.LogActivity; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import cc.winboll.studio.libapputils.view.AboutView; | ||||
| import cc.winboll.studio.libapputils.view.YesNoAlertDialog; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
|  | ||||
| final public class MainActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| final public class MainActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
| 	public static final String TAG = "MainActivity"; | ||||
|  | ||||
|     public static final int REQUEST_QRCODEDECODE_ACTIVITY = 0; | ||||
|  | ||||
|     Toolbar mToolbar; | ||||
|  | ||||
|     @Override | ||||
|     public AppCompatActivity getActivity() { | ||||
|         return this; | ||||
| @@ -58,8 +65,19 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|         super.onCreate(savedInstanceState); | ||||
|         setContentView(R.layout.activity_main); | ||||
|  | ||||
|         Toolbar toolbar = findViewById(R.id.activitymainToolbar1); | ||||
|         setSupportActionBar(toolbar); | ||||
|         // 初始化工具栏 | ||||
|         mToolbar = findViewById(R.id.activitymainToolbar1); | ||||
|         setSupportActionBar(mToolbar); | ||||
|         if (isEnableDisplayHomeAsUp()) { | ||||
|             // 显示后退按钮 | ||||
|             getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
|         } | ||||
|         getSupportActionBar().setSubtitle(getTag()); | ||||
|          | ||||
|         checkResolveActivity(); | ||||
|         archiveInstance(); | ||||
|  | ||||
|  | ||||
|  | ||||
|         // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 | ||||
|         //if (prosessIntents(getIntent())) return; | ||||
| @@ -71,6 +89,79 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
| //        LogUtils.d(TAG, "BuildConfig.DEBUG : " + Boolean.toString(BuildConfig.DEBUG)); | ||||
|     } | ||||
|  | ||||
|     boolean checkResolveActivity() { | ||||
|         PackageManager packageManager = getPackageManager(); | ||||
|         //Intent intent = new Intent("your_action_here"); | ||||
|         Intent intent = getIntent(); | ||||
|         if (intent != null) { | ||||
|             List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); | ||||
|             if (resolveInfoList.size() > 0) { | ||||
|                 // 传入的Intent action在Activity清单的intent-filter的action节点里有定义 | ||||
|                 if (intent.getAction() != null) { | ||||
|                     if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { | ||||
|                         App.setIsDebug(true); | ||||
|                         //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); | ||||
|  | ||||
|                     } | ||||
|                 } | ||||
|                 return true; | ||||
|             } else { | ||||
|                 // 传入的Intent action在Activity清单的intent-filter的action节点里没有定义 | ||||
|                 //ToastUtils.show("false : " + intent.getAction()); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // action在清单文件中没有声明 | ||||
|         ToastUtils.show("false"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     void archiveInstance() { | ||||
|         Intent intent = getIntent(); | ||||
|         StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n"); | ||||
|  | ||||
|         if (intent != null) { | ||||
|             ComponentName componentName = intent.getComponent(); | ||||
|             if (componentName != null) { | ||||
|                 String packageName = componentName.getPackageName(); | ||||
|                 //Log.d("AppStarter", "启动本应用的应用包名: " + packageName); | ||||
|                 sb.append("启动本应用的应用包名: \n" + packageName); | ||||
|             } | ||||
|  | ||||
|             sb.append("\nImplicit Intent Tracker :\n接收到的 Intent 动作: \n" + intent.getAction()); | ||||
|             Set<String> categories = intent.getCategories(); | ||||
|             if (categories != null) { | ||||
|                 for (String category : categories) { | ||||
|                     sb.append("\n接收到的 Intent 类别 :\n" + category); | ||||
|                 } | ||||
|             } | ||||
|             Uri data = intent.getData(); | ||||
|             if (data != null) { | ||||
|                 sb.append("\n接收到的 Intent 数据 :\n" + data.toString()); | ||||
|             } | ||||
|         } else { | ||||
|             sb.append("Intent is null."); | ||||
|         } | ||||
|         sb.append("\n\n"); | ||||
|         LogUtils.d(TAG, sb.toString()); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     @Override | ||||
|     protected void onPostCreate(Bundle savedInstanceState) { | ||||
|         super.onPostCreate(savedInstanceState); | ||||
|         // 缓存当前 activity | ||||
|         WinBollActivityManager.getInstance(this).add(this); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         WinBollActivityManager.getInstance(this).registeRemove(this); | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|     public void onTestLogClick(View view) { | ||||
|         LogUtils.d(TAG, "onTestLogClick"); | ||||
|         Toast.makeText(getApplication(), "onTestLogClick", Toast.LENGTH_SHORT).show(); | ||||
| @@ -86,11 +177,6 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|         WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected String getAppName() { | ||||
|         return getString(R.string.app_name); | ||||
|     } | ||||
|      | ||||
|     // | ||||
|     // 处理传入的 Intent 数据 | ||||
|     // | ||||
| @@ -138,6 +224,14 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         //ToastUtils.show("onCreateOptionsMenu"); | ||||
|         getMenuInflater().inflate(R.menu.toolbar_main, menu); | ||||
|         if (isAddWinBollToolBar()) { | ||||
|             //ToastUtils.show("mIWinBoll.isAddWinBollToolBar()"); | ||||
|             getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); | ||||
|         } | ||||
|         if (App.isDebug()) { | ||||
|             getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); | ||||
|         } | ||||
|          | ||||
|         return super.onCreateOptionsMenu(menu); | ||||
|     } | ||||
|  | ||||
| @@ -150,6 +244,30 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|         } else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) { | ||||
|             Intent intent = new Intent(this, QRCodeDecodeActivity.class); | ||||
|             startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); | ||||
|         } else if (item.getItemId() == R.id.item_testcrashreport) { | ||||
|             for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { | ||||
|                 getString(i); | ||||
|             } | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_log) { | ||||
|             WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_exit) { | ||||
|             exit(); | ||||
|             //ToastUtils.show("item_exit"); | ||||
|             //WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finishAll(); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_info) { | ||||
|             LogUtils.d(TAG, "item_info not yet."); | ||||
|             return true; | ||||
|             //WinBollApplication application = (WinBollApplication) getApplication(); | ||||
|             //application.getMyActivityLifecycleCallbacks().showActivityeInfo(); | ||||
|         } else if (item.getItemId() == R.id.item_exitdebug) { | ||||
|             AboutView.setApp2NormalMode(this); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == android.R.id.home) { | ||||
|             WinBollActivityManager.getInstance(this).finish(this); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_about) { | ||||
|             openAboutActivity(); | ||||
|             return true; | ||||
| @@ -174,6 +292,31 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|         WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AboutActivity.class); | ||||
|     } | ||||
|  | ||||
|     void exit() { | ||||
|         YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ | ||||
|  | ||||
|             @Override | ||||
|             public void onYes() { | ||||
|                 WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onNo() { | ||||
|             } | ||||
|         }; | ||||
|         YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         if (WinBollActivityManager.getInstance(getApplicationContext()).isFirstIWinBollActivity(this)) { | ||||
|             exit(); | ||||
|         } else { | ||||
|             WinBollActivityManager.getInstance(this).finish(this); | ||||
|             super.onBackPressed(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void onTestAboutActivity(View view) { | ||||
|         //ToastUtils.show("onTestAboutActivity"); | ||||
| @@ -185,21 +328,21 @@ final public class MainActivity extends BaseWinBollActivity implements IWinBollA | ||||
|         intent.putExtra(AssetsHtmlActivity.EXTRA_HTMLFILENAME, "javascript_test.html"); | ||||
|         WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AssetsHtmlActivity.class); | ||||
|     } | ||||
|      | ||||
|  | ||||
|     /*@Override | ||||
|     protected void onActivithyResult(int requestCode, int resultCode, Intent data) { | ||||
|         switch (requestCode) { | ||||
|             case REQUEST_QRCODEDECODE_ACTIVITY : { | ||||
|                     if (data != null) { | ||||
|                         String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT); | ||||
|                         ToastUtils.show(text); | ||||
|                     } | ||||
|                     break; | ||||
|                 } | ||||
|             default : { | ||||
|                     //ToastUtils.show(String.format("%d, %d", requestCode, resultCode)); | ||||
|                     super.prosessActivityResult(requestCode, resultCode, data); | ||||
|                 } | ||||
|         } | ||||
|     }*/ | ||||
|      protected void onActivithyResult(int requestCode, int resultCode, Intent data) { | ||||
|      switch (requestCode) { | ||||
|      case REQUEST_QRCODEDECODE_ACTIVITY : { | ||||
|      if (data != null) { | ||||
|      String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT); | ||||
|      ToastUtils.show(text); | ||||
|      } | ||||
|      break; | ||||
|      } | ||||
|      default : { | ||||
|      //ToastUtils.show(String.format("%d, %d", requestCode, resultCode)); | ||||
|      super.prosessActivityResult(requestCode, resultCode, data); | ||||
|      } | ||||
|      } | ||||
|      }*/ | ||||
| } | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package cc.winboll.studio.apputils; | ||||
| import android.os.Bundle; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.view.StringToQrCodeView; | ||||
|  | ||||
| @@ -11,7 +10,7 @@ import cc.winboll.studio.libapputils.view.StringToQrCodeView; | ||||
|  * @Author ZhanGSKen@QQ.COM | ||||
|  * @Date 2025/01/17 19:50:46 | ||||
|  */ | ||||
| public class TestStringToQrCodeViewActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| public class TestStringToQrCodeViewActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|  | ||||
|     public static final String TAG = "TestStringToQrCodeViewActivity"; | ||||
|   | ||||
| @@ -7,10 +7,9 @@ package cc.winboll.studio.apputils; | ||||
| import android.os.Bundle; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
|  | ||||
| public class TestWinBollActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| public class TestWinBollActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "TestWinBollActivity"; | ||||
|  | ||||
|   | ||||
| @@ -38,7 +38,7 @@ dependencies { | ||||
|     api 'androidx.fragment:fragment:1.0.0' | ||||
|     api 'com.google.android.material:material:1.0.0' | ||||
|      | ||||
|     api 'cc.winboll.studio:libappbase:1.1.3' | ||||
|     api 'cc.winboll.studio:libappbase:1.2.0' | ||||
|      | ||||
|     api fileTree(dir: 'libs', include: ['*.jar']) | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Wed Feb 05 02:35:15 GMT 2025 | ||||
| #Wed Feb 05 23:35:25 GMT 2025 | ||||
| stageCount=1 | ||||
| libraryProject=libapputils | ||||
| baseVersion=9.3 | ||||
| publishVersion=9.3.0 | ||||
| buildCount=58 | ||||
| buildCount=63 | ||||
| baseBetaVersion=9.3.1 | ||||
|   | ||||
| @@ -13,14 +13,13 @@ import android.widget.LinearLayout; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.WinBollActivityManager; | ||||
| import cc.winboll.studio.libapputils.bean.APPInfo; | ||||
| import cc.winboll.studio.libapputils.view.AboutView; | ||||
| import com.hjq.toast.ToastUtils; | ||||
|  | ||||
| final public class AboutActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| final public class AboutActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "AboutActivity"; | ||||
|  | ||||
|   | ||||
| @@ -14,14 +14,13 @@ import android.view.MenuItem; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import cc.winboll.studio.libapputils.view.SimpleWebView; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
|  | ||||
| public class AssetsHtmlActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| public class AssetsHtmlActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "AssetsHtmlActivity"; | ||||
|  | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import androidx.appcompat.widget.Toolbar; | ||||
| import androidx.core.app.ActivityCompat; | ||||
| import androidx.core.content.ContextCompat; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import com.google.zxing.ResultPoint; | ||||
| import com.journeyapps.barcodescanner.BarcodeCallback; | ||||
| @@ -22,7 +21,7 @@ import com.journeyapps.barcodescanner.BarcodeResult; | ||||
| import com.journeyapps.barcodescanner.DecoratedBarcodeView; | ||||
| import java.util.List; | ||||
|  | ||||
| public class QRCodeDecodeActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| public class QRCodeDecodeActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "QRCodeDecodeActivity"; | ||||
|  | ||||
|   | ||||
| @@ -1,240 +0,0 @@ | ||||
| package cc.winboll.studio.libapputils.ads; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@QQ.COM | ||||
|  * @Date 2024/12/09 15:37:35 | ||||
|  * @Describe WinBoll 应用推广视图 | ||||
|  */ | ||||
| import android.content.Context; | ||||
| import android.util.AttributeSet; | ||||
| import android.view.View; | ||||
| import android.webkit.WebView; | ||||
| import android.webkit.WebViewClient; | ||||
| import android.widget.RelativeLayout; | ||||
| import com.hjq.toast.ToastUtils; | ||||
|  | ||||
| public class ADsView extends RelativeLayout { | ||||
|  | ||||
|     public static final String TAG = "ADsView"; | ||||
|  | ||||
|     public volatile boolean mIsHandling; | ||||
|     public volatile boolean mIsAddNewLog; | ||||
|  | ||||
|     Context mContext; | ||||
|     WebView mWebView; | ||||
|     //ScrollView mScrollView; | ||||
|     //TextView mTextView; | ||||
|     //CheckBox mSelectableCheckBox; | ||||
|     //LogViewThread mLogViewThread; | ||||
|     //LogViewHandler mLogViewHandler; | ||||
|     //Spinner mLogLevelSpinner; | ||||
|     //ArrayAdapter<CharSequence> mLogLevelSpinnerAdapter; | ||||
|  | ||||
|     public ADsView(Context context) { | ||||
|         super(context); | ||||
|         initView(context); | ||||
|     } | ||||
|  | ||||
|     public ADsView(Context context, AttributeSet attrs) { | ||||
|         super(context, attrs); | ||||
|         initView(context); | ||||
|     } | ||||
|  | ||||
|     public ADsView(Context context, AttributeSet attrs, int defStyleAttr) { | ||||
|         super(context, attrs, defStyleAttr); | ||||
|         initView(context); | ||||
|     } | ||||
|  | ||||
|     public ADsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { | ||||
|         super(context, attrs, defStyleAttr, defStyleRes); | ||||
|         initView(context); | ||||
|     } | ||||
|  | ||||
| //    public void start() { | ||||
| //        mLogViewThread = new LogViewThread(LogView.this); | ||||
| //        mLogViewThread.start(); | ||||
| //        // 显示日志 | ||||
| //        showAndScrollLogView(); | ||||
| //    } | ||||
| // | ||||
| //    public void scrollLogUp() { | ||||
| //        mScrollView.post(new Runnable() { | ||||
| //                @Override | ||||
| //                public void run() { | ||||
| //                    mScrollView.fullScroll(ScrollView.FOCUS_DOWN); | ||||
| //                    // 日志显示结束 | ||||
| //                    mLogViewHandler.setIsHandling(false); | ||||
| //                    // 检查是否添加了新日志 | ||||
| //                    if (mLogViewHandler.isAddNewLog()) { | ||||
| //                        // 有新日志添加,先更改新日志标志 | ||||
| //                        mLogViewHandler.setIsAddNewLog(false); | ||||
| //                        // 再次发送显示日志的显示 | ||||
| //                        Message message = mLogViewHandler.obtainMessage(LogViewHandler.MSG_LOGVIEW_UPDATE); | ||||
| //                        mLogViewHandler.sendMessage(message); | ||||
| //                    } | ||||
| //                } | ||||
| //            }); | ||||
| //    } | ||||
|  | ||||
|     void initView(Context context) { | ||||
|         mContext = context; | ||||
|  | ||||
| //        mLogViewHandler = new LogViewHandler(); | ||||
|         // 加载视图布局 | ||||
|         View viewMain = inflate(mContext, cc.winboll.studio.libapputils.R.layout.view_ads, null); | ||||
|         mWebView = viewMain.findViewById(cc.winboll.studio.libapputils.R.id.viewadsWebView1); | ||||
|         mWebView.setWebViewClient(new WebViewClient() { | ||||
|                 @Override | ||||
|                 public boolean shouldOverrideUrlLoading(WebView view, String url) { | ||||
|                     view.loadUrl(url); | ||||
|                     ToastUtils.show(url); | ||||
|                     return true; | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
| //        // 初始化日志子控件视图 | ||||
| //        // | ||||
| //        mScrollView = findViewById(cc.winboll.studio.libapputils.R.id.viewlogScrollViewLog); | ||||
| //        mTextView = findViewById(cc.winboll.studio.libapputils.R.id.viewlogTextViewLog); | ||||
| //        // 获取Log Level spinner实例 | ||||
| //        mLogLevelSpinner = findViewById(cc.winboll.studio.libapputils.R.id.viewlogSpinner1); | ||||
| // | ||||
| //        (findViewById(cc.winboll.studio.libapputils.R.id.viewlogButtonClean)).setOnClickListener(new View.OnClickListener(){ | ||||
| // | ||||
| //                @Override | ||||
| //                public void onClick(View v) { | ||||
| //                    LogUtils.cleanLog(); | ||||
| //                    LogUtils.d(TAG, "Log is cleaned."); | ||||
| //                } | ||||
| //            }); | ||||
| //        (findViewById(cc.winboll.studio.libapputils.R.id.viewlogButtonCopy)).setOnClickListener(new View.OnClickListener(){ | ||||
| // | ||||
| //                @Override | ||||
| //                public void onClick(View v) { | ||||
| // | ||||
| //                    ClipboardManager cm = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); | ||||
| //                    cm.setPrimaryClip(ClipData.newPlainText(mContext.getPackageName(), LogUtils.loadLog())); | ||||
| //                    LogUtils.d(TAG, "Log is copied."); | ||||
| //                } | ||||
| //            }); | ||||
| //        mSelectableCheckBox = findViewById(cc.winboll.studio.libapputils.R.id.viewlogCheckBoxSelectable); | ||||
| //        mSelectableCheckBox.setOnClickListener(new View.OnClickListener(){ | ||||
| //                @Override | ||||
| //                public void onClick(View v) { | ||||
| //                    if (mSelectableCheckBox.isChecked()) { | ||||
| //                        setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); | ||||
| //                    } else { | ||||
| //                        setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); | ||||
| //                    } | ||||
| //                } | ||||
| //            }); | ||||
| // | ||||
| //        // 设置日志级别列表 | ||||
| //        ArrayList<String> adapterItems = new ArrayList<>(); | ||||
| //        for (LogUtils.LOG_LEVEL e : LogUtils.LOG_LEVEL.values()) { | ||||
| //            adapterItems.add(e.name()); | ||||
| //        } | ||||
| //        // 假设你有一个字符串数组作为选项列表 | ||||
| //        //String[] options = {"Option 1", "Option 2", "Option 3"}; | ||||
| //        // 创建一个ArrayAdapter来绑定数据到spinner | ||||
| //        mLogLevelSpinnerAdapter = ArrayAdapter.createFromResource( | ||||
| //            context, cc.winboll.studio.libapputils.R.array.enum_loglevel_array, android.R.layout.simple_spinner_item); | ||||
| //        mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); | ||||
| // | ||||
| //        // 设置适配器并将它应用到spinner上 | ||||
| //        mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉视图样式 | ||||
| //        mLogLevelSpinner.setAdapter(mLogLevelSpinnerAdapter); | ||||
| //        // 为Spinner添加监听器 | ||||
| //        mLogLevelSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { | ||||
| //                @Override | ||||
| //                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { | ||||
| //                    //String selectedOption = mLogLevelSpinnerAdapter.getItem(position); | ||||
| //                    // 处理选中的选项... | ||||
| //                    LogUtils.setLogLevel(LogUtils.LOG_LEVEL.values()[position]); | ||||
| //                } | ||||
| //                @Override | ||||
| //                public void onNothingSelected(AdapterView<?> parent) { | ||||
| //                    // 如果没有选择,则执行此操作... | ||||
| //                } | ||||
| //            }); | ||||
| //        // 获取默认值的索引 | ||||
| //        int defaultValueIndex = LogUtils.getLogLevel().ordinal(); | ||||
| // | ||||
| //        if (defaultValueIndex != -1) { | ||||
| //            // 如果找到了默认值,设置默认选项 | ||||
| //            mLogLevelSpinner.setSelection(defaultValueIndex); | ||||
| //        } | ||||
| // | ||||
| //        // 设置滚动时不聚焦日志 | ||||
| //        setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); | ||||
|     } | ||||
|      | ||||
|     public void loadUrl(String url) { | ||||
|         mWebView.loadUrl(url); | ||||
|         //webView.loadUrl("https://www.winboll.cc"); | ||||
|         //webView.loadUrl("https://ads.winboll.cc"); | ||||
|     } | ||||
|  | ||||
| //    public void updateLogView() { | ||||
| //        if (mLogViewHandler.isHandling() == true) { | ||||
| //            // 正在处理日志显示, | ||||
| //            // 就先设置一个新日志标志位 | ||||
| //            // 以便日志显示完后,再次显示新日志内容 | ||||
| //            mLogViewHandler.setIsAddNewLog(true); | ||||
| //        } else { | ||||
| //            //LogUtils.d(TAG, "LogListener showLog(String path)"); | ||||
| //            Message message = mLogViewHandler.obtainMessage(LogViewHandler.MSG_LOGVIEW_UPDATE); | ||||
| //            mLogViewHandler.sendMessage(message); | ||||
| //            mLogViewHandler.setIsAddNewLog(false); | ||||
| //        } | ||||
| //    } | ||||
| // | ||||
| //    void showAndScrollLogView() { | ||||
| //        mTextView.setText(LogUtils.loadLog()); | ||||
| //        scrollLogUp(); | ||||
| //    } | ||||
| // | ||||
| //    class LogViewHandler extends Handler { | ||||
| // | ||||
| //        final static int MSG_LOGVIEW_UPDATE = 0; | ||||
| //        volatile boolean isHandling; | ||||
| //        volatile boolean isAddNewLog; | ||||
| // | ||||
| //        public LogViewHandler() { | ||||
| //            setIsHandling(false); | ||||
| //            setIsAddNewLog(false); | ||||
| //        } | ||||
| // | ||||
| //        public void setIsHandling(boolean isHandling) { | ||||
| //            this.isHandling = isHandling; | ||||
| //        } | ||||
| // | ||||
| //        public boolean isHandling() { | ||||
| //            return isHandling; | ||||
| //        } | ||||
| // | ||||
| //        public void setIsAddNewLog(boolean isAddNewLog) { | ||||
| //            this.isAddNewLog = isAddNewLog; | ||||
| //        } | ||||
| // | ||||
| //        public boolean isAddNewLog() { | ||||
| //            return isAddNewLog; | ||||
| //        } | ||||
| // | ||||
| //        public void handleMessage(Message msg) { | ||||
| //            switch (msg.what) { | ||||
| //                case MSG_LOGVIEW_UPDATE:{ | ||||
| //                        if (isHandling() == false) { | ||||
| //                            setIsHandling(true); | ||||
| //                            showAndScrollLogView(); | ||||
| //                        } | ||||
| //                        break; | ||||
| //                    } | ||||
| //                default: | ||||
| //                    break; | ||||
| //            } | ||||
| //            super.handleMessage(msg); | ||||
| //        } | ||||
| //    } | ||||
|  | ||||
| } | ||||
| @@ -1,321 +0,0 @@ | ||||
| package cc.winboll.studio.libapputils.app; | ||||
|  | ||||
| /** | ||||
|  * @Author ZhanGSKen@QQ.COM | ||||
|  * @Date 2024/08/12 14:32:08 | ||||
|  * @Describe WinBoll 活动窗口基础类 | ||||
|  */ | ||||
| import android.content.ComponentName; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.content.pm.ResolveInfo; | ||||
| import android.net.Uri; | ||||
| import android.os.Bundle; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.activities.AboutActivity; | ||||
| import cc.winboll.studio.libapputils.log.LogActivity; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import cc.winboll.studio.libapputils.view.AboutView; | ||||
| import cc.winboll.studio.libapputils.view.YesNoAlertDialog; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.util.List; | ||||
| import java.util.Set; | ||||
|  | ||||
| public class BaseWinBollActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "BaseWinBollActivity"; | ||||
|  | ||||
|     public static final int REQUEST_LOG_ACTIVITY = 0; | ||||
|  | ||||
|     //IWinBollActivity mIWinBollActivity; | ||||
|     AppCompatActivity mCurrentAppCompatActivity; | ||||
|  | ||||
|     Toolbar mToolBar; | ||||
|     @Override | ||||
|     protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         initCurrentAppCompatActivity(); | ||||
|         checkResolveActivity(); | ||||
|         LogUtils.d(TAG, "onCreate"); | ||||
|         //super.onCreate(savedInstanceState); | ||||
|         archiveInstance(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onDestroy() { | ||||
|         WinBollActivityManager.getInstance(mCurrentAppCompatActivity).registeRemove(this); | ||||
|         super.onDestroy(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onPostResume() { | ||||
|         super.onPostResume(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onSaveInstanceState(Bundle outState) { | ||||
|         super.onSaveInstanceState(outState); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onStart() { | ||||
|         super.onStart(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onStop() { | ||||
|         super.onStop(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onTitleChanged(CharSequence title, int color) { | ||||
|         super.onTitleChanged(title, color); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public AppCompatActivity getActivity() { | ||||
|         return this; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getTag() { | ||||
|         return TAG; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Toolbar initToolBar() { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isEnableDisplayHomeAsUp() { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean isAddWinBollToolBar() { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     public void initCurrentAppCompatActivity() { | ||||
|         mCurrentAppCompatActivity = getActivity(); | ||||
|     } | ||||
|  | ||||
|     boolean checkResolveActivity() { | ||||
|         PackageManager packageManager = mCurrentAppCompatActivity.getPackageManager(); | ||||
|         //Intent intent = new Intent("your_action_here"); | ||||
|         Intent intent = mCurrentAppCompatActivity.getIntent(); | ||||
|         if (intent != null) { | ||||
|             List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); | ||||
|             if (resolveInfoList.size() > 0) { | ||||
|                 // 传入的Intent action在Activity清单的intent-filter的action节点里有定义 | ||||
|                 if (intent.getAction() != null) { | ||||
|                     if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { | ||||
|                         WinBollGlobalApplication.setIsDebug(true); | ||||
|                         //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); | ||||
|  | ||||
|                     } | ||||
|                 } | ||||
|                 return true; | ||||
|             } else { | ||||
|                 // 传入的Intent action在Activity清单的intent-filter的action节点里没有定义 | ||||
|                 //ToastUtils.show("false : " + intent.getAction()); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         // action在清单文件中没有声明 | ||||
|         ToastUtils.show("false"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     void archiveInstance() { | ||||
|         Intent intent = mCurrentAppCompatActivity.getIntent(); | ||||
|         StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n"); | ||||
|  | ||||
|         if (intent != null) { | ||||
|             ComponentName componentName = intent.getComponent(); | ||||
|             if (componentName != null) { | ||||
|                 String packageName = componentName.getPackageName(); | ||||
|                 //Log.d("AppStarter", "启动本应用的应用包名: " + packageName); | ||||
|                 sb.append("启动本应用的应用包名: \n" + packageName); | ||||
|             } | ||||
|  | ||||
|             sb.append("\nImplicit Intent Tracker :\n接收到的 Intent 动作: \n" + intent.getAction()); | ||||
|             Set<String> categories = intent.getCategories(); | ||||
|             if (categories != null) { | ||||
|                 for (String category : categories) { | ||||
|                     sb.append("\n接收到的 Intent 类别 :\n" + category); | ||||
|                 } | ||||
|             } | ||||
|             Uri data = intent.getData(); | ||||
|             if (data != null) { | ||||
|                 sb.append("\n接收到的 Intent 数据 :\n" + data.toString()); | ||||
|             } | ||||
|         } else { | ||||
|             sb.append("Intent is null."); | ||||
|         } | ||||
|         sb.append("\n\n"); | ||||
|         LogUtils.d(TAG, sb.toString()); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected void onPostCreate(Bundle savedInstanceState) { | ||||
|         super.onPostCreate(savedInstanceState); | ||||
|  | ||||
|         // 缓存当前 activity | ||||
|         WinBollActivityManager.getInstance(mCurrentAppCompatActivity).add(this); | ||||
|  | ||||
|         // 初始化工具栏 | ||||
|         mToolBar = initToolBar(); | ||||
|         if (mToolBar != null) { | ||||
|             mCurrentAppCompatActivity.setSupportActionBar(mToolBar); | ||||
|             if (isEnableDisplayHomeAsUp()) { | ||||
|                 // 显示后退按钮 | ||||
|                 mCurrentAppCompatActivity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); | ||||
|             } | ||||
|             mCurrentAppCompatActivity.getSupportActionBar().setSubtitle(getTag()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         if (isAddWinBollToolBar()) { | ||||
|             //ToastUtils.show("mIWinBoll.isAddWinBollToolBar()"); | ||||
|             mCurrentAppCompatActivity.getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); | ||||
|         } | ||||
|         if (WinBollGlobalApplication.isDebug()) { | ||||
|             mCurrentAppCompatActivity.getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); | ||||
|         } | ||||
|         return super.onCreateOptionsMenu(menu); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(MenuItem item) { | ||||
|  | ||||
|         LogUtils.d(TAG, "onOptionsItemSelected"); | ||||
|         //ToastUtils.show(String.format("%s onOptionsItemSelected", TAG)); | ||||
|         if (item.getItemId() == R.id.item_testcrashreport) { | ||||
|             for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { | ||||
|                 mCurrentAppCompatActivity.getString(i); | ||||
|             } | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_log) { | ||||
| //            LogUtils.d(TAG, "item_log not yet."); | ||||
| //            Intent intent = new Intent(this, LogActivity.class); | ||||
| //            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); | ||||
| //            intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); | ||||
| //            startActivity(intent); | ||||
|  | ||||
|             //WinBollActivityManager.getInstance().printAvtivityListInfo(); | ||||
|             WinBollActivityManager.getInstance(mCurrentAppCompatActivity).startWinBollActivity(mCurrentAppCompatActivity, LogActivity.class); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_exit) { | ||||
|             exit(); | ||||
|             //ToastUtils.show("item_exit"); | ||||
|             //WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finishAll(); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_info) { | ||||
|             LogUtils.d(TAG, "item_info not yet."); | ||||
|             return true; | ||||
|             //WinBollApplication application = (WinBollApplication) getApplication(); | ||||
|             //application.getMyActivityLifecycleCallbacks().showActivityeInfo(); | ||||
|         } else if (item.getItemId() == R.id.item_exitdebug) { | ||||
|             AboutView.setApp2NormalMode(mCurrentAppCompatActivity); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == R.id.item_about) { | ||||
|             startAboutActivity(); | ||||
|             return true; | ||||
|         } else if (item.getItemId() == android.R.id.home) { | ||||
|             WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finish(this); | ||||
|             return true; | ||||
|         } | ||||
|         // else if (item.getItemId() == android.R.id.home) { | ||||
|         // 回到主窗口速度缓慢,方法备用。现在用 WinBollActivityManager resumeActivity 和 finish 方法管理。 | ||||
|         // _mMainWinBollActivity 是 WinBollActivity 的静态属性 | ||||
|         // onCreate 函数下 _mMainWinBollActivity 为空时就用 _mMainWinBollActivity = this 赋值。 | ||||
|         //startWinBollActivity(new Intent(_mMainWinBollActivity, _mMainWinBollActivity.getClass()), _mMainWinBollActivity.getTag(), _mMainWinBollActivity); | ||||
|         //} | ||||
|         return super.onOptionsItemSelected(item); | ||||
|     } | ||||
|  | ||||
|     public boolean isAddWinBollInfoMenu() { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void onBackPressed() { | ||||
|         if (WinBollActivityManager.getInstance(getApplicationContext()).isFirstIWinBollActivity(this)) { | ||||
|             exit(); | ||||
|         } else { | ||||
|             WinBollActivityManager.getInstance(mCurrentAppCompatActivity).finish(this); | ||||
|             super.onBackPressed(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected String getAppName() { | ||||
|         return getString(R.string.lib_name); | ||||
|     } | ||||
|  | ||||
|     void exit() { | ||||
|         YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ | ||||
|  | ||||
|             @Override | ||||
|             public void onYes() { | ||||
|                 WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onNo() { | ||||
|             } | ||||
|         }; | ||||
|         YesNoAlertDialog.show(this, "[ " + getAppName() + " ]", "Exit(Yes/No).\nIs close all activity?", listener); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // activity: 为 null 时, | ||||
|     // intent.putExtra 函数 "tag" 参数为 tag | ||||
|     // activity: 不为 null 时, | ||||
|     // intent.putExtra 函数 "tag" 参数为 activity.getTag() | ||||
|     // | ||||
|     public <T extends AboutActivity> void startAboutActivity() { | ||||
|         Intent intent = new Intent(mCurrentAppCompatActivity, AboutActivity.class); | ||||
|         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); | ||||
|         intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); | ||||
|         intent.putExtra("tag", AboutActivity.TAG); | ||||
|         mCurrentAppCompatActivity.startActivity(intent); | ||||
|     } | ||||
|  | ||||
| //    @Override | ||||
| //    public void startActivity(Intent intent) { | ||||
| //        //绑定唯一标识 tag,存在 则根据 taskId 移动到前台 | ||||
| //        String tag = intent.getStringExtra("tag"); | ||||
| //        //ToastUtils.show("startActivityForResult tag " + tag); | ||||
| //        //WinBollActivityManager.getInstance(this).printAvtivityListInfo(); | ||||
| //        if (WinBollActivityManager.getInstance(this).isActive(tag)) { | ||||
| //            //ToastUtils.show("resumeActivity"); | ||||
| //            LogUtils.d(TAG, "resumeActivity"); | ||||
| //            WinBollActivityManager.getInstance(this).resumeActivity(this, tag); | ||||
| //        } else { | ||||
| //            //ToastUtils.show("super.startActivity(intent);"); | ||||
| //            super.startActivity(intent); | ||||
| //        } | ||||
| //    } | ||||
|  | ||||
|     protected void prosessActivityResult(int requestCode, int targetFragment, Intent data) { | ||||
|         LogUtils.d(TAG, "onActivityResult"); | ||||
|         switch (requestCode) { | ||||
|             case REQUEST_LOG_ACTIVITY : { | ||||
|                     LogUtils.d(TAG, "REQUEST_LOG_ACTIVITY"); | ||||
|                     break; | ||||
|                 } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -11,7 +11,6 @@ package cc.winboll.studio.libapputils.app; | ||||
| import android.app.ActivityManager; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.core.app.TaskStackBuilder; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import java.util.HashMap; | ||||
| @@ -23,7 +22,16 @@ public class WinBollActivityManager { | ||||
|     public static final String TAG = "WinBollActivityManager"; | ||||
|     public static final String EXTRA_TAG = "EXTRA_TAG"; | ||||
|  | ||||
|     public static enum WinBollUI_TYPE { | ||||
|         Aplication, // 退出应用后,保持最近任务栏任务记录主窗口 | ||||
|         Service // 退出应用后,清理所有最近任务栏任务记录窗口 | ||||
|         }; | ||||
|  | ||||
|     // 应用类型标志 | ||||
|     volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service; | ||||
|  | ||||
|     Context mContext; | ||||
|     MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks; | ||||
|     static WinBollActivityManager _mWinBollActivityManager; | ||||
|     static Map<String, IWinBollActivity> _mapIWinBollList; | ||||
|     IWinBollActivity firstIWinBollActivity; | ||||
| @@ -43,6 +51,20 @@ public class WinBollActivityManager { | ||||
|         return _mWinBollActivityManager; | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 设置 WinBoll 应用 UI 类型 | ||||
|     // | ||||
|     public synchronized static void setWinBollUI_TYPE(WinBollUI_TYPE mWinBollUI_TYPE) { | ||||
|         _mWinBollUI_TYPE = mWinBollUI_TYPE; | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 获取 WinBoll 应用 UI 类型 | ||||
|     // | ||||
|     public synchronized static WinBollUI_TYPE getWinBollUI_TYPE() { | ||||
|         return _mWinBollUI_TYPE; | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 把Activity添加到管理中 | ||||
|     // | ||||
| @@ -82,6 +104,7 @@ public class WinBollActivityManager { | ||||
|             //打开多任务窗口 flags | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|             intent.putExtra(EXTRA_TAG, tag); | ||||
|             mContext.startActivity(intent); | ||||
|         } catch (InstantiationException | IllegalAccessException e) { | ||||
| @@ -103,6 +126,7 @@ public class WinBollActivityManager { | ||||
|             //打开多任务窗口 flags | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|             intent.putExtra(EXTRA_TAG, tag); | ||||
|             mContext.startActivity(intent); | ||||
|         } catch (InstantiationException | IllegalAccessException e) { | ||||
| @@ -183,11 +207,11 @@ public class WinBollActivityManager { | ||||
|                 //ToastUtils.show("finishAll() activity"); | ||||
|                 if (iWinBoll != null && !iWinBoll.getActivity().isFinishing() && !iWinBoll.getActivity().isDestroyed()) { | ||||
|                     //ToastUtils.show("activity != null ..."); | ||||
|                     if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Service) { | ||||
|                     if (getWinBollUI_TYPE() == WinBollUI_TYPE.Service) { | ||||
|                         // 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。 | ||||
|                         iWinBoll.getActivity().finishAndRemoveTask(); | ||||
|                         //ToastUtils.show("finishAll() activity.finishAndRemoveTask();"); | ||||
|                     } else if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Aplication) { | ||||
|                     } else if (getWinBollUI_TYPE() == WinBollUI_TYPE.Aplication) { | ||||
|                         // 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。 | ||||
|                         iWinBoll.getActivity().finish(); | ||||
|                         //ToastUtils.show("finishAll() activity.finish();"); | ||||
|   | ||||
| @@ -1,103 +0,0 @@ | ||||
| package cc.winboll.studio.libapputils.app; | ||||
|  | ||||
| import android.app.Application; | ||||
| import android.content.Context; | ||||
| import android.view.Gravity; | ||||
| import android.widget.Toast; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libapputils.bean.DebugBean; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import com.hjq.toast.style.WhiteToastStyle; | ||||
|  | ||||
| public class WinBollGlobalApplication extends GlobalApplication { | ||||
|  | ||||
|     public static final String TAG = "WinBollGlobalApplication"; | ||||
|  | ||||
|     public static enum WinBollUI_TYPE { | ||||
|         Aplication, // 退出应用后,保持最近任务栏任务记录主窗口 | ||||
|         Service // 退出应用后,清理所有最近任务栏任务记录窗口 | ||||
|         }; | ||||
|  | ||||
|     // 应用类型标志 | ||||
|     volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service; | ||||
|  | ||||
|     //static volatile WinBollApplication _WinBollApplication = null; | ||||
|     MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks; | ||||
|  | ||||
|     // 标记当前应用是否处于调试状态 | ||||
|     static volatile boolean isDebug = false; | ||||
|  | ||||
|     public synchronized static void setIsDebug(boolean isDebug) { | ||||
|         WinBollGlobalApplication.isDebug = isDebug; | ||||
|     } | ||||
|  | ||||
|     public static boolean isDebug() { | ||||
|         return isDebug; | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 设置 WinBoll 应用 UI 类型 | ||||
|     // | ||||
|     public synchronized static void setWinBollUI_TYPE(WinBollUI_TYPE mWinBollUI_TYPE) { | ||||
|         _mWinBollUI_TYPE = mWinBollUI_TYPE; | ||||
|     } | ||||
|  | ||||
|     // | ||||
|     // 获取 WinBoll 应用 UI 类型 | ||||
|     // | ||||
|     public synchronized static WinBollUI_TYPE getWinBollUI_TYPE() { | ||||
|         return _mWinBollUI_TYPE; | ||||
|     } | ||||
|  | ||||
|     MyActivityLifecycleCallbacks getMyActivityLifecycleCallbacks() { | ||||
|         return mMyActivityLifecycleCallbacks; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Context getApplicationContext() { | ||||
|         return super.getApplicationContext(); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public Application getApplication() { | ||||
|         return this; | ||||
|     } | ||||
|      | ||||
|     @Override | ||||
|     public void onCreate() { | ||||
|         super.onCreate(); | ||||
|         // 应用环境初始化, 基本调试环境 | ||||
|         // | ||||
|         // 初始化日志模块 | ||||
|         LogUtils.init(this); | ||||
|  | ||||
|         try { | ||||
|             // 初始化 Toast 框架 | ||||
|             ToastUtils.init(this); | ||||
|             // 设置 Toast 布局样式 | ||||
|             //ToastUtils.setView(R.layout.view_toast); | ||||
|             ToastUtils.setStyle(new WhiteToastStyle()); | ||||
|             ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); | ||||
|             // 设置应用调试标志 | ||||
|             DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class); | ||||
|             if (debugBean == null) { | ||||
|                 //ToastUtils.show("debugBean == null"); | ||||
|                 setIsDebug(false); | ||||
|             } else { | ||||
|                 //ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")"); | ||||
|                 setIsDebug(debugBean.isDebuging()); | ||||
|             } | ||||
|             // 应用窗口管理模块参数设置 | ||||
|             // | ||||
|             mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks(); | ||||
|             registerActivityLifecycleCallbacks(mMyActivityLifecycleCallbacks); | ||||
|             // 设置默认 WinBoll 应用 UI 类型 | ||||
|             setWinBollUI_TYPE(WinBollUI_TYPE.Service); | ||||
|             //ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE()); | ||||
|         } catch (Exception e) { | ||||
|             LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); | ||||
|             Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -8,12 +8,11 @@ package cc.winboll.studio.libapputils.log; | ||||
| import android.os.Bundle; | ||||
| import androidx.appcompat.app.AppCompatActivity; | ||||
| import androidx.appcompat.widget.Toolbar; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.app.BaseWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.IWinBollActivity; | ||||
| import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; | ||||
|  | ||||
| public class LogActivity extends BaseWinBollActivity implements IWinBollActivity { | ||||
| public class LogActivity extends AppCompatActivity implements IWinBollActivity { | ||||
|  | ||||
|     public static final String TAG = "LogActivity"; | ||||
|  | ||||
| @@ -51,7 +50,7 @@ public class LogActivity extends BaseWinBollActivity implements IWinBollActivity | ||||
|         setContentView(R.layout.activity_log); | ||||
|         mLogView = findViewById(R.id.logview); | ||||
|  | ||||
|         if (WinBollGlobalApplication.isDebug()) { mLogView.start(); } | ||||
|         if (GlobalApplication.isDebuging()) { mLogView.start(); } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|   | ||||
| @@ -7,7 +7,7 @@ package cc.winboll.studio.libapputils.log; | ||||
|  * @Describe 应用日志类 | ||||
|  */ | ||||
| import android.content.Context; | ||||
| import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libapputils.util.FileUtils; | ||||
| import dalvik.system.DexFile; | ||||
| import java.io.BufferedReader; | ||||
| @@ -61,7 +61,7 @@ public class LogUtils { | ||||
|     // 初始化函数 | ||||
|     // | ||||
|     public static void init(Context context, LOG_LEVEL logLevel) { | ||||
|         if (WinBollGlobalApplication.isDebug()) { | ||||
|         if (GlobalApplication.isDebuging()) { | ||||
|             // 初始化日志缓存文件路径 | ||||
|             _mfLogCacheDir = new File(context.getApplicationContext().getExternalCacheDir(), TAG); | ||||
|             if (!_mfLogCacheDir.exists()) { | ||||
|   | ||||
| @@ -16,10 +16,10 @@ import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.widget.EditText; | ||||
| import android.widget.LinearLayout; | ||||
| import cc.winboll.studio.libappbase.GlobalApplication; | ||||
| import cc.winboll.studio.libapputils.R; | ||||
| import cc.winboll.studio.libapputils.app.AppVersionUtils; | ||||
| import cc.winboll.studio.libapputils.app.WinBollActivityManager; | ||||
| import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; | ||||
| import cc.winboll.studio.libapputils.bean.APPInfo; | ||||
| import cc.winboll.studio.libapputils.bean.DebugBean; | ||||
| import cc.winboll.studio.libapputils.log.LogUtils; | ||||
| @@ -106,7 +106,7 @@ public class AboutView extends LinearLayout { | ||||
|         mszAppDescription = mAPPInfo.getAppDescription(); | ||||
|         mnAppIcon = mAPPInfo.getAppIcon(); | ||||
|  | ||||
|         mszWinBollServerHost = WinBollGlobalApplication.isDebug() ?  "https://dev.winboll.cc": "https://www.winboll.cc"; | ||||
|         mszWinBollServerHost = GlobalApplication.isDebuging() ?  "https://dev.winboll.cc": "https://www.winboll.cc"; | ||||
|  | ||||
|         try { | ||||
|             mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName; | ||||
| @@ -117,7 +117,7 @@ public class AboutView extends LinearLayout { | ||||
|         mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName; | ||||
|         mszGitea = "https://gitea.winboll.cc/" + mAPPInfo.getAppGitOwner() + "/" + mszAppGitName + "/src/branch/" + mAPPInfo.getAppGitAPPBranch() + "/" + mAPPInfo.getAppGitAPPSubProjectFolder(); | ||||
|  | ||||
|         if (WinBollGlobalApplication.isDebug()) { | ||||
|         if (GlobalApplication.isDebuging()) { | ||||
|             LayoutInflater inflater = LayoutInflater.from(mContext); | ||||
|             View addedView = inflater.inflate(R.layout.view_about_dev, this, false); | ||||
|             LinearLayout llMain = addedView.findViewById(R.id.viewaboutdevLinearLayout1); | ||||
| @@ -208,7 +208,7 @@ public class AboutView extends LinearLayout { | ||||
|         // 定义应用调试按钮 | ||||
|         // | ||||
|         Element elementAppMode; | ||||
|         if (WinBollGlobalApplication.isDebug()) { | ||||
|         if (GlobalApplication.isDebuging()) { | ||||
|             elementAppMode = new Element(mContext.getString(R.string.app_normal), R.drawable.ic_winboll); | ||||
|             elementAppMode.setOnClickListener(mAppNormalOnClickListener); | ||||
|         } else { | ||||
| @@ -274,7 +274,7 @@ public class AboutView extends LinearLayout { | ||||
|         if (intent != null) { | ||||
|             intent.setAction(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|             WinBollGlobalApplication.setIsDebug(true); | ||||
|             GlobalApplication.setIsDebuging(context, true); | ||||
|             DebugBean.saveBean(context, new DebugBean(true)); | ||||
|  | ||||
|             WinBollActivityManager.getInstance(context).finishAll(); | ||||
| @@ -286,7 +286,7 @@ public class AboutView extends LinearLayout { | ||||
|         Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); | ||||
|         if (intent != null) { | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|             WinBollGlobalApplication.setIsDebug(false); | ||||
|             GlobalApplication.setIsDebuging(context, false); | ||||
|             DebugBean.saveBean(context, new DebugBean(false)); | ||||
|  | ||||
|             WinBollActivityManager.getInstance(context).finishAll(); | ||||
| @@ -312,7 +312,7 @@ public class AboutView extends LinearLayout { | ||||
|                         String szUrl = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName; | ||||
|                         // 构建包含认证信息的请求 | ||||
|                         String credential = ""; | ||||
|                         if (WinBollGlobalApplication.isDebug()) { | ||||
|                         if (GlobalApplication.isDebuging()) { | ||||
|                             credential = Credentials.basic(metDevUserName.getText().toString(), metDevUserPassword.getText().toString()); | ||||
|                             PrefUtils.saveString(mContext, "metDevUserName", metDevUserName.getText().toString()); | ||||
|                             PrefUtils.saveString(mContext, "metDevUserPassword", metDevUserPassword.getText().toString()); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen