Compare commits
9 Commits
winboll-v1
...
winboll
| Author | SHA1 | Date | |
|---|---|---|---|
| bbb0e22198 | |||
| ee75f95c79 | |||
| c40e301c90 | |||
| 5f2170a7a1 | |||
| 6308df8f36 | |||
| 5f24c2d351 | |||
| 882016454f | |||
| c6c290dcd2 | |||
| e64f3a3e97 |
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue May 12 10:47:54 CST 2026
|
#Tue May 12 13:11:28 HKT 2026
|
||||||
stageCount=3
|
stageCount=4
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.20
|
baseVersion=15.20
|
||||||
publishVersion=15.20.2
|
publishVersion=15.20.3
|
||||||
buildCount=14
|
buildCount=0
|
||||||
baseBetaVersion=15.20.3
|
baseBetaVersion=15.20.4
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue May 12 10:47:54 CST 2026
|
#Tue May 12 13:11:09 HKT 2026
|
||||||
stageCount=3
|
stageCount=4
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.20
|
baseVersion=15.20
|
||||||
publishVersion=15.20.2
|
publishVersion=15.20.3
|
||||||
buildCount=14
|
buildCount=0
|
||||||
baseBetaVersion=15.20.3
|
baseBetaVersion=15.20.4
|
||||||
|
|||||||
@@ -31,7 +31,6 @@ import cc.winboll.studio.libaes.utils.DevelopUtils;
|
|||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
import cc.winboll.studio.libaes.views.ADrawerMenuListView;
|
import cc.winboll.studio.libaes.views.ADrawerMenuListView;
|
||||||
import cc.winboll.studio.libaes.views.ADsBannerView;
|
import cc.winboll.studio.libaes.views.ADsBannerView;
|
||||||
import cc.winboll.studio.libaes.views.ASupportToolbar;
|
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import com.baoyz.widget.PullRefreshLayout;
|
import com.baoyz.widget.PullRefreshLayout;
|
||||||
@@ -175,9 +174,6 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
|||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
|
if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
|
||||||
if (mToolbar instanceof ASupportToolbar) {
|
|
||||||
((ASupportToolbar) mToolbar).refreshFromTheme();
|
|
||||||
}
|
|
||||||
recreate();
|
recreate();
|
||||||
} if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
} if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
||||||
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
||||||
|
|||||||
@@ -7,12 +7,15 @@ package cc.winboll.studio.libaes.views;
|
|||||||
*/
|
*/
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.graphics.drawable.GradientDrawable;
|
import android.graphics.drawable.GradientDrawable;
|
||||||
import android.graphics.drawable.LayerDrawable;
|
import android.graphics.drawable.LayerDrawable;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
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.libappbase.LogUtils;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import androidx.core.content.ContextCompat;
|
||||||
|
import android.graphics.PorterDuff;
|
||||||
|
|
||||||
public class ASupportToolbar extends Toolbar {
|
public class ASupportToolbar extends Toolbar {
|
||||||
|
|
||||||
@@ -22,120 +25,65 @@ public class ASupportToolbar extends Toolbar {
|
|||||||
int mStartColor;
|
int mStartColor;
|
||||||
int mCenterColor;
|
int mCenterColor;
|
||||||
int mEndColor;
|
int mEndColor;
|
||||||
GradientDrawable[] array = new GradientDrawable[3];
|
|
||||||
LayerDrawable ld;
|
LayerDrawable ld;
|
||||||
|
GradientDrawable[] array = new GradientDrawable[3];
|
||||||
|
//private GradientDrawable gradientDrawable;
|
||||||
|
|
||||||
public ASupportToolbar(Context context) {
|
public ASupportToolbar(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
LogUtils.d(TAG, "ASupportToolbar() constructor");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ASupportToolbar(Context context, AttributeSet attrs) {
|
public ASupportToolbar(Context context, AttributeSet attrs) {
|
||||||
super(context, attrs);
|
super(context, attrs);
|
||||||
LogUtils.d(TAG, "ASupportToolbar() attrs constructor");
|
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ASupportToolbar, R.attr.aSupportToolbar, 0);
|
||||||
initStyledAttributes(attrs, R.attr.aSupportToolbar);
|
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, Color.GREEN);
|
||||||
}
|
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, Color.BLUE);
|
||||||
|
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, Color.RED);
|
||||||
public ASupportToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
|
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, Color.YELLOW);
|
||||||
super(context, attrs, defStyleAttr);
|
// 返回一个绑定资源结束的信号给资源
|
||||||
LogUtils.d(TAG, "ASupportToolbar() attrs defStyleAttr constructor");
|
|
||||||
initStyledAttributes(attrs, defStyleAttr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void initStyledAttributes(AttributeSet attrs, int defStyleAttr) {
|
|
||||||
LogUtils.d(TAG, "initStyledAttributes() start");
|
|
||||||
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ASupportToolbar, defStyleAttr, 0);
|
|
||||||
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, 0xFF00FF00);
|
|
||||||
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, 0xFF03AB4E);
|
|
||||||
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, 0xFF03AB4E);
|
|
||||||
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, 0xFF3DDC84);
|
|
||||||
LogUtils.d(TAG, String.format("initStyledAttributes() colors: title=0x%x, start=0x%x, center=0x%x, end=0x%x", mTitleTextColor, mStartColor, mCenterColor, mEndColor));
|
|
||||||
a.recycle();
|
a.recycle();
|
||||||
setTitleTextColor(mTitleTextColor);
|
notifyColorChange();
|
||||||
LogUtils.d(TAG, "initStyledAttributes() end");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onAttachedToWindow() {
|
|
||||||
super.onAttachedToWindow();
|
|
||||||
LogUtils.d(TAG, "onAttachedToWindow() start");
|
|
||||||
refreshFromTheme();
|
|
||||||
LogUtils.d(TAG, "onAttachedToWindow() end");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void refreshFromTheme() {
|
|
||||||
LogUtils.d(TAG, "refreshFromTheme() start");
|
|
||||||
TypedArray a = getContext().obtainStyledAttributes(R.styleable.ASupportToolbar);
|
|
||||||
try {
|
|
||||||
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, 0xFF00FF00);
|
|
||||||
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, 0xFF03AB4E);
|
|
||||||
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, 0xFF03AB4E);
|
|
||||||
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, 0xFF3DDC84);
|
|
||||||
LogUtils.d(TAG, String.format("refreshFromTheme() colors: title=0x%x, start=0x%x, center=0x%x, end=0x%x", mTitleTextColor, mStartColor, mCenterColor, mEndColor));
|
|
||||||
} finally {
|
|
||||||
a.recycle();
|
|
||||||
}
|
|
||||||
postNotifyColorChange();
|
|
||||||
LogUtils.d(TAG, "refreshFromTheme() end");
|
|
||||||
}
|
|
||||||
|
|
||||||
void postNotifyColorChange() {
|
|
||||||
LogUtils.d(TAG, "postNotifyColorChange()");
|
|
||||||
removeCallbacks(mRefreshRunnable);
|
|
||||||
post(mRefreshRunnable);
|
|
||||||
}
|
|
||||||
|
|
||||||
Runnable mRefreshRunnable = new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
LogUtils.d(TAG, "mRefreshRunnable.run() start");
|
|
||||||
notifyColorChange();
|
|
||||||
LogUtils.d(TAG, "mRefreshRunnable.run() end");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void notifyColorChange() {
|
void notifyColorChange() {
|
||||||
LogUtils.d(TAG, "notifyColorChange() start");
|
// 工具栏描边
|
||||||
LogUtils.d(TAG, String.format("notifyColorChange() size: width=%d, height=%d", getWidth(), getHeight()));
|
|
||||||
|
|
||||||
int nWidth = getWidth();
|
|
||||||
int nHeight = getHeight();
|
|
||||||
if (nWidth == 0 || nHeight == 0) {
|
|
||||||
LogUtils.d(TAG, "notifyColorChange() skipped: width or height is 0");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nStroke = 5;
|
int nStroke = 5;
|
||||||
|
|
||||||
int colors0[] = { mEndColor , mCenterColor, mStartColor };
|
//分别为开始颜色,中间夜色,结束颜色
|
||||||
|
int colors0[] = { mEndColor , mCenterColor, mStartColor};
|
||||||
|
GradientDrawable gradientDrawable0;
|
||||||
array[2] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors0);
|
array[2] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors0);
|
||||||
array[2].setShape(GradientDrawable.RECTANGLE);
|
gradientDrawable0 = array[2];
|
||||||
array[2].setColors(colors0);
|
gradientDrawable0.setShape(GradientDrawable.RECTANGLE);
|
||||||
array[2].setGradientType(GradientDrawable.LINEAR_GRADIENT);
|
gradientDrawable0.setColors(colors0); //添加颜色组
|
||||||
array[2].setCornerRadius(20);
|
gradientDrawable0.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变
|
||||||
|
gradientDrawable0.setCornerRadius(20);
|
||||||
|
|
||||||
int colors1[] = { mCenterColor, mCenterColor, mCenterColor };
|
int colors1[] = { mCenterColor , mCenterColor, mCenterColor };
|
||||||
|
GradientDrawable gradientDrawable1;
|
||||||
array[1] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors1);
|
array[1] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors1);
|
||||||
array[1].setShape(GradientDrawable.RECTANGLE);
|
gradientDrawable1 = array[1];
|
||||||
array[1].setColors(colors1);
|
gradientDrawable1.setShape(GradientDrawable.RECTANGLE);
|
||||||
array[1].setGradientType(GradientDrawable.LINEAR_GRADIENT);
|
gradientDrawable1.setColors(colors1); //添加颜色组
|
||||||
array[1].setCornerRadius(20);
|
gradientDrawable1.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变
|
||||||
|
gradientDrawable1.setCornerRadius(20);
|
||||||
|
|
||||||
int colors2[] = { mEndColor, mCenterColor, mStartColor };
|
int colors2[] = { mEndColor, mCenterColor, mStartColor };
|
||||||
|
GradientDrawable gradientDrawable2;
|
||||||
array[0] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors2);
|
array[0] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors2);
|
||||||
array[0].setShape(GradientDrawable.RECTANGLE);
|
gradientDrawable2 = array[0];
|
||||||
array[0].setColors(colors2);
|
gradientDrawable2.setShape(GradientDrawable.RECTANGLE);
|
||||||
array[0].setGradientType(GradientDrawable.LINEAR_GRADIENT);
|
gradientDrawable2.setColors(colors2); //添加颜色组
|
||||||
array[0].setCornerRadius(20);
|
gradientDrawable2.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变
|
||||||
|
gradientDrawable2.setCornerRadius(20);
|
||||||
|
|
||||||
ld = new LayerDrawable(array);
|
ld = new LayerDrawable(array); //参数为上面的Drawable数组
|
||||||
ld.setLayerInset(2, nStroke * 2, nStroke * 2, nWidth + nStroke * 2, nHeight + nStroke * 2);
|
ld.setLayerInset(2, nStroke * 2, nStroke * 2, getWidth() + nStroke * 2, getHeight() + nStroke * 2);
|
||||||
ld.setLayerInset(1, nStroke, nStroke, nWidth + nStroke, nHeight + nStroke);
|
ld.setLayerInset(1, nStroke, nStroke, getWidth() + nStroke, getHeight() + nStroke);
|
||||||
ld.setLayerInset(0, 0, 0, nWidth, nHeight);
|
ld.setLayerInset(0, 0, 0, getWidth(), getHeight());
|
||||||
|
|
||||||
setBackgroundDrawable(ld);
|
setBackgroundDrawable(ld);
|
||||||
setTitleTextColor(mTitleTextColor);
|
setTitleTextColor(mTitleTextColor);
|
||||||
setSubtitleTextColor(mTitleTextColor);
|
setSubtitleTextColor(mTitleTextColor);
|
||||||
LogUtils.d(TAG, "notifyColorChange() end");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,10 @@ android {
|
|||||||
minSdkVersion 26
|
minSdkVersion 26
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
}
|
}
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_7
|
||||||
|
targetCompatibility JavaVersion.VERSION_1_7
|
||||||
|
}
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
@@ -31,7 +35,7 @@ dependencies {
|
|||||||
api 'com.jcraft:jsch:0.1.54'
|
api 'com.jcraft:jsch:0.1.54'
|
||||||
|
|
||||||
// WinBoLL库 nexus.winboll.cc 地址
|
// WinBoLL库 nexus.winboll.cc 地址
|
||||||
api 'cc.winboll.studio:libaes:15.20.2'
|
api 'cc.winboll.studio:libaes:15.20.3'
|
||||||
api 'cc.winboll.studio:libappbase:15.20.9'
|
api 'cc.winboll.studio:libappbase:15.20.9'
|
||||||
|
|
||||||
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
|
||||||
#Tue May 12 12:16:45 HKT 2026
|
#Wed May 13 11:15:04 CST 2026
|
||||||
stageCount=1
|
stageCount=2
|
||||||
libraryProject=libwinboll
|
libraryProject=libwinboll
|
||||||
baseVersion=15.20
|
baseVersion=15.20
|
||||||
publishVersion=15.20.0
|
publishVersion=15.20.1
|
||||||
buildCount=0
|
buildCount=1
|
||||||
baseBetaVersion=15.20.1
|
baseBetaVersion=15.20.2
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api project(':libwinboll')
|
api project(':libwinboll')
|
||||||
|
|
||||||
api 'com.google.code.gson:gson:2.10.1'
|
api 'com.google.code.gson:gson:2.10.1'
|
||||||
|
|
||||||
// 下拉控件
|
// 下拉控件
|
||||||
@@ -68,8 +67,6 @@ dependencies {
|
|||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
// 网络连接类库
|
// 网络连接类库
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
// OkHttp网络请求
|
|
||||||
implementation 'com.squareup.okhttp3:okhttp:3.14.9'
|
|
||||||
// FastJSON解析
|
// FastJSON解析
|
||||||
implementation 'com.alibaba:fastjson:1.2.76'
|
implementation 'com.alibaba:fastjson:1.2.76'
|
||||||
|
|
||||||
@@ -87,7 +84,6 @@ dependencies {
|
|||||||
//注意:以下5个库必须要引入
|
//注意:以下5个库必须要引入
|
||||||
//implementation 'androidx.appcompat:appcompat:1.4.1'
|
//implementation 'androidx.appcompat:appcompat:1.4.1'
|
||||||
api 'androidx.recyclerview:recyclerview:1.0.0'
|
api 'androidx.recyclerview:recyclerview:1.0.0'
|
||||||
api 'com.google.code.gson:gson:2.8.5'
|
|
||||||
api 'com.github.bumptech.glide:glide:4.9.0'
|
api 'com.github.bumptech.glide:glide:4.9.0'
|
||||||
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
|
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
|
||||||
|
|
||||||
@@ -108,13 +104,5 @@ dependencies {
|
|||||||
implementation 'com.termux:terminal-view:0.118.0'
|
implementation 'com.termux:terminal-view:0.118.0'
|
||||||
implementation 'com.termux:termux-shared:0.118.0'
|
implementation 'com.termux:termux-shared:0.118.0'
|
||||||
|
|
||||||
// WinBoLL库 nexus.winboll.cc 地址
|
|
||||||
api 'cc.winboll.studio:libaes:15.20.2'
|
|
||||||
api 'cc.winboll.studio:libappbase:15.20.9'
|
|
||||||
|
|
||||||
// WinBoLL备用库 jitpack.io 地址
|
|
||||||
//api 'com.github.ZhanGSKen:AES:aes-v15.15.7'
|
|
||||||
//api 'com.github.ZhanGSKen:APPBase:appbase-v15.15.4'
|
|
||||||
|
|
||||||
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
|
||||||
#Tue May 12 12:16:45 HKT 2026
|
#Wed May 13 11:15:04 CST 2026
|
||||||
stageCount=1
|
stageCount=2
|
||||||
libraryProject=libwinboll
|
libraryProject=libwinboll
|
||||||
baseVersion=15.20
|
baseVersion=15.20
|
||||||
publishVersion=15.20.0
|
publishVersion=15.20.1
|
||||||
buildCount=0
|
buildCount=1
|
||||||
baseBetaVersion=15.20.1
|
baseBetaVersion=15.20.2
|
||||||
|
|||||||
@@ -15,14 +15,13 @@
|
|||||||
<uses-permission android:name="android.permission.REORDER_TASKS"/>
|
<uses-permission android:name="android.permission.REORDER_TASKS"/>
|
||||||
|
|
||||||
<!-- 计算应用存储空间 -->
|
<!-- 计算应用存储空间 -->
|
||||||
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
|
<uses-permission
|
||||||
|
android:name="android.permission.GET_PACKAGE_SIZE"/>
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||||
tools:ignore="QueryAllPackagesPermission"/>
|
tools:ignore="QueryAllPackagesPermission"/>
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
|
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:icon="@drawable/ic_launcher"
|
android:icon="@drawable/ic_launcher"
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.view.View;
|
|||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||||
import cc.winboll.studio.libaes.models.DrawerMenuBean;
|
import cc.winboll.studio.libaes.models.DrawerMenuBean;
|
||||||
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.winboll.R;
|
import cc.winboll.studio.winboll.R;
|
||||||
@@ -36,19 +37,17 @@ public class MainActivity extends DrawerFragmentActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
setTheme(cc.winboll.studio.winboll.theme.WinBoLLThemeUtil.getThemeTypeID(this));
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
// ------------------- 新增:初始化MainActivity的Handler(关键) -------------------
|
|
||||||
initMainHandler();
|
initMainHandler();
|
||||||
|
|
||||||
if (mBrowserFragment == null) {
|
if (mBrowserFragment == null) {
|
||||||
LogUtils.d(TAG, "The code in this line is not fix yet.");
|
String externalUrl = extractExternalUrl(getIntent());
|
||||||
// String externalUrl = extractExternalUrl(getIntent());
|
if (externalUrl != null) {
|
||||||
// if (externalUrl != null) {
|
mBrowserFragment = BrowserFragment.newInstance(externalUrl);
|
||||||
// mBrowserFragment = BrowserFragment.newInstance(externalUrl);
|
} else {
|
||||||
// } else {
|
mBrowserFragment = BrowserFragment.newInstance();
|
||||||
// mBrowserFragment = new BrowserFragment();
|
}
|
||||||
// }
|
addFragment(mBrowserFragment);
|
||||||
// addFragment(mBrowserFragment);
|
|
||||||
}
|
}
|
||||||
showFragment(mBrowserFragment);
|
showFragment(mBrowserFragment);
|
||||||
}
|
}
|
||||||
@@ -171,36 +170,35 @@ public class MainActivity extends DrawerFragmentActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int nItemId = item.getItemId();
|
if (AESThemeUtil.onWinBoLLThemeItemSelected(this, item)) {
|
||||||
if (nItemId == R.id.item_home) {
|
recreate();
|
||||||
// 发送MSG_HOMEPAGE消息给BrowserFragment
|
|
||||||
if (mBrowserFragment != null && mBrowserFragment.getBrowserHandler() != null) {
|
|
||||||
Message msg = Message.obtain();
|
|
||||||
msg.what = BrowserFragment.MSG_HOMEPAGE;
|
|
||||||
mBrowserFragment.getBrowserHandler().sendMessage(msg);
|
|
||||||
}
|
|
||||||
} else if (nItemId == R.id.item_settings) {
|
|
||||||
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), SettingsActivity.class);
|
|
||||||
} else if (nItemId == R.id.item_about) {
|
|
||||||
Intent intent = new Intent(getApplicationContext(), AboutActivity.class);
|
|
||||||
|
|
||||||
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
|
||||||
} else if (nItemId == R.id.item_mytermux) {
|
|
||||||
Intent intent = new Intent(getApplicationContext(), MyTermuxActivity.class);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
startActivity(intent);
|
|
||||||
} else if (nItemId == R.id.item_termux_env_test) {
|
|
||||||
Intent intent = new Intent(getApplicationContext(), TermuxEnvTestActivity.class);
|
|
||||||
|
|
||||||
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
|
||||||
} else if (nItemId == R.id.item_library_activity) {
|
|
||||||
Intent intent = new Intent(getApplicationContext(), cc.winboll.studio.libwinboll.WinBoLLLibraryActivity.class);
|
|
||||||
|
|
||||||
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
|
||||||
} else {
|
} else {
|
||||||
return super.onOptionsItemSelected(item);
|
int nItemId = item.getItemId();
|
||||||
}
|
if (nItemId == R.id.item_home) {
|
||||||
|
if (mBrowserFragment != null && mBrowserFragment.getBrowserHandler() != null) {
|
||||||
|
Message msg = Message.obtain();
|
||||||
|
msg.what = BrowserFragment.MSG_HOMEPAGE;
|
||||||
|
mBrowserFragment.getBrowserHandler().sendMessage(msg);
|
||||||
|
}
|
||||||
|
} else if (nItemId == R.id.item_settings) {
|
||||||
|
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), SettingsActivity.class);
|
||||||
|
} else if (nItemId == R.id.item_about) {
|
||||||
|
Intent intent = new Intent(getApplicationContext(), AboutActivity.class);
|
||||||
|
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
||||||
|
} else if (nItemId == R.id.item_mytermux) {
|
||||||
|
Intent intent = new Intent(getApplicationContext(), MyTermuxActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
startActivity(intent);
|
||||||
|
} else if (nItemId == R.id.item_termux_env_test) {
|
||||||
|
Intent intent = new Intent(getApplicationContext(), TermuxEnvTestActivity.class);
|
||||||
|
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
||||||
|
} else if (nItemId == R.id.item_library_activity) {
|
||||||
|
Intent intent = new Intent(getApplicationContext(), cc.winboll.studio.libwinboll.WinBoLLLibraryActivity.class);
|
||||||
|
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
|
||||||
|
} else {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ import android.os.Bundle;
|
|||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||||
import cc.winboll.studio.libaes.models.AESThemeBean;
|
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
|
import cc.winboll.studio.winboll.theme.WinBoLLThemeUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
||||||
@@ -29,16 +29,11 @@ public abstract class BaseWinBoLLActivity extends AppCompatActivity implements I
|
|||||||
}
|
}
|
||||||
|
|
||||||
AESThemeBean.ThemeType getThemeType() {
|
AESThemeBean.ThemeType getThemeType() {
|
||||||
/*SharedPreferences sharedPreferences = getSharedPreferences(
|
return WinBoLLThemeUtil.getThemeStyleType(WinBoLLThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||||
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() {
|
void setThemeStyle() {
|
||||||
//setTheme(AESThemeBean.getThemeStyle(getThemeType()));
|
setTheme(WinBoLLThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||||
setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,31 +1,46 @@
|
|||||||
package cc.winboll.studio.winboll.applications;
|
package cc.winboll.studio.winboll.applications;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.winboll.R;
|
import cc.winboll.studio.winboll.R;
|
||||||
|
import cc.winboll.studio.winboll.models.TermuxButtonManager;
|
||||||
|
import cc.winboll.studio.winboll.models.TermuxButtonModel;
|
||||||
import cc.winboll.studio.winboll.termux.TermuxCommandExecutor;
|
import cc.winboll.studio.winboll.termux.TermuxCommandExecutor;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class MyTermuxActivity extends AppCompatActivity {
|
public class MyTermuxActivity extends AppCompatActivity {
|
||||||
|
|
||||||
public static final String TAG = "MyTermuxActivity";
|
public static final String TAG = "MyTermuxActivity";
|
||||||
|
|
||||||
private Toolbar mToolbar;
|
private Toolbar mToolbar;
|
||||||
private Button mTermuxButton;
|
private ListView mListView;
|
||||||
private Button mTermuxWorkSpacesButton;
|
private Button mBtnAdd;
|
||||||
|
private ButtonAdapter mAdapter;
|
||||||
|
private ArrayList<TermuxButtonModel> mButtonList;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_my_termux);
|
setContentView(R.layout.activity_my_termux);
|
||||||
|
|
||||||
// 初始化工具栏
|
|
||||||
initToolbar();
|
initToolbar();
|
||||||
// 初始化按钮
|
initListView();
|
||||||
initView();
|
initAddButton();
|
||||||
|
refreshList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initToolbar() {
|
private void initToolbar() {
|
||||||
@@ -34,44 +49,189 @@ public class MyTermuxActivity extends AppCompatActivity {
|
|||||||
setSupportActionBar(mToolbar);
|
setSupportActionBar(mToolbar);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
LogUtils.d(TAG, "点击返回按钮");
|
finish();
|
||||||
finish();
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
LogUtils.d(TAG, "工具栏初始化完成");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initView() {
|
private void initListView() {
|
||||||
mTermuxButton = findViewById(R.id.btn_termux);
|
mListView = findViewById(R.id.list_termux_buttons);
|
||||||
if (mTermuxButton != null) {
|
mButtonList = new ArrayList<TermuxButtonModel>();
|
||||||
mTermuxButton.setOnClickListener(new View.OnClickListener() {
|
mAdapter = new ButtonAdapter();
|
||||||
@Override
|
mListView.setAdapter(mAdapter);
|
||||||
public void onClick(View v) {
|
|
||||||
LogUtils.d(TAG, "点击 Termux 按钮");
|
|
||||||
TermuxCommandExecutor.openTermuxBash(MyTermuxActivity.this, "cd ~");
|
|
||||||
//TermuxCommandExecutor.openTermuxBash(MyTermuxActivity.this, "cd ~/TermuxWorkSpaces", "./TermuxWorkSpaces");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
LogUtils.d(TAG, "Termux 按钮初始化完成");
|
|
||||||
}
|
|
||||||
|
|
||||||
mTermuxWorkSpacesButton = findViewById(R.id.btn_termuxworkspaces);
|
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||||
if (mTermuxWorkSpacesButton != null) {
|
@Override
|
||||||
mTermuxWorkSpacesButton.setOnClickListener(new View.OnClickListener() {
|
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
@Override
|
TermuxButtonModel model = mButtonList.get(position);
|
||||||
public void onClick(View v) {
|
TermuxCommandExecutor.openTermuxBash(MyTermuxActivity.this,
|
||||||
LogUtils.d(TAG, "点击 TermuxWorkSpaces 按钮");
|
model.getExeCommand(), model.getWorkDir());
|
||||||
TermuxCommandExecutor.openTermuxBash(MyTermuxActivity.this, "cd ~/TermuxWorkSpaces", "./TermuxWorkSpaces");
|
}
|
||||||
}
|
});
|
||||||
});
|
|
||||||
LogUtils.d(TAG, "TermuxWorkSpaces 按钮初始化完成");
|
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
|
||||||
}
|
@Override
|
||||||
|
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
|
||||||
|
showContextMenu(position);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isTermuxAvailable() {
|
private void initAddButton() {
|
||||||
return TermuxCommandExecutor.isTermuxInstalled(this);
|
mBtnAdd = findViewById(R.id.btn_add_termux_button);
|
||||||
|
mBtnAdd.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
showButtonDialog(-1, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshList() {
|
||||||
|
mButtonList.clear();
|
||||||
|
ArrayList<TermuxButtonModel> loaded = TermuxButtonManager.loadButtons(this);
|
||||||
|
if (loaded != null) {
|
||||||
|
mButtonList.addAll(loaded);
|
||||||
|
}
|
||||||
|
mAdapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showContextMenu(final int position) {
|
||||||
|
final TermuxButtonModel model = mButtonList.get(position);
|
||||||
|
String[] items = new String[]{
|
||||||
|
getString(R.string.menu_execute),
|
||||||
|
getString(R.string.menu_edit),
|
||||||
|
getString(R.string.menu_delete),
|
||||||
|
getString(R.string.menu_cancel)
|
||||||
|
};
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(model.getButtonName())
|
||||||
|
.setItems(items, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
if (which == 0) {
|
||||||
|
TermuxCommandExecutor.openTermuxBash(MyTermuxActivity.this,
|
||||||
|
model.getExeCommand(), model.getWorkDir());
|
||||||
|
} else if (which == 1) {
|
||||||
|
showButtonDialog(position, model);
|
||||||
|
} else if (which == 2) {
|
||||||
|
showDeleteConfirmDialog(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showDeleteConfirmDialog(final int position) {
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(getString(R.string.dialog_delete_title))
|
||||||
|
.setMessage(getString(R.string.dialog_delete_message) + mButtonList.get(position).getButtonName())
|
||||||
|
.setPositiveButton(getString(R.string.dialog_confirm), new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
TermuxButtonManager.deleteButton(MyTermuxActivity.this, mButtonList, position);
|
||||||
|
refreshList();
|
||||||
|
Toast.makeText(MyTermuxActivity.this, R.string.toast_deleted, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(getString(R.string.dialog_cancel), null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showButtonDialog(final int index, final TermuxButtonModel model) {
|
||||||
|
final boolean isEdit = (model != null);
|
||||||
|
|
||||||
|
LinearLayout layout = new LinearLayout(this);
|
||||||
|
layout.setOrientation(LinearLayout.VERTICAL);
|
||||||
|
layout.setPadding(40, 20, 40, 20);
|
||||||
|
|
||||||
|
final EditText etName = new EditText(this);
|
||||||
|
etName.setHint(R.string.hint_button_name);
|
||||||
|
if (model != null) {
|
||||||
|
etName.setText(model.getButtonName());
|
||||||
|
}
|
||||||
|
layout.addView(etName);
|
||||||
|
|
||||||
|
final EditText etCommand = new EditText(this);
|
||||||
|
etCommand.setHint(R.string.hint_exe_command);
|
||||||
|
if (model != null) {
|
||||||
|
etCommand.setText(model.getExeCommand());
|
||||||
|
}
|
||||||
|
layout.addView(etCommand);
|
||||||
|
|
||||||
|
final EditText etWorkDir = new EditText(this);
|
||||||
|
etWorkDir.setHint(R.string.hint_work_dir);
|
||||||
|
if (model != null) {
|
||||||
|
etWorkDir.setText(model.getWorkDir());
|
||||||
|
}
|
||||||
|
layout.addView(etWorkDir);
|
||||||
|
|
||||||
|
int titleResId = isEdit ? R.string.dialog_edit_title : R.string.dialog_add_title;
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(titleResId)
|
||||||
|
.setView(layout)
|
||||||
|
.setPositiveButton(getString(R.string.dialog_save), new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
String name = etName.getText().toString().trim();
|
||||||
|
String command = etCommand.getText().toString().trim();
|
||||||
|
String workDir = etWorkDir.getText().toString().trim();
|
||||||
|
if (name.isEmpty() || command.isEmpty()) {
|
||||||
|
Toast.makeText(MyTermuxActivity.this, R.string.toast_fields_required, Toast.LENGTH_SHORT).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
TermuxButtonModel newModel = new TermuxButtonModel();
|
||||||
|
newModel.setButtonName(name);
|
||||||
|
newModel.setExeCommand(command);
|
||||||
|
newModel.setWorkDir(workDir);
|
||||||
|
if (isEdit) {
|
||||||
|
TermuxButtonManager.updateButton(MyTermuxActivity.this, mButtonList, index, newModel);
|
||||||
|
} else {
|
||||||
|
TermuxButtonManager.addButton(MyTermuxActivity.this, mButtonList, newModel);
|
||||||
|
}
|
||||||
|
refreshList();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(getString(R.string.dialog_cancel), null)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ButtonAdapter extends BaseAdapter {
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return mButtonList.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getItem(int position) {
|
||||||
|
return mButtonList.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
|
TextView tv;
|
||||||
|
if (convertView == null) {
|
||||||
|
tv = new TextView(MyTermuxActivity.this);
|
||||||
|
tv.setPadding(30, 20, 30, 20);
|
||||||
|
tv.setTextSize(16);
|
||||||
|
tv.setMinHeight(80);
|
||||||
|
} else {
|
||||||
|
tv = (TextView) convertView;
|
||||||
|
}
|
||||||
|
|
||||||
|
TermuxButtonModel model = mButtonList.get(position);
|
||||||
|
tv.setText(model.getButtonName() + "\n" + model.getExeCommand());
|
||||||
|
tv.setTextColor(getResources().getColor(android.R.color.white));
|
||||||
|
return tv;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package cc.winboll.studio.winboll.models;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import cc.winboll.studio.libappbase.BaseBean;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class TermuxButtonManager {
|
||||||
|
|
||||||
|
public static ArrayList<TermuxButtonModel> loadButtons(Context context) {
|
||||||
|
ArrayList<TermuxButtonModel> list = new ArrayList<TermuxButtonModel>();
|
||||||
|
BaseBean.loadBeanList(context, list, TermuxButtonModel.class);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean saveButtons(Context context, ArrayList<TermuxButtonModel> list) {
|
||||||
|
return BaseBean.saveBeanList(context, list, TermuxButtonModel.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addButton(Context context, ArrayList<TermuxButtonModel> list, TermuxButtonModel button) {
|
||||||
|
list.add(button);
|
||||||
|
saveButtons(context, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void updateButton(Context context, ArrayList<TermuxButtonModel> list, int index, TermuxButtonModel button) {
|
||||||
|
if (index >= 0 && index < list.size()) {
|
||||||
|
list.set(index, button);
|
||||||
|
saveButtons(context, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void deleteButton(Context context, ArrayList<TermuxButtonModel> list, int index) {
|
||||||
|
if (index >= 0 && index < list.size()) {
|
||||||
|
list.remove(index);
|
||||||
|
saveButtons(context, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package cc.winboll.studio.winboll.theme;
|
||||||
|
|
||||||
|
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||||
|
import cc.winboll.studio.winboll.R;
|
||||||
|
|
||||||
|
public class WinBoLLThemeBean {
|
||||||
|
|
||||||
|
public static final String TAG = "WinBoLLThemeBean";
|
||||||
|
|
||||||
|
public static int getDefaultThemeStyleID() {
|
||||||
|
return R.style.MyAppTheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getThemeStyleID(AESThemeBean.ThemeType themeType) {
|
||||||
|
int themeStyleID = getDefaultThemeStyleID();
|
||||||
|
if (AESThemeBean.ThemeType.DEPTH == themeType) {
|
||||||
|
themeStyleID = R.style.MyDepthAppTheme;
|
||||||
|
} else if (AESThemeBean.ThemeType.SKY == themeType) {
|
||||||
|
themeStyleID = R.style.MySkyAppTheme;
|
||||||
|
} else if (AESThemeBean.ThemeType.GOLDEN == themeType) {
|
||||||
|
themeStyleID = R.style.MyGoldenAppTheme;
|
||||||
|
} else if (AESThemeBean.ThemeType.BEARING == themeType) {
|
||||||
|
themeStyleID = R.style.MyBearingAppTheme;
|
||||||
|
} else if (AESThemeBean.ThemeType.MEMOR == themeType) {
|
||||||
|
themeStyleID = R.style.MyMemorAppTheme;
|
||||||
|
} else if (AESThemeBean.ThemeType.TAO == themeType) {
|
||||||
|
themeStyleID = R.style.MyTaoAppTheme;
|
||||||
|
}
|
||||||
|
return themeStyleID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AESThemeBean.ThemeType getThemeStyleType(int nThemeStyleID) {
|
||||||
|
AESThemeBean.ThemeType themeStyle = AESThemeBean.ThemeType.AES;
|
||||||
|
if (R.style.MyDepthAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.DEPTH;
|
||||||
|
} else if (R.style.MySkyAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.SKY;
|
||||||
|
} else if (R.style.MyGoldenAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.GOLDEN;
|
||||||
|
} else if (R.style.MyBearingAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.BEARING;
|
||||||
|
} else if (R.style.MyMemorAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.MEMOR;
|
||||||
|
} else if (R.style.MyTaoAppTheme == nThemeStyleID) {
|
||||||
|
themeStyle = AESThemeBean.ThemeType.TAO;
|
||||||
|
}
|
||||||
|
return themeStyle;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package cc.winboll.studio.winboll.theme;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||||
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
|
|
||||||
|
public class WinBoLLThemeUtil {
|
||||||
|
|
||||||
|
public static final String TAG = "WinBoLLThemeUtil";
|
||||||
|
|
||||||
|
public static int getThemeTypeID(Context context) {
|
||||||
|
AESThemeBean bean = AESThemeBean.loadBean(context, AESThemeBean.class);
|
||||||
|
int themeTypeID;
|
||||||
|
if (bean == null) {
|
||||||
|
themeTypeID = WinBoLLThemeBean.getDefaultThemeStyleID();
|
||||||
|
} else {
|
||||||
|
int aesStyleID = bean.getCurrentThemeTypeID();
|
||||||
|
AESThemeBean.ThemeType themeType = WinBoLLThemeBean.getThemeStyleType(aesStyleID);
|
||||||
|
themeTypeID = WinBoLLThemeBean.getThemeStyleID(themeType);
|
||||||
|
}
|
||||||
|
return themeTypeID;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveThemeStyleID(Context context, int nThemeTypeID) {
|
||||||
|
AESThemeBean bean = new AESThemeBean(nThemeTypeID);
|
||||||
|
AESThemeBean.saveBean(context, bean);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AESThemeBean.ThemeType getThemeStyleType(int nThemeStyleID) {
|
||||||
|
return WinBoLLThemeBean.getThemeStyleType(nThemeStyleID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getThemeStyleID(AESThemeBean.ThemeType themeType) {
|
||||||
|
return WinBoLLThemeBean.getThemeStyleID(themeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,8 +4,7 @@
|
|||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
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="wrap_content"
|
android:layout_height="match_parent">
|
||||||
android:gravity="top">
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.Toolbar
|
<androidx.appcompat.widget.Toolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
@@ -17,74 +16,20 @@
|
|||||||
app:titleTextColor="@android:color/white"
|
app:titleTextColor="@android:color/white"
|
||||||
app:subtitleTextColor="@android:color/white"/>
|
app:subtitleTextColor="@android:color/white"/>
|
||||||
|
|
||||||
<ScrollView
|
<ListView
|
||||||
|
android:id="@+id/list_termux_buttons"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1.0">
|
android:layout_weight="1.0"
|
||||||
|
android:divider="@android:color/darker_gray"
|
||||||
|
android:dividerHeight="1dp"/>
|
||||||
|
|
||||||
<LinearLayout
|
<Button
|
||||||
android:orientation="vertical"
|
android:id="@+id/btn_add_termux_button"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/add_termux_button"
|
||||||
<LinearLayout
|
android:textSize="16sp"
|
||||||
android:orientation="horizontal"
|
android:padding="12dp"/>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<HorizontalScrollView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1.0">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<cc.winboll.studio.winboll.views.TermuxButton
|
|
||||||
android:id="@+id/btn_termux"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Termux"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:backgroundTint="@android:color/holo_blue_dark"
|
|
||||||
app:exeCommand="cd ~"
|
|
||||||
app:workDir="~"
|
|
||||||
app:isCommitted="true"
|
|
||||||
app:commitTitle="打开 Termux"
|
|
||||||
app:commitInfo="打开 Termux 应用"/>
|
|
||||||
|
|
||||||
<cc.winboll.studio.winboll.views.TermuxButton
|
|
||||||
android:id="@+id/btn_termuxworkspaces"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="TermuxWorkSpaces"
|
|
||||||
android:textSize="18sp"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:backgroundTint="@android:color/holo_blue_dark"
|
|
||||||
app:exeCommand="cd ~/TermuxWorkSpaces"
|
|
||||||
app:workDir="~"
|
|
||||||
app:isCommitted="false"
|
|
||||||
app:commitTitle="打开 TermuxWorkSpaces"
|
|
||||||
app:commitInfo="打开 Termux 应用,进入 TermuxWorkSpaces 目录。"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="+"
|
|
||||||
android:id="@+id/btn_addtermuxbutton"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</ScrollView>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -13,4 +13,21 @@
|
|||||||
<string name="toolbar_icon_description">WinBoLL APP</string>
|
<string name="toolbar_icon_description">WinBoLL APP</string>
|
||||||
<string name="my_termux_activity">MyTermuxActivity</string>
|
<string name="my_termux_activity">MyTermuxActivity</string>
|
||||||
<string name="pattern_lock_title">图案密码设置</string>
|
<string name="pattern_lock_title">图案密码设置</string>
|
||||||
|
<string name="add_termux_button">+ 添加Termux按钮</string>
|
||||||
|
<string name="menu_execute">执行</string>
|
||||||
|
<string name="menu_edit">编辑</string>
|
||||||
|
<string name="menu_delete">删除</string>
|
||||||
|
<string name="menu_cancel">取消</string>
|
||||||
|
<string name="dialog_delete_title">确认删除</string>
|
||||||
|
<string name="dialog_delete_message">确定要删除</string>
|
||||||
|
<string name="dialog_add_title">添加Termux按钮</string>
|
||||||
|
<string name="dialog_edit_title">编辑Termux按钮</string>
|
||||||
|
<string name="dialog_save">保存</string>
|
||||||
|
<string name="dialog_confirm">确定</string>
|
||||||
|
<string name="dialog_cancel">取消</string>
|
||||||
|
<string name="hint_button_name">按钮名称</string>
|
||||||
|
<string name="hint_exe_command">执行命令</string>
|
||||||
|
<string name="hint_work_dir">工作目录(默认 ~)</string>
|
||||||
|
<string name="toast_deleted">已删除</string>
|
||||||
|
<string name="toast_fields_required">按钮名称和执行命令不能为空</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,28 +1,50 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="MyAppTheme" parent="AESTheme">
|
||||||
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
<item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
<item name="aboutViewTextColor">@color/mainWindowTextColor</item>
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
<item name="aboutViewTitleColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="aboutViewDividerColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="dialogBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="dialogTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
|
|
||||||
<item name="toolbarTextColor">@color/toolbarTextColor</item>
|
|
||||||
<item name="textViewBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="textViewTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="editTextBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="editTextTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="scrollViewBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="activityBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="activityTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="mainWindowBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="mainWindowTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="mainWindowDarkBackgroundColor">@color/mainWindowBackgroundColor</item>
|
|
||||||
<item name="mainWindowDarkTextColor">@color/mainWindowTextColor</item>
|
|
||||||
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="MyDepthAppTheme" parent="DepthAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MySkyAppTheme" parent="SkyAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MyGoldenAppTheme" parent="GoldenAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MyBearingAppTheme" parent="BearingAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MyMemorAppTheme" parent="MemorAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MyTaoAppTheme" parent="TaoAESTheme">
|
||||||
|
<item name="themeDebug">@style/MyDebugActivityTheme</item>
|
||||||
|
<item name="aToolbar">@style/MyAESAToolbar</item>
|
||||||
|
<item name="aSupportToolbar">@style/MyAESASupportToolbar</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="MyAESAToolbar" parent="AESAToolbar" />
|
||||||
|
|
||||||
|
<style name="MyAESASupportToolbar" parent="AESASupportToolbar" />
|
||||||
|
|
||||||
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
|
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
|
||||||
<item name="colorTittle">@color/mainWindowTextColor</item>
|
<item name="colorTittle">@color/mainWindowTextColor</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user