From 75846179f2ab31b431e2ca1afc693054ca2886f7 Mon Sep 17 00:00:00 2001 From: Gudong Date: Sun, 12 Feb 2017 02:23:40 +0800 Subject: [PATCH 01/86] feat:improve word book and fix so many bug --- License.txt | 19 ++++ app/src/main/AndroidManifest.xml | 2 +- app/src/main/assets/changelog.html | 7 +- .../manager/ReciteModulePreference.java | 3 +- .../mvp/presenters/BookPresenter.java | 41 ++++++- .../mvp/presenters/MainPresenter.java | 68 +++++------ .../gudong/translate/mvp/views/IBookView.java | 2 +- .../translate/ui/NavigationManager.java | 15 ++- .../translate/ui/activitys/MainActivity.java | 14 ++- .../ui/activitys/SettingActivity.java | 10 +- .../ui/activitys/WordsBookActivity.java | 92 ++++++++++++--- .../ui/adapter/WordsListAdapter.java | 107 ++++++++++++++---- .../name/gudong/translate/util/SpUtils.java | 13 ++- .../widget/DividerItemDecoration.java | 64 +++++++++++ app/src/main/res/color/color_translate.xml | 2 +- .../res/drawable-hdpi/ic_info_black_24dp.png | Bin 321 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 233 -> 0 bytes .../res/drawable-hdpi/ic_sync_black_24dp.png | Bin 368 -> 0 bytes .../res/drawable-mdpi/ic_info_black_24dp.png | Bin 222 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 182 -> 0 bytes .../res/drawable-mdpi/ic_sync_black_24dp.png | Bin 250 -> 0 bytes .../res/drawable-xhdpi/ic_info_black_24dp.png | Bin 412 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 278 -> 0 bytes .../res/drawable-xhdpi/ic_sync_black_24dp.png | Bin 467 -> 0 bytes .../drawable-xxhdpi/ic_info_black_24dp.png | Bin 579 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 383 -> 0 bytes .../drawable-xxhdpi/ic_sync_black_24dp.png | Bin 669 -> 0 bytes .../drawable-xxxhdpi/ic_info_black_24dp.png | Bin 766 -> 0 bytes .../ic_notifications_black_24dp.png | Bin 497 -> 0 bytes .../drawable-xxxhdpi/ic_sync_black_24dp.png | Bin 875 -> 0 bytes .../res/drawable/ic_delete_black_24dp.xml | 9 ++ .../res/drawable/ic_more_vert_black_24dp.xml | 9 ++ .../ic_youtube_searched_for_black_24dp.xml | 9 ++ .../res/drawable/selector_action_search.xml | 2 +- .../main/res/drawable/selector_over_flow.xml | 5 + .../main/res/drawable/shape_circle_grey.xml | 5 + .../main/res/layout/activity_words_book.xml | 1 + app/src/main/res/layout/item_word_list.xml | 82 ++++++++------ app/src/main/res/layout/pop_view.xml | 3 +- app/src/main/res/menu/book.xml | 46 +++++--- app/src/main/res/menu/item_pop_menu.xml | 12 ++ app/src/main/res/menu/main.xml | 13 ++- app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/dimens.xml | 1 + app/src/main/res/xml/prefs.xml | 10 +- build.gradle | 4 +- doc/Changelog.md | 51 ++++++++- 47 files changed, 561 insertions(+), 163 deletions(-) create mode 100644 License.txt create mode 100644 app/src/main/java/name/gudong/translate/widget/DividerItemDecoration.java delete mode 100644 app/src/main/res/drawable-hdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable/ic_delete_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_more_vert_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_youtube_searched_for_black_24dp.xml create mode 100644 app/src/main/res/drawable/selector_over_flow.xml create mode 100644 app/src/main/res/drawable/shape_circle_grey.xml create mode 100644 app/src/main/res/menu/item_pop_menu.xml diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..0cc58a5 --- /dev/null +++ b/License.txt @@ -0,0 +1,19 @@ + +##License + + Copyright (C) 2015 GuDong + + This file is part of GdTranslate + + GdTranslate is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + GdTranslate is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GdTranslate. If not, see . diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6c5d543..05214a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -40,7 +40,7 @@ diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 7b6e6b2..aa599c1 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -48,20 +48,21 @@ 咕咚翻译 - 一个实现手机端『划词翻译』功能的 App,可能是目前 Android 市场上翻译效率最高的应用。

-

Version 1.3.6

+

