diff --git a/app/src/main/assets/about.html b/app/src/main/assets/about.html
index fc5906c..a960080 100644
--- a/app/src/main/assets/about.html
+++ b/app/src/main/assets/about.html
@@ -63,6 +63,9 @@
意见反馈:发邮件给我
+
+查看历史日志
+
如果你喜欢咕咚翻译,也许你还会喜欢我的其他作品。
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index aa599c1..d0727ec 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -53,6 +53,7 @@
Version 1.5.0
- 重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)
- 优化: 为 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
+ - 新增: 为 Android 6.0 设备适配自定义的文本选择操作,长按文本点击咕咚翻译后可直接查词。关于自定义文本操作栏
- 新增: 单词数据备份、恢复(2017-02-05)
- 新增: 咕咚翻译可以背收藏的生词了,好词就应该死里记(10-01)
- 新增: 支持手势滑动删除悬浮窗(10-03)
@@ -66,6 +67,9 @@ Version 1.5.0
- 修复: 增加悬浮窗点击事件(10-06)
- 优化: 首页 menu 中可以查看版本信息了(10-07)
+
+ 查看历史日志
+
获取咕咚翻译的最近动态,可通过以下方式关注
微博 @大侠咕咚
diff --git a/doc/Changelog.md b/doc/Changelog.md
index 59e8269..326cf79 100644
--- a/doc/Changelog.md
+++ b/doc/Changelog.md
@@ -1,9 +1,9 @@
# Changelog
-### V1.5.0
-
+## V1.5.0
* 重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)
-* 优化: 为 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
+* 优化: 为 Android 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
+* 新增:为 Android 6.0 设备适配自定义的文本选择操作,长按文本点击咕咚翻译后可直接查词。[详细介绍](http://www.jianshu.com/p/40e84359d683)
* 新增: 单词数据备份、恢复(2017-02-05)
* 新增: 咕咚翻译可以背收藏的生词了,好词就应该死里记(10-01)
* 新增: 支持手势滑动删除悬浮窗(10-03)
From 3bc8b0639ebacc43d6952a0877c930ebe0e80c2c Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 12 Feb 2017 23:20:04 +0800
Subject: [PATCH 04/86] doc:update readme file and travis
---
README.md | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index fd3f554..74d9919 100644
--- a/README.md
+++ b/README.md
@@ -7,12 +7,13 @@
一个实现『划词翻译』功能的 Android 应用 ,可能是目前 Android 市场上翻译效率最高的一款应用。

+
## 待完成功能
* 单词显示框支持沉浸式,覆盖状态栏显示。
-* 单词发音
* 使用 Github 做自动更新
* 不支持谷歌翻译,如果有人有兴趣添加谷歌,必应翻译,欢迎PR。
+* ~~单词发音~~
* ~~显示单词信息时增加音标~~
* ~~生词本为空时的提示信息~~
@@ -43,21 +44,18 @@ V2EX 上对 App 的讨论 [咕咚翻译](https://www.v2ex.com/t/259288#reply69)
Google+ [咕咚翻译社群](https://plus.google.com/u/1/communities/111919086388322816251)
-## 已知 Bug
-* ~~查词时,输入框下面应该会显示"查词中...",目前不能显示出来~~
-* 连续两次复制单词,程序奔溃。
-* 在本应用外收藏成功单词后,没有成功提示
## 技术点
* 1、全程使用 [Dagger2](https://github.com/google/dagger) 对项目进行类依赖管理
* 2、项目使用标准的 MVP 架构,[关于 MVP 的一篇博客](http://gudong.name/advanced/2015/11/23/gank_mvp_introduce.html)
* 3、实现对粘贴板的监听以及访问
-* 4、无需权限显示悬浮窗
-* 5、[RxJava](https://github.com/ReactiveX/RxJava) 的使用
+* 4、无需权限显示悬浮窗(6.0悬浮窗权限适配)
+* 5、使用 [RxJava](https://github.com/ReactiveX/RxJava) 探索函数式编程
* 6、使用 [Retrofit2](https://github.com/square/retrofit) 进行网络请求
* 7、开机自启动
-* 8、泛型
+* 8、Android 6.0 自定义文本操作栏
+
`Note` 3、4都是借鉴自[廖祜秋](https://github.com/liaohuqiu/)的开源项目[android-UCToast](https://github.com/liaohuqiu/android-UCToast),感谢~
From 81581c89ed38f3bd03746c2995e849a37ddb6281 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 12 Feb 2017 23:22:13 +0800
Subject: [PATCH 05/86] doc:add link for custom process text
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 74d9919..83e4f4f 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@ Google+ [咕咚翻译社群](https://plus.google.com/u/1/communities/11191908638
* 5、使用 [RxJava](https://github.com/ReactiveX/RxJava) 探索函数式编程
* 6、使用 [Retrofit2](https://github.com/square/retrofit) 进行网络请求
* 7、开机自启动
-* 8、Android 6.0 自定义文本操作栏
+* 8、Android 6.0 [自定义文本操作栏](http://www.jianshu.com/p/40e84359d683)
`Note` 3、4都是借鉴自[廖祜秋](https://github.com/liaohuqiu/)的开源项目[android-UCToast](https://github.com/liaohuqiu/android-UCToast),感谢~
From 4b76c4ce3007cfa1c53a983f4cb208ab56b90b71 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 12 Feb 2017 23:25:11 +0800
Subject: [PATCH 06/86] doc:update image path for gif
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 83e4f4f..1b675a9 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
一个实现『划词翻译』功能的 Android 应用 ,可能是目前 Android 市场上翻译效率最高的一款应用。

-
+
## 待完成功能
* 单词显示框支持沉浸式,覆盖状态栏显示。
From 16f4ed366f23d168d1e1ff4bd16beb26e6595eba Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=92=95=E5=92=9A?= <1252768410@qq.com>
Date: Mon, 13 Feb 2017 14:37:47 +0800
Subject: [PATCH 07/86] Rename License.txt to LICENSE_.txt
---
License.txt => LICENSE_.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename License.txt => LICENSE_.txt (100%)
diff --git a/License.txt b/LICENSE_.txt
similarity index 100%
rename from License.txt
rename to LICENSE_.txt
From 5f9cf553f93f6c38c1069ead80c1844de1e24931 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=92=95=E5=92=9A?= <1252768410@qq.com>
Date: Mon, 13 Feb 2017 14:38:02 +0800
Subject: [PATCH 08/86] Rename LICENSE_.txt to LICENSE.txt
---
LICENSE_.txt => LICENSE.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename LICENSE_.txt => LICENSE.txt (100%)
diff --git a/LICENSE_.txt b/LICENSE.txt
similarity index 100%
rename from LICENSE_.txt
rename to LICENSE.txt
From a778e772e958c5f05a82cc18178f83c16de88ea5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=92=95=E5=92=9A?= <1252768410@qq.com>
Date: Thu, 16 Feb 2017 00:36:03 +0800
Subject: [PATCH 09/86] Update README.md
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index 1b675a9..339ff7c 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,6 @@
一个实现『划词翻译』功能的 Android 应用 ,可能是目前 Android 市场上翻译效率最高的一款应用。

-
## 待完成功能
* 单词显示框支持沉浸式,覆盖状态栏显示。
From 8c23a0dad5eea6f4334a9e0b556d5b798e10a705 Mon Sep 17 00:00:00 2001
From: laileon
Date: Sat, 18 Feb 2017 12:53:27 +0800
Subject: [PATCH 10/86] #narakai: fix one spelling
---
app/src/main/res/values-zh/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml
index 6f6face..e639bac 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -19,7 +19,7 @@
提示显示时间
开启后,划词翻译显示结果时会自动播放单词发音。
- 开启后,咕咚翻译将会自动的在手机山循环浮动显示已收藏的单词,帮助你更好的记忆这些单词。
+ 开启后,咕咚翻译将会自动的在手机上循环浮动显示已收藏的单词,帮助你更好的记忆这些单词。
开启后,每天早晨8点,手机会为你提示学习每日一句。
开启后,每次打开 App 时将会自动检测粘贴板是否有单词并翻译。
From ca7916b854482364323afaa66f80d5f4b9e09b16 Mon Sep 17 00:00:00 2001
From: lost
Date: Tue, 21 Feb 2017 22:05:27 +0800
Subject: [PATCH 11/86] =?UTF-8?q?1.=E7=BB=99=E5=8D=95=E8=AF=8D=E6=9C=AC?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=91=E9=9F=B3=E5=8A=9F=E8=83=BD=202.?=
=?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8F=92=E5=85=A5=E8=80=B3=E6=9C=BA=E4=BB=8D?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=A4=96=E6=94=BE=E9=97=AE=E9=A2=98(?=
=?UTF-8?q?=E5=8D=8E=E4=B8=BAp9)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mvp/presenters/BasePresenter.java | 4 ++-
.../ui/activitys/WordsBookActivity.java | 1 +
.../ui/adapter/WordsListAdapter.java | 28 +++++++++++++++++++
app/src/main/res/layout/item_word_list.xml | 11 +++++++-
4 files changed, 42 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/BasePresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/BasePresenter.java
index b6905e9..418098f 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/BasePresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/BasePresenter.java
@@ -201,7 +201,7 @@ private void playSound(File file) {
Uri myUri = Uri.fromFile(file);
Logger.i("播放 "+file.getAbsolutePath());
MediaPlayer mediaPlayer = new MediaPlayer();
- mediaPlayer.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
+ mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(getContext(), myUri);
mediaPlayer.prepare();
@@ -211,6 +211,8 @@ private void playSound(File file) {
mediaPlayer.start();
}
+
+
private Callable cacheFileObservable(Context context, String fileName, byte[] data) {
return new Callable() {
@Override
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
index 77e8fcb..bf7c94f 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
@@ -216,6 +216,7 @@ private void initData() {
private void initListView() {
mAdapter = new WordsListAdapter(this);
+ mAdapter.setPresenter(mPresenter);
mAdapter.setOnClickListener(new WordsListAdapter.IClickPopupMenuItem() {
@Override
public void onClickMenuItem(int itemId, Result entity) {
diff --git a/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java b/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
index 4b2cbee..4a9c095 100644
--- a/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
+++ b/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
@@ -41,6 +41,7 @@
import butterknife.ButterKnife;
import name.gudong.translate.R;
import name.gudong.translate.mvp.model.entity.translate.Result;
+import name.gudong.translate.mvp.presenters.BasePresenter;
import name.gudong.translate.util.ViewUtil;
import rx.Observable;
import rx.functions.Action0;
@@ -58,16 +59,22 @@ public class WordsListAdapter extends RecyclerView.Adapter();
}
+ public void setPresenter(BasePresenter presenter){
+ this.presenter=presenter;
+ }
public void setOnClickListener(IClickPopupMenuItem onClickListener) {
mOnClickListener = onClickListener;
}
+
+
public void update(List list) {
update(list, false);
}
@@ -92,6 +99,14 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final Result entity = mList.get(position);
+
+ String mp3Url=entity.getEnMp3();
+ if(TextUtils.isEmpty(mp3Url)){
+ holder.ivSound.setVisibility(View.INVISIBLE);
+ }else {
+ holder.ivSound.setVisibility(View.VISIBLE);
+ }
+
holder.tvSrc.setText(entity.getQuery());
if (!TextUtils.isEmpty(entity.getPhAm())) {
holder.tvPhonetic.setText("[" + entity.getPhAm() + "]");
@@ -124,6 +139,16 @@ public void onClick(View v) {
}
}
});
+
+ holder.ivSound.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String fileName = entity.getMp3FileName();
+ String mp3Url = entity.getEnMp3();
+ presenter.playSound(fileName, mp3Url);
+ // Toast.makeText(mContext,"sound",Toast.LENGTH_SHORT).show();
+ }
+ });
}
@Override
@@ -145,6 +170,8 @@ class ViewHolder extends RecyclerView.ViewHolder {
private TextView tvPhonetic;
private LinearLayout llDst;
private ImageView ivMore;
+ private ImageView ivSound;
+
public ViewHolder(View itemView) {
super(itemView);
@@ -153,6 +180,7 @@ public ViewHolder(View itemView) {
tvPhonetic = ButterKnife.findById(itemView, R.id.tv_pop_phonetic);
tvSrc = ButterKnife.findById(itemView, R.id.tv_pop_src);
ivMore = ButterKnife.findById(itemView, R.id.iv_over_flow);
+ ivSound=ButterKnife.findById(itemView,R.id.iv_sound);
}
}
diff --git a/app/src/main/res/layout/item_word_list.xml b/app/src/main/res/layout/item_word_list.xml
index f04243f..b24bd8d 100755
--- a/app/src/main/res/layout/item_word_list.xml
+++ b/app/src/main/res/layout/item_word_list.xml
@@ -60,7 +60,7 @@
android:maxLength="26"
android:maxLines="1"
android:layout_alignParentLeft="true"
- tools:text="fuck dakjsasjaldjddddddssssssa"
+ tools:text="words"
android:textAppearance="?attr/textAppearanceListItem"/>
+
+
Date: Tue, 21 Feb 2017 23:35:31 +0800
Subject: [PATCH 12/86] temp
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index 1e1927f..f679629 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ ext {
minSdk : 16,
minSdk21 : 21,
targetSdk : 24,
- version_code : 150,
+ version_code : 151,
version_name : "1.5.0"
]
From aa3171fbe6fbfceed0fb4f771053d8a63d7bd038 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Wed, 22 Feb 2017 12:03:40 +0800
Subject: [PATCH 13/86] fix:make sound icon small
---
app/build.gradle | 15 +--------------
app/src/main/res/layout/item_word_list.xml | 10 ++++++----
build.gradle | 2 +-
3 files changed, 8 insertions(+), 19 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index f0fe7a5..9ac1ca2 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -5,20 +5,7 @@ apply plugin:'im.fir.plugin.gradle'
fir{
apiToken '15e5206706b555384608e449d6def6d3'
- changeLog '重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)\n' +
- '优化: 为 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题\n' +
- '新增: 单词数据备份、恢复(2017-02-05)\n' +
- '新增: 咕咚翻译可以背收藏的生词了,好词就应该死里记(10-01)\n' +
- '新增: 支持手势滑动删除悬浮窗(10-03)\n' +
- '变更: 调换设置与单词本的位置(10-17)\n' +
- '优化: 部分 UI 颜色等小细节调整(2017-02-11)\n' +
- '优化: 循环翻译顺序,锁屏停止循环(10-12)\n' +
- '优化: 添加点击按钮的动画(10-04)\n' +
- '优化: 循环显示背单词列表(10-04)\n' +
- '修复: Android N 发音奔溃问题(10-04)\n' +
- '修复: 某些情况下,重复显示翻译结果的问题(2017-02-11)\n' +
- '修复: 增加悬浮窗点击事件(10-06)\n' +
- '优化: 首页 menu 中可以查看版本信息了(10-07)'
+ changeLog '添加单词本发音功能'
}
bughd{
diff --git a/app/src/main/res/layout/item_word_list.xml b/app/src/main/res/layout/item_word_list.xml
index b24bd8d..09dc677 100755
--- a/app/src/main/res/layout/item_word_list.xml
+++ b/app/src/main/res/layout/item_word_list.xml
@@ -68,16 +68,18 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/tv_pop_src"
+ android:layout_alignTop="@+id/tv_pop_src"
android:layout_marginLeft="6dp"
android:layout_toRightOf="@+id/tv_pop_src"
tools:text="[wɑ:t]" />
diff --git a/build.gradle b/build.gradle
index f679629..fb01370 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ ext {
minSdk : 16,
minSdk21 : 21,
targetSdk : 24,
- version_code : 151,
+ version_code : 152,
version_name : "1.5.0"
]
From 9962ee361966ade69e424d7d16a9d666e30e721c Mon Sep 17 00:00:00 2001
From: LevineLiu <994536798@qq.com>
Date: Wed, 22 Feb 2017 15:27:27 +0800
Subject: [PATCH 14/86] add google translate
---
app/build.gradle | 4 +
.../injection/components/AppComponent.java | 5 +
.../injection/modules/ApiServiceModel.java | 7 ++
.../gudong/translate/mvp/model/ApiGoogle.java | 26 +++++
.../translate/mvp/model/WarpAipService.java | 39 +++++++-
.../model/entity/translate/GoogleResult.java | 96 +++++++++++++++++++
.../mvp/model/type/ETranslateFrom.java | 7 +-
.../translate/ui/activitys/MainActivity.java | 4 +
app/src/main/res/values-zh/arrays.xml | 1 +
app/src/main/res/values/arrays.xml | 1 +
10 files changed, 188 insertions(+), 2 deletions(-)
create mode 100644 app/src/main/java/name/gudong/translate/mvp/model/ApiGoogle.java
create mode 100644 app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
diff --git a/app/build.gradle b/app/build.gradle
index f0fe7a5..664ee58 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,6 +64,10 @@ android {
buildConfigField "String", "YOUDAO_DOC_TYPE", '"json"'
buildConfigField "String", "YOUDAO_VERSION", '"1.2"'
+ //google config
+ buildConfigField "String", "GOOGLE_LANGUAGE_ENGLISH", '"en"'
+ buildConfigField "String", "GOOGLE_LANGUAGE_CHINEASE", '"zh-CN"'
+
//common value
buildConfigField "String", "RESULT_JSON", '"json"'
buildConfigField "String", "LANGUAGE_AUTO", '"auto"'
diff --git a/app/src/main/java/name/gudong/translate/injection/components/AppComponent.java b/app/src/main/java/name/gudong/translate/injection/components/AppComponent.java
index b730db6..5fbed9e 100644
--- a/app/src/main/java/name/gudong/translate/injection/components/AppComponent.java
+++ b/app/src/main/java/name/gudong/translate/injection/components/AppComponent.java
@@ -27,6 +27,7 @@
import dagger.Component;
import name.gudong.translate.GDApplication;
import name.gudong.translate.mvp.model.ApiBaidu;
+import name.gudong.translate.mvp.model.ApiGoogle;
import name.gudong.translate.mvp.model.ApiJinShan;
import name.gudong.translate.mvp.model.ApiYouDao;
import name.gudong.translate.mvp.model.SingleRequestService;
@@ -37,6 +38,8 @@
/**
* Created by GuDong on 12/27/15 16:41.
* Contact with gudong.name@gmail.com.
+ *
+ * Updated by Levine on 2/21/17 add google api
*/
@Singleton
@Component(modules = {AppModule.class,ApiServiceModel.class})
@@ -54,6 +57,8 @@ public interface AppComponent {
ApiBaidu getApiBaidu();
+ ApiGoogle getApiGoogle();
+
SingleRequestService getDwnloadService();
}
diff --git a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
index 38121a2..42a5a14 100644
--- a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
+++ b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
@@ -29,6 +29,7 @@
import dagger.Provides;
import name.gudong.translate.BuildConfig;
import name.gudong.translate.mvp.model.ApiBaidu;
+import name.gudong.translate.mvp.model.ApiGoogle;
import name.gudong.translate.mvp.model.ApiJinShan;
import name.gudong.translate.mvp.model.ApiYouDao;
import name.gudong.translate.mvp.model.SingleRequestService;
@@ -43,6 +44,8 @@
/**
* Created by GuDong on 12/27/15 16:17.
* Contact with gudong.name@gmail.com.
+ *
+ * Updated by Levine on 2/21/17 add google api
*/
@Module
public class ApiServiceModel {
@@ -76,6 +79,10 @@ ApiJinShan provideApiJinShan() {
return createService(ETranslateFrom.JIN_SHAN);
}
+ @Provides
+ @Singleton
+ ApiGoogle provideApiGoogle(){return createService(ETranslateFrom.GOOGLE);}
+
private S createService(ETranslateFrom type) {
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(HttpUrl.parse(type.getUrl()))
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/ApiGoogle.java b/app/src/main/java/name/gudong/translate/mvp/model/ApiGoogle.java
new file mode 100644
index 0000000..18da254
--- /dev/null
+++ b/app/src/main/java/name/gudong/translate/mvp/model/ApiGoogle.java
@@ -0,0 +1,26 @@
+package name.gudong.translate.mvp.model;
+
+import okhttp3.ResponseBody;
+import retrofit2.http.GET;
+import retrofit2.http.Query;
+import retrofit2.http.Streaming;
+import rx.Observable;
+
+/**
+ * Created on 2017/2/22
+ *
+ * @author Levine
+ */
+
+public interface ApiGoogle {
+
+ /**
+ * http://translate.google.cn/translate_a/single?client=gtx&sl=en&tl=zh-CN&dt=t&q=google
+ */
+ @Streaming
+ @GET("translate_a/single?client=gtx&dt=t&ie=UTF-8&oe=UTF-8&sl=auto")
+ Observable translateGoogle(
+ @Query("q") String q,
+ @Query("tl") String targetLanguage
+ );
+}
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/WarpAipService.java b/app/src/main/java/name/gudong/translate/mvp/model/WarpAipService.java
index 5eb4998..6d7bd88 100644
--- a/app/src/main/java/name/gudong/translate/mvp/model/WarpAipService.java
+++ b/app/src/main/java/name/gudong/translate/mvp/model/WarpAipService.java
@@ -20,33 +20,43 @@
package name.gudong.translate.mvp.model;
+import java.io.IOException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
import javax.inject.Inject;
import name.gudong.translate.BuildConfig;
import name.gudong.translate.mvp.model.entity.translate.AbsResult;
import name.gudong.translate.mvp.model.entity.translate.BaiDuResult;
+import name.gudong.translate.mvp.model.entity.translate.GoogleResult;
import name.gudong.translate.mvp.model.entity.translate.JinShanResult;
import name.gudong.translate.mvp.model.entity.translate.YouDaoResult;
import name.gudong.translate.mvp.model.type.ETranslateFrom;
import name.gudong.translate.util.SignUtils;
+import okhttp3.ResponseBody;
import rx.Observable;
import rx.functions.Func1;
/**
* Created by GuDong on 1/22/16 10:37.
* Contact with gudong.name@gmail.com.
+ *
+ * Updated by Levine on 2/22/17 add google translation
*/
public class WarpAipService {
private ApiBaidu mApiBaidu;
private ApiYouDao mApiYouDao;
private ApiJinShan mApiJinShan;
+ private ApiGoogle mApiGoogle;
@Inject
- public WarpAipService(ApiBaidu mApiBaidu, ApiJinShan mApiJinShan, ApiYouDao mApiYouDao) {
+ public WarpAipService(ApiBaidu mApiBaidu, ApiJinShan mApiJinShan, ApiYouDao mApiYouDao, ApiGoogle mApiGoogle) {
this.mApiBaidu = mApiBaidu;
this.mApiJinShan = mApiJinShan;
this.mApiYouDao = mApiYouDao;
+ this.mApiGoogle = mApiGoogle;
}
public Observable translate(ETranslateFrom way, String query) {
@@ -98,6 +108,33 @@ public Observable call(BaiDuResult result) {
}
});
break;
+ case GOOGLE:
+ String targetLanguage;
+ //String patternWords = "[a-zA-Z1-9 ]{1,}";
+ String patternWords = "[\u4e00-\u9fa5 ]{1,}";
+ Pattern r = Pattern.compile(patternWords);
+ Matcher m = r.matcher(query);
+ if(!m.matches()){
+ targetLanguage = BuildConfig.GOOGLE_LANGUAGE_CHINEASE;
+ }
+ else {
+ targetLanguage = BuildConfig.GOOGLE_LANGUAGE_ENGLISH;
+ }
+
+ resultObservable = mApiGoogle.translateGoogle(query, targetLanguage)
+ .flatMap(new Func1>() {
+ @Override
+ public Observable call(ResponseBody result) {
+ GoogleResult googleResult = new GoogleResult();
+ try{
+ googleResult.setTranslationResult(result.string());
+ }catch (IOException e){
+ e.printStackTrace();
+ }
+ return Observable.just(googleResult);
+ }
+ });
+ break;
}
return resultObservable;
}
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
new file mode 100644
index 0000000..a703767
--- /dev/null
+++ b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
@@ -0,0 +1,96 @@
+package name.gudong.translate.mvp.model.entity.translate;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import name.gudong.translate.mvp.model.type.ETranslateFrom;
+
+/**
+ * Created on 2017/2/21
+ *
+ * @author Levine
+ */
+
+public class GoogleResult extends AbsResult{
+
+ /**
+ * [[["谷歌","google",,,1]],,"en"]
+ */
+ private String translationResult;
+
+ private List getTranslation(){
+ List translationList = new ArrayList<>(1);
+ String[] translation = translationResult.replace("[", "").split("\",");
+ translationList.add(translation[0].replace("\"", ""));
+ return translationList;
+ }
+
+ @Override
+ public List wrapTranslation() {
+ return getTranslation();
+ }
+
+ @Override
+ public List wrapExplains() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public String wrapQuery() {
+ return translationResult;
+ }
+
+ @Override
+ public int wrapErrorCode() {
+ return 0;
+ }
+
+ @Override
+ public String wrapEnPhonetic() {
+ return null;
+ }
+
+ @Override
+ public String wrapAmPhonetic() {
+ return null;
+ }
+
+ @Override
+ public String wrapEnMp3() {
+ return null;
+ }
+
+ @Override
+ public String wrapAmMp3() {
+ return null;
+ }
+
+ @Override
+ public String translateFrom() {
+ return ETranslateFrom.GOOGLE.name();
+ }
+
+ @Override
+ public String wrapPhEn() {
+ return null;
+ }
+
+ @Override
+ public String wrapPhAm() {
+ return null;
+ }
+
+ @Override
+ public String wrapMp3Name() {
+ return null;
+ }
+
+ public String getTranslationResult() {
+ return translationResult;
+ }
+
+ public void setTranslationResult(String translationResult) {
+ this.translationResult = translationResult;
+ }
+}
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/type/ETranslateFrom.java b/app/src/main/java/name/gudong/translate/mvp/model/type/ETranslateFrom.java
index b016d09..abba0ff 100644
--- a/app/src/main/java/name/gudong/translate/mvp/model/type/ETranslateFrom.java
+++ b/app/src/main/java/name/gudong/translate/mvp/model/type/ETranslateFrom.java
@@ -21,18 +21,23 @@
package name.gudong.translate.mvp.model.type;
import name.gudong.translate.mvp.model.ApiBaidu;
+import name.gudong.translate.mvp.model.ApiGoogle;
import name.gudong.translate.mvp.model.ApiJinShan;
import name.gudong.translate.mvp.model.ApiYouDao;
/**
* Created by GuDong on 1/22/16 18:12.
* Contact with gudong.name@gmail.com.
+ *
+ * updated by Levine on 2/21/17
*/
public enum ETranslateFrom {
BAI_DU(0,"百度","http://api.fanyi.baidu.com/", ApiBaidu.class),
YOU_DAO(1,"有道","http://fanyi.youdao.com/",ApiYouDao.class),
- JIN_SHAN(2,"金山","http://dict-co.iciba.com/",ApiJinShan.class);
+ JIN_SHAN(2,"金山","http://dict-co.iciba.com/",ApiJinShan.class),
+ GOOGLE(3, "谷歌", "http://translate.google.cn/",ApiGoogle.class);
+
private int index;
private String name;
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
index d2a1c2a..e5b8f16 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
@@ -351,6 +351,10 @@ public void onItemSelected(AdapterView> parent, View view, int position, long
selectEngine(ETranslateFrom.JIN_SHAN);
MobclickAgent.onEvent(getApplicationContext(), "way_jinshan");
break;
+ case 3:
+ selectEngine(ETranslateFrom.GOOGLE);
+ MobclickAgent.onEvent(getApplicationContext(), "way_google");
+ break;
}
}
diff --git a/app/src/main/res/values-zh/arrays.xml b/app/src/main/res/values-zh/arrays.xml
index 0005a83..bc39c64 100644
--- a/app/src/main/res/values-zh/arrays.xml
+++ b/app/src/main/res/values-zh/arrays.xml
@@ -4,6 +4,7 @@
- 百度
- 有道
- 金山
+ - 谷歌
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 0005a83..bc39c64 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -4,6 +4,7 @@
- 百度
- 有道
- 金山
+ - 谷歌
From f3b1d4fe0c2ad54f5289ffe8ffc30e00639a05ef Mon Sep 17 00:00:00 2001
From: Gudong
Date: Wed, 22 Feb 2017 21:06:53 +0800
Subject: [PATCH 15/86] fix:in tip mode google translate error and update
change log
---
app/build.gradle | 2 +-
app/src/main/assets/changelog.html | 20 ++++---------------
.../model/entity/translate/GoogleResult.java | 14 +++++++++++--
build.gradle | 4 ++--
doc/Changelog.md | 5 +++++
5 files changed, 24 insertions(+), 21 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 6c3812c..2bcb792 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -5,7 +5,7 @@ apply plugin:'im.fir.plugin.gradle'
fir{
apiToken '15e5206706b555384608e449d6def6d3'
- changeLog '添加单词本发音功能'
+ changeLog '添加单词本发音功能\n增加谷歌翻译的支持'
}
bughd{
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index d0727ec..ca5efe6 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -48,24 +48,12 @@
咕咚翻译 - 一个实现手机端『划词翻译』功能的 App,可能是目前 Android 市场上翻译效率最高的应用。
-Version 1.5.0
+Version 1.5.3
- - 重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)
- - 优化: 为 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
- - 新增: 为 Android 6.0 设备适配自定义的文本选择操作,长按文本点击咕咚翻译后可直接查词。关于自定义文本操作栏
-
- 新增: 单词数据备份、恢复(2017-02-05)
- - 新增: 咕咚翻译可以背收藏的生词了,好词就应该死里记(10-01)
- - 新增: 支持手势滑动删除悬浮窗(10-03)
- - 变更: 调换设置与单词本的位置(10-17)
- - 优化: 部分 UI 颜色等小细节调整(2017-02-11)
- - 优化: 循环翻译顺序,锁屏停止循环(10-12)
- - 优化: 添加点击按钮的动画(10-04)
- - 优化: 循环显示背单词列表(10-04)
- - 修复: Android N 发音奔溃问题(10-04)
- - 修复: 某些情况下,重复显示翻译结果的问题(2017-02-11)
- - 修复: 增加悬浮窗点击事件(10-06)
- - 优化: 首页 menu 中可以查看版本信息了(10-07)
+ - 重要: 增加谷歌翻译的支持(by LevineLiu 2017-02-23)
+ - 重要: 单词本增加发音功能(by LostKe 2017-02-22)
+ - 修复: 插耳机情况下仍使用扬声器发音问题(2017-02-22)
查看历史日志
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
index a703767..d0d92bd 100644
--- a/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
+++ b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
@@ -22,10 +22,20 @@ public class GoogleResult extends AbsResult{
private List getTranslation(){
List translationList = new ArrayList<>(1);
String[] translation = translationResult.replace("[", "").split("\",");
- translationList.add(translation[0].replace("\"", ""));
+ if(translation.length > 0){
+ translationList.add(translation[0].replace("\"", ""));
+ }
return translationList;
}
+ private String getQuery(){
+ String[] translation = translationResult.replace("[", "").split("\",");
+ if(translation.length >1){
+ return translation[1].replace("\"", "");
+ }
+ return "";
+ }
+
@Override
public List wrapTranslation() {
return getTranslation();
@@ -38,7 +48,7 @@ public List wrapExplains() {
@Override
public String wrapQuery() {
- return translationResult;
+ return getQuery();
}
@Override
diff --git a/build.gradle b/build.gradle
index fb01370..6fee8e9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,8 +6,8 @@ ext {
minSdk : 16,
minSdk21 : 21,
targetSdk : 24,
- version_code : 152,
- version_name : "1.5.0"
+ version_code : 153,
+ version_name : "1.5.3"
]
libraries = [
diff --git a/doc/Changelog.md b/doc/Changelog.md
index 326cf79..d4961a1 100644
--- a/doc/Changelog.md
+++ b/doc/Changelog.md
@@ -1,5 +1,10 @@
# Changelog
+## V1.5.3
+* 重要: 增加谷歌翻译的支持(by LevineLiu 2017-02-23)
+* 重要: 单词本增加发音功能(by LostKe 2017-02-22)
+* 修复: 插耳机情况下仍使用扬声器发音问题(2017-02-22)
+
## V1.5.0
* 重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)
* 优化: 为 Android 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
From cf3befe22a514246ae8d1205eaa8113c0522c15c Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sat, 4 Mar 2017 19:22:03 +0800
Subject: [PATCH 16/86] update gradle version to 2.3 and fix share words bug
---
app/src/main/assets/changelog.html | 7 ++++++-
.../gudong/translate/ui/activitys/WordsBookActivity.java | 2 +-
build.gradle | 6 +++---
gradle/wrapper/gradle-wrapper.properties | 2 +-
4 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index ca5efe6..84dd7a1 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -48,8 +48,13 @@
咕咚翻译 - 一个实现手机端『划词翻译』功能的 App,可能是目前 Android 市场上翻译效率最高的应用。
-Version 1.5.3
+Version 1.5.4
+
+ - 修复: 导出单词失败的问题(2017-03-03)
+
+
+Version 1.5.3
- 重要: 增加谷歌翻译的支持(by LevineLiu 2017-02-23)
- 重要: 单词本增加发音功能(by LostKe 2017-02-22)
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
index bf7c94f..73d3067 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
@@ -140,7 +140,7 @@ public void run() {
.setPositiveButton("发送", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- Utils.shareText(getBaseContext(), exportText);
+ Utils.shareText(WordsBookActivity.this, exportText);
}
})
.setNegativeButton("取消", null)
diff --git a/build.gradle b/build.gradle
index 6fee8e9..f514923 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,8 +6,8 @@ ext {
minSdk : 16,
minSdk21 : 21,
targetSdk : 24,
- version_code : 153,
- version_name : "1.5.3"
+ version_code : 154,
+ version_name : "1.5.4"
]
libraries = [
@@ -41,7 +41,7 @@ buildscript {
}
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.3'
+ classpath 'com.android.tools.build:gradle:2.3.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index b97c1d0..7cb3493 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4-all.zip
From e8cef55d4856baa90e2c9b77b98924716a72631e Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 12 Mar 2017 23:35:36 +0800
Subject: [PATCH 17/86] upgrad build version to 25.0.2
---
build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build.gradle b/build.gradle
index f514923..50879c3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
ext {
configuration = [
package : "name.gudong.translate",
- buildToolsVersion : "23.0.2",
+ buildToolsVersion : "25.0.2",
compileVersion : 24,
minSdk : 16,
minSdk21 : 21,
From 6581d606c3a6aa9458f5b4c0f6567350636a9af8 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Mon, 13 Mar 2017 00:27:10 +0800
Subject: [PATCH 18/86] fix count logic for cycle words and make click area
bigger for sound in words list view
---
.../listener/ListenClipboardService.java | 2 -
.../manager/ReciteModulePreference.java | 20 ++++
.../mvp/presenters/ClipboardPresenter.java | 112 +++++++++++-------
.../ui/adapter/WordsListAdapter.java | 5 +-
.../name/gudong/translate/util/SpUtils.java | 2 +
app/src/main/res/layout/item_word_list.xml | 5 +-
6 files changed, 94 insertions(+), 52 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java b/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
index 8c0d390..1436195 100755
--- a/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
+++ b/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
@@ -60,8 +60,6 @@ public final class ListenClipboardService extends Service implements ITipFloatVi
BroadcastReceiver mScreenStatusReceive;
-
-
@Override
public void onCreate() {
setUpInject();
diff --git a/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java b/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java
index 6083856..c117f59 100644
--- a/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java
+++ b/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java
@@ -2,6 +2,8 @@
import android.content.Context;
+import com.orhanobut.logger.Logger;
+
import net.grandcentrix.tray.TrayPreferences;
import name.gudong.translate.mvp.model.type.EDurationTipTime;
@@ -9,12 +11,14 @@
import static name.gudong.translate.util.SpUtils.KEY_INTERVAL_TIP_TIME;
+
/**
* Created by GuDong on 08/12/2016 00:16.
* Contact with gudong.name@gmail.com.
*/
public class ReciteModulePreference extends TrayPreferences{
+ private static final String TAG = "ReciteModulePreference";
private static final boolean DEFAULT_IS_RECITE = false;
//is open JIT translate or not
private static final String KEY_OPEN_JIT = "preference_recite_open_jit";
@@ -29,6 +33,12 @@ public class ReciteModulePreference extends TrayPreferences{
private static final String KEY_PREFERENCE_AUTO_PLAY_SOUND = "preference_auto_play_sound";
+ /**
+ * 当前背诵单词的 query
+ */
+ private static final String KEY_CURRENT_CYCLIC = "CURRENT_CYCLIC";
+
+
public ReciteModulePreference(final Context context) {
super(context, "recite", 1);
}
@@ -63,6 +73,16 @@ public String getDurationTipTime() {
return getString(KEY_DURATION_TIP_TIME,EDurationTipTime.FOUR_SECOND.name());
}
+ public void setCurrentCyclicWord(String query){
+ put(KEY_CURRENT_CYCLIC,query);
+ Logger.t(TAG).i("put "+query +" suc");
+ }
+
+ public String getCurrentCyclicWord(){
+ Logger.t(TAG).i("get "+getString(KEY_CURRENT_CYCLIC,"") +" suc");
+ return getString(KEY_CURRENT_CYCLIC,"");
+ }
+
public EDurationTipTime getDurationTimeWay() {
return EDurationTipTime.valueOf(getDurationTipTime());
}
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
index 5231133..4df4598 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
@@ -21,6 +21,7 @@
package name.gudong.translate.mvp.presenters;
import android.content.Context;
+import android.text.TextUtils;
import com.litesuits.orm.LiteOrm;
import com.litesuits.orm.db.assit.QueryBuilder;
@@ -33,6 +34,7 @@
import name.gudong.translate.BuildConfig;
import name.gudong.translate.listener.clipboard.ClipboardManagerCompat;
+import name.gudong.translate.manager.ReciteModulePreference;
import name.gudong.translate.manager.ReciteWordManager;
import name.gudong.translate.mvp.model.SingleRequestService;
import name.gudong.translate.mvp.model.WarpAipService;
@@ -57,6 +59,8 @@ public class ClipboardPresenter extends TipFloatPresenter {
@Inject
ClipboardManagerCompat mClipboardWatcher;
+ ReciteModulePreference mRecitePreference;
+
/**
* 循环展示单词结果
*/
@@ -75,7 +79,7 @@ public class ClipboardPresenter extends TipFloatPresenter {
private ClipboardManagerCompat.OnPrimaryClipChangedListener mListener = () -> {
CharSequence content = mClipboardWatcher.getText();
- if(content != null){
+ if (content != null) {
performClipboardCheck(content.toString());
}
};
@@ -86,34 +90,48 @@ public class ClipboardPresenter extends TipFloatPresenter {
QueryBuilder queryBuilder = new QueryBuilder(Result.class);
queryBuilder = queryBuilder.whereNoEquals(Result.COL_MARK_DONE_ONCE, true);
results = mLiteOrm.query(queryBuilder);
- Logger.i("result size is "+results.size());
+ mRecitePreference = new ReciteModulePreference(getContext());
}
@Override
- public void onCreate(){
+ public void onCreate() {
super.onCreate();
initCountdownSetting();
- if(SpUtils.isShowIconInNotification(getContext())){
+ if (SpUtils.isShowIconInNotification(getContext())) {
Utils.showNormalNotification(getContext());
}
}
- public boolean isOpenReciteWords(){
+ public boolean isOpenReciteWords() {
return mReciteManger.isReciteOpenOrNot();
}
- public boolean isPlaySoundsAuto(){
+ public boolean isPlaySoundsAuto() {
return mReciteManger.isPlaySoundAuto();
}
- private void initCountdownSetting(){
- mActionShowTip = (t)->{
- if(isOpenReciteWords()){
+ private void initCountdownSetting() {
+ mActionShowTip = (t) -> {
+ if (isOpenReciteWords()) {
Logger.t(KEY_TAG_COUNT_DOWN).i("time is to show words");
- Result result = getResult();
- if(result == null)return;
- mView.showResult(result,false);
- }else{
+ Result result = null;
+ int index = getResultIndex();
+ if (index >= 0) {
+ result = results.get(index);
+ }else{
+ return;
+ }
+ if (result == null) return;
+ mView.showResult(result, false);
+
+ //设置下次显示的单词
+ if(index != results.size()-1){
+ index ++;
+ }
+ Result afterResult = results.get(index);
+ mRecitePreference.setCurrentCyclicWord(afterResult.getQuery());
+
+ } else {
Logger.t(KEY_TAG_COUNT_DOWN).i("time is to show words but was close");
}
};
@@ -122,29 +140,29 @@ private void initCountdownSetting(){
/**
* 开启背单词
*/
- public void openTipCyclic(){
+ public void openTipCyclic() {
EIntervalTipTime tipTime = mReciteManger.getIntervalTimeWay();
int time = tipTime.getIntervalTime();
boolean isSecond = tipTime == EIntervalTipTime.THIRTY_SECOND;
- TimeUnit unit = isSecond? TimeUnit.SECONDS:TimeUnit.MINUTES;
+ TimeUnit unit = isSecond ? TimeUnit.SECONDS : TimeUnit.MINUTES;
- if(mSubscription != null && !mSubscription.isUnsubscribed()){
+ if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
}
- mSubscription = Observable.interval(time,unit)
+ mSubscription = Observable.interval(time, unit)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(mActionShowTip);
- Logger.i(KEY_TAG,"开启背单词任务 间隔 "+tipTime.getIntervalTime());
+ Logger.i(KEY_TAG, "开启背单词任务 间隔 " + tipTime.getIntervalTime());
}
- public void removeTipCyclic(){
- if(mSubscription != null && !mSubscription.isUnsubscribed()){
+ public void removeTipCyclic() {
+ if (mSubscription != null && !mSubscription.isUnsubscribed()) {
mSubscription.unsubscribe();
mSubscription = null;
- Logger.i(KEY_TAG,"移除背单词服务");
+ Logger.i(KEY_TAG, "移除背单词服务");
}
}
@@ -158,22 +176,22 @@ public void addListener() {
private void performClipboardCheck(String queryText) {
//处理缓存 因为粘贴板的回调操作可能触发多次
- Logger.i("粘贴板的单词为 "+queryText);
+ Logger.i("粘贴板的单词为 " + queryText);
if (listQuery.contains(queryText)) {
return;
}
listQuery.add(queryText);
//只有用户在打开了 划词翻译的情况下 划词翻译才能正常工作
- if(!SpUtils.getOpenJITOrNot(getContext()))return;
+ if (!SpUtils.getOpenJITOrNot(getContext())) return;
//如果当前界面是 咕咚翻译的主界面 那么也不对粘贴板做监听( Debug 时开启)
- if(!BuildConfig.DEBUG){
- if(SpUtils.getAppFront(getContext()))return;
+ if (!BuildConfig.DEBUG) {
+ if (SpUtils.getAppFront(getContext())) return;
}
// 检查粘贴板的内容是不是单词 以及是不是为空
- if(!checkInput(queryText)){
+ if (!checkInput(queryText)) {
Logger.i("粘贴板为空");
return;
}
@@ -187,40 +205,42 @@ public void onDestroy() {
}
- private Result getResult(){
- int index = getResultIndex();
- Logger.i("index is "+index);
- if(index>=0){
- return results.get(index);
- } else{
- return null;
- }
- }
- private int getResultIndex(){
- if(results.isEmpty()){
- return -1;
+ private int getResultIndex() {
+ int index = -1;
+ if (results.isEmpty()) {
+ return index;
}
- currentIndex = currentIndex+1;
- if(currentIndex == results.size()-1){
- currentIndex = -1;
- return results.size()-1;
+ /**
+ * 上次背单词时的最后一个单词
+ */
+ String lastQuery = mRecitePreference.getCurrentCyclicWord();
+ if (!TextUtils.isEmpty(lastQuery)) {
+ Result result = new Result();
+ result.setQuery(lastQuery);
+ int indexQuery = results.indexOf(result);
+ if (indexQuery >= 0) {
+ index = indexQuery;
+ }
+ }else{
+ index = 0;
}
- return currentIndex;
+ return index;
}
/**
* 标记已背
+ *
* @param result
*/
public void markDone(Result result) {
result.setMake_done_once(true);
result.setMake_done_once_time(System.currentTimeMillis());
- Logger.i("size "+results.size());
- if(results.remove(result)){
+ Logger.i("size " + results.size());
+ if (results.remove(result)) {
Logger.i("remove suc");
}
- Logger.i("size "+results.size());
+ Logger.i("size " + results.size());
mLiteOrm.update(result);
}
}
\ No newline at end of file
diff --git a/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java b/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
index 4a9c095..ea6c978 100644
--- a/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
+++ b/app/src/main/java/name/gudong/translate/ui/adapter/WordsListAdapter.java
@@ -140,13 +140,12 @@ public void onClick(View v) {
}
});
- holder.ivSound.setOnClickListener(new View.OnClickListener() {
+ holder.mRootWordLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String fileName = entity.getMp3FileName();
String mp3Url = entity.getEnMp3();
presenter.playSound(fileName, mp3Url);
- // Toast.makeText(mContext,"sound",Toast.LENGTH_SHORT).show();
}
});
}
@@ -166,6 +165,7 @@ public void updateReciteMode(boolean isReciteMode) {
class ViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout mRootView;
+ private RelativeLayout mRootWordLayout;
private TextView tvSrc;
private TextView tvPhonetic;
private LinearLayout llDst;
@@ -176,6 +176,7 @@ class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
mRootView = ButterKnife.findById(itemView, R.id.item_word_view);
+ mRootWordLayout = ButterKnife.findById(itemView, R.id.rl_words);
llDst = ButterKnife.findById(itemView, ll_pop_dst);
tvPhonetic = ButterKnife.findById(itemView, R.id.tv_pop_phonetic);
tvSrc = ButterKnife.findById(itemView, R.id.tv_pop_src);
diff --git a/app/src/main/java/name/gudong/translate/util/SpUtils.java b/app/src/main/java/name/gudong/translate/util/SpUtils.java
index 7960946..cd0c8cf 100644
--- a/app/src/main/java/name/gudong/translate/util/SpUtils.java
+++ b/app/src/main/java/name/gudong/translate/util/SpUtils.java
@@ -67,6 +67,7 @@ public static String getUrlByLocalSetting(){
//是否授予 Android M 浮窗权限
private static final String KEY_DRAW_OVERLAYS_PERMISSION = "DRAW_OVERLAYS_PERMISSION";
+
public static void setTranslateEngine(Context context, String version) {
putStringPreference(context, KEY_TRANSLATE_FROM, version);
}
@@ -127,6 +128,7 @@ public static boolean isWordBookReciteMode(Context context){
return getBooleanPreference(context,KEY_WORDBOOK_RECITE_MODE,false);
}
+
//////////////////////////////////////////////////////////////////////////////////////////////////////
// ------------------- SharePreference Util Begin ------------------- //
diff --git a/app/src/main/res/layout/item_word_list.xml b/app/src/main/res/layout/item_word_list.xml
index 09dc677..a337757 100755
--- a/app/src/main/res/layout/item_word_list.xml
+++ b/app/src/main/res/layout/item_word_list.xml
@@ -46,6 +46,7 @@
android:background="@drawable/selector_over_flow"/>
Date: Mon, 13 Mar 2017 00:31:36 +0800
Subject: [PATCH 19/86] update change log
---
app/src/main/assets/changelog.html | 4 +++-
doc/Changelog.md | 5 +++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index 84dd7a1..fb334fe 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -51,7 +51,9 @@
Version 1.5.4
- - 修复: 导出单词失败的问题(2017-03-03)
+ - 优化: 扩大单词本发音点击响应区域(03-13)
+ - 修复: 循环背单词次序混乱问题(03-13)
+ - 修复: 导出单词失败的问题(03-03)
Version 1.5.3
diff --git a/doc/Changelog.md b/doc/Changelog.md
index d4961a1..046fc09 100644
--- a/doc/Changelog.md
+++ b/doc/Changelog.md
@@ -1,5 +1,10 @@
# Changelog
+## V1.5.4
+* 优化: 扩大单词本发音点击响应区域( 03-13)
+* 修复: 循环背单词次序混乱问题(03-13)
+* 修复: 导出单词失败的问题(03-03)
+
## V1.5.3
* 重要: 增加谷歌翻译的支持(by LevineLiu 2017-02-23)
* 重要: 单词本增加发音功能(by LostKe 2017-02-22)
From 1a82754a61e13e95247dd9369a77c6ef1320b03e Mon Sep 17 00:00:00 2001
From: Gudong
Date: Thu, 16 Mar 2017 23:43:25 +0800
Subject: [PATCH 20/86] fix order for cycle
---
.../mvp/presenters/ClipboardPresenter.java | 18 +++++++++---------
.../ui/activitys/WordsBookActivity.java | 3 ---
2 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
index 4df4598..ed44fab 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/ClipboardPresenter.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.text.TextUtils;
+import android.util.Log;
import com.litesuits.orm.LiteOrm;
import com.litesuits.orm.db.assit.QueryBuilder;
@@ -66,8 +67,6 @@ public class ClipboardPresenter extends TipFloatPresenter {
*/
private List results;
- private int currentIndex = -1;
-
/**
* 定时显示 Tip 事件源
*/
@@ -117,16 +116,18 @@ private void initCountdownSetting() {
Result result = null;
int index = getResultIndex();
if (index >= 0) {
- result = results.get(index);
- }else{
+ result = results.get(index);
+ } else {
return;
}
if (result == null) return;
mView.showResult(result, false);
-
//设置下次显示的单词
- if(index != results.size()-1){
- index ++;
+ if (index != results.size() - 1) {
+ index++;
+ }else{
+ //重新循环计数
+ index = 0;
}
Result afterResult = results.get(index);
mRecitePreference.setCurrentCyclicWord(afterResult.getQuery());
@@ -205,7 +206,6 @@ public void onDestroy() {
}
-
private int getResultIndex() {
int index = -1;
if (results.isEmpty()) {
@@ -222,7 +222,7 @@ private int getResultIndex() {
if (indexQuery >= 0) {
index = indexQuery;
}
- }else{
+ } else {
index = 0;
}
return index;
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
index 73d3067..d3a4219 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/WordsBookActivity.java
@@ -70,8 +70,6 @@ public class WordsBookActivity extends BaseActivity implements IB
WordsListAdapter mAdapter;
- private Menu mMenu;
-
public static void gotoWordsBook(Context context) {
Intent intent = new Intent(context, WordsBookActivity.class);
context.startActivity(intent);
@@ -91,7 +89,6 @@ protected void onCreate(Bundle savedInstanceState) {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.book, menu);
- mMenu = menu;
return super.onCreateOptionsMenu(menu);
}
From 12fe49a5d9278aaca98dbe99693f965603487969 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Fri, 17 Mar 2017 00:12:09 +0800
Subject: [PATCH 21/86] adjust translat result style
---
app/src/main/assets/changelog.html | 8 ++++++++
app/src/main/java/name/gudong/translate/util/Utils.java | 5 +++++
.../main/java/name/gudong/translate/util/ViewUtil.java | 2 +-
app/src/main/res/layout/activity_main.xml | 6 +++++-
app/src/main/res/values/colors.xml | 3 ++-
app/src/main/res/values/dimens.xml | 8 ++++----
headsupcompat/src/main/res/values/strings.xml | 1 -
7 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index fb334fe..e57d679 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -48,6 +48,14 @@
咕咚翻译 - 一个实现手机端『划词翻译』功能的 App,可能是目前 Android 市场上翻译效率最高的应用。
+Version 1.5.5
+
+
+ - 修复: 循环背单词次序停留在末尾的bug(03-16)
+ - 修复: 循环背单词次序混乱问题(03-13)
+ - 修复: 导出单词失败的问题(03-03)
+
+
Version 1.5.4
diff --git a/app/src/main/java/name/gudong/translate/util/Utils.java b/app/src/main/java/name/gudong/translate/util/Utils.java
index 6606f89..786478f 100644
--- a/app/src/main/java/name/gudong/translate/util/Utils.java
+++ b/app/src/main/java/name/gudong/translate/util/Utils.java
@@ -126,4 +126,9 @@ public static boolean isJSONFormat(String test) {
}
return true;
}
+
+ public static int dp2px(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
}
diff --git a/app/src/main/java/name/gudong/translate/util/ViewUtil.java b/app/src/main/java/name/gudong/translate/util/ViewUtil.java
index 78987bd..fcaceda 100644
--- a/app/src/main/java/name/gudong/translate/util/ViewUtil.java
+++ b/app/src/main/java/name/gudong/translate/util/ViewUtil.java
@@ -49,7 +49,7 @@ public static View getWordsView(Context context,String word,@ColorRes int color,
TextView tv = new TextView(context);
tv.setTextColor(ContextCompat.getColor(context, color));
tv.setPadding(0,6,0,6);
- tv.setTextSize(16);
+ tv.setTextSize(14);
tv.setTextIsSelectable(isTextSelectable);
tv.setGravity(Gravity.LEFT);
tv.setText(word);
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 8687876..8539c09 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -28,6 +28,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
+ android:textSize="@dimen/ff.textSize.text"
+ android:textColor="@color/ff.textColor.shadowTitle"
android:text="@string/point_input_key" />
@@ -101,7 +104,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="翻译结果"
- android:textColor="#999999" />
+ android:textSize="@dimen/ff.textSize.text"
+ android:textColor="@color/ff.textColor.shadowTitle" />
#fafafa
- #a2a2a2
+ #5c5c5c
#607D8B
#be607d8b
@@ -25,6 +25,7 @@
#88000000
+ #999999
#666666
#727272
#4A4A4A
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e7ed5b4..d4d3f49 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -22,9 +22,9 @@
16dp
24dp
- 16sp
- 14sp
- 12sp
- 11sp
+ 16dp
+ 14dp
+ 12dp
+ 11dp
8dp
diff --git a/headsupcompat/src/main/res/values/strings.xml b/headsupcompat/src/main/res/values/strings.xml
index 11763b1..05ade1d 100755
--- a/headsupcompat/src/main/res/values/strings.xml
+++ b/headsupcompat/src/main/res/values/strings.xml
@@ -2,7 +2,6 @@
Ll
- Hello world!
Settings
app icon
From 0da919cd3df9faf7af8229a6504f5cb3472d8622 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Fri, 17 Mar 2017 00:35:34 +0800
Subject: [PATCH 22/86] fix ui
---
app/src/main/assets/changelog.html | 2 +-
app/src/main/res/layout/pop_view.xml | 70 ++++++++++++++--------------
app/src/main/res/values/dimens.xml | 1 +
3 files changed, 38 insertions(+), 35 deletions(-)
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index e57d679..c632b00 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -52,7 +52,7 @@ Version 1.5.5
- 修复: 循环背单词次序停留在末尾的bug(03-16)
- - 修复: 循环背单词次序混乱问题(03-13)
+ - 优化: 翻译结果的文字大小以及颜色(加深)(03-13)
- 修复: 导出单词失败的问题(03-03)
diff --git a/app/src/main/res/layout/pop_view.xml b/app/src/main/res/layout/pop_view.xml
index 9040d29..fbc2469 100755
--- a/app/src/main/res/layout/pop_view.xml
+++ b/app/src/main/res/layout/pop_view.xml
@@ -31,52 +31,54 @@
android:background="@drawable/selector_pop_view"
android:padding="15dp">
-
+ android:layout_alignParentRight="true"
+ android:gravity="right">
+
-
+
-
+
+
+
-
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index d4d3f49..ecba388 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -27,4 +27,5 @@
12dp
11dp
8dp
+ 40dp
From 6f40c3c66efd561adbf49d184a566cebc8566bb9 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 22:46:23 +0800
Subject: [PATCH 23/86] cfg:update
---
app/src/main/AndroidManifest.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6a0d879..e6908da 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,7 +40,8 @@
From 20f9afd98998398c87ad13dd97f87fc6694e23f2 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 22:52:32 +0800
Subject: [PATCH 24/86] add word count
---
.../name/gudong/translate/mvp/presenters/BookPresenter.java | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/BookPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/BookPresenter.java
index 17f9387..b397291 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/BookPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/BookPresenter.java
@@ -31,7 +31,9 @@
import com.orhanobut.logger.Logger;
import com.umeng.analytics.MobclickAgent;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.Callable;
import javax.inject.Inject;
@@ -73,6 +75,9 @@ public void call(List transResultEntities) {
boolean isReciteMode = SpUtils.isWordBookReciteMode(getContext());
mView.fillData(transResultEntities, isReciteMode);
MobclickAgent.onEvent(getContext(),"wordsCount",transResultEntities.size()+"");
+ Mapparam = new HashMap<>();
+ param.put("wordsCount",transResultEntities.size()+"");
+ MobclickAgent.onEventValue(getContext(), "wordpage", param, 100);
}
});
}
From fe86af909a097a785506fc27c44f0dac1c392cf1 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 22:58:15 +0800
Subject: [PATCH 25/86] remove:headup
---
app/build.gradle | 1 -
app/src/main/AndroidManifest.xml | 6 -
.../translate/listener/AlarmReceiver.java | 32 --
.../translate/manager/AlarmManagers.java | 33 --
.../translate/ui/activitys/MainActivity.java | 2 -
.../name/gudong/translate/util/HeadsUps.java | 41 --
app/src/main/res/color/color_translate.xml | 2 +-
.../main/res/layout/activity_words_book.xml | 2 +-
headsupcompat/.gitignore | 1 -
headsupcompat/build.gradle | 25 -
headsupcompat/proguard-rules.pro | 17 -
.../administrator/ll/ApplicationTest.java | 13 -
headsupcompat/src/main/AndroidManifest.xml | 11 -
.../java/com/mingle/headsUp/Distance.java | 42 --
.../java/com/mingle/headsUp/FloatView.java | 390 --------------
.../main/java/com/mingle/headsUp/HeadsUp.java | 501 ------------------
.../com/mingle/headsUp/HeadsUpManager.java | 230 --------
.../headsUp/widget/CircleImageView.java | 318 -----------
.../drawable-hdpi/bg_transparency_to_grey.xml | 6 -
.../res/drawable-hdpi/notification_bg.xml | 35 --
.../res/drawable-hdpi/notification_bg2.9.png | Bin 475 -> 0 bytes
.../res/drawable-hdpi/notification_bg3.9.png | Bin 557 -> 0 bytes
.../src/main/res/layout/notification.xml | 154 ------
.../src/main/res/layout/notification_bg.xml | 12 -
headsupcompat/src/main/res/menu/my.xml | 9 -
.../res/values/circle_imageview_attrs.xml | 7 -
headsupcompat/src/main/res/values/defualt.xml | 7 -
headsupcompat/src/main/res/values/dimens.xml | 5 -
headsupcompat/src/main/res/values/strings.xml | 8 -
settings.gradle | 3 +-
30 files changed, 3 insertions(+), 1910 deletions(-)
delete mode 100644 app/src/main/java/name/gudong/translate/listener/AlarmReceiver.java
delete mode 100644 app/src/main/java/name/gudong/translate/manager/AlarmManagers.java
delete mode 100644 app/src/main/java/name/gudong/translate/util/HeadsUps.java
delete mode 100755 headsupcompat/.gitignore
delete mode 100755 headsupcompat/build.gradle
delete mode 100755 headsupcompat/proguard-rules.pro
delete mode 100755 headsupcompat/src/androidTest/java/com/example/administrator/ll/ApplicationTest.java
delete mode 100755 headsupcompat/src/main/AndroidManifest.xml
delete mode 100755 headsupcompat/src/main/java/com/mingle/headsUp/Distance.java
delete mode 100755 headsupcompat/src/main/java/com/mingle/headsUp/FloatView.java
delete mode 100755 headsupcompat/src/main/java/com/mingle/headsUp/HeadsUp.java
delete mode 100755 headsupcompat/src/main/java/com/mingle/headsUp/HeadsUpManager.java
delete mode 100755 headsupcompat/src/main/java/com/mingle/headsUp/widget/CircleImageView.java
delete mode 100755 headsupcompat/src/main/res/drawable-hdpi/bg_transparency_to_grey.xml
delete mode 100755 headsupcompat/src/main/res/drawable-hdpi/notification_bg.xml
delete mode 100755 headsupcompat/src/main/res/drawable-hdpi/notification_bg2.9.png
delete mode 100755 headsupcompat/src/main/res/drawable-hdpi/notification_bg3.9.png
delete mode 100755 headsupcompat/src/main/res/layout/notification.xml
delete mode 100755 headsupcompat/src/main/res/layout/notification_bg.xml
delete mode 100755 headsupcompat/src/main/res/menu/my.xml
delete mode 100755 headsupcompat/src/main/res/values/circle_imageview_attrs.xml
delete mode 100755 headsupcompat/src/main/res/values/defualt.xml
delete mode 100755 headsupcompat/src/main/res/values/dimens.xml
delete mode 100755 headsupcompat/src/main/res/values/strings.xml
diff --git a/app/build.gradle b/app/build.gradle
index 2bcb792..9701aa3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -190,7 +190,6 @@ dependencies {
compile ("me.drakeet.library:crashwoodpecker:${libs.crashwoodpecker}"){
exclude module: 'recyclerview-v7'
}
- compile project(":headsupcompat")
compile 'net.grandcentrix.tray:tray:0.11.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e6908da..9818026 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -78,12 +78,6 @@
-
-
-
-
-
-
diff --git a/app/src/main/java/name/gudong/translate/listener/AlarmReceiver.java b/app/src/main/java/name/gudong/translate/listener/AlarmReceiver.java
deleted file mode 100644
index 1f1cd49..0000000
--- a/app/src/main/java/name/gudong/translate/listener/AlarmReceiver.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package name.gudong.translate.listener;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-
-import name.gudong.translate.R;
-import name.gudong.translate.ui.activitys.MainActivity;
-import name.gudong.translate.util.HeadsUps;
-import name.gudong.translate.util.SpUtils;
-
-
-/**
- * Created by drakeet on 7/1/15.
- */
-public class AlarmReceiver extends BroadcastReceiver {
-
- @Override
- public void onReceive(Context context, Intent intent) {
- if (SpUtils.isNotifyDayline(context)) {
- Intent target = new Intent(context, MainActivity.class);
- target.putExtra("from_dayline_remind",true);
- HeadsUps.show(context, target,
- context.getString(R.string.app_name),
- "还没有查看今天的每日一句吧,我已经准备好了。",
- R.mipmap.ic_launcher,
- R.drawable.icon_notification,
- 123123);
- }
-
- }
-}
diff --git a/app/src/main/java/name/gudong/translate/manager/AlarmManagers.java b/app/src/main/java/name/gudong/translate/manager/AlarmManagers.java
deleted file mode 100644
index cec9d86..0000000
--- a/app/src/main/java/name/gudong/translate/manager/AlarmManagers.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package name.gudong.translate.manager;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-
-import java.util.Calendar;
-
-import name.gudong.translate.listener.AlarmReceiver;
-
-public class AlarmManagers {
-
- public static void register(Context context) {
- Calendar today = Calendar.getInstance();
- Calendar now = Calendar.getInstance();
-
- today.set(Calendar.HOUR_OF_DAY, 7);
- today.set(Calendar.MINUTE, 30);
- today.set(Calendar.SECOND, 30);
-
- if (now.after(today)) {
- return;
- }
-
- Intent intent = new Intent("name.gudong.translate.alarm");
- intent.setClass(context, AlarmReceiver.class);
- PendingIntent broadcast = PendingIntent.getBroadcast(context, 520, intent,
- PendingIntent.FLAG_UPDATE_CURRENT);
- AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
- manager.set(AlarmManager.RTC_WAKEUP, today.getTimeInMillis(), broadcast);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
index e5b8f16..192b16a 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
@@ -62,7 +62,6 @@
import name.gudong.translate.injection.components.AppComponent;
import name.gudong.translate.injection.components.DaggerActivityComponent;
import name.gudong.translate.injection.modules.ActivityModule;
-import name.gudong.translate.manager.AlarmManagers;
import name.gudong.translate.mvp.model.entity.dayline.IDayLine;
import name.gudong.translate.mvp.model.entity.translate.JinShanResult;
import name.gudong.translate.mvp.model.entity.translate.Result;
@@ -596,7 +595,6 @@ public void onTranslateComplete() {
private void startListenService() {
mPresenter.startListenClipboardService();
- AlarmManagers.register(this);
}
diff --git a/app/src/main/java/name/gudong/translate/util/HeadsUps.java b/app/src/main/java/name/gudong/translate/util/HeadsUps.java
deleted file mode 100644
index 0f42ecb..0000000
--- a/app/src/main/java/name/gudong/translate/util/HeadsUps.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package name.gudong.translate.util;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.BitmapFactory;
-import android.os.Build;
-
-import com.mingle.headsUp.HeadsUp;
-import com.mingle.headsUp.HeadsUpManager;
-
-public class HeadsUps {
-
- public static void show(Context context, Intent intent, String title, String content, int largeIcon, int smallIcon, int code) {
- PendingIntent pendingIntent = PendingIntent.getActivity(context, 11,
- intent, PendingIntent.FLAG_UPDATE_CURRENT);
-
- HeadsUpManager manage = HeadsUpManager.getInstant(context);
- HeadsUp.Builder builder = new HeadsUp.Builder(context);
- builder.setContentTitle(title)
- .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS)
- .setContentIntent(pendingIntent)
- .setFullScreenIntent(pendingIntent, false)
- .setAutoCancel(true)
- .setContentText(content);
-
- if (Build.VERSION.SDK_INT >= 21) {
- builder.setLargeIcon(
- BitmapFactory.decodeResource(context.getResources(), largeIcon))
- .setSmallIcon(smallIcon);
- }
- else {
- builder.setSmallIcon(largeIcon);
- }
-
- HeadsUp headsUp = builder.buildHeadUp();
- headsUp.setSticky(true);
- manage.notify(code, headsUp);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/res/color/color_translate.xml b/app/src/main/res/color/color_translate.xml
index c1215a0..d2e3704 100644
--- a/app/src/main/res/color/color_translate.xml
+++ b/app/src/main/res/color/color_translate.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_words_book.xml b/app/src/main/res/layout/activity_words_book.xml
index 2536885..2bdb019 100644
--- a/app/src/main/res/layout/activity_words_book.xml
+++ b/app/src/main/res/layout/activity_words_book.xml
@@ -22,7 +22,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/white"
+ android:background="@color/ff.white"
tools:context="name.gudong.translate.ui.activitys.WordsBookActivity">
Testing Fundamentals
- */
-public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
-}
\ No newline at end of file
diff --git a/headsupcompat/src/main/AndroidManifest.xml b/headsupcompat/src/main/AndroidManifest.xml
deleted file mode 100755
index 935f8a3..0000000
--- a/headsupcompat/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/java/com/mingle/headsUp/Distance.java b/headsupcompat/src/main/java/com/mingle/headsUp/Distance.java
deleted file mode 100755
index 2cdf22e..0000000
--- a/headsupcompat/src/main/java/com/mingle/headsUp/Distance.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.mingle.headsUp;
-
-import android.content.Context;
-import android.hardware.SensorManager;
-import android.view.ViewConfiguration;
-
-/**
- * Created by zzz40500 on 15/1/29.
- */
-public class Distance {
- private float mFlingFriction = ViewConfiguration.getScrollFriction();
-
- private static float DECELERATION_RATE = (float) (Math.log(0.78) / Math.log(0.9));
- private static final float INFLEXION = 0.35f;
- private float mPhysicalCoeff;
-
-
- public Distance(Context context){
-
- final float ppi = context.getResources().getDisplayMetrics().density * 160.0f;
- mPhysicalCoeff = SensorManager.GRAVITY_EARTH // g (m/s^2)
- * 39.37f // inch/meter
- * ppi
- * 0.84f; // look and feel tuning
- }
- public double getSplineFlingDistance(int velocity) {
- final double l = getSplineDeceleration(velocity);
- final double decelMinusOne = DECELERATION_RATE - 1.0;
- return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l);
- }
-
- private double getSplineDeceleration(int velocity) {
- return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff));
- }
-
- /* Returns the duration, expressed in milliseconds */
- public int getSplineFlingDuration(int velocity) {
- final double l = getSplineDeceleration(velocity);
- final double decelMinusOne = DECELERATION_RATE - 1.0;
- return (int) (1000.0 * Math.exp(l / decelMinusOne));
- }
-}
diff --git a/headsupcompat/src/main/java/com/mingle/headsUp/FloatView.java b/headsupcompat/src/main/java/com/mingle/headsUp/FloatView.java
deleted file mode 100755
index 3a25f64..0000000
--- a/headsupcompat/src/main/java/com/mingle/headsUp/FloatView.java
+++ /dev/null
@@ -1,390 +0,0 @@
-package com.mingle.headsUp;
-
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ObjectAnimator;
-import android.annotation.SuppressLint;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.os.Handler;
-import android.os.Message;
-import android.view.LayoutInflater;
-import android.view.MotionEvent;
-import android.view.VelocityTracker;
-import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.WindowManager;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- *
- */
-@SuppressLint("ViewConstructor")
-public class FloatView extends LinearLayout {
-
-
-
- private float rawX = 0;
- private float rawY=0;
- private float touchX = 0;
- private float startY = 0;
- public LinearLayout rootView;
- public int originalLeft;
- public int viewWidth;
- private float validWidth;
- private VelocityTracker velocityTracker;
- private int maxVelocity;
- private Distance distance;
-
- private ScrollOrientationEnum scrollOrientationEnum=ScrollOrientationEnum.NONE;
-
- public static WindowManager.LayoutParams winParams = new WindowManager.LayoutParams();
-
- public FloatView(final Context context, int i) {
- super(context);
- LinearLayout view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.notification_bg, null);
- maxVelocity= ViewConfiguration.get(context).getScaledMaximumFlingVelocity();
- rootView = (LinearLayout) view.findViewById(R.id.rootView);
- addView(view);
- viewWidth = context.getResources().getDisplayMetrics().widthPixels;
- validWidth=viewWidth/2.0f;
- originalLeft = 0;
- distance=new Distance(context);
- }
-
- public void setCustomView(View view) {
- rootView.addView(view);
- }
-
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- }
-
-
- private HeadsUp headsUp;
- private long cutDown;
- private Handler mHandle=null;
- private CutDownTime cutDownTime;
- private class CutDownTime extends Thread{
-
- @Override
- public void run() {
- super.run();
-
-
- while (cutDown>0){
- try {
- Thread.sleep(1000);
- cutDown--;
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- if(cutDown==0) {
- mHandle.sendEmptyMessage(0);
- }
-
-
- }
- };
-
-
-
- public HeadsUp getHeadsUp() {
- return headsUp;
- }
-
-private int pointerId;
- public boolean onTouchEvent(MotionEvent event) {
- rawX = event.getRawX();
- rawY=event.getRawY();
- acquireVelocityTracker(event);
- cutDown= headsUp.getDuration();
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- touchX = event.getX();
- startY = event.getRawY();
- pointerId=event.getPointerId(0);
- break;
- case MotionEvent.ACTION_MOVE:
- switch (scrollOrientationEnum){
- case NONE:
- if(Math.abs((rawX - touchX))>20) {
- scrollOrientationEnum=ScrollOrientationEnum.HORIZONTAL;
-
- }else if(startY-rawY>20){
- scrollOrientationEnum=ScrollOrientationEnum.VERTICAL;
-
- }
-
- break;
- case HORIZONTAL:
- updatePosition((int) (rawX - touchX));
- break;
- case VERTICAL:
- if(startY-rawY>20) {
- cancel();
- }
- break;
- }
-
- break;
- case MotionEvent.ACTION_UP:
- velocityTracker.computeCurrentVelocity(1000,maxVelocity);
- int dis= (int) velocityTracker.getYVelocity(pointerId);
- if(scrollOrientationEnum==ScrollOrientationEnum.NONE){
- if(headsUp.getNotification().contentIntent!=null){
-
- try {
- headsUp.getNotification().contentIntent.send();
- cancel();
- } catch (PendingIntent.CanceledException e) {
- e.printStackTrace();
- }
- }
- break;
- }
-
-
- int toX;
- if(preLeft>0){
- toX= (int) (preLeft+Math.abs(dis));
- }else{
- toX= (int) (preLeft-Math.abs(dis));
- }
- if (toX <= -validWidth) {
- float preAlpha=1-Math.abs(preLeft)/validWidth;
- preAlpha=preAlpha>=0?preAlpha:0;
- translationX(preLeft,-(validWidth+10),preAlpha,0);
- } else if (toX <= validWidth) {
- float preAlpha=1-Math.abs(preLeft)/validWidth;
- preAlpha=preAlpha>=0?preAlpha:0;
- translationX(preLeft,0,preAlpha,1);
-
- }else{
- float preAlpha=1-Math.abs(preLeft)/validWidth;
- preAlpha=preAlpha>=0?preAlpha:0;
- translationX(preLeft, validWidth + 10, preAlpha, 0);
- }
- preLeft = 0;
- scrollOrientationEnum=ScrollOrientationEnum.NONE;
- break;
- }
-
- return super.onTouchEvent(event);
-
- }
- /**
- *
- * @param event 向VelocityTracker添加MotionEvent
- *
- * @see android.view.VelocityTracker#obtain()
- * @see android.view.VelocityTracker#addMovement(MotionEvent)
- */
- private void acquireVelocityTracker( MotionEvent event) {
- if(null == velocityTracker) {
- velocityTracker = VelocityTracker.obtain();
- }
- velocityTracker.addMovement(event);
- }
-
-
- private int preLeft;
-
- public void updatePosition(int left) {
-
- float preAlpha=1-Math.abs(preLeft)/validWidth;
- float leftAlpha=1-Math.abs(left)/validWidth;
- preAlpha = preAlpha>=0 ? preAlpha : 0;
- leftAlpha = leftAlpha>=0 ? leftAlpha : 0;
- translationX(preLeft,left,preAlpha,leftAlpha);
-
- preLeft = left;
- }
-
-
-
- public void translationX(float fromX,float toX,float formAlpha, final float toAlpha ){
- ObjectAnimator a1=ObjectAnimator.ofFloat(rootView,"alpha",formAlpha,toAlpha);
- ObjectAnimator a2 = ObjectAnimator.ofFloat(rootView, "translationX", fromX, toX);
- AnimatorSet animatorSet=new AnimatorSet();
- animatorSet.playTogether(a1,a2);
- animatorSet.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if(toAlpha==0){
- HeadsUpManager.getInstant(getContext()).dismiss();
-
- cutDown=-1;
- if(velocityTracker!=null) {
- velocityTracker.clear();
- try {
- velocityTracker.recycle();
- } catch (IllegalStateException e) {
-
- }
- }
-
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
- }
- });
- animatorSet.start();
- }
-
- public void setNotification(final HeadsUp headsUp) {
-
- this.headsUp = headsUp;
-
- mHandle= new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- if(headsUp.isActivateStatusBar()) {
- HeadsUpManager.getInstant(getContext()).silencerNotify(headsUp);
- }
- HeadsUpManager.getInstant(getContext()).animDismiss(headsUp);
- }
- };
-
-
-
- cutDownTime= new CutDownTime();
-
- if(!headsUp.isSticky()){
- cutDownTime.start();
- }
-
-
- cutDown= headsUp.getDuration();
-
- if (headsUp.getCustomView() == null) {
-
- View defaultView = LayoutInflater.from(getContext()).inflate(R.layout.notification, rootView, false);
- rootView.addView(defaultView);
- ImageView imageView = (ImageView) defaultView.findViewById(R.id.iconIM);
- TextView titleTV = (TextView) defaultView.findViewById(R.id.titleTV);
- TextView timeTV = (TextView) defaultView.findViewById(R.id.timeTV);
- TextView messageTV = (TextView) defaultView.findViewById(R.id.messageTV);
- imageView.setImageResource(headsUp.getIcon());
- titleTV.setText(headsUp.getTitleStr());
- messageTV.setText(headsUp.getMsgStr());
- SimpleDateFormat simpleDateFormat=new SimpleDateFormat("HH:mm");
- timeTV.setText( simpleDateFormat.format(new Date()));
-
- if(headsUp.isExpand() && headsUp.getActions().size()>0){
-
- defaultView.findViewById(R.id.menuL).setVisibility(VISIBLE);
- defaultView.findViewById(R.id.line).setVisibility(VISIBLE);
-
- defaultView.findViewById(R.id.menu1).setVisibility(VISIBLE);
- ImageView imageView1= (ImageView) defaultView.findViewById(R.id.menuIM1);
- ImageView imageView2= (ImageView) defaultView.findViewById(R.id.menuIM2);
- ImageView imageView3= (ImageView) defaultView.findViewById(R.id.menuIM3);
- TextView text1= (TextView) defaultView.findViewById(R.id.menuText1);
- TextView text2= (TextView) defaultView.findViewById(R.id.menuText2);
- TextView text3= (TextView) defaultView.findViewById(R.id.menuText3);
- imageView1.setImageResource(headsUp.getActions().get(0).icon);
- text1.setText(headsUp.getActions().get(0).title);
-
- defaultView.findViewById(R.id.menu1).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- headsUp.getActions().get(0).actionIntent.send();
- cancel();
- } catch (PendingIntent.CanceledException e) {
- e.printStackTrace();
- }
- }
- });
-
- if(headsUp.getActions().size()>1){
-
- defaultView.findViewById(R.id.menu2).setVisibility(VISIBLE);
-
- imageView2.setImageResource(headsUp.getActions().get(1).icon);
- text2.setText(headsUp.getActions().get(1).title);
- defaultView.findViewById(R.id.menu2).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- headsUp.getActions().get(1).actionIntent.send();
- cancel();
- } catch (PendingIntent.CanceledException e) {
- e.printStackTrace();
- }
- }
- });
- }
-
- if(headsUp.getActions().size()>2){
-
- defaultView.findViewById(R.id.menu3).setVisibility(VISIBLE);
- imageView3.setImageResource(headsUp.getActions().get(2).icon);
- text3.setText(headsUp.getActions().get(2).title);
- defaultView.findViewById(R.id.menu3).setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- try {
- headsUp.getActions().get(2).actionIntent.send();
- cancel();
- } catch (PendingIntent.CanceledException e) {
- e.printStackTrace();
- }
- }
- });
-
- }
- }
-
- } else {
- setCustomView(headsUp.getCustomView());
- }
-
- }
-
-
- protected void cancel(){
- HeadsUpManager.getInstant(getContext()).animDismiss();
- cutDown = -1;
- cutDownTime.interrupt();
-
-
- if(velocityTracker!=null) {
- try {
- velocityTracker.clear();
- velocityTracker.recycle();
- } catch (IllegalStateException e) {
-
- }
- }
- }
-
-
-
-
- enum ScrollOrientationEnum {
- VERTICAL,HORIZONTAL,NONE
- }
-}
diff --git a/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUp.java b/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUp.java
deleted file mode 100755
index 638007a..0000000
--- a/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUp.java
+++ /dev/null
@@ -1,501 +0,0 @@
-package com.mingle.headsUp;
-
-import android.app.Notification;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.net.Uri;
-import android.os.Bundle;
-import android.support.v4.app.NotificationCompat;
-import android.view.View;
-import android.widget.RemoteViews;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * Created by zzz40500 on 2014/10/9.
- */
-public class HeadsUp {
-
- private Context context;
- /**
- * 出现时间 单位是 second
- */
- private long duration= 9;
- /**
- *
- */
- private Notification notification;
-
- private Builder builder;
-
- private boolean isSticky=false;
-
-
- private boolean activateStatusBar=true;
-
-
- /**
- *
- */
-
- private Notification silencerNotification;
- /**
- * 间隔时间
- */
- private long interval=600 ;
- private int code;
- private List actions;
- private CharSequence titleStr;
- private CharSequence msgStr;
- private int icon;
- private View customView;
- private boolean isExpand;
- private HeadsUp(Context context) {
- this.context=context;
- }
-
-
-
-
-
- public static class Builder extends NotificationCompat.Builder {
-
- private List actions=new ArrayList();
- private HeadsUp headsUp;
-
- public Builder(Context context) {
- super(context);
- headsUp=new HeadsUp(context);
- }
- /**
- * 显示全部界面
- * @param isExpand
- */
- public Builder setUsesChronometer(boolean isExpand){
- headsUp.setExpand(isExpand);
- return this;
- }
- /**
- * Set the first line of text in the platform notification template.
- */
- public Builder setContentTitle(CharSequence title) {
- headsUp.setTitle(title);
- super.setContentTitle(title);
- return this;
- }
-
- /**
- * Set the second line of text in the platform notification template.
- */
- public Builder setContentText(CharSequence text) {
- headsUp.setMessage(text);
- super.setContentText(text);
- return this;
- }
- public Builder setSmallIcon(int icon) {
- headsUp.setIcon(icon);
-// super.setSmallIcon(icon);
- return this;
- }
- protected Builder setIcon(int icon){
- super.setSmallIcon(icon);
- return this;
- }
-
-
-
- public Builder setSticky(boolean isSticky){
- headsUp.setSticky(isSticky);
- return this;
- }
-
-
-
-
- @Override
- public Builder addAction(int icon, CharSequence title, PendingIntent intent) {
- NotificationCompat.Action action=new NotificationCompat.Action(icon, title, intent);
- actions.add(action);
- super.addAction(icon, title, intent);
- return this;
- }
-
-
-
-
- public HeadsUp buildHeadUp(){
- headsUp.setNotification(this.build());
- headsUp.setActions(actions);
- headsUp.setBuilder(this);
- return headsUp;
- }
-
- private Notification silencerNotification(){
- super.setSmallIcon(headsUp.getIcon());
- setDefaults(0);
- return this.build();
- }
-
- @Override
- public Builder setSmallIcon(int icon, int level) {
- setSmallIcon(icon);
-
- return this;
- }
-
- @Override
- public Builder setAutoCancel(boolean autoCancel) {
- super.setAutoCancel(autoCancel);
- return this;
-
- }
-
- @Override
- public Builder setColor(int argb) {
- super.setColor(argb);
- return this;
- }
-
- @Override
- public Builder setDefaults(int defaults) {
- super.setDefaults(defaults);
- return this;
- }
-
- @Override
- public Builder setFullScreenIntent(PendingIntent intent, boolean highPriority) {
- super.setFullScreenIntent(intent, highPriority);
- return this;
- }
-
- @Override
- public Builder setOngoing(boolean ongoing) {
- super.setOngoing(ongoing);
- return this;
- }
-
-
- @Override
- public Builder setVibrate(long[] pattern) {
- super.setVibrate(pattern);
- return this;
- }
-
-
- @Override
- public Builder setLargeIcon(Bitmap icon) {
- super.setLargeIcon(icon);
- return this;
- }
-
- @Override
- public Builder setLights(int argb, int onMs, int offMs) {
- super.setLights(argb, onMs, offMs);
- return this;
- }
-
- @Override
- public Builder setWhen(long when) {
- super.setWhen(when);
- return this;
- }
-
- @Override
- public Builder setShowWhen(boolean show) {
- super.setShowWhen(show);
- return this;
- }
-
-
-
- @Override
- public Builder setSubText(CharSequence text) {
- super.setSubText(text);
- return this;
- }
-
- @Override
- public Builder setNumber(int number) {
- super.setNumber(number);
- return this;
- }
-
- @Override
- public Builder setContentInfo(CharSequence info) {
- super.setContentInfo(info);
- return this;
- }
-
- @Override
- public Builder setProgress(int max, int progress, boolean indeterminate) {
- super.setProgress(max, progress, indeterminate);
- return this;
- }
-
- @Override
- public Builder setContent(RemoteViews views) {
- super.setContent(views);
- return this;
- }
-
- @Override
- public Builder setContentIntent(PendingIntent intent) {
- super.setContentIntent(intent);
- return this;
- }
-
- @Override
- public Builder setDeleteIntent(PendingIntent intent) {
- super.setDeleteIntent(intent);
- return this;
- }
-
- @Override
- public Builder setTicker(CharSequence tickerText) {
- super.setTicker(tickerText);
- return this;
- }
-
- @Override
- public Builder setTicker(CharSequence tickerText, RemoteViews views) {
- super.setTicker(tickerText, views);
- return this;
- }
-
- @Override
- public Builder setSound(Uri sound) {
- super.setSound(sound);
- return this;
- }
-
- @Override
- public Builder setSound(Uri sound, int streamType) {
- super.setSound(sound, streamType);
- return this;
- }
-
- @Override
- public Builder setOnlyAlertOnce(boolean onlyAlertOnce) {
- super.setOnlyAlertOnce(onlyAlertOnce);
- return this;
- }
-
- @Override
- public Builder setLocalOnly(boolean b) {
- super.setLocalOnly(b);
- return this;
- }
-
- @Override
- public Builder setCategory(String category) {
- super.setCategory(category);
- return this;
- }
-
- @Override
- public Builder setPriority(int pri) {
- super.setPriority(pri);
- return this;
- }
-
- @Override
- public Builder addPerson(String uri) {
- super.addPerson(uri);
- return this;
- }
-
- @Override
- public Builder setGroup(String groupKey) {
- super.setGroup(groupKey);
- return this;
- }
-
- @Override
- public Builder setGroupSummary(boolean isGroupSummary) {
- super.setGroupSummary(isGroupSummary);
- return this;
- }
-
- @Override
- public Builder setSortKey(String sortKey) {
- super.setSortKey(sortKey);
- return this;
- }
-
- @Override
- public Builder addExtras(Bundle extras) {
- super.addExtras(extras);
- return this;
- }
-
- @Override
- public Builder setExtras(Bundle extras) {
- super.setExtras(extras);
- return this;
- }
-
- @Override
- public Builder addAction(NotificationCompat.Action action) {
- actions.add(action);
- super.addAction(action);
- return this;
- }
-
- @Override
- public Builder setStyle(NotificationCompat.Style style) {
- super.setStyle(style);
- return this;
- }
-
- @Override
- public Builder setVisibility(int visibility) {
- super.setVisibility(visibility);
- return this;
- }
-
- @Override
- public Builder setPublicVersion(Notification n) {
- super.setPublicVersion(n);
- return this;
- }
-
-
- }
-
-
-
- protected void setIcon(int dRes) {
- icon = dRes;
- }
-
-
- /**
- * 设置消息标题
- *
- * @param titleStr
- */
- protected void setTitle(CharSequence titleStr) {
- this.titleStr = titleStr;
- }
-
- /**
- * 设置消息内容
- *
- * @param msgStr
- */
- protected void setMessage(CharSequence msgStr) {
- this.msgStr = msgStr;
- }
-
-
-
- public Context getContext() {
- return context;
- }
-
- public long getDuration() {
- return duration;
- }
-
-
- public long getInterval() {
- return interval;
- }
-
-
-
-
- public CharSequence getTitleStr() {
- return titleStr;
- }
-
- public CharSequence getMsgStr() {
- return msgStr;
- }
-
- public int getIcon() {
- return icon;
- }
-
- public void setInterval(long interval) {
- this.interval = interval;
- }
-
-
-
-
- public Notification getNotification() {
- return notification;
- }
-
- protected void setNotification(Notification notification) {
- this.notification = notification;
- }
-
-
- public View getCustomView() {
- return customView;
- }
-
- public void setCustomView(View customView) {
- this.customView = customView;
- }
-
- public int getCode() {
- return code;
- }
-
- protected void setCode(int code) {
- this.code = code;
- }
-
- protected List getActions() {
- return actions;
- }
-
- protected void setActions(List actions) {
- this.actions = actions;
- }
-
- protected boolean isExpand() {
- return isExpand;
- }
-
- protected void setExpand(boolean isExpand) {
- this.isExpand = isExpand;
- }
-
- protected Notification getSilencerNotification() {
- return getBuilder().silencerNotification();
- }
-
-
-
- protected Builder getBuilder() {
- return builder;
- }
-
- private void setBuilder(Builder builder) {
- this.builder = builder;
- }
-
-
- public boolean isSticky() {
- return isSticky;
- }
-
- public void setSticky(boolean isSticky) {
- this.isSticky = isSticky;
- }
-
-
- protected boolean isActivateStatusBar() {
- return activateStatusBar;
- }
-
- public void setActivateStatusBar(boolean activateStatusBar) {
- this.activateStatusBar = activateStatusBar;
- }
-}
diff --git a/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUpManager.java b/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUpManager.java
deleted file mode 100755
index b3c4d35..0000000
--- a/headsupcompat/src/main/java/com/mingle/headsUp/HeadsUpManager.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package com.mingle.headsUp;
-
-import android.animation.Animator;
-import android.animation.ObjectAnimator;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.os.Build;
-import android.view.Gravity;
-import android.view.WindowManager;
-
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Queue;
-
-/**
- * Created by zzz40500 on 2014/10/9.
- */
-public class HeadsUpManager {
-
- private WindowManager wmOne;
- private FloatView floatView;
- private Queue msgQueue;
- private static HeadsUpManager manager;
- private Context context;
-
- /**
- *
- */
- private boolean isPolling = false;
-
- private Map map;
- private NotificationManager notificationManager=null;
-
- public static HeadsUpManager getInstant(Context c) {
-
- if (manager == null) {
- manager = new HeadsUpManager(c);
-
- }
- return manager;
-
- }
-
- private HeadsUpManager(Context context) {
- this.context = context;
- map = new HashMap();
- msgQueue = new LinkedList();
- wmOne = (WindowManager) context
- .getSystemService(Context.WINDOW_SERVICE);
-
- notificationManager= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- }
-
- public synchronized void notify(HeadsUp headsUp) {
- if (map.containsKey(headsUp.getCode())) {
- msgQueue.remove(map.get(headsUp.getCode()));
- }
- map.put(headsUp.getCode(), headsUp);
- msgQueue.add(headsUp);
-
- if (!isPolling) {
- poll();
- }
- }
- public synchronized void notify(int code,HeadsUp headsUp) {
- headsUp.setCode(code);
- notify(headsUp);
- }
-
-
- public synchronized void cancel(HeadsUp headsUp) {
-
- cancel(headsUp.getCode());
- }
-
-
- private synchronized void poll() {
- if (!msgQueue.isEmpty()) {
- HeadsUp headsUp = msgQueue.poll();
- map.remove(headsUp.getCode());
-
-
- if ( Build.VERSION.SDK_INT < 21 || headsUp.getCustomView() != null || !headsUp.isActivateStatusBar()){
- isPolling = true;
- show(headsUp);
- }else {
- //当 系统是 lollipop 以上,并且没有自定义布局以后,调用系统自己的 notification
- isPolling = false;
- notificationManager.notify(headsUp.getCode(),headsUp.getBuilder().setIcon(headsUp.getIcon()).build());
-
- }
- } else {
- isPolling = false;
- }
- }
-
-
- private void show(HeadsUp headsUp) {
-
- floatView = new FloatView(context, 20);
- WindowManager.LayoutParams params = FloatView.winParams;
- params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
- params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
- params.width = WindowManager.LayoutParams.MATCH_PARENT;
- params.height = WindowManager.LayoutParams.WRAP_CONTENT;
- params.format = -3;
- params.gravity = Gravity.CENTER | Gravity.TOP;
- params.x = floatView.originalLeft;
- params.y = 0;
- params.alpha = 1f;
- wmOne.addView(floatView, params);
- ObjectAnimator a = ObjectAnimator.ofFloat(floatView.rootView, "translationY", -700, 0);
- a.setDuration(600);
- a.start();
- floatView.setNotification(headsUp);
- if(headsUp.getNotification()!=null ){
- notificationManager.notify(headsUp.getCode(), headsUp.getNotification());
- }
-
-
- }
-
-
-
- public void cancel(){
-
- if(floatView !=null && floatView.getParent()!=null) {
-
- floatView.cancel();
- }
-
-
- }
-
- protected void dismiss() {
-
- if (floatView.getParent()!=null) {
- wmOne.removeView(floatView);
- floatView.postDelayed(new Runnable() {
- @Override
- public void run() {
- poll();
- }
- }, 1000);
- }
-
- }
-
- protected void animDismiss(){
-
- if(floatView !=null && floatView.getParent()!=null){
-
- ObjectAnimator a = ObjectAnimator.ofFloat(floatView.rootView, "translationY", 0, -700);
- a.setDuration(700);
- a.start();
-
-
- a.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animator) {
-
- }
-
- @Override
- public void onAnimationEnd(Animator animator) {
-
-
- dismiss();
- }
-
- @Override
- public void onAnimationCancel(Animator animator) {
- }
-
- @Override
- public void onAnimationRepeat(Animator animator) {
-
-
- }
- });
- }
-
-
-
- }
-
- protected void animDismiss(HeadsUp headsUp){
-
-
- if(floatView.getHeadsUp().getCode()==headsUp.getCode()){
- animDismiss();
- }
-
- }
-
-
- protected void silencerNotify(HeadsUp headsUp){
- if(headsUp.getSilencerNotification()!=null){
- notificationManager.notify(headsUp.getCode(), headsUp.getSilencerNotification());
- }
- }
-
- public void cancel(int code) {
- if (map.containsKey(code)) {
- msgQueue.remove(map.get(code));
- }
- if(floatView!=null && floatView.getHeadsUp().getCode()==code){
- animDismiss();
- }
-
- }
-
-
-
- public void close() {
- cancelAll();
- manager = null;
- }
-
-
- public void cancelAll() {
- msgQueue.clear();
- if (floatView!=null && floatView.getParent()!=null) {
- animDismiss();
- }
- }
-}
diff --git a/headsupcompat/src/main/java/com/mingle/headsUp/widget/CircleImageView.java b/headsupcompat/src/main/java/com/mingle/headsUp/widget/CircleImageView.java
deleted file mode 100755
index 44101fa..0000000
--- a/headsupcompat/src/main/java/com/mingle/headsUp/widget/CircleImageView.java
+++ /dev/null
@@ -1,318 +0,0 @@
-package com.mingle.headsUp.widget;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.BitmapShader;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.graphics.Shader;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.widget.ImageView;
-
-import com.mingle.headsUp.R;
-
-
-public class CircleImageView extends ImageView {
-
- private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;
-
- private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
- private static final int COLORDRAWABLE_DIMENSION = 2;
-
- private static final int DEFAULT_BORDER_WIDTH = 2;
- private static final int DEFAULT_BORDER_COLOR = Color.BLACK;
-
- private final RectF mDrawableRect = new RectF();
- private final RectF mBorderRect = new RectF();
-
- private final Matrix mShaderMatrix = new Matrix();
- private final Paint mBitmapPaint = new Paint();
- private final Paint mBorderPaint = new Paint();
-
- private ColorStateList mBorderColorStateList;
- private int mBorderColor;
- private int mBorderWidth = DEFAULT_BORDER_WIDTH;
-
- private Bitmap mBitmap;
- private BitmapShader mBitmapShader;
- private int mBitmapWidth;
- private int mBitmapHeight;
-
- private float mDrawableRadius;
- private float mBorderRadius;
-
- private ColorFilter mColorFilter;
-
- private boolean mReady;
- private boolean mSetupPending;
-
- public CircleImageView(Context context) {
- super(context);
-
- init();
- }
-
- public CircleImageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- private int paddingTop,paddingLeft,paddingRight,paddingBottom;
-
- public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);
-
- mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
- mBorderColorStateList = a.getColorStateList(R.styleable.CircleImageView_border_color);
- if(mBorderColorStateList!=null) {
- mBorderColor = mBorderColorStateList.getColorForState(getDrawableState(), Color.WHITE);
- }else{
- mBorderColor=Color.WHITE;
- }
- a.recycle();
-
- paddingTop=getPaddingTop();
- paddingLeft=getPaddingLeft();
- paddingRight=getPaddingRight();
- paddingBottom=getPaddingBottom();
-
-
- init();
- }
-
- private void init() {
- super.setScaleType(SCALE_TYPE);
- mReady = true;
-
- if (mSetupPending) {
- setup();
- mSetupPending = false;
- }
- }
-
- @Override
- public ScaleType getScaleType() {
- return SCALE_TYPE;
- }
-
- @Override
- public void setScaleType(ScaleType scaleType) {
- if (scaleType != SCALE_TYPE) {
- throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType));
- }
- }
-
- @Override
- public void setAdjustViewBounds(boolean adjustViewBounds) {
- if (adjustViewBounds) {
- throw new IllegalArgumentException("adjustViewBounds not supported.");
- }
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- if (getDrawable() == null) {
- return;
- }
- canvas.drawCircle(paddingLeft+(getWidth()-paddingRight-paddingLeft) / 2, paddingTop+(getHeight()-paddingTop-paddingBottom )/ 2, mDrawableRadius, mBitmapPaint);
- if (mBorderWidth != 0) {
-
- mBorderPaint.setColor(mBorderColor);
- canvas.drawCircle(
- paddingLeft+(getWidth()-paddingRight-paddingLeft) / 2, paddingTop+(getHeight()-paddingTop-paddingBottom )/ 2
- , mBorderRadius, mBorderPaint);
- }
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
-
-
- if(mBorderColorStateList ==null || !isClickable()){
- return super.onTouchEvent(event);
- }
-
- switch (event.getAction()){
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- mBorderColor=mBorderColorStateList.getDefaultColor();
- break;
-
- default:
- mBorderColor = mBorderColorStateList.getColorForState(getDrawableState(), Color.WHITE);
-
- break;
- }
- invalidate();
- return super.onTouchEvent(event);
- }
-
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- setup();
- }
-
- public int getBorderColor() {
- return mBorderColor;
- }
-
- public void setBorderColor(int borderColor) {
- if (borderColor == mBorderColor) {
- return;
- }
-
- mBorderColor = borderColor;
- mBorderPaint.setColor(mBorderColor);
- invalidate();
- }
-
- public int getBorderWidth() {
- return mBorderWidth;
- }
-
- public void setBorderWidth(int borderWidth) {
- if (borderWidth == mBorderWidth) {
- return;
- }
-
- mBorderWidth = borderWidth;
- setup();
- }
-
- @Override
- public void setImageBitmap(Bitmap bm) {
- super.setImageBitmap(bm);
- mBitmap = bm;
- setup();
- }
-
- @Override
- public void setImageDrawable(Drawable drawable) {
- super.setImageDrawable(drawable);
- mBitmap = getBitmapFromDrawable(drawable);
- setup();
- }
-
- @Override
- public void setImageResource(int resId) {
- super.setImageResource(resId);
- mBitmap = getBitmapFromDrawable(getDrawable());
- setup();
- }
-
- @Override
- public void setImageURI(Uri uri) {
- super.setImageURI(uri);
- mBitmap = getBitmapFromDrawable(getDrawable());
- setup();
- }
-
- @Override
- public void setColorFilter(ColorFilter cf) {
- if (cf == mColorFilter) {
- return;
- }
-
- mColorFilter = cf;
- mBitmapPaint.setColorFilter(mColorFilter);
- invalidate();
- }
-
- private Bitmap getBitmapFromDrawable(Drawable drawable) {
- if (drawable == null) {
- return null;
- }
-
- if (drawable instanceof BitmapDrawable) {
- return ((BitmapDrawable) drawable).getBitmap();
- }
-
- try {
- Bitmap bitmap;
-
- if (drawable instanceof ColorDrawable) {
- bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION, COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
- } else {
- bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG);
- }
-
- Canvas canvas = new Canvas(bitmap);
- drawable.setBounds(paddingLeft, paddingTop, canvas.getWidth()-paddingRight, canvas.getHeight()-paddingBottom);
- drawable.draw(canvas);
- return bitmap;
- } catch (OutOfMemoryError e) {
- return null;
- }
- }
-
- private void setup() {
- if (!mReady) {
- mSetupPending = true;
- return;
- }
-
- if (mBitmap == null) {
- return;
- }
-
- mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
-
- mBitmapPaint.setAntiAlias(true);
- mBitmapPaint.setShader(mBitmapShader);
-
- mBorderPaint.setStyle(Paint.Style.STROKE);
- mBorderPaint.setAntiAlias(true);
-
- mBorderPaint.setStrokeWidth(mBorderWidth);
-
- mBitmapHeight = mBitmap.getHeight();
- mBitmapWidth = mBitmap.getWidth();
-
- mBorderRect.set(paddingLeft, paddingTop, getWidth()-paddingRight, getHeight()-paddingBottom);
- mBorderRadius = Math.min((mBorderRect.height()-mBorderWidth) / 2,( mBorderRect.width()-mBorderWidth) / 2);
-
-
- mDrawableRect.set(mBorderWidth+paddingLeft, mBorderWidth+paddingTop, getWidth()-paddingRight - mBorderWidth, getHeight()-paddingBottom - mBorderWidth);
- mDrawableRadius = Math.min(mDrawableRect.height() / 2, mDrawableRect.width() / 2);
-
- Log.e("mDrawableRadius", mDrawableRadius + "");
- updateShaderMatrix();
- invalidate();
- }
-
- private void updateShaderMatrix() {
- float scale;
- float dx = 0;
- float dy = 0;
-
- mShaderMatrix.set(null);
-
- if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width() * mBitmapHeight) {
- scale = mDrawableRect.height() / (float) mBitmapHeight;
- dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
- } else {
- scale = mDrawableRect.width() / (float) mBitmapWidth;
- dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
- }
-
- mShaderMatrix.setScale(scale, scale);
- mShaderMatrix.postTranslate((int) (dx + 0.5f) +paddingLeft+ mBorderWidth, (int) (dy + 0.5f) + paddingTop+mBorderWidth);
-
- mBitmapShader.setLocalMatrix(mShaderMatrix);
- }
-
-}
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/drawable-hdpi/bg_transparency_to_grey.xml b/headsupcompat/src/main/res/drawable-hdpi/bg_transparency_to_grey.xml
deleted file mode 100755
index 8ef6303..0000000
--- a/headsupcompat/src/main/res/drawable-hdpi/bg_transparency_to_grey.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/drawable-hdpi/notification_bg.xml b/headsupcompat/src/main/res/drawable-hdpi/notification_bg.xml
deleted file mode 100755
index 6608c1e..0000000
--- a/headsupcompat/src/main/res/drawable-hdpi/notification_bg.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/drawable-hdpi/notification_bg2.9.png b/headsupcompat/src/main/res/drawable-hdpi/notification_bg2.9.png
deleted file mode 100755
index a76f5a3324276fb4aa0e832b796a67eb7156071e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 475
zcmV<10VMv3P)}1BH6tU8I^1eq+8b-`yp-ORHs0;sC!Ui?E3v5rknlSg+TQWm&!njUvAd`?5dh
zAkRj=vd)Mu;SS5$r9|(ImmO7e{9(v6;G*$
z(V2)E#5u$za%~+Y984{*)wre-G4g!mE0^ftK^qcDO(hcK1<2P{;)+OXDv=^jYl#bD
zRC9?Da{o^W(UfSGQ&XZTak3@;#K-RBw;h!Y;C8!xH(7xFB{zWIQe`W?SS(&lmdLW~
zS#m2be<<=i?%>LYA`x5!9=A$%hE`pD@ZS4)ZgA~vSj
z#Y5*~)B=2%Wcj+*ho1|7TX%u|A{N$Y8$k|6Oce)yZTMRz3N&g|ql6+#`UKna1&Y=7
R9^(K2002ovPDHLkV1iLk&*uOD
diff --git a/headsupcompat/src/main/res/drawable-hdpi/notification_bg3.9.png b/headsupcompat/src/main/res/drawable-hdpi/notification_bg3.9.png
deleted file mode 100755
index 8fe2e6331970f8181c28db6797ae0825e785f027..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 557
zcmV+|0@D47P)NklgBAtdzV2k2IZu+P+`j$ML2fEV%XNxwvrAbQxI
zfoEaB4(mFzqWQw_=Dd$TXPnvDKtO-l5?ikzFhLZgz*(VCxSmWVZ_DNK+g4cUHx+%0
z#p0F7VP2H^K~*xxAPzF%ay%Zt+Zt;$8oeUtf_ZV~E0Hlk1e}6%P+2S%Q=KxRzsLa=
zb0hp78<&{k6OaZa(6D_deM-EuUms
z%*!!fiA)G2Kps><+b5Ye^YY9OxskD5$Rs71j!!ZjNhYa7rslIuO_z+dB^m4A$^;HF
zJ1(;m8$e*6w&uM$H239k#@mDDd_MotDI)rNc+m8A1sD#8pE_mw{r-opE5OR-ER{;#
z4+euT{DL#ZGcpr>MSoqFvz2QzsDnGu1rOi}JcAy1S%V(OJ+e=iee1fe%_}c7C?tNl
z2G@3ryHCdhZH{lUUxgytUT7SFuq2e>k}L5~TIM!d9#W9XJR)Gn930ZQr@{j~_?awMb)00000NkvXXu0mjf`|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/layout/notification_bg.xml b/headsupcompat/src/main/res/layout/notification_bg.xml
deleted file mode 100755
index 5ce76b8..0000000
--- a/headsupcompat/src/main/res/layout/notification_bg.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/menu/my.xml b/headsupcompat/src/main/res/menu/my.xml
deleted file mode 100755
index 3145a31..0000000
--- a/headsupcompat/src/main/res/menu/my.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/headsupcompat/src/main/res/values/circle_imageview_attrs.xml b/headsupcompat/src/main/res/values/circle_imageview_attrs.xml
deleted file mode 100755
index 2acfe65..0000000
--- a/headsupcompat/src/main/res/values/circle_imageview_attrs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/values/defualt.xml b/headsupcompat/src/main/res/values/defualt.xml
deleted file mode 100755
index e3159b6..0000000
--- a/headsupcompat/src/main/res/values/defualt.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
- #808080
- #e0e0e0
- #00000000
- #ffffff
-
\ No newline at end of file
diff --git a/headsupcompat/src/main/res/values/dimens.xml b/headsupcompat/src/main/res/values/dimens.xml
deleted file mode 100755
index 47c8224..0000000
--- a/headsupcompat/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- 16dp
- 16dp
-
diff --git a/headsupcompat/src/main/res/values/strings.xml b/headsupcompat/src/main/res/values/strings.xml
deleted file mode 100755
index 05ade1d..0000000
--- a/headsupcompat/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- Ll
- Settings
- app icon
-
-
diff --git a/settings.gradle b/settings.gradle
index 7afc1d2..9d495b3 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,2 +1 @@
-include ':app'
-include ':headsupcompat'
\ No newline at end of file
+include ':app'
\ No newline at end of file
From a05c605c374857712fc529a3c3174496f93b777a Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:15:22 +0800
Subject: [PATCH 26/86] fix npe for mView.onError
---
app/src/main/java/name/gudong/translate/GDApplication.java | 2 +-
.../name/gudong/translate/mvp/presenters/MainPresenter.java | 4 +++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/GDApplication.java b/app/src/main/java/name/gudong/translate/GDApplication.java
index 4350149..b0b9a8b 100644
--- a/app/src/main/java/name/gudong/translate/GDApplication.java
+++ b/app/src/main/java/name/gudong/translate/GDApplication.java
@@ -64,7 +64,7 @@ public void onCreate() {
private void initCrashWoodpecker() {
CrashWoodpecker.instance()
- .withKeys("widget", "me.drakeet")
+ .withKeys("widget", "name.gudong")
.setPatchMode(PatchMode.SHOW_LOG_PAGE)
.setPatchDialogUrlToOpen("http://gudong.name")
.setPassToOriginalDefaultHandler(true)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
index 4896adb..229fd9b 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
@@ -216,7 +216,9 @@ public void onError(Throwable e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
- mView.onError(e);
+ if(mView != null){
+ mView.onError(e);
+ }
}
@Override
From 6945adef863d457370a9d4fe1b6b05328c766d81 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:21:27 +0800
Subject: [PATCH 27/86] npe:fix mView
---
.../name/gudong/translate/mvp/presenters/MainPresenter.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
index 229fd9b..9c9e7ca 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
@@ -166,6 +166,7 @@ public List call(AbsResult absResult) {
if (result == null) return null;
result.setCreate_time(System.currentTimeMillis());
result.setUpdate_time(System.currentTimeMillis());
+ if (mView == null) return null;
mView.addTagForView(result);
if (!TextUtils.isEmpty(result.getEnMp3())) {
@@ -216,7 +217,7 @@ public void onError(Throwable e) {
if (BuildConfig.DEBUG) {
e.printStackTrace();
}
- if(mView != null){
+ if (mView != null) {
mView.onError(e);
}
}
From 15fbe0ce8e0f53852bd1478c70a0ca0c23dbdcdf Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:26:37 +0800
Subject: [PATCH 28/86] fix:activity not found error
---
.../mvp/presenters/MainPresenter.java | 14 +++--
.../mvp/presenters/TipFloatPresenter.java | 61 ++++++++++---------
2 files changed, 42 insertions(+), 33 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
index 9c9e7ca..02eba8e 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
@@ -20,6 +20,7 @@
package name.gudong.translate.mvp.presenters;
+import android.content.ActivityNotFoundException;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
@@ -28,6 +29,7 @@
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
+import android.widget.Toast;
import com.litesuits.orm.LiteOrm;
import com.litesuits.orm.db.assit.WhereBuilder;
@@ -247,10 +249,14 @@ public void startListenClipboardService() {
* 去评分
*/
public void gotoMarket() {
- Uri uri = Uri.parse("market://details?id=" + getContext().getPackageName());
- Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- getContext().startActivity(intent);
+ try {
+ Uri uri = Uri.parse("market://details?id=" + getContext().getPackageName());
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ getContext().startActivity(intent);
+ }catch (ActivityNotFoundException e){
+ Toast.makeText(mContext, "没有找到合适的应用商店", Toast.LENGTH_SHORT).show();
+ }
}
public void prepareTranslateWay() {
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
index 340572a..3e46d7f 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
@@ -56,11 +56,11 @@ public class TipFloatPresenter extends BasePresenter {
@Inject
public TipFloatPresenter(LiteOrm liteOrm, WarpAipService apiService, SingleRequestService singleRequestService, Context context) {
- super(liteOrm, apiService, singleRequestService,context);
+ super(liteOrm, apiService, singleRequestService, context);
}
public void search(final String content) {
- if(!checkInput(content)){
+ if (!checkInput(content)) {
mView.onComplete();
return;
}
@@ -68,7 +68,9 @@ public void search(final String content) {
mWarpApiService.translate(SpUtils.getTranslateEngineWay(getContext()), content)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
- .filter((result)->{return result.wrapErrorCode() == 0;})
+ .filter((result) -> {
+ return result.wrapErrorCode() == 0;
+ })
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
@@ -78,13 +80,14 @@ public void onCompleted() {
@Override
public void onError(Throwable e) {
- if(e instanceof SocketTimeoutException){
+ if (mView == null) return;
+ if (e instanceof SocketTimeoutException) {
mView.errorPoint("网络请求超时,请稍后重试。");
- }else{
- if(BuildConfig.DEBUG){
- mView.errorPoint("请求数据异常,您可以试试切换其他引擎。"+e.getMessage());
+ } else {
+ if (BuildConfig.DEBUG) {
+ mView.errorPoint("请求数据异常,您可以试试切换其他引擎。" + e.getMessage());
e.printStackTrace();
- }else{
+ } else {
mView.errorPoint("请求数据异常,您可以试试切换其他引擎。");
}
}
@@ -95,24 +98,24 @@ public void onNext(AbsResult result) {
Result realResult = result.getResult();
realResult.setCreate_time(System.currentTimeMillis());
realResult.setUpdate_time(System.currentTimeMillis());
- mView.showResult(realResult,true);
+ mView.showResult(realResult, true);
}
});
}
- public void initFavoriteStatus(Result result){
- Result localResult= isFavorite(result.getQuery());
- if(localResult!=null){
+ public void initFavoriteStatus(Result result) {
+ Result localResult = isFavorite(result.getQuery());
+ if (localResult != null) {
mView.initWithFavorite(result);
- }else{
+ } else {
mView.initWithNotFavorite(result);
}
}
- public void clickFavorite(View view,Result result){
- Result localResult= isFavorite(result.getQuery());
- if (localResult!=null) {
+ public void clickFavorite(View view, Result result) {
+ Result localResult = isFavorite(result.getQuery());
+ if (localResult != null) {
int index = deleteResultFromDb(localResult);
if (index > 0) {
mView.initWithNotFavorite(result);
@@ -120,7 +123,7 @@ public void clickFavorite(View view,Result result){
} else {
Logger.i("删除失败");
}
- }else{
+ } else {
long index = insertResultToDb(result);
if (index > 0) {
mView.initWithFavorite(result);
@@ -131,39 +134,39 @@ public void clickFavorite(View view,Result result){
}
}
- public void jumpMainActivity(Result result){
- MainPresenter.jumpMainActivityFromClickTipView(getContext(),result);
+ public void jumpMainActivity(Result result) {
+ MainPresenter.jumpMainActivityFromClickTipView(getContext(), result);
}
- protected boolean checkInput(String input){
+ protected boolean checkInput(String input) {
// empty check
if (TextUtils.isEmpty(input)) {
Logger.e("剪贴板为空了");
return false;
}
- if(StringUtils.isChinese(input)){
- Logger.e(input+" 中包含中文字符");
+ if (StringUtils.isChinese(input)) {
+ Logger.e(input + " 中包含中文字符");
return false;
}
- if(StringUtils.isValidEmailAddress(input)){
- Logger.e(input+" 是一个邮箱");
+ if (StringUtils.isValidEmailAddress(input)) {
+ Logger.e(input + " 是一个邮箱");
return false;
}
- if(StringUtils.isValidUrl(input)){
- Logger.e(input+" 是一个网址");
+ if (StringUtils.isValidUrl(input)) {
+ Logger.e(input + " 是一个网址");
return false;
}
- if(StringUtils.isValidNumeric(input)){
- Logger.e(input+" 是一串数字");
+ if (StringUtils.isValidNumeric(input)) {
+ Logger.e(input + " 是一串数字");
return false;
}
// length check
- if(StringUtils.isMoreThanOneWord(input)){
+ if (StringUtils.isMoreThanOneWord(input)) {
mView.errorPoint("咕咚翻译目前不支持划句或者划短语翻译\n多谢理解");
return false;
}
From f4f33fdd60efd45285404864ea4da17277c1e1b2 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:46:29 +0800
Subject: [PATCH 29/86] fix:npe for process text
---
.../mvp/presenters/TipFloatPresenter.java | 1 +
.../ui/activitys/ProcessTextActivity.java | 16 +++++++---------
2 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
index 3e46d7f..6ad0852 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
@@ -95,6 +95,7 @@ public void onError(Throwable e) {
@Override
public void onNext(AbsResult result) {
+ if (mView == null) return;
Result realResult = result.getResult();
realResult.setCreate_time(System.currentTimeMillis());
realResult.setUpdate_time(System.currentTimeMillis());
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/ProcessTextActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/ProcessTextActivity.java
index 7ac481d..e76f82a 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/ProcessTextActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/ProcessTextActivity.java
@@ -8,24 +8,24 @@
import android.animation.Animator;
import android.content.Intent;
import android.os.Bundle;
+import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
-import com.orhanobut.logger.Logger;
import com.umeng.analytics.MobclickAgent;
import javax.inject.Inject;
+import name.gudong.translate.injection.components.AppComponent;
+import name.gudong.translate.injection.components.DaggerActivityComponent;
+import name.gudong.translate.injection.modules.ActivityModule;
import name.gudong.translate.listener.view.TipView;
import name.gudong.translate.listener.view.TipViewController;
import name.gudong.translate.mvp.model.entity.translate.Result;
import name.gudong.translate.mvp.presenters.BasePresenter;
import name.gudong.translate.mvp.presenters.TipFloatPresenter;
import name.gudong.translate.mvp.views.ITipFloatView;
-import name.gudong.translate.injection.components.AppComponent;
-import name.gudong.translate.injection.components.DaggerActivityComponent;
-import name.gudong.translate.injection.modules.ActivityModule;
public class ProcessTextActivity extends BaseActivity implements ITipFloatView, TipView.ITipViewListener {
@Inject
@@ -52,11 +52,9 @@ private void checkText(Intent intent) {
CharSequence text = intent.getCharSequenceExtra(Intent.EXTRA_PROCESS_TEXT);
boolean readonly =
getIntent().getBooleanExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, false);
-
- Logger.i("result is " + text + " readonly is " + readonly);
- // 检查粘贴板的内容是不是单词 以及是不是为空
- //mTvPopSrc.setText("result is " + text);
- mPresenter.search(text.toString());
+ if(!TextUtils.isEmpty(text)){
+ mPresenter.search(text.toString());
+ }
}
@Override
From 5cac8208b6670b66277dab40816793bf51aa91e2 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:51:15 +0800
Subject: [PATCH 30/86] fix:add source tip when error
---
.../gudong/translate/mvp/presenters/TipFloatPresenter.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
index 6ad0852..b3e6646 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/TipFloatPresenter.java
@@ -38,6 +38,7 @@
import name.gudong.translate.mvp.model.WarpAipService;
import name.gudong.translate.mvp.model.entity.translate.AbsResult;
import name.gudong.translate.mvp.model.entity.translate.Result;
+import name.gudong.translate.mvp.model.type.ETranslateFrom;
import name.gudong.translate.mvp.views.ITipFloatView;
import name.gudong.translate.util.SpUtils;
import name.gudong.translate.util.StringUtils;
@@ -65,7 +66,8 @@ public void search(final String content) {
return;
}
- mWarpApiService.translate(SpUtils.getTranslateEngineWay(getContext()), content)
+ ETranslateFrom from = SpUtils.getTranslateEngineWay(getContext());
+ mWarpApiService.translate(from, content)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.filter((result) -> {
@@ -88,7 +90,7 @@ public void onError(Throwable e) {
mView.errorPoint("请求数据异常,您可以试试切换其他引擎。" + e.getMessage());
e.printStackTrace();
} else {
- mView.errorPoint("请求数据异常,您可以试试切换其他引擎。");
+ mView.errorPoint("请求数据异常(source:"+from.getName()+"),您可以试试切换其他引擎。");
}
}
}
From aa91f99c24d6985cb7500a9861f08357874d6fb8 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Sun, 2 Apr 2017 23:55:46 +0800
Subject: [PATCH 31/86] doc:update change log
---
app/src/main/assets/changelog.html | 19 ++++++-------------
1 file changed, 6 insertions(+), 13 deletions(-)
diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html
index c632b00..489db1d 100644
--- a/app/src/main/assets/changelog.html
+++ b/app/src/main/assets/changelog.html
@@ -48,28 +48,21 @@
咕咚翻译 - 一个实现手机端『划词翻译』功能的 App,可能是目前 Android 市场上翻译效率最高的应用。
-Version 1.5.5
+Version 1.6.0
- - 修复: 循环背单词次序停留在末尾的bug(03-16)
- - 优化: 翻译结果的文字大小以及颜色(加深)(03-13)
- - 修复: 导出单词失败的问题(03-03)
+ - 修复: 诸多奔溃异常问题(04-02)
+ - 优化: 翻译失败增加当前翻译引擎提示(04-02)
-Version 1.5.4
+Version 1.5.5
- - 优化: 扩大单词本发音点击响应区域(03-13)
- - 修复: 循环背单词次序混乱问题(03-13)
+ - 修复: 循环背单词次序停留在末尾的bug(03-16)
+ - 优化: 翻译结果的文字大小以及颜色(加深)(03-13)
- 修复: 导出单词失败的问题(03-03)
-Version 1.5.3
-
- - 重要: 增加谷歌翻译的支持(by LevineLiu 2017-02-23)
- - 重要: 单词本增加发音功能(by LostKe 2017-02-22)
- - 修复: 插耳机情况下仍使用扬声器发音问题(2017-02-22)
-
查看历史日志
From 795507c46bd88f94e40668c3bb9664c4b6509cd3 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Mon, 3 Apr 2017 00:07:18 +0800
Subject: [PATCH 32/86] fix:lost words explain for google
---
.../translate/mvp/model/entity/translate/GoogleResult.java | 3 +--
.../name/gudong/translate/ui/activitys/MainActivity.java | 6 +++---
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
index d0d92bd..8144387 100644
--- a/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
+++ b/app/src/main/java/name/gudong/translate/mvp/model/entity/translate/GoogleResult.java
@@ -1,7 +1,6 @@
package name.gudong.translate.mvp.model.entity.translate;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
import name.gudong.translate.mvp.model.type.ETranslateFrom;
@@ -43,7 +42,7 @@ public List wrapTranslation() {
@Override
public List wrapExplains() {
- return Collections.emptyList();
+ return getTranslation();
}
@Override
diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
index 192b16a..ea82b03 100644
--- a/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
+++ b/app/src/main/java/name/gudong/translate/ui/activitys/MainActivity.java
@@ -488,7 +488,6 @@ private void clearInputContent() {
@OnClick(R.id.iv_favorite)
public void onClickFavorite(final View view) {
- MobclickAgent.onEvent(getApplicationContext(), "favorite_main");
mPresenter.startFavoriteAnim(view, new BasePresenter.AnimationEndListener() {
@Override
public void onAnimationEnd(Animator animation) {
@@ -507,18 +506,18 @@ public void onAnimationEnd(Animator animation) {
}
}
});
+ MobclickAgent.onEvent(getApplicationContext(), "favorite_main");
}
@OnClick(R.id.iv_paste)
public void onClickPaste(View view) {
- MobclickAgent.onEvent(getApplicationContext(), "action_paste");
closeKeyboard();
Toast.makeText(MainActivity.this, "长按翻译结果可复制", Toast.LENGTH_SHORT).show();
+ MobclickAgent.onEvent(getApplicationContext(), "action_paste");
}
@OnClick(R.id.iv_sound)
public void onClickSound(View view) {
- MobclickAgent.onEvent(getApplicationContext(), "sound_main_activity");
Object obj = view.getTag();
if (obj != null && obj instanceof Result) {
Result entity = (Result) obj;
@@ -527,6 +526,7 @@ public void onClickSound(View view) {
mPresenter.playSound(fileName, mp3Url);
}
mPresenter.startSoundAnim(view);
+ MobclickAgent.onEvent(getApplicationContext(), "sound_main_activity");
}
@Override
From df2655e8f12cdeaddba82cd816e06845ababa42f Mon Sep 17 00:00:00 2001
From: Gudong
Date: Mon, 3 Apr 2017 00:22:27 +0800
Subject: [PATCH 33/86] fmt:only code change
---
.../listener/view/TipViewController.java | 61 ++++++++++---------
.../mvp/presenters/MainPresenter.java | 1 +
2 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/listener/view/TipViewController.java b/app/src/main/java/name/gudong/translate/listener/view/TipViewController.java
index f749529..b430523 100755
--- a/app/src/main/java/name/gudong/translate/listener/view/TipViewController.java
+++ b/app/src/main/java/name/gudong/translate/listener/view/TipViewController.java
@@ -49,13 +49,15 @@
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
-public class TipViewController{
+import static name.gudong.translate.mvp.presenters.MainPresenter.KEY_REQUEST_CODE_FOR_NOTI;
+
+public class TipViewController {
private WindowManager mWindowManager;
private Context mContext;
/**
* cache mul tip view
*/
- private MapmMapTipView = new WeakHashMap<>();
+ private Map mMapTipView = new WeakHashMap<>();
private Observable mHideTipTask;
@@ -67,7 +69,7 @@ public TipViewController(Context application) {
mRecitePreference = new ReciteModulePreference(mContext);
}
- public void showErrorInfo(String error,TipView.ITipViewListener mListener){
+ public void showErrorInfo(String error, TipView.ITipViewListener mListener) {
TipView tipView = new TipView(mContext);
tipView.setListener(mListener);
mWindowManager.addView(tipView, getPopViewParams());
@@ -78,7 +80,7 @@ public void showErrorInfo(String error,TipView.ITipViewListener mListener){
private void closeTipViewCountdown(final TipView tipView, TipView.ITipViewListener mListener) {
int duration = mRecitePreference.getDurationTimeWay().getDurationTime();
- Logger.t("recite").d(duration+"秒消失");
+ Logger.t("recite").d(duration + "秒消失");
mHideTipTask = Observable.timer(duration, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.map(new Func1() {
@Override
@@ -96,18 +98,18 @@ public void onCloseAnimEnd(Animator animation) {
mHideTipTask.subscribe();
}
- private void removeTipViewInner(TipView tipView){
- if(tipView.getParent() != null){
+ private void removeTipViewInner(TipView tipView) {
+ if (tipView.getParent() != null) {
mWindowManager.removeView(tipView);
}
}
- public void show(Result result,boolean isShowFavoriteButton,boolean isShowDoneMark,TipView.ITipViewListener mListener) {
+ public void show(Result result, boolean isShowFavoriteButton, boolean isShowDoneMark, TipView.ITipViewListener mListener) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
- boolean isSettingUseSystemNotification = sharedPreferences.getBoolean("preference_show_float_view_use_system",false);
- if(Utils.isSDKHigh5() && isSettingUseSystemNotification){
+ boolean isSettingUseSystemNotification = sharedPreferences.getBoolean("preference_show_float_view_use_system", false);
+ if (Utils.isSDKHigh5() && isSettingUseSystemNotification) {
StringBuilder sb = new StringBuilder();
- for(String string:result.getExplains()){
+ for (String string : result.getExplains()) {
sb.append(string).append("\n");
}
@@ -124,49 +126,48 @@ public void show(Result result,boolean isShowFavoriteButton,boolean isShowDoneMa
NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
// Moves events into the big view
- for (String string:result.getExplains()) {
+ for (String string : result.getExplains()) {
inboxStyle.addLine(string);
}
mBuilder.setStyle(inboxStyle);
Intent resultIntent = new Intent(mContext, MainActivity.class);
- resultIntent.putExtra("data",result);
+ resultIntent.putExtra("data", result);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
- mContext,
- 0,
- resultIntent,
- PendingIntent.FLAG_UPDATE_CURRENT
- );
-
+ mContext,
+ KEY_REQUEST_CODE_FOR_NOTI,
+ resultIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT
+ );
- mBuilder.addAction(R.drawable.ic_favorite_border_grey_24dp,"收藏",resultPendingIntent);
+ mBuilder.addAction(R.drawable.ic_favorite_border_grey_24dp, "收藏", resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
Notification note = mBuilder.build();
mNotificationManager.notify(result.getQuery().hashCode(), note);
- }else{
+ } else {
TipView tipView = new TipView(mContext);
- mMapTipView.put(result,tipView);
+ mMapTipView.put(result, tipView);
tipView.setListener(mListener);
mWindowManager.addView(tipView, getPopViewParams());
tipView.startWithAnim();
- tipView.setContent(result, isShowFavoriteButton,isShowDoneMark);
- closeTipViewCountdown(tipView,mListener);
+ tipView.setContent(result, isShowFavoriteButton, isShowDoneMark);
+ closeTipViewCountdown(tipView, mListener);
}
}
- public void setWithFavorite(Result result){
+ public void setWithFavorite(Result result) {
TipView tipView = mMapTipView.get(result);
- if(tipView != null){
+ if (tipView != null) {
tipView.setFavoriteBackground(R.drawable.ic_favorite_pink_24dp);
}
}
- public void setWithNotFavorite(Result result){
+ public void setWithNotFavorite(Result result) {
TipView tipView = mMapTipView.get(result);
- if(tipView != null){
+ if (tipView != null) {
tipView.setFavoriteBackground(R.drawable.ic_favorite_border_white_24dp);
}
}
@@ -196,13 +197,13 @@ private WindowManager.LayoutParams getPopViewParams() {
}
public void removeTipView(Result result) {
- if(result == null)return;
+ if (result == null) return;
TipView tipView = mMapTipView.get(result);
- if(tipView != null){
+ if (tipView != null) {
Logger.i("移除 tipView ");
removeTipViewInner(tipView);
}
- if(mHideTipTask != null){
+ if (mHideTipTask != null) {
Logger.i("移除 tipView 对应的 倒计时");
mHideTipTask.unsubscribeOn(AndroidSchedulers.mainThread());
}
diff --git a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
index 02eba8e..01afa39 100644
--- a/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
+++ b/app/src/main/java/name/gudong/translate/mvp/presenters/MainPresenter.java
@@ -70,6 +70,7 @@
*/
public class MainPresenter extends BasePresenter {
public static final String KEY_RESULT = "RESULT";
+ public static final int KEY_REQUEST_CODE_FOR_NOTI = 100;
@Inject
ClipboardManagerCompat mClipboardWatcher;
From 53c2711a6e5e277faafe2cc45ee02f676009dd20 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Mon, 3 Apr 2017 00:25:33 +0800
Subject: [PATCH 34/86] doc update changlelog
---
doc/Changelog.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/doc/Changelog.md b/doc/Changelog.md
index 046fc09..a9949f6 100644
--- a/doc/Changelog.md
+++ b/doc/Changelog.md
@@ -1,5 +1,14 @@
# Changelog
+## Version 1.6.0
+* 修复: 诸多奔溃异常问题(04-02)
+* 优化: 翻译失败增加当前翻译引擎提示(04-02)
+
+## V 1.5.5
+* 修复: 循环背单词次序停留在末尾的bug(03-16)
+* 优化: 翻译结果的文字大小以及颜色(加深)(03-13)
+* 修复: 导出单词失败的问题(03-03)
+
## V1.5.4
* 优化: 扩大单词本发音点击响应区域( 03-13)
* 修复: 循环背单词次序混乱问题(03-13)
From 0252cc8418e249fda99b007750c4f0cc713b86b4 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Wed, 5 Apr 2017 18:35:54 +0800
Subject: [PATCH 35/86] cfg:update version
---
build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.gradle b/build.gradle
index 50879c3..ff890de 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,8 +6,8 @@ ext {
minSdk : 16,
minSdk21 : 21,
targetSdk : 24,
- version_code : 154,
- version_name : "1.5.4"
+ version_code : 160,
+ version_name : "1.6.0"
]
libraries = [
From 9bfd19ac4462650c2dbdf04fb7fca0eb4d6a3ed6 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Wed, 5 Apr 2017 18:38:53 +0800
Subject: [PATCH 36/86] doc:update readme
---
README.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 339ff7c..f85edf8 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
-#咕咚翻译
+# 咕咚翻译

[](https://travis-ci.org/maoruibin/TranslateApp)
-##介绍
+## 介绍
一个实现『划词翻译』功能的 Android 应用 ,可能是目前 Android 市场上翻译效率最高的一款应用。

@@ -11,14 +11,14 @@
## 待完成功能
* 单词显示框支持沉浸式,覆盖状态栏显示。
* 使用 Github 做自动更新
-* 不支持谷歌翻译,如果有人有兴趣添加谷歌,必应翻译,欢迎PR。
+* ~~不支持谷歌翻译,如果有人有兴趣添加谷歌,必应翻译,欢迎PR。~~
* ~~单词发音~~
* ~~显示单词信息时增加音标~~
* ~~生词本为空时的提示信息~~
`Note:`想要参与贡献代码的同学,请在 develop 分支上操作,欢迎参与,可以提前在 issue 中交流自己要修改的功能模块,同时也欢迎来[Google+社区](https://plus.google.com/u/1/communities/111919086388322816251)一起讨论 咕咚翻译。
-##下载
+## 下载
@@ -28,7 +28,7 @@
如果想要帮助做内部测试,[欢迎来Google+社区](https://plus.google.com/u/1/communities/111919086388322816251)我会把最新的版本放在 Google+社区。
-##缘起
+## 缘起
自己经常在手机上会阅读一些英文的技术 blog 或者文档,经常会遇到陌生的单词,想必大家都有类似的经历,一般的,如果是上班期间,我可能会打开谷歌翻译,然后查词,但是当你不在电脑旁,就只能通过手机上的翻译软件来翻译生词,所以这时我们通常遇到生词会这样操作,长按生词、选择复制、点击 Home 键、找到翻译 App,有道翻译或者谷歌翻译之类的,然后长按输入框,选择粘贴,此时你才可以看到那个生词的意思。其实这是一个非常考验用户耐性的事,连续操作几次,不烦才怪呢。
我也是,自己以前在 Medium 上阅读文章时经常做这样的事,后来我想能不能简单点呢,所以就有了咕咚翻译这个 App,咕咚是我的网名呢~
@@ -71,7 +71,7 @@ Google+ [咕咚翻译社群](https://plus.google.com/u/1/communities/11191908638
[微博](http://weibo.com/u/1874136301)
-##License
+## License
Copyright (C) 2015 GuDong
From 8919e6c54f3d8ec6e4305c674db738686d8b389b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B6=9B?=
Date: Thu, 13 Apr 2017 13:52:38 +0800
Subject: [PATCH 37/86] Update ApiServiceModel.java
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
添加缓存逻辑,断网可重复查词
---
.../injection/modules/ApiServiceModel.java | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
index 42a5a14..b71567f 100644
--- a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
+++ b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
@@ -96,10 +96,30 @@ private S createService(ETranslateFrom type) {
@Provides
@Singleton
OkHttpClient provideOkHttpClient() {
+ Cache cache = new Cache(GDApplication.get().getCacheDir(), 10240 * 1024);
+
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (BuildConfig.DEBUG) {
builder.addNetworkInterceptor(new StethoInterceptor());
}
+ builder.addNetworkInterceptor(new CacheInterceptor())
+ .cache(cache)
+ .connectTimeout(20, TimeUnit.SECONDS)
+ .readTimeout(20, TimeUnit.SECONDS)
return builder.build();
}
+
+ private class CacheInterceptor implements Interceptor {
+ @Override
+ public Response intercept(Chain chain) throws IOException {
+ Request request = chain.request();
+ Response response = chain.proceed(request);
+ return response.newBuilder()
+ .removeHeader("Pragma")
+ .removeHeader("Cache-Control")
+ //cache for 30 days
+ .header("Cache-Control", "max-age=" + 3600 * 24 * 30)
+ .build();
+ }
+ }
}
From 059ca03af6eaa5060d1f7aa5cd323281955198b7 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Mon, 17 Apr 2017 09:32:08 +0800
Subject: [PATCH 38/86] add end char
---
.../translate/injection/modules/ApiServiceModel.java | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
index b71567f..00bb042 100644
--- a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
+++ b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
@@ -23,19 +23,27 @@
import com.facebook.stetho.okhttp3.StethoInterceptor;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import name.gudong.translate.BuildConfig;
+import name.gudong.translate.GDApplication;
import name.gudong.translate.mvp.model.ApiBaidu;
import name.gudong.translate.mvp.model.ApiGoogle;
import name.gudong.translate.mvp.model.ApiJinShan;
import name.gudong.translate.mvp.model.ApiYouDao;
import name.gudong.translate.mvp.model.SingleRequestService;
import name.gudong.translate.mvp.model.type.ETranslateFrom;
+import okhttp3.Cache;
import okhttp3.HttpUrl;
+import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
@@ -105,7 +113,7 @@ OkHttpClient provideOkHttpClient() {
builder.addNetworkInterceptor(new CacheInterceptor())
.cache(cache)
.connectTimeout(20, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.SECONDS)
+ .readTimeout(20, TimeUnit.SECONDS);
return builder.build();
}
From 5114165364139c9a81a4d3807f92007e806822b3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B6=9B?=
Date: Wed, 19 Apr 2017 16:50:17 +0800
Subject: [PATCH 39/86] Update ApiServiceModel.java
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
上次提交少个分号
---
.../gudong/translate/injection/modules/ApiServiceModel.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
index b71567f..6667f9f 100644
--- a/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
+++ b/app/src/main/java/name/gudong/translate/injection/modules/ApiServiceModel.java
@@ -105,7 +105,7 @@ OkHttpClient provideOkHttpClient() {
builder.addNetworkInterceptor(new CacheInterceptor())
.cache(cache)
.connectTimeout(20, TimeUnit.SECONDS)
- .readTimeout(20, TimeUnit.SECONDS)
+ .readTimeout(20, TimeUnit.SECONDS);
return builder.build();
}
From 7b671b1e3f529ece8d32e2beb842aec3084d994a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E6=B6=9B?=
Date: Wed, 19 Apr 2017 17:04:51 +0800
Subject: [PATCH 40/86] Update ListenClipboardService.java
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修复一个BUG
---
.../translate/listener/ListenClipboardService.java | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java b/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
index 1436195..19ccf96 100755
--- a/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
+++ b/app/src/main/java/name/gudong/translate/listener/ListenClipboardService.java
@@ -93,9 +93,15 @@ public void onReceive(Context context, Intent intent) {
registerReceiver(mScreenStatusReceive, screenStateFilter);
}
- private void unregisterScreenReceiver(){
- if(mScreenStatusReceive != null){
- unregisterReceiver(mScreenStatusReceive);
+ private void unregisterScreenReceiver() {
+ if (mScreenStatusReceive != null) {
+ try {
+ //反复开启背单词开关并关闭mainActivity,再快速打开mainActivity,打开背单词开关,再关闭mainActivity
+ //Service在onStart时,上一次的广播Receiver还没来得及注册,这一次就unRegister
+ //造成广播未注册就解注册,crash
+ unregisterReceiver(mScreenStatusReceive);
+ } catch (IllegalArgumentException e) {
+ }
}
}
@@ -279,4 +285,4 @@ public ListenClipboardService getService(){
return ListenClipboardService.this;
}
}
-}
\ No newline at end of file
+}
From 6e9eeea818bcecdccee61279029833e2e6029c27 Mon Sep 17 00:00:00 2001
From: Gudong
Date: Wed, 3 May 2017 18:29:22 +0800
Subject: [PATCH 41/86] update readme and doc
---
README.md | 15 +++++++++------
app/src/main/assets/about.html | 5 +++--
app/src/main/assets/changelog.html | 12 ++----------
app/src/main/assets/donate_ch.html | 3 ++-
build.gradle | 4 ++--
doc/Changelog.md | 5 +++++
6 files changed, 23 insertions(+), 21 deletions(-)
diff --git a/README.md b/README.md
index f85edf8..3bb9c37 100644
--- a/README.md
+++ b/README.md
@@ -9,12 +9,12 @@

## 待完成功能
-* 单词显示框支持沉浸式,覆盖状态栏显示。
-* 使用 Github 做自动更新
-* ~~不支持谷歌翻译,如果有人有兴趣添加谷歌,必应翻译,欢迎PR。~~
-* ~~单词发音~~
-* ~~显示单词信息时增加音标~~
-* ~~生词本为空时的提示信息~~
+- [ ] 单词显示框支持沉浸式,覆盖状态栏显示。
+- [ ] 使用 Github 做自动更新
+- [x] 不支持谷歌翻译,如果有人有兴趣添加谷歌,必应翻译,欢迎PR。
+- [x] 单词发音
+- [x] 显示单词信息时增加音标
+- [x] 生词本为空时的提示信息
`Note:`想要参与贡献代码的同学,请在 develop 分支上操作,欢迎参与,可以提前在 issue 中交流自己要修改的功能模块,同时也欢迎来[Google+社区](https://plus.google.com/u/1/communities/111919086388322816251)一起讨论 咕咚翻译。
@@ -61,6 +61,9 @@ Google+ [咕咚翻译社群](https://plus.google.com/u/1/communities/11191908638
## 更新日志
[日志列表](./doc/Changelog.md)
+## 捐赠
+[咕咚翻译捐赠](http://gudong.name/1990/03/01/list_pay.html)
+
## 关于作者
咕咚,爱折腾、爱新鲜,爱篮球。
diff --git a/app/src/main/assets/about.html b/app/src/main/assets/about.html
index a960080..a83f20b 100644
--- a/app/src/main/assets/about.html
+++ b/app/src/main/assets/about.html
@@ -71,8 +71,9 @@
如果你喜欢咕咚翻译,也许你还会喜欢我的其他作品。
- - AppPlus一个可以用于传送、提取APK文件等的工具软件。
- - GankDaily 干货客户端,用于查看每天的技术干货
+ - 易剪一个 Android 手机上的剪报助手。
+ - AppPlus一个可以用于传送、提取APK文件等的工具软件。
+ - GankDaily 干货客户端,用于查看每天的技术干货