Compare commits
	
		
			11 Commits
		
	
	
		
			cdb9d8d41b
			...
			regexputil
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 598e02444f | |||
| 
						 | 
					25eaa83f6e | ||
| 
						 | 
					0491d096f9 | ||
| 452429ee9c | |||
| 
						 | 
					a465c80ed7 | ||
| 
						 | 
					fa462be666 | ||
| c30588f174 | |||
| b5ccbd09f4 | |||
| 
						 | 
					d8a6049abb | ||
| 8e15c82129 | |||
| 44fc3b1899 | 
@@ -1,8 +1,8 @@
 | 
				
			|||||||
#Created by .winboll/winboll_app_build.gradle
 | 
					#Created by .winboll/winboll_app_build.gradle
 | 
				
			||||||
#Sun Sep 28 17:17:19 GMT 2025
 | 
					#Mon Sep 29 13:04:18 HKT 2025
 | 
				
			||||||
stageCount=1
 | 
					stageCount=3
 | 
				
			||||||
libraryProject=libaes
 | 
					libraryProject=libaes
 | 
				
			||||||
baseVersion=15.10
 | 
					baseVersion=15.10
 | 
				
			||||||
publishVersion=15.10.0
 | 
					publishVersion=15.10.2
 | 
				
			||||||
buildCount=7
 | 
					buildCount=0
 | 
				
			||||||
baseBetaVersion=15.10.1
 | 
					baseBetaVersion=15.10.3
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
#Created by .winboll/winboll_app_build.gradle
 | 
					#Created by .winboll/winboll_app_build.gradle
 | 
				
			||||||
#Sun Sep 28 17:17:19 GMT 2025
 | 
					#Mon Sep 29 13:04:07 HKT 2025
 | 
				
			||||||
stageCount=1
 | 
					stageCount=3
 | 
				
			||||||
libraryProject=libaes
 | 
					libraryProject=libaes
 | 
				
			||||||
baseVersion=15.10
 | 
					baseVersion=15.10
 | 
				
			||||||
publishVersion=15.10.0
 | 
					publishVersion=15.10.2
 | 
				
			||||||
buildCount=7
 | 
					buildCount=0
 | 
				
			||||||
baseBetaVersion=15.10.1
 | 
					baseBetaVersion=15.10.3
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,7 +52,7 @@ public class WinBoLLActivityManager {
 | 
				
			|||||||
        return _mIWinBoLLActivityManager;
 | 
					        return _mIWinBoLLActivityManager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static synchronized void init(GlobalApplication application) {
 | 
						public static synchronized <T extends GlobalApplication> void init(T application) {
 | 
				
			||||||
        if (_mIWinBoLLActivityManager == null) {
 | 
					        if (_mIWinBoLLActivityManager == null) {
 | 
				
			||||||
            _mIWinBoLLActivityManager = new WinBoLLActivityManager(application);
 | 
					            _mIWinBoLLActivityManager = new WinBoLLActivityManager(application);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								regexputils/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								regexputils/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					/build
 | 
				
			||||||
							
								
								
									
										34
									
								
								regexputils/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								regexputils/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					# RegExpUtils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 介绍
 | 
				
			||||||
 | 
					正则表达式工具集。这个工具可以用来测试正则表达式的匹配规则是否正确。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 软件架构
 | 
				
			||||||
 | 
					适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
 | 
				
			||||||
 | 
					也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Gradle 编译说明
 | 
				
			||||||
 | 
					调试版编译命令 :gradle assembleBetaDebug
 | 
				
			||||||
 | 
					阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh regexputils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 使用说明
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 参与贡献
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  Fork 本仓库
 | 
				
			||||||
 | 
					2.  新建 Feat_xxx 分支
 | 
				
			||||||
 | 
					3.  提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
 | 
				
			||||||
 | 
					4.  新建 Pull Request
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 特技
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
 | 
				
			||||||
 | 
					2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
 | 
				
			||||||
 | 
					3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
 | 
				
			||||||
 | 
					4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
 | 
				
			||||||
 | 
					5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
 | 
				
			||||||
 | 
					6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### 参考文档
 | 
				
			||||||
							
								
								
									
										1
									
								
								regexputils/app_update_description.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								regexputils/app_update_description.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										49
									
								
								regexputils/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								regexputils/build.gradle
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					apply plugin: 'com.android.application'
 | 
				
			||||||
 | 
					apply from: '../.winboll/winboll_app_build.gradle'
 | 
				
			||||||
 | 
					apply from: '../.winboll/winboll_lint_build.gradle'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def genVersionName(def versionName){
 | 
				
			||||||
 | 
					    // 检查编译标志位配置
 | 
				
			||||||
 | 
					    assert (winbollBuildProps['stageCount'] != null)
 | 
				
			||||||
 | 
					    assert (winbollBuildProps['baseVersion'] != null)
 | 
				
			||||||
 | 
					    // 保存基础版本号
 | 
				
			||||||
 | 
					    winbollBuildProps.setProperty("baseVersion", "${versionName}");
 | 
				
			||||||
 | 
					    //保存编译标志配置
 | 
				
			||||||
 | 
					    FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile)
 | 
				
			||||||
 | 
					    winbollBuildProps.store(fos, "${winbollBuildPropsDesc}");
 | 
				
			||||||
 | 
					    fos.close();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // 返回编译版本号
 | 
				
			||||||
 | 
					    return "${versionName}." + winbollBuildProps['stageCount']
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					android {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    compileSdkVersion 32
 | 
				
			||||||
 | 
					    buildToolsVersion "32.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    defaultConfig {
 | 
				
			||||||
 | 
					        applicationId "cc.winboll.studio.regexputils"
 | 
				
			||||||
 | 
					        minSdkVersion 24
 | 
				
			||||||
 | 
					        targetSdkVersion 30
 | 
				
			||||||
 | 
					        versionCode 1
 | 
				
			||||||
 | 
					        // versionName 更新后需要手动设置 
 | 
				
			||||||
 | 
					        // 项目模块目录的 build.gradle 文件的 stageCount=0
 | 
				
			||||||
 | 
					        // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
 | 
				
			||||||
 | 
					        versionName "15.10" 
 | 
				
			||||||
 | 
					        if(true) {
 | 
				
			||||||
 | 
					            versionName = genVersionName("${versionName}")
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    buildTypes {
 | 
				
			||||||
 | 
					        release {
 | 
				
			||||||
 | 
					            minifyEnabled false
 | 
				
			||||||
 | 
					            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dependencies {
 | 
				
			||||||
 | 
					    api fileTree(dir: 'libs', include: ['*.jar'])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								regexputils/build.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								regexputils/build.properties
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					#Created by .winboll/winboll_app_build.gradle
 | 
				
			||||||
 | 
					#Tue Oct 07 20:47:24 HKT 2025
 | 
				
			||||||
 | 
					stageCount=2
 | 
				
			||||||
 | 
					libraryProject=
 | 
				
			||||||
 | 
					baseVersion=15.10
 | 
				
			||||||
 | 
					publishVersion=15.10.1
 | 
				
			||||||
 | 
					buildCount=0
 | 
				
			||||||
 | 
					baseBetaVersion=15.10.2
 | 
				
			||||||
							
								
								
									
										17
									
								
								regexputils/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								regexputils/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					# Add project specific ProGuard rules here.
 | 
				
			||||||
 | 
					# By default, the flags in this file are appended to flags specified
 | 
				
			||||||
 | 
					# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt
 | 
				
			||||||
 | 
					# You can edit the include path and order by changing the proguardFiles
 | 
				
			||||||
 | 
					# directive in build.gradle.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# For more details, see
 | 
				
			||||||
 | 
					#   http://developer.android.com/guide/developing/tools/proguard.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Add any project specific keep options here:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If your project uses WebView with JS, uncomment the following
 | 
				
			||||||
 | 
					# and specify the fully qualified class name to the JavaScript interface
 | 
				
			||||||
 | 
					# class:
 | 
				
			||||||
 | 
					#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
 | 
				
			||||||
 | 
					#   public *;
 | 
				
			||||||
 | 
					#}
 | 
				
			||||||
							
								
								
									
										14
									
								
								regexputils/src/beta/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								regexputils/src/beta/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    xmlns:tools="http://schemas.android.com/tools" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <application
 | 
				
			||||||
 | 
							tools:replace="android:icon"
 | 
				
			||||||
 | 
					        android:icon="@drawable/ic_launcher_beta">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <!-- Put flavor specific code here -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </application>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</manifest>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								regexputils/src/beta/res/values-zh/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								regexputils/src/beta/res/values-zh/strings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <string name="app_name">正则工具☆</string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										6
									
								
								regexputils/src/beta/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								regexputils/src/beta/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <string name="app_name">RegExpUtils+</string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										39
									
								
								regexputils/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								regexputils/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					<?xml version='1.0' encoding='utf-8'?>
 | 
				
			||||||
 | 
					<manifest
 | 
				
			||||||
 | 
					    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    package="cc.winboll.studio.regexputils">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- 拥有完全的网络访问权限 -->
 | 
				
			||||||
 | 
					    <uses-permission android:name="android.permission.INTERNET"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <application
 | 
				
			||||||
 | 
					        android:name="cc.winboll.studio.regexputils.App"
 | 
				
			||||||
 | 
					        android:allowBackup="true"
 | 
				
			||||||
 | 
					        android:icon="@drawable/ic_regexputils"
 | 
				
			||||||
 | 
					        android:label="@string/app_name"
 | 
				
			||||||
 | 
					        android:theme="@style/AppTheme"
 | 
				
			||||||
 | 
					        android:resizeableActivity="true">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <activity
 | 
				
			||||||
 | 
					            android:name=".MainActivity"
 | 
				
			||||||
 | 
					            android:label="@string/app_name">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <intent-filter>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <action android:name="android.intent.action.MAIN"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <category android:name="android.intent.category.LAUNCHER"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            </intent-filter>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        </activity>
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        <activity android:name="cc.winboll.studio.regexputils.develop.CrashHandler$CrashActiviy"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <meta-data
 | 
				
			||||||
 | 
					            android:name="android.max_aspect"
 | 
				
			||||||
 | 
					            android:value="4.0"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </application>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</manifest>
 | 
				
			||||||
@@ -0,0 +1,11 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cc.winboll.studio.regexputils.develop.WinBollBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class App extends WinBollBase {
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static final String TAG = "App";
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,446 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.app.Activity;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.content.SharedPreferences;
 | 
				
			||||||
 | 
					import android.graphics.Bitmap;
 | 
				
			||||||
 | 
					import android.icu.text.SimpleDateFormat;
 | 
				
			||||||
 | 
					import android.os.Bundle;
 | 
				
			||||||
 | 
					import android.view.KeyEvent;
 | 
				
			||||||
 | 
					import android.view.View;
 | 
				
			||||||
 | 
					import android.view.ViewGroup.LayoutParams;
 | 
				
			||||||
 | 
					import android.view.inputmethod.EditorInfo;
 | 
				
			||||||
 | 
					import android.view.inputmethod.InputMethodManager;
 | 
				
			||||||
 | 
					import android.webkit.WebView;
 | 
				
			||||||
 | 
					import android.webkit.WebViewClient;
 | 
				
			||||||
 | 
					import android.widget.AdapterView;
 | 
				
			||||||
 | 
					import android.widget.ArrayAdapter;
 | 
				
			||||||
 | 
					import android.widget.Button;
 | 
				
			||||||
 | 
					import android.widget.EditText;
 | 
				
			||||||
 | 
					import android.widget.LinearLayout;
 | 
				
			||||||
 | 
					import android.widget.ListPopupWindow;
 | 
				
			||||||
 | 
					import android.widget.TextView;
 | 
				
			||||||
 | 
					import android.widget.Toast;
 | 
				
			||||||
 | 
					import cc.winboll.studio.regexputils.develop.LogUtils;
 | 
				
			||||||
 | 
					import cc.winboll.studio.regexputils.develop.LogView;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					import java.util.regex.Matcher;
 | 
				
			||||||
 | 
					import java.util.regex.Pattern;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class MainActivity extends Activity {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String TAG = MainActivity.class.getSimpleName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TextView mtvPattern;
 | 
				
			||||||
 | 
					    EditText metPattern;
 | 
				
			||||||
 | 
					    TextView mtvRewrite;
 | 
				
			||||||
 | 
					    EditText metRewrite;
 | 
				
			||||||
 | 
					    TextView mtvMatchText;
 | 
				
			||||||
 | 
					    EditText metMatchText;
 | 
				
			||||||
 | 
					    TextView mtvResult;
 | 
				
			||||||
 | 
					    TextView mtvOnlineHelp;
 | 
				
			||||||
 | 
					    Button mbtnFavorite;
 | 
				
			||||||
 | 
					    WebView mWebView;
 | 
				
			||||||
 | 
					    URLEditText mURLEditText;
 | 
				
			||||||
 | 
					    SharedPreferences mSharedPreferences;
 | 
				
			||||||
 | 
					    Set<String> mSetStringFavorite;
 | 
				
			||||||
 | 
					    String mszDefaultOnlineHelp;
 | 
				
			||||||
 | 
					    LogView mLogView;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void onCreate(Bundle savedInstanceState) {
 | 
				
			||||||
 | 
					        super.onCreate(savedInstanceState);
 | 
				
			||||||
 | 
					        setContentView(R.layout.activity_main);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mLogView = new LogView(this);
 | 
				
			||||||
 | 
					        LinearLayout mllLog = findViewById(R.id.activitymainLinearLayout1);
 | 
				
			||||||
 | 
					        mllLog.addView(mLogView);
 | 
				
			||||||
 | 
					        mLogView.startWatching();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        initView();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LogUtils.d(TAG, "Created");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void initView() {
 | 
				
			||||||
 | 
					        //Toolbar toolbar= findViewById(R.id.toolbar);
 | 
				
			||||||
 | 
					        //setSupportActionBar(toolbar);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mSharedPreferences = getSharedPreferences("SP", Context.MODE_PRIVATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mtvPattern = findViewById(R.id.activitymainTextView2);
 | 
				
			||||||
 | 
					        metPattern = findViewById(R.id.activitymainEditText1);
 | 
				
			||||||
 | 
					        mtvRewrite = findViewById(R.id.activitymainTextView3);
 | 
				
			||||||
 | 
					        metRewrite = findViewById(R.id.activitymainEditText3);
 | 
				
			||||||
 | 
					        mtvMatchText = findViewById(R.id.activitymainTextView5);
 | 
				
			||||||
 | 
					        metMatchText = findViewById(R.id.activitymainEditText2);
 | 
				
			||||||
 | 
					        mtvResult = findViewById(R.id.activitymainTextView1);
 | 
				
			||||||
 | 
					        mWebView = findViewById(R.id.activitymainWebView1);
 | 
				
			||||||
 | 
					        mtvOnlineHelp = findViewById(R.id.activitymainTextView4);
 | 
				
			||||||
 | 
					        mURLEditText = findViewById(R.id.activitymainURLEditText1);
 | 
				
			||||||
 | 
					        mbtnFavorite = findViewById(R.id.activitymainButton1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mtvOnlineHelp.setText(getString(R.string.tv_onlinehelp));
 | 
				
			||||||
 | 
					        //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置
 | 
				
			||||||
 | 
					        mWebView.setWebViewClient(new WebViewClient(){
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public boolean shouldOverrideUrlLoading(WebView view, String url) {
 | 
				
			||||||
 | 
					                    //使用WebView加载显示url
 | 
				
			||||||
 | 
					                    view.loadUrl(url);
 | 
				
			||||||
 | 
					                    //返回true
 | 
				
			||||||
 | 
					                    return true;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mSetStringFavorite = mSharedPreferences.getStringSet("mListFavorite", new HashSet<String>());
 | 
				
			||||||
 | 
					        String szURL = mSharedPreferences.getString("mWebView", getString(R.string.sz_defaultonlinehelp));
 | 
				
			||||||
 | 
					        addDefaultURLFavorite();
 | 
				
			||||||
 | 
					        mWebView.loadUrl(szURL);
 | 
				
			||||||
 | 
					        mWebView.setWebViewClient(new WebViewClient(){
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public void onPageStarted(WebView view, String url, Bitmap favicon) {
 | 
				
			||||||
 | 
					                    //设定加载开始的操作
 | 
				
			||||||
 | 
					                    mURLEditText.setText(url);
 | 
				
			||||||
 | 
					                    for (String sz : mSetStringFavorite) {
 | 
				
			||||||
 | 
					                        if (sz.equals(url)) {
 | 
				
			||||||
 | 
					                            //mURLEditText.setFavoriteYes();
 | 
				
			||||||
 | 
					                            mbtnFavorite.setText("★");
 | 
				
			||||||
 | 
					                            return;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    mbtnFavorite.setText("☆");
 | 
				
			||||||
 | 
					                    //mURLEditText.setFavoriteNo();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        mURLEditText.setText(szURL);
 | 
				
			||||||
 | 
					        mURLEditText.setOnEditorActionListener(
 | 
				
			||||||
 | 
					            new TextView.OnEditorActionListener() {
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
 | 
				
			||||||
 | 
					                    if (actionId == EditorInfo.IME_ACTION_DONE) {
 | 
				
			||||||
 | 
					                        onGoto(null);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        /* mURLEditText.setOnTouchListener(new View.OnTouchListener() {
 | 
				
			||||||
 | 
					         @Override
 | 
				
			||||||
 | 
					         public boolean onTouch(View view, MotionEvent event) {
 | 
				
			||||||
 | 
					         final int DRAWABLE_LEFT = 0;
 | 
				
			||||||
 | 
					         //final int DRAWABLE_TOP = 1;
 | 
				
			||||||
 | 
					         final int DRAWABLE_RIGHT = 2;
 | 
				
			||||||
 | 
					         //final int DRAWABLE_BOTTOM = 3;
 | 
				
			||||||
 | 
					         if (event.getAction() == MotionEvent.ACTION_UP) {
 | 
				
			||||||
 | 
					         if (event.getX() >= (mURLEditText.getWidth() - mURLEditText
 | 
				
			||||||
 | 
					         .getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         return true;
 | 
				
			||||||
 | 
					         } else if (event.getX() <= (mURLEditText
 | 
				
			||||||
 | 
					         .getCompoundDrawables()[DRAWABLE_LEFT].getBounds().width())) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         return true;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         return false;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         });*/
 | 
				
			||||||
 | 
					        mtvPattern.setText(getString(R.string.tv_pattern));
 | 
				
			||||||
 | 
					        metPattern.setText(mSharedPreferences.getString("metPattern", "[^n]"));
 | 
				
			||||||
 | 
					        metPattern.setOnEditorActionListener(
 | 
				
			||||||
 | 
					            new TextView.OnEditorActionListener() {
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
 | 
				
			||||||
 | 
					                    if (actionId == EditorInfo.IME_ACTION_DONE) {
 | 
				
			||||||
 | 
					                        onRegExp(null);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        mtvRewrite.setText(getString(R.string.tv_rewrite));
 | 
				
			||||||
 | 
					        metRewrite.setText(mSharedPreferences.getString("metRewrite", ""));
 | 
				
			||||||
 | 
					        metRewrite.setOnEditorActionListener(
 | 
				
			||||||
 | 
					            new TextView.OnEditorActionListener() {
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
 | 
				
			||||||
 | 
					                    if (actionId == EditorInfo.IME_ACTION_DONE) {
 | 
				
			||||||
 | 
					                        onRegExpRewrite(null);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        mtvMatchText.setText(getString(R.string.tv_matchtext));
 | 
				
			||||||
 | 
					        metMatchText.setText(mSharedPreferences.getString("metMatchText", "Test string 123."));
 | 
				
			||||||
 | 
					        metMatchText.setOnEditorActionListener(
 | 
				
			||||||
 | 
					            new TextView.OnEditorActionListener() {
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
 | 
				
			||||||
 | 
					                    if (actionId == EditorInfo.IME_ACTION_DONE) {
 | 
				
			||||||
 | 
					                        onRegExp(null);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onEnableFavorite(View v) {
 | 
				
			||||||
 | 
					        changeURLFavorite();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onShowFavoriteList(View v) {
 | 
				
			||||||
 | 
					        showListPopulWindow();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void showListPopulWindow() {
 | 
				
			||||||
 | 
					        final String[] list = (String[])mSetStringFavorite.toArray(new String[0]);
 | 
				
			||||||
 | 
					        final ListPopupWindow listPopupWindow;
 | 
				
			||||||
 | 
					        listPopupWindow = new ListPopupWindow(this);
 | 
				
			||||||
 | 
					        listPopupWindow.setWidth(LayoutParams.WRAP_CONTENT);
 | 
				
			||||||
 | 
					        listPopupWindow.setHeight(LayoutParams.WRAP_CONTENT);
 | 
				
			||||||
 | 
					        listPopupWindow.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));//用android内置布局,或设计自己的样式
 | 
				
			||||||
 | 
					        //设置下拉列表基准控件
 | 
				
			||||||
 | 
					        listPopupWindow.setAnchorView(mURLEditText);
 | 
				
			||||||
 | 
					        listPopupWindow.setModal(true);
 | 
				
			||||||
 | 
					        // 透明度
 | 
				
			||||||
 | 
					        //listPopupWindow.setBackgroundDrawable(new ColorDrawable(0x00ffffff));
 | 
				
			||||||
 | 
					        listPopupWindow.setBackgroundDrawable(getDrawable(R.drawable.bg_shadow));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        listPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {//设置项点击监听
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
 | 
				
			||||||
 | 
					                    mURLEditText.setText(list[i]);//展示选择的内容
 | 
				
			||||||
 | 
					                    setWebViewURL(list[i]);
 | 
				
			||||||
 | 
					                    listPopupWindow.dismiss();//如果已经选择了,隐藏起来
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					        listPopupWindow.show();//下拉列表展示出来
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onRegExp(View v) {
 | 
				
			||||||
 | 
					        mtvResult.setText("");
 | 
				
			||||||
 | 
					        regExp();
 | 
				
			||||||
 | 
					        hideKeyboard(v);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onRegExpRewrite(View v) {
 | 
				
			||||||
 | 
					        mtvResult.setText("");
 | 
				
			||||||
 | 
					        regExpRewrite();
 | 
				
			||||||
 | 
					        hideKeyboard(v);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //隐藏虚拟键盘
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    public static void hideKeyboard(View v) {
 | 
				
			||||||
 | 
					        InputMethodManager imm = ( InputMethodManager ) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
 | 
				
			||||||
 | 
					        if (imm.isActive()) {
 | 
				
			||||||
 | 
					            imm.hideSoftInputFromWindow(v.getApplicationWindowToken() , 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 获取当前时间格式化后的字符串
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    String getCurrentTimeString() {
 | 
				
			||||||
 | 
					        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
 | 
				
			||||||
 | 
					        return sdf.format(System.currentTimeMillis());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ArrayList<String> regExp() {
 | 
				
			||||||
 | 
					        ArrayList<String> listResult = new ArrayList<String>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StringBuilder sbPrint = new StringBuilder();
 | 
				
			||||||
 | 
					        sbPrint.append(getString(R.string.sz_patternresult));
 | 
				
			||||||
 | 
					        sbPrint.append(" : ");
 | 
				
			||||||
 | 
					        sbPrint.append(getCurrentTimeString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 输出当前累积的消息并清理 sbPrint
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint.toString());
 | 
				
			||||||
 | 
					        sbPrint = new StringBuilder("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            String szMatchText = metMatchText.getText().toString();
 | 
				
			||||||
 | 
					            String szPattern = metPattern.getText().toString();
 | 
				
			||||||
 | 
					            mSharedPreferences = getSharedPreferences("SP", Context.MODE_PRIVATE);
 | 
				
			||||||
 | 
					            mSharedPreferences.edit().putString("metPattern", metPattern.getText().toString()).commit();
 | 
				
			||||||
 | 
					            mSharedPreferences.edit().putString("metMatchText", metMatchText.getText().toString()).commit();
 | 
				
			||||||
 | 
					            listResult = buildRegExpList(szMatchText, szPattern);
 | 
				
			||||||
 | 
					            if (listResult.size() > 0) {
 | 
				
			||||||
 | 
					                sbPrint.append("\nRegExp Result : ");
 | 
				
			||||||
 | 
					                sbPrint.append(listResult.size());
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                sbPrint.append("\nRegExp Result : 0");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            LogUtils.d(TAG, "Exception : " + e.getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LogUtils.d(TAG, "RegExp Done.");
 | 
				
			||||||
 | 
					        return listResult;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void regExpRewrite() {
 | 
				
			||||||
 | 
					        StringBuilder sbPrint = new StringBuilder("\n");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            String szMatchText = metMatchText.getText().toString();
 | 
				
			||||||
 | 
					            String szPattern = metPattern.getText().toString();
 | 
				
			||||||
 | 
					            String szRewrite = metRewrite.getText().toString();
 | 
				
			||||||
 | 
					            mSharedPreferences = getSharedPreferences("SP", Context.MODE_PRIVATE);
 | 
				
			||||||
 | 
					            mSharedPreferences.edit().putString("metPattern", metPattern.getText().toString()).commit();
 | 
				
			||||||
 | 
					            mSharedPreferences.edit().putString("metMatchText", metMatchText.getText().toString()).commit();
 | 
				
			||||||
 | 
					            mSharedPreferences.edit().putString("metRewrite", metRewrite.getText().toString()).commit();
 | 
				
			||||||
 | 
					            int nRewriteCount = regExpRewrite(szMatchText, szPattern, szRewrite);
 | 
				
			||||||
 | 
					            if (nRewriteCount > 0) {
 | 
				
			||||||
 | 
					                sbPrint.append("\nRewrite Result : ");
 | 
				
			||||||
 | 
					                sbPrint.append(nRewriteCount);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                sbPrint.append("\nRewrite Result : 0");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            LogUtils.d(TAG, "Exception : " + e.getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint);
 | 
				
			||||||
 | 
					        LogUtils.d(TAG, "RegExp Rewrite Done.");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 
 | 
				
			||||||
 | 
					    // 生成语法模板匹配到的所有字符串数组
 | 
				
			||||||
 | 
					    //
 | 
				
			||||||
 | 
					    ArrayList<String> buildRegExpList(String szMatchText, String szPattern) {
 | 
				
			||||||
 | 
					        ArrayList<String> listResult = new ArrayList<String>();
 | 
				
			||||||
 | 
					        StringBuilder sbPrint = new StringBuilder("\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Pattern pattern = Pattern.compile(szPattern, Pattern.MULTILINE);
 | 
				
			||||||
 | 
					        Matcher matcher = pattern.matcher(szMatchText);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        boolean isNull = true;
 | 
				
			||||||
 | 
					        int nStart = 0;
 | 
				
			||||||
 | 
					        while (matcher.find(nStart)) {
 | 
				
			||||||
 | 
					            isNull = false;
 | 
				
			||||||
 | 
					            int start = matcher.start();
 | 
				
			||||||
 | 
					            int end = matcher.end();
 | 
				
			||||||
 | 
					            String group = matcher.group();
 | 
				
			||||||
 | 
					            sbPrint.append("\n");
 | 
				
			||||||
 | 
					            sbPrint.append(getString(R.string.sz_start));
 | 
				
			||||||
 | 
					            sbPrint.append("(");
 | 
				
			||||||
 | 
					            sbPrint.append(Integer.toString(start));
 | 
				
			||||||
 | 
					            sbPrint.append(") ");
 | 
				
			||||||
 | 
					            sbPrint.append(getString(R.string.sz_end));
 | 
				
			||||||
 | 
					            sbPrint.append("(");
 | 
				
			||||||
 | 
					            sbPrint.append(Integer.toString(end));
 | 
				
			||||||
 | 
					            sbPrint.append(") >>> ");
 | 
				
			||||||
 | 
					            sbPrint.append(group);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            listResult.add(group);
 | 
				
			||||||
 | 
					            nStart = matcher.end();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint.toString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return listResult;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int regExpRewrite(String szMatchText, String szPattern, String szRewrite) {
 | 
				
			||||||
 | 
					        int nRewriteCount = 0;
 | 
				
			||||||
 | 
					        ArrayList<String> listResult = regExp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StringBuilder sbPrint = new StringBuilder("\n\n\n\n\n####################\n");
 | 
				
			||||||
 | 
					        sbPrint.append(getString(R.string.sz_rewriteresult));
 | 
				
			||||||
 | 
					        sbPrint.append(" : ");
 | 
				
			||||||
 | 
					        sbPrint.append(getCurrentTimeString());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 输出当前累积的消息并清理 sbPrint
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint.toString());
 | 
				
			||||||
 | 
					        sbPrint = new StringBuilder();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (int i = 0; i < listResult.size(); i++) {
 | 
				
			||||||
 | 
					            Pattern pattern = Pattern.compile(szPattern, Pattern.MULTILINE);
 | 
				
			||||||
 | 
					            Matcher matcher = pattern.matcher(listResult.get(i));
 | 
				
			||||||
 | 
					            if (matcher.find()) {
 | 
				
			||||||
 | 
					                nRewriteCount++;
 | 
				
			||||||
 | 
					                sbPrint.append("\n Rewrite ");
 | 
				
			||||||
 | 
					                sbPrint.append(nRewriteCount);
 | 
				
			||||||
 | 
					                sbPrint.append(" : \n");
 | 
				
			||||||
 | 
					                sbPrint.append(matcher.replaceAll(szRewrite));
 | 
				
			||||||
 | 
					                sbPrint.append(" \n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mtvResult.append(sbPrint.toString());
 | 
				
			||||||
 | 
					        return nRewriteCount;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void onDestroy() {
 | 
				
			||||||
 | 
					        mLogView.stopWatching();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putString("metPattern", metPattern.getText().toString()).commit();
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putString("metMatchText", metMatchText.getText().toString()).commit();
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putStringSet("mListFavorite", mSetStringFavorite).commit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        super.onDestroy();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void changeURLFavorite() {
 | 
				
			||||||
 | 
					        //String szURL = getString(R.string.webview_helpurl);
 | 
				
			||||||
 | 
					        //setWebViewURL(szURL);
 | 
				
			||||||
 | 
					        String url = mURLEditText.getText().toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 转换收藏开关
 | 
				
			||||||
 | 
					        for (String sz : mSetStringFavorite) {
 | 
				
			||||||
 | 
					            if (sz.equals(url)) {
 | 
				
			||||||
 | 
					                // 保护默认URL
 | 
				
			||||||
 | 
					                if (!getString(R.string.sz_defaultonlinehelp).equals(url)) {
 | 
				
			||||||
 | 
					                    mSetStringFavorite.remove(sz);
 | 
				
			||||||
 | 
					                    //mURLEditText.setFavoriteNo();
 | 
				
			||||||
 | 
					                    mbtnFavorite.setText("☆");
 | 
				
			||||||
 | 
					                    mSharedPreferences.edit().putStringSet("mListFavorite", mSetStringFavorite).commit();
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    Toast.makeText(getApplication(), "!☆", Toast.LENGTH_SHORT).show();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        mSetStringFavorite.add(url);
 | 
				
			||||||
 | 
					        mbtnFavorite.setText("★");
 | 
				
			||||||
 | 
					        //mURLEditText.setFavoriteYes();
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putStringSet("mListFavorite", mSetStringFavorite).commit();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void addDefaultURLFavorite() {
 | 
				
			||||||
 | 
					        //String szURL = getString(R.string.webview_helpurl);
 | 
				
			||||||
 | 
					        //setWebViewURL(szURL);
 | 
				
			||||||
 | 
					        String szDefault = getString(R.string.sz_defaultonlinehelp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 转换收藏开关
 | 
				
			||||||
 | 
					        for (String sz : mSetStringFavorite) {
 | 
				
			||||||
 | 
					            if (sz.equals(szDefault)) {
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        mSetStringFavorite.add(szDefault);
 | 
				
			||||||
 | 
					        //mURLEditText.setFavoriteYes();
 | 
				
			||||||
 | 
					        mbtnFavorite.setText("★");
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putStringSet("mListFavorite", mSetStringFavorite).commit();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onGoto(View v) {
 | 
				
			||||||
 | 
					        setWebViewURL(mURLEditText.getText().toString());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void setWebViewURL(String szURL) {
 | 
				
			||||||
 | 
					        mSharedPreferences.edit().putString("mWebView", szURL).commit();
 | 
				
			||||||
 | 
					        mWebView.loadUrl(szURL);
 | 
				
			||||||
 | 
					        mURLEditText.setText(szURL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void onCleanLog(View view) {
 | 
				
			||||||
 | 
					        LogUtils.cleanLog();
 | 
				
			||||||
 | 
					        LogUtils.d(TAG, "Log cleaned");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cc.winboll.studio.regexputils.develop.WinBollBase;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class RegExpUtils extends WinBollBase {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String TAG = RegExpUtils.class.getSimpleName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onCreate() {
 | 
				
			||||||
 | 
					        super.onCreate();  
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.graphics.drawable.Drawable;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
 | 
					import android.util.AttributeSet;
 | 
				
			||||||
 | 
					import android.widget.EditText;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class URLEditText extends EditText {
 | 
				
			||||||
 | 
					    //Drawable drawable_r;
 | 
				
			||||||
 | 
					    //Drawable drawable_l_no;
 | 
				
			||||||
 | 
					    //Drawable drawable_l_yes;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static final String TAG = URLEditText.class.getSimpleName();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 在java代码里new的时候会用到
 | 
				
			||||||
 | 
					     * @param context
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public URLEditText(Context context) {
 | 
				
			||||||
 | 
					        super(context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 在xml布局文件中使用时自动调用
 | 
				
			||||||
 | 
					     * @param context
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public URLEditText(Context context, AttributeSet attrs) {
 | 
				
			||||||
 | 
					        super(context, attrs);
 | 
				
			||||||
 | 
					        /*TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.test);
 | 
				
			||||||
 | 
					         String text = ta.getString(R.styleable.test_text);
 | 
				
			||||||
 | 
					         setText(text + " ZhanGSKen.CN");
 | 
				
			||||||
 | 
					         ta.recycle();*/
 | 
				
			||||||
 | 
					        /*drawable_r = getResources().getDrawable(R.mipmap.dropdown);
 | 
				
			||||||
 | 
					        //drawable_n.setBounds(0, 0, drawable_n.getMinimumWidth(),drawable_n.getMinimumHeight());  //此为必须写的
 | 
				
			||||||
 | 
					        drawable_r.setBounds(0, 0, 80, 80);  //此为必须写的
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        drawable_l_no = getResources().getDrawable(R.mipmap.favorite_no);
 | 
				
			||||||
 | 
					        //drawable_n.setBounds(0, 0, drawable_n.getMinimumWidth(),drawable_n.getMinimumHeight());  //此为必须写的
 | 
				
			||||||
 | 
					        drawable_l_no.setBounds(0, 0, 80, 80);  //此为必须写的
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        drawable_l_yes = getResources().getDrawable(R.mipmap.favorite_yes);
 | 
				
			||||||
 | 
					        //drawable_n.setBounds(0, 0, drawable_n.getMinimumWidth(),drawable_n.getMinimumHeight());  //此为必须写的
 | 
				
			||||||
 | 
					        drawable_l_yes.setBounds(0, 0, 80, 80);  //此为必须写的
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        setFavoriteNo();*/
 | 
				
			||||||
 | 
					        //setMinWidth(100);
 | 
				
			||||||
 | 
					        //setPadding(10,0,10,0);
 | 
				
			||||||
 | 
					        //setPaddingRelative(0,0,0,0);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 不会自动调用,如果有默认style时,在第二个构造函数中调用
 | 
				
			||||||
 | 
					     * @param context
 | 
				
			||||||
 | 
					     * @param attrs
 | 
				
			||||||
 | 
					     * @param defStyleAttr
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public URLEditText(Context context, AttributeSet attrs, int defStyleAttr) {
 | 
				
			||||||
 | 
					        super(context, attrs, defStyleAttr);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 只有在API版本>21时才会用到
 | 
				
			||||||
 | 
					     * 不会自动调用,如果有默认style时,在第二个构造函数中调用
 | 
				
			||||||
 | 
					     * @param context
 | 
				
			||||||
 | 
					     * @param attrs
 | 
				
			||||||
 | 
					     * @param defStyleAttr
 | 
				
			||||||
 | 
					     * @param defStyleRes
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    //@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 | 
				
			||||||
 | 
					    public URLEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
 | 
				
			||||||
 | 
					        super(context, attrs, defStyleAttr, defStyleRes);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					   /* public void setFavoriteNo() {
 | 
				
			||||||
 | 
					        setCompoundDrawables(drawable_l_no, null, drawable_r, null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public void setFavoriteYes() {
 | 
				
			||||||
 | 
					        setCompoundDrawables(drawable_l_yes, null, drawable_r, null);
 | 
				
			||||||
 | 
					    }*/
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,237 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils.develop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 应用异常处理类
 | 
				
			||||||
 | 
					 * 源码提供:AIDE
 | 
				
			||||||
 | 
					 * 源码维护:ZhanGSKen@QQ.COM
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.app.Activity;
 | 
				
			||||||
 | 
					import android.app.Application;
 | 
				
			||||||
 | 
					import android.content.ActivityNotFoundException;
 | 
				
			||||||
 | 
					import android.content.ClipData;
 | 
				
			||||||
 | 
					import android.content.ClipboardManager;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.content.Intent;
 | 
				
			||||||
 | 
					import android.content.pm.PackageInfo;
 | 
				
			||||||
 | 
					import android.content.pm.PackageManager;
 | 
				
			||||||
 | 
					import android.content.res.Resources;
 | 
				
			||||||
 | 
					import android.os.Build;
 | 
				
			||||||
 | 
					import android.os.Bundle;
 | 
				
			||||||
 | 
					import android.text.TextUtils;
 | 
				
			||||||
 | 
					import android.view.Menu;
 | 
				
			||||||
 | 
					import android.view.MenuItem;
 | 
				
			||||||
 | 
					import android.view.ViewGroup;
 | 
				
			||||||
 | 
					import android.widget.HorizontalScrollView;
 | 
				
			||||||
 | 
					import android.widget.ScrollView;
 | 
				
			||||||
 | 
					import android.widget.TextView;
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileOutputStream;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.PrintWriter;
 | 
				
			||||||
 | 
					import java.io.StringWriter;
 | 
				
			||||||
 | 
					import java.lang.Thread.UncaughtExceptionHandler;
 | 
				
			||||||
 | 
					import java.text.SimpleDateFormat;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public final class CrashHandler
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER = Thread.getDefaultUncaughtExceptionHandler();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void init(Application app)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					        init(app, null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void init(final Application app, final String crashDir)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public void uncaughtException(Thread thread, Throwable throwable)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        tryUncaughtException(thread, throwable);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
										catch (Throwable e)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        e.printStackTrace();
 | 
				
			||||||
 | 
					                        if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null)
 | 
				
			||||||
 | 
					                            DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(thread, throwable);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                private void tryUncaughtException(Thread thread, Throwable throwable)
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
					                    final String time = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss").format(new Date());
 | 
				
			||||||
 | 
					                    File crashFile = new File(TextUtils.isEmpty(crashDir) ? new File(app.getExternalFilesDir(null), "crash")
 | 
				
			||||||
 | 
					                                              : new File(crashDir), "crash_" + time + ".txt");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    String versionName = "unknown";
 | 
				
			||||||
 | 
					                    long versionCode = 0;
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
										{ 
 | 
				
			||||||
 | 
					                        PackageInfo packageInfo = app.getPackageManager().getPackageInfo(app.getPackageName(), 0);
 | 
				
			||||||
 | 
					                        versionName = packageInfo.versionName;
 | 
				
			||||||
 | 
					                        versionCode = Build.VERSION.SDK_INT >= 28 ? packageInfo.getLongVersionCode()
 | 
				
			||||||
 | 
					                            : packageInfo.versionCode;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
										catch (PackageManager.NameNotFoundException ignored)
 | 
				
			||||||
 | 
										{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    String fullStackTrace; {
 | 
				
			||||||
 | 
					                        StringWriter sw = new StringWriter(); 
 | 
				
			||||||
 | 
					                        PrintWriter pw = new PrintWriter(sw);
 | 
				
			||||||
 | 
					                        throwable.printStackTrace(pw);
 | 
				
			||||||
 | 
					                        fullStackTrace = sw.toString();
 | 
				
			||||||
 | 
					                        pw.close();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    StringBuilder sb = new StringBuilder();
 | 
				
			||||||
 | 
					                    sb.append("************* Crash Head ****************\n");
 | 
				
			||||||
 | 
					                    sb.append("Time Of Crash      : ").append(time).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("Device Manufacturer: ").append(Build.MANUFACTURER).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("Device Model       : ").append(Build.MODEL).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("Android Version    : ").append(Build.VERSION.RELEASE).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("Android SDK        : ").append(Build.VERSION.SDK_INT).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("App VersionName    : ").append(versionName).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("App VersionCode    : ").append(versionCode).append("\n");
 | 
				
			||||||
 | 
					                    sb.append("************* Crash Head ****************\n");
 | 
				
			||||||
 | 
					                    sb.append("\n").append(fullStackTrace);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    String errorLog = sb.toString();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        writeFile(crashFile, errorLog);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
										catch (IOException ignored)
 | 
				
			||||||
 | 
										{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    gotoCrashActiviy:
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        Intent intent = new Intent(app, CrashActiviy.class);
 | 
				
			||||||
 | 
					                        intent.addFlags(
 | 
				
			||||||
 | 
					                            Intent.FLAG_ACTIVITY_NEW_TASK
 | 
				
			||||||
 | 
					                            | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
 | 
				
			||||||
 | 
					                        );
 | 
				
			||||||
 | 
					                        intent.putExtra(CrashActiviy.EXTRA_CRASH_INFO, errorLog);
 | 
				
			||||||
 | 
					                        try
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
					                            app.startActivity(intent);
 | 
				
			||||||
 | 
					                            android.os.Process.killProcess(android.os.Process.myPid());
 | 
				
			||||||
 | 
					                            System.exit(0);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
											catch (ActivityNotFoundException e)
 | 
				
			||||||
 | 
											{
 | 
				
			||||||
 | 
					                            e.printStackTrace();
 | 
				
			||||||
 | 
					                            if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null)
 | 
				
			||||||
 | 
					                                DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(thread, throwable);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                private void writeFile(File file, String content) throws IOException
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
					                    File parentFile = file.getParentFile();
 | 
				
			||||||
 | 
					                    if (parentFile != null && !parentFile.exists())
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        parentFile.mkdirs();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    file.createNewFile();
 | 
				
			||||||
 | 
					                    FileOutputStream fos = new FileOutputStream(file);
 | 
				
			||||||
 | 
					                    fos.write(content.getBytes());
 | 
				
			||||||
 | 
					                    try
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
					                        fos.close();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
										catch (IOException e)
 | 
				
			||||||
 | 
										{}
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final class CrashActiviy extends Activity implements MenuItem.OnMenuItemClickListener
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private static final String EXTRA_CRASH_INFO = "crashInfo";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private String mLog;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        protected void onCreate(Bundle savedInstanceState)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            super.onCreate(savedInstanceState);
 | 
				
			||||||
 | 
					            mLog = getIntent().getStringExtra(EXTRA_CRASH_INFO);
 | 
				
			||||||
 | 
					            setContentView:
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
					                ScrollView contentView = new ScrollView(this);
 | 
				
			||||||
 | 
					                contentView.setFillViewport(true);
 | 
				
			||||||
 | 
					                HorizontalScrollView hw = new HorizontalScrollView(this);
 | 
				
			||||||
 | 
					                TextView message = new TextView(this); {
 | 
				
			||||||
 | 
					                    int padding = dp2px(16);
 | 
				
			||||||
 | 
					                    message.setPadding(padding, padding, padding, padding);
 | 
				
			||||||
 | 
					                    message.setText(mLog);
 | 
				
			||||||
 | 
					                    message.setTextIsSelectable(true);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                hw.addView(message);
 | 
				
			||||||
 | 
					                contentView.addView(hw, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
 | 
				
			||||||
 | 
					                setContentView(contentView);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void onBackPressed()
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            restart();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void restart()
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            PackageManager pm = getPackageManager();
 | 
				
			||||||
 | 
					            Intent intent = pm.getLaunchIntentForPackage(getPackageName());
 | 
				
			||||||
 | 
					            if (intent != null)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
					                intent.addFlags(
 | 
				
			||||||
 | 
					                    Intent.FLAG_ACTIVITY_NEW_TASK
 | 
				
			||||||
 | 
					                    | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					                startActivity(intent);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            finish();
 | 
				
			||||||
 | 
					            android.os.Process.killProcess(android.os.Process.myPid());
 | 
				
			||||||
 | 
					            System.exit(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private int dp2px(final float dpValue)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            final float scale = Resources.getSystem().getDisplayMetrics().density;
 | 
				
			||||||
 | 
					            return (int) (dpValue * scale + 0.5f);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public boolean onMenuItemClick(MenuItem item)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            switch (item.getItemId())
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
					                case android.R.id.copy: 
 | 
				
			||||||
 | 
					                    ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
 | 
				
			||||||
 | 
					                    cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public boolean onCreateOptionsMenu(Menu menu)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					            menu.add(0, android.R.id.copy, 0, android.R.string.copy).setOnMenuItemClickListener(this)
 | 
				
			||||||
 | 
					                .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
 | 
				
			||||||
 | 
					            return true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils.develop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 应用日志监听类
 | 
				
			||||||
 | 
					 * 源码提供:https://blog.csdn.net/wuxueshuan/article/details/121852698?app_version=5.15.2&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22121852698%22%2C%22source%22%3A%22weixin_38986226%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app
 | 
				
			||||||
 | 
					 * 源码维护:ZhanGSKen@QQ.COM
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					import android.os.FileObserver;
 | 
				
			||||||
 | 
					import android.util.Log;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class LogListener extends FileObserver {
 | 
				
			||||||
 | 
						public final static String TAG = "LogListener";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public EventCallback callback;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public String mLogPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public LogListener(String path) {
 | 
				
			||||||
 | 
							super(path);
 | 
				
			||||||
 | 
					        //Log.d(TAG, "LogListener(String path) path : " + path);
 | 
				
			||||||
 | 
					        mLogPath = path;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    public void setEventCallback(EventCallback callback) {
 | 
				
			||||||
 | 
					        this.callback = callback;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onEvent(int event, String path) {
 | 
				
			||||||
 | 
					        if (null != path && !"".equals(path)) {
 | 
				
			||||||
 | 
					            //String substring = path.substring(path.lastIndexOf(".") + 1);
 | 
				
			||||||
 | 
					            //Log.d(TAG, "path : " + path);
 | 
				
			||||||
 | 
					            //Log.d(TAG, "substring : " + substring);
 | 
				
			||||||
 | 
					            //Log.d(TAG, "event : " + event);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int e = event & FileObserver.ALL_EVENTS;
 | 
				
			||||||
 | 
					        //Log.d(TAG, "event->e:" + e);
 | 
				
			||||||
 | 
					        switch (e) {
 | 
				
			||||||
 | 
					            case FileObserver.ACCESS:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__1打开文件后读取文件的操作");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.MODIFY:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__2文件被修改");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.ATTRIB:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__4属性变化");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.CLOSE_WRITE:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__8文件写入或编辑后关闭");
 | 
				
			||||||
 | 
									callback.onEvent(path);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.CLOSE_NOWRITE:
 | 
				
			||||||
 | 
					                //录音时,最后一个有效回调是这个
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__16只读文件被关闭");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                //callback.onEvent(path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.OPEN:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__32文件被打开");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.MOVED_FROM:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__64移出事件");//试了重命名先MOVED_FROM再MOVED_TO
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.MOVED_TO:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__128移入事件");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.CREATE:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__256新建文件");//把文件移动给自己先CREATE在DELETE
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.DELETE:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__512有删除文件");//把文件移出去DELETE
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.DELETE_SELF:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__1024监听的这个文件夹被删除");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.MOVE_SELF:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__2048监听的这个文件夹被移走");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case FileObserver.ALL_EVENTS:
 | 
				
			||||||
 | 
					                //Log.d(TAG, "文件操作___" + e + "__4095全部操作");
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public interface EventCallback {
 | 
				
			||||||
 | 
					        void onEvent(String path);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils.develop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 应用日志类
 | 
				
			||||||
 | 
					 * 源码维护:ZhanGSKen@QQ.COM
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.BufferedReader;
 | 
				
			||||||
 | 
					import java.io.BufferedWriter;
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileInputStream;
 | 
				
			||||||
 | 
					import java.io.FileOutputStream;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.io.InputStreamReader;
 | 
				
			||||||
 | 
					import java.io.OutputStreamWriter;
 | 
				
			||||||
 | 
					import java.text.SimpleDateFormat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class LogUtils {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String TAG = "BaseApplication";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void d(String szTAG, String szMessage) {
 | 
				
			||||||
 | 
					        saveLog(szTAG, szMessage);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static void saveLog(String szTAG, String szMessage) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            File fLog = new File(WinBollBase._mszLogFilePath);
 | 
				
			||||||
 | 
					            //FileWriter fw = new FileWriter(fLog, Charset.defaultCharset(), true);
 | 
				
			||||||
 | 
					            //fw.append(mSimpleDateFormat.format(System.currentTimeMillis()) + "[" + szTAG + "]: " + szMessage + "\n");
 | 
				
			||||||
 | 
					            //fw.close();
 | 
				
			||||||
 | 
					            BufferedWriter out = null;
 | 
				
			||||||
 | 
					            out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fLog, true), "UTF-8"));
 | 
				
			||||||
 | 
					            out.write(mSimpleDateFormat.format(System.currentTimeMillis()) + "[" + szTAG + "]: " + szMessage + "\n");
 | 
				
			||||||
 | 
					            out.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            LogUtils.d(TAG, "IOException : " + e.getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static String loadLog() {
 | 
				
			||||||
 | 
					        File fLog = new File(WinBollBase._mszLogFilePath);
 | 
				
			||||||
 | 
					        StringBuffer sb = new StringBuffer();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            //FileInputStream fileInputStream = new FileInputStream(fLog);
 | 
				
			||||||
 | 
					            //int size = fileInputStream.available();
 | 
				
			||||||
 | 
					            //for (int i = 0; i < size; i++) {
 | 
				
			||||||
 | 
					            //    sb.append((char) fileInputStream.read());
 | 
				
			||||||
 | 
					            //}
 | 
				
			||||||
 | 
					            BufferedReader in = null;
 | 
				
			||||||
 | 
					            in = new BufferedReader(new InputStreamReader(new FileInputStream(fLog), "UTF-8"));
 | 
				
			||||||
 | 
					            String line = "";
 | 
				
			||||||
 | 
					            while ((line = in.readLine()) != null) {
 | 
				
			||||||
 | 
					                sb.append(line);
 | 
				
			||||||
 | 
					                sb.append("\n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } catch (IOException e) {
 | 
				
			||||||
 | 
					            LogUtils.d(TAG, "IOException : " + e.getMessage());
 | 
				
			||||||
 | 
					        } 
 | 
				
			||||||
 | 
					        return sb.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void cleanLog() {
 | 
				
			||||||
 | 
					        File fLog = new File(WinBollBase._mszLogFilePath);
 | 
				
			||||||
 | 
					        if (fLog.exists()) {
 | 
				
			||||||
 | 
					            fLog.delete();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils.develop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.graphics.Color;
 | 
				
			||||||
 | 
					import android.os.Handler;
 | 
				
			||||||
 | 
					import android.os.Message;
 | 
				
			||||||
 | 
					import android.util.AttributeSet;
 | 
				
			||||||
 | 
					import android.widget.LinearLayout;
 | 
				
			||||||
 | 
					import android.widget.ScrollView;
 | 
				
			||||||
 | 
					import android.widget.TextView;
 | 
				
			||||||
 | 
					import cc.winboll.studio.regexputils.develop.LogUtils;
 | 
				
			||||||
 | 
					import java.lang.ref.WeakReference;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class LogView extends LinearLayout {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final String TAG = "LogView";
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    final static int MSG_SHOW_LOG = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LogListener mLogListener;
 | 
				
			||||||
 | 
					    ScrollView mScrollView;
 | 
				
			||||||
 | 
					    TextView mTextView;
 | 
				
			||||||
 | 
					    MyHandler mMyHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public LogView(Context context) {
 | 
				
			||||||
 | 
					        super(context);
 | 
				
			||||||
 | 
					        initView(context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public LogView(Context context, AttributeSet attrs) {
 | 
				
			||||||
 | 
					        super(context, attrs);
 | 
				
			||||||
 | 
					        initView(context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void initView(Context context) {
 | 
				
			||||||
 | 
					        mScrollView = new ScrollView(context);
 | 
				
			||||||
 | 
					        mTextView = new TextView(context);
 | 
				
			||||||
 | 
					        mTextView.setTextColor(Color.GREEN);
 | 
				
			||||||
 | 
					        mTextView.setTextIsSelectable(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mScrollView.addView(mTextView);
 | 
				
			||||||
 | 
					        addView(mScrollView);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        mMyHandler = new MyHandler(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        mLogListener = new LogListener(WinBollBase._mszLogFolderPath);
 | 
				
			||||||
 | 
					        mLogListener.setEventCallback(new LogListener.EventCallback(){
 | 
				
			||||||
 | 
					                @Override
 | 
				
			||||||
 | 
					                public void onEvent(String path) {
 | 
				
			||||||
 | 
					                    Message message = mMyHandler.obtainMessage(MSG_SHOW_LOG);
 | 
				
			||||||
 | 
					                    mMyHandler.sendMessage(message);
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void startWatching() {
 | 
				
			||||||
 | 
					        mLogListener.startWatching();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public void stopWatching() {
 | 
				
			||||||
 | 
					        mLogListener.stopWatching();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    static class MyHandler extends Handler {
 | 
				
			||||||
 | 
					        WeakReference<LogView> rv;  
 | 
				
			||||||
 | 
					        MyHandler(LogView view) {  
 | 
				
			||||||
 | 
					            rv = new WeakReference<LogView>(view);  
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        public void handleMessage(Message msg) {
 | 
				
			||||||
 | 
					            final LogView view = rv.get();
 | 
				
			||||||
 | 
					            switch (msg.what) {
 | 
				
			||||||
 | 
					                case MSG_SHOW_LOG:{
 | 
				
			||||||
 | 
					                        view.mTextView.setText(LogUtils.loadLog());
 | 
				
			||||||
 | 
					                        view.mScrollView.post(new Runnable() {
 | 
				
			||||||
 | 
					                                @Override
 | 
				
			||||||
 | 
					                                public void run() {
 | 
				
			||||||
 | 
					                                    view.mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            });
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            super.handleMessage(msg);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,31 @@
 | 
				
			|||||||
 | 
					package cc.winboll.studio.regexputils.develop;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * WinBollBase
 | 
				
			||||||
 | 
					 * WINBOLL 安卓应用基础类
 | 
				
			||||||
 | 
					 * 源码提供:AIDE
 | 
				
			||||||
 | 
					 * 源码维护:ZhanGSKen@QQ.COM
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.app.Application;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class WinBollBase extends Application {
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public static String _mszLogFolderPath;
 | 
				
			||||||
 | 
					    public static String _mszLogFilePath;
 | 
				
			||||||
 | 
					    public static String _mszLogFileName = "WinBollBase.log";
 | 
				
			||||||
 | 
					    public static String _mszHtmlFolderPath;
 | 
				
			||||||
 | 
					    public static String _mszHtmlFilePath;
 | 
				
			||||||
 | 
					    public static String _mszHtmlFileName = "BaseWebViewBody.txt";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public void onCreate() {
 | 
				
			||||||
 | 
					        super.onCreate();
 | 
				
			||||||
 | 
					        CrashHandler.init(this);
 | 
				
			||||||
 | 
					        _mszLogFolderPath = getExternalFilesDir("logs").toString();
 | 
				
			||||||
 | 
					        _mszLogFilePath = _mszLogFolderPath + "/" + _mszLogFileName;
 | 
				
			||||||
 | 
					        _mszHtmlFolderPath = getExternalFilesDir("webviews").toString();
 | 
				
			||||||
 | 
					        _mszHtmlFilePath = _mszHtmlFolderPath + "/" + _mszHtmlFileName;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										41
									
								
								regexputils/src/main/res/drawable/bg_shadow.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								regexputils/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="#FFFFFF" 
 | 
				
			||||||
 | 
					                android:startColor="#FFFFFF" /> 
 | 
				
			||||||
 | 
					            <corners 
 | 
				
			||||||
 | 
					                android:bottomLeftRadius="6dip" 
 | 
				
			||||||
 | 
					                android:bottomRightRadius="6dip" 
 | 
				
			||||||
 | 
					                android:topLeftRadius="6dip" 
 | 
				
			||||||
 | 
					                android:topRightRadius="6dip" /> 
 | 
				
			||||||
 | 
					        </shape> 
 | 
				
			||||||
 | 
					    </item> 
 | 
				
			||||||
 | 
					</layer-list>
 | 
				
			||||||
							
								
								
									
										10
									
								
								regexputils/src/main/res/drawable/ic_launcher.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								regexputils/src/main/res/drawable/ic_launcher.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    android:clickable="true">
 | 
				
			||||||
 | 
						<item 
 | 
				
			||||||
 | 
					        android:left="15dp" 
 | 
				
			||||||
 | 
					        android:top="15dp" 
 | 
				
			||||||
 | 
					        android:right="15dp" 
 | 
				
			||||||
 | 
					        android:bottom="15dp"
 | 
				
			||||||
 | 
					        android:drawable="@drawable/ic_regexputils"/>
 | 
				
			||||||
 | 
					</layer-list>
 | 
				
			||||||
							
								
								
									
										170
									
								
								regexputils/src/main/res/drawable/ic_launcher_background.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								regexputils/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:viewportHeight="108"
 | 
				
			||||||
 | 
					    android:viewportWidth="108">
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#26A69A"
 | 
				
			||||||
 | 
					        android:pathData="M0,0h108v108h-108z" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M9,0L9,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,0L19,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M29,0L29,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M39,0L39,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M49,0L49,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M59,0L59,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M69,0L69,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M79,0L79,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M89,0L89,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M99,0L99,108"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,9L108,9"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,19L108,19"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,29L108,29"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,39L108,39"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,49L108,49"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,59L108,59"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,69L108,69"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,79L108,79"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,89L108,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M0,99L108,99"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,29L89,29"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,39L89,39"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,49L89,49"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,59L89,59"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,69L89,69"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M19,79L89,79"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M29,19L29,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M39,19L39,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M49,19L49,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M59,19L59,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M69,19L69,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					        android:fillColor="#00000000"
 | 
				
			||||||
 | 
					        android:pathData="M79,19L79,89"
 | 
				
			||||||
 | 
					        android:strokeColor="#33FFFFFF"
 | 
				
			||||||
 | 
					        android:strokeWidth="0.8" />
 | 
				
			||||||
 | 
					</vector>
 | 
				
			||||||
							
								
								
									
										11
									
								
								regexputils/src/main/res/drawable/ic_launcher_beta.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								regexputils/src/main/res/drawable/ic_launcher_beta.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="15dp" 
 | 
				
			||||||
 | 
					        android:top="15dp" 
 | 
				
			||||||
 | 
					        android:right="15dp" 
 | 
				
			||||||
 | 
					        android:bottom="15dp"
 | 
				
			||||||
 | 
					        android:drawable="@drawable/ic_regexputils"/>
 | 
				
			||||||
 | 
					</layer-list>
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								regexputils/src/main/res/drawable/ic_regexputils.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								regexputils/src/main/res/drawable/ic_regexputils.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										200
									
								
								regexputils/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								regexputils/src/main/res/layout/activity_main.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,200 @@
 | 
				
			|||||||
 | 
					<?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:layout_width="match_parent"
 | 
				
			||||||
 | 
						android:layout_height="match_parent"
 | 
				
			||||||
 | 
						android:orientation="vertical"
 | 
				
			||||||
 | 
						android:padding="10dp">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						<LinearLayout
 | 
				
			||||||
 | 
							xmlns:app="http://schemas.android.com/apk/res-auto"
 | 
				
			||||||
 | 
							android:layout_width="match_parent"
 | 
				
			||||||
 | 
							android:layout_height="match_parent"
 | 
				
			||||||
 | 
							android:orientation="vertical"
 | 
				
			||||||
 | 
							android:focusable="true"
 | 
				
			||||||
 | 
							android:focusableInTouchMode="true">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<TextView
 | 
				
			||||||
 | 
								android:layout_width="wrap_content"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content"
 | 
				
			||||||
 | 
								android:id="@+id/activitymainTextView2"
 | 
				
			||||||
 | 
								style="@style/columnTitleStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<LinearLayout
 | 
				
			||||||
 | 
								android:orientation="horizontal"
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content"
 | 
				
			||||||
 | 
								android:gravity="center_vertical">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<EditText
 | 
				
			||||||
 | 
									android:layout_width="0dp"
 | 
				
			||||||
 | 
									android:ems="10"
 | 
				
			||||||
 | 
									android:layout_height="wrap_content"
 | 
				
			||||||
 | 
									android:id="@+id/activitymainEditText1"
 | 
				
			||||||
 | 
									android:layout_weight="1.0"
 | 
				
			||||||
 | 
									android:singleLine="true"
 | 
				
			||||||
 | 
									android:imeOptions="actionDone"
 | 
				
			||||||
 | 
									style="@style/contentEditBoxStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<Button
 | 
				
			||||||
 | 
									android:layout_width="40dp"
 | 
				
			||||||
 | 
									android:layout_height="40dp"
 | 
				
			||||||
 | 
									android:text="!"
 | 
				
			||||||
 | 
									android:onClick="onRegExp"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<TextView
 | 
				
			||||||
 | 
								android:layout_width="wrap_content"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content"
 | 
				
			||||||
 | 
								android:id="@+id/activitymainTextView3"
 | 
				
			||||||
 | 
								style="@style/columnTitleStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<LinearLayout
 | 
				
			||||||
 | 
								android:orientation="horizontal"
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<EditText
 | 
				
			||||||
 | 
									android:layout_width="0dp"
 | 
				
			||||||
 | 
									android:ems="10"
 | 
				
			||||||
 | 
									android:layout_height="wrap_content"
 | 
				
			||||||
 | 
									android:layout_weight="1.0"
 | 
				
			||||||
 | 
									android:singleLine="true"
 | 
				
			||||||
 | 
									android:imeOptions="actionDone"
 | 
				
			||||||
 | 
									android:id="@+id/activitymainEditText3"
 | 
				
			||||||
 | 
									style="@style/contentEditBoxStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<Button
 | 
				
			||||||
 | 
									android:layout_width="40dp"
 | 
				
			||||||
 | 
									android:layout_height="40dp"
 | 
				
			||||||
 | 
									android:text="! $"
 | 
				
			||||||
 | 
									android:onClick="onRegExpRewrite"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<TextView
 | 
				
			||||||
 | 
								android:layout_width="wrap_content"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content"
 | 
				
			||||||
 | 
								android:id="@+id/activitymainTextView5"
 | 
				
			||||||
 | 
								style="@style/columnTitleStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<LinearLayout
 | 
				
			||||||
 | 
								android:orientation="horizontal"
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="wrap_content">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<EditText
 | 
				
			||||||
 | 
									android:layout_width="match_parent"
 | 
				
			||||||
 | 
									android:ems="10"
 | 
				
			||||||
 | 
									android:layout_height="64dp"
 | 
				
			||||||
 | 
									android:singleLine="false"
 | 
				
			||||||
 | 
									android:imeOptions="actionDone"
 | 
				
			||||||
 | 
									android:id="@+id/activitymainEditText2"
 | 
				
			||||||
 | 
									style="@style/contentEditBoxStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<ScrollView
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="150dp"
 | 
				
			||||||
 | 
								android:background="#FFDBDBDB">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<TextView
 | 
				
			||||||
 | 
									android:layout_width="match_parent"
 | 
				
			||||||
 | 
									android:layout_height="wrap_content"
 | 
				
			||||||
 | 
									android:textIsSelectable="true"
 | 
				
			||||||
 | 
									android:id="@+id/activitymainTextView1"
 | 
				
			||||||
 | 
									style="@style/columnTitleStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</ScrollView>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<LinearLayout
 | 
				
			||||||
 | 
								android:orientation="horizontal"
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="65dp"
 | 
				
			||||||
 | 
								android:gravity="center_vertical">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<LinearLayout
 | 
				
			||||||
 | 
									android:orientation="vertical"
 | 
				
			||||||
 | 
									android:layout_width="0dp"
 | 
				
			||||||
 | 
									android:layout_height="match_parent"
 | 
				
			||||||
 | 
									android:layout_weight="1.0"
 | 
				
			||||||
 | 
									android:background="#FF000000"
 | 
				
			||||||
 | 
									android:id="@+id/activitymainLinearLayout1">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<Button
 | 
				
			||||||
 | 
									android:layout_width="40dp"
 | 
				
			||||||
 | 
									android:layout_height="40dp"
 | 
				
			||||||
 | 
									android:text="↻"
 | 
				
			||||||
 | 
									android:onClick="onCleanLog"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							<ScrollView
 | 
				
			||||||
 | 
								android:layout_width="match_parent"
 | 
				
			||||||
 | 
								android:layout_height="0dp"
 | 
				
			||||||
 | 
								android:layout_weight="1.0">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								<LinearLayout
 | 
				
			||||||
 | 
									android:orientation="vertical"
 | 
				
			||||||
 | 
									android:layout_width="match_parent"
 | 
				
			||||||
 | 
									android:layout_height="wrap_content">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									<TextView
 | 
				
			||||||
 | 
										android:layout_width="wrap_content"
 | 
				
			||||||
 | 
										android:layout_height="wrap_content"
 | 
				
			||||||
 | 
										android:id="@+id/activitymainTextView4"
 | 
				
			||||||
 | 
										style="@style/columnTitleStyle"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									<LinearLayout
 | 
				
			||||||
 | 
										android:orientation="horizontal"
 | 
				
			||||||
 | 
										android:layout_width="match_parent"
 | 
				
			||||||
 | 
										android:layout_height="wrap_content">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										<Button
 | 
				
			||||||
 | 
											android:layout_width="40dp"
 | 
				
			||||||
 | 
											android:layout_height="40dp"
 | 
				
			||||||
 | 
											android:text="☆"
 | 
				
			||||||
 | 
											android:id="@+id/activitymainButton1"
 | 
				
			||||||
 | 
											android:onClick="onEnableFavorite"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										<cc.winboll.studio.regexputils.URLEditText
 | 
				
			||||||
 | 
											android:layout_width="0dp"
 | 
				
			||||||
 | 
											android:ems="10"
 | 
				
			||||||
 | 
											android:layout_height="wrap_content"
 | 
				
			||||||
 | 
											android:singleLine="true"
 | 
				
			||||||
 | 
											android:imeOptions="actionDone"
 | 
				
			||||||
 | 
											android:id="@+id/activitymainURLEditText1"
 | 
				
			||||||
 | 
											android:layout_weight="1.0"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										<Button
 | 
				
			||||||
 | 
											android:layout_width="40dp"
 | 
				
			||||||
 | 
											android:layout_height="40dp"
 | 
				
			||||||
 | 
											android:text="▼"
 | 
				
			||||||
 | 
											android:onClick="onShowFavoriteList"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										<Button
 | 
				
			||||||
 | 
											android:layout_width="40dp"
 | 
				
			||||||
 | 
											android:layout_height="40dp"
 | 
				
			||||||
 | 
											android:text="→"
 | 
				
			||||||
 | 
											android:onClick="onGoto"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									<WebView
 | 
				
			||||||
 | 
										android:layout_width="match_parent"
 | 
				
			||||||
 | 
										android:layout_height="wrap_content"
 | 
				
			||||||
 | 
										android:id="@+id/activitymainWebView1"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							</ScrollView>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</LinearLayout>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								regexputils/src/main/res/values-v21/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								regexputils/src/main/res/values-v21/styles.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <style name="AppTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
 | 
				
			||||||
 | 
					        <item name="android:colorPrimary">@color/colorPrimary</item>
 | 
				
			||||||
 | 
					        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
 | 
				
			||||||
 | 
					        <item name="android:colorAccent">@color/colorAccent</item>
 | 
				
			||||||
 | 
					        <item name="android:navigationBarColor">?android:colorPrimary</item>
 | 
				
			||||||
 | 
						</style>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										14
									
								
								regexputils/src/main/res/values-zh/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								regexputils/src/main/res/values-zh/strings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <string name="app_name">正则工具</string>
 | 
				
			||||||
 | 
					    <string name="tv_pattern">语法模板</string>
 | 
				
			||||||
 | 
					    <string name="tv_rewrite">替换模板</string>
 | 
				
			||||||
 | 
					    <string name="tv_matchtext">匹配文本</string>
 | 
				
			||||||
 | 
					    <string name="tv_onlinehelp">联机帮助</string>
 | 
				
			||||||
 | 
					    <string name="sz_patternresult">匹配结果</string>
 | 
				
			||||||
 | 
					    <string name="sz_rewriteresult">替换结果</string>
 | 
				
			||||||
 | 
					    <string name="sz_isnull">为空。</string>
 | 
				
			||||||
 | 
					    <string name="sz_nomatcherfind">没有匹配的字符。</string>
 | 
				
			||||||
 | 
					    <string name="sz_start">开始</string>
 | 
				
			||||||
 | 
					    <string name="sz_end">结束</string>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										10
									
								
								regexputils/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								regexputils/src/main/res/values/colors.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <color name="colorPrimary">#3F51B5</color>
 | 
				
			||||||
 | 
					    <color name="colorPrimaryDark">#303F9F</color>
 | 
				
			||||||
 | 
					    <color name="colorAccent">#FF5771FF</color>
 | 
				
			||||||
 | 
					    <color name="color_2C2C2C">#2C2C2C</color>
 | 
				
			||||||
 | 
					    <color name="color_4C4E55">#4C4E55</color>
 | 
				
			||||||
 | 
					    <color name="black">#FF000000</color>
 | 
				
			||||||
 | 
					    <color name="white">#FFFFFFFF</color>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										16
									
								
								regexputils/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								regexputils/src/main/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <string name="app_name">RegExpUtils</string>
 | 
				
			||||||
 | 
					    <string name="tv_pattern">Pattern</string>
 | 
				
			||||||
 | 
					    <string name="tv_rewrite">Rewrite</string>
 | 
				
			||||||
 | 
					    <string name="tv_matchtext">MatchText</string>
 | 
				
			||||||
 | 
					    <string name="tv_onlinehelp">OnlineHelp</string>
 | 
				
			||||||
 | 
					    <string name="sz_patternresult">PatternResult</string>
 | 
				
			||||||
 | 
					    <string name="sz_rewriteresult">RewriteResult</string>
 | 
				
			||||||
 | 
					    <string name="sz_isnull">is null.</string>
 | 
				
			||||||
 | 
					    <string name="sz_nomatcherfind">No matcher find.</string>
 | 
				
			||||||
 | 
					    <string name="sz_start">Start</string>
 | 
				
			||||||
 | 
					    <string name="sz_end">End</string>
 | 
				
			||||||
 | 
					    <string name="sz_Source">https://toscode.gitee.com/zhangsken/RegExpUtils</string>
 | 
				
			||||||
 | 
					    <string name="sz_defaultonlinehelp">https://tool.oschina.net/uploads/apidocs/jquery/regexp.html</string>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										41
									
								
								regexputils/src/main/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								regexputils/src/main/res/values/styles.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					    <!-- Base application theme. -->
 | 
				
			||||||
 | 
					    <style name="AppTheme" parent="android:Theme.Material.Light.DarkActionBar">
 | 
				
			||||||
 | 
					        <!-- Customize your theme here. -->
 | 
				
			||||||
 | 
					        <item name="android:colorPrimary">@color/colorPrimary</item>
 | 
				
			||||||
 | 
					        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
 | 
				
			||||||
 | 
					        <item name="android:colorAccent">@color/colorAccent</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!--popMenu的Style-->
 | 
				
			||||||
 | 
					    <style name="customPopMenuStyle" >
 | 
				
			||||||
 | 
					        <item name="android:itemBackground">@color/color_2C2C2C</item>
 | 
				
			||||||
 | 
					        <item name="android:dropDownListViewStyle">@style/popmenuDivier</item>
 | 
				
			||||||
 | 
					        <item name="android:textAppearanceSmallPopupMenu">@style/popmeuText</item>
 | 
				
			||||||
 | 
					        <item name="android:textAppearanceLargePopupMenu">@style/popmeuText</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!-- popMenu的背景色-->
 | 
				
			||||||
 | 
					    <style name="popmenuStyle" >
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!--popmenu的字体颜色-->
 | 
				
			||||||
 | 
					    <style name="popmeuText">
 | 
				
			||||||
 | 
					        <item name="android:textColor">@color/white</item>
 | 
				
			||||||
 | 
					        <item name="android:textSize">14sp</item>
 | 
				
			||||||
 | 
					        <item name="android:gravity">center</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!--popMenu分割线的颜色-->
 | 
				
			||||||
 | 
					    <style name="popmenuDivier">
 | 
				
			||||||
 | 
					        <item name="android:divider">@color/color_4C4E55</item>
 | 
				
			||||||
 | 
					        <item name="android:dividerHeight">1px</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!--分栏标题的风格-->
 | 
				
			||||||
 | 
					    <style name="columnTitleStyle" >
 | 
				
			||||||
 | 
					        <item name="android:textSize">12sp</item>
 | 
				
			||||||
 | 
					        <item name="android:textColor">@color/colorAccent</item>
 | 
				
			||||||
 | 
					        <item name="android:gravity">center_vertical</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					    <!--内容编辑框的风格-->
 | 
				
			||||||
 | 
					    <style name="contentEditBoxStyle" >
 | 
				
			||||||
 | 
					        <item name="android:textSize">14sp</item>
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
							
								
								
									
										12
									
								
								regexputils/src/stage/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								regexputils/src/stage/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    xmlns:tools="http://schemas.android.com/tools" >
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <application>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <!-- Put flavor specific code here -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    </application>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</manifest>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								regexputils/src/stage/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								regexputils/src/stage/res/values/strings.xml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<resources>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <!-- Put flavor specific strings here -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</resources>
 | 
				
			||||||
@@ -65,3 +65,7 @@
 | 
				
			|||||||
// WebPageSources 项目编译设置
 | 
					// WebPageSources 项目编译设置
 | 
				
			||||||
//include ':webpagesources'
 | 
					//include ':webpagesources'
 | 
				
			||||||
//rootProject.name = "webpagesources"
 | 
					//rootProject.name = "webpagesources"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RegExpUtils 项目编译设置
 | 
				
			||||||
 | 
					//include ':regexputils'
 | 
				
			||||||
 | 
					//rootProject.name = "regexputils"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user