Version 1.5.0

    +
  1. 重要: 大幅优化单词本的使用体验,提供单词导入导出等功能(2017-02-11)
  2. 优化: 为 6.0 设备增加悬浮窗权限申请,解决 MIUI 等部分设备需要手动开启权限的问题
  3. 新增: 单词数据备份、恢复(2017-02-05)
  4. 新增: 咕咚翻译可以背收藏的生词了,好词就应该死里记(10-01)
  5. -
  6. 新增: 咕咚翻译中可以看到每日一句了(10-07)
  7. -
  8. 新增: 适配 Android M 增加快捷查词(10-06)
  9. 新增: 支持手势滑动删除悬浮窗(10-03)
  10. 变更: 调换设置与单词本的位置(10-17)
  11. +
  12. 优化: 部分 UI 颜色等小细节调整(2017-02-11)
  13. 优化: 循环翻译顺序,锁屏停止循环(10-12)
  14. 优化: 添加点击按钮的动画(10-04)
  15. 优化: 循环显示背单词列表(10-04)
  16. 修复: Android N 发音奔溃问题(10-04)
  17. +
  18. 修复: 某些情况下,重复显示翻译结果的问题(2017-02-11)
  19. 修复: 增加悬浮窗点击事件(10-06)
  20. 优化: 首页 menu 中可以查看版本信息了(10-07)
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 57edfd5..6083856 100644 --- a/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java +++ b/app/src/main/java/name/gudong/translate/manager/ReciteModulePreference.java @@ -15,6 +15,7 @@ */ public class ReciteModulePreference extends TrayPreferences{ + 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"; @@ -34,7 +35,7 @@ public ReciteModulePreference(final Context context) { //是否开启背单词 public boolean isReciteOpenOrNot(){ - return getBoolean(KEY_RECITE_OPEN,true); + return getBoolean(KEY_RECITE_OPEN, DEFAULT_IS_RECITE); } public void setReciteOpenOrNot(boolean isRecite){ 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 c1ac0f7..17f9387 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 @@ -22,23 +22,28 @@ import android.content.ClipData; import android.content.Context; +import android.support.v7.app.AlertDialog; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.litesuits.orm.LiteOrm; import com.litesuits.orm.db.assit.QueryBuilder; import com.orhanobut.logger.Logger; +import com.umeng.analytics.MobclickAgent; import java.util.List; import java.util.concurrent.Callable; import javax.inject.Inject; +import jonathanfinerty.once.Once; import name.gudong.translate.listener.clipboard.ClipboardManagerCompat; import name.gudong.translate.mvp.model.SingleRequestService; import name.gudong.translate.mvp.model.WarpAipService; import name.gudong.translate.mvp.model.entity.translate.Result; import name.gudong.translate.mvp.views.IBookView; +import name.gudong.translate.ui.NavigationManager; +import name.gudong.translate.util.SpUtils; import rx.Observable; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; @@ -51,7 +56,8 @@ * Contact with gudong.name@gmail.com. */ public class BookPresenter extends BasePresenter { - + private static final String KEY_TIP_OF_RECITE_OPEN = "TIP_OF_RECITE_OPEN"; + private static final String KEY_RECITE_MODE_SWITCH = "RECITE_MODE_SWITCH"; @Inject public BookPresenter(LiteOrm liteOrm, WarpAipService apiService, SingleRequestService singleRequestService, Context context) { super(liteOrm, apiService, singleRequestService,context); @@ -64,7 +70,9 @@ public void getWords() { .subscribe(new Action1>() { @Override public void call(List transResultEntities) { - mView.fillData(transResultEntities); + boolean isReciteMode = SpUtils.isWordBookReciteMode(getContext()); + mView.fillData(transResultEntities, isReciteMode); + MobclickAgent.onEvent(getContext(),"wordsCount",transResultEntities.size()+""); } }); } @@ -141,4 +149,33 @@ public void restoreWordsByText(List oriList, String text) { mView.restoreSuccess(results.size()-hasExistCount); } } + + public void checkPointRecite(int wordsSize) { + //当单词数大于 5 个时才提示 + if (!Once.beenDone(KEY_TIP_OF_RECITE_OPEN) && wordsSize>=5) { + Once.markDone(KEY_TIP_OF_RECITE_OPEN); + new AlertDialog.Builder(getContext()) + .setTitle("提示") + .setMessage("检测到你的单词本中已经有不少单词了,建议你前往设置页面,开启定时单词提示,用于帮助你背单词。") + .setPositiveButton("去开启", ((dialog, which) -> { + NavigationManager.gotoSetting(getContext()); + })) + .setNegativeButton("没兴趣",null) + .show(); + } + } + + public void initStatus() { + Once.toDo(KEY_RECITE_MODE_SWITCH); + // 第一次点击单词本开关需要给用户一个功能提示框 + Once.toDo(KEY_TIP_OF_RECITE_OPEN); + } + + public boolean hasShowReciteModeIntroduce() { + return Once.beenDone(KEY_RECITE_MODE_SWITCH); + } + + public void makeReciteDone(){ + Once.markDone(KEY_RECITE_MODE_SWITCH); + } } 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 54ee723..03c1cb3 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 @@ -67,7 +67,7 @@ * Contact with gudong.name@gmail.com. */ public class MainPresenter extends BasePresenter { - private static final String KEY_RESULT = "RESULT"; + public static final String KEY_RESULT = "RESULT"; @Inject ClipboardManagerCompat mClipboardWatcher; @@ -78,17 +78,17 @@ public MainPresenter(LiteOrm liteOrm, WarpAipService apiService, SingleRequestSe super(liteOrm, apiService, singleRequestService, context); } - public void checkIntentFromClickTipView(Intent intent){ - if(hasExtraResult(intent)){ + public void checkIntentFromClickTipView(Intent intent) { + if (hasExtraResult(intent)) { Result result = (Result) intent.getSerializableExtra(KEY_RESULT); - if(result != null){ + if (result != null) { mView.onInitSearchText(result.getQuery()); - executeSearch(result.getQuery()); + //executeSearch(result.getQuery()); } } } - public boolean hasExtraResult(Intent intent){ + public boolean hasExtraResult(Intent intent) { return intent.hasExtra(KEY_RESULT); } @@ -104,7 +104,7 @@ public void checkClipboard() { Matcher m = r.matcher(text); if (m.matches()) { mView.onInitSearchText(text); - executeSearch(text); +// executeSearch(text); mView.closeKeyboard(); } } @@ -127,10 +127,10 @@ public void checkVersionAndShowChangeLog() { } } - public void trigDbUpdate(){ - Listresults = mLiteOrm.query(Result.class); - for (Result result:results) { - if(!result.isMake_done_once()){ + public void trigDbUpdate() { + List results = mLiteOrm.query(Result.class); + for (Result result : results) { + if (!result.isMake_done_once()) { result.setMake_done_once(false); mLiteOrm.update(result); } @@ -183,8 +183,8 @@ public List call(AbsResult absResult) { List temp = absResult.wrapExplains(); //增加音标显示 String phAm = absResult.getResult().getPhAm(); - if (!temp.isEmpty() && !TextUtils.isEmpty(phAm)){ - temp.add(0,"["+phAm+"]"); + if (!temp.isEmpty() && !TextUtils.isEmpty(phAm)) { + temp.add(0, "[" + phAm + "]"); return temp; } return absResult.wrapTranslation(); @@ -232,7 +232,7 @@ public void favoriteWord(Result result) { public void unFavoriteWord(Result result) { //,Result.COL_QUERY,new String[]{result.getQuery() - WhereBuilder builder = WhereBuilder.create(Result.class).andEquals(Result.COL_QUERY,result.getQuery()); + WhereBuilder builder = WhereBuilder.create(Result.class).andEquals(Result.COL_QUERY, result.getQuery()); mLiteOrm.delete(builder); } @@ -265,28 +265,28 @@ public Boolean call() throws Exception { return mFileManager.resetFileCache(getContext()); } }). - subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Action1() { - @Override - public void call(Boolean aBoolean) { - if(aBoolean){ - //Toast.makeText(getContext(), "清除缓存成功", Toast.LENGTH_SHORT).show(); - }else{ - //Toast.makeText(getContext(), "无缓存需要清除", Toast.LENGTH_SHORT).show(); - } - } - }); + subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(Boolean aBoolean) { + if (aBoolean) { + //Toast.makeText(getContext(), "清除缓存成功", Toast.LENGTH_SHORT).show(); + } else { + //Toast.makeText(getContext(), "无缓存需要清除", Toast.LENGTH_SHORT).show(); + } + } + }); } - public void dayline(){ + public void dayline() { mSingleRequestService.dayline("http://open.iciba.com/dsapi/") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1() { @Override public void call(JinshanDayLineEntity jinshanDayLineEntity) { - if(jinshanDayLineEntity != null){ + if (jinshanDayLineEntity != null) { mView.fillDayline(jinshanDayLineEntity); } } @@ -299,19 +299,19 @@ public void call(Throwable throwable) { }); } - public static void jumpMainActivityFromClickTipView(Context context,Result result){ + public static void jumpMainActivityFromClickTipView(Context context, Result result) { Intent intent = new Intent(context, MainActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK); - intent.putExtra(KEY_RESULT,result); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra(KEY_RESULT, result); context.startActivity(intent); } /** * 触发 Android M 上的浮窗权限 */ - public void triggerDrawOverlaysPermission(){ - if(Utils.isAndroidM()){ - if(!Settings.canDrawOverlays(getContext())) { + public void triggerDrawOverlaysPermission() { + if (Utils.isAndroidM()) { + if (!Settings.canDrawOverlays(getContext())) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); getContext().startActivity(intent); } diff --git a/app/src/main/java/name/gudong/translate/mvp/views/IBookView.java b/app/src/main/java/name/gudong/translate/mvp/views/IBookView.java index acc1aae..d40d05a 100644 --- a/app/src/main/java/name/gudong/translate/mvp/views/IBookView.java +++ b/app/src/main/java/name/gudong/translate/mvp/views/IBookView.java @@ -29,7 +29,7 @@ * Contact with gudong.name@gmail.com. */ public interface IBookView extends IBaseView { - void fillData(List transResultEntities); + void fillData(List transResultEntities, boolean isReciteMode ); void deleteWordSuccess(Result entity); diff --git a/app/src/main/java/name/gudong/translate/ui/NavigationManager.java b/app/src/main/java/name/gudong/translate/ui/NavigationManager.java index a6ff8b9..c3aa5e4 100644 --- a/app/src/main/java/name/gudong/translate/ui/NavigationManager.java +++ b/app/src/main/java/name/gudong/translate/ui/NavigationManager.java @@ -8,6 +8,9 @@ import java.util.List; +import name.gudong.translate.mvp.model.entity.translate.Result; +import name.gudong.translate.mvp.presenters.MainPresenter; +import name.gudong.translate.ui.activitys.MainActivity; import name.gudong.translate.ui.activitys.SettingActivity; /** @@ -15,19 +18,25 @@ * Contact with gudong.name@gmail.com. */ public class NavigationManager { - public static void gotoSendEmail(Context context){ + public static void gotoSendEmail(Context context) { Uri uri = Uri.parse("mailto:gudong.name@gmail.com"); final Intent intent = new Intent(Intent.ACTION_SENDTO, uri); PackageManager pm = context.getPackageManager(); List infos = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - if (infos == null || infos.size() <= 0){ + if (infos == null || infos.size() <= 0) { return; } context.startActivity(intent); } - public static void gotoSetting(Context context){ + public static void gotoSetting(Context context) { Intent intent = new Intent(context, SettingActivity.class); context.startActivity(intent); } + + public static void gotoMainActivity(Context context, Result entity) { + Intent intent = new Intent(context, MainActivity.class); + intent.putExtra(MainPresenter.KEY_RESULT, entity); + context.startActivity(intent); + } } 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 50e91ff..5661ff3 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 @@ -125,13 +125,17 @@ protected void onCreate(Bundle savedInstanceState) { checkTranslateWay(); checkVersion(); initConfig(); - setUpDayline(); + setUpDayline(false); checkIntent(); checkOverPermission(); } - private void setUpDayline() { + private void setUpDayline(boolean isOpenDayLine) { View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet_view); + if(!isOpenDayLine){ + bottomSheet.setVisibility(View.GONE); + return; + } //点击 和拖拽都可以打开bottom sheet bottomSheet.setOnClickListener(v -> onClickBottomSheet()); mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); @@ -595,6 +599,9 @@ private void initSpinner() { } public void onClickBottomSheet() { + if(mBottomSheetBehavior == null){ + return; + } if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { @@ -613,6 +620,9 @@ public void onClickInput(View view) { * @return */ private boolean checkBottomSheetIsExpandedAndReset() { + if(mBottomSheetBehavior == null){ + return false; + } if (mBottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) { mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); return true; diff --git a/app/src/main/java/name/gudong/translate/ui/activitys/SettingActivity.java b/app/src/main/java/name/gudong/translate/ui/activitys/SettingActivity.java index 67c3b0a..9c36ad5 100644 --- a/app/src/main/java/name/gudong/translate/ui/activitys/SettingActivity.java +++ b/app/src/main/java/name/gudong/translate/ui/activitys/SettingActivity.java @@ -100,18 +100,10 @@ private void initUseReciteOrNotStatus() { if (!Once.beenDone(KEY_TIP_OF_RECITE)) { new AlertDialog.Builder(getActivity()) .setTitle("新功能提示") - .setMessage("从 1.3.1 版本开始,咕咚翻译新增了定时提示生词的功能,。\n\n开启定时单词提醒后,系统会每隔五分钟(时间可以设置),随机弹出一个提示框,用于随机展示你收藏的生词,帮助你记住这些陌生单词。\n\n我相信再陌生的单词,如果可以不停的在你眼前出现,不一定那一次就记住了,当然这个功能是可以关闭的。\n\n灵感源于贝壳单词,感谢 @drakeet 同学的作品。") + .setMessage("从 1.5.0 版本开始,咕咚翻译新增了定时提示生词的功能,。\n\n开启定时单词提醒后,系统会每隔五分钟(时间可以设置),随机弹出一个提示框,用于随机展示你收藏的生词,帮助你记住这些陌生单词。\n\n我相信再陌生的单词,如果可以不停的在你眼前出现,不一定那一次就记住了,当然这个功能是可以关闭的。\n\n灵感源于贝壳单词,感谢 @drakeet 同学的作品。") .setCancelable(false) .setPositiveButton("知道了", ((dialog, which) -> { Once.markDone(KEY_TIP_OF_RECITE); - AppCompatActivity activity = (AppCompatActivity) getActivity(); - activity.findViewById(android.R.id.content).postDelayed(new Runnable() { - @Override - public void run() { - mUseReciteOrNot.setChecked(true); - } - },500); - })) .show().setCanceledOnTouchOutside(false); } 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 9e16b0a..77e8fcb 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 @@ -49,11 +49,16 @@ import name.gudong.translate.injection.modules.ActivityModule; import name.gudong.translate.mvp.model.entity.translate.Result; import name.gudong.translate.mvp.presenters.BookPresenter; +import name.gudong.translate.mvp.presenters.MainPresenter; import name.gudong.translate.mvp.views.IBookView; import name.gudong.translate.ui.adapter.WordsListAdapter; +import name.gudong.translate.util.SpUtils; import name.gudong.translate.util.Utils; +import name.gudong.translate.widget.DividerItemDecoration; -public class WordsBookActivity extends BaseActivity implements WordsListAdapter.OnClick, IBookView { +import static name.gudong.translate.util.SpUtils.isWordBookReciteMode; + +public class WordsBookActivity extends BaseActivity implements IBookView { @BindView(R.id.rv_words_list) RecyclerView mRvWordsList; @@ -80,6 +85,7 @@ protected void onCreate(Bundle savedInstanceState) { initActionBar(true, "单词本"); initListView(); initData(); + } @Override @@ -93,15 +99,39 @@ public boolean onCreateOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) { if (mAdapter.getItemCount() <= 0) { menu.findItem(R.id.menu_sort).setVisible(false); + menu.findItem(R.id.menu_recite_mode).setVisible(false); } else { menu.findItem(R.id.menu_sort).setVisible(true); + menu.findItem(R.id.menu_recite_mode).setVisible(true); } + menu.findItem(R.id.menu_recite_mode).setChecked(isWordBookReciteMode(this)); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.menu_recite_mode: + if (!mPresenter.hasShowReciteModeIntroduce()) { + mPresenter.makeReciteDone(); + new AlertDialog.Builder(this) + .setMessage("开启背单词模式后,单词本的单词列表将隐藏单词释义,点击才可以查看。") + .setPositiveButton("知道了", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mRvWordsList.postDelayed(new Runnable() { + @Override + public void run() { + switchReciteMode(item); + } + }, 300); + } + }) + .show(); + }else{ + switchReciteMode(item); + } + break; case R.id.menu_export: String exportText = mPresenter.getWordsJsonString(mAdapter.getData()); new AlertDialog.Builder(this) @@ -113,6 +143,7 @@ public void onClick(DialogInterface dialog, int which) { Utils.shareText(getBaseContext(), exportText); } }) + .setNegativeButton("取消", null) .setNeutralButton("复制", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -131,11 +162,11 @@ public void onClick(DialogInterface dialog, int which) { @Override public void onClick(DialogInterface dialog, int which) { String text = editText.getText().toString(); - if(TextUtils.isEmpty(text)){ + if (TextUtils.isEmpty(text)) { Toast.makeText(WordsBookActivity.this, "输入不能为空", Toast.LENGTH_SHORT).show(); return; } - if(!Utils.isJSONFormat(text)){ + if (!Utils.isJSONFormat(text)) { Toast.makeText(WordsBookActivity.this, "不是 JSON 格式,请检查。", Toast.LENGTH_SHORT).show(); return; } @@ -154,6 +185,10 @@ public int compare(Result lhs, Result rhs) { }); mAdapter.update(mResult); break; + case R.id.sort_default: + item.setChecked(true); + mPresenter.getWords(); + break; case R.id.sort_index_desc: item.setChecked(true); Collections.sort(mResult, new Comparator() { @@ -168,15 +203,46 @@ public int compare(Result lhs, Result rhs) { return super.onOptionsItemSelected(item); } + private void switchReciteMode(MenuItem item) { + item.setChecked(!item.isChecked()); + mAdapter.updateReciteMode(item.isChecked()); + SpUtils.setWordBookReciteMode(this, item.isChecked()); + } + private void initData() { + mPresenter.initStatus(); mPresenter.getWords(); } private void initListView() { mAdapter = new WordsListAdapter(this); - mAdapter.setOnClickListener(this); + mAdapter.setOnClickListener(new WordsListAdapter.IClickPopupMenuItem() { + @Override + public void onClickMenuItem(int itemId, Result entity) { + switch (itemId) { + case R.id.pop_delete: + new AlertDialog.Builder(WordsBookActivity.this) + .setMessage("确定要删除吗?") + .setPositiveButton("删除", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + mPresenter.deleteWords(entity); + } + }) + .setNegativeButton("取消", null) + .show(); + break; + case R.id.pop_research: + MainPresenter.jumpMainActivityFromClickTipView(WordsBookActivity.this,entity); + finish(); + break; + } + + } + }); LinearLayoutManager mLayoutManager = new LinearLayoutManager(this); mRvWordsList.setLayoutManager(mLayoutManager); + mRvWordsList.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST)); mRvWordsList.setAdapter(mAdapter); } @@ -189,22 +255,22 @@ protected void setupActivityComponent(AppComponent appComponent, ActivityModule .inject(this); } - @Override - public void onClickItem(View view, Result entity) { - mPresenter.deleteWords(entity); - } @Override - public void fillData(List transResultEntities) { + public void fillData(List transResultEntities, boolean isReciteMode) { + if (transResultEntities == null) { + return; + } //如果查出来的结果为空,那么提示用户没有收藏的单词 - if (transResultEntities == null || transResultEntities.size() == 0) { + if (transResultEntities.size() == 0) { emptyTipText.setVisibility(View.VISIBLE); } else { emptyTipText.setVisibility(View.GONE); - mAdapter.update(transResultEntities); + mAdapter.update(transResultEntities, isReciteMode); mResult = transResultEntities; - } + //提示开启背单词开关 + mPresenter.checkPointRecite(transResultEntities.size()); } @Override @@ -229,7 +295,7 @@ public void onError(Throwable error) { @Override public void restoreSuccess(int count) { mPresenter.getWords(); - showTip("成功恢复 "+count+ " 个单词。"); + showTip("成功恢复 " + count + " 个单词。"); } @Override 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 14dfdba..4b2cbee 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 @@ -21,16 +21,20 @@ package name.gudong.translate.ui.adapter; import android.content.Context; +import android.support.v7.view.menu.MenuPopupHelper; +import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; @@ -42,31 +46,39 @@ import rx.functions.Action0; import rx.functions.Action1; +import static name.gudong.translate.R.id.ll_pop_dst; + /** * Created by GuDong on 12/29/15 18:29. * Contact with gudong.name@gmail.com. */ public class WordsListAdapter extends RecyclerView.Adapter { private Context mContext; - private ListmList; + private List mList; - private OnClick mOnClickListener; + private IClickPopupMenuItem mOnClickListener; + private boolean isReciteMode = false; public WordsListAdapter(Context context) { mContext = context; mList = new ArrayList<>(); } - public void setOnClickListener(OnClick onClickListener) { + public void setOnClickListener(IClickPopupMenuItem onClickListener) { mOnClickListener = onClickListener; } public void update(List list) { - mList = list; + update(list, false); + } + + public void update(List list, boolean isReciteMode) { + this.mList = list; + this.isReciteMode = isReciteMode; notifyDataSetChanged(); } - public void removeItem(Result entity){ + public void removeItem(Result entity) { mList.remove(entity); notifyDataSetChanged(); } @@ -81,8 +93,8 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public void onBindViewHolder(ViewHolder holder, int position) { final Result entity = mList.get(position); holder.tvSrc.setText(entity.getQuery()); - if(!TextUtils.isEmpty(entity.getPhAm())){ - holder.tvPhonetic.setText("["+entity.getPhAm()+"]"); + if (!TextUtils.isEmpty(entity.getPhAm())) { + holder.tvPhonetic.setText("[" + entity.getPhAm() + "]"); } Observable.from(entity.getExplains()) .doOnSubscribe(new Action0() { @@ -94,20 +106,22 @@ public void call() { .subscribe(new Action1() { @Override public void call(String s) { - holder.llDst.addView(ViewUtil.getWordsView(mContext,s,R.color.gray_deep,false)); + holder.llDst.addView(ViewUtil.getWordsView(mContext, s, R.color.gray_deep, false)); } }); - holder.btAction.setText("删除"); - holder.btAction.setOnClickListener(v->{ - if(mOnClickListener!=null){ - mOnClickListener.onClickItem(v,entity); - } + + holder.ivMore.setOnClickListener(v -> { + showPopMenu(entity, v); }); + holder.llDst.setVisibility(isReciteMode ? View.GONE : View.VISIBLE); + holder.mRootView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - + if (!holder.llDst.isShown()) { + holder.llDst.setVisibility(View.VISIBLE); + } } }); } @@ -117,28 +131,73 @@ public int getItemCount() { return mList.size(); } - class ViewHolder extends RecyclerView.ViewHolder{ + /** + * @param isReciteMode 是不是背单词模式 + */ + public void updateReciteMode(boolean isReciteMode) { + this.isReciteMode = isReciteMode; + notifyDataSetChanged(); + } + + class ViewHolder extends RecyclerView.ViewHolder { private RelativeLayout mRootView; private TextView tvSrc; private TextView tvPhonetic; private LinearLayout llDst; - private Button btAction; + private ImageView ivMore; public ViewHolder(View itemView) { super(itemView); - mRootView = (RelativeLayout) itemView; - llDst = ButterKnife.findById(itemView,R.id.ll_pop_dst); - tvPhonetic = ButterKnife.findById(itemView,R.id.tv_pop_phonetic); - tvSrc = ButterKnife.findById(itemView,R.id.tv_pop_src); - btAction = ButterKnife.findById(itemView,R.id.bt_action); + mRootView = ButterKnife.findById(itemView, R.id.item_word_view); + 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); + ivMore = ButterKnife.findById(itemView, R.id.iv_over_flow); } } - public interface OnClick{ - void onClickItem(View view,Result entity); + public interface IClickPopupMenuItem { + void onClickMenuItem(int itemId, Result entity); } public List getData() { return mList; } + + + /** + * 显示弹出式菜单 + * + * @param entity + * @param ancho + */ + private void showPopMenu(final Result entity, View ancho) { + PopupMenu popupMenu = new PopupMenu(mContext, ancho); + popupMenu.getMenuInflater().inflate(R.menu.item_pop_menu, popupMenu.getMenu()); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + if (mOnClickListener != null) { + mOnClickListener.onClickMenuItem(item.getItemId(), entity); + } + return false; + } + }); + + makePopForceShowIcon(popupMenu); + popupMenu.show(); + } + + //使用反射让popupMenu 显示菜单icon + private void makePopForceShowIcon(PopupMenu popupMenu) { + try { + Field mFieldPopup = popupMenu.getClass().getDeclaredField("mPopup"); + mFieldPopup.setAccessible(true); + MenuPopupHelper mPopup = (MenuPopupHelper) mFieldPopup.get(popupMenu); + mPopup.setForceShowIcon(true); + } catch (Exception e) { + + } + } + } 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 d5fcbfe..7960946 100644 --- a/app/src/main/java/name/gudong/translate/util/SpUtils.java +++ b/app/src/main/java/name/gudong/translate/util/SpUtils.java @@ -44,6 +44,7 @@ public static String getUrlByLocalSetting(){ } private static final String KEY_TRANSLATE_FROM = "TRANSLATE_FROM"; + private static final String KEY_WORDBOOK_RECITE_MODE = "WORDBOOK_RECITE_MODE"; //every tip's interval time public static final String KEY_INTERVAL_TIP_TIME = "INTERVAL_TIP_TIME"; @@ -87,9 +88,8 @@ public static boolean isShowIconInNotification(Context context){ return getBooleanPreference(context,KEY_PREFERENCE_SHOW_ICON_IN_NOTIFICATION,false); } - public static boolean isNotifyDayline(Context context){ - return getBooleanPreference(context,KEY_PREFERENCE_NOTIFY_DAYLINE,true); + return getBooleanPreference(context,KEY_PREFERENCE_NOTIFY_DAYLINE,false); } public static boolean isAutoPasteWords(Context context){ @@ -118,6 +118,15 @@ public static boolean hasGrantDrawOverlays(Context context){ return getBooleanPreference(context, KEY_DRAW_OVERLAYS_PERMISSION,false); } + + public static void setWordBookReciteMode(Context context,boolean isReciteMode){ + putBooleanPreference(context,KEY_WORDBOOK_RECITE_MODE,isReciteMode); + } + + public static boolean isWordBookReciteMode(Context context){ + return getBooleanPreference(context,KEY_WORDBOOK_RECITE_MODE,false); + } + ////////////////////////////////////////////////////////////////////////////////////////////////////// // ------------------- SharePreference Util Begin ------------------- // diff --git a/app/src/main/java/name/gudong/translate/widget/DividerItemDecoration.java b/app/src/main/java/name/gudong/translate/widget/DividerItemDecoration.java new file mode 100644 index 0000000..6bb7900 --- /dev/null +++ b/app/src/main/java/name/gudong/translate/widget/DividerItemDecoration.java @@ -0,0 +1,64 @@ +package name.gudong.translate.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +public class DividerItemDecoration extends RecyclerView.ItemDecoration { + private static final int[]ATTRS = new int[]{android.R.attr.listDivider}; + public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; + public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + private Drawable mDivider; + private int mOrientation; + + public DividerItemDecoration(Context context, int orientation) { + final TypedArray array = context.obtainStyledAttributes(ATTRS); + mDivider = array.getDrawable(0); + array.recycle(); +// mDivider = ContextCompat.getDrawable(context, R.drawable.item_divider_black); + setOrientation(orientation); + } + + private void setOrientation(int orientation) { + if(orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST){ + throw new IllegalArgumentException("invalid orientation"); + } + mOrientation = orientation; + } + + @Override + public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { + super.onDraw(c, parent, state); + if(mOrientation == VERTICAL_LIST){ + drawVertical(c, parent); + } + } + + private void drawVertical(Canvas c, RecyclerView parent){ + final int left = parent.getPaddingLeft(); + final int right = parent.getWidth()-parent.getPaddingRight(); + + int childCount = parent.getChildCount(); + for(int i = 0;i - + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_info_black_24dp.png deleted file mode 100644 index da56077636546c97764fd2686daad67d7b529f59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)H-qjnO!mZF74z`KYHotZQj~G9OBG_t^ED_kIXRP z8;w~~Qsa5P=BYWdU__EBJMKte9gdtxYdq4khJueW&Pc>cvi{6361huX>Wn1p1Yv6= zaRmWW!dHC7;kXjM_MA66Bsd3vLxS6)G3IUxb&OD!2oiZTy*WyW7pRP32C|k0wldT1B8Lp22U5qkP61PXEvTZ6d>a8@UZ?1 zA+c-66fgaBRuc>lIKkqWwEBhLN~4B^=^YF1?lx0w{jkHlvNhq4U%kY(4%UYj${gxU zt{#`?C=^ypw+}YdKA#S3~g6)IW)n6udaq z+)GOiED3ODRoiN{EBVotiHBXj>?{2uy>wZi)V_=1zmDyj)K|Gw_IHc)r4T`te0NDl hwI^3XQhFp;iAM+Z&9%(1ZU(xY!PC{xWt~$(698`;Th;&o diff --git a/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png deleted file mode 100644 index a5ebdbd072989517b8c6230f65f7064d7c2ac017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmV-$0gwKPP)Bnh6NK+0$5`HOv#KS=tYj%F$hmx(`HEa6MGCz zVd+xXR3C*q>XmoYu)EvRqLNoKN9vrWebtl-5=snnhoS^g9uF~&xlN*)H`W{wZ;U+{TXN|u|AX!W%Mvu1 zCO7Tl*uo`~E>@u<#XBj|^}>ul|6C>19PJEUR$ER;nAhbpt#9Vs*Ef&3bU%Gs$9S4s WW8+=f3r;`>GkCiCxvXjCCUMHOLgs0@uOIM+hc=c_OeCtYY$lmfH>|_qY(a5Lp zBC`?BMt+0`nYqvz>4i$B5_%&SVO?^iM%c@|3GYT~gU&Mf*o80860LBx0>q!>QEKKS zbPhJ=;$MP1X$|6brX|#l&bsLVpmeTu&enbW0-8ozYX{n?_5c6?07*qoM6N<$f=D}Y AIRF3v diff --git a/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png deleted file mode 100644 index 46ed12a89bd7303d12a00edee53504903c9fdaf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 412 zcmV;N0b~A&P)k7>D5($61se024W16Y9PdLry5vdn5qWG7(8}rf#0;i^i3`Bz)3@LmB1SV3Ir;F zXA1R55y$7>4m@$40i?z@(7tAuhqf9h{9DK(kS9VPYq@pj?P({$*j*$70e+edaK1ul_2NP&A~Pg39!*_#v? zkeRk$7|4Mf$N?t@T-x(e!eI;N(w!F)7P$0*|EtF)>xk}V7O04Biy9mEOaUnp*K{AN cD9HYhcl4RW{G`P`$^ZZW07*qoM6N<$f+&V{8UO$Q diff --git a/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png deleted file mode 100644 index 860a5db38b393009a7407ced8d9fec8da0b460e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAKBP)Y8m235b4thfjq5s2xGL-&my=8Y}rO#iqNL_sAt7# zbGQi8aPN&dD}Q(UKmQ-YoO`)AM%MLWT`$)4VqGuR^3-I(3JalY4Vwc%W0i@p9B?ix{5h)DbUhjrRWQ zC$I66YjjKu6StQJ zPo5IU6w&jpC@59DAecvdaf&5rK~PjglW}m0Jwp-{q$)-COd;&Jrcaw1Qk^1WgA`Ad ziaHZcwhG9|xiJ$cDFbG#IB*wVAB%B4*7aD|V_lDRJ&d?8{sN$?X^Ds6w;2Ec002ov JPDHLkV1g1j%<2FD diff --git a/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png deleted file mode 100644 index a81eeb9ee7ef8ab1662b5b6bc88cf74912e4cb5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)f+P)YDX|Txx7F9T)MSz5C z%me$p#<(@Ec}8Mx!WA`)S?3W+u@6bG_Q+CN{iWZ6iFpgn8im7?Un+GeL)QF6AA4ghWDNXmU%KBG@?RmKM)K1 zMojBSqWw=2twt=5)`ISdVGXesBvgrXZ8hkU2o;{K22Jn?b%0n667~qyLM-o&5Jdv( zL4TP?X$x_%4U`&Af{svXIte;OspBN5jZz=6{@DvXl!i`%1}Ftig2q!9G`&wY{XgoC zlb|+AO(#JoC^eh}9ip`9BT! zt3hvwp=B+|Cze%9K`*Qj(>Y>cXT-L|$au~Wj|A$*gSJWNv(cQ7Bv#Y(JK#w*j9P*Yqa=F};`Uf%+Z6V(b RSUCUy002ovPDHLkV1jt6`k4R# diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index ab8a9c464c6c30f54a49d18e1d48b3b8637a9295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)z9Eb5|s``^)CE_}yje)z64pu{@M5;_j>;{9|U?dVTN(BQGf?Y^x(n#9o)!|G% zjU4BEPu~u|&vOG0CJAFqk!rUBLt&b8T-X^?co*)3o#I&$*V6)CRU<=Ncojs30vigA zQsRV0WT?S0E94odF?RXD{n0zygPU6B6&Ist78!sYI=Gm%sgSV)+&|kVLp5B2*2%~c zokT+|3ZOU68!lmw`W^j}en-C~ z-w`ZncLYl=0<4vB2$j%)(JeuRaXJ-b_M%dt*X16+J datt|R%rC40J4*F-*<%0z002ovPDHLkV1n31phf@y diff --git a/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index f7990080d1d7d7e30b1844c18be8928128af147c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmV;O0%HA%P)Ri)#A+rN#ZV}M#KrnQ=uoUdx&}e)B(84V)X*Zhb`j|=Sg}(VanQLY z)jde5NeBw@b}N@>BJX?O$-+X_Zyy1Q~JX9W8v!)}~bi|sDSkn<}I$}*ntm%j~ z9kHe(+;B;meM-zT*nOQ~j#(ySLPw>+CRr0gDs@&#*-{ct8MUTVV>WrE=cE~@z!sG@ zN-c^>D`}?Kp%s)$S}DjF2Y0^GOt&A`B27f)iji)gA9<>X$_XjF_`tB|ftCv>t>D2c zYFva=>dYif^r{>pGMfkzQt3Vx5tVf!(nkXct#m(!=r=AyBtEK=GClZ^L+_;}B5|xL zzT(TSYC9qVSwtm|FVm{+mI0huPzAs6=LzSkaSmrbtML+Xu&o+5aOQ^^e@7hXZ@z~! zzt#9_;$T8Gp5aVQjlU!g`c-2UXKvN_Q{tdkHD2S)4f-04gC6v4WI#|=enhvb-FnQ!32goiP%3qR|00000NkvXXu0mjf DBY7@j diff --git a/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png deleted file mode 100644 index c8f86b925366485cef1f43c089f785ab8415068d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmVDuaOF?qdkw!ZaV?`>xjy6gVLBv5If;S){v5mCXA=Y@H1rfw?2k|s36`TsO zNHkbQ$!A*+5eLd!$4>T2_S$>D#r=D(;16rBEP_R$P$(1%^^m2=ItNs!^UUj8&(x`~ z&l*LtbfZ#|309~g2Axu3oCHcl$g<57(qs*`7$HKSIw(*>Ty)MH?F1shPyB;e=#~ZI z_$<#QVzCQy_@bx0J~enA3k6_=)wfSbaFejbp3yC+S{ z_7DY?X;B_gQjQiRTt1lJbNASe)3hHEH3Nk2X;KG&s~Yf`BuyzGss;$NVD1ZQ>IR$< z!B`eiH$cc>Y+L1kO$;S@QaRv}I7TKArHx@^1yR}(MyiO?PB74eD6Y%=3f0*#j*5ul z=5e%+D6WK~14MDVII194dQYr$jH9~h0XH~$Rz0ABqgT}fUjFw3KEM%D{t z0UH<_Q90l{j72zCH=xQV%rU2Kzzj`k=T_B#ItiMzplU#Yrp38XGoVI{7UU2mP12$= zqM+YsSs!;u!2L@vF65Db%i+>05@0{$T9iX1pnj(f3sO{(06L`;O9r??eD0Do77h74 z;V-_%vH{L~JUnSU(9NMwpKd1}iL!=x+!AegYKnUge|2;CAWhk$H%~9V$#H>L?3_t_ z7Uu^(BNnPtAVwgP%(}c>tIUufP!Te0^4P-PR2zKDCzOaY#u9%b231&Olo%?d7-pUl wyBu>vgO|4&+;Gee%M{4ag*Bm2C=?3)2UQ-CT`xs~ZvX%Q07*qoM6N<$g2UHD;{X5v diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index 86f89d75000ada881e4c14891ceec47c27c7fb0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVtWS;T; zaYBz`tPu^nL@|bq0naE#)fn)NVnp*CkjTQsfCVzQ#5%jgl8xP!>8N(0U!w=NC1j@$!jz5g diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index b9f56f327d6346a39fa6f69d8827ff0be7a4337d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z-;8{;uuoF_;%J_Z=H0J_W3g( z>AlH{ab;?9Jg@dus zS3Fj^r{zaz$Fn8&d}%W(?;Egx`}y_xAGvkbzxP>-ufMV)F!@|n?Z&wHHP^*oe?5wo z*(xr#vgi7N3?sowUJv(kS~`R% zow7(}bPUo|SvZet(WVAxsUOmwD<|~i{SA0Jjcv|H-KHfW9;dh#88sV!vHwuMW4TLc z?n;3NEp{$XwQCG|SA2Qc5^DNw7L%QZ&`RIc7LN4~*FWgi-TG35eT$OT-5-m@12Ywk z4`)4*|DpUKDpy*`xI61f|BsaL+}Y~JzxMp#wVN4q``d{#ol-yL=JTw|J)YuLzqh8z z|JK!Q+(w^QxJ~=ux%t*NhqQlz%FH!E0k`L!Jj4B~TyB2LueVLV?H8)me44mVe)oTY z?GGoLeV0%ADLma@Wb+3-&*@0 zm+`E+S*O?kbK^c8_wV_OIqO#k&$L$k;39r3-p+pV|bchu(99KY6clnh~I|v&r15vZHo?-24CqcCN)9K3XN}A}1OT zxve=QtUaZ}y=d`*_!BEbW-dFCt&-2h$|v|pc%!R+qu7c0hwMJNt-G1p<#;P|S;Lb+ z#T4F?6J#_FaD2ZeYGtu$oq&;BN;IQX6N%zUvB3!n~xic v+kD7bYbW*k>&7^F?8L|D{cgQd|C!2ftO$D&n7s#>i5NUx{an^LB{Ts5h>e~y diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete_black_24dp.xml new file mode 100644 index 0000000..39e64d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_more_vert_black_24dp.xml b/app/src/main/res/drawable/ic_more_vert_black_24dp.xml new file mode 100644 index 0000000..5176d8a --- /dev/null +++ b/app/src/main/res/drawable/ic_more_vert_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_youtube_searched_for_black_24dp.xml b/app/src/main/res/drawable/ic_youtube_searched_for_black_24dp.xml new file mode 100644 index 0000000..ff5b0b0 --- /dev/null +++ b/app/src/main/res/drawable/ic_youtube_searched_for_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/selector_action_search.xml b/app/src/main/res/drawable/selector_action_search.xml index 0641234..b11e1bb 100644 --- a/app/src/main/res/drawable/selector_action_search.xml +++ b/app/src/main/res/drawable/selector_action_search.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_over_flow.xml b/app/src/main/res/drawable/selector_over_flow.xml new file mode 100644 index 0000000..0916868 --- /dev/null +++ b/app/src/main/res/drawable/selector_over_flow.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_circle_grey.xml b/app/src/main/res/drawable/shape_circle_grey.xml new file mode 100644 index 0000000..cb4d9cb --- /dev/null +++ b/app/src/main/res/drawable/shape_circle_grey.xml @@ -0,0 +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 f74f1b3..2536885 100644 --- a/app/src/main/res/layout/activity_words_book.xml +++ b/app/src/main/res/layout/activity_words_book.xml @@ -22,6 +22,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/white" tools:context="name.gudong.translate.ui.activitys.WordsBookActivity"> + android:animateLayoutChanges="true" + android:paddingTop="@dimen/md_content_padding_top" + android:paddingBottom="@dimen/md_content_padding_top" + android:paddingLeft="16dp" + android:background="?attr/selectableItemBackground"> - -