加入最新aes源码
This commit is contained in:
commit
ea3f0190a8
@ -19,17 +19,17 @@ def genVersionName(def versionName){
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 32
|
compileSdkVersion 32
|
||||||
buildToolsVersion "33.0.3"
|
buildToolsVersion "32.0.0"
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "cc.winboll.studio.aes"
|
applicationId "cc.winboll.studio.aes"
|
||||||
minSdkVersion 24
|
minSdkVersion 24
|
||||||
targetSdkVersion 30
|
targetSdkVersion 29
|
||||||
versionCode 1
|
versionCode 1
|
||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "7.6"
|
versionName "15.2"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
@ -41,29 +41,9 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_11
|
|
||||||
targetCompatibility JavaVersion.VERSION_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api project(':libaes')
|
api project(':libaes')
|
||||||
|
|
||||||
//api 'cc.winboll.studio:winboll-shared:1.6.5'
|
|
||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
|
||||||
api 'com.github.getActivity:ToastUtils:10.5'
|
|
||||||
api 'com.jcraft:jsch:0.1.55'
|
|
||||||
api 'org.jsoup:jsoup:1.13.1'
|
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
|
||||||
|
|
||||||
api 'androidx.appcompat:appcompat:1.0.0'
|
|
||||||
api 'androidx.fragment:fragment:1.0.0'
|
|
||||||
api 'com.google.android.material:material:1.0.0'
|
|
||||||
|
|
||||||
api 'cc.winboll.studio:libapputils:9.2.1'
|
|
||||||
api 'cc.winboll.studio:libappbase:1.0.3'
|
|
||||||
|
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Jan 19 04:58:59 GMT 2025
|
#Mon Mar 31 02:04:47 HKT 2025
|
||||||
stageCount=3
|
stageCount=4
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=7.6
|
baseVersion=15.2
|
||||||
publishVersion=7.6.2
|
publishVersion=15.2.3
|
||||||
buildCount=4
|
buildCount=0
|
||||||
baseBetaVersion=7.6.3
|
baseBetaVersion=15.2.4
|
||||||
|
@ -8,9 +8,10 @@
|
|||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/WinBoll.SupportThemeNoActionBar"
|
android:theme="@style/MyAESTheme"
|
||||||
android:requestLegacyExternalStorage="true"
|
android:requestLegacyExternalStorage="true"
|
||||||
android:supportsRtl="true">
|
android:supportsRtl="true"
|
||||||
|
android:networkSecurityConfig="@xml/network_security_config">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
@ -30,6 +31,8 @@
|
|||||||
android:name="android.max_aspect"
|
android:name="android.max_aspect"
|
||||||
android:value="4.0"/>
|
android:value="4.0"/>
|
||||||
|
|
||||||
|
<activity android:name=".AboutActivity"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
91
aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java
Normal file
91
aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
package cc.winboll.studio.aes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/24 23:52:29
|
||||||
|
* @Describe AES应用介绍窗口
|
||||||
|
*/
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import cc.winboll.studio.libaes.winboll.APPInfo;
|
||||||
|
import cc.winboll.studio.libaes.winboll.AboutView;
|
||||||
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
|
|
||||||
|
public class AboutActivity extends WinBollActivity implements IWinBollActivity {
|
||||||
|
|
||||||
|
public static final String TAG = "AboutActivity";
|
||||||
|
|
||||||
|
Context mContext;
|
||||||
|
Toolbar mToolbar;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
mContext = this;
|
||||||
|
setContentView(R.layout.activity_about);
|
||||||
|
|
||||||
|
mToolbar = findViewById(R.id.toolbar);
|
||||||
|
setSupportActionBar(mToolbar);
|
||||||
|
mToolbar.setSubtitle(TAG);
|
||||||
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
|
AboutView aboutView = CreateAboutView();
|
||||||
|
// 在 Activity 的 onCreate 或其他生命周期方法中调用
|
||||||
|
// LinearLayout layout = new LinearLayout(this);
|
||||||
|
// layout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
// // 创建布局参数(宽度和高度)
|
||||||
|
// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
|
||||||
|
// ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
|
// ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
// );
|
||||||
|
// addContentView(aboutView, params);
|
||||||
|
|
||||||
|
LinearLayout layout = findViewById(R.id.aboutviewroot_ll);
|
||||||
|
// 创建布局参数(宽度和高度)
|
||||||
|
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||||
|
ViewGroup.LayoutParams.MATCH_PARENT
|
||||||
|
);
|
||||||
|
layout.addView(aboutView, params);
|
||||||
|
|
||||||
|
GlobalApplication.getWinBollActivityManager().add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
GlobalApplication.getWinBollActivityManager().registeRemove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AboutView CreateAboutView() {
|
||||||
|
String szBranchName = "aes";
|
||||||
|
APPInfo appInfo = new APPInfo();
|
||||||
|
appInfo.setAppName("AES");
|
||||||
|
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
||||||
|
appInfo.setAppDescription("AES Description");
|
||||||
|
appInfo.setAppGitName("APP");
|
||||||
|
appInfo.setAppGitOwner("Studio");
|
||||||
|
appInfo.setAppGitAPPBranch(szBranchName);
|
||||||
|
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
||||||
|
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES");
|
||||||
|
appInfo.setAppAPKName("AES");
|
||||||
|
appInfo.setAppAPKFolderName("AES");
|
||||||
|
return new AboutView(mContext, appInfo);
|
||||||
|
}
|
||||||
|
}
|
@ -6,6 +6,8 @@ package cc.winboll.studio.aes;
|
|||||||
* @Describe AES应用类
|
* @Describe AES应用类
|
||||||
*/
|
*/
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
|
||||||
|
|
||||||
public class App extends GlobalApplication {
|
public class App extends GlobalApplication {
|
||||||
|
|
||||||
@ -14,7 +16,8 @@ public class App extends GlobalApplication {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
//setIsDebug(BuildConfig.DEBUG);
|
ToastUtils.init(this);
|
||||||
|
//ToastUtils.show("App onCreate");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,193 @@ package cc.winboll.studio.aes;
|
|||||||
* @Date 2024/06/13 19:05:52
|
* @Date 2024/06/13 19:05:52
|
||||||
* @Describe 应用主窗口
|
* @Describe 应用主窗口
|
||||||
*/
|
*/
|
||||||
import cc.winboll.studio.libaes.unittests.LibraryActivity;
|
import android.app.Activity;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import cc.winboll.studio.aes.R;
|
||||||
|
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||||
|
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog;
|
||||||
|
import cc.winboll.studio.libaes.dialogs.StoragePathDialog;
|
||||||
|
import cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity;
|
||||||
|
import cc.winboll.studio.libaes.unittests.TestAButtonFragment;
|
||||||
|
import cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity;
|
||||||
|
import cc.winboll.studio.libaes.unittests.TestAToolbarActivity;
|
||||||
|
import cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity;
|
||||||
|
import cc.winboll.studio.libaes.unittests.TestViewPageFragment;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
|
import com.a4455jkjh.colorpicker.ColorPickerDialog;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class MainActivity extends DrawerFragmentActivity implements IWinBollActivity {
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends LibraryActivity {
|
|
||||||
|
|
||||||
public static final String TAG = "MainActivity";
|
public static final String TAG = "MainActivity";
|
||||||
|
|
||||||
|
TestAButtonFragment mTestAButtonFragment;
|
||||||
|
TestViewPageFragment mTestViewPageFragment;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (mTestAButtonFragment == null) {
|
||||||
|
mTestAButtonFragment = new TestAButtonFragment();
|
||||||
|
addFragment(mTestAButtonFragment);
|
||||||
|
}
|
||||||
|
showFragment(mTestAButtonFragment);
|
||||||
|
//setSubtitle(TAG);
|
||||||
|
//ToastUtils.show("onCreate");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
|
||||||
|
super.initDrawerMenuItemList(listDrawerMenu);
|
||||||
|
LogUtils.d(TAG, "initDrawerMenuItemList");
|
||||||
|
//listDrawerMenu.clear();
|
||||||
|
// 添加抽屉菜单项
|
||||||
|
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
|
||||||
|
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
|
||||||
|
notifyDrawerMenuDataChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reinitDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
|
||||||
|
super.reinitDrawerMenuItemList(listDrawerMenu);
|
||||||
|
LogUtils.d(TAG, "reinitDrawerMenuItemList");
|
||||||
|
//listDrawerMenu.clear();
|
||||||
|
// 添加抽屉菜单项
|
||||||
|
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
|
||||||
|
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
|
||||||
|
notifyDrawerMenuDataChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DrawerFragmentActivity.ActivityType initActivityType() {
|
||||||
|
return DrawerFragmentActivity.ActivityType.Main;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
getMenuInflater().inflate(R.menu.toolbar_library, menu);
|
||||||
|
if(App.isDebuging()) {
|
||||||
|
getMenuInflater().inflate(cc.winboll.studio.libapputils.R.menu.toolbar_studio_debug, menu);
|
||||||
|
}
|
||||||
|
return super.onCreateOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
super.onItemClick(parent, view, position, id);
|
||||||
|
switch (position) {
|
||||||
|
case 0 : {
|
||||||
|
if (mTestAButtonFragment == null) {
|
||||||
|
mTestAButtonFragment = new TestAButtonFragment();
|
||||||
|
addFragment(mTestAButtonFragment);
|
||||||
|
}
|
||||||
|
showFragment(mTestAButtonFragment);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1 : {
|
||||||
|
if (mTestViewPageFragment == null) {
|
||||||
|
mTestViewPageFragment = new TestViewPageFragment();
|
||||||
|
addFragment(mTestViewPageFragment);
|
||||||
|
}
|
||||||
|
showFragment(mTestViewPageFragment);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
int nItemId = item.getItemId();
|
||||||
|
// if (item.getItemId() == R.id.item_log) {
|
||||||
|
// WinBollActivityManager.getInstance(this).startWinBollActivity(getApplicationContext(), LogActivity.class);
|
||||||
|
// } else
|
||||||
|
if (nItemId == R.id.item_atoast) {
|
||||||
|
Toast.makeText(getApplication(), "item_testatoast", Toast.LENGTH_SHORT).show();
|
||||||
|
} else if (nItemId == R.id.item_atoolbar) {
|
||||||
|
Intent intent = new Intent(this, TestAToolbarActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
|
||||||
|
} else if (nItemId == R.id.item_asupporttoolbar) {
|
||||||
|
Intent intent = new Intent(this, TestASupportToolbarActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
|
||||||
|
} else if (nItemId == R.id.item_colordialog) {
|
||||||
|
ColorPickerDialog dlg = new ColorPickerDialog(this, getResources().getColor(R.color.colorPrimary));
|
||||||
|
dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void beforeColorChanged() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onColorChanged(int color) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterColorChanged() {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
dlg.show();
|
||||||
|
|
||||||
|
} else if (nItemId == R.id.item_dialogstoragepath) {
|
||||||
|
final StoragePathDialog dialog = new StoragePathDialog(this, 0);
|
||||||
|
dialog.setOnOKClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.show();
|
||||||
|
|
||||||
|
} else if (nItemId == R.id.item_localfileselectdialog) {
|
||||||
|
final LocalFileSelectDialog dialog = new LocalFileSelectDialog(this);
|
||||||
|
dialog.setOnOKClickListener(new LocalFileSelectDialog.OKClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onOKClick(String sz) {
|
||||||
|
Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show();
|
||||||
|
//dialog.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialog.open();
|
||||||
|
|
||||||
|
} else if (nItemId == R.id.item_secondarylibraryactivity) {
|
||||||
|
Intent intent = new Intent(this, SecondaryLibraryActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
} else if (nItemId == R.id.item_drawerfragmentactivity) {
|
||||||
|
Intent intent = new Intent(this, TestDrawerFragmentActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
else if (nItemId == R.id.item_about) {
|
||||||
|
Intent intent = new Intent(this, AboutActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
50
aes/src/main/java/cc/winboll/studio/aes/WinBollActivity.java
Normal file
50
aes/src/main/java/cc/winboll/studio/aes/WinBollActivity.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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()));
|
||||||
|
}
|
||||||
|
}
|
22
aes/src/main/res/layout/activity_about.xml
Normal file
22
aes/src/main/res/layout/activity_about.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.views.ASupportToolbar
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/toolbar"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:id="@+id/aboutviewroot_ll"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
@ -13,7 +13,7 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@+id/item_localfileselectdialog"
|
android:id="@+id/item_localfileselectdialog"
|
||||||
android:title="LocalFileSelectDialog"/>
|
android:title="LocalFileSelectDialog"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/item_atoolbar"
|
android:id="@+id/item_atoolbar"
|
||||||
android:title="Test AToolbar"/>
|
android:title="Test AToolbar"/>
|
7
aes/src/main/res/values/colors.xml
Normal file
7
aes/src/main/res/values/colors.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="colorPrimary">#FF00B322</color>
|
||||||
|
<color name="colorPrimaryDark">#FF005C12</color>
|
||||||
|
<color name="colorAccent">#FF8DFFA2</color>
|
||||||
|
<color name="colorText">#FFFFFB8D</color>
|
||||||
|
</resources>
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="MyAESTheme" parent="AESTheme">
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
6
aes/src/main/res/xml/network_security_config.xml
Normal file
6
aes/src/main/res/xml/network_security_config.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<network-security-config>
|
||||||
|
<domain-config cleartextTrafficPermitted="true">
|
||||||
|
<domain includeSubdomains="true">winboll.cc</domain>
|
||||||
|
</domain-config>
|
||||||
|
</network-security-config>
|
@ -4,14 +4,12 @@ apply from: '../.winboll/winboll_lib_build.gradle'
|
|||||||
apply from: '../.winboll/winboll_lint_build.gradle'
|
apply from: '../.winboll/winboll_lint_build.gradle'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
namespace 'cc.winboll.studio.libaes'
|
|
||||||
|
|
||||||
compileSdkVersion 32
|
compileSdkVersion 32
|
||||||
buildToolsVersion "33.0.3"
|
buildToolsVersion "32.0.0"
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdkVersion 24
|
minSdkVersion 24
|
||||||
targetSdkVersion 30
|
targetSdkVersion 29
|
||||||
}
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
@ -19,30 +17,40 @@ android {
|
|||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
|
||||||
sourceCompatibility JavaVersion.VERSION_11
|
|
||||||
targetCompatibility JavaVersion.VERSION_11
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
//api 'cc.winboll.studio:winboll-shared:1.6.5'
|
|
||||||
|
|
||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
|
||||||
api 'com.github.getActivity:ToastUtils:10.5'
|
|
||||||
api 'com.jcraft:jsch:0.1.55'
|
|
||||||
api 'org.jsoup:jsoup:1.13.1'
|
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
|
||||||
|
|
||||||
api 'androidx.appcompat:appcompat:1.0.0'
|
|
||||||
api 'androidx.fragment:fragment:1.0.0'
|
|
||||||
api 'com.google.android.material:material:1.0.0'
|
|
||||||
|
|
||||||
// https://github.com/baoyongzhang/android-PullRefreshLayout
|
|
||||||
api 'com.baoyz.pullrefreshlayout:library:1.2.0'
|
|
||||||
|
|
||||||
api 'cc.winboll.studio:libapputils:9.2.1'
|
|
||||||
api 'cc.winboll.studio:libappbase:1.0.3'
|
|
||||||
|
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
|
||||||
|
// 吐司类库
|
||||||
|
api 'com.github.getActivity:ToastUtils:10.5'
|
||||||
|
|
||||||
|
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
||||||
|
api 'com.github.getActivity:XXPermissions:18.63'
|
||||||
|
// 下拉控件
|
||||||
|
api 'com.baoyz.pullrefreshlayout:library:1.2.0'
|
||||||
|
// 拼音搜索
|
||||||
|
// https://mvnrepository.com/artifact/com.github.open-android/pinyin4j
|
||||||
|
api 'com.github.open-android:pinyin4j:2.5.0'
|
||||||
|
// SSH
|
||||||
|
api 'com.jcraft:jsch:0.1.55'
|
||||||
|
// Html 解析
|
||||||
|
api 'org.jsoup:jsoup:1.13.1'
|
||||||
|
// 二维码类库
|
||||||
|
api 'com.google.zxing:core:3.4.1'
|
||||||
|
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
||||||
|
// 应用介绍页类库
|
||||||
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
|
// 网络连接类库
|
||||||
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
|
// AndroidX 类库
|
||||||
|
api 'androidx.appcompat:appcompat:1.1.0'
|
||||||
|
api 'com.google.android.material:material:1.4.0'
|
||||||
|
//api 'androidx.viewpager:viewpager:1.0.0'
|
||||||
|
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||||
|
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||||
|
//api 'androidx.fragment:fragment:1.1.0'
|
||||||
|
|
||||||
|
api 'cc.winboll.studio:libappbase:15.2.0'
|
||||||
|
api 'cc.winboll.studio:libapputils:15.2.0'
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Jan 19 04:58:59 GMT 2025
|
#Mon Mar 31 02:04:35 HKT 2025
|
||||||
stageCount=3
|
stageCount=4
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=7.6
|
baseVersion=15.2
|
||||||
publishVersion=7.6.2
|
publishVersion=15.2.3
|
||||||
buildCount=4
|
buildCount=0
|
||||||
baseBetaVersion=7.6.3
|
baseBetaVersion=15.2.4
|
||||||
|
@ -5,16 +5,27 @@
|
|||||||
|
|
||||||
<application>
|
<application>
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity"/>
|
<activity android:name="cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.libaes.activitys.AboutActivity"/>
|
<activity android:name="cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity"/>
|
<activity android:name="cc.winboll.studio.libaes.unittests.TestAToolbarActivity"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
|
<activity android:name="cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
|
<service android:name="cc.winboll.studio.libaes.winboll.WinBollClientService"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
|
<service android:name="cc.winboll.studio.libaes.winboll.AssistantService"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
|
<service android:name="cc.winboll.studio.libaes.winboll.WinBollMail"
|
||||||
|
android:exported="true"/>
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.libaes.unittests.TestAToolbarActivity"/>
|
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity"/>
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -27,18 +27,20 @@ import cc.winboll.studio.libaes.beans.AESThemeBean;
|
|||||||
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
import cc.winboll.studio.libaes.views.ADrawerMenuListView;
|
import cc.winboll.studio.libaes.views.ADrawerMenuListView;
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
import com.baoyz.widget.PullRefreshLayout;
|
import com.baoyz.widget.PullRefreshLayout;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public abstract class DrawerFragmentActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
|
public abstract class DrawerFragmentActivity extends AppCompatActivity implements IWinBollActivity,AdapterView.OnItemClickListener {
|
||||||
|
|
||||||
public static final String TAG = "DrawerFragmentActivity";
|
public static final String TAG = "DrawerFragmentActivity";
|
||||||
|
|
||||||
static final String SHAREDPREFERENCES_NAME = "SHAREDPREFERENCES_NAME";
|
static final String SHAREDPREFERENCES_NAME = "SHAREDPREFERENCES_NAME";
|
||||||
static final String DRAWER_THEME_TYPE = "DRAWER_THEME_TYPE";
|
static final String DRAWER_THEME_TYPE = "DRAWER_THEME_TYPE";
|
||||||
|
|
||||||
protected Context mContext;
|
//protected Context mContext;
|
||||||
ActivityType mActivityType;
|
ActivityType mActivityType;
|
||||||
ActionBarDrawerToggle mActionBarDrawerToggle;
|
ActionBarDrawerToggle mActionBarDrawerToggle;
|
||||||
DrawerLayout mDrawerLayout;
|
DrawerLayout mDrawerLayout;
|
||||||
@ -58,7 +60,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
mContext = this;
|
//mContext = this;
|
||||||
mThemeType = getThemeType();
|
mThemeType = getThemeType();
|
||||||
setThemeStyle();
|
setThemeStyle();
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -72,7 +74,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/*@Override
|
||||||
public Intent getIntent() {
|
public Intent getIntent() {
|
||||||
// TODO: Implement this method
|
// TODO: Implement this method
|
||||||
return super.getIntent();
|
return super.getIntent();
|
||||||
@ -80,7 +82,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
|
|
||||||
public Context getContext() {
|
public Context getContext() {
|
||||||
return this.mContext;
|
return this.mContext;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MenuInflater getMenuInflater() {
|
public MenuInflater getMenuInflater() {
|
||||||
@ -88,20 +90,20 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
return super.getMenuInflater();
|
return super.getMenuInflater();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSubtitle(CharSequence context) {
|
/*public void setSubtitle(CharSequence context) {
|
||||||
// TODO: Implement this method
|
// TODO: Implement this method
|
||||||
getSupportActionBar().setSubtitle(context);
|
getSupportActionBar().setSubtitle(context);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void recreate() {
|
public void recreate() {
|
||||||
super.recreate();
|
super.recreate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/*@Override
|
||||||
public boolean moveTaskToBack(boolean nonRoot) {
|
public boolean moveTaskToBack(boolean nonRoot) {
|
||||||
return super.moveTaskToBack(nonRoot);
|
return super.moveTaskToBack(nonRoot);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void startActivity(Intent intent) {
|
public void startActivity(Intent intent) {
|
||||||
@ -113,7 +115,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
super.startActivityForResult(intent, requestCode, options);
|
super.startActivityForResult(intent, requestCode, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
/*@Override
|
||||||
public FragmentManager getSupportFragmentManager() {
|
public FragmentManager getSupportFragmentManager() {
|
||||||
return super.getSupportFragmentManager();
|
return super.getSupportFragmentManager();
|
||||||
}
|
}
|
||||||
@ -131,7 +133,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
public void setTitle(int resId) {
|
public void setTitle(int resId) {
|
||||||
// TODO: Implement this method
|
// TODO: Implement this method
|
||||||
getSupportActionBar().setTitle(resId);
|
getSupportActionBar().setTitle(resId);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SharedPreferences getSharedPreferences(String name, int mode) {
|
public SharedPreferences getSharedPreferences(String name, int mode) {
|
||||||
@ -151,7 +153,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
|
|
||||||
void setThemeStyle() {
|
void setThemeStyle() {
|
||||||
//setTheme(AESThemeBean.getThemeStyle(getThemeType()));
|
//setTheme(AESThemeBean.getThemeStyle(getThemeType()));
|
||||||
setTheme(AESThemeUtil.getThemeTypeID(this));
|
setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean checkThemeStyleChange() {
|
boolean checkThemeStyleChange() {
|
||||||
@ -163,7 +165,7 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
SHAREDPREFERENCES_NAME, MODE_PRIVATE);
|
SHAREDPREFERENCES_NAME, MODE_PRIVATE);
|
||||||
return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))];
|
return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))];
|
||||||
*/
|
*/
|
||||||
return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(this));
|
return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -174,6 +176,8 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
|
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
|
||||||
getString(i);
|
getString(i);
|
||||||
}
|
}
|
||||||
|
} else if (R.id.item_log == item.getItemId()) {
|
||||||
|
GlobalApplication.getWinBollActivityManager().startLogActivity(this);
|
||||||
} else if (R.id.item_about == item.getItemId()) {
|
} else if (R.id.item_about == item.getItemId()) {
|
||||||
LogUtils.d(TAG, "onAbout");
|
LogUtils.d(TAG, "onAbout");
|
||||||
} else if (android.R.id.home == item.getItemId()) {
|
} else if (android.R.id.home == item.getItemId()) {
|
||||||
|
@ -8,7 +8,7 @@ package cc.winboll.studio.libaes.beans;
|
|||||||
import android.util.JsonReader;
|
import android.util.JsonReader;
|
||||||
import android.util.JsonWriter;
|
import android.util.JsonWriter;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libapputils.bean.BaseBean;
|
import cc.winboll.studio.libappbase.BaseBean;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class AESThemeBean extends BaseBean {
|
public class AESThemeBean extends BaseBean {
|
||||||
@ -16,7 +16,7 @@ public class AESThemeBean extends BaseBean {
|
|||||||
public static final String TAG = "AESThemeBean";
|
public static final String TAG = "AESThemeBean";
|
||||||
|
|
||||||
public enum ThemeType {
|
public enum ThemeType {
|
||||||
DEFAULT("默认主题"),
|
AES("默认主题"),
|
||||||
DEPTH("深奥主题"),
|
DEPTH("深奥主题"),
|
||||||
SKY("天空主题"),
|
SKY("天空主题"),
|
||||||
GOLDEN("辉煌主题"),
|
GOLDEN("辉煌主题"),
|
||||||
@ -42,7 +42,7 @@ public class AESThemeBean extends BaseBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 保存当前主题
|
// 保存当前主题
|
||||||
int currentThemeStyleID = getThemeStyleID(ThemeType.DEFAULT);
|
int currentThemeStyleID = getThemeStyleID(ThemeType.AES);
|
||||||
|
|
||||||
public AESThemeBean() {
|
public AESThemeBean() {
|
||||||
}
|
}
|
||||||
@ -99,7 +99,7 @@ public class AESThemeBean extends BaseBean {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static int getThemeStyleID(ThemeType themeType) {
|
public static int getThemeStyleID(ThemeType themeType) {
|
||||||
int themeStyleID = R.style.DefaultAESTheme;
|
int themeStyleID = R.style.AESTheme;
|
||||||
if (AESThemeBean.ThemeType.DEPTH == themeType) {
|
if (AESThemeBean.ThemeType.DEPTH == themeType) {
|
||||||
themeStyleID = R.style.DepthAESTheme;
|
themeStyleID = R.style.DepthAESTheme;
|
||||||
} else if (AESThemeBean.ThemeType.SKY == themeType) {
|
} else if (AESThemeBean.ThemeType.SKY == themeType) {
|
||||||
@ -110,15 +110,15 @@ public class AESThemeBean extends BaseBean {
|
|||||||
themeStyleID = R.style.MemorAESTheme;
|
themeStyleID = R.style.MemorAESTheme;
|
||||||
} else if (AESThemeBean.ThemeType.TAO == themeType) {
|
} else if (AESThemeBean.ThemeType.TAO == themeType) {
|
||||||
themeStyleID = R.style.TaoAESTheme;
|
themeStyleID = R.style.TaoAESTheme;
|
||||||
} else if (AESThemeBean.ThemeType.DEFAULT == themeType) {
|
} else if (AESThemeBean.ThemeType.AES == themeType) {
|
||||||
themeStyleID = R.style.DefaultAESTheme;
|
themeStyleID = R.style.AESTheme;
|
||||||
}
|
}
|
||||||
//LogUtils.d(TAG, "themeStyleID " + Integer.toString(themeStyleID));
|
//LogUtils.d(TAG, "themeStyleID " + Integer.toString(themeStyleID));
|
||||||
return themeStyleID;
|
return themeStyleID;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AESThemeBean.ThemeType getThemeStyleType(int nThemeStyleID) {
|
public static AESThemeBean.ThemeType getThemeStyleType(int nThemeStyleID) {
|
||||||
AESThemeBean.ThemeType themeStyle = AESThemeBean.ThemeType.DEFAULT;
|
AESThemeBean.ThemeType themeStyle = AESThemeBean.ThemeType.AES;
|
||||||
if (R.style.DepthAESTheme == nThemeStyleID) {
|
if (R.style.DepthAESTheme == nThemeStyleID) {
|
||||||
themeStyle = AESThemeBean.ThemeType.DEPTH ;
|
themeStyle = AESThemeBean.ThemeType.DEPTH ;
|
||||||
} else if (R.style.SkyAESTheme == nThemeStyleID) {
|
} else if (R.style.SkyAESTheme == nThemeStyleID) {
|
||||||
@ -129,8 +129,8 @@ public class AESThemeBean extends BaseBean {
|
|||||||
themeStyle = AESThemeBean.ThemeType.MEMOR ;
|
themeStyle = AESThemeBean.ThemeType.MEMOR ;
|
||||||
} else if (R.style.TaoAESTheme == nThemeStyleID) {
|
} else if (R.style.TaoAESTheme == nThemeStyleID) {
|
||||||
themeStyle = AESThemeBean.ThemeType.TAO ;
|
themeStyle = AESThemeBean.ThemeType.TAO ;
|
||||||
} else if (R.style.DefaultAESTheme == nThemeStyleID) {
|
} else if (R.style.AESTheme == nThemeStyleID) {
|
||||||
themeStyle = AESThemeBean.ThemeType.DEFAULT;
|
themeStyle = AESThemeBean.ThemeType.AES;
|
||||||
}
|
}
|
||||||
//LogUtils.d(TAG, "themeStyle " + Integer.toString(themeStyle.ordinal()));
|
//LogUtils.d(TAG, "themeStyle " + Integer.toString(themeStyle.ordinal()));
|
||||||
return themeStyle;
|
return themeStyle;
|
||||||
|
@ -5,7 +5,7 @@ import android.content.DialogInterface;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.text.Collator;
|
import java.text.Collator;
|
||||||
|
@ -1,170 +0,0 @@
|
|||||||
package cc.winboll.studio.libaes.unittests;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author ZhanGSKen@QQ.COM
|
|
||||||
* @Date 2024/06/14 03:43:23
|
|
||||||
* @Describe AES类库主窗口
|
|
||||||
*/
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.Toast;
|
|
||||||
import cc.winboll.studio.libaes.R;
|
|
||||||
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
|
||||||
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
|
||||||
import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog;
|
|
||||||
import cc.winboll.studio.libaes.dialogs.StoragePathDialog;
|
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
|
||||||
import com.a4455jkjh.colorpicker.ColorPickerDialog;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
public class LibraryActivity extends DrawerFragmentActivity {
|
|
||||||
|
|
||||||
public static final String TAG = "LibraryActivity";
|
|
||||||
|
|
||||||
TestAButtonFragment mTestAButtonFragment;
|
|
||||||
TestViewPageFragment mTestViewPageFragment;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (mTestAButtonFragment == null) {
|
|
||||||
mTestAButtonFragment = new TestAButtonFragment();
|
|
||||||
addFragment(mTestAButtonFragment);
|
|
||||||
}
|
|
||||||
showFragment(mTestAButtonFragment);
|
|
||||||
setSubtitle(TAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void initDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
|
|
||||||
super.initDrawerMenuItemList(listDrawerMenu);
|
|
||||||
LogUtils.d(TAG, "initDrawerMenuItemList");
|
|
||||||
//listDrawerMenu.clear();
|
|
||||||
// 添加抽屉菜单项
|
|
||||||
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
|
|
||||||
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
|
|
||||||
notifyDrawerMenuDataChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reinitDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
|
|
||||||
super.reinitDrawerMenuItemList(listDrawerMenu);
|
|
||||||
LogUtils.d(TAG, "reinitDrawerMenuItemList");
|
|
||||||
//listDrawerMenu.clear();
|
|
||||||
// 添加抽屉菜单项
|
|
||||||
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
|
|
||||||
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
|
|
||||||
notifyDrawerMenuDataChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public DrawerFragmentActivity.ActivityType initActivityType() {
|
|
||||||
return DrawerFragmentActivity.ActivityType.Main;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
getMenuInflater().inflate(R.menu.toolbar_library, menu);
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
super.onItemClick(parent, view, position, id);
|
|
||||||
switch (position) {
|
|
||||||
case 0 : {
|
|
||||||
if (mTestAButtonFragment == null) {
|
|
||||||
mTestAButtonFragment = new TestAButtonFragment();
|
|
||||||
addFragment(mTestAButtonFragment);
|
|
||||||
}
|
|
||||||
showFragment(mTestAButtonFragment);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1 : {
|
|
||||||
if (mTestViewPageFragment == null) {
|
|
||||||
mTestViewPageFragment = new TestViewPageFragment();
|
|
||||||
addFragment(mTestViewPageFragment);
|
|
||||||
}
|
|
||||||
showFragment(mTestViewPageFragment);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
int nItemId = item.getItemId();
|
|
||||||
// if (item.getItemId() == R.id.item_log) {
|
|
||||||
// WinBollActivityManager.getInstance(this).startWinBollActivity(getApplicationContext(), LogActivity.class);
|
|
||||||
// } else
|
|
||||||
if (nItemId == R.id.item_atoast) {
|
|
||||||
Toast.makeText(getApplication(), "item_testatoast", Toast.LENGTH_SHORT).show();
|
|
||||||
} else if (nItemId == R.id.item_atoolbar) {
|
|
||||||
Intent intent = new Intent(this, TestAToolbarActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
|
|
||||||
} else if (nItemId == R.id.item_asupporttoolbar) {
|
|
||||||
Intent intent = new Intent(this, TestASupportToolbarActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
|
|
||||||
} else if (nItemId == R.id.item_colordialog) {
|
|
||||||
ColorPickerDialog dlg = new ColorPickerDialog(this, getResources().getColor(R.color.colorPrimary));
|
|
||||||
dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void beforeColorChanged() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onColorChanged(int color) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void afterColorChanged() {
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
});
|
|
||||||
dlg.show();
|
|
||||||
|
|
||||||
} else if (nItemId == R.id.item_dialogstoragepath) {
|
|
||||||
final StoragePathDialog dialog = new StoragePathDialog(this, 0);
|
|
||||||
dialog.setOnOKClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
dialog.dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialog.show();
|
|
||||||
|
|
||||||
} else if (nItemId == R.id.item_localfileselectdialog) {
|
|
||||||
final LocalFileSelectDialog dialog = new LocalFileSelectDialog(this);
|
|
||||||
dialog.setOnOKClickListener(new LocalFileSelectDialog.OKClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onOKClick(String sz) {
|
|
||||||
Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show();
|
|
||||||
//dialog.dismiss();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialog.open();
|
|
||||||
|
|
||||||
} else if (nItemId == R.id.item_secondarylibraryactivity) {
|
|
||||||
Intent intent = new Intent(this, SecondaryLibraryActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
} else if (nItemId == R.id.item_drawerfragmentactivity) {
|
|
||||||
Intent intent = new Intent(this, TestDrawerFragmentActivity.class);
|
|
||||||
startActivity(intent);
|
|
||||||
}
|
|
||||||
// else if (nItemId == R.id.item_about) {
|
|
||||||
// Intent intent = new Intent(this, AboutActivity.class);
|
|
||||||
// startActivity(intent);
|
|
||||||
// }
|
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +1,35 @@
|
|||||||
package cc.winboll.studio.libaes.unittests;
|
package cc.winboll.studio.libaes.unittests;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author ZhanGSKen@QQ.COM
|
* @Author ZhanGSKen@QQ.COM
|
||||||
* @Date 2024/06/15 00:58:10
|
* @Date 2024/06/15 00:58:10
|
||||||
* @Describe 第二级窗口
|
* @Describe 第二级窗口
|
||||||
*/
|
*/
|
||||||
public class SecondaryLibraryActivity extends DrawerFragmentActivity {
|
public class SecondaryLibraryActivity extends DrawerFragmentActivity implements IWinBollActivity {
|
||||||
|
|
||||||
public static final String TAG = "SecondaryLibraryActivity";
|
public static final String TAG = "SecondaryLibraryActivity";
|
||||||
|
|
||||||
SecondaryLibraryFragment mSecondaryLibraryFragment;
|
SecondaryLibraryFragment mSecondaryLibraryFragment;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -43,7 +55,7 @@ public class SecondaryLibraryActivity extends DrawerFragmentActivity {
|
|||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int nItemId = item.getItemId();
|
int nItemId = item.getItemId();
|
||||||
if (nItemId == R.id.item_test) {
|
if (nItemId == R.id.item_test) {
|
||||||
Toast.makeText(getApplication(), "item_test", Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), "item_test", Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
@ -9,11 +9,11 @@ import android.os.Bundle;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.views.AButton;
|
import cc.winboll.studio.libaes.views.AButton;
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
|
||||||
public class TestAButtonFragment extends Fragment {
|
public class TestAButtonFragment extends Fragment {
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ public class TestAButtonFragment extends Fragment {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
LogUtils.d(TAG, "onClick");
|
LogUtils.d(TAG, "onClick");
|
||||||
Toast.makeText(getActivity(), "AButton", Toast.LENGTH_SHORT).show();
|
ToastUtils.show("AButton");
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -5,19 +5,27 @@ package cc.winboll.studio.libaes.unittests;
|
|||||||
* @Date 2024/07/16 01:14:00
|
* @Date 2024/07/16 01:14:00
|
||||||
* @Describe TestASupportToolbarActivity
|
* @Describe TestASupportToolbarActivity
|
||||||
*/
|
*/
|
||||||
import android.content.Context;
|
import android.app.Activity;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
|
|
||||||
public class TestASupportToolbarActivity extends AppCompatActivity {
|
public class TestASupportToolbarActivity extends AppCompatActivity implements IWinBollActivity {
|
||||||
|
|
||||||
public static final String TAG = "TestASupportToolbarActivity";
|
public static final String TAG = "TestASupportToolbarActivity";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -10,11 +10,22 @@ import android.os.Bundle;
|
|||||||
import android.widget.Toolbar;
|
import android.widget.Toolbar;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
|
|
||||||
public class TestAToolbarActivity extends Activity {
|
public class TestAToolbarActivity extends Activity implements IWinBollActivity {
|
||||||
|
|
||||||
public static final String TAG = "TestAToolbarActivity";
|
public static final String TAG = "TestAToolbarActivity";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return TAG;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
AESThemeUtil.applyAppTheme(this);
|
AESThemeUtil.applyAppTheme(this);
|
||||||
|
@ -4,26 +4,40 @@ package cc.winboll.studio.libaes.unittests;
|
|||||||
* @Author ZhanGSKen@QQ.COM
|
* @Author ZhanGSKen@QQ.COM
|
||||||
* @Date 2024/06/30 15:00:51
|
* @Date 2024/06/30 15:00:51
|
||||||
*/
|
*/
|
||||||
|
import android.app.Activity;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
import android.widget.Toolbar;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||||
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
import cc.winboll.studio.libaes.beans.DrawerMenuBean;
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBollActivity;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class TestDrawerFragmentActivity extends DrawerFragmentActivity {
|
public class TestDrawerFragmentActivity extends DrawerFragmentActivity implements IWinBollActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Activity getActivity() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTag() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public static final String TAG = "TestDrawerFragmentActivity";
|
public static final String TAG = "TestDrawerFragmentActivity";
|
||||||
|
|
||||||
TestFragment1 mTestFragment1;
|
TestFragment1 mTestFragment1;
|
||||||
TestFragment2 mTestFragment2;
|
TestFragment2 mTestFragment2;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -66,7 +80,7 @@ public class TestDrawerFragmentActivity extends DrawerFragmentActivity {
|
|||||||
super.onItemClick(parent, view, position, id);
|
super.onItemClick(parent, view, position, id);
|
||||||
switch (position) {
|
switch (position) {
|
||||||
case 0 : {
|
case 0 : {
|
||||||
Toast.makeText(getContext(), "0", Toast.LENGTH_SHORT).show();
|
Toast.makeText(getApplicationContext(), "0", Toast.LENGTH_SHORT).show();
|
||||||
//LogUtils.d(TAG, "MenuItem 1");
|
//LogUtils.d(TAG, "MenuItem 1");
|
||||||
showFragment(mTestFragment1);
|
showFragment(mTestFragment1);
|
||||||
break;
|
break;
|
||||||
|
@ -5,6 +5,7 @@ package cc.winboll.studio.libaes.unittests;
|
|||||||
* @Date 2024/07/16 01:35:56
|
* @Date 2024/07/16 01:35:56
|
||||||
* @Describe TestViewPageFragment
|
* @Describe TestViewPageFragment
|
||||||
*/
|
*/
|
||||||
|
import android.content.Context;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@ -17,12 +18,17 @@ import androidx.viewpager.widget.ViewPager;
|
|||||||
import cc.winboll.studio.libaes.ImagePagerAdapter;
|
import cc.winboll.studio.libaes.ImagePagerAdapter;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
|
import cc.winboll.studio.libappbase.LogView;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class TestViewPageFragment extends Fragment implements ViewPager.OnPageChangeListener, View.OnClickListener {
|
public class TestViewPageFragment extends Fragment implements ViewPager.OnPageChangeListener, View.OnClickListener {
|
||||||
|
|
||||||
public static final String TAG = "TestViewPageFragment";
|
public static final String TAG = "TestViewPageFragment";
|
||||||
|
|
||||||
|
Context mContext;
|
||||||
|
LogView mLogView;
|
||||||
|
|
||||||
private ViewPager viewPager;
|
private ViewPager viewPager;
|
||||||
private List<View> views; //用来存放放进ViewPager里面的布局
|
private List<View> views; //用来存放放进ViewPager里面的布局
|
||||||
@ -36,6 +42,10 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh
|
|||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
mView = inflater.inflate(R.layout.fragment_viewpage, container, false);
|
mView = inflater.inflate(R.layout.fragment_viewpage, container, false);
|
||||||
|
mContext = getActivity();
|
||||||
|
|
||||||
|
mLogView = mView.findViewById(R.id.logview);
|
||||||
|
mLogView.start();
|
||||||
|
|
||||||
//viewPager = findViewById(R.id.activitymainViewPager1);
|
//viewPager = findViewById(R.id.activitymainViewPager1);
|
||||||
initData();
|
initData();
|
||||||
@ -60,12 +70,13 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh
|
|||||||
initPoint();//初始化页面下方的点
|
initPoint();//初始化页面下方的点
|
||||||
viewPager.setOnPageChangeListener(this);
|
viewPager.setOnPageChangeListener(this);
|
||||||
initAOHPCTCSeekBar();
|
initAOHPCTCSeekBar();
|
||||||
|
initAOHPCTCSeekBar2();
|
||||||
}
|
}
|
||||||
|
|
||||||
//初始化所要显示的布局
|
//初始化所要显示的布局
|
||||||
void initData() {
|
void initData() {
|
||||||
ViewPager viewPager = mView.findViewById(R.id.fragmentviewpageViewPager1);
|
ViewPager viewPager = mView.findViewById(R.id.fragmentviewpageViewPager1);
|
||||||
LayoutInflater inflater = LayoutInflater.from(getActivity());
|
LayoutInflater inflater = LayoutInflater.from(mContext);
|
||||||
View view1 = inflater.inflate(R.layout.viewpage_atickprogressbar, viewPager, false);
|
View view1 = inflater.inflate(R.layout.viewpage_atickprogressbar, viewPager, false);
|
||||||
View view2 = inflater.inflate(R.layout.viewpage_acard, viewPager, false);
|
View view2 = inflater.inflate(R.layout.viewpage_acard, viewPager, false);
|
||||||
View view3 = inflater.inflate(R.layout.viewpage_aohpctccard, viewPager, false);
|
View view3 = inflater.inflate(R.layout.viewpage_aohpctccard, viewPager, false);
|
||||||
@ -185,14 +196,31 @@ public class TestViewPageFragment extends Fragment implements ViewPager.OnPageCh
|
|||||||
}
|
}
|
||||||
|
|
||||||
void initAOHPCTCSeekBar() {
|
void initAOHPCTCSeekBar() {
|
||||||
AOHPCTCSeekBar seekbar = mView.findViewById(R.id.fragmentviewpageAOHPCTCSeekBar1);
|
AOHPCTCSeekBar seekbar = views.get(3).findViewById(R.id.fragmentviewpageAOHPCTCSeekBar1);
|
||||||
seekbar.setThumb(getActivity().getDrawable(R.drawable.ic_launcher));
|
seekbar.setThumb(mContext.getDrawable(R.drawable.ic_launcher));
|
||||||
seekbar.setThumbOffset(10);
|
//seekbar.setThumbOffset(200);
|
||||||
|
//seekbar.setThumbOffset(1);
|
||||||
|
seekbar.setBlurRightDP(50);
|
||||||
seekbar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() {
|
seekbar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onOHPCommit() {
|
public void onOHPCommit() {
|
||||||
Toast.makeText(getActivity(), "onOHPCommit ", Toast.LENGTH_SHORT).show();
|
ToastUtils.show("onOHPCommit");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void initAOHPCTCSeekBar2() {
|
||||||
|
AOHPCTCSeekBar seekbar = views.get(3).findViewById(R.id.fragmentviewpageAOHPCTCSeekBar2);
|
||||||
|
seekbar.setThumb(mContext.getDrawable(R.drawable.ic_call));
|
||||||
|
//seekbar.setThumbOffset(200);
|
||||||
|
//seekbar.setThumbOffset(1);
|
||||||
|
seekbar.setBlurRightDP(50);
|
||||||
|
seekbar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onOHPCommit() {
|
||||||
|
ToastUtils.show("onOHPCommit 2");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -11,8 +11,8 @@ import android.view.Menu;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import cc.winboll.studio.libaes.R;
|
import cc.winboll.studio.libaes.R;
|
||||||
|
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||||
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
||||||
import cc.winboll.studio.libapputils.app.WinBollActivity;
|
|
||||||
|
|
||||||
public class AESThemeUtil {
|
public class AESThemeUtil {
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ public class AESThemeUtil {
|
|||||||
|
|
||||||
public static <T extends Context> int getThemeTypeID(T context) {
|
public static <T extends Context> int getThemeTypeID(T context) {
|
||||||
AESThemeBean bean = AESThemeBean.loadBean(context, AESThemeBean.class);
|
AESThemeBean bean = AESThemeBean.loadBean(context, AESThemeBean.class);
|
||||||
return bean == null ? AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEFAULT): bean.getCurrentThemeTypeID();
|
return bean == null ? AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES): bean.getCurrentThemeTypeID();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends Context> void saveThemeStyleID(T context, int nThemeTypeID) {
|
public static <T extends Context> void saveThemeStyleID(T context, int nThemeTypeID) {
|
||||||
@ -41,9 +41,9 @@ public class AESThemeUtil {
|
|||||||
activity.setTheme(getThemeTypeID(activity));
|
activity.setTheme(getThemeTypeID(activity));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends WinBollActivity> void applyWinBollTheme(T activity) {
|
/*public static <T extends WinBollActivity> void applyWinBollTheme(T activity) {
|
||||||
activity.setTheme(getThemeTypeID(activity.getApplicationContext()));
|
activity.setTheme(getThemeTypeID(activity.getApplicationContext()));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public static <T extends Activity> void applyAppTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
public static <T extends Activity> void applyAppTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||||
@ -53,9 +53,9 @@ public class AESThemeUtil {
|
|||||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends WinBollActivity> void applyWinBollTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
/*public static <T extends WinBollActivity> void applyWinBollTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public static <T extends Activity> void inflateMenu(T activity, Menu menu) {
|
public static <T extends Activity> void inflateMenu(T activity, Menu menu) {
|
||||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||||
@ -65,9 +65,9 @@ public class AESThemeUtil {
|
|||||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends WinBollActivity> void inflateWinBollMenu(T activity, Menu menu) {
|
/*public static <T extends WinBollActivity> void inflateWinBollMenu(T activity, Menu menu) {
|
||||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
public static <T extends Activity> boolean onAppThemeItemSelected(T activity, MenuItem item) {
|
public static <T extends Activity> boolean onAppThemeItemSelected(T activity, MenuItem item) {
|
||||||
int nThemeStyleID;
|
int nThemeStyleID;
|
||||||
@ -92,7 +92,7 @@ public class AESThemeUtil {
|
|||||||
saveThemeStyleID(activity, nThemeStyleID);
|
saveThemeStyleID(activity, nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEFAULT);
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||||
saveThemeStyleID(activity, nThemeStyleID);
|
saveThemeStyleID(activity, nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -123,7 +123,7 @@ public class AESThemeUtil {
|
|||||||
saveThemeStyleID(activity, nThemeStyleID);
|
saveThemeStyleID(activity, nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEFAULT);
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||||
saveThemeStyleID(activity, nThemeStyleID);
|
saveThemeStyleID(activity, nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -131,7 +131,7 @@ public class AESThemeUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T extends WinBollActivity> boolean onWinBollThemeItemSelected(T activity, MenuItem item) {
|
public static <T extends AppCompatActivity> boolean onWinBollThemeItemSelected(T activity, MenuItem item) {
|
||||||
int nThemeStyleID;
|
int nThemeStyleID;
|
||||||
if (R.id.item_depththeme == item.getItemId()) {
|
if (R.id.item_depththeme == item.getItemId()) {
|
||||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||||
@ -154,7 +154,38 @@ public class AESThemeUtil {
|
|||||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEFAULT);
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T extends DrawerFragmentActivity> boolean onWinBollThemeItemSelected(T activity, MenuItem item) {
|
||||||
|
int nThemeStyleID;
|
||||||
|
if (R.id.item_depththeme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
} else if (R.id.item_skytheme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
} else if (R.id.item_goldentheme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
} else if (R.id.item_memortheme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
} else if (R.id.item_taotheme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||||
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
|
return true;
|
||||||
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
|
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,162 @@
|
|||||||
|
package cc.winboll.studio.libaes.utils;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2024/08/12 14:45:35
|
||||||
|
* @Describe 应用版本工具集
|
||||||
|
*/
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class AppVersionUtils {
|
||||||
|
|
||||||
|
public static final String TAG = "AppVersionUtils";
|
||||||
|
|
||||||
|
//
|
||||||
|
// 检查新版本是否成立
|
||||||
|
// szCurrentCode : 当前版本应用包名
|
||||||
|
// szNextCode : 新版本应用包名
|
||||||
|
// 返回 :情况1:当前版本是发布版
|
||||||
|
// 返回 true (新版本 > 当前版本)
|
||||||
|
// 情况1:当前版本是Beta版
|
||||||
|
// true 新版本 == 当前版本
|
||||||
|
//
|
||||||
|
public static boolean isHasNewVersion2(String szCurrentName, String szNextName) {
|
||||||
|
LogUtils.d(TAG, String.format("isHasNewVersion2\nszCurrentName : %s\nszNextName : %s", szCurrentName, szNextName));
|
||||||
|
//szCurrentName = "AES_6.2.0-beta0_3234.apk";
|
||||||
|
//szNextName = "AES_6.1.12.apk";
|
||||||
|
//szCurrentName = "AES_6.2.0-beta0_3234.apk";
|
||||||
|
//szNextName = "AES_6.2.0.apk";
|
||||||
|
//szCurrentName = "AES_6.2.0-beta0_3234.apk";
|
||||||
|
//szNextName = "AES_6.2.2.apk";
|
||||||
|
//szCurrentName = "AES_6.2.0-beta0_3234.apk";
|
||||||
|
//szNextName = "AES_6.2.0.apk";
|
||||||
|
//szCurrentName = "AES_6.1.0.apk";
|
||||||
|
//szNextName = "AES_6.2.0.apk";
|
||||||
|
//LogUtils.d(TAG, "szCurrentName : " + szCurrentName);
|
||||||
|
//LogUtils.d(TAG, "szNextName : " + szNextName);
|
||||||
|
|
||||||
|
//boolean isVersionNewer = false;
|
||||||
|
//if(szCurrentName.equals(szNextName)) {
|
||||||
|
// isVersionNewer = false;
|
||||||
|
//} else {
|
||||||
|
//ToastUtils.show("szCurrent : " + szCurrent + "\nszNext : " + szNext);
|
||||||
|
//int nApk = szNextName.lastIndexOf(".apk");
|
||||||
|
//ToastUtils.show("nApk : " + Integer.toString(nApk));
|
||||||
|
//String szNextNoApkName = szNextName.substring(0, nApk);
|
||||||
|
//ToastUtils.show("szNextNoApkName : " + szNextNoApkName);
|
||||||
|
//String szCurrentNoApkName = szCurrentName.substring(0, szNextNoApkName.length());
|
||||||
|
//ToastUtils.show("szCurrentNoApkName : " + szCurrentNoApkName);
|
||||||
|
//String str1 = "3.4.50";
|
||||||
|
//String str2 = "3.3.60";
|
||||||
|
//String str1 = getCodeInPackageName(szCurrentName);
|
||||||
|
//String str2 = getCodeInPackageName(szNextName);
|
||||||
|
//String str1 = getCodeInPackageName(szNextName);
|
||||||
|
//String str2 = getCodeInPackageName(szCurrentName);
|
||||||
|
//Boolean isVersionNewer2 = checkNewVersion(str1,str2);
|
||||||
|
//ToastUtils.show("isVersionNewer2 : " + Boolean.toString(isVersionNewer2));
|
||||||
|
//ToastUtils.show(checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName)));
|
||||||
|
//return checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName));
|
||||||
|
//}
|
||||||
|
//return isVersionNewer;
|
||||||
|
if (checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName))) {
|
||||||
|
// 比 AES_6.2.0.apk 版本大,如 AES_6.2.1.apk。
|
||||||
|
// 比 AES_6.2.0-beta0_3234.apk 大,如 AES_6.2.1.apk。
|
||||||
|
//LogUtils.d(TAG, "App newer stage version is released. Release name : " + szNextName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (szCurrentName.matches(".*_\\d+\\.\\d+\\.\\d+-beta.*\\.apk")) {
|
||||||
|
String szCurrentReleasePackageName = getReleasePackageName(szCurrentName);
|
||||||
|
//LogUtils.d(TAG, "szCurrentReleasePackageName : " + szCurrentReleasePackageName);
|
||||||
|
if (szCurrentReleasePackageName.equals(szNextName)) {
|
||||||
|
// 与 AES_6.2.0-beta0_3234.apk 版本相同,如 AES_6.2.0.apk。
|
||||||
|
//LogUtils.d(TAG, "App stage version is released. Release name : " + szNextName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//LogUtils.d(TAG, "App version is the newest. ");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isHasNewStageReleaseVersion(String szCurrentName, String szNextName) {
|
||||||
|
LogUtils.d(TAG, String.format("isHasNewStageReleaseVersion\nszCurrentName : %s\nszNextName : %s", szCurrentName, szNextName));
|
||||||
|
//szCurrentName = "AES_6.2.12.apk";
|
||||||
|
//szNextName = "AES_6.3.12.apk";
|
||||||
|
if (checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName))) {
|
||||||
|
// 比 AES_6.2.0.apk 版本大,如 AES_6.2.1.apk。
|
||||||
|
//LogUtils.d(TAG, "App newer stage version is released. Release name : " + szNextName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 检查新版本是否成立
|
||||||
|
// szCurrentCode : 当前版本
|
||||||
|
// szNextCode : 新版本
|
||||||
|
// 返回 :true 新版本 > 当前版本
|
||||||
|
//
|
||||||
|
public static Boolean checkNewVersion(String szCurrentCode, String szNextCode) {
|
||||||
|
if (szCurrentCode == null || szCurrentCode.equals("") || szNextCode == null || szNextCode.equals("")) {
|
||||||
|
LogUtils.d(TAG, String.format("checkNewVersion unexpected parameters:\nszCurrentCode : %s\nszNextCode : %s", szCurrentCode, szNextCode));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
boolean isNew = false;
|
||||||
|
String[] appVersionCurrent = szCurrentCode.split("\\.");
|
||||||
|
String[] appVersionNext = szNextCode.split("\\.");
|
||||||
|
//根据位数最短的判断
|
||||||
|
int lim = appVersionCurrent.length > appVersionNext.length ? appVersionNext.length : appVersionCurrent.length;
|
||||||
|
//根据位数循环判断各个版本
|
||||||
|
for (int i = 0; i < lim; i++) {
|
||||||
|
if (Integer.parseInt(appVersionNext[i]) > Integer.parseInt(appVersionCurrent[i])) {
|
||||||
|
isNew = true;
|
||||||
|
return isNew;
|
||||||
|
} else if (Integer.parseInt(appVersionNext[i]) == Integer.parseInt(appVersionCurrent[i])) {
|
||||||
|
continue ;
|
||||||
|
} else {
|
||||||
|
isNew = false;
|
||||||
|
return isNew;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isNew;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 截取应用包名称版本号信息
|
||||||
|
// 如 :AppUtils_7.0.4-beta1_0120.apk 版本号为 7.0.4
|
||||||
|
// 如 :AppUtils_7.0.4.apk 版本号为 7.0.4
|
||||||
|
//
|
||||||
|
public static String getCodeInPackageName(String apkName) {
|
||||||
|
LogUtils.d(TAG, String.format("getCodeInPackageName apkName : %s", apkName));
|
||||||
|
//String apkName = "AppUtils_7.0.0.apk";
|
||||||
|
Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+");
|
||||||
|
Matcher matcher = pattern.matcher(apkName);
|
||||||
|
if (matcher.find()) {
|
||||||
|
String version = matcher.group();
|
||||||
|
LogUtils.d(TAG, String.format("version is %s", version));
|
||||||
|
return version;
|
||||||
|
//System.out.println("Version number: " + version); // 输出:7.0.0
|
||||||
|
}
|
||||||
|
LogUtils.d(TAG, String.format("No result."));
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 根据Beta版名称生成发布版应用包名称
|
||||||
|
// 如 AppUtils_7.0.4-beta1_0120.apk
|
||||||
|
// 发布版名称就为AppUtils_7.0.4.apk
|
||||||
|
//
|
||||||
|
public static String getReleasePackageName(String szBetaPackageName) {
|
||||||
|
//String szBetaPackageName = "AppUtils_7.0.4-beta1_0120.apk";
|
||||||
|
Pattern pattern = Pattern.compile(".*\\d+\\.\\d+\\.\\d+");
|
||||||
|
Matcher matcher = pattern.matcher(szBetaPackageName);
|
||||||
|
if (matcher.find()) {
|
||||||
|
String szReleasePackageName = matcher.group();
|
||||||
|
return szReleasePackageName + ".apk";
|
||||||
|
//System.out.println("Version number: " + version); // 输出:7.0.0
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
@ -6,24 +6,30 @@ package cc.winboll.studio.libaes.views;
|
|||||||
* @Describe AOneHundredPercantClickToCommitSeekBar
|
* @Describe AOneHundredPercantClickToCommitSeekBar
|
||||||
*/
|
*/
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.widget.SeekBar;
|
import android.widget.SeekBar;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
|
||||||
public class AOHPCTCSeekBar extends SeekBar {
|
public class AOHPCTCSeekBar extends SeekBar {
|
||||||
|
|
||||||
public static final String TAG = "AOHPCTCSeekBar";
|
public static final String TAG = "AOHPCTCSeekBar";
|
||||||
|
|
||||||
// 可开始拉动的起始位置(百分比值)
|
volatile int thumbWidth = 1;
|
||||||
static final int ENABLE_POST_PERCENT_X = 20;
|
volatile int progressBarWidth = 1;
|
||||||
// 最小拉动值,滑块拉动值要超过这个值,确定事件才会提交。
|
// 设置按钮模糊右边边缘像素
|
||||||
static final int TO_MIN_VALUE = 15;
|
volatile int blurRightDP = 1;
|
||||||
|
// 是否从起点拉动的标志
|
||||||
|
volatile boolean isStartSeek = false;
|
||||||
|
|
||||||
// 外部接口对象,确定事件提交会调用该对象的方法
|
// 外部接口对象,确定事件提交会调用该对象的方法
|
||||||
OnOHPCListener mOnOHPCListener;
|
OnOHPCListener mOnOHPCListener;
|
||||||
// 是否从起点拉动的标志
|
|
||||||
boolean mIsStartTo = false;
|
|
||||||
// 拉动的滑动值
|
public void setBlurRightDP(int blurRight) {
|
||||||
int mnTo = 0;
|
this.blurRightDP = blurRight;
|
||||||
|
}
|
||||||
|
|
||||||
public void setOnOHPCListener(OnOHPCListener listener) {
|
public void setOnOHPCListener(OnOHPCListener listener) {
|
||||||
mOnOHPCListener = listener;
|
mOnOHPCListener = listener;
|
||||||
@ -35,83 +41,68 @@ public class AOHPCTCSeekBar extends SeekBar {
|
|||||||
|
|
||||||
public AOHPCTCSeekBar(Context context) {
|
public AOHPCTCSeekBar(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
initView(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AOHPCTCSeekBar(Context context, AttributeSet attrs) {
|
public AOHPCTCSeekBar(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
|
initView(context);
|
||||||
//LogUtils.d(TAG, "AOHPCTCSeekBar(...)");
|
|
||||||
|
|
||||||
// 获得TypedArray
|
|
||||||
//TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AToolbar);
|
|
||||||
// 获得attrs.xml里面的属性值,格式为:名称_属性名,后面是默认值
|
|
||||||
//int colorBackgroud = a.getColor(R.styleable.ACard_backgroudColor, context.getColor(R.color.colorACardBackgroung));
|
|
||||||
//int centerColor = a.getColor(R.styleable.AToolbar_centerColor, context.getColor(R.color.colorAToolbarCenterColor));
|
|
||||||
//int endColor = a.getColor(R.styleable.AToolbar_endColor, context.getColor(R.color.colorAToolbarEndColor));
|
|
||||||
//float tSize = a.getDimension(R.styleable.CustomView_tSize, 35);
|
|
||||||
//p.setColor(tColor);
|
|
||||||
//p.setTextSize(tSize);
|
|
||||||
//Drawable drawable = context.getDrawable(R.drawable.frame_atoolbar);
|
|
||||||
|
|
||||||
//setBackground(context.getDrawable(R.drawable.acard_frame_main));
|
|
||||||
|
|
||||||
// 返回一个绑定资源结束的信号给资源
|
|
||||||
//a.recycle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public AOHPCTCSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
|
public AOHPCTCSeekBar(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||||
super(context, attrs, defStyleAttr);
|
super(context, attrs, defStyleAttr);
|
||||||
|
initView(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
void initView(Context context) {
|
||||||
protected void onFinishInflate() {
|
|
||||||
super.onFinishInflate();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean dispatchTouchEvent(MotionEvent event) {
|
public boolean dispatchTouchEvent(MotionEvent event) {
|
||||||
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
||||||
//LogUtils.d(TAG, "ACTION_DOWN");
|
if (thumbWidth + blurRightDP > event.getX() && event.getX() > 0) {
|
||||||
// 有效的拖动起始位置(ENABLE_POST_PERCENT_X)%
|
getParent().requestDisallowInterceptTouchEvent(true);
|
||||||
int nEnablePostX = ((getRight() - getLeft()) * ENABLE_POST_PERCENT_X / 100) + getLeft();
|
isStartSeek = true;
|
||||||
|
|
||||||
if ((getLeft() < event.getX())
|
|
||||||
&& (event.getX() < nEnablePostX)) {
|
|
||||||
//LogUtils.d(TAG, "event.getX() is " + Float.toString(event.getX()));
|
|
||||||
mIsStartTo = true;
|
|
||||||
return super.dispatchTouchEvent(event);
|
|
||||||
}
|
|
||||||
if (!mIsStartTo) {
|
|
||||||
resetView();
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
|
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
|
||||||
//LogUtils.d(TAG, "ACTION_MOVE");
|
if (isStartSeek) {
|
||||||
if (mIsStartTo) {
|
super.dispatchTouchEvent(event);
|
||||||
mnTo++;
|
|
||||||
}
|
}
|
||||||
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
} else if (event.getAction() == MotionEvent.ACTION_UP
|
||||||
//LogUtils.d(TAG, Integer.toString(getProgress()));
|
|| event.getAction() == MotionEvent.ACTION_CANCEL) {
|
||||||
// 提交100%确定事件
|
getParent().requestDisallowInterceptTouchEvent(false);
|
||||||
if ((getProgress() == 100) && (mnTo > TO_MIN_VALUE)) {
|
if (getProgress() == progressBarWidth) {
|
||||||
//LogUtils.d(TAG, "Commit mnTo is " + Integer.toString(mnTo));
|
|
||||||
mOnOHPCListener.onOHPCommit();
|
mOnOHPCListener.onOHPCommit();
|
||||||
//resetView();
|
|
||||||
//return true;
|
|
||||||
}
|
}
|
||||||
resetView();
|
// 重置控件状态
|
||||||
return false;
|
setProgress(0);
|
||||||
|
isStartSeek = false;
|
||||||
}
|
}
|
||||||
//LogUtils.d(TAG, "dispatchTouchEvent End");
|
return true;
|
||||||
return super.dispatchTouchEvent(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重置控件状态
|
@Override
|
||||||
//
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||||
void resetView() {
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||||
setProgress(0);
|
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||||
mnTo = 0;
|
//int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||||
mIsStartTo = false;
|
//LogUtils.d(TAG, String.format("width %d height %d", width, height));
|
||||||
|
|
||||||
|
// 获取SeekBar的图标宽度
|
||||||
|
Drawable thumbDrawable = getThumb();
|
||||||
|
if (thumbDrawable != null) {
|
||||||
|
// 获取图标宽度
|
||||||
|
thumbWidth = thumbDrawable.getIntrinsicWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取进度条宽度
|
||||||
|
progressBarWidth = width;
|
||||||
|
|
||||||
|
//LogUtils.d(TAG, String.format("thumbWidth %d progressBarWidth %d", thumbWidth, progressBarWidth));
|
||||||
|
|
||||||
|
// 设置图标位置
|
||||||
|
setThumbOffset(0);
|
||||||
|
// 设置进度条刻度
|
||||||
|
setMax(progressBarWidth);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,143 @@
|
|||||||
|
package cc.winboll.studio.libaes.winboll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/01/20 14:19:02
|
||||||
|
* @Describe 应用信息类
|
||||||
|
*/
|
||||||
|
import cc.winboll.studio.libaes.R;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class APPInfo implements Serializable {
|
||||||
|
|
||||||
|
public static final String TAG = "APPInfo";
|
||||||
|
|
||||||
|
// 应用名称
|
||||||
|
String appName;
|
||||||
|
// 应用图标
|
||||||
|
int appIcon;
|
||||||
|
// 应用描述
|
||||||
|
String appDescription;
|
||||||
|
// 应用Git仓库地址
|
||||||
|
String appGitName;
|
||||||
|
// 应用Git仓库拥有者
|
||||||
|
String appGitOwner;
|
||||||
|
// 应用Git仓库分支
|
||||||
|
String appGitAPPBranch;
|
||||||
|
// 应用Git仓库子项目文件夹
|
||||||
|
String appGitAPPSubProjectFolder;
|
||||||
|
// 应用主页
|
||||||
|
String appHomePage;
|
||||||
|
// 应用包名称
|
||||||
|
String appAPKName;
|
||||||
|
// 应用包存储文件夹名称
|
||||||
|
String appAPKFolderName;
|
||||||
|
|
||||||
|
public APPInfo(String appName, int appIcon, String appDescription, String appGitName, String appGitOwner, String appGitAPPBranch, String appGitAPPSubProjectFolder, String appHomePage, String appAPKName, String appAPKFolderName) {
|
||||||
|
this.appName = appName;
|
||||||
|
this.appIcon = appIcon;
|
||||||
|
this.appDescription = appDescription;
|
||||||
|
this.appGitName = appGitName;
|
||||||
|
this.appGitOwner = appGitOwner;
|
||||||
|
this.appGitAPPBranch = appGitAPPBranch;
|
||||||
|
this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
|
||||||
|
this.appHomePage = appHomePage;
|
||||||
|
this.appAPKName = appAPKName;
|
||||||
|
this.appAPKFolderName = appAPKFolderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public APPInfo() {
|
||||||
|
String szBranchName = "app";
|
||||||
|
this.appName = "APP";
|
||||||
|
this.appIcon = R.drawable.ic_launcher;
|
||||||
|
this.appDescription = "APP Description";
|
||||||
|
this.appGitName = "APP";
|
||||||
|
this.appGitOwner = "Studio";
|
||||||
|
this.appGitAPPBranch = szBranchName;
|
||||||
|
this.appGitAPPSubProjectFolder = szBranchName;
|
||||||
|
this.appHomePage = "https://www.winboll.cc/studio/details.php?app=APP";
|
||||||
|
this.appAPKName = "APP";
|
||||||
|
this.appAPKFolderName = "APP";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppGitOwner(String appGitOwner) {
|
||||||
|
this.appGitOwner = appGitOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppGitOwner() {
|
||||||
|
return appGitOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppGitAPPBranch(String appGitAPPBranch) {
|
||||||
|
this.appGitAPPBranch = appGitAPPBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppGitAPPBranch() {
|
||||||
|
return appGitAPPBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppGitAPPSubProjectFolder(String appGitAPPSubProjectFolder) {
|
||||||
|
this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppGitAPPSubProjectFolder() {
|
||||||
|
return appGitAPPSubProjectFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppIcon(int appIcon) {
|
||||||
|
this.appIcon = appIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAppIcon() {
|
||||||
|
return appIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppDescription(String appDescription) {
|
||||||
|
this.appDescription = appDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppDescription() {
|
||||||
|
return appDescription;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppAPKFolderName(String appAPKFolderName) {
|
||||||
|
this.appAPKFolderName = appAPKFolderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppAPKFolderName() {
|
||||||
|
return appAPKFolderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppName(String appName) {
|
||||||
|
this.appName = appName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppName() {
|
||||||
|
return appName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppGitName(String appGitName) {
|
||||||
|
this.appGitName = appGitName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppGitName() {
|
||||||
|
return appGitName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppHomePage(String appHomePage) {
|
||||||
|
this.appHomePage = appHomePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppHomePage() {
|
||||||
|
return appHomePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppAPKName(String appAPKName) {
|
||||||
|
this.appAPKName = appAPKName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppAPKName() {
|
||||||
|
return appAPKName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,392 @@
|
|||||||
|
package cc.winboll.studio.libaes.winboll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/24 15:08:52
|
||||||
|
* @Describe WinBoll应用介绍视图
|
||||||
|
*/
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.os.Message;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import cc.winboll.studio.libaes.R;
|
||||||
|
import cc.winboll.studio.libaes.utils.AppVersionUtils;
|
||||||
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
||||||
|
import cc.winboll.studio.libapputils.utils.PrefUtils;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
import java.io.IOException;
|
||||||
|
import mehdi.sakout.aboutpage.AboutPage;
|
||||||
|
import mehdi.sakout.aboutpage.Element;
|
||||||
|
import okhttp3.Call;
|
||||||
|
import okhttp3.Callback;
|
||||||
|
import okhttp3.Credentials;
|
||||||
|
import okhttp3.OkHttpClient;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
public class AboutView extends LinearLayout {
|
||||||
|
|
||||||
|
public static final String TAG = "AboutView";
|
||||||
|
|
||||||
|
public static final int MSG_APPUPDATE_CHECKED = 0;
|
||||||
|
|
||||||
|
Context mContext;
|
||||||
|
APPInfo mAPPInfo;
|
||||||
|
|
||||||
|
WinBollServiceStatusView mWinBollServiceStatusView;
|
||||||
|
OnRequestDevUserInfoAutofillListener mOnRequestDevUserInfoAutofillListener;
|
||||||
|
String mszAppName = "";
|
||||||
|
String mszAppAPKFolderName = "";
|
||||||
|
String mszAppAPKName = "";
|
||||||
|
String mszAppGitName = "";
|
||||||
|
String mszAppVersionName = "";
|
||||||
|
String mszCurrentAppPackageName = "";
|
||||||
|
volatile String mszNewestAppPackageName = "";
|
||||||
|
String mszAppDescription = "";
|
||||||
|
String mszHomePage = "";
|
||||||
|
String mszGitea = "";
|
||||||
|
int mnAppIcon = 0;
|
||||||
|
String mszWinBollServerHost;
|
||||||
|
String mszReleaseAPKName;
|
||||||
|
EditText metDevUserName;
|
||||||
|
EditText metDevUserPassword;
|
||||||
|
|
||||||
|
public AboutView(Context context, APPInfo appInfo) {
|
||||||
|
super(context);
|
||||||
|
mContext = context;
|
||||||
|
|
||||||
|
setAPPInfo(appInfo);
|
||||||
|
initView(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AboutView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
mContext = context;
|
||||||
|
|
||||||
|
initView(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAPPInfo(APPInfo appInfo) {
|
||||||
|
mAPPInfo = appInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
APPInfo createAppInfo(Context context, AttributeSet attrs) {
|
||||||
|
APPInfo appInfo = new APPInfo();
|
||||||
|
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AboutView);
|
||||||
|
appInfo.setAppName(typedArray.getString(R.styleable.AboutView_app_name));
|
||||||
|
appInfo.setAppAPKFolderName(typedArray.getString(R.styleable.AboutView_app_apkfoldername));
|
||||||
|
appInfo.setAppAPKName(typedArray.getString(R.styleable.AboutView_app_apkname));
|
||||||
|
appInfo.setAppGitName(typedArray.getString(R.styleable.AboutView_app_gitname));
|
||||||
|
appInfo.setAppGitOwner(typedArray.getString(R.styleable.AboutView_app_gitowner));
|
||||||
|
appInfo.setAppGitAPPBranch(typedArray.getString(R.styleable.AboutView_app_gitappbranch));
|
||||||
|
appInfo.setAppGitAPPSubProjectFolder(typedArray.getString(R.styleable.AboutView_app_gitappsubprojectfolder));
|
||||||
|
appInfo.setAppDescription(typedArray.getString(R.styleable.AboutView_appdescription));
|
||||||
|
appInfo.setAppIcon(typedArray.getResourceId(R.styleable.AboutView_appicon, R.drawable.ic_winboll));
|
||||||
|
// 返回一个绑定资源结束的信号给资源
|
||||||
|
typedArray.recycle();
|
||||||
|
return appInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void initView(Context context) {
|
||||||
|
mszAppName = mAPPInfo.getAppName();
|
||||||
|
mszAppAPKFolderName = mAPPInfo.getAppAPKFolderName();
|
||||||
|
mszAppAPKName = mAPPInfo.getAppAPKName();
|
||||||
|
mszAppGitName = mAPPInfo.getAppGitName();
|
||||||
|
mszAppDescription = mAPPInfo.getAppDescription();
|
||||||
|
mnAppIcon = mAPPInfo.getAppIcon();
|
||||||
|
|
||||||
|
mszWinBollServerHost = GlobalApplication.isDebuging() ? "https://dev.winboll.cc": "https://www.winboll.cc";
|
||||||
|
|
||||||
|
try {
|
||||||
|
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
mszCurrentAppPackageName = mszAppAPKName + "_" + mszAppVersionName + ".apk";
|
||||||
|
mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
|
||||||
|
if (mAPPInfo.getAppGitAPPBranch().equals("")) {
|
||||||
|
mszGitea = "https://gitea.winboll.cc/" + mAPPInfo.getAppGitOwner() + "/" + mszAppGitName;
|
||||||
|
} else {
|
||||||
|
mszGitea = "https://gitea.winboll.cc/" + mAPPInfo.getAppGitOwner() + "/" + mszAppGitName + "/src/branch/" + mAPPInfo.getAppGitAPPBranch() + "/" + mAPPInfo.getAppGitAPPSubProjectFolder();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
metDevUserName = addedView.findViewById(R.id.viewaboutdevEditText1);
|
||||||
|
metDevUserPassword = addedView.findViewById(R.id.viewaboutdevEditText2);
|
||||||
|
metDevUserName.setText(PrefUtils.getString(mContext, "metDevUserName", ""));
|
||||||
|
metDevUserPassword.setText(PrefUtils.getString(mContext, "metDevUserPassword", ""));
|
||||||
|
//mDevelopHostConnectionStatusView = new DevelopHostConnectionStatusView(context);
|
||||||
|
mWinBollServiceStatusView = addedView.findViewById(R.id.viewaboutdevWinBollServiceStatusView1);
|
||||||
|
mWinBollServiceStatusView.setServerHost(mszWinBollServerHost);
|
||||||
|
mWinBollServiceStatusView.setAuthInfo(metDevUserName.getText().toString(), metDevUserPassword.getText().toString());
|
||||||
|
//llMain.addView(mDevelopHostConnectionStatusView);
|
||||||
|
llMain.addView(createAboutPage());
|
||||||
|
addView(addedView);
|
||||||
|
} else {
|
||||||
|
LayoutInflater inflater = LayoutInflater.from(mContext);
|
||||||
|
View addedView = inflater.inflate(R.layout.view_about_www, this, false);
|
||||||
|
LinearLayout llMain = addedView.findViewById(R.id.viewaboutwwwLinearLayout1);
|
||||||
|
//mDevelopHostConnectionStatusView = new DevelopHostConnectionStatusView(context);
|
||||||
|
mWinBollServiceStatusView = addedView.findViewById(R.id.viewaboutwwwWinBollServiceStatusView1);
|
||||||
|
mWinBollServiceStatusView.setServerHost(mszWinBollServerHost);
|
||||||
|
mWinBollServiceStatusView.setAuthInfo("", "");
|
||||||
|
//llMain.addView(mDevelopHostConnectionStatusView);
|
||||||
|
llMain.addView(createAboutPage());
|
||||||
|
addView(addedView);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化标题栏
|
||||||
|
//setSubtitle(getContext().getString(R.string.text_about));
|
||||||
|
|
||||||
|
// LinearLayout llMain = findViewById(R.id.viewaboutLinearLayout1);
|
||||||
|
// llMain.addView(createAboutPage());
|
||||||
|
|
||||||
|
// 就读取正式版应用包版本号,设置 Release 应用包文件名
|
||||||
|
String szReleaseAppVersionName = "";
|
||||||
|
try {
|
||||||
|
//LogUtils.d(TAG, String.format("mContext.getPackageName() %s", mContext.getPackageName()));
|
||||||
|
String szSubBetaSuffix = subBetaSuffix(mContext.getPackageName());
|
||||||
|
//LogUtils.d(TAG, String.format("szSubBetaSuffix : %s", szSubBetaSuffix));
|
||||||
|
szReleaseAppVersionName = mContext.getPackageManager().getPackageInfo(szSubBetaSuffix, 0).versionName;
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
mszReleaseAPKName = mszAppAPKName + "_" + szReleaseAppVersionName + ".apk";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void initView(Context context, AttributeSet attrs) {
|
||||||
|
mAPPInfo = createAppInfo(context, attrs);
|
||||||
|
initView(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String subBetaSuffix(String input) {
|
||||||
|
if (input.endsWith(".beta")) {
|
||||||
|
return input.substring(0, input.length() - ".beta".length());
|
||||||
|
}
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
android.os.Handler mHandler = new android.os.Handler() {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
super.handleMessage(msg);
|
||||||
|
switch (msg.what) {
|
||||||
|
case MSG_APPUPDATE_CHECKED : {
|
||||||
|
/*//检查当前应用包文件名是否是测试版,如果是就忽略检查
|
||||||
|
if(mszCurrentAppPackageName.matches(".*_\\d+\\.\\d+\\.\\d+-beta.*\\.apk")) {
|
||||||
|
ToastUtils.show("APP is the beta Version. Version check ignore.");
|
||||||
|
return;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// if (!AppVersionUtils.isHasNewStageReleaseVersion(mszReleaseAPKName, mszNewestAppPackageName)) {
|
||||||
|
// ToastUtils.delayedShow("Current app is the newest.", 5000);
|
||||||
|
// }
|
||||||
|
if (!AppVersionUtils.isHasNewVersion2(mszCurrentAppPackageName, mszNewestAppPackageName)) {
|
||||||
|
ToastUtils.show("Current app is the newest.");
|
||||||
|
} else {
|
||||||
|
String szMsg = "Current app is :\n[ " + mszCurrentAppPackageName
|
||||||
|
+ " ]\nThe last app is :\n[ " + mszNewestAppPackageName
|
||||||
|
+ " ]\nIs download the last app?";
|
||||||
|
YesNoAlertDialog.show(mContext, "Application Update Prompt", szMsg, mIsDownlaodUpdateListener);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected View createAboutPage() {
|
||||||
|
// 定义应用调试按钮
|
||||||
|
//
|
||||||
|
Element elementAppMode;
|
||||||
|
if (GlobalApplication.isDebuging()) {
|
||||||
|
elementAppMode = new Element(mContext.getString(R.string.app_normal), R.drawable.ic_winboll);
|
||||||
|
elementAppMode.setOnClickListener(mAppNormalOnClickListener);
|
||||||
|
} else {
|
||||||
|
elementAppMode = new Element(mContext.getString(R.string.app_debug), R.drawable.ic_winboll);
|
||||||
|
elementAppMode.setOnClickListener(mAppDebugOnClickListener);
|
||||||
|
}
|
||||||
|
// 定义 GitWeb 按钮
|
||||||
|
//
|
||||||
|
Element elementGitWeb = new Element(mContext.getString(R.string.gitea_home), R.drawable.ic_winboll);
|
||||||
|
elementGitWeb.setOnClickListener(mGitWebOnClickListener);
|
||||||
|
// 定义检查更新按钮
|
||||||
|
//
|
||||||
|
Element elementAppUpdate = new Element(mContext.getString(R.string.app_update), R.drawable.ic_winboll);
|
||||||
|
elementAppUpdate.setOnClickListener(mAppUpdateOnClickListener);
|
||||||
|
|
||||||
|
String szAppInfo = "";
|
||||||
|
try {
|
||||||
|
szAppInfo = mszAppName + " "
|
||||||
|
+ mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName
|
||||||
|
+ "\n" + mszAppDescription;
|
||||||
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
|
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
View aboutPage = new AboutPage(mContext)
|
||||||
|
.setDescription(szAppInfo)
|
||||||
|
//.isRTL(false)
|
||||||
|
//.setCustomFont(String) // or Typeface
|
||||||
|
.setImage(mnAppIcon)
|
||||||
|
//.addItem(versionElement)
|
||||||
|
//.addItem(adsElement)
|
||||||
|
//.addGroup("Connect with us")
|
||||||
|
.addEmail("ZhanGSKen@AliYun.Com")
|
||||||
|
.addWebsite(mszHomePage)
|
||||||
|
.addItem(elementAppMode)
|
||||||
|
.addItem(elementGitWeb)
|
||||||
|
.addItem(elementAppUpdate)
|
||||||
|
//.addFacebook("the.medy")
|
||||||
|
//.addTwitter("medyo80")
|
||||||
|
//.addYoutube("UCdPQtdWIsg7_pi4mrRu46vA")
|
||||||
|
//.addPlayStore("com.ideashower.readitlater.pro")
|
||||||
|
//.addGitHub("medyo")
|
||||||
|
//.addInstagram("medyo80")
|
||||||
|
.create();
|
||||||
|
return aboutPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
View.OnClickListener mAppDebugOnClickListener = new View.OnClickListener(){
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
//ToastUtils.show("mAppDebugOnClickListener");
|
||||||
|
setApp2DebugMode(mContext);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
View.OnClickListener mAppNormalOnClickListener = new View.OnClickListener(){
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
//ToastUtils.show("mAppNormalOnClickListener");
|
||||||
|
setApp2NormalMode(mContext);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static void setApp2DebugMode(Context context) {
|
||||||
|
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
|
||||||
|
if (intent != null) {
|
||||||
|
//intent.setAction(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
GlobalApplication.setIsDebuging(true);
|
||||||
|
|
||||||
|
GlobalApplication.getWinBollActivityManager().finishAll();
|
||||||
|
context.startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setApp2NormalMode(Context context) {
|
||||||
|
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
|
||||||
|
if (intent != null) {
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
GlobalApplication.setIsDebuging(false);
|
||||||
|
|
||||||
|
GlobalApplication.getWinBollActivityManager().finishAll();
|
||||||
|
context.startActivity(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
View.OnClickListener mGitWebOnClickListener = new View.OnClickListener(){
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mszGitea));
|
||||||
|
mContext.startActivity(browserIntent);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
View.OnClickListener mAppUpdateOnClickListener = new View.OnClickListener(){
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
ToastUtils.show("Start app update checking.");
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String szUrl = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
|
||||||
|
// 构建包含认证信息的请求
|
||||||
|
String credential = "";
|
||||||
|
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());
|
||||||
|
} else {
|
||||||
|
credential = Credentials.basic("WinBoll", "WinBollPowerByZhanGSKen");
|
||||||
|
}
|
||||||
|
OkHttpClient client = new OkHttpClient();
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(szUrl)
|
||||||
|
.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) {
|
||||||
|
// 处理网络请求失败
|
||||||
|
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResponse(Call call, Response response) throws IOException {
|
||||||
|
if (!response.isSuccessful()) {
|
||||||
|
LogUtils.d(TAG, "Unexpected code " + response, Thread.currentThread().getStackTrace());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 读取响应体作为字符串,注意这里可能需要解码
|
||||||
|
String text = response.body().string();
|
||||||
|
org.jsoup.nodes.Document doc = org.jsoup.Jsoup.parse(text);
|
||||||
|
LogUtils.v(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));
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
YesNoAlertDialog.OnDialogResultListener mIsDownlaodUpdateListener = new YesNoAlertDialog.OnDialogResultListener() {
|
||||||
|
@Override
|
||||||
|
public void onYes() {
|
||||||
|
String szUrl = mszWinBollServerHost + "/studio/download.php?appname=" + mszAppAPKFolderName + "&apkname=" + mszNewestAppPackageName;
|
||||||
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(szUrl));
|
||||||
|
mContext.startActivity(browserIntent);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNo() {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public interface OnRequestDevUserInfoAutofillListener {
|
||||||
|
void requestAutofill(EditText etDevUserName, EditText etDevUserPassword);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnRequestDevUserInfoAutofillListener(OnRequestDevUserInfoAutofillListener l) {
|
||||||
|
mOnRequestDevUserInfoAutofillListener = l;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
package cc.winboll.studio.libaes.winboll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/28 19:12:12
|
||||||
|
* @Describe 应用主要服务组件类守护进程服务组件类
|
||||||
|
*/
|
||||||
|
import android.app.Service;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.ServiceConnection;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import cc.winboll.studio.libaes.winboll.WinBollClientService;
|
||||||
|
import cc.winboll.studio.libappbase.utils.ServiceUtils;
|
||||||
|
|
||||||
|
public class AssistantService extends Service {
|
||||||
|
|
||||||
|
public final static String TAG = "AssistantService";
|
||||||
|
|
||||||
|
WinBollClientServiceBean mWinBollServiceBean;
|
||||||
|
MyServiceConnection mMyServiceConnection;
|
||||||
|
volatile boolean mIsServiceRunning;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
mWinBollServiceBean = WinBollClientServiceBean.loadWinBollClientServiceBean(this);
|
||||||
|
if (mMyServiceConnection == null) {
|
||||||
|
mMyServiceConnection = new MyServiceConnection();
|
||||||
|
}
|
||||||
|
// 设置运行参数
|
||||||
|
mIsServiceRunning = false;
|
||||||
|
run();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||||
|
run();
|
||||||
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
mIsServiceRunning = false;
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 运行服务内容
|
||||||
|
//
|
||||||
|
void run() {
|
||||||
|
mWinBollServiceBean = WinBollClientServiceBean.loadWinBollClientServiceBean(this);
|
||||||
|
if (mWinBollServiceBean.isEnable()) {
|
||||||
|
if (mIsServiceRunning == false) {
|
||||||
|
// 设置运行状态
|
||||||
|
mIsServiceRunning = true;
|
||||||
|
// 唤醒和绑定主进程
|
||||||
|
wakeupAndBindMain();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 唤醒和绑定主进程
|
||||||
|
//
|
||||||
|
void wakeupAndBindMain() {
|
||||||
|
if (ServiceUtils.isServiceRunning(getApplicationContext(), WinBollClientService.class.getName()) == false) {
|
||||||
|
startForegroundService(new Intent(AssistantService.this, WinBollClientService.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
bindService(new Intent(AssistantService.this, WinBollClientService.class), mMyServiceConnection, Context.BIND_IMPORTANT);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// 主进程与守护进程连接时需要用到此类
|
||||||
|
//
|
||||||
|
class MyServiceConnection implements ServiceConnection {
|
||||||
|
@Override
|
||||||
|
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onServiceDisconnected(ComponentName name) {
|
||||||
|
mWinBollServiceBean = WinBollClientServiceBean.loadWinBollClientServiceBean(AssistantService.this);
|
||||||
|
if (mWinBollServiceBean.isEnable()) {
|
||||||
|
wakeupAndBindMain();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package cc.winboll.studio.libaes.winboll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/28 19:11:27
|
||||||
|
* @Describe WinBoll UI 状态图标枚举
|
||||||
|
*/
|
||||||
|
import cc.winboll.studio.libaes.R;
|
||||||
|
|
||||||
|
public enum EWUIStatusIconDrawable {
|
||||||
|
NORMAL(0),
|
||||||
|
NEWS(1)
|
||||||
|
;
|
||||||
|
|
||||||
|
static final String TAG = "WUIStatusIconDrawable";
|
||||||
|
|
||||||
|
static String[] _mlistCNName = { "正常", "新的消息" };
|
||||||
|
|
||||||
|
private int value = 0;
|
||||||
|
private EWUIStatusIconDrawable(int value) { //必须是private的,否则编译错误
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getIconDrawableId(EWUIStatusIconDrawable drawableId) {
|
||||||
|
int res;
|
||||||
|
switch(drawableId){
|
||||||
|
case NEWS :
|
||||||
|
res = R.drawable.ic_winbollbeta;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
res = R.drawable.ic_winboll;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
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();
|
||||||
|
}
|
@ -0,0 +1,192 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,472 @@
|
|||||||
|
package cc.winboll.studio.libaes.winboll;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/03/28 17:41:55
|
||||||
|
* @Describe WinBoll 服务主机连接状态视图
|
||||||
|
*/
|
||||||
|
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.R;
|
||||||
|
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) {
|
||||||
|
}
|
||||||
|
};*/
|
||||||
|
}
|
41
libaes/src/main/res/drawable/bg_shadow.xml
Normal file
41
libaes/src/main/res/drawable/bg_shadow.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
|
<!-- 阴影部分 -->
|
||||||
|
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
|
||||||
|
<item
|
||||||
|
android:left="2dp"
|
||||||
|
android:top="2dp"
|
||||||
|
android:right="2dp"
|
||||||
|
android:bottom="2dp">
|
||||||
|
<shape android:shape="rectangle" >
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:endColor="#0F000000"
|
||||||
|
android:startColor="#0F000000" />
|
||||||
|
<corners
|
||||||
|
android:bottomLeftRadius="6dip"
|
||||||
|
android:bottomRightRadius="6dip"
|
||||||
|
android:topLeftRadius="6dip"
|
||||||
|
android:topRightRadius="6dip" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<!-- 背景部分 -->
|
||||||
|
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
|
||||||
|
<item
|
||||||
|
android:left="3dp"
|
||||||
|
android:top="3dp"
|
||||||
|
android:right="3dp"
|
||||||
|
android:bottom="5dp">
|
||||||
|
<shape android:shape="rectangle" >
|
||||||
|
<gradient
|
||||||
|
android:angle="270"
|
||||||
|
android:endColor="@color/colorAccent"
|
||||||
|
android:startColor="@color/colorAccent" />
|
||||||
|
<corners
|
||||||
|
android:bottomLeftRadius="6dip"
|
||||||
|
android:bottomRightRadius="6dip"
|
||||||
|
android:topLeftRadius="6dip"
|
||||||
|
android:topRightRadius="6dip" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
11
libaes/src/main/res/drawable/ic_call.xml
Normal file
11
libaes/src/main/res/drawable/ic_call.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M6.62,10.79C8.06,13.62 10.38,15.94 13.21,17.38L15.41,15.18C15.69,14.9 16.08,14.82 16.43,14.93C17.55,15.3 18.75,15.5 20,15.5A1,1 0,0 1,21 16.5V20A1,1 0,0 1,20 21A17,17 0,0 1,3 4A1,1 0,0 1,4 3H7.5A1,1 0,0 1,8.5 4C8.5,5.25 8.7,6.45 9.07,7.57C9.18,7.92 9.1,8.31 8.82,8.59L6.62,10.79Z"/>
|
||||||
|
|
||||||
|
</vector>
|
11
libaes/src/main/res/drawable/ic_dev_connected.xml
Normal file
11
libaes/src/main/res/drawable/ic_dev_connected.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M4,1C2.89,1 2,1.89 2,3V7C2,8.11 2.89,9 4,9H1V11H13V9H10C11.11,9 12,8.11 12,7V3C12,1.89 11.11,1 10,1H4M4,3H10V7H4V3M3,12V14H5V12H3M14,13C12.89,13 12,13.89 12,15V19C12,20.11 12.89,21 14,21H11V23H23V21H20C21.11,21 22,20.11 22,19V15C22,13.89 21.11,13 20,13H14M3,15V17H5V15H3M14,15H20V19H14V15M3,18V20H5V18H3M6,18V20H8V18H6M9,18V20H11V18H9Z"/>
|
||||||
|
|
||||||
|
</vector>
|
11
libaes/src/main/res/drawable/ic_dev_disconnected.xml
Normal file
11
libaes/src/main/res/drawable/ic_dev_disconnected.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M4,1C2.89,1 2,1.89 2,3V7C2,8.11 2.89,9 4,9H1V11H13V9H10C11.11,9 12,8.11 12,7V3C12,1.89 11.11,1 10,1H4M4,3H10V7H4V3M14,13C12.89,13 12,13.89 12,15V19C12,20.11 12.89,21 14,21H11V23H23V21H20C21.11,21 22,20.11 22,19V15C22,13.89 21.11,13 20,13H14M3.88,13.46L2.46,14.88L4.59,17L2.46,19.12L3.88,20.54L6,18.41L8.12,20.54L9.54,19.12L7.41,17L9.54,14.88L8.12,13.46L6,15.59L3.88,13.46M14,15H20V19H14V15Z"/>
|
||||||
|
|
||||||
|
</vector>
|
11
libaes/src/main/res/drawable/ic_email.xml
Normal file
11
libaes/src/main/res/drawable/ic_email.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M22,6C22,4.9 21.1,4 20,4H4C2.9,4 2,4.9 2,6V18C2,19.1 2.9,20 4,20H20C21.1,20 22,19.1 22,18V6M20,6L12,11L4,6H20M20,18H4V8L12,13L20,8V18Z"/>
|
||||||
|
|
||||||
|
</vector>
|
11
libaes/src/main/res/drawable/ic_email_alert.xml
Normal file
11
libaes/src/main/res/drawable/ic_email_alert.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M24,7H22V13H24V7M24,15H22V17H24V15M20,6C20,4.9 19.1,4 18,4H2C0.9,4 0,4.9 0,6V18C0,19.1 0.9,20 2,20H18C19.1,20 20,19.1 20,18V6M18,6L10,11L2,6H18M18,18H2V8L10,13L18,8V18Z"/>
|
||||||
|
|
||||||
|
</vector>
|
13
libaes/src/main/res/drawable/ic_launcher.xml
Normal file
13
libaes/src/main/res/drawable/ic_launcher.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:clickable="true">
|
||||||
|
<item
|
||||||
|
android:width="256dp"
|
||||||
|
android:height="256dp"
|
||||||
|
android:left="0dp"
|
||||||
|
android:top="0dp"
|
||||||
|
android:right="0dp"
|
||||||
|
android:bottom="0dp"
|
||||||
|
android:drawable="@drawable/winboll_logo">
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
170
libaes/src/main/res/drawable/ic_launcher_background.xml
Normal file
170
libaes/src/main/res/drawable/ic_launcher_background.xml
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorPrimary"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
</vector>
|
10
libaes/src/main/res/drawable/ic_launcher_foreground.xml
Normal file
10
libaes/src/main/res/drawable/ic_launcher_foreground.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFFFF"
|
||||||
|
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
|
||||||
|
</vector>
|
13
libaes/src/main/res/drawable/ic_winboll.xml
Normal file
13
libaes/src/main/res/drawable/ic_winboll.xml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:clickable="true">
|
||||||
|
<item
|
||||||
|
android:width="256dp"
|
||||||
|
android:height="256dp"
|
||||||
|
android:left="0dp"
|
||||||
|
android:top="0dp"
|
||||||
|
android:right="0dp"
|
||||||
|
android:bottom="0dp"
|
||||||
|
android:drawable="@drawable/winboll_logo">
|
||||||
|
</item>
|
||||||
|
</layer-list>
|
11
libaes/src/main/res/drawable/ic_winbollbeta.xml
Normal file
11
libaes/src/main/res/drawable/ic_winbollbeta.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:clickable="true">
|
||||||
|
<item android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<item
|
||||||
|
android:left="0dp"
|
||||||
|
android:top="0dp"
|
||||||
|
android:right="0dp"
|
||||||
|
android:bottom="0dp"
|
||||||
|
android:drawable="@drawable/winboll_logo"/>
|
||||||
|
</layer-list>
|
10
libaes/src/main/res/drawable/shape_gradient.xml
Normal file
10
libaes/src/main/res/drawable/shape_gradient.xml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<gradient
|
||||||
|
android:angle="180"
|
||||||
|
android:endColor="#FFFFFFFF"
|
||||||
|
android:startColor="#FFFFFFFF"
|
||||||
|
android:type="linear" />
|
||||||
|
|
||||||
|
<corners android:radius="10dp" />
|
||||||
|
</shape>
|
8
libaes/src/main/res/drawable/view_border.xml
Normal file
8
libaes/src/main/res/drawable/view_border.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:shape="rectangle">
|
||||||
|
<stroke
|
||||||
|
android:width="1dp"
|
||||||
|
android:color="#000000" /> <!-- 这里可调整边框宽度和颜色 -->
|
||||||
|
<solid android:color="@android:color/transparent" />
|
||||||
|
</shape>
|
27
libaes/src/main/res/drawable/winboll_help.xml
Normal file
27
libaes/src/main/res/drawable/winboll_help.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="512dp"
|
||||||
|
android:height="512dp"
|
||||||
|
android:viewportWidth="512"
|
||||||
|
android:viewportHeight="512">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF1E9B54"
|
||||||
|
android:strokeColor="#FFF8E733"
|
||||||
|
android:strokeWidth="20.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M254.63 35.45C374.95 35.45 473.38 133.89 473.38 254.2 473.38 374.51 374.95 472.95 254.63 472.95 134.32 472.95 35.88 374.51 35.88 254.2 35.88 133.89 134.32 35.45 254.63 35.45"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF000000"
|
||||||
|
android:strokeColor="#FF000000"
|
||||||
|
android:strokeWidth="1.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M257.28 361.25C266.56 361.25 274.14 368.84 274.14 378.11 274.14 387.39 266.56 394.98 257.28 394.98 248.01 394.98 240.42 387.39 240.42 378.11 240.42 368.84 248.01 361.25 257.28 361.25"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#FF000000"
|
||||||
|
android:strokeWidth="30.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M182.16 214.09C181.42 199.71 182.42 177.87 207.64 155.49 213.64 150.16 220.13 146.12 226.28 143.08 238.64 136.97 249.62 134.91 252.55 134.56 252.7 134.54 252.83 134.53 252.94 134.52 253.05 134.51 253.14 134.5 253.2 134.5 255.01 134.48 294.9 136.66 313.05 160.43 332.29 185.63 344.82 221.3 300.07 263.56 263.08 298.49 258.36 318 258.54 317.72"/>
|
||||||
|
</vector>
|
48
libaes/src/main/res/drawable/winboll_logo.xml
Normal file
48
libaes/src/main/res/drawable/winboll_logo.xml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="512dp"
|
||||||
|
android:height="512dp"
|
||||||
|
android:viewportWidth="512"
|
||||||
|
android:viewportHeight="512">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF1E9B54"
|
||||||
|
android:strokeColor="#FFF8E733"
|
||||||
|
android:strokeWidth="20.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M254.63 35.45C374.95 35.45 473.38 133.89 473.38 254.2 473.38 374.51 374.95 472.95 254.63 472.95 134.32 472.95 35.88 374.51 35.88 254.2 35.88 133.89 134.32 35.45 254.63 35.45"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFFFF"
|
||||||
|
android:strokeColor="#FFFFFFFF"
|
||||||
|
android:strokeWidth="1.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M257.28 361.25C266.56 361.25 274.14 368.84 274.14 378.11 274.14 387.39 266.56 394.98 257.28 394.98 248.01 394.98 240.42 387.39 240.42 378.11 240.42 368.84 248.01 361.25 257.28 361.25"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#FF000000"
|
||||||
|
android:strokeWidth="30.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M182.16 214.09C181.42 199.71 182.42 177.87 207.64 155.49 213.64 150.16 220.13 146.12 226.28 143.08 238.64 136.97 249.62 134.91 252.55 134.56 252.7 134.54 252.83 134.53 252.94 134.52 253.05 134.51 253.14 134.5 253.2 134.5 255.01 134.48 294.9 136.66 313.05 160.43 332.29 185.63 344.82 221.3 300.07 263.56 263.08 298.49 258.36 318 258.54 317.72"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#FFFFFFFF"
|
||||||
|
android:strokeWidth="30.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M103.77 307.45C103.02 293.07 104.03 271.24 129.24 248.85 135.25 243.52 141.74 239.48 147.89 236.44 160.24 230.34 171.23 228.28 174.15 227.92 174.31 227.9 174.44 227.89 174.55 227.88 174.66 227.87 174.75 227.86 174.81 227.86 176.62 227.85 216.5 230.02 234.65 253.79 253.9 278.99 266.43 314.66 221.67 356.93 184.69 391.85 179.97 411.36 180.15 411.08"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#FFFFFFFF"
|
||||||
|
android:strokeWidth="30.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M248.17 309.83C247.43 295.45 248.43 273.62 273.64 251.23 279.65 245.9 286.14 241.86 292.29 238.82 304.65 232.72 315.63 230.65 318.55 230.3 318.71 230.28 318.84 230.27 318.95 230.26 319.06 230.25 319.15 230.24 319.21 230.24 321.02 230.22 360.9 232.4 379.06 256.17 398.3 281.37 410.83 317.04 366.08 359.31 329.09 394.23 324.37 413.74 324.55 413.46"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:strokeColor="#FFFFFFFF"
|
||||||
|
android:strokeWidth="30.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M182.16 214.09C181.42 199.71 182.42 177.87 207.64 155.49 213.64 150.16 220.13 146.12 226.28 143.08 238.64 136.97 249.62 134.91 252.55 134.56 252.7 134.54 252.83 134.53 252.94 134.52 253.05 134.51 253.14 134.5 253.2 134.5 255.01 134.48 294.9 136.66 313.05 160.43 332.29 185.63 344.82 221.3 300.07 263.56 263.08 298.49 258.36 318 258.54 317.72"/>
|
||||||
|
</vector>
|
20
libaes/src/main/res/drawable/winboll_point.xml
Normal file
20
libaes/src/main/res/drawable/winboll_point.xml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="512dp"
|
||||||
|
android:height="512dp"
|
||||||
|
android:viewportWidth="512"
|
||||||
|
android:viewportHeight="512">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF1E9B54"
|
||||||
|
android:strokeColor="#FFF8E733"
|
||||||
|
android:strokeWidth="20.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M254.63 35.45C374.95 35.45 473.38 133.89 473.38 254.2 473.38 374.51 374.95 472.95 254.63 472.95 134.32 472.95 35.88 374.51 35.88 254.2 35.88 133.89 134.32 35.45 254.63 35.45"/>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFFFF"
|
||||||
|
android:strokeColor="#FFFFFFFF"
|
||||||
|
android:strokeWidth="1.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M257.28 361.25C266.56 361.25 274.14 368.84 274.14 378.11 274.14 387.39 266.56 394.98 257.28 394.98 248.01 394.98 240.42 387.39 240.42 378.11 240.42 368.84 248.01 361.25 257.28 361.25"/>
|
||||||
|
</vector>
|
@ -1,14 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/aboutroot_ll">
|
||||||
<FrameLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:id="@+id/activitylibraryFrameLayout1"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:gravity="center_vertical">
|
android:gravity="center_vertical">
|
||||||
@ -12,49 +12,49 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="AOHPCTCSeekBar"/>
|
android:text="AOHPCTCSeekBar"/>
|
||||||
|
|
||||||
<cc.winboll.studio.libaes.views.AOHPCTCSeekBar
|
<androidx.viewpager.widget.ViewPager
|
||||||
android:layout_width="300dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="0dp"
|
||||||
android:id="@+id/fragmentviewpageAOHPCTCSeekBar1"/>
|
android:layout_weight="1.0"
|
||||||
|
android:id="@+id/fragmentviewpageViewPager1"/>
|
||||||
|
|
||||||
<androidx.viewpager.widget.ViewPager
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="60dp"
|
||||||
android:layout_weight="1.0"
|
android:orientation="horizontal"
|
||||||
android:id="@+id/fragmentviewpageViewPager1"/>
|
android:gravity="center"
|
||||||
|
android:id="@+id/fragmentviewpageLinearLayout1">
|
||||||
|
|
||||||
<LinearLayout
|
<ImageView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="60dp"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="horizontal"
|
android:layout_margin="5dp"
|
||||||
android:gravity="center"
|
tools:ignore="ContentDescription"/>
|
||||||
android:id="@+id/fragmentviewpageLinearLayout1">
|
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="5dp"
|
android:layout_margin="5dp"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="5dp"
|
android:layout_margin="5dp"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="5dp"
|
android:layout_margin="5dp"
|
||||||
tools:ignore="ContentDescription"/>
|
tools:ignore="ContentDescription"/>
|
||||||
|
|
||||||
<ImageView
|
</LinearLayout>
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="5dp"
|
|
||||||
tools:ignore="ContentDescription"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
<cc.winboll.studio.libappbase.LogView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="300dp"
|
||||||
|
android:id="@+id/logview"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
64
libaes/src/main/res/layout/view_about_dev.xml
Normal file
64
libaes/src/main/res/layout/view_about_dev.xml
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/viewaboutdevLinearLayout1">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="180dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="DevelopUserName :"/>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:ems="10"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:id="@+id/viewaboutdevEditText1"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="180dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="DevelopUserPassword :"/>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:ems="10"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:id="@+id/viewaboutdevEditText2"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_horizontal">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.winboll.WinBollServiceStatusView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/viewaboutdevWinBollServiceStatusView1"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
22
libaes/src/main/res/layout/view_about_www.xml
Normal file
22
libaes/src/main/res/layout/view_about_www.xml
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/viewaboutwwwLinearLayout1">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_horizontal">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.winboll.WinBollServiceStatusView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/viewaboutwwwWinBollServiceStatusView1"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -11,6 +11,25 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="AOHPCTCSeekBar"/>
|
android:text="AOHPCTCSeekBar"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.views.AOHPCTCSeekBar
|
||||||
|
android:layout_width="300dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/fragmentviewpageAOHPCTCSeekBar1"
|
||||||
|
android:padding="10dp"/>
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.views.AOHPCTCSeekBar
|
||||||
|
android:layout_width="300dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/fragmentviewpageAOHPCTCSeekBar2"
|
||||||
|
android:padding="10dp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
android:title="TestAppCrash"/>
|
android:title="TestAppCrash"/>
|
||||||
</menu>
|
</menu>
|
||||||
</item>
|
</item>
|
||||||
|
<item
|
||||||
|
android:id="@+id/item_log"
|
||||||
|
android:title="Log"/>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/item_about"
|
android:id="@+id/item_about"
|
||||||
android:title="About"/>
|
android:title="About"/>
|
||||||
|
@ -32,6 +32,13 @@
|
|||||||
<attr name="attrASupportToolbarEndColor"/>
|
<attr name="attrASupportToolbarEndColor"/>
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
|
<declare-styleable name="AButton">
|
||||||
|
<attr name="attrAButtonTextColor" format="color" />
|
||||||
|
<attr name="attrAButtonPrimary" format="color" />
|
||||||
|
<attr name="attrAButtonPrimaryDark" format="color" />
|
||||||
|
<attr name="attrAButtonAccent" format="color" />
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
<attr name="ActionSheetList" format="reference"/>
|
<attr name="ActionSheetList" format="reference"/>
|
||||||
<!--<declare-styleable name="AToolbarStyle">
|
<!--<declare-styleable name="AToolbarStyle">
|
||||||
<attr name="attrAToolbarStartColor" format="color" />
|
<attr name="attrAToolbarStartColor" format="color" />
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<!-- 默认方案 -->
|
<!-- 默认方案 -->
|
||||||
<color name="colorPrimary">#FF03AB4E</color>
|
<color name="colorPrimary">#FF03AB4E</color>
|
||||||
<color name="colorPrimaryDark">#FF027C39</color>
|
<color name="colorPrimaryDark">#FF027C39</color>
|
||||||
<color name="colorAccent">#FF3DDC84</color>
|
<color name="colorAccent">#FF3DDC84</color>
|
||||||
<color name="colorToastFrame">#FFA9A9A9</color>
|
<color name="colorText">#FFFFFB8D</color>
|
||||||
|
<color name="colorToastFrame">#FFA9A9A9</color>
|
||||||
<color name="colorToastShadow">#FF000000</color>
|
<color name="colorToastShadow">#FF000000</color>
|
||||||
<color name="colorToastBackgroung">#FFFFFFFF</color>
|
<color name="colorToastBackgroung">#FFFFFFFF</color>
|
||||||
<color name="colorAToolbarStartColor">#FF7D3F12</color>
|
<color name="colorAToolbarStartColor">#FF7D3F12</color>
|
||||||
@ -14,16 +16,16 @@
|
|||||||
<color name="colorACardShadow">@color/colorPrimaryDark</color>
|
<color name="colorACardShadow">@color/colorPrimaryDark</color>
|
||||||
<color name="colorACardFrame">@color/colorPrimary</color>
|
<color name="colorACardFrame">@color/colorPrimary</color>
|
||||||
<color name="colorACardBackgroung">@color/colorAccent</color>
|
<color name="colorACardBackgroung">@color/colorAccent</color>
|
||||||
|
|
||||||
<color name="colorATickProgressBarBackgroung">@color/colorAccent</color>
|
<color name="colorATickProgressBarBackgroung">@color/colorAccent</color>
|
||||||
<color name="colorATickProgressBarProgress">@color/colorPrimary</color>
|
<color name="colorATickProgressBarProgress">@color/colorPrimary</color>
|
||||||
|
|
||||||
<color name="colorOHPCTSBackground">@color/colorAccent</color>
|
<color name="colorOHPCTSBackground">@color/colorAccent</color>
|
||||||
<color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color>
|
<color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color>
|
||||||
<color name="colorOHPCTSProgress">@color/colorPrimaryDark</color>
|
<color name="colorOHPCTSProgress">@color/colorPrimaryDark</color>
|
||||||
|
|
||||||
<!-- -->
|
<!-- -->
|
||||||
|
|
||||||
<!-- 调试方案
|
<!-- 调试方案
|
||||||
<color name="colorPrimary">#FF727272</color>
|
<color name="colorPrimary">#FF727272</color>
|
||||||
<color name="colorPrimaryDark">#FF444444</color>
|
<color name="colorPrimaryDark">#FF444444</color>
|
||||||
@ -39,5 +41,5 @@
|
|||||||
|
|
||||||
<color name="colorATickProgressBarBackgroung">#FF6DC4E2</color>
|
<color name="colorATickProgressBarBackgroung">#FF6DC4E2</color>
|
||||||
<color name="colorATickProgressBarProgress">#FF22B0E1</color>
|
<color name="colorATickProgressBarProgress">#FF22B0E1</color>
|
||||||
-->
|
-->
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">@color/colorPrimary</item>
|
<item name="colorPrimary">#FF03AB4E</item>
|
||||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
<item name="colorPrimaryDark">#FF027C39</item>
|
||||||
<item name="colorAccent">@color/colorAccent</item>
|
<item name="colorAccent">#FF3DDC84</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/AESAToolbar</item>
|
<item name="aToolbar">@style/AESAToolbar</item>
|
||||||
<item name="aSupportToolbar">@style/AESASupportToolbar</item>
|
<item name="aSupportToolbar">@style/AESASupportToolbar</item>
|
||||||
@ -24,158 +23,196 @@
|
|||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<style name="DefaultAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="DepthAESTheme" parent="AESTheme">
|
||||||
<item name="colorTextColor">#FF000000</item>
|
|
||||||
<item name="colorPrimary">#FF03AB4E</item>
|
|
||||||
<item name="colorPrimaryDark">#FF027C39</item>
|
|
||||||
<item name="colorAccent">#FF3DDC84</item>
|
|
||||||
<item name="android:textColor">#FF000000</item>
|
|
||||||
<item name="aToolbar">@style/DefaultAToolbar</item>
|
|
||||||
<item name="aSupportToolbar">@style/DefaultASupportToolbar</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="DefaultAToolbar">
|
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="DefaultASupportToolbar">
|
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
|
|
||||||
<style name="DepthAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">#FF2566FE</item>
|
<item name="colorPrimary">#FF2566FE</item>
|
||||||
<item name="colorPrimaryDark">#FF1359FF</item>
|
<item name="colorPrimaryDark">#FF1359FF</item>
|
||||||
<item name="colorAccent">#FF8BAEFF</item>
|
<item name="colorAccent">#FF8BAEFF</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/DepthAToolbar</item>
|
|
||||||
<item name="aSupportToolbar">@style/DepthASupportToolbar</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="DepthAToolbar">
|
<style name="SkyAESTheme" parent="AESTheme">
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="DepthASupportToolbar">
|
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="SkyAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">#FF1E98D4</item>
|
<item name="colorPrimary">#FF1E98D4</item>
|
||||||
<item name="colorPrimaryDark">#FF046A9C</item>
|
<item name="colorPrimaryDark">#FF046A9C</item>
|
||||||
<item name="colorAccent">#FF8CD9FF</item>
|
<item name="colorAccent">#FF8CD9FF</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/SkyAToolbar</item>
|
|
||||||
<item name="aSupportToolbar">@style/SkyASupportToolbar</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="SkyAToolbar">
|
<style name="GoldenAESTheme" parent="AESTheme">
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="SkyASupportToolbar">
|
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="GoldenAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">#FFFFE22A</item>
|
<item name="colorPrimary">#FFFFE22A</item>
|
||||||
<item name="colorPrimaryDark">#FFAE9600</item>
|
<item name="colorPrimaryDark">#FFAE9600</item>
|
||||||
<item name="colorAccent">#FFFFED78</item>
|
<item name="colorAccent">#FFFFED78</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/GoldenAToolbar</item>
|
|
||||||
<item name="aSupportToolbar">@style/GoldenASupportToolbar</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="GoldenAToolbar">
|
<style name="MemorAESTheme" parent="AESTheme">
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="GoldenASupportToolbar">
|
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="MemorAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">#FFCE1ED4</item>
|
<item name="colorPrimary">#FFCE1ED4</item>
|
||||||
<item name="colorPrimaryDark">#FFB500BC</item>
|
<item name="colorPrimaryDark">#FFB500BC</item>
|
||||||
<item name="colorAccent">#FFE653EB</item>
|
<item name="colorAccent">#FFE653EB</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/MemorAToolbar</item>
|
|
||||||
<item name="aSupportToolbar">@style/MemorASupportToolbar</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="MemorAToolbar">
|
<style name="TaoAESTheme" parent="AESTheme">
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="MemorASupportToolbar">
|
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<style name="TaoAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
|
||||||
<item name="colorTextColor">#FF000000</item>
|
<item name="colorTextColor">#FF000000</item>
|
||||||
<item name="colorPrimary">#FF9F9F9F</item>
|
<item name="colorPrimary">#FF9F9F9F</item>
|
||||||
<item name="colorPrimaryDark">#FF5E5E5E</item>
|
<item name="colorPrimaryDark">#FF5E5E5E</item>
|
||||||
<item name="colorAccent">#FFD9D9D9</item>
|
<item name="colorAccent">#FFD9D9D9</item>
|
||||||
<item name="android:textColor">#FF000000</item>
|
<item name="android:textColor">#FF000000</item>
|
||||||
<item name="aToolbar">@style/TaoAToolbar</item>
|
</style>
|
||||||
<item name="aSupportToolbar">@style/TaoASupportToolbar</item>
|
|
||||||
|
<!--<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
<item name="colorAccent">@color/colorAccent</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/AESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/AESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AESAToolbar">
|
||||||
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AESASupportToolbar">
|
||||||
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>-->
|
||||||
|
|
||||||
|
<!--<style name="DepthAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">#FF2566FE</item>
|
||||||
|
<item name="colorPrimaryDark">#FF1359FF</item>
|
||||||
|
<item name="colorAccent">#FF8BAEFF</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/DepthAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/DepthASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="DepthAToolbar">
|
||||||
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="DepthASupportToolbar">
|
||||||
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="SkyAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">#FF1E98D4</item>
|
||||||
|
<item name="colorPrimaryDark">#FF046A9C</item>
|
||||||
|
<item name="colorAccent">#FF8CD9FF</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/SkyAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/SkyASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="SkyAToolbar">
|
||||||
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="SkyASupportToolbar">
|
||||||
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="GoldenAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">#FFFFE22A</item>
|
||||||
|
<item name="colorPrimaryDark">#FFAE9600</item>
|
||||||
|
<item name="colorAccent">#FFFFED78</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/GoldenAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/GoldenASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="GoldenAToolbar">
|
||||||
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="GoldenASupportToolbar">
|
||||||
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MemorAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">#FFCE1ED4</item>
|
||||||
|
<item name="colorPrimaryDark">#FFB500BC</item>
|
||||||
|
<item name="colorAccent">#FFE653EB</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/MemorAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MemorASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MemorAToolbar">
|
||||||
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MemorASupportToolbar">
|
||||||
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="TaoAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<item name="colorTextColor">#FF000000</item>
|
||||||
|
<item name="colorPrimary">#FF9F9F9F</item>
|
||||||
|
<item name="colorPrimaryDark">#FF5E5E5E</item>
|
||||||
|
<item name="colorAccent">#FFD9D9D9</item>
|
||||||
|
<item name="android:textColor">#FF000000</item>
|
||||||
|
<item name="aToolbar">@style/TaoAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/TaoASupportToolbar</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TaoAToolbar">
|
<style name="TaoAToolbar">
|
||||||
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="TaoASupportToolbar">
|
<style name="TaoASupportToolbar">
|
||||||
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
|
||||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||||
</style>
|
</style>-->
|
||||||
|
|
||||||
<!--<style name="AToolbar">
|
<!--<style name="AToolbar">
|
||||||
<item name="attrAToolbarTitleTextColor">#FF2DDA27</item>
|
<item name="attrAToolbarTitleTextColor">#FF2DDA27</item>
|
||||||
<item name="attrAToolbarStartColor">#FF2DDA27</item>
|
<item name="attrAToolbarStartColor">#FF2DDA27</item>
|
||||||
<item name="attrAToolbarCenterColor">#FF2DDA27</item>
|
<item name="attrAToolbarCenterColor">#FF2DDA27</item>
|
||||||
<item name="attrAToolbarEndColor">#FF2DDA27</item>
|
<item name="attrAToolbarEndColor">#FF2DDA27</item>
|
||||||
</style>-->
|
</style>-->
|
||||||
|
|
||||||
<!--对话框的样式-->
|
<!--对话框的样式-->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user