diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 78b45be..1bcda71 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -19,8 +19,8 @@ diff --git a/README.md b/README.md index bf5521f..2df33d3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ 风月读书,一款开源、无广告的小说阅读软件。 -成品下载(v1.9.2 支持自定义书源):[https://fycz.lanzous.com/iMpIkmcv9dc](https://fycz.lanzous.com/iMpIkmcv9dc) +成品下载(v1.9.3 支持自定义书源):[https://fycz.lanzous.com/ivyijmwfdqd](https://fycz.lanzous.com/ivyijmwfdqd) [更新日志](./app/src/main/assets/updatelog.fy) @@ -27,15 +27,16 @@ #### 二、关于发现界面 -* 软件内置的两个发现源: - * 某点的排行榜、分类,全本小说网 +* 软件内置的4个发现源: + * 某点的排行榜、分类,全本小说网、100本·实体、妙笔阁 * 制作发现源方法与书源类似,在此不再赘述 ![Image](./img/1.png)![Image](./img/2.png) ![Image](./img/3.png)![Image](./img/4.png) -![Image](./img/10.png)![Image](./img/5.png) -![Image](./img/6.png)![Image](./img/7.png) -![Image](./img/8.png)![Image](./img/9.png) +![Image](./img/5.png)![Image](./img/6.png) +![Image](./img/7.png)![Image](./img/8.png) +![Image](./img/9.png)![Image](./img/10.png) +![Image](./img/11.png)![Image](./img/12.png) ## LICENSE ``` diff --git a/app/src/main/assets/updatelog.fy b/app/src/main/assets/updatelog.fy index 063760b..2b8005a 100644 --- a/app/src/main/assets/updatelog.fy +++ b/app/src/main/assets/updatelog.fy @@ -1,3 +1,12 @@ +2021.03.13 +风月读书v1.9.3 +更新内容: +1、由于服务器到期,暂时关闭登录\注册入口,开放时间请等待后续更新通知; +如需云同步书架及软件设置,请使用WebDav,可在WebDav设置界面点击右上角问号查看WebDav教程; +2、[我的]增加WebDav设置入口,[我的-同步书架]改为从WebDav同步 +3、修复已知bug +4、书源支持备份\恢复 + 2021.03.02 风月读书v1.9.2 更新内容: diff --git a/app/src/main/java/xyz/fycz/myreader/common/APPCONST.java b/app/src/main/java/xyz/fycz/myreader/common/APPCONST.java index e2bd97e..8fc7436 100644 --- a/app/src/main/java/xyz/fycz/myreader/common/APPCONST.java +++ b/app/src/main/java/xyz/fycz/myreader/common/APPCONST.java @@ -46,6 +46,7 @@ public class APPCONST { public static final String SOURCE_INDEX = "sourceIndex"; public static final String FONT = "font"; public static final String BOOK_SOURCE = "bookSource"; + public static final String WEB_DAV = "WebDav"; public static final String RESULT_NEED_REFRESH = "result_need_refresh"; public static final String RESULT_IS_COLLECTED = "result_is_collected"; public static final String RESULT_LAST_READ_POSITION = "result_last_read_position"; diff --git a/app/src/main/java/xyz/fycz/myreader/model/storage/Backup.kt b/app/src/main/java/xyz/fycz/myreader/model/storage/Backup.kt index 10edb04..8839d8f 100644 --- a/app/src/main/java/xyz/fycz/myreader/model/storage/Backup.kt +++ b/app/src/main/java/xyz/fycz/myreader/model/storage/Backup.kt @@ -40,6 +40,7 @@ object Backup { "setting.json", "readStyles.json", "replaceRule.json", + "bookSource.json", "config.xml" ) } @@ -94,7 +95,13 @@ object Backup { .writeText(json) } } - + GreenDaoManager.getInstance().session.bookSourceDao.queryBuilder().list().let { + if (it.isNotEmpty()) { + val json = GSON.toJson(it) + FileUtils.getFile(backupPath + File.separator + "bookSource.json") + .writeText(json) + } + } try { val setting = SysManager.getNewSetting() val readStyles = setting.readStyles diff --git a/app/src/main/java/xyz/fycz/myreader/model/storage/Restore.kt b/app/src/main/java/xyz/fycz/myreader/model/storage/Restore.kt index d0f0cb4..3f9eea9 100644 --- a/app/src/main/java/xyz/fycz/myreader/model/storage/Restore.kt +++ b/app/src/main/java/xyz/fycz/myreader/model/storage/Restore.kt @@ -14,6 +14,7 @@ import xyz.fycz.myreader.entity.ReadStyle import xyz.fycz.myreader.entity.Setting import xyz.fycz.myreader.greendao.GreenDaoManager import xyz.fycz.myreader.greendao.entity.* +import xyz.fycz.myreader.greendao.entity.rule.BookSource import xyz.fycz.myreader.util.SharedPreUtils import xyz.fycz.myreader.util.utils.* import java.io.File @@ -100,6 +101,15 @@ object Restore { } catch (e: Exception) { e.printStackTrace() } + try { + val file = FileUtils.getFile(path + File.separator + "bookSource.json") + val json = file.readText() + GSON.fromJsonArray(json)?.let { + GreenDaoManager.getInstance().session.bookSourceDao.insertOrReplaceInTx(it) + } + } catch (e: Exception) { + e.printStackTrace() + } try { val settingFile = FileUtils.getFile(path + File.separator + "setting.json") val settingJson = settingFile.readText() diff --git a/app/src/main/java/xyz/fycz/myreader/ui/activity/MoreSettingActivity.java b/app/src/main/java/xyz/fycz/myreader/ui/activity/MoreSettingActivity.java index 86b5b18..23e6b1f 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/activity/MoreSettingActivity.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/activity/MoreSettingActivity.java @@ -88,6 +88,8 @@ public class MoreSettingActivity extends BaseActivity { private PrivateBooksFragment mPrivateBooksFragment; private BaseFragment curFragment; + // 是否前往webdav设置 + private boolean isWebDav; @Override protected void bindView() { @@ -113,6 +115,7 @@ public class MoreSettingActivity extends BaseActivity { noMenuTitle = mSetting.isNoMenuChTitle(); readAloudVolumeTurnPage = mSetting.isReadAloudVolumeTurnPage(); threadNum = SharedPreUtils.getInstance().getInt(getString(R.string.threadNum), 8); + isWebDav = getIntent().getBooleanExtra(APPCONST.WEB_DAV, false); } @Override @@ -151,6 +154,13 @@ public class MoreSettingActivity extends BaseActivity { binding.tvThreadNum.setText(getString(R.string.cur_thread_num, threadNum)); } + @Override + protected void processLogic() { + if(isWebDav){ + binding.llWebdav.performClick(); + } + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.webdav_help, menu); @@ -503,7 +513,7 @@ public class MoreSettingActivity extends BaseActivity { @Override public void finish() { - if (curFragment == null) { + if (curFragment == null || isWebDav) { Intent result = new Intent(); result.putExtra(APPCONST.RESULT_NEED_REFRESH, needRefresh); result.putExtra(APPCONST.RESULT_UP_MENU, upMenu); diff --git a/app/src/main/java/xyz/fycz/myreader/ui/activity/SplashActivity.java b/app/src/main/java/xyz/fycz/myreader/ui/activity/SplashActivity.java index 973e156..2acbe2a 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/activity/SplashActivity.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/activity/SplashActivity.java @@ -161,7 +161,7 @@ public class SplashActivity extends BaseActivity { } fos.flush(); Log.d("SplashActivity", "downLoadImage success!"); - } catch (IOException e) { + } catch (Exception e) { File data = getFileStreamPath(APPCONST.FILE_NAME_SPLASH_IMAGE); if (data != null && data.exists()){ data.delete(); diff --git a/app/src/main/java/xyz/fycz/myreader/ui/fragment/LocalSourceFragment.java b/app/src/main/java/xyz/fycz/myreader/ui/fragment/LocalSourceFragment.java index 7d0c648..db6c73f 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/fragment/LocalSourceFragment.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/fragment/LocalSourceFragment.java @@ -17,6 +17,7 @@ import xyz.fycz.myreader.R; import xyz.fycz.myreader.base.BaseFragment; import xyz.fycz.myreader.base.observer.MySingleObserver; import xyz.fycz.myreader.databinding.FragmentLocalSourceBinding; +import xyz.fycz.myreader.greendao.GreenDaoManager; import xyz.fycz.myreader.greendao.entity.rule.BookSource; import xyz.fycz.myreader.model.source.BookSourceManager; import xyz.fycz.myreader.ui.activity.BookSourceActivity; @@ -104,13 +105,14 @@ public class LocalSourceFragment extends BaseFragment { for (BookSource source : sources) { source.setEnable(isEnable); } - BookSourceManager.saveDatas(sources) + Single.create((SingleOnSubscribe) emitter -> { + GreenDaoManager.getDaoSession().getBookSourceDao().insertOrReplaceInTx(sources); + emitter.onSuccess(true); + }).compose(RxUtils::toSimpleSingle) .subscribe(new MySingleObserver() { @Override - public void onSuccess(@androidx.annotation.NonNull Boolean aBoolean) { - if (aBoolean) { - mAdapter.notifyDataSetChanged(); - } + public void onSuccess(@NonNull Boolean aBoolean) { + mAdapter.notifyDataSetChanged(); } }); } diff --git a/app/src/main/java/xyz/fycz/myreader/ui/fragment/MineFragment.java b/app/src/main/java/xyz/fycz/myreader/ui/fragment/MineFragment.java index 54ab123..3ce8175 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/fragment/MineFragment.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/fragment/MineFragment.java @@ -5,6 +5,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -19,10 +20,15 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import io.reactivex.Single; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import xyz.fycz.myreader.R; import xyz.fycz.myreader.application.App; import xyz.fycz.myreader.application.SysManager; import xyz.fycz.myreader.base.BaseFragment; +import xyz.fycz.myreader.base.observer.MySingleObserver; import xyz.fycz.myreader.common.APPCONST; import xyz.fycz.myreader.databinding.FragmentMineBinding; import xyz.fycz.myreader.entity.Setting; @@ -32,7 +38,9 @@ import xyz.fycz.myreader.greendao.service.BookService; import xyz.fycz.myreader.model.source.BookSourceManager; import xyz.fycz.myreader.model.backup.UserService; import xyz.fycz.myreader.model.storage.Backup; +import xyz.fycz.myreader.model.storage.BackupRestoreUi; import xyz.fycz.myreader.model.storage.Restore; +import xyz.fycz.myreader.model.storage.WebDavHelp; import xyz.fycz.myreader.ui.activity.AboutActivity; import xyz.fycz.myreader.ui.activity.BookSourceActivity; import xyz.fycz.myreader.ui.activity.FeedbackActivity; @@ -56,7 +64,7 @@ public class MineFragment extends BaseFragment { private FragmentMineBinding binding; - private boolean isLogin; + //private boolean isLogin; private Setting mSetting; private String[] webSynMenu; private String[] backupMenu; @@ -69,7 +77,7 @@ public class MineFragment extends BaseFragment { public void handleMessage(@NonNull Message msg) { switch (msg.what) { case 1: - binding.tvUser.setText("登录/注册"); + //binding.tvUser.setText("登录/注册"); break; case 2: backup(); @@ -93,7 +101,7 @@ public class MineFragment extends BaseFragment { @Override protected void initData(Bundle savedInstanceState) { super.initData(savedInstanceState); - isLogin = UserService.isLogin(); + //isLogin = UserService.isLogin(); mSetting = SysManager.getSetting(); webSynMenu = new String[]{ App.getmContext().getString(R.string.menu_backup_webBackup), @@ -111,16 +119,16 @@ public class MineFragment extends BaseFragment { @Override protected void initWidget(Bundle savedInstanceState) { super.initWidget(savedInstanceState); - if (isLogin) { + /*if (isLogin) { binding.tvUser.setText(UserService.readUsername()); - } + }*/ binding.tvThemeModeSelect.setText(themeModeArr[themeMode]); } @Override protected void initClick() { super.initClick(); - binding.mineRlUser.setOnClickListener(v -> { + /*binding.mineRlUser.setOnClickListener(v -> { if (isLogin) { DialogCreator.createCommonDialog(getActivity(), "退出登录", "确定要退出登录吗?" , true, (dialog, which) -> { @@ -139,8 +147,36 @@ public class MineFragment extends BaseFragment { Intent intent = new Intent(getActivity(), LoginActivity.class); getActivity().startActivityForResult(intent, APPCONST.REQUEST_LOGIN); } + });*/ + + binding.mineRlWebdav.setOnClickListener(v -> { + Intent intent = new Intent(getActivity(), MoreSettingActivity.class); + intent.putExtra(APPCONST.WEB_DAV, true); + startActivity(intent); }); + binding.mineRlSyn.setOnClickListener(v -> { + String account = SharedPreUtils.getInstance().getString("webdavAccount"); + String password = SharedPreUtils.getInstance().getString("webdavPassword"); + if (TextUtils.isEmpty(account) || TextUtils.isEmpty(password)){ + ToastUtils.showWarring("请先配置WebDav账户"); + binding.mineRlWebdav.performClick(); + return; + } + Single.create((SingleOnSubscribe>) emitter -> { + ToastUtils.showInfo("正在连接WebDav服务器..."); + emitter.onSuccess(WebDavHelp.INSTANCE.getWebDavFileNames()); + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new MySingleObserver>() { + @Override + public void onSuccess(ArrayList strings) { + if (!WebDavHelp.INSTANCE.showRestoreDialog(getContext(), strings, BackupRestoreUi.INSTANCE)) { + ToastUtils.showWarring("WebDav服务端没有备份或WebDav配置错误"); + } + } + }); + }); binding.mineRlBookSource.setOnClickListener(v -> { startActivity(new Intent(getContext(), BookSourceActivity.class)); }); @@ -163,7 +199,7 @@ public class MineFragment extends BaseFragment { .create(); bookDialog.show(); }); - binding.mineRlSyn.setOnClickListener(v -> { + /*binding.mineRlSyn.setOnClickListener(v -> { if (!UserService.isLogin()) { ToastUtils.showWarring("请先登录!"); Intent loginIntent = new Intent(getActivity(), LoginActivity.class); @@ -202,7 +238,7 @@ public class MineFragment extends BaseFragment { .setNegativeButton(null, null) .setPositiveButton(null, null) .show(); - }); + });*/ binding.mineRlSetting.setOnClickListener(v -> { Intent settingIntent = new Intent(getActivity(), MoreSettingActivity.class); startActivity(settingIntent); @@ -423,13 +459,13 @@ public class MineFragment extends BaseFragment { public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { - case APPCONST.REQUEST_LOGIN: + /*case APPCONST.REQUEST_LOGIN: assert data != null; isLogin = data.getBooleanExtra("isLogin", false); if (isLogin) { binding.tvUser.setText(UserService.readUsername()); } - break; + break;*/ } } } diff --git a/app/src/main/java/xyz/fycz/myreader/ui/fragment/WebDavFragment.java b/app/src/main/java/xyz/fycz/myreader/ui/fragment/WebDavFragment.java index 1f6ca43..917d7c3 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/fragment/WebDavFragment.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/fragment/WebDavFragment.java @@ -114,7 +114,7 @@ public class WebDavFragment extends BaseFragment { @Override public void onSuccess(ArrayList strings) { if (!WebDavHelp.INSTANCE.showRestoreDialog(getContext(), strings, BackupRestoreUi.INSTANCE)) { - ToastUtils.showWarring("没有备份"); + ToastUtils.showWarring("WebDav服务端没有备份或WebDav配置错误"); } } }); diff --git a/app/src/main/java/xyz/fycz/myreader/ui/presenter/BookcasePresenter.java b/app/src/main/java/xyz/fycz/myreader/ui/presenter/BookcasePresenter.java index e3fd3ab..6b58f01 100644 --- a/app/src/main/java/xyz/fycz/myreader/ui/presenter/BookcasePresenter.java +++ b/app/src/main/java/xyz/fycz/myreader/ui/presenter/BookcasePresenter.java @@ -185,9 +185,9 @@ public class BookcasePresenter implements BasePresenter { getData(); - if (mSetting.isAutoSyn() && UserService.isLogin()) { + /*if (mSetting.isAutoSyn() && UserService.isLogin()) { synBookcaseToWeb(true); - } + }*/ //是否启用下拉刷新(默认启用) if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { diff --git a/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java b/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java index 53061ff..019bc5d 100644 --- a/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java +++ b/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java @@ -1534,12 +1534,14 @@ public abstract class PageLoader { @Override public void onSuccess(TxtChapter txtChapter) { - mPreChapter = txtChapter; + if (txtChapter.getPosition() == mCurChapterPos - 1) + mPreChapter = txtChapter; } @Override public void onError(Throwable e) { //无视错误 + mPreChapter = null; } }); } @@ -1569,12 +1571,14 @@ public abstract class PageLoader { @Override public void onSuccess(TxtChapter txtChapter) { - mNextChapter = txtChapter; + if (txtChapter.getPosition() == mCurChapterPos + 1) + mNextChapter = txtChapter; } @Override public void onError(Throwable e) { //无视错误 + mNextChapter = null; } }); } diff --git a/app/src/main/res/drawable/ic_yun.xml b/app/src/main/res/drawable/ic_yun.xml new file mode 100644 index 0000000..1e19ec6 --- /dev/null +++ b/app/src/main/res/drawable/ic_yun.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml index ffc23ad..b7790b4 100644 --- a/app/src/main/res/layout/fragment_mine.xml +++ b/app/src/main/res/layout/fragment_mine.xml @@ -1,20 +1,19 @@ - + + android:id="@+id/ll_mine" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> - + --> + + + + + android:id="@+id/mine_rl_webdav" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + + + android:id="@+id/tv_webdav" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="18dp" + android:layout_toEndOf="@id/iv_webdav" + android:text="@string/webdav_setting" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> + + + + + + + + + + + + + + @@ -79,19 +153,19 @@ android:id="@+id/mine_rl_book_source" android:layout_width="match_parent" android:layout_height="60dp" + android:background="@drawable/selector_common_bg" android:paddingLeft="20dp" - android:paddingRight="20dp" - android:background="@drawable/selector_common_bg"> + android:paddingRight="20dp"> + app:tint="@color/textPrimary" /> + + android:textSize="@dimen/text_normal_size" /> + + android:id="@+id/mine_rl_backup" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + android:id="@+id/iv_backup" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:src="@drawable/ic_backup" + app:tint="@color/textPrimary" /> + + android:id="@+id/tv_backup" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="15dp" + android:layout_toEndOf="@id/iv_backup" + android:text="@string/menu_bookcase_backup" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> - - - - - + android:layout_width="match_parent" + android:layout_height="25dp" + android:paddingLeft="5dp" + android:paddingRight="5dp"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerInParent="true" + android:text="设置" + android:textColor="@color/textPrimary" /> + + android:id="@+id/mine_rl_setting" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + android:id="@+id/iv_setting" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:src="@drawable/ic_settings" + app:tint="@color/textPrimary" /> + + android:id="@+id/tv_setting" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="15dp" + android:layout_toEndOf="@id/iv_setting" + android:text="@string/menu_settings" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> + + android:id="@+id/mine_rl_theme_mode" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + android:id="@+id/iv_theme_mode" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:src="@drawable/ic_theme" + app:tint="@color/textPrimary" /> + + android:id="@+id/tv_theme_mode" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="15dp" + android:layout_toEndOf="@id/iv_theme_mode" + android:text="@string/theme_mode" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> + + android:id="@+id/tv_theme_mode_select" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:background="@drawable/theme_mode_bak" + android:text="夜间模式" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> + + android:layout_width="match_parent" + android:layout_height="25dp" + android:paddingLeft="5dp" + android:paddingRight="5dp"> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerInParent="true" + android:text="其他" + android:textColor="@color/textPrimary" /> + + android:id="@+id/mine_rl_feedback" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + android:id="@+id/iv_feedback" + android:layout_width="18dp" + android:layout_height="18dp" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:layout_marginStart="3dp" + android:src="@drawable/ic_feedback" + app:tint="@color/textPrimary" /> + + android:id="@+id/tv_feedback" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="18dp" + android:layout_toEndOf="@id/iv_feedback" + android:text="@string/mine_feedback" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> + + android:id="@+id/mine_rl_about" + android:layout_width="match_parent" + android:layout_height="60dp" + android:background="@drawable/selector_common_bg" + android:paddingLeft="20dp" + android:paddingRight="20dp"> + android:id="@+id/iv_about" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:src="@drawable/ic_about" + app:tint="@color/textPrimary" /> + + android:id="@+id/tv_about" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="15dp" + android:layout_toEndOf="@id/iv_about" + android:text="@string/menu_bookcase_about" + android:textColor="@color/textSecondary" + android:textSize="@dimen/text_normal_size" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a68f9ac..d8a03aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,6 +180,7 @@ WebDav 密码 从WebDav恢复 WebDav设置 + WebDav WebDav备份与恢复 添加书签 拷贝内容 diff --git a/app/version_code.properties b/app/version_code.properties index 67cb482..53ba11d 100644 --- a/app/version_code.properties +++ b/app/version_code.properties @@ -1,2 +1,2 @@ -#Tue Mar 02 08:12:15 CST 2021 -VERSION_CODE=192 +#Sat Mar 13 21:51:35 CST 2021 +VERSION_CODE=193 diff --git a/img/1.png b/img/1.png index 4bb07bd..4da3b64 100644 Binary files a/img/1.png and b/img/1.png differ diff --git a/img/10.png b/img/10.png index e098a19..09af7a9 100644 Binary files a/img/10.png and b/img/10.png differ diff --git a/img/11.png b/img/11.png new file mode 100644 index 0000000..c2f5fb8 Binary files /dev/null and b/img/11.png differ diff --git a/img/12.png b/img/12.png new file mode 100644 index 0000000..564feb9 Binary files /dev/null and b/img/12.png differ diff --git a/img/2.png b/img/2.png index 6840c77..9ed57ee 100644 Binary files a/img/2.png and b/img/2.png differ diff --git a/img/3.png b/img/3.png index 228462a..892da65 100644 Binary files a/img/3.png and b/img/3.png differ diff --git a/img/4.png b/img/4.png index e94c278..1e3840b 100644 Binary files a/img/4.png and b/img/4.png differ diff --git a/img/5.png b/img/5.png index 044b4a6..3121e08 100644 Binary files a/img/5.png and b/img/5.png differ diff --git a/img/6.png b/img/6.png index 2e2ab34..3b7a55e 100644 Binary files a/img/6.png and b/img/6.png differ diff --git a/img/7.png b/img/7.png index 97c73ec..d58f006 100644 Binary files a/img/7.png and b/img/7.png differ diff --git a/img/8.png b/img/8.png index 43990ca..caf14d5 100644 Binary files a/img/8.png and b/img/8.png differ diff --git a/img/9.png b/img/9.png index 76ac0c5..09b6653 100644 Binary files a/img/9.png and b/img/9.png differ