├── .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 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toast_simple.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
21 |
22 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toast_simple_card_write.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
25 |
26 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toast_with_sound.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
21 |
22 |
28 |
29 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/toast_with_sound_card_write.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 |
19 |
31 |
32 |
33 |
39 |
40 |
41 |
48 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-v21/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values-zh/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 极客翻译
4 | powered by
5 | youdaologo
6 | baidulogo
7 | 自动检测_auto
8 | 英语_en
9 | 粤语_yue
10 | 文言文_wyw
11 | 中文_zh
12 | 日语_jp
13 | 法语_fra
14 | 韩语_kor
15 | 西班牙语_spa
16 | 泰语_th
17 | 阿拉伯语_ara
18 | 俄语_ru
19 | 葡萄牙语_pt
20 | 德语_de
21 | 意大利语_it
22 | 希腊语_el
23 | 荷兰语_nl
24 | 波兰语_pl
25 | 保加利亚语_bul
26 | 爱沙尼亚语_est
27 | 丹麦语_dan
28 | 芬兰语_fin
29 | 捷克语_cs
30 | 罗马尼亚语_rom
31 | 斯洛文尼亚语_slo
32 | 瑞典语_swe
33 | 匈牙利语_hu
34 | 繁体中文_cht
35 | jinshanlogo
36 | 南非荷兰语_af
37 | 简体中文_zh-CHS
38 | 繁体中文_zh-CHT
39 | 阿拉伯语_ar
40 | 保加利亚语_bg
41 | 波斯尼亚语(拉丁)_bs-Latn
42 | 加泰罗尼亚语_ca
43 | 威尔士语_cy
44 | 丹麦语_da
45 | 西班牙语_es
46 | 爱沙尼亚语_et
47 | 波斯语_fa
48 | 芬兰语_fi
49 | 法语_fr
50 | 希伯来语_he
51 | 印地语_hi
52 | 克罗地亚语_hr
53 | 海地克里奥尔语_ht
54 | 印度尼西亚语_id
55 | 日语_ja
56 | 韩语_ko
57 | 立陶宛语_lt
58 | 拉脱维亚语_lv
59 | 马来语_ms
60 | 马耳他语_mt
61 | 苗语_mww
62 | 挪威语_no
63 | 克雷塔罗乙巳语_otq
64 | 罗马尼亚语_ro
65 | 斯洛伐克语_sk
66 | 斯洛文尼亚语_sl
67 | 塞尔维亚语(西里尔)_sr-Cyrl
68 | 塞尔维亚语(拉丁)_sr-Latn
69 | 瑞典语_sv
70 | 斯瓦希里语_sw
71 | 克林贡语_tlh
72 | 土耳其语_tr
73 | 乌克兰语_uk
74 | 乌尔都语_ur
75 | 拉脱维亚语_vi
76 | 尤卡坦玛雅语_yua
77 | 设置
78 | 卡片白
79 | 默认灰
80 | 1
81 | 0
82 | 0
83 | 复制翻译结果
84 | 1
85 | 得到其它翻译引擎结果
86 |
87 |
88 |
--------------------------------------------------------------------------------
/app/src/main/res/values/arrays.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - @string/auto
5 | - @string/zh
6 | - @string/cht
7 | - @string/en
8 | - @string/yue
9 | - @string/wyw
10 | - @string/jp
11 | - @string/kor
12 | - @string/fra
13 | - @string/spa
14 | - @string/th
15 | - @string/ara
16 | - @string/ru
17 | - @string/pt
18 | - @string/de
19 | - @string/it
20 | - @string/el
21 | - @string/nl
22 | - @string/pl
23 | - @string/bul
24 | - @string/est
25 | - @string/dan
26 | - @string/fin
27 | - @string/cs
28 | - @string/rom
29 | - @string/slo
30 | - @string/swe
31 | - @string/hu
32 |
33 |
34 | - @string/zh
35 | - @string/cht
36 | - @string/en
37 | - @string/yue
38 | - @string/wyw
39 | - @string/jp
40 | - @string/kor
41 | - @string/fra
42 | - @string/spa
43 | - @string/th
44 | - @string/ara
45 | - @string/ru
46 | - @string/pt
47 | - @string/de
48 | - @string/it
49 | - @string/el
50 | - @string/nl
51 | - @string/pl
52 | - @string/bul
53 | - @string/est
54 | - @string/dan
55 | - @string/fin
56 | - @string/cs
57 | - @string/rom
58 | - @string/slo
59 | - @string/swe
60 | - @string/hu
61 |
62 |
63 |
64 | - @string/auto
65 | - @string/zh_CHS
66 | - @string/zh_CHT
67 | - @string/en
68 | - @string/af
69 | - @string/ar
70 | - @string/bs_Latn
71 | - @string/bg
72 | - @string/ca
73 | - @string/hr
74 | - @string/cs
75 | - @string/da
76 | - @string/et
77 | - @string/fi
78 | - @string/fr
79 | - @string/ht
80 | - @string/he
81 | - @string/hi
82 | - @string/mww
83 | - @string/hu
84 | - @string/id
85 | - @string/ja
86 | - @string/sw
87 | - @string/tlh
88 | - @string/ko
89 | - @string/lv
90 | - @string/lt
91 | - @string/ms
92 | - @string/mt
93 | - @string/no
94 | - @string/fa
95 | - @string/pl
96 | - @string/pt
97 | - @string/otq
98 | - @string/ro
99 | - @string/ru
100 | - @string/sr_Cyrl
101 | - @string/sr_Latn
102 | - @string/sk
103 | - @string/sl
104 | - @string/es
105 | - @string/sv
106 | - @string/th
107 | - @string/tr
108 | - @string/uk
109 | - @string/ur
110 | - @string/vi
111 | - @string/cy
112 | - @string/yua
113 |
114 |
115 |
116 | - @string/zh_CHS
117 | - @string/zh_CHT
118 | - @string/en
119 | - @string/af
120 | - @string/ar
121 | - @string/bs_Latn
122 | - @string/bg
123 | - @string/ca
124 | - @string/hr
125 | - @string/cs
126 | - @string/da
127 | - @string/et
128 | - @string/fi
129 | - @string/fr
130 | - @string/ht
131 | - @string/he
132 | - @string/hi
133 | - @string/mww
134 | - @string/hu
135 | - @string/id
136 | - @string/ja
137 | - @string/sw
138 | - @string/tlh
139 | - @string/ko
140 | - @string/lv
141 | - @string/lt
142 | - @string/ms
143 | - @string/mt
144 | - @string/no
145 | - @string/fa
146 | - @string/pl
147 | - @string/pt
148 | - @string/otq
149 | - @string/ro
150 | - @string/ru
151 | - @string/sr_Cyrl
152 | - @string/sr_Latn
153 | - @string/sk
154 | - @string/sl
155 | - @string/es
156 | - @string/sv
157 | - @string/th
158 | - @string/tr
159 | - @string/uk
160 | - @string/ur
161 | - @string/vi
162 | - @string/cy
163 | - @string/yua
164 |
165 |
166 |
167 | - @string/def_grey
168 | - @string/card_write
169 |
170 |
171 | - @string/def_grey_value
172 | - @string/card_write_value
173 |
174 |
175 | 0
176 | 1
177 |
178 |
179 | - @string/copy_result
180 | - @string/engine_switch
181 |
182 |
183 |
184 | - @string/copy_result_value
185 | - @string/engine_switch_value
186 |
187 |
188 | 0
189 | 1
190 |
191 |
192 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 | #D3D3D3
7 | #D3D3D3
8 | #DBDBDB
9 | #E4E4E4
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 | 16dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Geektrans
3 | powered by
4 | youdaologo
5 | baidulogo
6 | 自动检测_auto
7 | 英语_en
8 | 粤语_yue
9 | 文言文_wyw
10 | 中文_zh
11 | 日语_jp
12 | 法语_fra
13 | 韩语_kor
14 | 西班牙语_spa
15 | 泰语_th
16 | 阿拉伯语_ara
17 | 俄语_ru
18 | 葡萄牙语_pt
19 | 德语_de
20 | 意大利语_it
21 | 希腊语_el
22 | 荷兰语_nl
23 | 波兰语_pl
24 | 保加利亚语_bul
25 | 爱沙尼亚语_est
26 | 丹麦语_dan
27 | 芬兰语_fin
28 | 捷克语_cs
29 | 罗马尼亚语_rom
30 | 斯洛文尼亚语_slo
31 | 瑞典语_swe
32 | 匈牙利语_hu
33 | 繁体中文_cht
34 | jinshanlogo
35 |
36 | 简体中文_zh-CHS
37 | 繁体中文_zh-CHT
38 | 南非荷兰语_af
39 | 阿拉伯语_ar
40 | 波斯尼亚语(拉丁)_bs-Latn
41 | 保加利亚语_bg
42 | 加泰罗尼亚语_ca
43 | 克罗地亚语_hr
44 | 丹麦语_da
45 | 爱沙尼亚语_et
46 | 芬兰语_fi
47 | 法语_fr
48 | 海地克里奥尔语_ht
49 | 希伯来语_he
50 | 印地语_hi
51 | 苗语_mww
52 | 印度尼西亚语_id
53 | 日语_ja
54 | 斯瓦希里语_sw
55 | 克林贡语_tlh
56 | 韩语_ko
57 | 拉脱维亚语_lv
58 | 立陶宛语_lt
59 | 马来语_ms
60 | 马耳他语_mt
61 | 挪威语_no
62 | 波斯语_fa
63 | 克雷塔罗乙巳语_otq
64 | 罗马尼亚语_ro
65 | 塞尔维亚语(西里尔)_sr-Cyrl
66 | 塞尔维亚语(拉丁)_sr-Latn
67 | 斯洛伐克语_sk
68 | 斯洛文尼亚语_sl
69 | 西班牙语_es
70 | 瑞典语_sv
71 | 土耳其语_tr
72 | 乌克兰语_uk
73 | 乌尔都语_ur
74 | 拉脱维亚语_vi
75 | 威尔士语_cy
76 | 尤卡坦玛雅语_yua
77 | Settings
78 |
79 | default grey
80 | card write
81 | copy result
82 | switch engine
83 |
84 |
85 |
86 |
87 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/preferences_other_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
18 |
26 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/app/src/test/java/com/blindingdark/geektrans/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.blindingdark.geektrans;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.assertEquals;
6 |
7 | /**
8 | * To work on unit tests, switch the Test Artifact in the Build Variants view.
9 | */
10 | public class ExampleUnitTest {
11 | @Test
12 | public void addition_isCorrect() throws Exception {
13 | assertEquals(4, 2 + 2);
14 | }
15 |
16 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:2.3.2'
9 |
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
21 | task clean(type: Delete) {
22 | delete rootProject.buildDir
23 | }
24 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/BlindingDark/Geektrans/9c08977189ee6455c310a2f40ba9d7231e583ab8/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue May 09 23:58:27 CST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------