├── .gitignore ├── Android Version ├── .gitignore ├── .idea │ ├── .name │ ├── compiler.xml │ ├── copyright │ │ └── profiles_settings.xml │ ├── encodings.xml │ ├── gradle.xml │ ├── libraries │ │ ├── appcompat_v7_22_0_0.xml │ │ ├── support_annotations_22_0_0.xml │ │ └── support_v4_22_0_0.xml │ ├── misc.xml │ ├── modules.xml │ ├── runConfigurations.xml │ ├── vcs.xml │ └── workspace.xml ├── LICENSE ├── SimpleNetkeeper.iml ├── app │ ├── .gitignore │ ├── app.iml │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── cn │ │ │ └── sunflyer │ │ │ └── simplenetkeeper │ │ │ └── ApplicationTest.java │ │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── cn │ │ │ └── sunflyer │ │ │ ├── simplenetkeeper │ │ │ ├── AccountActivity.java │ │ │ ├── BackgroundDialerReceiver.java │ │ │ ├── ConfigRouter.java │ │ │ ├── FirstRun.java │ │ │ ├── OntimeDial.java │ │ │ ├── Options.java │ │ │ ├── ui │ │ │ │ ├── SDialog.java │ │ │ │ └── WaitingUi.java │ │ │ └── util │ │ │ │ ├── AndroidTools.java │ │ │ │ └── WifiAdmin.java │ │ │ └── simpnk │ │ │ ├── annotation │ │ │ ├── Config.java │ │ │ └── ConfigLoad.java │ │ │ ├── control │ │ │ ├── AccountController.java │ │ │ ├── AppInfo.java │ │ │ ├── Base64.java │ │ │ ├── ConfigController.java │ │ │ ├── DialController.java │ │ │ ├── Log.java │ │ │ ├── MessageHandler.java │ │ │ └── StatusController.java │ │ │ ├── netkeeper │ │ │ ├── CXKUsername.java │ │ │ └── MD5.java │ │ │ └── obj │ │ │ ├── Router.java │ │ │ ├── RouterMecuryTPF.java │ │ │ ├── RouterMecuryTpNew.java │ │ │ ├── RouterTpLinkNew.java │ │ │ └── WiFiInfo.java │ │ └── res │ │ ├── anim │ │ └── rotate_repeat.xml │ │ ├── drawable │ │ ├── aperture.png │ │ ├── arrowtop.png │ │ ├── badge.png │ │ ├── button.xml │ │ ├── button_list_a.xml │ │ ├── button_qd.xml │ │ ├── error.png │ │ ├── file.png │ │ ├── input.xml │ │ ├── input_bottom.xml │ │ ├── input_middle.xml │ │ ├── load.gif │ │ ├── ok.png │ │ ├── spinner.xml │ │ ├── w1.png │ │ ├── w10.png │ │ ├── w11.png │ │ ├── w2.png │ │ ├── w3.png │ │ ├── w4.png │ │ ├── w5.png │ │ ├── w6.png │ │ ├── w7.png │ │ ├── w8.png │ │ ├── w9.png │ │ ├── wait_anim.xml │ │ └── wifi.png │ │ ├── layout │ │ ├── activity_account.xml │ │ ├── activity_config_router.xml │ │ ├── activity_first_run.xml │ │ ├── activity_ontime_dial.xml │ │ ├── activity_options.xml │ │ ├── ques_dialog.xml │ │ ├── spinner_list.xml │ │ └── waiting_layout.xml │ │ ├── menu │ │ ├── menu_config_router.xml │ │ ├── menu_first_run.xml │ │ └── menu_options.xml │ │ ├── mipmap-hdpi │ │ ├── applogo.jpg │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ ├── applogo.jpg │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── applogo.jpg │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ ├── applogo.jpg │ │ └── ic_launcher.png │ │ ├── values-v11 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values │ │ ├── attrs.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ ├── strings_activity_options.xml │ │ └── styles.xml │ │ └── xml │ │ ├── pref_data_sync.xml │ │ ├── pref_general.xml │ │ ├── pref_headers.xml │ │ └── pref_notification.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle ├── ChangeLog.txt ├── DialLib ├── SimpNKRasDialLib.cpp ├── SimpNKRasDialLib.rc ├── SimpNKRasDialLibx64.dll ├── SimpNKRasDialLibx86.dll ├── cqxinli_ClickDial.h ├── dllmain.cpp ├── resource.h ├── stdafx.cpp ├── stdafx.h └── targetver.h ├── Netkeeper For Router使用文档.docx ├── PinCodeReverse.cs ├── README.md ├── UDP心跳计算.php ├── src ├── ExportHeadFile.bat ├── cn │ └── sunflyer │ │ └── simpnk │ │ ├── annotation │ │ └── Config.java │ │ ├── control │ │ ├── AppInfo.java │ │ ├── Base64.java │ │ ├── ConfigController.java │ │ ├── DialController.java │ │ ├── Log.java │ │ ├── MainClass.java │ │ ├── MessageController.java │ │ ├── PluginController.java │ │ ├── StatusController.java │ │ └── UIController.java │ │ ├── model │ │ └── AppEntry.java │ │ ├── netkeeper │ │ ├── CXKUsername.java │ │ └── MD5.java │ │ ├── obj │ │ ├── Bundle.java │ │ ├── Message.java │ │ ├── PluginConfig.java │ │ ├── PluginDial.java │ │ ├── PluginRouter.java │ │ ├── Router.java │ │ ├── RouterMecuryTPF.java │ │ ├── RouterMecuryTpNew.java │ │ └── WiFiInfo.java │ │ └── ui │ │ ├── FrameRouter.java │ │ ├── PanelDialLocal.java │ │ ├── PanelInput.java │ │ ├── PanelOperation.java │ │ └── PanelPassword.java └── cqxinli │ └── ClickDial.java ├── 使用说明.txt ├── 关于路由器的使用办法.pdf ├── 湖北掌大宽带密码获取协议 ├── 湖北电信免心跳不限时长登录.cs ├── 点击我运行.bat └── 重庆电信动态密码.php /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 12 | hs_err_pid* 13 | -------------------------------------------------------------------------------- /Android Version/.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | 19 | # Local configuration file (sdk path, etc) 20 | local.properties 21 | 22 | # Proguard folder generated by Eclipse 23 | proguard/ 24 | 25 | # Log Files 26 | *.log 27 | 28 | # Android Studio Navigation editor temp files 29 | .navigation/ 30 | 31 | # Android Studio captures folder 32 | captures/ 33 | -------------------------------------------------------------------------------- /Android Version/.idea/.name: -------------------------------------------------------------------------------- 1 | SimpleNetkeeper -------------------------------------------------------------------------------- /Android Version/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Android Version/.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Android Version/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Android Version/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /Android Version/.idea/libraries/appcompat_v7_22_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Android Version/.idea/libraries/support_annotations_22_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Android Version/.idea/libraries/support_v4_22_0_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /Android Version/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 19 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | Android Lint 39 | 40 | 41 | Internationalization issues 42 | 43 | 44 | Internationalization issuesJava 45 | 46 | 47 | Java 48 | 49 | 50 | 51 | 52 | Android 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 74 | 75 | 76 | 77 | 78 | 79 | 84 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Android Version/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Android Version/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /Android Version/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Android Version/SimpleNetkeeper.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Android Version/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /Android Version/app/app.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 8 | 9 | 10 | 11 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Android Version/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "21.1.2" 6 | 7 | defaultConfig { 8 | applicationId "cn.sunflyer.simplenetkeeper" 9 | minSdkVersion 15 10 | targetSdkVersion 22 11 | versionCode 68 12 | versionName "1.3.3.68" 13 | } 14 | buildTypes { 15 | release { 16 | // 不显示Log 17 | buildConfigField "boolean", "LOG_DEBUG", "false" 18 | //混淆 19 | minifyEnabled true 20 | //Zipalign优化 21 | zipAlignEnabled true 22 | 23 | // 移除无用的resource文件 24 | shrinkResources true 25 | //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明 26 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | } 30 | 31 | dependencies { 32 | compile fileTree(dir: 'libs', include: ['*.jar']) 33 | compile 'com.android.support:appcompat-v7:22.0.0' 34 | compile 'com.android.support:support-v4:22.0.0' 35 | } 36 | -------------------------------------------------------------------------------- /Android Version/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -keep class cn.sunflyer.simpnk.control.AccountController{ *;} 19 | -keep class cn.sunflyer.simpnk.control.StatusController{ *;} -------------------------------------------------------------------------------- /Android Version/app/src/androidTest/java/cn/sunflyer/simplenetkeeper/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simplenetkeeper; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /Android Version/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 24 | 25 | 26 | 27 | 28 | 29 | 33 | 34 | 38 | 39 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simplenetkeeper/ConfigRouter.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simplenetkeeper; 2 | 3 | import android.content.Intent; 4 | import android.graphics.Color; 5 | import android.app.Activity; 6 | import android.os.Bundle; 7 | import android.os.Environment; 8 | import android.os.Handler; 9 | import android.os.Message; 10 | import android.view.Menu; 11 | import android.view.MenuItem; 12 | import android.view.View; 13 | import android.widget.Button; 14 | import android.widget.TextView; 15 | 16 | import cn.sunflyer.simplenetkeeper.util.AndroidTools; 17 | import cn.sunflyer.simpnk.annotation.Config; 18 | import cn.sunflyer.simpnk.control.ConfigController; 19 | import cn.sunflyer.simpnk.control.DialController; 20 | import cn.sunflyer.simpnk.control.Log; 21 | import cn.sunflyer.simpnk.control.MessageHandler; 22 | import cn.sunflyer.simpnk.control.StatusController; 23 | 24 | 25 | public class ConfigRouter extends Activity { 26 | 27 | //控件组 28 | private Button mButConnect ; 29 | private Button mButGuide; 30 | private TextView mTvConnect; 31 | private TextView mTvGuide; 32 | private Button mButHelp; 33 | private Button mButOnTimeDial; 34 | private Button mButChangeInfo; 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | 40 | setContentView(R.layout.activity_config_router); 41 | 42 | ConfigController.setConfigPath(this.getFilesDir().toString()); 43 | //加载配置文件状态 44 | StatusController.initStatus(this.getFilesDir().toString()); 45 | 46 | this.initComponent(); 47 | this.initComponentEvent(); 48 | this.initStateHandler(); 49 | } 50 | 51 | 52 | /** 53 | * 初始化组件连接 54 | * */ 55 | private void initComponent(){ 56 | this.mButConnect = (Button)findViewById(R.id.but_connect); 57 | this.mButGuide = (Button)findViewById(R.id.but_guide); 58 | this.mTvConnect = (TextView)findViewById(R.id.str_main_tip_connect); 59 | this.mTvGuide = (TextView)findViewById(R.id.main_view_tip_guide); 60 | this.mButHelp = (Button)findViewById(R.id.but_about); 61 | this.mButOnTimeDial=(Button)findViewById(R.id.but_ontime); 62 | this.mButChangeInfo = (Button)findViewById(R.id.but_changeinfo); 63 | 64 | if(!StatusController.isConfigExists){ 65 | this.mTvConnect.setVisibility(View.INVISIBLE); 66 | this.mButConnect.setEnabled(false); 67 | this.mButConnect.setBackgroundColor(Color.GRAY); 68 | this.mButChangeInfo.setVisibility(View.INVISIBLE); 69 | this.mTvGuide.setText("这是你首次使用,请从设置向导开始"); 70 | }else{ 71 | this.mTvGuide.setText("Wifi状态:" + (!AndroidTools.isWifiNetwork(this) ? "未连接到无线网络" : "已连接到无线网络 " + AndroidTools.getWifiName(this))); 72 | } 73 | } 74 | 75 | /** 76 | * 初始化组件的事件 77 | * */ 78 | private void initComponentEvent(){ 79 | 80 | //一键连接的操作 81 | this.mButConnect.setOnClickListener(new View.OnClickListener() { 82 | @Override 83 | public void onClick(View v) { 84 | Intent pActIntent = new Intent(); 85 | pActIntent.setClass(ConfigRouter.this,AccountActivity.class); 86 | pActIntent.putExtra("from", "index"); 87 | pActIntent.putExtra("autodial",true); 88 | startActivity(pActIntent); 89 | } 90 | }); 91 | 92 | this.mButGuide.setOnClickListener(new View.OnClickListener() { 93 | @Override 94 | public void onClick(View v) { 95 | Intent pActIntent = new Intent(); 96 | pActIntent.setClass(ConfigRouter.this, FirstRun.class); 97 | pActIntent.putExtra("isFirstRun", !StatusController.isConfigExists); 98 | startActivity(pActIntent); 99 | } 100 | }); 101 | 102 | this.mButOnTimeDial.setOnClickListener(new View.OnClickListener() { 103 | @Override 104 | public void onClick(View v) { 105 | Intent pActIntent = new Intent(); 106 | pActIntent.setClass(ConfigRouter.this,OntimeDial.class); 107 | pActIntent.putExtra("isFirstRun",!StatusController.isConfigExists); 108 | startActivity(pActIntent); 109 | } 110 | }); 111 | 112 | this.mButChangeInfo.setOnClickListener(new View.OnClickListener() { 113 | @Override 114 | public void onClick(View v) { 115 | Intent pActIntent = new Intent(); 116 | pActIntent.setClass(ConfigRouter.this, AccountActivity.class); 117 | pActIntent.putExtra("from", "index"); 118 | startActivity(pActIntent); 119 | } 120 | }); 121 | 122 | this.mButHelp.setOnClickListener(new View.OnClickListener() { 123 | @Override 124 | public void onClick(View v) { 125 | Intent pActIntent = new Intent(); 126 | pActIntent.setClass(ConfigRouter.this, Options.class); 127 | pActIntent.putExtra("from", "index"); 128 | startActivity(pActIntent); 129 | } 130 | }); 131 | } 132 | 133 | /** 134 | * 初始化处理程序 135 | * */ 136 | private void initStateHandler(){ 137 | 138 | } 139 | 140 | 141 | } 142 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simplenetkeeper/ui/SDialog.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simplenetkeeper.ui; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.content.Intent; 6 | import android.os.Bundle; 7 | import android.view.KeyEvent; 8 | import android.view.View; 9 | import android.view.Window; 10 | import android.widget.Button; 11 | import android.widget.LinearLayout; 12 | import android.widget.TextView; 13 | 14 | import cn.sunflyer.simplenetkeeper.R; 15 | 16 | /** 17 | * Created by 陈耀璇 on 2015/5/24.
18 | * 继承自Dialog类,由于个人水平问题,因此这个对话框在消失后会被释放(dismiss)掉。除非手动指定每个按钮的监听事件处理过程。
19 | * 为了修改这个窗口的标题和文本内容,请使用 setWindowTitle 和 setWindowContent 方法。
20 | * 请注意:请在调用show()方法后再设置文本内容,否则会提示空指针错误,这个操作与onCreate方法调用时机有关
21 | */ 22 | public class SDialog extends Dialog{ 23 | 24 | Context context; 25 | 26 | private TextView mTvTitle; 27 | private TextView mTvContent; 28 | 29 | private Button mButOk; 30 | private Button mButNo; 31 | 32 | public SDialog(Context c) { 33 | super(c , R.style.SDialog); 34 | this.context = c; 35 | super.onStart(); 36 | } 37 | 38 | public void onCreate(Bundle savedInstanceState) { 39 | requestWindowFeature(Window.FEATURE_NO_TITLE); 40 | requestWindowFeature(Window.PROGRESS_VISIBILITY_ON); 41 | super.onCreate(savedInstanceState); 42 | 43 | setContentView(R.layout.ques_dialog); 44 | /**私有变量初始化*/ 45 | this.initComponentVar(); 46 | } 47 | 48 | /**初始化组件变量*/ 49 | private void initComponentVar(){ 50 | this.mTvTitle = (TextView)findViewById(R.id.qd_title); 51 | this.mTvContent = (TextView)findViewById(R.id.qd_con); 52 | 53 | this.mButNo = (Button)findViewById(R.id.qd_but_no); 54 | this.mButOk = (Button)findViewById(R.id.qd_but_ok); 55 | 56 | this.setOnTouchOutsideCloseWindow(false); 57 | } 58 | 59 | private final View.OnClickListener DEFAULT_LISTENER = new View.OnClickListener(){ 60 | 61 | @Override 62 | public void onClick(View v) { 63 | hide(); 64 | dismiss(); 65 | } 66 | }; 67 | 68 | public SDialog setPositiveListener(View.OnClickListener i){ 69 | this.mButOk.setOnClickListener(i == null ? DEFAULT_LISTENER : i); 70 | return this; 71 | } 72 | 73 | public SDialog setNegativeListener(View.OnClickListener i){ 74 | this.mButNo.setOnClickListener(i == null ? DEFAULT_LISTENER : i); 75 | return this; 76 | } 77 | 78 | public SDialog setWindowTitle(CharSequence t){ 79 | if(t != null) 80 | this.mTvTitle.setText(t); 81 | return this; 82 | } 83 | 84 | public SDialog setWindowContent(CharSequence t){ 85 | if(t != null) 86 | this.mTvContent.setText(t); 87 | return this; 88 | } 89 | 90 | public SDialog setOnTouchOutsideCloseWindow(boolean i){ 91 | this.setCanceledOnTouchOutside(i); 92 | return this; 93 | } 94 | 95 | public SDialog setPositiveText(CharSequence i){ 96 | if( i != null && !i.equals("")){ 97 | this.mButOk.setText(i); 98 | this.mButOk.setVisibility(View.VISIBLE); 99 | } 100 | return this; 101 | } 102 | 103 | public SDialog setNegativeText(CharSequence i){ 104 | if( i != null && !i.equals("")){ 105 | this.mButNo.setText(i); 106 | this.mButNo.setVisibility(View.VISIBLE); 107 | } 108 | return this; 109 | } 110 | 111 | public SDialog setPositiveButton(CharSequence i,View.OnClickListener c){ 112 | this.setPositiveText(i); 113 | this.setPositiveListener(c); 114 | return this; 115 | } 116 | 117 | public SDialog setNegativeButton(CharSequence i,View.OnClickListener c){ 118 | this.setNegativeText(i); 119 | this.setNegativeListener(c); 120 | return this; 121 | } 122 | 123 | public boolean onKeyDown(int keyCode, KeyEvent event) { 124 | if (keyCode == KeyEvent.KEYCODE_BACK) { 125 | // 按下了键盘上返回按钮 126 | this.hide(); 127 | return true; 128 | } 129 | return false; 130 | } 131 | 132 | public void show(){ 133 | super.show(); 134 | } 135 | 136 | public void hide(){ 137 | super.hide(); 138 | } 139 | 140 | } 141 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simplenetkeeper/ui/WaitingUi.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simplenetkeeper.ui; 2 | 3 | import android.app.Dialog; 4 | import android.content.Context; 5 | import android.graphics.Bitmap; 6 | import android.graphics.Color; 7 | import android.graphics.drawable.AnimationDrawable; 8 | import android.os.Bundle; 9 | import android.view.Gravity; 10 | import android.view.KeyEvent; 11 | import android.view.Window; 12 | import android.view.animation.Animation; 13 | import android.view.animation.AnimationUtils; 14 | import android.view.animation.LinearInterpolator; 15 | import android.widget.FrameLayout; 16 | import android.widget.ImageView; 17 | import android.widget.TextView; 18 | 19 | import org.w3c.dom.Text; 20 | 21 | import cn.sunflyer.simplenetkeeper.R; 22 | 23 | /** 24 | * Created by 陈耀璇 on 2015/4/15. 25 | */ 26 | public class WaitingUi extends Dialog { 27 | Context context; 28 | 29 | private ImageView mLoading; 30 | private TextView mText; 31 | private AnimationDrawable pAnimDraw; 32 | 33 | private CharSequence mInitText ; 34 | 35 | public WaitingUi(Context context) { 36 | this(context,"请稍候......"); 37 | } 38 | 39 | public WaitingUi(Context c,CharSequence x){ 40 | super(c, R.style.SelfDialog); 41 | this.context = c; 42 | this.mInitText = x; 43 | } 44 | 45 | public void setTips(CharSequence x){ 46 | if(this.mText != null) mText.setText(x); 47 | } 48 | 49 | public void onCreate(Bundle savedInstanceState) { 50 | requestWindowFeature(Window.FEATURE_NO_TITLE); 51 | requestWindowFeature(Window.PROGRESS_VISIBILITY_ON); 52 | super.onCreate(savedInstanceState); 53 | 54 | setContentView(R.layout.waiting_layout); 55 | this.mText = (TextView)findViewById(R.id.wl_text); 56 | setTips(this.mInitText); 57 | this.mLoading = (ImageView)findViewById(R.id.wl_pic); 58 | 59 | mLoading.setBackgroundResource(R.drawable.wait_anim); 60 | 61 | pAnimDraw = (AnimationDrawable)mLoading.getBackground(); 62 | 63 | setCanceledOnTouchOutside(false); 64 | } 65 | 66 | @Override 67 | public boolean onKeyDown(int keyCode, KeyEvent event) { 68 | if (keyCode == KeyEvent.KEYCODE_BACK) { 69 | this.hide(); 70 | pAnimDraw.stop(); 71 | return true; 72 | } 73 | return false; 74 | } 75 | 76 | @Override 77 | public void show() { 78 | this.setTips(mInitText); 79 | super.show(); 80 | pAnimDraw.start(); 81 | } 82 | } -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/annotation/Config.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target(ElementType.FIELD) 10 | public @interface Config { 11 | public static final String CONFIG_STRING = "String"; 12 | public static final String CONFIG_NUMBER_INT = "Integer"; 13 | public static final String CONFIG_NUMBER_DOUBLE = "Double"; 14 | public static final String CONFIG_NUMBER_LONG = "Long"; 15 | public static final String CONFIG_CHAR = "Character"; 16 | public static final String CONFIG_BOOLEAN = "Boolean"; 17 | public static final String CONFIG_CHARSEQUENCE = "CharSequence"; 18 | 19 | public String configName(); 20 | public String configType() default CONFIG_STRING; 21 | public boolean base64() default false; 22 | } 23 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/annotation/ConfigLoad.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.annotation; 2 | 3 | /** 4 | * Created by 陈耀璇 on 2015/5/13. 5 | */ 6 | import java.lang.annotation.ElementType; 7 | import java.lang.annotation.Retention; 8 | import java.lang.annotation.RetentionPolicy; 9 | import java.lang.annotation.Target; 10 | 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.FIELD) 13 | public @interface ConfigLoad { 14 | 15 | /** 16 | * 注解请求字段 17 | * */ 18 | public String req(); 19 | 20 | /** 21 | * 请求字段的类型,默认为String 22 | * */ 23 | public String type() default Config.CONFIG_STRING; 24 | 25 | /** 26 | * 请求来源类,默认StatusController 27 | * */ 28 | public String sourceClass() default "StatusController"; 29 | 30 | /** 31 | * 本地方法名称 32 | * */ 33 | public String methodName() default "setText"; 34 | 35 | /** 36 | * 本地方法需求类型 37 | * */ 38 | public String methodType() default Config.CONFIG_CHARSEQUENCE; 39 | 40 | /** 41 | * 如果本地方法需求布尔型参数,需要在这里给定真值 42 | * */ 43 | public String reqVal() default ""; 44 | 45 | public static final String sourcePrefix = "cn.sunflyer.simpnk.control."; 46 | } 47 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/AccountController.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | import java.util.Date; 4 | 5 | import cn.sunflyer.simpnk.annotation.Config; 6 | import cn.sunflyer.simpnk.netkeeper.CXKUsername; 7 | 8 | /** 9 | * Created by 陈耀璇 on 2015/5/6. 10 | * 真实帐号控制类。 11 | */ 12 | public class AccountController { 13 | 14 | public static final CharSequence[] RADIUS_NAME = { 15 | "家用模式","重庆 Netkeeper 2.5.0055 - 0092","湖北 E信","浙江 闪讯","重庆 Netkeeper 2.5.0094","江西 星空极速 v32","山东移动 Netkeeper 0094","河北联通 Netkeeper", 16 | "陕西翼讯 3.7.3" , "山东电信 3.7.3 8月17日版本" , "山东电信 3.7.3 10月27日版本" , "甘肃电信 3.7.1" 17 | }; 18 | 19 | public static final String[] RADIUS = { 20 | "", 21 | "cqxinliradius002", //重庆地区Netkeeper2.5 22 | "hubtxinli01", //湖北E信 23 | "singlenet01", //杭州地区 24 | "xianxinli1radius", 25 | "jiangxi4.0", 26 | "shandongmobile13", 27 | "hebeicncxinli002", 28 | "sh_xi@xiaoyuan01", 29 | "560Ox!a0yuanOlIz", 30 | "shdOx!a0yuan01lz", 31 | "xiaoyuanyixun001" 32 | }; 33 | 34 | public static final String[] RADIUS_PREFIX = { 35 | "", 36 | "\r\n", 37 | "\r\n", 38 | "\r\n", 39 | "\r\n", 40 | "\r1", 41 | "\r\n", 42 | "\r\n", 43 | "\r\n", 44 | "\r\n", 45 | "\r\n", 46 | "\r\n" 47 | }; 48 | 49 | public static final int RADIUS_HOME = 0, 50 | RADIUS_CHONGQING = 1, 51 | RADIUS_HUBEI = 2, 52 | RADIUS_HANGZHOU = 3, 53 | RADIUS_CHONGQING_NEW = 4 , 54 | RADIUS_JIANGXI = 5, 55 | RADIUS_SHANDONG = 6, 56 | RADIUS_HEBEI = 7, 57 | RADIUS_SHANXI = 8, 58 | RADIUS_SHANDONG_AUG = 9, 59 | RADIUS_SHANDONG_OCT = 10 , 60 | RADIUS_GANSU = 11, 61 | RADIUS_SELF = 1000; 62 | 63 | @Config(configName = ConfigController.Config_Router_DialRadiusPrefix) 64 | public static String mCurrentRadiusPrefix = null; 65 | 66 | @Config(configName = ConfigController.Config_Router_DialRadiusDefined ) 67 | public static String mCurrentRadiusStr = null; 68 | 69 | /**RADIUS标识*/ 70 | @Config(configName = ConfigController.Config_Router_DialPlace , configType = Config.CONFIG_NUMBER_INT) 71 | public static int mCurrentRadius = RADIUS_CHONGQING_NEW; 72 | 73 | public static String getRealAccount(String username){ 74 | return getRealAccount(username , (new Date()).getTime()); 75 | } 76 | 77 | public static String getRealAccount(String username,long time){ 78 | if(username == null) return null; 79 | if(time > 0 && mCurrentRadius != RADIUS_HOME && (mCurrentRadius < RADIUS.length || mCurrentRadius == RADIUS_SELF) && mCurrentRadius >= 0){ 80 | Log.log("Real Acc : using " + getCurrentRadius()); 81 | return new CXKUsername(getCurrentRadiusPrefix() , username,getCurrentRadius()).Realusername(time); 82 | } 83 | return username; 84 | } 85 | 86 | public static String getCurrentRadius(){ 87 | return mCurrentRadius == RADIUS_SELF ? mCurrentRadiusStr : RADIUS[mCurrentRadius]; 88 | } 89 | 90 | public static String getCurrentRadiusPrefix(){ 91 | return mCurrentRadius == RADIUS_SELF ? mCurrentRadiusPrefix.replace("\\r", "\r").replace("\\n", "\n") : RADIUS_PREFIX[mCurrentRadius]; 92 | } 93 | 94 | } 95 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/AppInfo.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | public class AppInfo { 4 | 5 | public static final int APP_VERSION_MAIN = 1 ; //主版本号 6 | public static final int APP_VERSION_SUB = 2 ; //子版本号 7 | public static final int APP_VERSION_FIX = 0 ; //修正版本 8 | public static final String APP_VERSION_BUILD = "56" ; //build 9 | 10 | public static String getVersionString(){ 11 | return APP_VERSION_MAIN+"."+APP_VERSION_SUB+"."+APP_VERSION_FIX+"."+APP_VERSION_BUILD; 12 | } 13 | 14 | public static final String APP_VERSION_ST[] = {"正式版本","测试版本"}; 15 | 16 | public static final int APP_VERSION_ST_CODE = 1 ; 17 | 18 | public static String getVersionStringWithRel(){ 19 | return getVersionString() + (APP_VERSION_ST_CODE >= APP_VERSION_ST.length ? "Unknown" : APP_VERSION_ST[APP_VERSION_ST_CODE]); 20 | } 21 | 22 | 23 | public static final String APP_VERSION_DATE = "2015-03-20 13:00"; //版本日期 24 | 25 | /** 26 | * 程序集信息 27 | * */ 28 | public static final String APP_NAME = "Simple Netkeeper"; 29 | public static final String APP_DES = ""; 30 | 31 | public static final String APP_WEB_UPDATE = "http://www.sunflyer.cn/archives/8"; 32 | public static final String APP_WEB_HELP = "http://www.sunflyer.cn/"; 33 | public static final String APP_WEB_DEV = "http://www.sunflyer.cn/"; 34 | 35 | 36 | /** 37 | * 作者信息 38 | * */ 39 | public static final String APP_AUTHOR_NAME = "CrazyChen @ CQUT"; 40 | public static final String APP_AUTHOR_MAIL = "cx@itncre.com"; 41 | public static final String APP_AUTHOR_WEB = "http://www.sunflyer.cn"; 42 | 43 | public static final String APP_AUTHOR_DES = "程序源代码已经公开在 https://github.com/sunflyer/simplenetkeeper "; 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/Base64.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | /******************************************************************************************************************** 4 | * $Id: Base64.java,v 1.4 2002/12/24 15:17:17 russgold Exp $ 5 | * 6 | * Copyright (c) 2000-2002 by Russell Gold 7 | * 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 9 | * documentation files (the "Software"), to deal in the Software without restriction, including without limitation 10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and 11 | * to permit persons to whom the Software is furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in all copies or substantial portions 14 | * of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO 17 | * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF 19 | * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20 | * DEALINGS IN THE SOFTWARE. 21 | * 22 | *******************************************************************************************************************/ 23 | 24 | /** 25 | * A utility class to convert to and from base 64 encoding. 26 | * 27 | * @author Russell Gold 28 | **/ 29 | public class Base64 { 30 | 31 | final static String encodingChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 32 | 33 | 34 | /** 35 | * Returns the base 64 encoded equivalent of a supplied string. 36 | * @param source the string to encode 37 | */ 38 | public static String encode( String source ) { 39 | char[] sourceBytes = getPaddedBytes( source ); 40 | int numGroups = (sourceBytes.length + 2) / 3; 41 | char[] targetBytes = new char[4]; 42 | char[] target = new char[ 4 * numGroups ]; 43 | 44 | for (int group = 0; group < numGroups; group++) { 45 | convert3To4( sourceBytes, group*3, targetBytes ); 46 | for (int i = 0; i < targetBytes.length; i++) { 47 | target[ i + 4*group ] = encodingChar.charAt( targetBytes[i] ); 48 | } 49 | } 50 | 51 | int numPadBytes = sourceBytes.length - source.length(); 52 | 53 | for (int i = target.length-numPadBytes; i < target.length; i++) target[i] = '='; 54 | return new String( target ); 55 | } 56 | 57 | 58 | private static char[] getPaddedBytes( String source ) { 59 | char[] converted = source.toCharArray(); 60 | int requiredLength = 3 * ((converted.length+2) /3); 61 | char[] result = new char[ requiredLength ]; 62 | System.arraycopy( converted, 0, result, 0, converted.length ); 63 | return result; 64 | } 65 | 66 | 67 | private static void convert3To4( char[] source, int sourceIndex, char[] target ) { 68 | target[0] = (char) ( source[ sourceIndex ] >>> 2); 69 | target[1] = (char) (((source[ sourceIndex ] & 0x03) << 4) | (source[ sourceIndex+1 ] >>> 4)); 70 | target[2] = (char) (((source[ sourceIndex+1 ] & 0x0f) << 2) | (source[ sourceIndex+2 ] >>> 6)); 71 | target[3] = (char) ( source[ sourceIndex+2 ] & 0x3f); 72 | } 73 | 74 | 75 | /** 76 | * Returns the plaintext equivalent of a base 64-encoded string. 77 | * @param source a base 64 string (which must have a multiple of 4 characters) 78 | */ 79 | public static String decode( String source ) { 80 | if (source.length()%4 != 0) throw new RuntimeException( "valid Base64 codes have a multiple of 4 characters" ); 81 | int numGroups = source.length() / 4; 82 | int numExtraBytes = source.endsWith( "==" ) ? 2 : (source.endsWith( "=" ) ? 1 : 0); 83 | byte[] targetBytes = new byte[ 3*numGroups ]; 84 | byte[] sourceBytes = new byte[4]; 85 | for (int group = 0; group < numGroups; group++) { 86 | for (int i = 0; i < sourceBytes.length; i++) { 87 | sourceBytes[i] = (byte) Math.max( 0, encodingChar.indexOf( source.charAt( 4*group+i ) ) ); 88 | } 89 | convert4To3( sourceBytes, targetBytes, group*3 ); 90 | } 91 | return new String( targetBytes, 0, targetBytes.length - numExtraBytes ); 92 | } 93 | 94 | 95 | private static void convert4To3( byte[] source, byte[] target, int targetIndex ) { 96 | target[ targetIndex ] = (byte) (( source[0] << 2) | (source[1] >>> 4)); 97 | target[ targetIndex+1 ] = (byte) (((source[1] & 0x0f) << 4) | (source[2] >>> 2)); 98 | target[ targetIndex+2 ] = (byte) (((source[2] & 0x03) << 6) | (source[3])); 99 | } 100 | 101 | } -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/ConfigController.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | import android.app.Application; 4 | 5 | import java.io.File; 6 | import java.io.FileInputStream; 7 | import java.io.FileOutputStream; 8 | import java.io.IOException; 9 | import java.util.Properties; 10 | 11 | /** 12 | * 配置文件控制类 13 | * @version 1.5.0 14 | * @author CrazyChen 15 | * @since Simple Netkeeper 1.5.0 16 | * */ 17 | public class ConfigController { 18 | 19 | /** 20 | * properties 21 | * */ 22 | private static Properties gPro = null ; 23 | 24 | /**配置文件版本*/ 25 | private static int gProVersion = 6; 26 | 27 | /** 28 | * 返回配置文件版本号 29 | * */ 30 | public static int getConfigVersion(){ 31 | return gProVersion; 32 | } 33 | 34 | /** 35 | * 配置文件位置 36 | * */ 37 | private static String gConfigPath = ""; 38 | 39 | public static void setConfigPath(String szPath){ 40 | gConfigPath = szPath; 41 | } 42 | 43 | /** 44 | * 获取制定的配置数据。如果不存在会返回空字符串 45 | * */ 46 | public static String getConfig(String szConfigName){ 47 | return (gPro!=null && !gPro.isEmpty()) ? (gPro.getProperty(szConfigName) == null ? "" : gPro.getProperty(szConfigName)) : ""; 48 | } 49 | 50 | /** 51 | * 获取制定配置数值 52 | * @param szConfigName 配置项目名称 53 | * @param defVal 默认值,如果没有找到该项,则返回这个默认值 54 | * */ 55 | public static int getConfig(String szConfigName,int defVal){ 56 | if(szConfigName != null && !szConfigName.equals("")){ 57 | try{ 58 | return Integer.parseInt(ConfigController.getConfig(szConfigName)); 59 | }catch(Exception e){ 60 | Log.log("尝试转换配置文件数值出现错误"); 61 | } 62 | } 63 | return defVal; 64 | } 65 | 66 | /** 67 | * 制定配置文件的值是否与给定的值相等。如果配置不存在,返回给定的默认值 68 | * @param szConfigName 配置项目名称 69 | * @param szCompareData 比较数据 70 | * @param defVal 默认值 71 | * */ 72 | public static boolean getConfig(String szConfigName, String szCompareData,boolean defVal ){ 73 | if(szConfigName != null && !szConfigName.equals("")){ 74 | String pConfig = getConfig(szConfigName); 75 | return pConfig == null ? szCompareData == null : pConfig.equals(szCompareData); 76 | } 77 | return defVal; 78 | } 79 | 80 | /** 81 | * 更新配置项目 82 | * @param szConfigName 83 | * @param szConfigVal 84 | * @return 85 | * */ 86 | public static boolean updateConfig(String szConfigName,String szConfigVal){ 87 | if(gPro!=null && szConfigName!=null && szConfigVal!=null && !szConfigName.equals("")){ 88 | gPro.setProperty(szConfigName, szConfigVal); 89 | 90 | return true; 91 | } 92 | return false; 93 | } 94 | 95 | public static boolean saveConfig(String szFileName){ 96 | StatusController.saveConfig(); 97 | 98 | if(gPro!=null && !gPro.isEmpty()){ 99 | try { 100 | updateConfig(Config_Application_ConfVer, Config_Application_CurrentVersion); 101 | gPro.store(new FileOutputStream(new File(szFileName)), Config_Comment); 102 | return true; 103 | } catch (IOException e) { 104 | Log.logE(e); 105 | } 106 | } 107 | return false; 108 | } 109 | 110 | public static boolean loadConfig(String szFileName){ 111 | if(szFileName!=null && !szFileName.equals("")){ 112 | File pConfigFile = new File(szFileName); 113 | if(pConfigFile.exists()){ 114 | gPro = new Properties(); 115 | try { 116 | gPro.load(new FileInputStream(pConfigFile)); 117 | if(!gPro.isEmpty()){ 118 | String pConVer = gPro.getProperty(Config_Application_ConfVer); 119 | 120 | if(pConVer != null){ 121 | gProVersion = Integer.parseInt(pConVer); 122 | return true; 123 | } 124 | } 125 | } catch (Exception e) { 126 | Log.logE(e); 127 | } 128 | } 129 | } 130 | gPro = new Properties(); 131 | 132 | return false; 133 | } 134 | 135 | public static boolean saveConfig(){ 136 | return saveConfig(gConfigPath+"/"+CONFIG_FILE); 137 | } 138 | 139 | public static boolean loadConfig(){ 140 | return loadConfig(gConfigPath+"/"+CONFIG_FILE); 141 | } 142 | 143 | private static boolean removeConfigFile(String szFileName){ 144 | if(szFileName!=null && !szFileName.equals("")){ 145 | File pFile = new File(szFileName); 146 | if(pFile.exists()){ 147 | return pFile.delete(); 148 | } 149 | return true; 150 | } 151 | return false; 152 | } 153 | 154 | public static boolean clearConfig(){ 155 | if(gPro!=null){ 156 | gPro.clear(); 157 | removeConfigFile(gConfigPath+"/"+CONFIG_FILE); 158 | return gPro.isEmpty(); 159 | } 160 | return true; 161 | } 162 | 163 | //======================================================================== 164 | 165 | private static final String Config_Comment = "Simple Netkeeper User Configuaration Files"; 166 | 167 | public static final String Config_Acc_Name="AccName"; 168 | public static final String Config_Acc_Password="AccPassword"; 169 | public static final String Config_Router_IP="RouterIP"; 170 | public static final String Config_Router_Name="RouterAdmin"; 171 | public static final String Config_Router_Password="RouterPassword"; 172 | public static final String Config_Router_AuthMethod="AuthMethod"; 173 | public static final String Config_Router_DialMode="DialMode"; 174 | public static final String Config_Router_DialPlace="DialPlace"; 175 | public static final String Config_Router_DialRadiusDefined = "enc.radius"; 176 | public static final String Config_Router_DialRadiusPrefix = "enc.prefix"; 177 | public static final String Config_Router_Encrypt="Encrypt"; 178 | public static final String Config_Router_Manufactor="Manufactor"; 179 | 180 | private static final String Config_Application_ConfVer="ConfigVersion"; 181 | 182 | public static final String Config_Dial_Acc_Name="DialAccName"; 183 | public static final String Config_Dial_Acc_Password="DialAccPassword"; 184 | public static final String Config_Dial_is_Rem="DialAccRem"; 185 | public static final String Config_Dial_is_HeartBeat="DialHeartBeat"; 186 | public static final String Config_Dial_is_AutoDial="DialAuto"; 187 | 188 | public static final String Config_Wifi_SSID="WifiSSID"; 189 | public static final String Config_Wifi_Password="WifiPassword"; 190 | 191 | public static final String Config_Ontime_Mode = "ontime.mode", 192 | Config_Ontime_SH = "ontime.starthour", 193 | Config_Ontime_SM = "ontime.startmin", 194 | Config_Ontime_EH = "ontime.endhour", 195 | Config_Ontime_EM = "ontime.endmin", 196 | Config_Ontime_SD = "ontime.startday", 197 | Config_Ontime_ED = "ontime.endday", 198 | Config_Ontime_WifiName = "ontime.wifiname", 199 | Config_Ontime_WifiKey = "ontime.wifikey"; 200 | 201 | 202 | public static final String Config_Application_CurrentVersion="6"; 203 | 204 | //======================================================================== 205 | public static final String CONFIG_FILE = "SimpleNetkeeper.conf"; 206 | } 207 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/DialController.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | import android.os.Bundle; 4 | import android.os.Message; 5 | 6 | import java.util.HashMap; 7 | 8 | import cn.sunflyer.simpnk.obj.Router; 9 | import cn.sunflyer.simpnk.obj.RouterMecuryTPF; 10 | import cn.sunflyer.simpnk.obj.RouterMecuryTpNew; 11 | import cn.sunflyer.simpnk.obj.RouterTpLinkNew; 12 | 13 | /** 14 | * @author CrazyChen 15 | * @version 1.5.0 16 | * @since Simple Netkeeper 1.5.0 17 | * */ 18 | public class DialController { 19 | 20 | 21 | public static void dialRouter(){ 22 | new Thread(new Runnable(){ 23 | 24 | @Override 25 | public void run() { 26 | 27 | int pDialMod = StatusController.getStateRouterAuthMethod() != Router.AUTH_NOT_AVALIABLE ? StatusController.getStateRouterAuthMethod() : Router.getRouterAccessMethod(StatusController.sRouterAdd); 28 | if(pDialMod == Router.AUTH_NOT_AVALIABLE){ 29 | 30 | HashMap routerList = new HashMap<>(); 31 | //401 First 32 | StatusController.setStateRouterAuthMethod(Router.AUTH_OLD); 33 | Router r = new RouterMecuryTPF(); 34 | if(StatusController.getStateRouterAuthMethod() != Router.AUTH_NOT_AVALIABLE){ 35 | DialController.dialRouter(); 36 | }else{ 37 | StatusController.setStateRouterAuthMethod(Router.AUTH_DYNAMIC_ID); 38 | r = new RouterMecuryTpNew(); 39 | if(StatusController.getStateRouterAuthMethod() != Router.AUTH_NOT_AVALIABLE){ 40 | DialController.dialRouter(); 41 | }else{ 42 | sendMessage("没有访问路由器的方式。请检查路由器是否被支持。此外,如果你使用TP-LINK系列新版路由器(TP-LINK 886N等),请在设置向导修改路由器品牌为“TP-LINK”新版本后重试。"); 43 | StatusController.setStateRouterDial(false); 44 | } 45 | } 46 | } 47 | else{ 48 | //设置验证方式 49 | StatusController.setStateRouterAuthMethod(pDialMod); 50 | StatusController.setStateRouterDial(true); 51 | //保存配置文件 52 | ConfigController.saveConfig(); 53 | 54 | switch(pDialMod){ 55 | case Router.AUTH_OLD: 56 | case Router.AUTH_PASSWORD_ONLY: 57 | case Router.AUTH_WEB:{ 58 | final RouterMecuryTPF pRou = new RouterMecuryTPF(); 59 | new Thread(new DialThread(pRou,pDialMod)).start(); 60 | }break; 61 | case Router.AUTH_DYNAMIC_ID:{ 62 | final RouterMecuryTpNew pRou = new RouterMecuryTpNew(); 63 | new Thread(new DialThread(pRou,Router.AUTH_DYNAMIC_ID)).start(); 64 | }break; 65 | case Router.AUTH_DYNAMIC_ID_TP:{ 66 | new Thread(new DialThread(new RouterTpLinkNew() , Router.AUTH_DYNAMIC_ID_TP)).start(); 67 | }break; 68 | default: 69 | sendMessage("验证方式存在错误,无法执行操作"); 70 | StatusController.setStateRouterDial(false); 71 | } 72 | 73 | } 74 | } 75 | 76 | 77 | }).start(); 78 | 79 | } 80 | 81 | 82 | 83 | public static void sendMessage(String pMsg){ 84 | MessageHandler.sendMessage(MessageHandler.MSG_ACTION_LOG_AND_REFRESH , pMsg); 85 | } 86 | 87 | public static void sendMessageCompleteDial(){ 88 | MessageHandler.sendMessage(MessageHandler.MSG_ACTION_DIAL_COMPLETE , ""); 89 | } 90 | 91 | public static void sendMessageCompleteTrack(){ 92 | MessageHandler.sendMessage(MessageHandler.MSG_ACTION_TRACK_COMPLETE , ""); 93 | } 94 | 95 | static class DialThread implements Runnable{ 96 | 97 | private Router m = null; 98 | private int am = Router.AUTH_NOT_AVALIABLE; 99 | 100 | public DialThread(Router r,int am){ 101 | this.m = r; 102 | this.am = am; 103 | } 104 | @Override 105 | public void run() { 106 | 107 | int pDialRes = Router.RES_NO_DIAL_MODE; 108 | 109 | pDialRes = m.connect(); 110 | 111 | DialController.sendMessage(pDialRes == Router.RES_IO_EXCEPTION ? Router.RES_TIPS[pDialRes] + m.LAST_EXCEPTION_STRING : Router.RES_TIPS[pDialRes]); 112 | //发送拨号完毕的消息 113 | DialController.sendMessageCompleteDial(); 114 | //如果拨号成功,启动追踪 115 | if(pDialRes == Router.RES_SUCCESS){ 116 | m.trackLink(); 117 | //发送追踪完毕 118 | DialController.sendMessageCompleteTrack(); 119 | } 120 | //隐藏BLOCK 121 | MessageHandler.sendMessage(MessageHandler.MSG_ACTION_HIDE_BLOCK,""); 122 | //取消状态 123 | StatusController.setStateRouterDial(false); 124 | } 125 | 126 | 127 | } 128 | 129 | } 130 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/control/Log.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.control; 2 | 3 | import android.os.Environment; 4 | 5 | import java.io.File; 6 | import java.io.FileWriter; 7 | import java.io.IOException; 8 | import java.util.Date; 9 | import java.util.Properties; 10 | 11 | public class Log { 12 | public static final String gLogFileName="NetkeeperLog.log"; 13 | public static final String gLogFilePathWindows="C:\\"; 14 | public static final String gLogFilePathLinux="/usr/share/"; 15 | public static final String gLogFilePathAndroid = Environment.getExternalStorageDirectory().toString(); 16 | public static final String nLine=System.getProperties().getProperty("line.separator"); 17 | private static File gLogFile=null; 18 | 19 | private static boolean gIsInit=false; 20 | 21 | private static FileWriter mLogger=null; 22 | private static String gLogPath=null; 23 | private static int gInitErrorTime=0; 24 | public static final int gInitErrorTimeLimit=6; 25 | 26 | public static void initLogger(String FilePath){ 27 | gLogPath=FilePath; 28 | gLogFile=new File(gLogPath,Log.gLogFileName); 29 | try{ 30 | if(!gLogFile.exists()){ 31 | gLogFile.createNewFile(); 32 | } 33 | mLogger = new FileWriter(Log.gLogFile,true); 34 | gIsInit=true; 35 | } 36 | catch(Exception ex){ 37 | ex.printStackTrace(); 38 | gIsInit=false; 39 | Log.gInitErrorTime++; 40 | } 41 | } 42 | 43 | public static boolean isInit(){ 44 | return gIsInit; 45 | } 46 | 47 | public static void log(String pCon){ 48 | if(isInit()){ 49 | try { 50 | mLogger.write(new Date()+" - "+pCon+Log.nLine); 51 | mLogger.flush(); 52 | } catch (IOException e) { 53 | e.printStackTrace(); 54 | } 55 | }else{ 56 | if(Log.gInitErrorTime>= 0x20; //右移32位 64 | t >>= 0x01; //右移1位 65 | m_time1c = (long) t; //强制转换 66 | 67 | m_lasttimec = m_time1c; 68 | 69 | t = m_time1c; 70 | by2[3] = intToByte(t & 0xFF); 71 | by2[2] = intToByte((t & 0xFF00) / 0x100) ; 72 | by2[1] = intToByte((t & 0xFF0000) / 0x10000); 73 | by2[0] = intToByte((t & 0xFF000000) / 0x1000000); 74 | 75 | //System.out.println(by2[3]+" "+by2[2]+" "+by2[1]+" "+by2[0]); 76 | 77 | /** 78 | * 倒置过程m_time1convert为结果 79 | */ 80 | int t0=0, t1, t2, t3; 81 | t0 = (int) m_time1c; 82 | t1 = t0; 83 | t2 = t0; 84 | t3 = t0; 85 | t3 = t3 << 0x10; 86 | t1 = t1 & 0x0FF00; 87 | t1 = t1 | t3; 88 | t3 = t0; 89 | t3 = t3 & 0x0FF0000; 90 | t2 = t2 >> 0x10; 91 | t3 = t3 | t2; 92 | t1 = t1 << 0x08; 93 | t3 = t3 >> 0x08; 94 | t1 = t1 | t3; 95 | m_time1convert = t1; 96 | 97 | //System.out.println(m_time1convert); 98 | 99 | /** 100 | * 源数据1,对m_time1convert进行计算得到格式符源数据 101 | */ 102 | 103 | long tc=0; 104 | tc = m_time1convert; 105 | ss[3] = trans(tc & 0xFF); 106 | ss[2] = trans((tc & 0xFF00) / 0x100) ; 107 | ss[1] = trans((tc & 0xFF0000) / 0x10000); 108 | ss[0] = trans((tc & 0xFF000000) / 0x1000000); 109 | 110 | //System.out.println(ss[3]+" "+ss[2]+ " "+ss[1]+ " "+ss[0]); 111 | /** 112 | * 格式符初加密 113 | */ 114 | char pp[] ={0,0,0,0}; 115 | int i = 0, j = 0, k = 0; 116 | for (i = 0; i < 0x20; i++){ 117 | j = i / 0x8; 118 | k = 3 - (i % 0x4); 119 | pp[k] *= 0x2; 120 | if (ss[j] % 2 == 1){ 121 | pp[k]++; 122 | } 123 | ss[j] /= 2; 124 | } 125 | 126 | /** 127 | * 格式符计算,m_formatsring为结果 128 | */ 129 | char pf[] ={0,0,0,0,0,0}; 130 | short st1,st2 ; 131 | st1 = (short) pp[3]; 132 | st1 /= 0x4; 133 | pf[0] = trans(st1); 134 | st1 = (short) pp[3]; 135 | st1 = (short) (st1 & 0x3); 136 | st1 *= 0x10; 137 | pf[1] = trans(st1); 138 | st2 = (short) pp[2]; 139 | st2 /= 0x10; 140 | st2 = (short) (st2 | st1); 141 | pf[1] = trans(st2); 142 | st1 = (short) pp[2]; 143 | st1 = (short) (st1 & 0x0F); 144 | st1 *= 0x04; 145 | pf[2] = trans(st1); 146 | st2 = (short) pp[1]; 147 | st2 /= 0x40; 148 | st2 = (short) (st2 | st1); 149 | pf[2] = trans(st2); 150 | st1 = (short) pp[1]; 151 | st1 = (short) (st1 & 0x3F); 152 | pf[3] = trans(st1); 153 | st2 = (short) pp[0]; 154 | st2 /= 0x04; 155 | pf[4] = trans(st2); 156 | st1 = (short) pp[0]; 157 | st1 = (short) (st1 & 0x03); 158 | st1 *= 0x10; 159 | pf[5] = trans(st1); 160 | 161 | /* String arr=""; 162 | for(int x=0;x<6;x++){ 163 | arr+=(pf[x]+" "); 164 | } 165 | System.out.println(arr);*/ 166 | 167 | for (int n = 0; n < 6; n++){ 168 | pf[n] += 0x20; 169 | if ((pf[n]) >= 0x40){ 170 | pf[n]++; 171 | } 172 | } 173 | 174 | //System.out.println("m_f"+m_formatsring); 175 | 176 | for (int m = 0; m < 6; m++){ 177 | m_formatsring += pf[m]; 178 | } 179 | 180 | //System.out.println("m_f"+m_formatsring); 181 | 182 | String strInput; 183 | String strtem; 184 | if(m_username.contains("@")){ 185 | strtem=m_username.substring(0, m_username.indexOf("@")); 186 | }else{ 187 | strtem=m_username; 188 | } 189 | strInput = strtem + RADIUS; 190 | byte[] temp=new byte[by2.length+strInput.getBytes().length]; 191 | System.arraycopy(by2, 0, temp, 0, by2.length); 192 | System.arraycopy(strInput.getBytes(),0,temp,by2.length,strInput.getBytes().length); 193 | m_md5 = MD5.getMD5(temp); 194 | 195 | //System.out.println("m5:"+m_md5); 196 | m_md5use = m_md5.substring(0, 2); 197 | m_realusername = m_formatsring + m_md5use + m_username; 198 | m_realusername = prefix + m_realusername;//前面两位为回车换行0D0A,接着再是后续的 199 | 200 | return m_realusername; 201 | } 202 | 203 | /**获取即时账号*/ 204 | public String Realusername(){ 205 | long time=(new Date()).getTime();//得到系统时间,从1970.01.01.00:00:00 开始的秒数 206 | return this.Realusername(time); 207 | } 208 | 209 | 210 | } 211 | -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/netkeeper/MD5.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.netkeeper; 2 | 3 | /** 4 | * MD5的算法在RFC1321 中定义 5 | * 在RFC 1321中,给出了Test suite用来检验你的实现是否正确: 6 | * MD5 ("") = d41d8cd98f00b204e9800998ecf8427e 7 | * MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 8 | * MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 9 | * MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 10 | * MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b 11 | * 12 | * @author haogj 13 | * 14 | * 传入参数:一个字节数组 15 | * 传出参数:字节数组的 MD5 结果字符串 16 | */ 17 | public class MD5 { 18 | public static String getMD5(byte[] source) { 19 | String s = null; 20 | char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符 21 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 22 | try 23 | { 24 | java.security.MessageDigest md = java.security.MessageDigest.getInstance( "MD5" ); 25 | md.update( source ); 26 | byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数, 27 | // 用字节表示就是 16 个字节 28 | char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符, 29 | // 所以表示成 16 进制需要 32 个字符 30 | int k = 0; // 表示转换结果中对应的字符位置 31 | for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节 32 | // 转换成 16 进制字符的转换 33 | byte byte0 = tmp[i]; // 取第 i 个字节 34 | str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, 35 | // >>> 为逻辑右移,将符号位一起右移 36 | str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换 37 | } 38 | s = new String(str); // 换后的结果转换为字符串 39 | 40 | }catch( Exception e ) 41 | { 42 | e.printStackTrace(); 43 | } 44 | return s; 45 | } 46 | } -------------------------------------------------------------------------------- /Android Version/app/src/main/java/cn/sunflyer/simpnk/obj/WiFiInfo.java: -------------------------------------------------------------------------------- 1 | package cn.sunflyer.simpnk.obj; 2 | 3 | public class WiFiInfo { 4 | private String gWifiName; 5 | private String gWifiPassword; 6 | private boolean gWifiBroadCast; 7 | 8 | public WiFiInfo(String name,String key,boolean allowBroadCast){ 9 | this.setWifiName(name); 10 | this.setWifiBroadCast(allowBroadCast); 11 | this.setWifiPassword(key); 12 | } 13 | 14 | public WiFiInfo(String name,String key){ 15 | this(name,key,true); 16 | } 17 | 18 | public String getWifiName() { 19 | return gWifiName; 20 | } 21 | 22 | public void setWifiName(String gWifiName) { 23 | this.gWifiName = gWifiName; 24 | } 25 | 26 | public String getWifiPassword() { 27 | return gWifiPassword; 28 | } 29 | 30 | public void setWifiPassword(String gWifiPassword) { 31 | this.gWifiPassword = gWifiPassword; 32 | } 33 | 34 | public boolean isWifiBroadCast() { 35 | return gWifiBroadCast; 36 | } 37 | 38 | public void setWifiBroadCast(boolean gWifiBroadCast) { 39 | this.gWifiBroadCast = gWifiBroadCast; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/anim/rotate_repeat.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 13 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/aperture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/aperture.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/arrowtop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/arrowtop.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/badge.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/button.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/button_list_a.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/button_qd.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/error.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/file.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/input.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/input_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/input_middle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/load.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/load.gif -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/ok.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/ok.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/spinner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w1.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w10.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w11.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w2.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w3.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w4.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w5.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w6.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w7.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w8.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/w9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/w9.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/wait_anim.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Android Version/app/src/main/res/drawable/wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sunflyer/SimpleNetkeeper/e059e436d037439995cbe1e556a4f3dc7431c382/Android Version/app/src/main/res/drawable/wifi.png -------------------------------------------------------------------------------- /Android Version/app/src/main/res/layout/activity_config_router.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | 20 | 21 | 28 | 29 | 35 | 36 | 44 | 45 | 119 | 120 |