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本·实体、妙笔阁
* 制作发现源方法与书源类似,在此不再赘述


-
-
-
+
+
+
+
## 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