From 6ffb7f87d6a51826789a2227126d6573bbf893db Mon Sep 17 00:00:00 2001 From: wenyifan Date: Sun, 15 Jan 2023 20:40:43 +0800 Subject: [PATCH] Commit --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/gradle.xml | 19 ++ .idea/misc.xml | 10 + .idea/vcs.xml | 6 + README.md | 5 + app/.gitignore | 2 + app/build.gradle | 61 ++++ app/mybins/.gitignore | 1 + app/proguard-rules.pro | 21 ++ .../evan/gost/ExampleInstrumentedTest.java | 26 ++ app/src/main/AndroidManifest.xml | 37 +++ .../main/java/run/evan/gost/MainActivity.java | 300 ++++++++++++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++ app/src/main/res/layout/activity_main.xml | 73 +++++ app/src/main/res/layout/item_dropdown.xml | 7 + app/src/main/res/layout/item_select.xml | 4 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-zh-rCN/strings.xml | 18 ++ app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/strings.xml | 17 + app/src/main/res/values/themes.xml | 8 + app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 ++ .../java/run/evan/gost/ExampleUnitTest.java | 17 + build.gradle | 5 + gradle.properties | 21 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 +++++++++++ gradlew.bat | 89 ++++++ settings.gradle | 18 ++ 45 files changed, 1228 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/mybins/.gitignore create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/run/evan/gost/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/run/evan/gost/MainActivity.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/item_dropdown.xml create mode 100644 app/src/main/res/layout/item_select.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values-zh-rCN/strings.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/run/evan/gost/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..a2d7c21 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..bdd9278 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e8a8874 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# GOST安卓版 ++ 免root使用GOST ++ 支持保存配置,切换配置 ++ 此源码不包含gost二进制so文件,需要自行使用Android NDK交叉编译 ++ 内部使用,请勿外传 \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..956c004 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +/build +/release \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..675fe71 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,61 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'run.evan.gost' + compileSdk 32 + + defaultConfig { + applicationId "run.evan.gost" + minSdk 26 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + packagingOptions { + jniLibs { + useLegacyPackaging true + } + } + +} + + +task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') { + destinationDir file("$buildDir/native-libs") + baseName 'native-libs' + from fileTree(dir: 'mybins', include: '**/*') + into 'lib/' +} +tasks.withType(JavaCompile) + { + compileTask -> compileTask.dependsOn(nativeLibsToJar) + } + + +dependencies { + implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.7.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.4' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' +} + + + diff --git a/app/mybins/.gitignore b/app/mybins/.gitignore new file mode 100644 index 0000000..f1fe8d1 --- /dev/null +++ b/app/mybins/.gitignore @@ -0,0 +1 @@ +*.so \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/run/evan/gost/ExampleInstrumentedTest.java b/app/src/androidTest/java/run/evan/gost/ExampleInstrumentedTest.java new file mode 100644 index 0000000..651e943 --- /dev/null +++ b/app/src/androidTest/java/run/evan/gost/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package run.evan.gost; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("run.evan.gost", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..aae2d55 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/run/evan/gost/MainActivity.java b/app/src/main/java/run/evan/gost/MainActivity.java new file mode 100644 index 0000000..f7df22b --- /dev/null +++ b/app/src/main/java/run/evan/gost/MainActivity.java @@ -0,0 +1,300 @@ +package run.evan.gost; + +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.SharedPreferences; +import android.content.res.ColorStateList; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.text.InputType; +import android.text.method.ScrollingMovementMethod; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.lang.ref.WeakReference; +import java.util.Map; + +public class MainActivity extends AppCompatActivity { + + Button btnSave; + + Button btnDelete; + + Button btnStart; + + EditText textView1; + + EditText configEditText; + + Process process; + + SharedPreferences configPreferences; + + SharedPreferences appPreferences; + + ArrayAdapter starAdapter; + + MyHandler handler = new MyHandler(this); + + private static final String TAG = "run.evan.gost"; + + + private static class MyHandler extends Handler { + + + private WeakReference weakReference; + + public MyHandler(MainActivity activity) { + this.weakReference = new WeakReference(activity); + } + + @Override + public void handleMessage(Message msg) { + MainActivity activity = weakReference.get(); + super.handleMessage(msg); + + + if (null != activity) { + switch (msg.what) { + case 1: + activity.textView1.append(msg.obj.toString()); + activity.textView1.setSelection(activity.textView1.getText().length()); + break; + case 2: + activity.btnStart.setText(R.string.btn_stop); + activity.btnStart.setBackgroundTintList(ColorStateList.valueOf(-1499549)); + break; + case 3: + activity.btnStart.setText(R.string.btn_start); + activity.btnStart.setBackgroundTintList(ColorStateList.valueOf(-11751600)); + default: + } + } + } + } + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + textView1 = findViewById(R.id.textView); + textView1.setMovementMethod(ScrollingMovementMethod.getInstance()); + configEditText = findViewById(R.id.configEditText); + configPreferences = getSharedPreferences("config", MODE_PRIVATE); + appPreferences = getSharedPreferences("app", MODE_PRIVATE); + + + Spinner sp = findViewById(R.id.spinner); + starAdapter = new ArrayAdapter(this, R.layout.item_select); + starAdapter.setDropDownViewResource(R.layout.item_dropdown); + sp.setAdapter(starAdapter); + reloadConfig(); + //给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法 + sp.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView adapterView, View view, int i, long l) { + configEditText.setText(configPreferences.getString(adapterView.getSelectedItem().toString(), "")); + } + + @Override + public void onNothingSelected(AdapterView adapterView) { + configEditText.setText(""); + } + }); + + + btnSave = findViewById(R.id.button1); + btnDelete = findViewById(R.id.button2); + btnStart = findViewById(R.id.button3); + MainActivity mainActivity = this; + btnSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + String config = configEditText.getText().toString(); + if ("".contains(config)) { + Toast.makeText(getApplicationContext(), R.string.toast_tip_config_empty, Toast.LENGTH_LONG).show(); + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity); + builder.setTitle(R.string.title_config_box); + final EditText input = new EditText(mainActivity); + input.setInputType(InputType.TYPE_CLASS_TEXT); + Object selectedItem = sp.getSelectedItem(); + input.setText(selectedItem == null ? "" : selectedItem.toString()); + builder.setView(input); + + builder.setPositiveButton(R.string.title_btn_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String configName = input.getText().toString(); + if ("".contains(configName)) { + Toast.makeText(getApplicationContext(), R.string.toast_tip_empty, Toast.LENGTH_LONG).show(); + return; + } + SharedPreferences.Editor edit = configPreferences.edit(); + edit.putString(configName, config); + edit.apply(); + reloadConfig(); + } + }); + builder.setNegativeButton(R.string.title_btn_cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.show(); + + + } + }); + + btnDelete.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + if (null == sp.getSelectedItem()) { + Toast.makeText(getApplicationContext(), R.string.tip_config_not_selected, Toast.LENGTH_LONG).show(); + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity); + builder.setTitle(R.string.title_confirm); + builder.setPositiveButton(R.string.title_yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String key = sp.getSelectedItem().toString(); + SharedPreferences.Editor edit = configPreferences.edit(); + edit.remove(key); + edit.apply(); + reloadConfig(); + } + }); + builder.setNegativeButton(R.string.title_no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.show(); + } + }); + + btnStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String basedir = getApplication().getApplicationInfo().nativeLibraryDir; + String config = configEditText.getText().toString(); + + if (process == null) { + if ("".contains(config)) { + Toast.makeText(getApplicationContext(), R.string.toast_tip_config_empty, Toast.LENGTH_LONG).show(); + return; + } + new Thread(new Runnable() { + @Override + public void run() { + + try { + + process = Runtime.getRuntime().exec(basedir + "/libgost.so " + config); + BufferedReader successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); + BufferedReader errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); + + + new Thread(new Runnable() { + @Override + public void run() { + try { + String s; + while ((s = successResult.readLine()) != null) { + if (s.startsWith("WARNING: linker:")) { + continue; + } + sendTextToUI(s + "\n"); + } + } catch (Exception e) { + + } + } + }).start(); + + new Thread(new Runnable() { + @Override + public void run() { + try { + String s; + while ((s = errorResult.readLine()) != null) { + if (s.startsWith("WARNING: linker:")) { + continue; + } + sendTextToUI(s + "\n"); + } + } catch (Exception e) { + + } + } + }).start(); + + Message msg = new Message(); + msg.what = 2; + handler.sendMessage(msg); + + process.waitFor(); + process.destroy(); + process = null; + Message msg2 = new Message(); + msg2.what = 3; + handler.sendMessage(msg2); + + } catch (Exception e) { + sendTextToUI(e.getMessage()); + Message msg = new Message(); + msg.what = 3; + handler.sendMessage(msg); + } + } + }).start(); + + } else { + process.destroy(); + } + + + } + }); + + } + + private void reloadConfig() { + starAdapter.clear(); + Map all = configPreferences.getAll(); + for (String s : all.keySet()) { + starAdapter.add(s); + } + } + + private void sendTextToUI(String str) { + Message msg = new Message(); + msg.what = 1; + msg.obj = str; + handler.sendMessage(msg); + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..35bf19f --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + +