├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── blindingdark │ │ └── geektrans │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ ├── com │ │ │ └── blindingdark │ │ │ │ └── geektrans │ │ │ │ ├── activity │ │ │ │ ├── GetTransTextActivity.java │ │ │ │ ├── TransActivity.java │ │ │ │ └── settings │ │ │ │ │ ├── AddTransEngineActivity.java │ │ │ │ │ ├── BaiduSettingsActivity.java │ │ │ │ │ ├── BingSettingsActivity.java │ │ │ │ │ ├── JinshanSettingsActivity.java │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ ├── OtherSettingsActivity.java │ │ │ │ │ ├── PrefsFragement.java │ │ │ │ │ └── YoudaoSettingsActivity.java │ │ │ │ ├── adapter │ │ │ │ └── EngineInfoRecyclerViewAdapter.java │ │ │ │ ├── api │ │ │ │ └── TransEngine.java │ │ │ │ ├── bean │ │ │ │ ├── Result.java │ │ │ │ └── TransEngineInfo.java │ │ │ │ ├── global │ │ │ │ ├── MyApplication.java │ │ │ │ ├── SeqMainSettings.java │ │ │ │ ├── StringMainSettings.java │ │ │ │ ├── ToastStyleFactory.java │ │ │ │ ├── TransEngineFactory.java │ │ │ │ └── TransEngineInfoFactory.java │ │ │ │ ├── tools │ │ │ │ ├── Clip.java │ │ │ │ ├── EnginesCircleList.java │ │ │ │ ├── EnumUtils.java │ │ │ │ ├── MD5.java │ │ │ │ ├── MyStringUnits.java │ │ │ │ ├── MyToast.java │ │ │ │ ├── Number.java │ │ │ │ └── SoundPlayerService.java │ │ │ │ ├── trans │ │ │ │ ├── baidu │ │ │ │ │ ├── Baidu.java │ │ │ │ │ ├── BaiduAPI.java │ │ │ │ │ ├── BaiduSettingsString.java │ │ │ │ │ ├── BaiduTransReq.java │ │ │ │ │ └── bean │ │ │ │ │ │ ├── BaiduJSONBean.java │ │ │ │ │ │ ├── BaiduSettings.java │ │ │ │ │ │ └── TransResult.java │ │ │ │ ├── bing │ │ │ │ │ ├── Bing.java │ │ │ │ │ ├── BingTransReq.java │ │ │ │ │ ├── StringBingSettings.java │ │ │ │ │ └── bean │ │ │ │ │ │ └── BingSettings.java │ │ │ │ ├── jinshan │ │ │ │ │ ├── Jinshan.java │ │ │ │ │ ├── JinshanAPI.java │ │ │ │ │ ├── JinshanTransReq.java │ │ │ │ │ ├── StringJinshanSettings.java │ │ │ │ │ └── bean │ │ │ │ │ │ ├── Exchange.java │ │ │ │ │ │ ├── JinshanJSONBean.java │ │ │ │ │ │ ├── JinshanJSONBeanZh.java │ │ │ │ │ │ ├── JinshanSettings.java │ │ │ │ │ │ ├── Mean.java │ │ │ │ │ │ ├── Part.java │ │ │ │ │ │ ├── PartZh.java │ │ │ │ │ │ ├── Symbol.java │ │ │ │ │ │ └── SymbolZh.java │ │ │ │ └── youdao │ │ │ │ │ ├── Youdao.java │ │ │ │ │ ├── YoudaoSettingsString.java │ │ │ │ │ ├── YoudaoTransReq.java │ │ │ │ │ └── bean │ │ │ │ │ ├── YoudaoSettings.java │ │ │ │ │ └── YoudaoTransRes.java │ │ │ │ └── ui │ │ │ │ └── DividerItemDecoration.java │ │ └── ezy │ │ │ └── assist │ │ │ └── compat │ │ │ ├── RomUtil.java │ │ │ └── SettingsCompat.java │ └── res │ │ ├── drawable │ │ ├── add.xml │ │ ├── baidulogo.png │ │ ├── card_bg_write.xml │ │ ├── custom_toast.xml │ │ ├── divider.xml │ │ ├── ic_headset_black_24dp.xml │ │ ├── jinshanlogo.gif │ │ ├── mst_logo.png │ │ └── youdaologo.png │ │ ├── layout │ │ ├── activity_add_trans_engine.xml │ │ ├── activity_baidu_settings.xml │ │ ├── activity_bing_settings.xml │ │ ├── activity_jinshan_settings.xml │ │ ├── activity_main.xml │ │ ├── activity_youdao_settings.xml │ │ ├── item_engine_info.xml │ │ ├── toast_simple.xml │ │ ├── toast_simple_card_write.xml │ │ ├── toast_with_sound.xml │ │ └── toast_with_sound_card_write.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values-zh │ │ └── strings.xml │ │ ├── values │ │ ├── arrays.xml │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── preferences_other_settings.xml │ └── test │ └── java │ └── com │ └── blindingdark │ └── geektrans │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | 10 | .DS_Store 11 | # -*- mode: gitignore; -*- 12 | *~ 13 | \#*\# 14 | /.emacs.desktop 15 | /.emacs.desktop.lock 16 | *.elc 17 | auto-save-list 18 | tramp 19 | .\#* 20 | 21 | # Org-mode 22 | .org-id-locations 23 | *_archive 24 | 25 | # flymake-mode 26 | *_flymake.* 27 | 28 | # eshell files 29 | /eshell/history 30 | /eshell/lastdir 31 | 32 | # elpa packages 33 | /elpa/ 34 | 35 | # reftex files 36 | *.rel 37 | 38 | # AUCTeX auto folder 39 | /auto/ 40 | 41 | # cask packages 42 | .cask/ 43 | dist/ 44 | 45 | # Flycheck 46 | flycheck_*.el 47 | 48 | # server auth directory 49 | /server/ 50 | 51 | # projectiles files 52 | .projectile 53 | 54 | # directory configuration 55 | .dir-locals.el 56 | 57 | recentf 58 | .mc-lists.el 59 | bookmarks 60 | 61 | network-security.data 62 | 63 | # folder 64 | emojis/ 65 | eshell/ 66 | games/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Geektrans 2 | 极客翻译 3 | 使用有道翻译/百度翻译/金山词霸/微软翻译 api 的简易翻译工具。 4 | 5 | Q&A: 6 | 7 | Q: 如何使用? 8 | A: 目前有两种方式:一个,把文字分享到“极客翻译”。第二个,选中文字后,在增强剪贴板额外选项中选择“极客翻译”(6.0 以上)。 9 | 10 | Q: 我的手机上找不到分享选项! 11 | A: 你可能是改版安卓的受害者。可以尝试使用第三方的文字分享工具,如 BigBang。 12 | 13 | Q: 极客翻译会不会占据后台内存? 14 | A: 不使用时完全不会。你可以放心的使用“绿色守护”绿色化它。但不要使用冻结方式。 15 | 16 | ~~Q: 我必须申请自己的翻译密钥才能使用它吗?~~ 17 | ~~A: 不是。除微软翻译之外,你只需把填写密钥的位置留空,即可使用。~~ 18 | 19 | ~~Q: 为什么不给微软翻译设置默认密钥?~~ 20 | ~~A: 因为一个微软账户只能申请一个微软翻译密钥,所以恕不提供默认密钥。~~ 21 | 22 | Q: 申请自己的密钥有什么好处? 23 | A: 免费翻译接口是有翻译次数和频率限制的,所以公用一个密钥有可能导致请求失败,甚至接口被封禁无法使用。使用自己的密钥可避免这一问题。 24 | 25 | Q: 怎样才能申请到自己的密钥? 26 | A: 首先,打开极客翻译,进入每个翻译引擎设置,然后点击下方的翻译引擎图标,会自动打开对应的申请链接,根据说明进行申请。 27 | 28 | Q: 应用无法在我的手机上安装/运行/翻译…… 29 | A: 尝试在权限管理中允许“在其它应用的上层显示”权限。如果依然无法正常工作,可以直接在下方留言,我会尽力修复。 30 | 31 | Q: 我想帮助改进极客翻译。 32 | A: 欢迎。你可尽情地在此留下你的想法与讨论。本应用完全开源,如果你是开发者,可以直接在此贡献代码。由于是个人作品,能力有限,还请各位大大批评指正。如果你有好用的翻译 API 推荐,或者设计了一个不错的气泡 UI,都可以在此分享。 33 | 34 | Q: 可以换个图标么? 35 | A: 抱歉,我实在是不会图标设计,如果你想为它设计一款图标,我会万分感激。 36 | 37 | Q: 我想请开发者喝茶。 38 | A: 冷静!如果 10 分钟以后你依然无法克制住这种冲动,可以前往开发者的[简书](http://www.jianshu.com/users/ea4015fcb048/latest_articles),对我的技术/非技术文章进行打赏。 39 | 40 | 特殊权限 (Special Permissions) 兼容库 (Apache Licene 2.0): 41 | https://github.com/czy1121/settingscompat 42 | Retrofit: Type-safe HTTP client for Android and Java by Square, Inc. (Apache Licene 2.0): 43 | https://github.com/square/retrofit 44 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 25 5 | buildToolsVersion "25.0.3" 6 | 7 | defaultConfig { 8 | applicationId "com.blindingdark.geektrans" 9 | minSdkVersion 14 10 | targetSdkVersion 25 11 | versionCode 15 12 | versionName "0.8.2" 13 | 14 | vectorDrawables.useSupportLibrary = true 15 | } 16 | buildTypes { 17 | release { 18 | minifyEnabled false 19 | shrinkResources false 20 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 21 | } 22 | } 23 | sourceSets { 24 | main { 25 | jniLibs.srcDirs = ['libs'] 26 | } 27 | } 28 | } 29 | 30 | 31 | dependencies { 32 | compile fileTree(dir: 'libs', include: ['*.jar']) 33 | compile('com.googlecode.json-simple:json-simple:1.1.1') { 34 | exclude group: 'org.hamcrest', module: 'hamcrest-core' 35 | } 36 | compile 'com.android.support:appcompat-v7:25.3.1' 37 | compile 'com.android.support:design:25.3.1' 38 | compile 'com.android.support:recyclerview-v7:25.3.1' 39 | compile 'com.android.support:support-v4:25.3.1' 40 | compile 'com.android.support:support-vector-drawable:25.3.1' 41 | 42 | compile 'com.squareup.retrofit2:retrofit:2.2.0' 43 | compile group: 'com.squareup.retrofit2', name: 'converter-gson', version: '2.2.0' 44 | compile 'com.google.code.gson:gson:2.8.0' 45 | 46 | testCompile 'junit:junit:4.10' 47 | } 48 | -------------------------------------------------------------------------------- /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 C:\Users\BlindingDark\AppData\Local\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 | -dontwarn junit.*.** 12 | -dontwarn junit.framework.** 13 | 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/blindingdark/geektrans/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans; 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 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 35 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/GetTransTextActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.text.TextUtils; 7 | 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/20 0020. 11 | */ 12 | public class GetTransTextActivity extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | processIntent(getIntent()); 18 | finish(); 19 | } 20 | 21 | @Override 22 | protected void onNewIntent(Intent intent) { 23 | processIntent(intent); 24 | } 25 | 26 | private void processIntent(Intent intent) { 27 | String action = intent.getAction(); 28 | String text = null; 29 | 30 | if (Intent.ACTION_PROCESS_TEXT.equals(action)) { 31 | // Text shared with app via Intent 32 | text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT).toString(); 33 | } 34 | 35 | if (Intent.ACTION_SEND.equals(action)) { 36 | // Text shared with app via Intent 37 | text = intent.getStringExtra(Intent.EXTRA_TEXT); 38 | } 39 | 40 | if (!TextUtils.isEmpty(text)) { 41 | Intent transIntent = new Intent(); 42 | transIntent.putExtra("req", text); 43 | /* 指定intent要启动的类 */ 44 | transIntent.setClass(this, TransActivity.class); 45 | /* 启动一个新的Activity */ 46 | this.startActivity(transIntent); 47 | } 48 | 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/AddTransEngineActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import com.blindingdark.geektrans.R; 7 | 8 | public class AddTransEngineActivity extends AppCompatActivity { 9 | 10 | @Override 11 | protected void onCreate(Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | setContentView(R.layout.activity_add_trans_engine); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/BaiduSettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.View; 12 | import android.widget.AdapterView; 13 | import android.widget.EditText; 14 | import android.widget.Spinner; 15 | 16 | import com.blindingdark.geektrans.R; 17 | import com.blindingdark.geektrans.tools.Number; 18 | import com.blindingdark.geektrans.trans.baidu.BaiduSettingsString; 19 | 20 | 21 | public class BaiduSettingsActivity extends AppCompatActivity { 22 | 23 | SharedPreferences preferences; 24 | SharedPreferences.Editor editor; 25 | EditText editTextBDAPPID; 26 | EditText editTextBDKey; 27 | EditText editTextBDToastTime; 28 | Spinner spinnerBDFrom; 29 | Spinner spinnerBDTo; 30 | 31 | @Override 32 | protected void onCreate(Bundle savedInstanceState) { 33 | super.onCreate(savedInstanceState); 34 | setContentView(R.layout.activity_baidu_settings); 35 | 36 | preferences = PreferenceManager.getDefaultSharedPreferences(this); 37 | editor = preferences.edit(); 38 | 39 | editTextBDAPPID = (EditText) findViewById(R.id.BDAPPID); 40 | String BDAPPID = preferences.getString(BaiduSettingsString.baiduAppId, ""); 41 | editTextBDAPPID.setText(BDAPPID); 42 | editTextBDAPPID.addTextChangedListener(bdAPPIDTextWatcher); 43 | 44 | 45 | editTextBDKey = (EditText) findViewById(R.id.BDKey); 46 | String key = preferences.getString(BaiduSettingsString.baiduKey, ""); 47 | editTextBDKey.setText(key); 48 | editTextBDKey.addTextChangedListener(bdKeyTextWatcher); 49 | 50 | 51 | editTextBDToastTime = (EditText) findViewById(R.id.editTextBaiduToastTime); 52 | String bdToastTime = preferences.getString(BaiduSettingsString.baiduToastTime, BaiduSettingsString.defBaiduToastTime); 53 | editTextBDToastTime.setText(bdToastTime); 54 | editTextBDToastTime.addTextChangedListener(bdToastTimeWatcher); 55 | 56 | 57 | spinnerBDFrom = (Spinner) findViewById(R.id.BDLangFromSpinner); 58 | String defFrom = preferences.getString(BaiduSettingsString.baiduFrom, "0_auto"); 59 | spinnerBDFrom.setSelection(Integer.parseInt(defFrom.split("_")[0])); 60 | 61 | spinnerBDFrom.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 62 | @Override 63 | public void onItemSelected(AdapterView parent, View view, int position, long id) { 64 | String from = parent.getItemAtPosition(position).toString(); 65 | String fromCode = from.split("_")[1]; 66 | editor.putString(BaiduSettingsString.baiduFrom, position + "_" + fromCode); 67 | editor.commit(); 68 | } 69 | 70 | @Override 71 | public void onNothingSelected(AdapterView parent) { 72 | } 73 | }); 74 | 75 | spinnerBDTo = (Spinner) findViewById(R.id.BDLangToSpinner); 76 | String defTo = preferences.getString(BaiduSettingsString.baiduTo, "0_0"); 77 | spinnerBDTo.setSelection(Integer.parseInt(defTo.split("_")[0])); 78 | 79 | spinnerBDTo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 80 | 81 | @Override 82 | public void onItemSelected(AdapterView parent, View view, int position, long id) { 83 | String to = parent.getItemAtPosition(position).toString(); 84 | String toCode = to.split("_")[1]; 85 | editor.putString(BaiduSettingsString.baiduTo, position + "_" + toCode); 86 | editor.commit(); 87 | } 88 | 89 | @Override 90 | public void onNothingSelected(AdapterView parent) { 91 | 92 | } 93 | }); 94 | 95 | 96 | } 97 | 98 | TextWatcher bdAPPIDTextWatcher = new TextWatcher() { 99 | @Override 100 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 101 | 102 | } 103 | 104 | @Override 105 | public void onTextChanged(CharSequence s, int start, int before, int count) { 106 | 107 | } 108 | 109 | @Override 110 | public void afterTextChanged(Editable s) { 111 | editor.putString(BaiduSettingsString.baiduAppId, editTextBDAPPID.getText().toString()); 112 | editor.commit(); 113 | } 114 | }; 115 | 116 | TextWatcher bdKeyTextWatcher = new TextWatcher() { 117 | @Override 118 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 119 | 120 | } 121 | 122 | @Override 123 | public void onTextChanged(CharSequence s, int start, int before, int count) { 124 | 125 | } 126 | 127 | @Override 128 | public void afterTextChanged(Editable s) { 129 | editor.putString(BaiduSettingsString.baiduKey, editTextBDKey.getText().toString()); 130 | editor.commit(); 131 | } 132 | }; 133 | 134 | TextWatcher bdToastTimeWatcher = new TextWatcher() { 135 | @Override 136 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 137 | 138 | } 139 | 140 | @Override 141 | public void onTextChanged(CharSequence s, int start, int before, int count) { 142 | 143 | } 144 | 145 | @Override 146 | public void afterTextChanged(Editable s) { 147 | 148 | String time = editTextBDToastTime.getText().toString(); 149 | 150 | // 检测是否是合法数字 151 | if (Number.isLegalToastTime(time)) { 152 | editor.putString(BaiduSettingsString.baiduToastTime, time); 153 | editor.commit(); 154 | } 155 | 156 | } 157 | }; 158 | 159 | public void baiduLogoOnClick(View view) { 160 | Uri uri = Uri.parse("http://api.fanyi.baidu.com/api/trans/product/index"); 161 | startActivity(new Intent(Intent.ACTION_VIEW,uri)); 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/BingSettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.View; 12 | import android.widget.AdapterView; 13 | import android.widget.EditText; 14 | import android.widget.Spinner; 15 | 16 | import com.blindingdark.geektrans.R; 17 | import com.blindingdark.geektrans.tools.Number; 18 | import com.blindingdark.geektrans.trans.bing.StringBingSettings; 19 | 20 | public class BingSettingsActivity extends AppCompatActivity { 21 | SharedPreferences preferences; 22 | SharedPreferences.Editor editor; 23 | EditText editTextBingAppId; 24 | EditText editTextBingKey; 25 | EditText editTextBingToastTime; 26 | Spinner spinnerBingFrom; 27 | Spinner spinnerBingTo; 28 | 29 | @Override 30 | protected void onCreate(Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_bing_settings); 33 | 34 | preferences = PreferenceManager.getDefaultSharedPreferences(this); 35 | editor = preferences.edit(); 36 | 37 | editTextBingAppId = (EditText) findViewById(R.id.editTextBingAppId); 38 | String bingAppId = preferences.getString(StringBingSettings.bingAppId, ""); 39 | editTextBingAppId.setText(bingAppId); 40 | editTextBingAppId.addTextChangedListener(bingAppIdTextWatcher); 41 | 42 | editTextBingKey = (EditText) findViewById(R.id.editTextBingKey); 43 | String bingKey = preferences.getString(StringBingSettings.bingKey,""); 44 | editTextBingKey.setText(bingKey); 45 | editTextBingKey.addTextChangedListener(bingKeyTextWatcher); 46 | 47 | editTextBingToastTime = (EditText) findViewById(R.id.editTextBingToastTime); 48 | String bingToastTime = preferences.getString(StringBingSettings.bingToastTime,StringBingSettings.defBingToastTime); 49 | editTextBingToastTime.setText(bingToastTime); 50 | editTextBingToastTime.addTextChangedListener(bingToastTimeTextWatcher); 51 | 52 | 53 | spinnerBingFrom = (Spinner) findViewById(R.id.spinnerBingLangFrom); 54 | String defFrom = preferences.getString(StringBingSettings.bingFrom, "0_auto"); 55 | spinnerBingFrom.setSelection(Integer.parseInt(defFrom.split("_")[0])); 56 | 57 | spinnerBingFrom.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 58 | @Override 59 | public void onItemSelected(AdapterView parent, View view, int position, long id) { 60 | String from = parent.getItemAtPosition(position).toString(); 61 | String fromCode = from.split("_")[1]; 62 | editor.putString(StringBingSettings.bingFrom, position + "_" + fromCode); 63 | editor.commit(); 64 | } 65 | 66 | @Override 67 | public void onNothingSelected(AdapterView parent) { 68 | } 69 | }); 70 | 71 | 72 | spinnerBingTo = (Spinner) findViewById(R.id.spinnerBingLangTo); 73 | String defTo = preferences.getString(StringBingSettings.bingTo, "0_0"); 74 | spinnerBingTo.setSelection(Integer.parseInt(defTo.split("_")[0])); 75 | 76 | spinnerBingTo.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 77 | 78 | @Override 79 | public void onItemSelected(AdapterView parent, View view, int position, long id) { 80 | String to = parent.getItemAtPosition(position).toString(); 81 | String toCode = to.split("_")[1]; 82 | editor.putString(StringBingSettings.bingTo, position + "_" + toCode); 83 | editor.commit(); 84 | } 85 | 86 | @Override 87 | public void onNothingSelected(AdapterView parent) { 88 | 89 | } 90 | }); 91 | } 92 | 93 | TextWatcher bingAppIdTextWatcher = new TextWatcher() { 94 | @Override 95 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 96 | 97 | } 98 | 99 | @Override 100 | public void onTextChanged(CharSequence s, int start, int before, int count) { 101 | 102 | } 103 | 104 | @Override 105 | public void afterTextChanged(Editable s) { 106 | editor.putString(StringBingSettings.bingAppId, editTextBingAppId.getText().toString()); 107 | editor.commit(); 108 | } 109 | }; 110 | 111 | TextWatcher bingKeyTextWatcher = new TextWatcher() { 112 | @Override 113 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 114 | 115 | } 116 | 117 | @Override 118 | public void onTextChanged(CharSequence s, int start, int before, int count) { 119 | 120 | } 121 | 122 | @Override 123 | public void afterTextChanged(Editable s) { 124 | editor.putString(StringBingSettings.bingKey, editTextBingKey.getText().toString()); 125 | editor.commit(); 126 | } 127 | }; 128 | 129 | TextWatcher bingToastTimeTextWatcher = new TextWatcher() { 130 | @Override 131 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 132 | 133 | } 134 | 135 | @Override 136 | public void onTextChanged(CharSequence s, int start, int before, int count) { 137 | 138 | } 139 | 140 | @Override 141 | public void afterTextChanged(Editable s) { 142 | String time = editTextBingToastTime.getText().toString(); 143 | // 检测是否是合法数字 144 | if (Number.isLegalToastTime(time)) { 145 | editor.putString(StringBingSettings.bingToastTime, time); 146 | editor.commit(); 147 | } 148 | 149 | } 150 | }; 151 | 152 | public void bingLogoOnClick(View view) { 153 | Uri uri = Uri.parse("http://5icat.cn/thread-7180-1-1.html"); 154 | startActivity(new Intent(Intent.ACTION_VIEW,uri)); 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/JinshanSettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.View; 12 | import android.widget.CompoundButton; 13 | import android.widget.EditText; 14 | import android.widget.Switch; 15 | 16 | import com.blindingdark.geektrans.R; 17 | import com.blindingdark.geektrans.global.StringMainSettings; 18 | import com.blindingdark.geektrans.tools.Number; 19 | import com.blindingdark.geektrans.trans.jinshan.Jinshan; 20 | import com.blindingdark.geektrans.trans.jinshan.StringJinshanSettings; 21 | 22 | public class JinshanSettingsActivity extends AppCompatActivity { 23 | 24 | SharedPreferences preferences; 25 | SharedPreferences.Editor editor; 26 | EditText editTextJinshanKey; 27 | EditText editTextJinshanToastTime; 28 | Switch switchJinshanSoundRemix; 29 | 30 | @Override 31 | protected void onCreate(Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_jinshan_settings); 34 | 35 | preferences = PreferenceManager.getDefaultSharedPreferences(this); 36 | editor = preferences.edit(); 37 | 38 | editTextJinshanKey = (EditText) findViewById(R.id.editTextJinshanKey); 39 | String jinshanKey = preferences.getString(StringJinshanSettings.jinshanKey, ""); 40 | editTextJinshanKey.setText(jinshanKey); 41 | editTextJinshanKey.addTextChangedListener(jinshanKeyTextWatcher); 42 | 43 | editTextJinshanToastTime = (EditText) findViewById(R.id.editTextJinshanToastTime); 44 | String jinshanToastTime = preferences.getString(StringJinshanSettings.jinshanToastTime, StringJinshanSettings.defJinshanToastTime); 45 | editTextJinshanToastTime.setText(jinshanToastTime); 46 | editTextJinshanToastTime.addTextChangedListener(jinshanToastTimeTextWatcher); 47 | 48 | switchJinshanSoundRemix = (Switch) findViewById(R.id.switchJinshanSoundRemix); 49 | String nowSoundEngine = preferences.getString(StringMainSettings.DEFAULT_SOUND_ENGINE, ""); 50 | if (nowSoundEngine.equals(Jinshan.ENGINE_NAME)) { 51 | switchJinshanSoundRemix.setChecked(true); 52 | } else { 53 | switchJinshanSoundRemix.setChecked(false); 54 | } 55 | 56 | // 2016/8/24 0024 当改变时的动作 57 | switchJinshanSoundRemix.setOnCheckedChangeListener(jinshanSoundRemixChangeListener); 58 | 59 | } 60 | 61 | CompoundButton.OnCheckedChangeListener jinshanSoundRemixChangeListener = new CompoundButton.OnCheckedChangeListener() { 62 | @Override 63 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 64 | if (isChecked) { 65 | editor.putString(StringMainSettings.DEFAULT_SOUND_ENGINE, Jinshan.ENGINE_NAME); 66 | } 67 | if (!isChecked) { 68 | if (preferences.getString(StringMainSettings.DEFAULT_SOUND_ENGINE, "").equals(Jinshan.ENGINE_NAME)) { 69 | editor.putString(StringMainSettings.DEFAULT_SOUND_ENGINE, ""); 70 | } 71 | } 72 | editor.commit(); 73 | 74 | } 75 | }; 76 | 77 | TextWatcher jinshanKeyTextWatcher = new TextWatcher() { 78 | @Override 79 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 80 | 81 | } 82 | 83 | @Override 84 | public void onTextChanged(CharSequence s, int start, int before, int count) { 85 | 86 | } 87 | 88 | @Override 89 | public void afterTextChanged(Editable s) { 90 | editor.putString(StringJinshanSettings.jinshanKey, editTextJinshanKey.getText().toString()); 91 | editor.commit(); 92 | } 93 | }; 94 | 95 | TextWatcher jinshanToastTimeTextWatcher = new TextWatcher() { 96 | @Override 97 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 98 | 99 | } 100 | 101 | @Override 102 | public void onTextChanged(CharSequence s, int start, int before, int count) { 103 | 104 | } 105 | 106 | @Override 107 | public void afterTextChanged(Editable s) { 108 | 109 | String time = editTextJinshanToastTime.getText().toString(); 110 | 111 | // 检测是否是合法数字 112 | if (Number.isLegalToastTime(time)) { 113 | editor.putString(StringJinshanSettings.jinshanToastTime, time); 114 | editor.commit(); 115 | } 116 | 117 | 118 | } 119 | }; 120 | 121 | public void jinshanLogoOnClick(View view) { 122 | Uri uri = Uri.parse("http://open.iciba.com/?c=api"); 123 | startActivity(new Intent(Intent.ACTION_VIEW, uri)); 124 | 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Context; 4 | import android.content.DialogInterface; 5 | import android.content.Intent; 6 | import android.content.SharedPreferences; 7 | import android.graphics.Canvas; 8 | import android.os.Bundle; 9 | import android.preference.PreferenceManager; 10 | import android.support.design.widget.FloatingActionButton; 11 | import android.support.design.widget.Snackbar; 12 | import android.support.v7.app.AlertDialog; 13 | import android.support.v7.app.AppCompatActivity; 14 | import android.support.v7.widget.DefaultItemAnimator; 15 | import android.support.v7.widget.LinearLayoutManager; 16 | import android.support.v7.widget.RecyclerView; 17 | import android.support.v7.widget.Toolbar; 18 | import android.support.v7.widget.helper.ItemTouchHelper; 19 | import android.view.MenuItem; 20 | import android.view.View; 21 | import android.widget.Toast; 22 | 23 | import com.blindingdark.geektrans.R; 24 | import com.blindingdark.geektrans.adapter.EngineInfoRecyclerViewAdapter; 25 | import com.blindingdark.geektrans.bean.TransEngineInfo; 26 | import com.blindingdark.geektrans.global.SeqMainSettings; 27 | import com.blindingdark.geektrans.global.StringMainSettings; 28 | import com.blindingdark.geektrans.global.TransEngineInfoFactory; 29 | import com.blindingdark.geektrans.ui.DividerItemDecoration; 30 | 31 | import java.util.ArrayList; 32 | import java.util.HashSet; 33 | import java.util.List; 34 | import java.util.Set; 35 | 36 | import ezy.assist.compat.SettingsCompat; 37 | 38 | 39 | public class MainActivity extends AppCompatActivity { 40 | 41 | SharedPreferences preferences; 42 | SharedPreferences.Editor editor; 43 | private RecyclerView recyclerViewEngines; 44 | EngineInfoRecyclerViewAdapter engineInfoRecyclerViewAdapter; 45 | private List transEngineInfos = new ArrayList<>(); 46 | 47 | 48 | @Override 49 | protected void onCreate(Bundle savedInstanceState) { 50 | super.onCreate(savedInstanceState); 51 | setContentView(R.layout.activity_main); 52 | 53 | preferences = PreferenceManager.getDefaultSharedPreferences(this); 54 | editor = preferences.edit(); 55 | 56 | Set defaultTransSet = SeqMainSettings.getDefaultEngines(); 57 | // 得到当前已添加的引擎列表 58 | 59 | // 想改 preferences.getStringSet 要 new 一个新的 60 | final HashSet nowTransEngines = new HashSet<>(preferences.getStringSet(StringMainSettings.NOW_ENGINE_LIST, defaultTransSet)); 61 | 62 | for (String transEPackageName : nowTransEngines) { 63 | transEngineInfos.add(TransEngineInfoFactory.getTransEngineInfo(transEPackageName)); 64 | } 65 | 66 | recyclerViewEngines = (RecyclerView) findViewById(R.id.recyclerViewEngines); 67 | 68 | recyclerViewEngines.setLayoutManager(new LinearLayoutManager(this)); 69 | engineInfoRecyclerViewAdapter = new EngineInfoRecyclerViewAdapter(this, transEngineInfos); 70 | recyclerViewEngines.setAdapter(engineInfoRecyclerViewAdapter); 71 | 72 | // 设置分割线 73 | recyclerViewEngines.addItemDecoration(new DividerItemDecoration(this, 74 | DividerItemDecoration.VERTICAL_LIST)); 75 | 76 | // 设置添加动画 77 | recyclerViewEngines.setItemAnimator(new DefaultItemAnimator()); 78 | 79 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 80 | 81 | // toolbar 设置 82 | toolbar.setTitle(this.getString(R.string.app_name)); 83 | toolbar.inflateMenu(R.menu.menu_main); 84 | toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { 85 | @Override 86 | public boolean onMenuItemClick(MenuItem item) { 87 | // Handle the menu item 88 | switch (item.getItemId()) { 89 | case R.id.other_settings: 90 | Intent transIntent = new Intent(); 91 | transIntent.setClass(MainActivity.this, OtherSettingsActivity.class); 92 | MainActivity.this.startActivity(transIntent); 93 | break; 94 | } 95 | return true; 96 | } 97 | }); 98 | 99 | 100 | FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 101 | 102 | 103 | fab.setOnClickListener(new View.OnClickListener() { 104 | @Override 105 | public void onClick(View view) { 106 | Set allEnginesTemp = SeqMainSettings.getAllEngines(); 107 | allEnginesTemp.removeAll(nowTransEngines); 108 | 109 | if (allEnginesTemp.isEmpty()) { 110 | final Snackbar snackbar = Snackbar.make(view, "暂时没有更多引擎啦~", Snackbar.LENGTH_SHORT); 111 | snackbar.setAction("知道了", new View.OnClickListener() { 112 | @Override 113 | public void onClick(View v) { 114 | snackbar.dismiss(); 115 | } 116 | }); 117 | snackbar.show(); 118 | return; 119 | } 120 | 121 | AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 122 | 123 | final List addableEInfoList = new ArrayList<>(); 124 | List showAddList = new ArrayList<>(); 125 | for (String enginePackageName : allEnginesTemp) { 126 | TransEngineInfo info = TransEngineInfoFactory.getTransEngineInfo(enginePackageName); 127 | addableEInfoList.add(info); 128 | showAddList.add(info.getEngineName()); 129 | } 130 | 131 | 132 | builder.setItems(showAddList.toArray(new String[0]), new DialogInterface.OnClickListener() { 133 | public void onClick(DialogInterface arg0, int arg1) { 134 | nowTransEngines.add(addableEInfoList.get(arg1).getEnginePackageName()); 135 | editor.putStringSet(StringMainSettings.NOW_ENGINE_LIST, nowTransEngines); 136 | editor.commit(); 137 | transEngineInfos.add(addableEInfoList.get(arg1)); 138 | arg0.dismiss(); 139 | try { 140 | Thread.sleep(200); 141 | } catch (InterruptedException e) { 142 | e.printStackTrace(); 143 | } 144 | engineInfoRecyclerViewAdapter.notifyItemInserted(nowTransEngines.size()); 145 | } 146 | }); 147 | builder.show(); 148 | 149 | } 150 | }); 151 | 152 | // 引擎卡片滑动 153 | //0则不执行拖动或者滑动 154 | ItemTouchHelper.Callback mCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) { 155 | @Override 156 | public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { 157 | return false; 158 | } 159 | 160 | /** 161 | * @param viewHolder 拖动的ViewHolder 162 | * @return 163 | */ 164 | @Override 165 | public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 166 | int position = viewHolder.getAdapterPosition(); 167 | 168 | nowTransEngines.remove(transEngineInfos.get(position).getEnginePackageName()); 169 | 170 | editor.putStringSet(StringMainSettings.NOW_ENGINE_LIST, nowTransEngines); 171 | editor.commit(); 172 | 173 | transEngineInfos.remove(position); 174 | engineInfoRecyclerViewAdapter.notifyItemRemoved(position); 175 | } 176 | 177 | @Override 178 | public void onChildDraw(Canvas c, RecyclerView recyclerView, 179 | RecyclerView.ViewHolder viewHolder, 180 | float dX, float dY, int actionState, boolean isCurrentlyActive) { 181 | super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); 182 | if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { 183 | //滑动时改变Item的透明度 184 | final float alpha = 1 - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); 185 | viewHolder.itemView.setAlpha(alpha); 186 | viewHolder.itemView.setTranslationX(dX); 187 | } 188 | } 189 | 190 | 191 | }; 192 | // 添加触摸事件支持 193 | ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mCallback); 194 | itemTouchHelper.attachToRecyclerView(recyclerViewEngines); 195 | 196 | Context context = getApplicationContext(); 197 | if(!SettingsCompat.canDrawOverlays(context)){ 198 | Toast.makeText(context,"检测到未开启“在上层显示”权限,请前往设置开启。",Toast.LENGTH_LONG).show(); 199 | } 200 | } 201 | 202 | 203 | 204 | } 205 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/OtherSettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | 7 | 8 | /** 9 | * Created by BlindingDark on 2016/12/1 0001. 10 | */ 11 | public class OtherSettingsActivity extends AppCompatActivity { 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit(); 17 | } 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/PrefsFragement.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.os.Bundle; 6 | import android.preference.Preference; 7 | import android.preference.PreferenceFragment; 8 | 9 | import com.blindingdark.geektrans.R; 10 | import com.blindingdark.geektrans.activity.TransActivity; 11 | 12 | import ezy.assist.compat.SettingsCompat; 13 | 14 | /** 15 | * Created by BlindingDark on 2016/12/1 0001. 16 | */ 17 | 18 | public class PrefsFragement extends PreferenceFragment { 19 | 20 | public Context context; 21 | 22 | @Override 23 | public void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | context = this.getActivity(); 26 | addPreferencesFromResource(R.xml.preferences_other_settings); 27 | 28 | findPreference("NOW_TOAST_STYLE").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 29 | 30 | @Override 31 | public boolean onPreferenceChange(Preference preference, Object choose) { 32 | Intent transIntent = new Intent(); 33 | transIntent.putExtra("req", "test"); 34 | transIntent.setClass(context, TransActivity.class); 35 | 36 | context.startActivity(transIntent); 37 | return true; 38 | } 39 | }); 40 | 41 | findPreference("JUMP_TO_DRAW_OVERLAYS_SETTING").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { 42 | @Override 43 | public boolean onPreferenceClick(Preference preference) { 44 | SettingsCompat.manageDrawOverlays(context); 45 | return true; 46 | } 47 | }); 48 | 49 | 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/activity/settings/YoudaoSettingsActivity.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.activity.settings; 2 | 3 | import android.content.Intent; 4 | import android.content.SharedPreferences; 5 | import android.net.Uri; 6 | import android.os.Bundle; 7 | import android.preference.PreferenceManager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.text.Editable; 10 | import android.text.TextWatcher; 11 | import android.view.View; 12 | import android.widget.CompoundButton; 13 | import android.widget.EditText; 14 | import android.widget.Switch; 15 | 16 | import com.blindingdark.geektrans.R; 17 | import com.blindingdark.geektrans.global.StringMainSettings; 18 | import com.blindingdark.geektrans.tools.Number; 19 | import com.blindingdark.geektrans.trans.youdao.Youdao; 20 | import com.blindingdark.geektrans.trans.youdao.YoudaoSettingsString; 21 | 22 | public class YoudaoSettingsActivity extends AppCompatActivity { 23 | 24 | EditText editTextKey; 25 | EditText editTextKeyfrom; 26 | EditText editTextDivLine; 27 | EditText editTextToastTime; 28 | 29 | Switch switchYoudaoSoundRemix; 30 | 31 | SharedPreferences preferences; 32 | SharedPreferences.Editor editor; 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_youdao_settings); 38 | 39 | preferences = PreferenceManager.getDefaultSharedPreferences(this); 40 | editor = preferences.edit(); 41 | 42 | editTextKey = (EditText) findViewById(R.id.edtTxtApiKey); 43 | String key = preferences.getString(YoudaoSettingsString.youdaoKey, ""); 44 | editTextKey.setText(key); 45 | editTextKey.addTextChangedListener(keyTextWatcher); 46 | 47 | editTextDivLine = (EditText) findViewById(R.id.edtTxtDivisionLine); 48 | String divLine = preferences.getString(YoudaoSettingsString.divisionLine, YoudaoSettingsString.defaultDivLine); 49 | editTextDivLine.setText(divLine); 50 | editTextDivLine.addTextChangedListener(divTextWatcher); 51 | 52 | editTextToastTime = (EditText) findViewById(R.id.edtTxtYoudaoToastTime); 53 | String youdaoToastTime = preferences.getString(YoudaoSettingsString.youdaoToastTime, YoudaoSettingsString.youdaoDefToastTime); 54 | editTextToastTime.setText(youdaoToastTime); 55 | 56 | editTextToastTime.addTextChangedListener(toastTimeWatcher); 57 | 58 | switchYoudaoSoundRemix = (Switch) findViewById(R.id.switchYoudaoSoundRemix); 59 | String nowSoundEngine = preferences.getString(StringMainSettings.DEFAULT_SOUND_ENGINE, ""); 60 | if (nowSoundEngine.equals(Youdao.ENGINE_NAME)) { 61 | switchYoudaoSoundRemix.setChecked(true); 62 | } else { 63 | switchYoudaoSoundRemix.setChecked(false); 64 | } 65 | 66 | switchYoudaoSoundRemix.setOnCheckedChangeListener(youdaoSoundRemixChangeListener); 67 | 68 | } 69 | 70 | CompoundButton.OnCheckedChangeListener youdaoSoundRemixChangeListener = new CompoundButton.OnCheckedChangeListener() { 71 | @Override 72 | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 73 | if (isChecked) { 74 | editor.putString(StringMainSettings.DEFAULT_SOUND_ENGINE, Youdao.ENGINE_NAME); 75 | } 76 | if (!isChecked) { 77 | if (preferences.getString(StringMainSettings.DEFAULT_SOUND_ENGINE, "").equals(Youdao.ENGINE_NAME)) { 78 | editor.putString(StringMainSettings.DEFAULT_SOUND_ENGINE, ""); 79 | } 80 | } 81 | editor.commit(); 82 | } 83 | }; 84 | 85 | TextWatcher keyTextWatcher = new TextWatcher() { 86 | 87 | @Override 88 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 89 | 90 | } 91 | 92 | @Override 93 | public void onTextChanged(CharSequence s, int start, int before, int count) { 94 | 95 | } 96 | 97 | @Override 98 | public void afterTextChanged(Editable s) { 99 | editor.putString(YoudaoSettingsString.youdaoKey, editTextKey.getText().toString()); 100 | editor.commit(); 101 | } 102 | }; 103 | 104 | TextWatcher divTextWatcher = new TextWatcher() { 105 | 106 | @Override 107 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 108 | 109 | } 110 | 111 | @Override 112 | public void onTextChanged(CharSequence s, int start, int before, int count) { 113 | 114 | } 115 | 116 | @Override 117 | public void afterTextChanged(Editable s) { 118 | editor.putString(YoudaoSettingsString.divisionLine, editTextDivLine.getText().toString()); 119 | editor.commit(); 120 | } 121 | }; 122 | 123 | TextWatcher toastTimeWatcher = new TextWatcher() { 124 | @Override 125 | public void beforeTextChanged(CharSequence s, int start, int count, int after) { 126 | 127 | } 128 | 129 | @Override 130 | public void onTextChanged(CharSequence s, int start, int before, int count) { 131 | 132 | } 133 | 134 | @Override 135 | public void afterTextChanged(Editable s) { 136 | String time = editTextToastTime.getText().toString(); 137 | 138 | // 检测是否是合法数字 139 | 140 | if (Number.isLegalToastTime(time)) { 141 | editor.putString(YoudaoSettingsString.youdaoToastTime, time); 142 | editor.commit(); 143 | } 144 | } 145 | }; 146 | 147 | public void youdaoLogoClick(View view) { 148 | Uri uri = Uri.parse("http://ai.youdao.com/doc.s"); 149 | startActivity(new Intent(Intent.ACTION_VIEW,uri)); 150 | } 151 | } 152 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/adapter/EngineInfoRecyclerViewAdapter.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.adapter; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.content.SharedPreferences; 6 | import android.preference.PreferenceManager; 7 | import android.support.v7.widget.RecyclerView; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | import android.view.ViewGroup; 11 | import android.widget.Button; 12 | import android.widget.CheckBox; 13 | import android.widget.TextView; 14 | 15 | import com.blindingdark.geektrans.R; 16 | import com.blindingdark.geektrans.bean.TransEngineInfo; 17 | import com.blindingdark.geektrans.global.StringMainSettings; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * Created by BlindingDark on 2016/11/29 0029. 24 | */ 25 | 26 | public class EngineInfoRecyclerViewAdapter extends android.support.v7.widget.RecyclerView.Adapter { 27 | 28 | 29 | private List transEngineInfos; 30 | private List checkBoxes = new ArrayList<>(); 31 | private LayoutInflater mInflater; 32 | private Context context; 33 | private SharedPreferences.Editor editor; 34 | private SharedPreferences sharedPreferences; 35 | 36 | //构造方法 37 | public EngineInfoRecyclerViewAdapter(Context context, List transEngineInfos) { 38 | this.context = context; 39 | this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); 40 | this.editor = this.sharedPreferences.edit(); 41 | this.transEngineInfos = transEngineInfos; 42 | mInflater = LayoutInflater.from(context); 43 | } 44 | 45 | @Override 46 | public EngineInfoRecyclerViewAdapter.EngineInfoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 47 | 48 | View convertView = mInflater.inflate(R.layout.item_engine_info, null); 49 | //实例化布局 50 | EngineInfoRecyclerViewAdapter.EngineInfoViewHolder engineInfoViewHolder = new EngineInfoRecyclerViewAdapter.EngineInfoViewHolder(convertView); 51 | 52 | //管理 checkBox 列表 53 | checkBoxes.add(engineInfoViewHolder.checkBox); 54 | 55 | return engineInfoViewHolder; 56 | } 57 | 58 | @Override 59 | public void onBindViewHolder(EngineInfoRecyclerViewAdapter.EngineInfoViewHolder engineSettingsViewHolder, int position) { 60 | final TransEngineInfo info = transEngineInfos.get(position); 61 | // 这里不知为啥得到的缓存有问题,要强行设置为 false 62 | engineSettingsViewHolder.checkBox.setChecked(false); 63 | //设置布局中要显示的东西 64 | 65 | // 从引擎列表里获取当前位置的引擎名字,并设置 66 | engineSettingsViewHolder.engineName.setText(info.getEngineName()); 67 | 68 | 69 | engineSettingsViewHolder.button.setOnClickListener(new View.OnClickListener() { 70 | @Override 71 | public void onClick(View v) { 72 | Intent transIntent = new Intent(); 73 | /* 指定intent要启动的类 */ 74 | try { 75 | /* 跳转 */ 76 | transIntent.setClass(context, Class.forName(info.getEngineSettingsActivityPackageName())); 77 | } catch (ClassNotFoundException e) { 78 | e.printStackTrace(); 79 | } 80 | /* 启动一个新的Activity */ 81 | context.startActivity(transIntent); 82 | } 83 | }); 84 | 85 | // 引擎选择 86 | 87 | // 现在所选的引擎包名 88 | String nowTransEngine = sharedPreferences.getString(StringMainSettings.NOW_TRANS_ENGINE, StringMainSettings.DEFAULT_NOW_TRANS_ENGINE); 89 | // 如果当前显示的引擎是默认引擎 90 | if (nowTransEngine.equals(info.getEnginePackageName())) { 91 | engineSettingsViewHolder.checkBox.setChecked(true); 92 | } 93 | 94 | final CheckBox thisCheckBox = engineSettingsViewHolder.checkBox; 95 | engineSettingsViewHolder.checkBox.setOnClickListener(new View.OnClickListener() { 96 | @Override 97 | public void onClick(View v) { 98 | if (thisCheckBox.isChecked()) { 99 | for (CheckBox cb : checkBoxes) { 100 | if (null != cb) { 101 | cb.setChecked(false); 102 | } 103 | } 104 | editor.putString(StringMainSettings.NOW_TRANS_ENGINE, info.getEnginePackageName()); 105 | editor.commit(); 106 | } 107 | thisCheckBox.setChecked(true); 108 | } 109 | }); 110 | 111 | } 112 | 113 | @Override 114 | public int getItemCount() { 115 | return transEngineInfos.size(); 116 | } 117 | 118 | public class EngineInfoViewHolder extends RecyclerView.ViewHolder { 119 | 120 | public TextView engineName; 121 | public CheckBox checkBox; 122 | public Button button; 123 | 124 | public EngineInfoViewHolder(View itemView) { 125 | super(itemView); 126 | engineName = (TextView) itemView.findViewById(R.id.engineName); 127 | button = (Button) itemView.findViewById(R.id.buttonJumpToSettings); 128 | checkBox = (CheckBox) itemView.findViewById(R.id.checkBox); 129 | } 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/api/TransEngine.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.api; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Handler; 5 | 6 | 7 | /** 8 | * Created by BlindingDark on 2016/8/21 0021. 9 | */ 10 | public interface TransEngine { 11 | 12 | void setPreferences(SharedPreferences preferences); 13 | 14 | SharedPreferences getPreferences(); 15 | 16 | 17 | String getEngineName(); 18 | 19 | /** 20 | * @param req 21 | * @param handler 22 | */ 23 | void trans(String req, Handler handler, SharedPreferences preferences); 24 | 25 | /** 26 | * 27 | * @param req 要翻译的内容 28 | * @param handler 回调 29 | */ 30 | void trans(String req, Handler handler); 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/bean/Result.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.bean; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Created by BlindingDark on 2016/8/24 0024. 8 | */ 9 | public class Result { 10 | public String getOriginalReq() { 11 | return originalReq; 12 | } 13 | 14 | public Result setOriginalReq(String originalReq) { 15 | this.originalReq = originalReq; 16 | return this; 17 | } 18 | 19 | String originalReq = ""; 20 | 21 | int what = 0; 22 | String stringResult = ""; 23 | List soundURLs = new ArrayList<>(); 24 | 25 | public int getWhat() { 26 | return what; 27 | } 28 | 29 | public Result setWhat(int what) { 30 | this.what = what; 31 | return this; 32 | } 33 | 34 | public String getStringResult() { 35 | return stringResult; 36 | } 37 | 38 | public Result setStringResult(String stringResult) { 39 | this.stringResult = stringResult; 40 | return this; 41 | } 42 | 43 | public ArrayList getSoundURLs() { 44 | if (soundURLs != null) { 45 | return (ArrayList) soundURLs; 46 | } else { 47 | return new ArrayList<>(); 48 | } 49 | } 50 | 51 | public Result setSoundURLs(List soundURLs) { 52 | this.soundURLs = soundURLs; 53 | return this; 54 | } 55 | 56 | String fromEngineName = ""; 57 | 58 | public void setFromEngineName(String fromEngineName) { 59 | this.fromEngineName = fromEngineName; 60 | } 61 | 62 | public String getFromEngineName() { 63 | 64 | return fromEngineName; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/bean/TransEngineInfo.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.bean; 2 | 3 | /** 4 | * Created by BlindingDark on 2016/11/28 0028. 5 | */ 6 | 7 | public class TransEngineInfo { 8 | String engineName = ""; 9 | String enginePackageName = ""; 10 | String engineSettingsActivityPackageName = ""; 11 | 12 | public String getEngineName() { 13 | return engineName; 14 | } 15 | 16 | public void setEngineName(String engineName) { 17 | this.engineName = engineName; 18 | } 19 | 20 | public String getEnginePackageName() { 21 | return enginePackageName; 22 | } 23 | 24 | public void setEnginePackageName(String enginePackageName) { 25 | this.enginePackageName = enginePackageName; 26 | } 27 | 28 | public String getEngineSettingsActivityPackageName() { 29 | return engineSettingsActivityPackageName; 30 | } 31 | 32 | public void setEngineSettingsActivityPackageName(String engineSettingsActivityPackageName) { 33 | this.engineSettingsActivityPackageName = engineSettingsActivityPackageName; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | /** 7 | * Created by zhuakuang on 17-12-24. 8 | */ 9 | 10 | public class MyApplication extends Application { 11 | private static Context context; 12 | 13 | @Override 14 | public void onCreate() { 15 | //获取Context 16 | super.onCreate(); 17 | context = getApplicationContext(); 18 | } 19 | 20 | //返回 21 | public static Context getContextObject() { 22 | return context; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/SeqMainSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | /** 7 | * Created by BlindingDark on 2016/11/30 0030. 8 | */ 9 | 10 | public class SeqMainSettings { 11 | 12 | public static Set getDefaultEngines() { 13 | Set DEFAULT_ENGINES = new HashSet<>(); 14 | DEFAULT_ENGINES.add(StringMainSettings.JINSHAN_TRANS_ENGINE); 15 | DEFAULT_ENGINES.add(StringMainSettings.BAIDU_TRANS_ENGINE); 16 | 17 | return DEFAULT_ENGINES; 18 | } 19 | 20 | public static Set getAllEngines() { 21 | Set ALL_ENGINES = new HashSet<>(); 22 | ALL_ENGINES.add(StringMainSettings.YOUDAO_TRANS_ENGINE); 23 | ALL_ENGINES.add(StringMainSettings.JINSHAN_TRANS_ENGINE); 24 | ALL_ENGINES.add(StringMainSettings.BAIDU_TRANS_ENGINE); 25 | // ALL_ENGINES.add(StringMainSettings.BING_TRANS_ENGINE); 26 | 27 | return ALL_ENGINES; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/StringMainSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import com.blindingdark.geektrans.trans.baidu.Baidu; 4 | import com.blindingdark.geektrans.trans.bing.Bing; 5 | import com.blindingdark.geektrans.trans.jinshan.Jinshan; 6 | import com.blindingdark.geektrans.trans.youdao.Youdao; 7 | /** 8 | * Created by BlindingDark on 2016/8/22 0022. 9 | */ 10 | public class StringMainSettings { 11 | public static final String NOW_TRANS_ENGINE = "NOW_TRANS_ENGINE"; 12 | public static final String NOW_ENGINE_LIST = "NOW_ENGINE_LIST"; 13 | public static final String NOW_SOUND_ENGINE_LIST = "NOW_SOUND_ENGINE_LIST"; 14 | public static final String DEFAULT_SOUND_ENGINE = "DEFAULT_SOUND_ENGINE"; 15 | public static final String TOAST_TIME = ".TOAST_TIME"; 16 | public static final String DEFAULT_TOAST_TIME = "DEFAULT_TOAST_TIME"; 17 | public static final String IS_AUTO_COPY_OPEN = "IS_AUTO_COPY_OPEN"; 18 | public static final String NOW_TOAST_STYLE = "NOW_TOAST_STYLE"; 19 | public static final String LONG_CLICK_TOAST_ACT = "LONG_CLICK_TOAST_ACT"; 20 | 21 | public static final String YOUDAO_TRANS_ENGINE = Youdao.ENGINE_PACKAGE_NAME; 22 | public static final String BAIDU_TRANS_ENGINE = Baidu.ENGINE_PACKAGE_NAME; 23 | public static final String JINSHAN_TRANS_ENGINE = Jinshan.ENGINE_PACKAGE_NAME; 24 | public static final String BING_TRANS_ENGINE = Bing.ENGINE_PACKAGE_NAME; 25 | 26 | public static final String DEFAULT_NOW_TRANS_ENGINE = JINSHAN_TRANS_ENGINE; 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/ToastStyleFactory.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import android.support.annotation.Nullable; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | 7 | import com.blindingdark.geektrans.R; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/12/1 0001. 11 | */ 12 | 13 | public class ToastStyleFactory { 14 | LayoutInflater inflater; 15 | 16 | public ToastStyleFactory(LayoutInflater inflater) { 17 | this.inflater = inflater; 18 | } 19 | 20 | @Nullable 21 | public View getSimpleToastStyleById(String id) { 22 | View view = null; 23 | switch (id) { 24 | case "0": 25 | view = inflater.inflate(R.layout.toast_simple, null);// 得到自定气泡 26 | break; 27 | case "1": 28 | view = inflater.inflate(R.layout.toast_simple_card_write, null);// 得到自定气泡 29 | break; 30 | default: 31 | view = inflater.inflate(R.layout.toast_simple, null);// 得到自定气泡 32 | break; 33 | } 34 | return view; 35 | } 36 | 37 | @Nullable 38 | public View getSoundToastStyleById(String id) { 39 | View view = null; 40 | switch (id) { 41 | case "0": 42 | view = inflater.inflate(R.layout.toast_with_sound, null);// 得到自定气泡 43 | break; 44 | case "1": 45 | view = inflater.inflate(R.layout.toast_with_sound_card_write, null);// 得到自定气泡 46 | 47 | break; 48 | default: 49 | view = inflater.inflate(R.layout.toast_with_sound, null);// 得到自定气泡 50 | break; 51 | } 52 | return view; 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/TransEngineFactory.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import android.content.SharedPreferences; 4 | import android.support.annotation.Nullable; 5 | 6 | import com.blindingdark.geektrans.api.TransEngine; 7 | 8 | /** 9 | * Created by BlindingDark on 2016/11/21 0021. 10 | */ 11 | 12 | public class TransEngineFactory { 13 | 14 | @Nullable 15 | public static TransEngine getTransEngine(String enginePackageName) { 16 | Class c = null; 17 | TransEngine transEngine = null; 18 | try { 19 | c = Class.forName(enginePackageName); 20 | transEngine = (TransEngine) c.newInstance(); 21 | 22 | } catch (ClassNotFoundException e) { 23 | e.printStackTrace(); 24 | } catch (InstantiationException e) { 25 | e.printStackTrace(); 26 | } catch (IllegalAccessException e) { 27 | e.printStackTrace(); 28 | } 29 | 30 | return transEngine; 31 | } 32 | 33 | 34 | @Nullable 35 | public static TransEngine getTransEngine(String enginePackageName, SharedPreferences preferences) { 36 | Class c = null; 37 | TransEngine transEngine = null; 38 | try { 39 | c = Class.forName(enginePackageName); 40 | transEngine = (TransEngine) c.newInstance(); 41 | transEngine.setPreferences(preferences); 42 | } catch (ClassNotFoundException e) { 43 | e.printStackTrace(); 44 | } catch (InstantiationException e) { 45 | e.printStackTrace(); 46 | } catch (IllegalAccessException e) { 47 | e.printStackTrace(); 48 | } 49 | 50 | return transEngine; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/global/TransEngineInfoFactory.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.global; 2 | 3 | import com.blindingdark.geektrans.bean.TransEngineInfo; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | /** 9 | * Created by BlindingDark on 2016/11/28 0028. 10 | */ 11 | 12 | public class TransEngineInfoFactory { 13 | 14 | public static Map packageName_transEngineInfo = new HashMap<>(); 15 | 16 | // 添加引擎对应关系 17 | static { 18 | TransEngineInfo youdao = new TransEngineInfo(); 19 | youdao.setEnginePackageName(StringMainSettings.YOUDAO_TRANS_ENGINE); 20 | youdao.setEngineName("有道翻译"); 21 | youdao.setEngineSettingsActivityPackageName("com.blindingdark.geektrans.activity.settings.YoudaoSettingsActivity"); 22 | packageName_transEngineInfo.put(youdao.getEnginePackageName(), youdao); 23 | 24 | TransEngineInfo baidu = new TransEngineInfo(); 25 | baidu.setEnginePackageName(StringMainSettings.BAIDU_TRANS_ENGINE); 26 | baidu.setEngineName("百度翻译"); 27 | baidu.setEngineSettingsActivityPackageName("com.blindingdark.geektrans.activity.settings.BaiduSettingsActivity"); 28 | packageName_transEngineInfo.put(baidu.getEnginePackageName(), baidu); 29 | 30 | TransEngineInfo jinshan = new TransEngineInfo(); 31 | jinshan.setEnginePackageName(StringMainSettings.JINSHAN_TRANS_ENGINE); 32 | jinshan.setEngineName("金山词霸"); 33 | jinshan.setEngineSettingsActivityPackageName("com.blindingdark.geektrans.activity.settings.JinshanSettingsActivity"); 34 | packageName_transEngineInfo.put(jinshan.getEnginePackageName(), jinshan); 35 | 36 | TransEngineInfo bing = new TransEngineInfo(); 37 | bing.setEnginePackageName(StringMainSettings.BING_TRANS_ENGINE); 38 | bing.setEngineName("微软翻译"); 39 | bing.setEngineSettingsActivityPackageName("com.blindingdark.geektrans.activity.settings.BingSettingsActivity"); 40 | packageName_transEngineInfo.put(bing.getEnginePackageName(), bing); 41 | } 42 | 43 | public static TransEngineInfo getTransEngineInfo(String transEnginePackageName) { 44 | return packageName_transEngineInfo.get(transEnginePackageName); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/Clip.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import android.content.ClipData; 4 | import android.content.ClipboardManager; 5 | 6 | /** 7 | * Created by BlindingDark on 2016/8/25 0025. 8 | */ 9 | public class Clip { 10 | public static void copyResult(String strResult, ClipboardManager clip) { 11 | //复制到剪切板 12 | clip.setPrimaryClip(ClipData.newPlainText("transResult", strResult)); 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/EnginesCircleList.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import java.util.ArrayList; 4 | import java.util.HashSet; 5 | import java.util.List; 6 | 7 | /** 8 | * Created by BlindingDark on 2016/12/7 0007. 9 | */ 10 | 11 | public class EnginesCircleList { 12 | int nowIndex = 0; 13 | 14 | List arrayList = new ArrayList<>(); 15 | 16 | public int getNowIndex() { 17 | return nowIndex; 18 | } 19 | 20 | public EnginesCircleList setNowIndex(int nowIndex) { 21 | this.nowIndex = nowIndex; 22 | return this; 23 | } 24 | 25 | public EnginesCircleList setNowIndex(E e) { 26 | this.nowIndex = arrayList.indexOf(e); 27 | return this; 28 | } 29 | 30 | public EnginesCircleList(ArrayList arrayList) { 31 | this.arrayList = arrayList; 32 | } 33 | 34 | public EnginesCircleList(HashSet hashSet) { 35 | for (E e : 36 | hashSet) { 37 | arrayList.add(e); 38 | } 39 | } 40 | 41 | public E next(E e) { 42 | int nextIndex = (arrayList.indexOf(e) + 1); 43 | 44 | return this.next(nextIndex); 45 | } 46 | 47 | public E next(int index) { 48 | int nextIndex = index + 1; 49 | if (nextIndex == arrayList.size()) { 50 | nextIndex = 0; 51 | } 52 | this.setNowIndex(nextIndex); 53 | 54 | return arrayList.get(nextIndex); 55 | } 56 | 57 | 58 | public E next() { 59 | return next(this.nowIndex); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/EnumUtils.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by zhuakuang on 17-12-25. 7 | */ 8 | 9 | public class EnumUtils { 10 | public static boolean isEmpty(List list) { 11 | if (null == list) { 12 | return true; 13 | } else { 14 | return list.isEmpty(); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/MD5.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.security.MessageDigest; 5 | import java.security.NoSuchAlgorithmException; 6 | 7 | /** 8 | * Created by BlindingDark on 2016/8/22 0022. 9 | * 参考:http://stackoverflow.com/questions/5494447/what-will-be-the-android-java-equivalent-of-md5-function-in-php 10 | *

11 | * 在线测试MD5:http://www.cmd5.com/ 12 | *

13 | * http://www.cnblogs.com/bobli/archive/2012/03/26/2418694.html 14 | * 作者:黎波 15 | * 博客:http://bobli.cnblogs.com/ 16 | * 日期:2012年3月26日 17 | */ 18 | public class MD5 { 19 | public static String getMd5(String string) { 20 | byte[] hash; 21 | try { 22 | hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8")); 23 | } catch (NoSuchAlgorithmException e) { 24 | throw new RuntimeException("Huh, MD5 should be supported?", e); 25 | } catch (UnsupportedEncodingException e) { 26 | throw new RuntimeException("Huh, UTF-8 should be supported?", e); 27 | } 28 | 29 | StringBuilder hex = new StringBuilder(hash.length * 2); 30 | for (byte b : hash) { 31 | if ((b & 0xFF) < 0x10) hex.append("0"); 32 | hex.append(Integer.toHexString(b & 0xFF)); 33 | } 34 | 35 | return hex.toString(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/MyStringUnits.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import android.text.TextUtils; 4 | 5 | /** 6 | * Created by BlindingDark on 2016/8/24 0024. 7 | */ 8 | public class MyStringUnits { 9 | public static String cutLast(String string) { 10 | 11 | if (!TextUtils.isEmpty(string)) { 12 | return string.substring(0, string.length() - 1); 13 | } 14 | return string; 15 | } 16 | 17 | /** 18 | * 多个 *空白字符* 替换成一个空格,并去掉首尾空格 19 | * 20 | * @param str 21 | * @return 22 | */ 23 | public static String filterBlankSpace(String str) { 24 | if (null == str) { 25 | return ""; 26 | } else { 27 | return str.trim().replaceAll("\\s+", " "); 28 | } 29 | } 30 | 31 | public static boolean isASCII(String str) { 32 | char tch; 33 | int tint; 34 | for (int i = 0; i < str.length(); i++) { 35 | tch = str.charAt(i); 36 | tint = (int) tch; 37 | if (tint > 255) { 38 | return false; 39 | } 40 | } 41 | return true; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/Number.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** 7 | * Created by BlindingDark on 2016/8/23 0023. 8 | */ 9 | public class Number { 10 | private static boolean isMatch(String regex, String orginal) { 11 | if (orginal == null || orginal.trim().equals("")) { 12 | return false; 13 | } 14 | Pattern pattern = Pattern.compile(regex); 15 | Matcher isNum = pattern.matcher(orginal); 16 | return isNum.matches(); 17 | } 18 | 19 | 20 | public static boolean isDecimal(String orginal) { 21 | return isMatch("\\d+\\.?\\d+|\\d", orginal); 22 | } 23 | 24 | public static boolean isLegalToastTime(String time) { 25 | if (Number.isDecimal(time)) { 26 | if (Float.parseFloat(time) != 0) { 27 | if (Float.parseFloat(time) * 1000 >= 1) { 28 | return true; 29 | 30 | } 31 | } 32 | } 33 | 34 | return false; 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/tools/SoundPlayerService.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.tools; 2 | 3 | import android.app.Service; 4 | import android.content.Intent; 5 | import android.media.MediaPlayer; 6 | import android.os.IBinder; 7 | import android.support.annotation.Nullable; 8 | 9 | import java.io.IOException; 10 | import java.util.List; 11 | 12 | /** 13 | * Created by BlindingDark on 2016/8/24 0024. 14 | */ 15 | public class SoundPlayerService extends Service { 16 | 17 | class SoundPlayer implements Runnable { 18 | 19 | List soundList; 20 | int startId; 21 | 22 | public SoundPlayer(List soundList, int startId) { 23 | this.soundList = soundList; 24 | this.startId = startId; 25 | } 26 | 27 | public SoundPlayer setSoundList(List soundList) { 28 | this.soundList = soundList; 29 | return this; 30 | } 31 | 32 | 33 | int nowPlay = -1; 34 | 35 | private boolean haveNext() { 36 | if (soundList != null) { 37 | if (soundList.isEmpty()) { 38 | return false; 39 | } 40 | if ((nowPlay + 1) < soundList.size()) { 41 | return true; 42 | } 43 | } 44 | return false; 45 | } 46 | 47 | synchronized boolean playNext() { 48 | if (haveNext()) { 49 | nowPlay++; 50 | play(nowPlay); 51 | return true; 52 | } 53 | return false; 54 | } 55 | 56 | 57 | private void play(int i) { 58 | MediaPlayer player = new MediaPlayer(); 59 | player.setOnErrorListener(new MediaPlayer.OnErrorListener() { 60 | @Override 61 | public boolean onError(MediaPlayer mp, int what, int extra) { 62 | mp.release(); 63 | return false; 64 | } 65 | }); 66 | player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 67 | @Override 68 | public void onCompletion(MediaPlayer mp) { 69 | mp.release(); 70 | } 71 | }); 72 | try { 73 | player.setDataSource(this.soundList.get(i)); 74 | player.prepare(); 75 | } catch (IOException e) { 76 | e.printStackTrace(); 77 | playNext(); 78 | return; 79 | } 80 | player.start(); 81 | } 82 | 83 | 84 | public void playOneSoundFromList() { 85 | playNext(); 86 | } 87 | 88 | @Override 89 | public void run() { 90 | this.playOneSoundFromList(); 91 | stopSelf(startId); 92 | } 93 | } 94 | 95 | @Override 96 | public int onStartCommand(Intent intent, int flags, int startId) { 97 | new Thread(new SoundPlayer(intent.getStringArrayListExtra("soundList"), startId)).start(); 98 | return super.onStartCommand(intent, flags, startId); 99 | } 100 | 101 | 102 | @Nullable 103 | @Override 104 | public IBinder onBind(Intent intent) { 105 | return null; 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/Baidu.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Handler; 5 | 6 | import com.blindingdark.geektrans.api.TransEngine; 7 | import com.blindingdark.geektrans.trans.baidu.bean.BaiduSettings; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/21 0021. 11 | */ 12 | public class Baidu implements TransEngine { 13 | BaiduSettings baiduSettings; 14 | public final static String ENGINE_NAME = "百度翻译"; 15 | public final static String ENGINE_PACKAGE_NAME = "com.blindingdark.geektrans.trans.baidu.Baidu"; 16 | 17 | private SharedPreferences preferences; 18 | 19 | @Override 20 | public void setPreferences(SharedPreferences preferences) { 21 | this.preferences = preferences; 22 | this.baiduSettings = new BaiduSettings(preferences); 23 | } 24 | 25 | @Override 26 | public SharedPreferences getPreferences() { 27 | return preferences; 28 | } 29 | 30 | @Override 31 | public String getEngineName() { 32 | return ENGINE_NAME; 33 | } 34 | 35 | @Override 36 | public void trans(String req, Handler handler, SharedPreferences preferences) { 37 | this.setPreferences(preferences); 38 | this.trans(req, handler); 39 | } 40 | 41 | @Override 42 | public void trans(final String req, final Handler handler) { 43 | new BaiduTransReq(baiduSettings, req, handler).trans(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/BaiduAPI.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu; 2 | 3 | import com.blindingdark.geektrans.trans.baidu.bean.BaiduJSONBean; 4 | 5 | import java.util.Map; 6 | 7 | import retrofit2.Call; 8 | import retrofit2.http.Field; 9 | import retrofit2.http.FieldMap; 10 | import retrofit2.http.FormUrlEncoded; 11 | import retrofit2.http.POST; 12 | 13 | /** 14 | * Created by blindingdark on 17-5-19. 15 | */ 16 | 17 | public interface BaiduAPI { 18 | @FormUrlEncoded 19 | @POST("api/trans/vip/translate") 20 | Call getResult(@Field("q") String query, 21 | @Field("from") String from, 22 | @Field("to") String to, 23 | @Field("appid") String appid, 24 | @Field("salt") long salt, 25 | @Field("sign") String sign); 26 | 27 | @FormUrlEncoded 28 | @POST("api/trans/vip/translate") 29 | Call getResult(@FieldMap Map params); 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/BaiduSettingsString.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu; 2 | 3 | import com.blindingdark.geektrans.global.StringMainSettings; 4 | 5 | /** 6 | * Created by BlindingDark on 2016/8/22 0022. 7 | */ 8 | public class BaiduSettingsString { 9 | public static String baiduAppId = "baiduAppId"; 10 | public static String baiduKey = "baiduKey"; 11 | public static String baiduFrom = "baiduFromVer2"; 12 | public static String baiduTo = "baiduToVer2"; 13 | public static String baiduToastTime = "com.blindingdark.geektrans.trans.baidu.Baidu" 14 | + StringMainSettings.TOAST_TIME;//"baiduToastTime"; 15 | public static final String defBaiduToastTime = "3.1"; 16 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/BaiduTransReq.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.text.TextUtils; 6 | 7 | import com.blindingdark.geektrans.bean.Result; 8 | import com.blindingdark.geektrans.tools.MD5; 9 | import com.blindingdark.geektrans.trans.baidu.bean.BaiduJSONBean; 10 | import com.blindingdark.geektrans.trans.baidu.bean.BaiduSettings; 11 | import com.blindingdark.geektrans.trans.baidu.bean.TransResult; 12 | 13 | import java.util.List; 14 | 15 | import retrofit2.Call; 16 | import retrofit2.Callback; 17 | import retrofit2.Response; 18 | import retrofit2.Retrofit; 19 | import retrofit2.converter.gson.GsonConverterFactory; 20 | 21 | /** 22 | * Created by BlindingDark on 2016/8/22 0022. 23 | */ 24 | public class BaiduTransReq { 25 | BaiduSettings baiduSettings; 26 | String req; 27 | String sign; 28 | long salt; 29 | Handler handler; 30 | Result beanResult = new Result(); 31 | 32 | public BaiduTransReq(BaiduSettings baiduSettings, String req, Handler handler) { 33 | beanResult.setOriginalReq(req); 34 | this.baiduSettings = baiduSettings; 35 | this.req = req; 36 | this.handler = handler; 37 | salt = System.currentTimeMillis(); 38 | String str1 = baiduSettings.getBaiduAppId() + req + salt + baiduSettings.getBaiduKey(); 39 | sign = MD5.getMd5(str1); 40 | 41 | } 42 | 43 | public void trans() { 44 | String baiduTransURL = "http://api.fanyi.baidu.com/"; 45 | 46 | Retrofit retrofit = new Retrofit.Builder() 47 | .baseUrl(baiduTransURL) 48 | .addConverterFactory(GsonConverterFactory.create()) 49 | .build(); 50 | 51 | BaiduAPI api = retrofit.create(BaiduAPI.class); 52 | // Retrofit 自动 URL 编码,不需要手动。两次编码就错了。 53 | api.getResult(req, 54 | baiduSettings.getBaiduFrom(), 55 | baiduSettings.getBaiduTo(), 56 | baiduSettings.getBaiduAppId(), 57 | salt, 58 | sign) 59 | .enqueue(new Callback() { 60 | @Override 61 | public void onResponse(Call call, Response response) { 62 | BaiduJSONBean bean = response.body(); 63 | String result = ""; 64 | 65 | if (!TextUtils.isEmpty(bean.getErrorMsg())) { 66 | switch (bean.getErrorCode()) { 67 | case "52000": 68 | result = "成功...?!"; 69 | break; 70 | case "52001": 71 | result = "请求超时,请稍后重试。"; 72 | break; 73 | case "52002": 74 | result = "系统错误,请稍后重试。"; 75 | break; 76 | case "52003": 77 | result = "未授权用户,检查您的appid是否正确。"; 78 | break; 79 | case "54000": 80 | result = "必填参数为空,检查是否少传参数。"; 81 | break; 82 | case "58000": 83 | result = "客户端IP非法,检查您填写的IP地址是否正确\n" + 84 | "可修改您填写的服务器IP地址。"; 85 | break; 86 | case "54001": 87 | result = "签名错误,请检查您的签名生成方法。"; 88 | break; 89 | case "54003": 90 | result = "访问频率受限,请降低您的调用频率。"; 91 | break; 92 | case "58001": 93 | result = "译文语言方向不支持,检查译文语言是否在语言列表里。"; 94 | break; 95 | case "54004": 96 | result = "账户余额不足,前往管理控制台为账户充值。"; 97 | break; 98 | case "54005": 99 | result = "长query请求频繁,请降低长query的发送频率,3s后再试。"; 100 | break; 101 | 102 | default: 103 | result = "what...?!"; 104 | break; 105 | } 106 | } 107 | List transResult = bean.getTransResult(); 108 | if (null != transResult) { 109 | for (TransResult r : transResult) { 110 | result += r.getDst(); 111 | } 112 | } 113 | 114 | beanResult.setStringResult(result).setWhat(0); 115 | sendMsg(); 116 | } 117 | 118 | @Override 119 | public void onFailure(Call call, Throwable t) { 120 | beanResult.setStringResult("出现了点意外... 翻译失败...").setWhat(0); 121 | sendMsg(); 122 | } 123 | }); 124 | 125 | } 126 | 127 | private void sendMsg() { 128 | beanResult.setFromEngineName(Baidu.ENGINE_NAME); 129 | 130 | Message message = new Message(); 131 | message.what = beanResult.getWhat(); 132 | message.obj = beanResult; 133 | handler.sendMessage(message); 134 | } 135 | 136 | 137 | } 138 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/bean/BaiduJSONBean.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-19. 5 | */ 6 | 7 | import com.google.gson.annotations.Expose; 8 | import com.google.gson.annotations.SerializedName; 9 | 10 | import java.util.List; 11 | 12 | public class BaiduJSONBean { 13 | 14 | @SerializedName("from") 15 | @Expose 16 | private String from; 17 | @SerializedName("to") 18 | @Expose 19 | private String to; 20 | @SerializedName("trans_result") 21 | @Expose 22 | private List transResult = null; 23 | @SerializedName("error_code") 24 | @Expose 25 | private String errorCode; 26 | @SerializedName("error_msg") 27 | @Expose 28 | private String errorMsg; 29 | 30 | public String getFrom() { 31 | return from; 32 | } 33 | 34 | public void setFrom(String from) { 35 | this.from = from; 36 | } 37 | 38 | public String getTo() { 39 | return to; 40 | } 41 | 42 | public void setTo(String to) { 43 | this.to = to; 44 | } 45 | 46 | public List getTransResult() { 47 | return transResult; 48 | } 49 | 50 | public void setTransResult(List transResult) { 51 | this.transResult = transResult; 52 | } 53 | 54 | public String getErrorCode() { 55 | return errorCode; 56 | } 57 | 58 | public void setErrorCode(String errorCode) { 59 | this.errorCode = errorCode; 60 | } 61 | 62 | public String getErrorMsg() { 63 | return errorMsg; 64 | } 65 | 66 | public void setErrorMsg(String errorMsg) { 67 | this.errorMsg = errorMsg; 68 | } 69 | 70 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/bean/BaiduSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu.bean; 2 | 3 | import android.content.SharedPreferences; 4 | import android.text.TextUtils; 5 | 6 | import com.blindingdark.geektrans.trans.baidu.BaiduSettingsString; 7 | 8 | /** 9 | * Created by BlindingDark on 2016/8/22 0022. 10 | */ 11 | public class BaiduSettings { 12 | String baiduAppId = ""; 13 | String baiduKey = ""; 14 | String baiduFrom = ""; 15 | String baiduTo = ""; 16 | 17 | public BaiduSettings(String baiduAppId, String baiduKey, String baiduFrom, String baiduTo) { 18 | this.baiduAppId = baiduAppId; 19 | this.baiduKey = baiduKey; 20 | this.baiduFrom = baiduFrom; 21 | this.baiduTo = baiduTo; 22 | } 23 | 24 | public BaiduSettings(SharedPreferences preferences) { 25 | this.baiduAppId = preferences.getString(BaiduSettingsString.baiduAppId, "20160822000027207"); 26 | this.baiduKey = preferences.getString(BaiduSettingsString.baiduKey, "ME5M0m7S6tepryI_PUU7"); 27 | if (TextUtils.isEmpty(baiduAppId) || TextUtils.isEmpty(baiduKey)) { 28 | this.baiduAppId = "20160822000027207"; 29 | this.baiduKey = "ME5M0m7S6tepryI_PUU7"; 30 | } 31 | this.baiduFrom = preferences.getString(BaiduSettingsString.baiduFrom, "0_auto"); 32 | this.baiduTo = preferences.getString(BaiduSettingsString.baiduTo, "0_zh"); 33 | } 34 | 35 | public String getBaiduAppId() { 36 | return baiduAppId; 37 | } 38 | 39 | public void setBaiduAppId(String baiduAppId) { 40 | this.baiduAppId = baiduAppId; 41 | } 42 | 43 | public String getBaiduKey() { 44 | return baiduKey; 45 | } 46 | 47 | public void setBaiduKey(String baiduKey) { 48 | this.baiduKey = baiduKey; 49 | } 50 | 51 | public String getBaiduFrom() { 52 | 53 | return baiduFrom.split("_")[1]; 54 | } 55 | 56 | public void setBaiduFrom(String baiduFrom) { 57 | this.baiduFrom = baiduFrom; 58 | } 59 | 60 | public String getBaiduTo() { 61 | 62 | return baiduTo.split("_")[1]; 63 | } 64 | 65 | public void setBaiduTo(String baiduTo) { 66 | this.baiduTo = baiduTo; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/baidu/bean/TransResult.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.baidu.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-19. 5 | */ 6 | 7 | import com.google.gson.annotations.Expose; 8 | import com.google.gson.annotations.SerializedName; 9 | 10 | public class TransResult { 11 | 12 | @SerializedName("src") 13 | @Expose 14 | private String src; 15 | @SerializedName("dst") 16 | @Expose 17 | private String dst; 18 | 19 | public String getSrc() { 20 | return src; 21 | } 22 | 23 | public void setSrc(String src) { 24 | this.src = src; 25 | } 26 | 27 | public String getDst() { 28 | return dst; 29 | } 30 | 31 | public void setDst(String dst) { 32 | this.dst = dst; 33 | } 34 | 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/bing/Bing.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.bing; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Handler; 5 | 6 | import com.blindingdark.geektrans.api.TransEngine; 7 | import com.blindingdark.geektrans.trans.bing.bean.BingSettings; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/28 0028. 11 | */ 12 | public class Bing implements TransEngine { 13 | 14 | BingSettings bingSettings; 15 | public static final String ENGINE_NAME = "com.blindingdark.geektrans.trans.bing.Bing"; 16 | public static final String ENGINE_PACKAGE_NAME = ENGINE_NAME; 17 | private SharedPreferences preferences; 18 | 19 | 20 | @Override 21 | public void setPreferences(SharedPreferences preferences) { 22 | this.preferences = preferences; 23 | this.bingSettings = new BingSettings(preferences); 24 | } 25 | 26 | @Override 27 | public SharedPreferences getPreferences() { 28 | return preferences; 29 | } 30 | 31 | @Override 32 | public String getEngineName() { 33 | return ENGINE_NAME; 34 | } 35 | 36 | @Override 37 | public void trans(String req, Handler handler, SharedPreferences preferences) { 38 | //new Thread(new TransReqThread(new BingTransReq(bingSettings, req), handler, preferences)).start(); 39 | this.setPreferences(preferences); 40 | this.trans(req, handler); 41 | } 42 | 43 | @Override 44 | public void trans(final String req, final Handler handler) { 45 | new BingTransReq(bingSettings, req, handler).trans(); 46 | 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/bing/BingTransReq.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.bing; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | 6 | import com.blindingdark.geektrans.bean.Result; 7 | import com.blindingdark.geektrans.trans.bing.bean.BingSettings; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/28 0028. 11 | */ 12 | public class BingTransReq{ 13 | BingSettings bingSettings; 14 | Result result = new Result(); 15 | String req; 16 | Handler handler; 17 | 18 | public BingTransReq(BingSettings bingSettings, String req, Handler handler) { 19 | this.bingSettings = bingSettings; 20 | result.setOriginalReq(req); 21 | this.req = req; 22 | this.handler = handler; 23 | } 24 | 25 | public void trans() { 26 | String translatedText = "啊咧…微软翻译正在施工中……"; 27 | 28 | result.setStringResult(translatedText); 29 | result.setFromEngineName(Bing.ENGINE_NAME); 30 | result.setWhat(0); 31 | 32 | Message message = new Message(); 33 | message.what = result.getWhat(); 34 | message.obj = result; 35 | handler.sendMessage(message); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/bing/StringBingSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.bing; 2 | 3 | import com.blindingdark.geektrans.global.StringMainSettings; 4 | 5 | /** 6 | * Created by BlindingDark on 2016/8/28 0028. 7 | */ 8 | public class StringBingSettings { 9 | public static final String bingAppId = "bingAppId"; 10 | public static final String bingKey = "bingKey"; 11 | public static final String bingFrom = "bingFrom"; 12 | public static final String bingTo = "bingTo"; 13 | public static final String bingToastTime = "com.blindingdark.geektrans.trans.bing.Bing" 14 | + StringMainSettings.TOAST_TIME;//"bingToastTime"; 15 | public static final String defBingToastTime = "3.1"; 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/bing/bean/BingSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.bing.bean; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import com.blindingdark.geektrans.trans.bing.StringBingSettings; 6 | 7 | /** 8 | * Created by BlindingDark on 2016/8/28 0028. 9 | */ 10 | public class BingSettings { 11 | String bingAppId = ""; 12 | String bingKey = ""; 13 | String bingFrom = ""; 14 | String bingTo = ""; 15 | 16 | public BingSettings(SharedPreferences preferences) { 17 | this.bingAppId = preferences.getString(StringBingSettings.bingAppId, ""); 18 | this.bingKey = preferences.getString(StringBingSettings.bingKey, ""); 19 | this.bingFrom = preferences.getString(StringBingSettings.bingFrom, "0_auto"); 20 | this.bingTo = preferences.getString(StringBingSettings.bingTo, "0_zh-CHS"); 21 | } 22 | 23 | public String getBingAppId() { 24 | return bingAppId; 25 | } 26 | 27 | public void setBingAppId(String bingAppId) { 28 | this.bingAppId = bingAppId; 29 | } 30 | 31 | public String getBingKey() { 32 | return bingKey; 33 | } 34 | 35 | public void setBingKey(String bingKey) { 36 | this.bingKey = bingKey; 37 | } 38 | 39 | public String getBingFrom() { 40 | if ("0_auto".equals(this.bingFrom)){ 41 | return ""; 42 | } 43 | return this.bingFrom.split("_")[1]; 44 | } 45 | 46 | public void setBingFrom(String bingFrom) { 47 | this.bingFrom = bingFrom; 48 | } 49 | 50 | public String getBingTo() { 51 | return bingTo.split("_")[1]; 52 | } 53 | 54 | public void setBingTo(String bingTo) { 55 | this.bingTo = bingTo; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/Jinshan.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Handler; 5 | 6 | import com.blindingdark.geektrans.api.TransEngine; 7 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanSettings; 8 | 9 | 10 | /** 11 | * Created by BlindingDark on 2016/8/23 0023. 12 | */ 13 | public class Jinshan implements TransEngine { 14 | 15 | JinshanSettings jinshanSettings; 16 | public final static String ENGINE_NAME = "com.blindingdark.geektrans.trans.jinshan.Jinshan"; 17 | public final static String ENGINE_PACKAGE_NAME = ENGINE_NAME; 18 | private SharedPreferences preferences; 19 | 20 | @Override 21 | public void trans(final String req, final Handler handler, SharedPreferences preferences) { 22 | this.setPreferences(preferences); 23 | this.trans(req, handler); 24 | } 25 | 26 | @Override 27 | public void trans(final String req, final Handler handler) { 28 | new JinshanTransReq(jinshanSettings, req, handler).trans(); 29 | } 30 | 31 | @Override 32 | public void setPreferences(SharedPreferences preferences) { 33 | this.preferences = preferences; 34 | this.jinshanSettings = new JinshanSettings(preferences); 35 | 36 | } 37 | 38 | @Override 39 | public SharedPreferences getPreferences() { 40 | return this.preferences; 41 | } 42 | 43 | @Override 44 | public String getEngineName() { 45 | return ENGINE_NAME; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/JinshanAPI.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan; 2 | 3 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanJSONBean; 4 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanJSONBeanZh; 5 | 6 | import retrofit2.Call; 7 | import retrofit2.http.GET; 8 | import retrofit2.http.Query; 9 | 10 | /** 11 | * Created by blindingdark on 17-5-10. 12 | */ 13 | 14 | public interface JinshanAPI { 15 | @GET("api/dictionary.php?type=json") 16 | Call getResult(@Query("w") String word, @Query("key") String key); 17 | 18 | @GET("api/dictionary.php?type=json") 19 | Call getZhResult(@Query("w") String word, @Query("key") String key); 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/JinshanTransReq.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | import android.text.TextUtils; 6 | import android.util.Log; 7 | 8 | import com.blindingdark.geektrans.activity.TransActivity; 9 | import com.blindingdark.geektrans.bean.Result; 10 | import com.blindingdark.geektrans.tools.MyStringUnits; 11 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanJSONBean; 12 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanJSONBeanZh; 13 | import com.blindingdark.geektrans.trans.jinshan.bean.JinshanSettings; 14 | import com.blindingdark.geektrans.trans.jinshan.bean.Symbol; 15 | import com.blindingdark.geektrans.trans.jinshan.bean.SymbolZh; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | import retrofit2.Call; 21 | import retrofit2.Callback; 22 | import retrofit2.Response; 23 | import retrofit2.Retrofit; 24 | import retrofit2.converter.gson.GsonConverterFactory; 25 | 26 | /** 27 | * Created by BlindingDark on 2016/8/23 0023. 28 | */ 29 | public class JinshanTransReq { 30 | 31 | String jinshanTransURL = "http://dict-co.iciba.com/"; 32 | JinshanSettings jinshanSettings; 33 | String req; 34 | 35 | Result beanResult = new Result(); 36 | Handler handler; 37 | 38 | public JinshanTransReq(JinshanSettings jinshanSettings, String req, Handler handler) { 39 | beanResult.setOriginalReq(req); 40 | this.jinshanSettings = jinshanSettings; 41 | this.req = req.toLowerCase(); 42 | this.handler = handler; 43 | } 44 | 45 | public void trans() { 46 | // TODO: 17-5-11 英文如果有过去式,还需要单独检测 47 | Retrofit retrofit = new Retrofit.Builder() 48 | .baseUrl(jinshanTransURL) 49 | .addConverterFactory(GsonConverterFactory.create()) 50 | .build(); 51 | 52 | JinshanAPI api = retrofit.create(JinshanAPI.class); 53 | // if req is eng 54 | if (MyStringUnits.isASCII(req)) { 55 | api.getResult(req, jinshanSettings.getJinshanKey()) 56 | .enqueue(new Callback() { 57 | @Override 58 | public void onResponse(Call call, 59 | Response response) { 60 | JinshanJSONBean res = response.body(); 61 | // 内容 62 | List symbols = res.getSymbols(); 63 | List sounds = new ArrayList<>(); 64 | 65 | for (Symbol symbol : symbols) { 66 | List soundsTemp = symbol.getSoundURLs(); 67 | for (String sound : soundsTemp) { 68 | if (!TextUtils.isEmpty(sound)) { 69 | sounds.add(sound); 70 | } 71 | } 72 | } 73 | callback(sounds, res.toString()); 74 | } 75 | 76 | @Override 77 | public void onFailure(Call call, Throwable t) { 78 | Log.d("retrofitOnFailure", t.toString()); 79 | callbackOnFailure(); 80 | } 81 | }); 82 | } else { 83 | api.getZhResult(req, jinshanSettings.getJinshanKey()) 84 | .enqueue(new Callback() { 85 | @Override 86 | public void onResponse(Call call, 87 | Response response) { 88 | JinshanJSONBeanZh res = response.body(); 89 | // 内容 90 | List symbols = res.getSymbols(); 91 | List sounds = new ArrayList<>(); 92 | 93 | for (SymbolZh symbol : symbols) { 94 | List soundsTemp = symbol.getSoundURLs(); 95 | for (String sound : soundsTemp) { 96 | if (!TextUtils.isEmpty(sound)) { 97 | sounds.add(sound); 98 | } 99 | } 100 | } 101 | callback(sounds, res.toString()); 102 | } 103 | 104 | @Override 105 | public void onFailure(Call call, Throwable t) { 106 | Log.d("retrofitOnFailure", t.toString()); 107 | callbackOnFailure(); 108 | } 109 | }); 110 | } 111 | 112 | } 113 | 114 | private void callback(List sounds, String stringResult) { 115 | if (sounds.isEmpty()) { 116 | beanResult.setWhat(TransActivity.normalToast); 117 | } else { 118 | beanResult.setWhat(TransActivity.haveSoundToast); 119 | beanResult.setSoundURLs(sounds); 120 | } 121 | 122 | beanResult.setFromEngineName(Jinshan.ENGINE_NAME); 123 | 124 | if (TextUtils.isEmpty(stringResult)) { 125 | stringResult = "金山词霸未得到翻译结果"; 126 | } 127 | beanResult.setStringResult(stringResult); 128 | 129 | sendMsg(); 130 | } 131 | 132 | private void callbackOnFailure() { 133 | beanResult.setWhat(TransActivity.normalToast); 134 | beanResult.setFromEngineName(Jinshan.ENGINE_NAME); 135 | beanResult.setStringResult("出现了点意外... 翻译失败..."); 136 | 137 | sendMsg(); 138 | } 139 | 140 | private void sendMsg() { 141 | Message message = new Message(); 142 | message.what = beanResult.getWhat(); 143 | message.obj = beanResult; 144 | handler.sendMessage(message); 145 | } 146 | 147 | 148 | } 149 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/StringJinshanSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan; 2 | 3 | 4 | import com.blindingdark.geektrans.global.StringMainSettings; 5 | 6 | /** 7 | * Created by BlindingDark on 2016/8/24 0024. 8 | */ 9 | public class StringJinshanSettings { 10 | public static final String jinshanKey = "jinshanKey"; 11 | public static final String jinshanToastTime = "com.blindingdark.geektrans.trans.jinshan.Jinshan" 12 | + StringMainSettings.TOAST_TIME;//"jinshanToastTime"; 13 | public static final String defJinshanToastTime = "3.5"; 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/Exchange.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | import com.google.gson.annotations.Expose; 8 | import com.google.gson.annotations.SerializedName; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * 各种时态 14 | * 英语单词专用 15 | */ 16 | public class Exchange { 17 | 18 | /** 19 | * 复数 20 | */ 21 | @SerializedName("word_pl") 22 | @Expose 23 | private List wordPl = null; 24 | @SerializedName("word_past") 25 | @Expose 26 | private List wordPast = null; 27 | @SerializedName("word_done") 28 | @Expose 29 | private List wordDone = null; 30 | @SerializedName("word_ing") 31 | @Expose 32 | private List wordIng = null; 33 | @SerializedName("word_third") 34 | @Expose 35 | private List wordThird = null; 36 | @SerializedName("word_er") 37 | @Expose 38 | private String wordEr = null; 39 | /** 40 | * todo 如果有过去式,还需要单独检测 41 | */ 42 | @SerializedName("word_est") 43 | @Expose 44 | private String wordEst = null; 45 | 46 | public List getWordPl() { 47 | return wordPl; 48 | } 49 | 50 | public void setWordPl(List wordPl) { 51 | this.wordPl = wordPl; 52 | } 53 | 54 | public List getWordPast() { 55 | return wordPast; 56 | } 57 | 58 | public void setWordPast(List wordPast) { 59 | this.wordPast = wordPast; 60 | } 61 | 62 | public List getWordDone() { 63 | return wordDone; 64 | } 65 | 66 | public void setWordDone(List wordDone) { 67 | this.wordDone = wordDone; 68 | } 69 | 70 | public List getWordIng() { 71 | return wordIng; 72 | } 73 | 74 | public void setWordIng(List wordIng) { 75 | this.wordIng = wordIng; 76 | } 77 | 78 | public List getWordThird() { 79 | return wordThird; 80 | } 81 | 82 | public void setWordThird(List wordThird) { 83 | this.wordThird = wordThird; 84 | } 85 | 86 | public String getWordEr() { 87 | return wordEr; 88 | } 89 | 90 | public void setWordEr(String wordEr) { 91 | this.wordEr = wordEr; 92 | } 93 | 94 | public String getWordEst() { 95 | return wordEst; 96 | } 97 | 98 | public void setWordEst(String wordEst) { 99 | this.wordEst = wordEst; 100 | } 101 | 102 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/JinshanJSONBean.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | import android.text.TextUtils; 8 | 9 | import com.google.gson.annotations.Expose; 10 | import com.google.gson.annotations.SerializedName; 11 | 12 | import java.util.List; 13 | 14 | public class JinshanJSONBean { 15 | 16 | @SerializedName("word_name") 17 | @Expose 18 | private String wordName; 19 | @SerializedName("is_CRI") 20 | @Expose 21 | private int isCRI; 22 | /* @SerializedName("exchange") 23 | @Expose 24 | private Exchange exchange;*/ 25 | @SerializedName("symbols") 26 | @Expose 27 | private List symbols = null; 28 | @SerializedName("items") 29 | @Expose 30 | private List items = null; 31 | 32 | public String getWordName() { 33 | return wordName; 34 | } 35 | 36 | public void setWordName(String wordName) { 37 | this.wordName = wordName; 38 | } 39 | 40 | public int getIsCRI() { 41 | return isCRI; 42 | } 43 | 44 | public void setIsCRI(int isCRI) { 45 | this.isCRI = isCRI; 46 | } 47 | 48 | public List getSymbols() { 49 | return symbols; 50 | } 51 | 52 | public void setSymbols(List symbols) { 53 | this.symbols = symbols; 54 | } 55 | 56 | public List getItems() { 57 | return items; 58 | } 59 | 60 | public void setItems(List items) { 61 | this.items = items; 62 | } 63 | 64 | @Override 65 | public String toString() { 66 | String result = ""; 67 | 68 | if (!TextUtils.isEmpty(wordName)) { 69 | result += wordName; 70 | } 71 | 72 | if (null != symbols) { 73 | for (Symbol symbol : symbols) { 74 | String temp = symbol.toString(); 75 | if (!TextUtils.isEmpty(temp)) { 76 | result += "\n"; 77 | result += temp; 78 | } 79 | 80 | } 81 | } 82 | 83 | return result; 84 | } 85 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/JinshanJSONBeanZh.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | import android.text.TextUtils; 8 | 9 | import com.google.gson.annotations.Expose; 10 | import com.google.gson.annotations.SerializedName; 11 | 12 | import java.util.List; 13 | 14 | public class JinshanJSONBeanZh { 15 | @SerializedName("word_name") 16 | @Expose 17 | private String wordName; 18 | 19 | @SerializedName("symbols") 20 | @Expose 21 | private List symbols = null; 22 | 23 | public String getWordName() { 24 | return wordName; 25 | } 26 | 27 | public void setWordName(String wordName) { 28 | this.wordName = wordName; 29 | } 30 | 31 | public List getSymbols() { 32 | return symbols; 33 | } 34 | 35 | public void setSymbols(List symbols) { 36 | this.symbols = symbols; 37 | } 38 | 39 | @Override 40 | public String toString() { 41 | String result = ""; 42 | if (!TextUtils.isEmpty(wordName)) { 43 | result += wordName; 44 | } 45 | if (null != symbols) { 46 | for (SymbolZh symbol : symbols) { 47 | String temp = symbol.toString(); 48 | if (!TextUtils.isEmpty(temp)) { 49 | result += "\n"; 50 | result += temp; 51 | } 52 | } 53 | } 54 | 55 | return result; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/JinshanSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | import android.content.SharedPreferences; 4 | import android.text.TextUtils; 5 | 6 | import com.blindingdark.geektrans.trans.jinshan.StringJinshanSettings; 7 | 8 | /** 9 | * Created by BlindingDark on 2016/8/23 0023. 10 | */ 11 | public class JinshanSettings { 12 | String jinshanKey = ""; 13 | 14 | public JinshanSettings(String jinshanKey) { 15 | this.jinshanKey = jinshanKey; 16 | } 17 | 18 | public JinshanSettings(SharedPreferences preferences) { 19 | jinshanKey = preferences.getString(StringJinshanSettings.jinshanKey, "609DBC0C963B07A3E1E93B5890D58EBC"); 20 | if (TextUtils.isEmpty(jinshanKey)) { 21 | jinshanKey = "609DBC0C963B07A3E1E93B5890D58EBC"; 22 | } 23 | } 24 | 25 | public String getJinshanKey() { 26 | return jinshanKey; 27 | } 28 | 29 | public void setJinshanKey(String jinshanKey) { 30 | this.jinshanKey = jinshanKey; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/Mean.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | import com.google.gson.annotations.Expose; 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | /** 10 | * 中文含义组 11 | */ 12 | public class Mean { 13 | 14 | @SerializedName("word_mean") 15 | @Expose 16 | private String wordMean; 17 | @SerializedName("has_mean") 18 | @Expose 19 | private String hasMean; 20 | @SerializedName("split") 21 | @Expose 22 | private int split; 23 | 24 | @Override 25 | public String toString() { 26 | return wordMean; 27 | } 28 | 29 | public String getWordMean() { 30 | return wordMean; 31 | } 32 | 33 | public void setWordMean(String wordMean) { 34 | this.wordMean = wordMean; 35 | } 36 | 37 | public String getHasMean() { 38 | return hasMean; 39 | } 40 | 41 | public void setHasMean(String hasMean) { 42 | this.hasMean = hasMean; 43 | } 44 | 45 | public int getSplit() { 46 | return split; 47 | } 48 | 49 | public void setSplit(int split) { 50 | this.split = split; 51 | } 52 | 53 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/Part.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | 8 | import android.text.TextUtils; 9 | 10 | import com.blindingdark.geektrans.tools.MyStringUnits; 11 | import com.google.gson.annotations.Expose; 12 | import com.google.gson.annotations.SerializedName; 13 | 14 | import java.util.List; 15 | 16 | /** 17 | * 英文单词意思部分 18 | */ 19 | public class Part { 20 | 21 | /** 22 | * 英文单词专用,如果不为空串则表示单词形式(如 vi、n) 23 | */ 24 | @SerializedName("part") 25 | @Expose 26 | private String part; 27 | /** 28 | * 英文单词的意思,字符串 29 | */ 30 | @SerializedName("means") 31 | @Expose 32 | private List means = null; 33 | 34 | public String getPart() { 35 | return part; 36 | } 37 | 38 | public void setPart(String part) { 39 | this.part = part; 40 | } 41 | 42 | public List getMeans() { 43 | return means; 44 | } 45 | 46 | public void setMeans(List means) { 47 | this.means = means; 48 | } 49 | 50 | @Override 51 | public String toString() { 52 | /* 53 | * 返回值为最终结果 54 | * 示例 55 | * part == "vt.& vi.", 56 | * means == ["爱,热爱","爱戴","喜欢","赞美,称赞"] 57 | * 那么输出的应该是 58 | * vt.& vi.[一个空格]爱,热爱;爱戴;喜欢;赞美,称赞 59 | * 不同的含义用中文的分号间隔开 60 | * */ 61 | String result = ""; 62 | if (!TextUtils.isEmpty(part)) { 63 | result += part; 64 | } 65 | if (!(result.length() == 0)) { 66 | result += " "; 67 | } 68 | if (null != means) { 69 | for (String s : means) { 70 | result += s; 71 | result += ";"; 72 | } 73 | result = MyStringUnits.cutLast(result); 74 | } 75 | return result; 76 | } 77 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/PartZh.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | import android.text.TextUtils; 4 | 5 | import com.blindingdark.geektrans.tools.MyStringUnits; 6 | import com.google.gson.annotations.Expose; 7 | import com.google.gson.annotations.SerializedName; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Created by blindingdark on 17-5-10. 13 | */ 14 | 15 | public class PartZh { 16 | /** 17 | * 词性 如 动 名 18 | */ 19 | @SerializedName("part_name") 20 | @Expose 21 | private String partName; 22 | 23 | @SerializedName("means") 24 | @Expose 25 | private List means = null; 26 | 27 | @Override 28 | public String toString() { 29 | String result = ""; 30 | if (!TextUtils.isEmpty(partName)) { 31 | result += partName; 32 | } 33 | if (!(result.length() == 0)) { 34 | result += " "; 35 | } 36 | if (null != means) { 37 | for (Mean mean : means) { 38 | result += mean.toString(); 39 | result += ";"; 40 | } 41 | result = MyStringUnits.cutLast(result); 42 | } 43 | return result; 44 | } 45 | 46 | public String getPartName() { 47 | return partName; 48 | } 49 | 50 | public void setPartName(String partName) { 51 | this.partName = partName; 52 | } 53 | 54 | public List getMeans() { 55 | return means; 56 | } 57 | 58 | public void setMeans(List means) { 59 | this.means = means; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/Symbol.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | import android.text.TextUtils; 8 | 9 | import com.blindingdark.geektrans.tools.MyStringUnits; 10 | import com.google.gson.annotations.Expose; 11 | import com.google.gson.annotations.SerializedName; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class Symbol { 17 | 18 | /** 19 | * 英式发音的音标 20 | */ 21 | @SerializedName("ph_en") 22 | @Expose 23 | private String phEn; 24 | 25 | /** 26 | * 美式发音的音标 27 | */ 28 | @SerializedName("ph_am") 29 | @Expose 30 | private String phAm; 31 | /** 32 | * 其它音标 33 | */ 34 | @SerializedName("ph_other") 35 | @Expose 36 | private String phOther; 37 | @SerializedName("ph_en_mp3") 38 | @Expose 39 | private String phEnMp3; 40 | @SerializedName("ph_am_mp3") 41 | @Expose 42 | private String phAmMp3; 43 | @SerializedName("ph_tts_mp3") 44 | @Expose 45 | private String phTtsMp3; 46 | @SerializedName("parts") 47 | @Expose 48 | private List parts = null; 49 | 50 | public List getSoundURLs() { 51 | List soundURLs = new ArrayList<>(); 52 | soundURLs.add(getPhAmMp3()); 53 | soundURLs.add(getPhEnMp3()); 54 | soundURLs.add(getPhTtsMp3()); 55 | return soundURLs; 56 | } 57 | 58 | @Override 59 | public String toString() { 60 | String result = ""; 61 | List temp = new ArrayList<>(); 62 | 63 | if (!TextUtils.isEmpty(phAm)) { 64 | temp.add("美[" + phAm + "]"); 65 | } 66 | if (!TextUtils.isEmpty(phEn)) { 67 | temp.add("英[" + phEn + "]"); 68 | } 69 | if (!TextUtils.isEmpty(phOther)) { 70 | temp.add("其它[" + phOther + "]"); 71 | } 72 | 73 | for (String s : temp) { 74 | result += s; 75 | result += " "; 76 | } 77 | 78 | if (!TextUtils.isEmpty(result)) { 79 | result = MyStringUnits.cutLast(result) + "\n"; 80 | } 81 | 82 | if (null != parts) { 83 | for (Part part : parts) { 84 | result += part.toString() + "\n"; 85 | } 86 | result = MyStringUnits.cutLast(result); 87 | } 88 | 89 | return result; 90 | } 91 | 92 | public String getPhEn() { 93 | return phEn; 94 | } 95 | 96 | public void setPhEn(String phEn) { 97 | this.phEn = phEn; 98 | } 99 | 100 | public String getPhAm() { 101 | return phAm; 102 | } 103 | 104 | public void setPhAm(String phAm) { 105 | this.phAm = phAm; 106 | } 107 | 108 | public String getPhOther() { 109 | return phOther; 110 | } 111 | 112 | public void setPhOther(String phOther) { 113 | this.phOther = phOther; 114 | } 115 | 116 | public String getPhEnMp3() { 117 | return phEnMp3; 118 | } 119 | 120 | public void setPhEnMp3(String phEnMp3) { 121 | this.phEnMp3 = phEnMp3; 122 | } 123 | 124 | public String getPhAmMp3() { 125 | return phAmMp3; 126 | } 127 | 128 | public void setPhAmMp3(String phAmMp3) { 129 | this.phAmMp3 = phAmMp3; 130 | } 131 | 132 | public String getPhTtsMp3() { 133 | return phTtsMp3; 134 | } 135 | 136 | public void setPhTtsMp3(String phTtsMp3) { 137 | this.phTtsMp3 = phTtsMp3; 138 | } 139 | 140 | public List getParts() { 141 | return parts; 142 | } 143 | 144 | public void setParts(List parts) { 145 | this.parts = parts; 146 | } 147 | 148 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/jinshan/bean/SymbolZh.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.jinshan.bean; 2 | 3 | /** 4 | * Created by blindingdark on 17-5-10. 5 | */ 6 | 7 | import android.text.TextUtils; 8 | 9 | import com.blindingdark.geektrans.tools.MyStringUnits; 10 | import com.google.gson.annotations.Expose; 11 | import com.google.gson.annotations.SerializedName; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class SymbolZh { 17 | /** 18 | * 拼音 19 | */ 20 | @SerializedName("word_symbol") 21 | @Expose 22 | private String wordSymbol; 23 | @SerializedName("symbol_mp3") 24 | @Expose 25 | private String symbolMp3; 26 | @SerializedName("parts") 27 | @Expose 28 | private List parts = null; 29 | @SerializedName("ph_am_mp3") 30 | @Expose 31 | private String phAmMp3; 32 | @SerializedName("ph_en_mp3") 33 | @Expose 34 | private String phEnMp3; 35 | @SerializedName("ph_tts_mp3") 36 | @Expose 37 | private String phTtsMp3; 38 | @SerializedName("ph_other") 39 | @Expose 40 | private String phOther; 41 | 42 | @Override 43 | public String toString() { 44 | String result = ""; 45 | if (!TextUtils.isEmpty(wordSymbol)) { 46 | result += "[" + wordSymbol + "]" + "\n"; 47 | } 48 | 49 | if (null != parts) { 50 | for (PartZh part : parts) { 51 | if (!TextUtils.isEmpty(part.toString())){ 52 | result += part.toString() + "\n"; 53 | } 54 | } 55 | result = MyStringUnits.cutLast(result); 56 | } 57 | 58 | return result; 59 | } 60 | 61 | public List getSoundURLs() { 62 | List soundURLs = new ArrayList<>(); 63 | soundURLs.add(getPhAmMp3()); 64 | soundURLs.add(getPhEnMp3()); 65 | soundURLs.add(getPhTtsMp3()); 66 | soundURLs.add(getSymbolMp3()); 67 | return soundURLs; 68 | } 69 | 70 | public String getWordSymbol() { 71 | return wordSymbol; 72 | } 73 | 74 | public void setWordSymbol(String wordSymbol) { 75 | this.wordSymbol = wordSymbol; 76 | } 77 | 78 | public String getSymbolMp3() { 79 | return symbolMp3; 80 | } 81 | 82 | public void setSymbolMp3(String symbolMp3) { 83 | this.symbolMp3 = symbolMp3; 84 | } 85 | 86 | public List getParts() { 87 | return parts; 88 | } 89 | 90 | public void setParts(List parts) { 91 | this.parts = parts; 92 | } 93 | 94 | public String getPhAmMp3() { 95 | return phAmMp3; 96 | } 97 | 98 | public void setPhAmMp3(String phAmMp3) { 99 | this.phAmMp3 = phAmMp3; 100 | } 101 | 102 | public String getPhEnMp3() { 103 | return phEnMp3; 104 | } 105 | 106 | public void setPhEnMp3(String phEnMp3) { 107 | this.phEnMp3 = phEnMp3; 108 | } 109 | 110 | public String getPhTtsMp3() { 111 | return phTtsMp3; 112 | } 113 | 114 | public void setPhTtsMp3(String phTtsMp3) { 115 | this.phTtsMp3 = phTtsMp3; 116 | } 117 | 118 | public String getPhOther() { 119 | return phOther; 120 | } 121 | 122 | public void setPhOther(String phOther) { 123 | this.phOther = phOther; 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/youdao/Youdao.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.youdao; 2 | 3 | import android.content.SharedPreferences; 4 | import android.os.Handler; 5 | 6 | import com.blindingdark.geektrans.api.TransEngine; 7 | import com.blindingdark.geektrans.trans.youdao.bean.YoudaoSettings; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/21 0021. 11 | */ 12 | public class Youdao implements TransEngine { 13 | YoudaoSettings settings; 14 | SharedPreferences preferences; 15 | public final static String ENGINE_NAME = "com.blindingdark.geektrans.trans.youdao.Youdao"; 16 | public final static String ENGINE_PACKAGE_NAME = ENGINE_NAME; 17 | 18 | @Override 19 | public void trans(String req, Handler handler, SharedPreferences preferences) { 20 | this.setPreferences(preferences); 21 | this.trans(req, handler); 22 | } 23 | 24 | @Override 25 | public void trans(final String req, final Handler handler) { 26 | new YoudaoTransReq(settings, req, handler).trans(); 27 | } 28 | 29 | @Override 30 | public void setPreferences(SharedPreferences preferences) { 31 | this.preferences = preferences; 32 | this.settings = new YoudaoSettings(preferences); 33 | } 34 | 35 | @Override 36 | public SharedPreferences getPreferences() { 37 | return this.preferences; 38 | } 39 | 40 | @Override 41 | public String getEngineName() { 42 | return ENGINE_NAME; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/youdao/YoudaoSettingsString.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.youdao; 2 | 3 | import com.blindingdark.geektrans.global.StringMainSettings; 4 | 5 | /** 6 | * Created by BlindingDark on 2016/8/21 0021. 7 | */ 8 | public class YoudaoSettingsString { 9 | public static String youdaoKey = "key"; 10 | public static String youdaoKeyfrom = "keyfrom"; 11 | public static String divisionLine = "divisionLine"; 12 | 13 | public static String defaultDivLine = "(づ ̄ 3 ̄)づ "; 14 | 15 | public static final String youdaoToastTime = "com.blindingdark.geektrans.trans.youdao.Youdao" 16 | + StringMainSettings.TOAST_TIME; //"youdaoToastTime"; 17 | public static final String youdaoDefToastTime = "5.532"; 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/youdao/YoudaoTransReq.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.youdao; 2 | 3 | import android.os.Handler; 4 | import android.os.Message; 5 | 6 | import com.blindingdark.geektrans.activity.TransActivity; 7 | import com.blindingdark.geektrans.bean.Result; 8 | import com.blindingdark.geektrans.trans.youdao.bean.YoudaoSettings; 9 | import com.blindingdark.geektrans.trans.youdao.bean.YoudaoTransRes; 10 | import com.youdao.sdk.app.Language; 11 | import com.youdao.sdk.app.LanguageUtils; 12 | import com.youdao.sdk.ydonlinetranslate.Translator; 13 | import com.youdao.sdk.ydtranslate.Translate; 14 | import com.youdao.sdk.ydtranslate.TranslateErrorCode; 15 | import com.youdao.sdk.ydtranslate.TranslateListener; 16 | import com.youdao.sdk.ydtranslate.TranslateParameters; 17 | 18 | import java.util.List; 19 | 20 | /** 21 | * Created by BlindingDark on 2016/8/20 0020. 22 | */ 23 | public class YoudaoTransReq { 24 | String query; 25 | YoudaoSettings youdaoSettings; 26 | Result beanResult = new Result(); 27 | Handler handler; 28 | 29 | public YoudaoTransReq(YoudaoSettings settings, String query, Handler handler) { 30 | beanResult.setOriginalReq(query); 31 | this.youdaoSettings = settings; 32 | this.handler = handler; 33 | this.query = query; 34 | } 35 | 36 | public void trans() { 37 | //查词对象初始化,请设置source参数为app对应的名称(英文字符串) 38 | Language langFrom = LanguageUtils.getLangByName("自动"); 39 | //若设置为自动,则查询自动识别源语言,自动识别不能保证完全正确,最好传源语言类型 40 | //Language langFrom = LanguageUtils.getLangByName("英文"); 41 | Language langTo = LanguageUtils.getLangByName("中文"); 42 | 43 | TranslateParameters tps = new TranslateParameters.Builder() 44 | .source("GeekTrans") 45 | .from(langFrom).to(langTo).build(); 46 | 47 | Translator translator = Translator.getInstance(tps); 48 | 49 | //查询,返回两种情况,一种是成功,相关结果存储在result参数中,另外一种是失败,失败信息放在TranslateErrorCode 是一个枚举类,整个查询是异步的,为了简化操作,回调都是在主线程发生。 50 | 51 | translator.lookup(query, "GeekTrans", new TranslateListener() { 52 | 53 | @Override 54 | public void onError(TranslateErrorCode translateErrorCode, String s) { 55 | beanResult.setWhat(TransActivity.normalToast); 56 | String errorMessage = ""; 57 | int errorCode = translateErrorCode.getCode(); 58 | 59 | switch (errorCode) { 60 | case 101: 61 | errorMessage = "请确认有道密钥已经正确填写了哦~"; 62 | break; 63 | case 102: 64 | errorMessage = "不支持的语言类型"; 65 | break; 66 | case 103: 67 | errorMessage = "翻译文本过长"; 68 | break; 69 | case 104: 70 | errorMessage = "不支持的API类型"; 71 | break; 72 | case 105: 73 | errorMessage = "不支持的签名类型"; 74 | break; 75 | case 106: 76 | errorMessage = "不支持的响应类型"; 77 | break; 78 | case 107: 79 | errorMessage = "不支持的传输加密类型"; 80 | break; 81 | case 108: 82 | errorMessage = "有道密钥不对哦~"; 83 | break; 84 | case 109: 85 | errorMessage = "batchLog格式不正确"; 86 | break; 87 | case 110: 88 | errorMessage = "无相关服务的有效实例~\n注意要同时创建并绑定我的应用和翻译实例!"; 89 | break; 90 | case 111: 91 | errorMessage = "开发者账号无效,可能是账号为欠费状态"; 92 | break; 93 | case 201: 94 | errorMessage = "解密失败,可能为DES,BASE64,URLDecode的错误"; 95 | break; 96 | case 202: 97 | errorMessage = "签名检验失败"; 98 | break; 99 | case 203: 100 | errorMessage = "访问IP地址不在可访问IP列表"; 101 | break; 102 | case 301: 103 | errorMessage = "辞典查询失败"; 104 | break; 105 | case 302: 106 | errorMessage = "翻译查询失败"; 107 | break; 108 | case 303: 109 | errorMessage = "服务端的其它异常"; 110 | break; 111 | case 401: 112 | errorMessage = "账户已经欠费"; 113 | break; 114 | default: 115 | errorMessage = "有道翻译姬出错啦~"; 116 | break; 117 | } 118 | 119 | beanResult.setStringResult(errorMessage); 120 | sendMsg(); 121 | } 122 | 123 | @Override 124 | public void onResult(Translate translate, String input, String requestId) { 125 | YoudaoTransRes youdaoTransRes = new YoudaoTransRes(translate); 126 | 127 | List sounds = youdaoTransRes.getSoundURLs(); 128 | if (sounds.isEmpty()) { 129 | beanResult.setWhat(TransActivity.normalToast); 130 | } else { 131 | beanResult.setWhat(TransActivity.haveSoundToast); 132 | beanResult.setSoundURLs(sounds); 133 | } 134 | 135 | beanResult.setStringResult(youdaoTransRes.toString(youdaoSettings.getDivisionLine())); 136 | 137 | sendMsg(); 138 | } 139 | }); 140 | } 141 | 142 | private void sendMsg() { 143 | beanResult.setFromEngineName(Youdao.ENGINE_NAME); 144 | Message message = new Message(); 145 | message.what = beanResult.getWhat(); 146 | message.obj = beanResult; 147 | handler.sendMessage(message); 148 | } 149 | 150 | } 151 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/youdao/bean/YoudaoSettings.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.youdao.bean; 2 | 3 | import android.content.SharedPreferences; 4 | 5 | import com.blindingdark.geektrans.global.MyApplication; 6 | import com.blindingdark.geektrans.trans.youdao.YoudaoSettingsString; 7 | import com.youdao.sdk.app.YouDaoApplication; 8 | 9 | /** 10 | * Created by BlindingDark on 2016/8/21 0021. 11 | */ 12 | public class YoudaoSettings { 13 | String key = ""; 14 | String keyfrom = ""; 15 | String divisionLine = ""; 16 | 17 | public YoudaoSettings(SharedPreferences preferences) { 18 | key = preferences.getString(YoudaoSettingsString.youdaoKey, ""); 19 | keyfrom = preferences.getString(YoudaoSettingsString.youdaoKeyfrom, "GeekTrans"); 20 | divisionLine = preferences.getString(YoudaoSettingsString.divisionLine, YoudaoSettingsString.defaultDivLine); 21 | 22 | YouDaoApplication.mAppKey = key; 23 | YouDaoApplication.init(MyApplication.getContextObject(), key); 24 | } 25 | 26 | public YoudaoSettings(String key, String keyfrom, String divisionLine) { 27 | this.key = key; 28 | this.keyfrom = keyfrom; 29 | this.divisionLine = divisionLine; 30 | } 31 | 32 | public String getKey() { 33 | return key; 34 | } 35 | 36 | public void setKey(String key) { 37 | this.key = key; 38 | } 39 | 40 | public String getKeyfrom() { 41 | return keyfrom; 42 | } 43 | 44 | public void setKeyfrom(String keyfrom) { 45 | this.keyfrom = keyfrom; 46 | } 47 | 48 | public String getDivisionLine() { 49 | return divisionLine; 50 | } 51 | 52 | public void setDivisionLine(String divisionLine) { 53 | this.divisionLine = divisionLine; 54 | } 55 | 56 | 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/trans/youdao/bean/YoudaoTransRes.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.trans.youdao.bean; 2 | 3 | import android.text.TextUtils; 4 | 5 | import com.blindingdark.geektrans.tools.EnumUtils; 6 | import com.youdao.sdk.ydtranslate.Translate; 7 | import com.youdao.sdk.ydtranslate.WebExplain; 8 | 9 | import java.lang.reflect.Field; 10 | import java.util.ArrayList; 11 | import java.util.HashSet; 12 | import java.util.List; 13 | import java.util.Set; 14 | 15 | /** 16 | * Created by zhuakuang on 17-12-24. 17 | */ 18 | 19 | public class YoudaoTransRes { 20 | private Translate translate; 21 | 22 | public YoudaoTransRes(Translate translate) { 23 | this.translate = translate; 24 | } 25 | 26 | public List getSoundURLs() { 27 | Set sounds = new HashSet<>(); 28 | try { 29 | Field ukSpeakUrlField = Translate.class.getDeclaredField("UKSpeakUrl"); 30 | Field usSpeakUrlField = Translate.class.getDeclaredField("USSpeakUrl"); 31 | Field speakUrlField = Translate.class.getDeclaredField("speakUrl"); 32 | 33 | ukSpeakUrlField.setAccessible(true); 34 | usSpeakUrlField.setAccessible(true); 35 | speakUrlField.setAccessible(true); 36 | 37 | String usSpeak = (String) usSpeakUrlField.get(translate); 38 | String ukSpeak = (String) ukSpeakUrlField.get(translate); 39 | String speak = (String) speakUrlField.get(translate); 40 | 41 | if (!TextUtils.isEmpty(usSpeak)){ 42 | sounds.add(usSpeak); 43 | } 44 | if (!TextUtils.isEmpty(ukSpeak)){ 45 | sounds.add(ukSpeak); 46 | } 47 | if (!TextUtils.isEmpty(speak)){ 48 | sounds.add(speak); 49 | } 50 | } catch (NoSuchFieldException e) { 51 | e.printStackTrace(); 52 | } finally { 53 | return new ArrayList<>(sounds); 54 | } 55 | } 56 | 57 | @Deprecated 58 | @Override 59 | public String toString() { 60 | List results = new ArrayList<>(); 61 | 62 | // 翻译 63 | List translations = translate.getTranslations(); 64 | if (!EnumUtils.isEmpty(translations)) { 65 | results.add(TextUtils.join(";", translations)); 66 | } 67 | 68 | List explainsBlock = new ArrayList<>(); 69 | // 原始请求 70 | explainsBlock.add(translate.getQuery()); 71 | 72 | // 音标 start 73 | String ukPhonetic = translate.getUkPhonetic(); 74 | String usPhonetic = translate.getUsPhonetic(); 75 | String phonetic = translate.getPhonetic(); 76 | 77 | if (!TextUtils.isEmpty(usPhonetic)) { 78 | usPhonetic = "美[" + usPhonetic + "]"; 79 | } 80 | if (!TextUtils.isEmpty(ukPhonetic)) { 81 | ukPhonetic = ("英[" + ukPhonetic + "]"); 82 | } 83 | if (!TextUtils.isEmpty(phonetic)) { 84 | phonetic = ("[" + phonetic + "]"); 85 | } 86 | 87 | List phs = new ArrayList<>(); 88 | phs.add(usPhonetic == null ? "" : usPhonetic); 89 | phs.add(ukPhonetic == null ? "" : ukPhonetic); 90 | if (usPhonetic == null || ukPhonetic == null) { 91 | phs.add(phonetic == null ? "" : phonetic); 92 | } 93 | 94 | if (!EnumUtils.isEmpty(phs)) { 95 | explainsBlock.add(TextUtils.join(" ", phs)); 96 | } 97 | // 音标 end 98 | 99 | // 单词的详细解释 100 | List explains = translate.getExplains(); 101 | if (!EnumUtils.isEmpty(explains)) { 102 | explainsBlock.add(TextUtils.join("\n", explains)); 103 | } 104 | 105 | results.add(TextUtils.join("\n", explainsBlock)); 106 | 107 | // web explain start 108 | List webExplains = translate.getWebExplains(); 109 | if (!EnumUtils.isEmpty(webExplains)) { 110 | List webExp = new ArrayList<>(); 111 | 112 | for (WebExplain webExplain : webExplains) { 113 | webExp.add(formatWebExplain(webExplain)); 114 | } 115 | 116 | results.add(TextUtils.join("\n", webExp)); 117 | } 118 | // web explain end 119 | 120 | return TextUtils.join("\n" + getDiv() + "\n", results); 121 | } 122 | 123 | public String toString(String div) { 124 | this.setDiv(div); 125 | return this.toString(); 126 | } 127 | 128 | private String div = "------"; 129 | 130 | public String getDiv() { 131 | return div; 132 | } 133 | 134 | public void setDiv(String div) { 135 | this.div = div; 136 | } 137 | 138 | private String formatWebExplain(WebExplain webExplain) { 139 | if (null == webExplain) { 140 | return ""; 141 | } 142 | 143 | String key = webExplain.getKey(); 144 | String means = TextUtils.join(";", webExplain.getMeans()); 145 | 146 | return key + "\n" + means; 147 | } 148 | } 149 | -------------------------------------------------------------------------------- /app/src/main/java/com/blindingdark/geektrans/ui/DividerItemDecoration.java: -------------------------------------------------------------------------------- 1 | package com.blindingdark.geektrans.ui; 2 | /* 3 | * Copyright (C) 2014 The Android Open Source Project 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * limitations under the License. 7 | */ 8 | 9 | import android.content.Context; 10 | import android.content.res.TypedArray; 11 | import android.graphics.Canvas; 12 | import android.graphics.Rect; 13 | import android.graphics.drawable.Drawable; 14 | import android.support.v7.widget.LinearLayoutManager; 15 | import android.support.v7.widget.RecyclerView; 16 | import android.view.View; 17 | 18 | 19 | /** 20 | * This class is from the v7 samples of the Android SDK. It's not by me! 21 | *

22 | * See the license above for details. 23 | */ 24 | public class DividerItemDecoration extends RecyclerView.ItemDecoration { 25 | 26 | private static final int[] ATTRS = new int[]{ 27 | android.R.attr.listDivider 28 | }; 29 | 30 | public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; 31 | 32 | public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; 33 | 34 | private Drawable mDivider; 35 | 36 | private int mOrientation; 37 | 38 | public DividerItemDecoration(Context context, int orientation) { 39 | final TypedArray a = context.obtainStyledAttributes(ATTRS); 40 | mDivider = a.getDrawable(0); 41 | a.recycle(); 42 | setOrientation(orientation); 43 | } 44 | 45 | public void setOrientation(int orientation) { 46 | if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { 47 | throw new IllegalArgumentException("invalid orientation"); 48 | } 49 | mOrientation = orientation; 50 | } 51 | 52 | @Override 53 | public void onDraw(Canvas c, RecyclerView parent) { 54 | 55 | if (mOrientation == VERTICAL_LIST) { 56 | drawVertical(c, parent); 57 | } else { 58 | drawHorizontal(c, parent); 59 | } 60 | 61 | } 62 | 63 | @Override 64 | public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 65 | 66 | if (mOrientation == VERTICAL_LIST) { 67 | drawVertical(c, parent); 68 | } else { 69 | drawHorizontal(c, parent); 70 | } 71 | 72 | } 73 | 74 | 75 | public void drawVertical(Canvas c, RecyclerView parent) { 76 | final int left = parent.getPaddingLeft(); 77 | final int right = parent.getWidth() - parent.getPaddingRight(); 78 | 79 | final int childCount = parent.getChildCount(); 80 | for (int i = 0; i < childCount; i++) { 81 | final View child = parent.getChildAt(i); 82 | android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext()); 83 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child 84 | .getLayoutParams(); 85 | final int top = child.getBottom() + params.bottomMargin; 86 | final int bottom = top + mDivider.getIntrinsicHeight(); 87 | mDivider.setBounds(left, top, right, bottom); 88 | mDivider.draw(c); 89 | } 90 | } 91 | 92 | public void drawHorizontal(Canvas c, RecyclerView parent) { 93 | final int top = parent.getPaddingTop(); 94 | final int bottom = parent.getHeight() - parent.getPaddingBottom(); 95 | 96 | final int childCount = parent.getChildCount(); 97 | for (int i = 0; i < childCount; i++) { 98 | final View child = parent.getChildAt(i); 99 | final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child 100 | .getLayoutParams(); 101 | final int left = child.getRight() + params.rightMargin; 102 | final int right = left + mDivider.getIntrinsicHeight(); 103 | mDivider.setBounds(left, top, right, bottom); 104 | mDivider.draw(c); 105 | } 106 | } 107 | 108 | @Override 109 | public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { 110 | if (mOrientation == VERTICAL_LIST) { 111 | outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); 112 | } else { 113 | outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); 114 | } 115 | } 116 | } -------------------------------------------------------------------------------- /app/src/main/java/ezy/assist/compat/RomUtil.java: -------------------------------------------------------------------------------- 1 | package ezy.assist.compat; 2 | 3 | import android.os.Build; 4 | import android.text.TextUtils; 5 | import android.util.Log; 6 | 7 | import java.io.BufferedReader; 8 | import java.io.IOException; 9 | import java.io.InputStreamReader; 10 | 11 | public class RomUtil { 12 | private static final String TAG = "RomUtil"; 13 | 14 | public static final String ROM_MIUI = "MIUI"; 15 | public static final String ROM_EMUI = "EMUI"; 16 | public static final String ROM_FLYME = "FLYME"; 17 | public static final String ROM_OPPO = "OPPO"; 18 | public static final String ROM_SMARTISAN = "SMARTISAN"; 19 | 20 | public static final String ROM_VIVO = "VIVO"; 21 | public static final String ROM_QIHU = "QIHU"; 22 | 23 | public static final String ROM_LENOVO = "LENOVO"; 24 | public static final String ROM_SAMSUNG = "SAMSUNG"; 25 | 26 | private static final String KEY_VERSION_MIUI = "ro.miui.ui.version.name"; 27 | private static final String KEY_VERSION_EMUI = "ro.build.version.emui"; 28 | private static final String KEY_VERSION_OPPO = "ro.build.version.opporom"; 29 | private static final String KEY_VERSION_SMARTISAN = "ro.smartisan.version"; 30 | private static final String KEY_VERSION_VIVO = "ro.vivo.os.version"; 31 | private static final String KEY_VERSION_GIONEE = "ro.gn.sv.version"; 32 | private static final String KEY_VERSION_LENOVO = "ro.lenovo.lvp.version"; 33 | private static final String KEY_VERSION_FLYME = "ro.build.display.id"; 34 | 35 | 36 | private static final String KEY_EMUI_VERSION_CODE = "ro.build.hw_emui_api_level"; 37 | 38 | private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; 39 | private static final String KEY_MIUI_HANDY_MODE_SF = "ro.miui.has_handy_mode_sf"; 40 | private static final String KEY_MIUI_REAL_BLUR = "ro.miui.has_real_blur"; 41 | 42 | private static final String KEY_FLYME_PUBLISHED = "ro.flyme.published"; 43 | private static final String KEY_FLYME_FLYME = "ro.meizu.setupwizard.flyme"; 44 | 45 | private static final String KEY_FLYME_ICON_FALG = "persist.sys.use.flyme.icon"; 46 | private static final String KEY_FLYME_SETUP_FALG = "ro.meizu.setupwizard.flyme"; 47 | private static final String KEY_FLYME_PUBLISH_FALG = "ro.flyme.published"; 48 | 49 | private static final String KEY_VIVO_OS_NAME = "ro.vivo.os.name"; 50 | private static final String KEY_VIVO_OS_VERSION = "ro.vivo.os.version"; 51 | private static final String KEY_VIVO_ROM_VERSION = "ro.vivo.rom.version"; 52 | 53 | public static boolean isEmui() { 54 | return check(ROM_EMUI); 55 | } 56 | 57 | public static boolean isMiui() { 58 | return check(ROM_MIUI); 59 | } 60 | 61 | public static boolean isVivo() { 62 | return check(ROM_VIVO); 63 | } 64 | 65 | public static boolean isOppo() { 66 | return check(ROM_OPPO); 67 | } 68 | 69 | public static boolean isFlyme() { 70 | return check(ROM_FLYME); 71 | } 72 | 73 | public static boolean isQihu() { 74 | return check(ROM_QIHU); 75 | } 76 | 77 | public static boolean isSmartisan() { 78 | return check(ROM_SMARTISAN); 79 | } 80 | 81 | private static String sName; 82 | public static String getName() { 83 | if (sName == null) { 84 | check(""); 85 | } 86 | return sName; 87 | } 88 | private static String sVersion; 89 | public static String getVersion() { 90 | if (sVersion == null) { 91 | check(""); 92 | } 93 | return sVersion; 94 | } 95 | 96 | public static boolean check(String rom) { 97 | if (sName != null) { 98 | return sName.equals(rom); 99 | } 100 | 101 | if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_MIUI))) { 102 | sName = ROM_MIUI; 103 | } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_EMUI))){ 104 | sName = ROM_EMUI; 105 | } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_OPPO))){ 106 | sName = ROM_OPPO; 107 | } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_VIVO))){ 108 | sName = ROM_VIVO; 109 | } else if (!TextUtils.isEmpty(sVersion = getProp(KEY_VERSION_SMARTISAN))){ 110 | sName = ROM_SMARTISAN; 111 | } else { 112 | sVersion = Build.DISPLAY; 113 | if (sVersion.toUpperCase().contains(ROM_FLYME)) { 114 | sName = ROM_FLYME; 115 | } else { 116 | sVersion = Build.UNKNOWN; 117 | sName = Build.MANUFACTURER.toUpperCase(); 118 | } 119 | } 120 | return sName.equals(rom); 121 | } 122 | 123 | public static String getProp(String name) { 124 | String line = null; 125 | BufferedReader input = null; 126 | try { 127 | Process p = Runtime.getRuntime().exec("getprop " + name); 128 | input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); 129 | line = input.readLine(); 130 | input.close(); 131 | } catch (IOException ex) { 132 | Log.e(TAG, "Unable to read prop " + name, ex); 133 | return null; 134 | } finally { 135 | if (input != null) { 136 | try { 137 | input.close(); 138 | } catch (IOException e) { 139 | e.printStackTrace(); 140 | } 141 | } 142 | } 143 | return line; 144 | } 145 | // private static Properties props = new Properties(); 146 | // static { 147 | // try { 148 | // props.load(new FileInputStream(new File("/system/build.prop"))); 149 | // } catch (IOException e) { 150 | // 151 | // } 152 | // } 153 | // public static String getProp(String name) { 154 | // return props.getProperty(name, Build.UNKNOWN); 155 | // } 156 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/add.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/baidulogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/drawable/baidulogo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/card_bg_write.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/custom_toast.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 12 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/divider.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_headset_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/jinshanlogo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/drawable/jinshanlogo.gif -------------------------------------------------------------------------------- /app/src/main/res/drawable/mst_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/drawable/mst_logo.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/youdaologo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/drawable/youdaologo.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_add_trans_engine.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_baidu_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 22 | 23 | 32 | 33 | 36 | 37 | 48 | 49 | 50 | 51 | 55 | 56 | 60 | 61 | 70 | 71 | 81 | 82 | 83 | 88 | 89 | 95 | 96 | 101 | 102 | 103 | 106 | 107 | 111 | 112 | 118 | 119 | 126 | 127 | 128 | 129 | 132 | 133 | 137 | 138 | 144 | 145 | 152 | 153 | 154 | 155 | 158 | 159 | 163 | 164 | 170 | 171 | 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_bing_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 21 | 22 | 31 | 32 | 35 | 36 | 47 | 48 | 49 | 50 | 54 | 55 | 59 | 60 | 69 | 70 | 80 | 81 | 82 | 87 | 88 | 94 | 95 | 100 | 101 | 102 | 105 | 106 | 110 | 111 | 117 | 118 | 125 | 126 | 127 | 128 | 131 | 132 | 136 | 137 | 143 | 144 | 151 | 152 | 153 | 154 | 157 | 158 | 162 | 163 | 169 | 170 | 177 | 178 | 179 | 180 | 181 | 182 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_jinshan_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 22 | 23 | 32 | 33 | 36 | 37 | 48 | 49 | 50 | 51 | 55 | 56 | 60 | 61 | 70 | 71 | 81 | 82 | 83 | 86 | 87 | 91 | 92 | 98 | 99 | 106 | 107 | 108 | 111 | 112 | 118 | 119 | 125 | 126 | 132 | 133 | 134 | 135 | 138 | 139 | 143 | 144 | 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 15 | 16 | 22 | 23 | 24 | 25 | 26 | 39 | 41 | 42 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_engine_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | 19 | 20 | 28 | 29 | 30 | 33 | 34 | 39 | 40 | 42 | 43 |