├── app ├── .gitignore ├── src │ ├── libs │ │ └── README.md │ └── main │ │ ├── ic_launcher-web.png │ │ ├── res │ │ ├── raw │ │ │ └── country.mmdb │ │ ├── drawable │ │ │ ├── qr_code.png │ │ │ └── common_round_rect_white_bg.xml │ │ ├── drawable-hdpi │ │ │ ├── ic_save.png │ │ │ ├── ic_tile.png │ │ │ ├── qr_code.png │ │ │ ├── ic_search.png │ │ │ ├── ic_action_link.png │ │ │ └── ic_action_name.png │ │ ├── drawable-mdpi │ │ │ ├── ic_save.png │ │ │ ├── ic_tile.png │ │ │ ├── qr_code.png │ │ │ ├── ic_search.png │ │ │ ├── ic_action_link.png │ │ │ └── ic_action_name.png │ │ ├── drawable-xhdpi │ │ │ ├── ic_save.png │ │ │ ├── ic_search.png │ │ │ ├── ic_tile.png │ │ │ ├── qr_code.png │ │ │ ├── ic_action_link.png │ │ │ └── ic_action_name.png │ │ ├── drawable-xxhdpi │ │ │ ├── ic_save.png │ │ │ ├── ic_tile.png │ │ │ ├── qr_code.png │ │ │ ├── ic_search.png │ │ │ ├── ic_action_link.png │ │ │ └── ic_action_name.png │ │ ├── drawable-xxxhdpi │ │ │ ├── ic_save.png │ │ │ ├── ic_tile.png │ │ │ ├── qr_code.png │ │ │ ├── ic_search.png │ │ │ ├── ic_action_link.png │ │ │ └── ic_action_name.png │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_foreground.png │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── colors.xml │ │ │ ├── dimens.xml │ │ │ ├── styles.xml │ │ │ ├── strings.xml │ │ │ └── arrays.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── activity_exempt_app.xml │ │ │ ├── activity_server_list.xml │ │ │ ├── item_app_info.xml │ │ │ ├── dialog_loading.xml │ │ │ ├── activity_scan_qrcode.xml │ │ │ ├── fragment_server_list.xml │ │ │ ├── fragment_exempt_app.xml │ │ │ ├── item_server.xml │ │ │ └── activity_main.xml │ │ ├── menu │ │ │ ├── menu_server_list.xml │ │ │ ├── menu_exempt_app.xml │ │ │ └── menu_main.xml │ │ └── xml │ │ │ └── root_preferences.xml │ │ ├── java │ │ └── io │ │ │ └── github │ │ │ └── trojan_gfw │ │ │ └── igniter │ │ │ ├── common │ │ │ ├── mvp │ │ │ │ ├── BasePresenter.java │ │ │ │ └── BaseView.java │ │ │ ├── constants │ │ │ │ └── Constants.java │ │ │ ├── app │ │ │ │ ├── BaseAppCompatActivity.java │ │ │ │ └── BaseFragment.java │ │ │ ├── os │ │ │ │ ├── IThreads.java │ │ │ │ ├── Task.java │ │ │ │ ├── Threads.java │ │ │ │ └── PreferencesProvider.java │ │ │ ├── utils │ │ │ │ ├── PermissionUtils.java │ │ │ │ ├── ProcessUtils.java │ │ │ │ ├── PreferenceUtils.java │ │ │ │ └── SnackbarUtils.java │ │ │ └── dialog │ │ │ │ └── LoadingDialog.java │ │ │ ├── ILogFunction.java │ │ │ ├── initializer │ │ │ ├── Initializer.java │ │ │ ├── ToolInitializer.java │ │ │ ├── MainInitializer.java │ │ │ ├── ProxyInitializer.java │ │ │ └── InitializerHelper.java │ │ │ ├── JNIHelper.java │ │ │ ├── PathHelper.java │ │ │ ├── IgniterApplication.java │ │ │ ├── servers │ │ │ ├── data │ │ │ │ ├── ServerListDataSource.java │ │ │ │ └── ServerListDataManager.java │ │ │ ├── contract │ │ │ │ └── ServerListContract.java │ │ │ ├── activity │ │ │ │ └── ServerListActivity.java │ │ │ ├── fragment │ │ │ │ ├── ServerListAdapter.java │ │ │ │ └── ServerListFragment.java │ │ │ └── presenter │ │ │ │ └── ServerListPresenter.java │ │ │ ├── exempt │ │ │ ├── data │ │ │ │ ├── ExemptAppDataSource.java │ │ │ │ ├── AppInfo.java │ │ │ │ └── ExemptAppDataManager.java │ │ │ ├── contract │ │ │ │ └── ExemptAppContract.java │ │ │ ├── activity │ │ │ │ └── ExemptAppActivity.java │ │ │ ├── adapter │ │ │ │ └── AppInfoAdapter.java │ │ │ ├── presenter │ │ │ │ └── ExemptAppPresenter.java │ │ │ └── fragment │ │ │ │ └── ExemptAppFragment.java │ │ │ ├── TrojanURLHelper.java │ │ │ ├── AboutActivity.java │ │ │ ├── Globals.java │ │ │ ├── qrcode │ │ │ └── ScanQRCodeActivity.java │ │ │ ├── tile │ │ │ ├── ProxyHelper.java │ │ │ └── IgniterTileService.java │ │ │ ├── LogHelper.java │ │ │ ├── connection │ │ │ ├── TestConnection.java │ │ │ └── TrojanConnection.java │ │ │ ├── TrojanConfig.java │ │ │ ├── ClashHelper.java │ │ │ ├── TextViewListener.java │ │ │ └── TrojanHelper.java │ │ ├── aidl │ │ └── io │ │ │ └── github │ │ │ └── trojan_gfw │ │ │ └── igniter │ │ │ └── proxy │ │ │ └── aidl │ │ │ ├── ITrojanServiceCallback.aidl │ │ │ └── ITrojanService.aidl │ │ ├── cpp │ │ ├── jni-helper.cpp │ │ └── CMakeLists.txt │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitmodules ├── gradle.properties ├── README.md ├── .gitignore ├── .circleci └── config.yml ├── gradlew.bat └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /app/src/libs/README.md: -------------------------------------------------------------------------------- 1 | put golibs.aar here. 2 | 3 | ref: 4 | - https://github.com/trojan-gfw/igniter-go-libs 5 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /app/src/main/res/raw/country.mmdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/raw/country.mmdb -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/ic_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/ic_tile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/ic_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/ic_tile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/ic_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/ic_tile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_tile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_save.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_tile.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/qr_code.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_search.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/ic_action_link.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_action_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-hdpi/ic_action_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/ic_action_link.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_action_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-mdpi/ic_action_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/ic_action_link.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_action_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xhdpi/ic_action_name.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_action_link.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_action_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxhdpi/ic_action_name.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_action_link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_action_link.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_action_name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/drawable-xxxhdpi/ic_action_name.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p4gefau1t/trojan-go-android/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #448AFF 4 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/mvp/BasePresenter.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.mvp; 2 | 3 | public interface BasePresenter { 4 | void start(); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/ILogFunction.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | public interface ILogFunction { 4 | public int output(String tag, String msg); 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/mvp/BaseView.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.mvp; 2 | 3 | public interface BaseView { 4 | void setPresenter(T presenter); 5 | } 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #008577 4 | #00574B 5 | #D81B60 6 | 7 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "app/src/main/cpp/trojan"] 2 | path = app/src/main/cpp/trojan 3 | url = https://github.com/trojan-gfw/trojan.git 4 | [submodule "app/src/main/cpp/libs"] 5 | path = app/src/main/cpp/libs 6 | url = https://github.com/trojan-gfw/igniter-libs.git 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/common_round_rect_white_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/initializer/Initializer.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.initializer; 2 | 3 | import android.content.Context; 4 | 5 | public abstract class Initializer { 6 | 7 | public abstract void init(Context context); 8 | 9 | public abstract boolean runsInWorkerThread(); 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/JNIHelper.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | public class JNIHelper { 4 | 5 | public static void trojan(String config) { 6 | trojan.Trojan.runClient(config); 7 | } 8 | 9 | public static void stop() { 10 | trojan.Trojan.stopClient(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 18sp 4 | 55dp 5 | 15dp 6 | 7 | 64dp 8 | 16dp 9 | 10 | 20dp 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_about.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /app/src/main/aidl/io/github/trojan_gfw/igniter/proxy/aidl/ITrojanServiceCallback.aidl: -------------------------------------------------------------------------------- 1 | // ITrojanServiceCallback.aidl 2 | package io.github.trojan_gfw.igniter.proxy.aidl; 3 | 4 | // Declare any non-default types here with import statements 5 | 6 | interface ITrojanServiceCallback { 7 | void onStateChanged(int state, String msg); 8 | void onTestResult(String testUrl, boolean connected, long delay, String error); 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/PathHelper.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | import java.io.File; 4 | 5 | public class PathHelper { 6 | public static String combine(String... paths) { 7 | File file = new File(paths[0]); 8 | 9 | for (int i = 1; i < paths.length; i++) { 10 | file = new File(file, paths[i]); 11 | } 12 | 13 | return file.getPath(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_exempt_app.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_server_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/IgniterApplication.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | import io.github.trojan_gfw.igniter.initializer.InitializerHelper; 7 | 8 | public class IgniterApplication extends Application { 9 | @Override 10 | protected void attachBaseContext(Context base) { 11 | super.attachBaseContext(base); 12 | InitializerHelper.runInit(this); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_server_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/initializer/ToolInitializer.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.initializer; 2 | 3 | import android.content.Context; 4 | 5 | import io.github.trojan_gfw.igniter.Globals; 6 | 7 | /** 8 | * Initializer that runs in Tools Process. 9 | */ 10 | public class ToolInitializer extends Initializer { 11 | 12 | @Override 13 | public void init(Context context) { 14 | Globals.Init(context); 15 | } 16 | 17 | @Override 18 | public boolean runsInWorkerThread() { 19 | return false; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/aidl/io/github/trojan_gfw/igniter/proxy/aidl/ITrojanService.aidl: -------------------------------------------------------------------------------- 1 | // ITrojanService.aidl 2 | package io.github.trojan_gfw.igniter.proxy.aidl; 3 | import io.github.trojan_gfw.igniter.proxy.aidl.ITrojanServiceCallback; 4 | // Declare any non-default types here with import statements 5 | 6 | interface ITrojanService { 7 | int getState(); 8 | void testConnection(String testUrl); 9 | void showDevelopInfoInLogcat(); 10 | oneway void registerCallback(in ITrojanServiceCallback callback); 11 | oneway void unregisterCallback(in ITrojanServiceCallback callback); 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/initializer/MainInitializer.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.initializer; 2 | 3 | import android.content.Context; 4 | 5 | import io.github.trojan_gfw.igniter.Globals; 6 | 7 | /** 8 | * Initializer that runs in Main Process (Default process). 9 | */ 10 | public class MainInitializer extends Initializer { 11 | 12 | @Override 13 | public void init(Context context) { 14 | Globals.Init(context); 15 | } 16 | 17 | @Override 18 | public boolean runsInWorkerThread() { 19 | return false; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/constants/Constants.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.constants; 2 | 3 | public abstract class Constants { 4 | public static final String PREFERENCE_AUTHORITY = "io.github.trojan_gfw.igniter"; 5 | public static final String PREFERENCE_PATH = "preferences"; 6 | public static final String PREFERENCE_URI = "content://" + PREFERENCE_AUTHORITY + "/" + PREFERENCE_PATH; 7 | public static final String PREFERENCE_KEY_ENABLE_CLASH = "enable_clash"; 8 | public static final String PREFERENCE_KEY_FIRST_START = "first_start"; 9 | } 10 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/app/BaseAppCompatActivity.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.app; 2 | 3 | import android.content.Context; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | import androidx.appcompat.app.AppCompatActivity; 8 | 9 | public abstract class BaseAppCompatActivity extends AppCompatActivity { 10 | protected Context mContext; 11 | 12 | @Override 13 | protected void onCreate(@Nullable Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | mContext = this; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/servers/data/ServerListDataSource.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.servers.data; 2 | 3 | import androidx.annotation.WorkerThread; 4 | 5 | import java.util.List; 6 | 7 | import io.github.trojan_gfw.igniter.TrojanConfig; 8 | 9 | public interface ServerListDataSource { 10 | @WorkerThread 11 | List loadServerConfigList(); 12 | @WorkerThread 13 | void deleteServerConfig(TrojanConfig config); 14 | @WorkerThread 15 | void saveServerConfig(TrojanConfig config); 16 | @WorkerThread 17 | void replaceServerConfigs(List list); 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/os/IThreads.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.os; 2 | 3 | import java.util.concurrent.Executor; 4 | 5 | /** 6 | * Interface of thread pool. Provides methods to run {@link Task} or {@link Runnable} in main thread 7 | * or in background. 8 | */ 9 | public interface IThreads { 10 | Executor getThreadPoolExecutor(); 11 | 12 | void runOnUiThread(Runnable runnable); 13 | 14 | void runOnUiThread(Runnable runnable, long delayMillis); 15 | 16 | void runOnWorkThread(Task task); 17 | 18 | void runOnWorkThread(final Task task, long delayMillis); 19 | 20 | void removeDelayedAction(Runnable action); 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_exempt_app.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/utils/PermissionUtils.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.utils; 2 | 3 | import android.Manifest; 4 | import android.content.Context; 5 | import android.content.pm.PackageManager; 6 | 7 | import androidx.core.content.ContextCompat; 8 | 9 | public abstract class PermissionUtils { 10 | 11 | public static boolean hasReadWriteExtStoragePermission(Context context) { 12 | return ContextCompat.checkSelfPermission(context, 13 | Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 14 | && ContextCompat.checkSelfPermission(context, 15 | Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | android.enableJetifier=true 10 | android.useAndroidX=true 11 | org.gradle.jvmargs=-Xmx1536m 12 | # When configured, Gradle will run in incubating parallel mode. 13 | # This option should only be used with decoupled projects. More details, visit 14 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 15 | # org.gradle.parallel=true 16 | 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # igniter 2 | 3 | [![CircleCI](https://circleci.com/gh/trojan-gfw/igniter/tree/master.svg?style=svg)](https://circleci.com/gh/trojan-gfw/igniter/tree/master) 4 | 5 | 6 | A trojan client for Android. 7 | 8 | Get it on Google Play 9 | 10 | 11 | 12 | ## Thanks 13 | 14 | * Dreamacro/clash [GPLv3](https://github.com/Dreamacro/clash/blob/master/LICENSE) 15 | * eycorsican/go-tun2socks [MIT](https://github.com/eycorsican/go-tun2socks/blob/master/LICENSE) 16 | * bingoogolapple/BGAQRCode-Android [Apache License 2.0](https://github.com/bingoogolapple/BGAQRCode-Android) 17 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/os/Task.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.os; 2 | 3 | 4 | import android.os.Process; 5 | 6 | import androidx.annotation.WorkerThread; 7 | 8 | /** 9 | * A wrapper of Runnable. 10 | */ 11 | public abstract class Task implements Runnable { 12 | private int priority = Process.THREAD_PRIORITY_BACKGROUND + Process.THREAD_PRIORITY_MORE_FAVORABLE; 13 | 14 | public Task() { 15 | } 16 | 17 | /** 18 | * Construct a task with priority. 19 | * 20 | * @param priority {@link Process#THREAD_PRIORITY_BACKGROUND} 21 | */ 22 | public Task(int priority) { 23 | this.priority = priority; 24 | } 25 | 26 | @Override 27 | public void run() { 28 | Process.setThreadPriority(priority); 29 | onRun(); 30 | } 31 | 32 | @WorkerThread 33 | public abstract void onRun(); 34 | } 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/exempt/data/ExemptAppDataSource.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.exempt.data; 2 | 3 | import androidx.annotation.WorkerThread; 4 | 5 | import java.util.List; 6 | import java.util.Set; 7 | 8 | public interface ExemptAppDataSource { 9 | /** 10 | * Load exempt applications' package names. 11 | * 12 | * @return exempt applications' package names.. 13 | */ 14 | @WorkerThread 15 | Set loadExemptAppPackageNameSet(); 16 | 17 | /** 18 | * Save exempt applications' package names. 19 | * 20 | * @param exemptAppPackageNames exempt app package name set 21 | */ 22 | @WorkerThread 23 | void saveExemptAppInfoSet(Set exemptAppPackageNames); 24 | 25 | /** 26 | * Load all application info list, including exempt apps and non-exempt apps. 27 | * @return all application info list 28 | */ 29 | @WorkerThread 30 | List getAllAppInfoList(); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/utils/ProcessUtils.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.utils; 2 | 3 | import android.app.ActivityManager; 4 | import android.content.Context; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | import java.util.List; 9 | 10 | import static android.content.Context.ACTIVITY_SERVICE; 11 | 12 | public class ProcessUtils { 13 | 14 | @Nullable 15 | public static String getProcessNameByPID(Context context, int pid) { 16 | ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE); 17 | List runningAppProcesses = am.getRunningAppProcesses(); 18 | if (runningAppProcesses == null) { 19 | return null; 20 | } 21 | for (ActivityManager.RunningAppProcessInfo info : runningAppProcesses) { 22 | if (info.pid == pid) { 23 | return info.processName; 24 | } 25 | } 26 | return null; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_app_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 18 | 19 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_loading.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/TrojanURLHelper.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | import java.net.URI; 4 | 5 | public class TrojanURLHelper { 6 | public static String GenerateTrojanURL(TrojanConfig trojanConfig) { 7 | return null; 8 | } 9 | 10 | public static TrojanConfig ParseTrojanURL(String trojanURLStr) { 11 | URI trojanUri; 12 | try { 13 | trojanUri = new URI(trojanURLStr); 14 | } catch (java.net.URISyntaxException e) { 15 | e.printStackTrace(); 16 | return null; 17 | } 18 | String scheme = trojanUri.getScheme(); 19 | if (scheme == null) { 20 | return null; 21 | } 22 | if (!scheme.equals("trojan")) 23 | return null; 24 | String host = trojanUri.getHost(); 25 | int port = trojanUri.getPort(); 26 | String userInfo = trojanUri.getUserInfo(); 27 | 28 | TrojanConfig retConfig = new TrojanConfig(); 29 | return retConfig; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_scan_qrcode.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/initializer/ProxyInitializer.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.initializer; 2 | 3 | import android.content.Context; 4 | 5 | import io.github.trojan_gfw.igniter.Globals; 6 | import io.github.trojan_gfw.igniter.LogHelper; 7 | import io.github.trojan_gfw.igniter.TrojanConfig; 8 | import io.github.trojan_gfw.igniter.TrojanHelper; 9 | 10 | public class ProxyInitializer extends Initializer { 11 | private static final String TAG = "ProxyInitializer"; 12 | 13 | @Override 14 | public void init(Context context) { 15 | Globals.Init(context); 16 | TrojanConfig cacheConfig = TrojanHelper.readTrojanConfig(Globals.getTrojanConfigPath()); 17 | if (cacheConfig == null) { 18 | LogHelper.e(TAG, "read null trojan config"); 19 | } else { 20 | Globals.setTrojanConfigInstance(cacheConfig); 21 | } 22 | if (!Globals.getTrojanConfigInstance().isValidRunningConfig()) { 23 | LogHelper.e(TAG, "Invalid trojan config!"); 24 | } 25 | } 26 | 27 | @Override 28 | public boolean runsInWorkerThread() { 29 | return false; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/AboutActivity.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | 7 | import androidx.appcompat.app.AppCompatActivity; 8 | import androidx.preference.PreferenceFragmentCompat; 9 | 10 | public class AboutActivity extends AppCompatActivity { 11 | 12 | public static Intent create(Context context) { 13 | return new Intent(context, AboutActivity.class); 14 | } 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.activity_about); 20 | getSupportFragmentManager() 21 | .beginTransaction() 22 | .replace(R.id.settings, new SettingsFragment()) 23 | .commit(); 24 | } 25 | 26 | public static class SettingsFragment extends PreferenceFragmentCompat { 27 | @Override 28 | public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { 29 | setPreferencesFromResource(R.xml.root_preferences, rootKey); 30 | } 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_server_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 24 | 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the ART/Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # android lib 12 | *.aar 13 | 14 | # Generated files 15 | bin/ 16 | gen/ 17 | out/ 18 | app/.cxx/ 19 | 20 | # Gradle files 21 | .gradle/ 22 | build/ 23 | release/ 24 | debug/ 25 | 26 | # Local configuration file (sdk path, etc) 27 | local.properties 28 | 29 | # Proguard folder generated by Eclipse 30 | proguard/ 31 | 32 | # Log Files 33 | *.log 34 | 35 | # Android Studio Navigation editor temp files 36 | .navigation/ 37 | .project 38 | .settings/ 39 | 40 | # Android Studio captures folder 41 | captures/ 42 | 43 | # IntelliJ 44 | *.iml 45 | .idea/ 46 | 47 | # Keystore files 48 | # Uncomment the following line if you do not want to check your keystore files in. 49 | #*.jks 50 | 51 | # External native build folder generated in Android Studio 2.2 and later 52 | .externalNativeBuild 53 | 54 | # Google Services (e.g. APIs or Firebase) 55 | google-services.json 56 | 57 | # Freeline 58 | freeline.py 59 | freeline/ 60 | freeline_project_description.json 61 | 62 | # fastlane 63 | fastlane/report.xml 64 | fastlane/Preview.html 65 | fastlane/screenshots 66 | fastlane/test_output 67 | fastlane/readme.md 68 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_exempt_app.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 26 | 27 | -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | working_directory: ~/code 5 | docker: 6 | - image: circleci/android:api-28 7 | environment: 8 | JVM_OPTS: -Xmx4G 9 | steps: 10 | - checkout 11 | - run: 12 | name: Pull Submodules 13 | command: git submodule update --init --recursive --remote 14 | - run: 15 | name: Download Go Libs 16 | command: curl -L https://github.com/trojan-gfw/igniter-go-libs/releases/download/1.17/golibs.aar > app/src/libs/golibs.aar 17 | - restore_cache: 18 | key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} 19 | - run: 20 | name: Download Dependencies 21 | command: ./gradlew androidDependencies 22 | - save_cache: 23 | paths: 24 | - ~/.gradle 25 | key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} 26 | - run: 27 | name: Run Tests 28 | command: ./gradlew lint test 29 | - store_test_results: 30 | path: app/build/test-results 31 | destination: test-results/ 32 | - run: 33 | name: Initial build 34 | command: ./gradlew clean assembleRelease --no-daemon --stacktrace 35 | - store_artifacts: 36 | path: app/build/outputs/apk/ 37 | destination: apks/ 38 | -------------------------------------------------------------------------------- /app/src/main/res/xml/root_preferences.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 9 | 12 | 15 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 27 | 28 | 31 | 32 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/exempt/contract/ExemptAppContract.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.exempt.contract; 2 | 3 | import androidx.annotation.AnyThread; 4 | import androidx.annotation.UiThread; 5 | 6 | import java.util.List; 7 | 8 | import io.github.trojan_gfw.igniter.common.mvp.BasePresenter; 9 | import io.github.trojan_gfw.igniter.common.mvp.BaseView; 10 | import io.github.trojan_gfw.igniter.exempt.data.AppInfo; 11 | 12 | public interface ExemptAppContract { 13 | interface Presenter extends BasePresenter { 14 | void updateAppInfo(AppInfo appInfo, int position, boolean exempt); 15 | 16 | void saveExemptAppInfoList(); 17 | 18 | /** 19 | * @return true if exit directly, false to cancel exiting. 20 | */ 21 | boolean handleBackPressed(); 22 | 23 | void filterAppsByName(String name); 24 | 25 | void exit(); 26 | } 27 | 28 | interface View extends BaseView { 29 | @UiThread 30 | void showLoading(); 31 | 32 | @UiThread 33 | void dismissLoading(); 34 | 35 | @UiThread 36 | void showSaveSuccess(); 37 | 38 | @UiThread 39 | void showExitConfirm(); 40 | 41 | @UiThread 42 | void showAppList(List packageNames); 43 | 44 | @AnyThread 45 | void exit(boolean configurationChanged); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/common/dialog/LoadingDialog.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.common.dialog; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.graphics.Color; 6 | import android.graphics.PorterDuff; 7 | import android.graphics.drawable.ColorDrawable; 8 | import android.view.Window; 9 | import android.widget.TextView; 10 | 11 | import androidx.annotation.NonNull; 12 | import androidx.core.content.ContextCompat; 13 | import androidx.core.widget.ContentLoadingProgressBar; 14 | 15 | import io.github.trojan_gfw.igniter.R; 16 | 17 | public class LoadingDialog extends Dialog { 18 | private TextView mMsgTv; 19 | 20 | public LoadingDialog(@NonNull Context context) { 21 | super(context); 22 | init(context); 23 | } 24 | 25 | private void init(Context context) { 26 | Window window =getWindow(); 27 | if (window != null) { 28 | window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 29 | } 30 | setContentView(R.layout.dialog_loading); 31 | ContentLoadingProgressBar pb = findViewById(R.id.dialogLoadingPb); 32 | pb.getIndeterminateDrawable().setColorFilter(ContextCompat.getColor(context, R.color.colorPrimary), 33 | PorterDuff.Mode.MULTIPLY); 34 | mMsgTv = findViewById(R.id.dialogLoadingMsgTv); 35 | } 36 | 37 | public void setMsg(String msg) { 38 | mMsgTv.setText(msg); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/io/github/trojan_gfw/igniter/servers/contract/ServerListContract.java: -------------------------------------------------------------------------------- 1 | package io.github.trojan_gfw.igniter.servers.contract; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | 6 | import java.util.List; 7 | 8 | import io.github.trojan_gfw.igniter.TrojanConfig; 9 | import io.github.trojan_gfw.igniter.common.mvp.BasePresenter; 10 | import io.github.trojan_gfw.igniter.common.mvp.BaseView; 11 | 12 | public interface ServerListContract { 13 | interface Presenter extends BasePresenter { 14 | void addServerConfig(String trojanUrl); 15 | void handleServerSelection(TrojanConfig config); 16 | void deleteServerConfig(TrojanConfig config, int pos); 17 | void gotoScanQRCode(); 18 | void displayImportFileDescription(); 19 | void hideImportFileDescription(); 20 | void importConfigFromFile(); 21 | void parseConfigsInFileStream(Context context, Uri fileUri); 22 | } 23 | 24 | interface View extends BaseView { 25 | void showAddTrojanConfigSuccess(); 26 | void showQRCodeScanError(String scanContent); 27 | void selectServerConfig(TrojanConfig config); 28 | void showServerConfigList(List configs); 29 | void removeServerConfig(TrojanConfig config, int pos); 30 | void gotoScanQRCode(); 31 | void showImportFileDescription(); 32 | void dismissImportFileDescription(); 33 | void openFileChooser(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_server.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 18 | 19 |