pull/5/head v1.9.3
fengyuecanzhu 4 years ago
parent 92cfe5dc49
commit c8c36c1de4
  1. 4
      .idea/assetWizardSettings.xml
  2. 13
      README.md
  3. 9
      app/src/main/assets/updatelog.fy
  4. 1
      app/src/main/java/xyz/fycz/myreader/common/APPCONST.java
  5. 9
      app/src/main/java/xyz/fycz/myreader/model/storage/Backup.kt
  6. 10
      app/src/main/java/xyz/fycz/myreader/model/storage/Restore.kt
  7. 12
      app/src/main/java/xyz/fycz/myreader/ui/activity/MoreSettingActivity.java
  8. 2
      app/src/main/java/xyz/fycz/myreader/ui/activity/SplashActivity.java
  9. 10
      app/src/main/java/xyz/fycz/myreader/ui/fragment/LocalSourceFragment.java
  10. 56
      app/src/main/java/xyz/fycz/myreader/ui/fragment/MineFragment.java
  11. 2
      app/src/main/java/xyz/fycz/myreader/ui/fragment/WebDavFragment.java
  12. 4
      app/src/main/java/xyz/fycz/myreader/ui/presenter/BookcasePresenter.java
  13. 4
      app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java
  14. 9
      app/src/main/res/drawable/ic_yun.xml
  15. 221
      app/src/main/res/layout/fragment_mine.xml
  16. 1
      app/src/main/res/values/strings.xml
  17. 4
      app/version_code.properties
  18. BIN
      img/1.png
  19. BIN
      img/10.png
  20. BIN
      img/11.png
  21. BIN
      img/12.png
  22. BIN
      img/2.png
  23. BIN
      img/3.png
  24. BIN
      img/4.png
  25. BIN
      img/5.png
  26. BIN
      img/6.png
  27. BIN
      img/7.png
  28. BIN
      img/8.png
  29. BIN
      img/9.png

@ -19,8 +19,8 @@
<option name="values"> <option name="values">
<map> <map>
<entry key="assetSourceType" value="FILE" /> <entry key="assetSourceType" value="FILE" />
<entry key="outputName" value="ic_debug" /> <entry key="outputName" value="ic_yun" />
<entry key="sourceFile" value="F:\SVG图标\debug.svg" /> <entry key="sourceFile" value="F:\SVG图标\.svg" />
</map> </map>
</option> </option>
</PersistentState> </PersistentState>

@ -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) [更新日志](./app/src/main/assets/updatelog.fy)
@ -27,15 +27,16 @@
#### 二、关于发现界面 #### 二、关于发现界面
* 软件内置的个发现源: * 软件内置的4个发现源:
* 某点的排行榜、分类,全本小说网 * 某点的排行榜、分类,全本小说网、100本·实体、妙笔阁
* 制作发现源方法与书源类似,在此不再赘述 * 制作发现源方法与书源类似,在此不再赘述
![Image](./img/1.png)![Image](./img/2.png) ![Image](./img/1.png)![Image](./img/2.png)
![Image](./img/3.png)![Image](./img/4.png) ![Image](./img/3.png)![Image](./img/4.png)
![Image](./img/10.png)![Image](./img/5.png) ![Image](./img/5.png)![Image](./img/6.png)
![Image](./img/6.png)![Image](./img/7.png) ![Image](./img/7.png)![Image](./img/8.png)
![Image](./img/8.png)![Image](./img/9.png) ![Image](./img/9.png)![Image](./img/10.png)
![Image](./img/11.png)![Image](./img/12.png)
## LICENSE ## LICENSE
``` ```

@ -1,3 +1,12 @@
2021.03.13
风月读书v1.9.3
更新内容:
1、由于服务器到期,暂时关闭登录\注册入口,开放时间请等待后续更新通知;
如需云同步书架及软件设置,请使用WebDav,可在WebDav设置界面点击右上角问号查看WebDav教程;
2、[我的]增加WebDav设置入口,[我的-同步书架]改为从WebDav同步
3、修复已知bug
4、书源支持备份\恢复
2021.03.02 2021.03.02
风月读书v1.9.2 风月读书v1.9.2
更新内容: 更新内容:

@ -46,6 +46,7 @@ public class APPCONST {
public static final String SOURCE_INDEX = "sourceIndex"; public static final String SOURCE_INDEX = "sourceIndex";
public static final String FONT = "font"; public static final String FONT = "font";
public static final String BOOK_SOURCE = "bookSource"; 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_NEED_REFRESH = "result_need_refresh";
public static final String RESULT_IS_COLLECTED = "result_is_collected"; public static final String RESULT_IS_COLLECTED = "result_is_collected";
public static final String RESULT_LAST_READ_POSITION = "result_last_read_position"; public static final String RESULT_LAST_READ_POSITION = "result_last_read_position";

@ -40,6 +40,7 @@ object Backup {
"setting.json", "setting.json",
"readStyles.json", "readStyles.json",
"replaceRule.json", "replaceRule.json",
"bookSource.json",
"config.xml" "config.xml"
) )
} }
@ -94,7 +95,13 @@ object Backup {
.writeText(json) .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 { try {
val setting = SysManager.getNewSetting() val setting = SysManager.getNewSetting()
val readStyles = setting.readStyles val readStyles = setting.readStyles

@ -14,6 +14,7 @@ import xyz.fycz.myreader.entity.ReadStyle
import xyz.fycz.myreader.entity.Setting import xyz.fycz.myreader.entity.Setting
import xyz.fycz.myreader.greendao.GreenDaoManager import xyz.fycz.myreader.greendao.GreenDaoManager
import xyz.fycz.myreader.greendao.entity.* 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.SharedPreUtils
import xyz.fycz.myreader.util.utils.* import xyz.fycz.myreader.util.utils.*
import java.io.File import java.io.File
@ -100,6 +101,15 @@ object Restore {
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
try {
val file = FileUtils.getFile(path + File.separator + "bookSource.json")
val json = file.readText()
GSON.fromJsonArray<BookSource>(json)?.let {
GreenDaoManager.getInstance().session.bookSourceDao.insertOrReplaceInTx(it)
}
} catch (e: Exception) {
e.printStackTrace()
}
try { try {
val settingFile = FileUtils.getFile(path + File.separator + "setting.json") val settingFile = FileUtils.getFile(path + File.separator + "setting.json")
val settingJson = settingFile.readText() val settingJson = settingFile.readText()

@ -88,6 +88,8 @@ public class MoreSettingActivity extends BaseActivity {
private PrivateBooksFragment mPrivateBooksFragment; private PrivateBooksFragment mPrivateBooksFragment;
private BaseFragment curFragment; private BaseFragment curFragment;
// 是否前往webdav设置
private boolean isWebDav;
@Override @Override
protected void bindView() { protected void bindView() {
@ -113,6 +115,7 @@ public class MoreSettingActivity extends BaseActivity {
noMenuTitle = mSetting.isNoMenuChTitle(); noMenuTitle = mSetting.isNoMenuChTitle();
readAloudVolumeTurnPage = mSetting.isReadAloudVolumeTurnPage(); readAloudVolumeTurnPage = mSetting.isReadAloudVolumeTurnPage();
threadNum = SharedPreUtils.getInstance().getInt(getString(R.string.threadNum), 8); threadNum = SharedPreUtils.getInstance().getInt(getString(R.string.threadNum), 8);
isWebDav = getIntent().getBooleanExtra(APPCONST.WEB_DAV, false);
} }
@Override @Override
@ -151,6 +154,13 @@ public class MoreSettingActivity extends BaseActivity {
binding.tvThreadNum.setText(getString(R.string.cur_thread_num, threadNum)); binding.tvThreadNum.setText(getString(R.string.cur_thread_num, threadNum));
} }
@Override
protected void processLogic() {
if(isWebDav){
binding.llWebdav.performClick();
}
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.webdav_help, menu); getMenuInflater().inflate(R.menu.webdav_help, menu);
@ -503,7 +513,7 @@ public class MoreSettingActivity extends BaseActivity {
@Override @Override
public void finish() { public void finish() {
if (curFragment == null) { if (curFragment == null || isWebDav) {
Intent result = new Intent(); Intent result = new Intent();
result.putExtra(APPCONST.RESULT_NEED_REFRESH, needRefresh); result.putExtra(APPCONST.RESULT_NEED_REFRESH, needRefresh);
result.putExtra(APPCONST.RESULT_UP_MENU, upMenu); result.putExtra(APPCONST.RESULT_UP_MENU, upMenu);

@ -161,7 +161,7 @@ public class SplashActivity extends BaseActivity {
} }
fos.flush(); fos.flush();
Log.d("SplashActivity", "downLoadImage success!"); Log.d("SplashActivity", "downLoadImage success!");
} catch (IOException e) { } catch (Exception e) {
File data = getFileStreamPath(APPCONST.FILE_NAME_SPLASH_IMAGE); File data = getFileStreamPath(APPCONST.FILE_NAME_SPLASH_IMAGE);
if (data != null && data.exists()){ if (data != null && data.exists()){
data.delete(); data.delete();

@ -17,6 +17,7 @@ import xyz.fycz.myreader.R;
import xyz.fycz.myreader.base.BaseFragment; import xyz.fycz.myreader.base.BaseFragment;
import xyz.fycz.myreader.base.observer.MySingleObserver; import xyz.fycz.myreader.base.observer.MySingleObserver;
import xyz.fycz.myreader.databinding.FragmentLocalSourceBinding; import xyz.fycz.myreader.databinding.FragmentLocalSourceBinding;
import xyz.fycz.myreader.greendao.GreenDaoManager;
import xyz.fycz.myreader.greendao.entity.rule.BookSource; import xyz.fycz.myreader.greendao.entity.rule.BookSource;
import xyz.fycz.myreader.model.source.BookSourceManager; import xyz.fycz.myreader.model.source.BookSourceManager;
import xyz.fycz.myreader.ui.activity.BookSourceActivity; import xyz.fycz.myreader.ui.activity.BookSourceActivity;
@ -104,14 +105,15 @@ public class LocalSourceFragment extends BaseFragment {
for (BookSource source : sources) { for (BookSource source : sources) {
source.setEnable(isEnable); source.setEnable(isEnable);
} }
BookSourceManager.saveDatas(sources) Single.create((SingleOnSubscribe<Boolean>) emitter -> {
GreenDaoManager.getDaoSession().getBookSourceDao().insertOrReplaceInTx(sources);
emitter.onSuccess(true);
}).compose(RxUtils::toSimpleSingle)
.subscribe(new MySingleObserver<Boolean>() { .subscribe(new MySingleObserver<Boolean>() {
@Override @Override
public void onSuccess(@androidx.annotation.NonNull Boolean aBoolean) { public void onSuccess(@NonNull Boolean aBoolean) {
if (aBoolean) {
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
} }
}
}); });
} }
} }

@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -19,10 +20,15 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; 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.R;
import xyz.fycz.myreader.application.App; import xyz.fycz.myreader.application.App;
import xyz.fycz.myreader.application.SysManager; import xyz.fycz.myreader.application.SysManager;
import xyz.fycz.myreader.base.BaseFragment; import xyz.fycz.myreader.base.BaseFragment;
import xyz.fycz.myreader.base.observer.MySingleObserver;
import xyz.fycz.myreader.common.APPCONST; import xyz.fycz.myreader.common.APPCONST;
import xyz.fycz.myreader.databinding.FragmentMineBinding; import xyz.fycz.myreader.databinding.FragmentMineBinding;
import xyz.fycz.myreader.entity.Setting; 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.source.BookSourceManager;
import xyz.fycz.myreader.model.backup.UserService; import xyz.fycz.myreader.model.backup.UserService;
import xyz.fycz.myreader.model.storage.Backup; 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.Restore;
import xyz.fycz.myreader.model.storage.WebDavHelp;
import xyz.fycz.myreader.ui.activity.AboutActivity; import xyz.fycz.myreader.ui.activity.AboutActivity;
import xyz.fycz.myreader.ui.activity.BookSourceActivity; import xyz.fycz.myreader.ui.activity.BookSourceActivity;
import xyz.fycz.myreader.ui.activity.FeedbackActivity; import xyz.fycz.myreader.ui.activity.FeedbackActivity;
@ -56,7 +64,7 @@ public class MineFragment extends BaseFragment {
private FragmentMineBinding binding; private FragmentMineBinding binding;
private boolean isLogin; //private boolean isLogin;
private Setting mSetting; private Setting mSetting;
private String[] webSynMenu; private String[] webSynMenu;
private String[] backupMenu; private String[] backupMenu;
@ -69,7 +77,7 @@ public class MineFragment extends BaseFragment {
public void handleMessage(@NonNull Message msg) { public void handleMessage(@NonNull Message msg) {
switch (msg.what) { switch (msg.what) {
case 1: case 1:
binding.tvUser.setText("登录/注册"); //binding.tvUser.setText("登录/注册");
break; break;
case 2: case 2:
backup(); backup();
@ -93,7 +101,7 @@ public class MineFragment extends BaseFragment {
@Override @Override
protected void initData(Bundle savedInstanceState) { protected void initData(Bundle savedInstanceState) {
super.initData(savedInstanceState); super.initData(savedInstanceState);
isLogin = UserService.isLogin(); //isLogin = UserService.isLogin();
mSetting = SysManager.getSetting(); mSetting = SysManager.getSetting();
webSynMenu = new String[]{ webSynMenu = new String[]{
App.getmContext().getString(R.string.menu_backup_webBackup), App.getmContext().getString(R.string.menu_backup_webBackup),
@ -111,16 +119,16 @@ public class MineFragment extends BaseFragment {
@Override @Override
protected void initWidget(Bundle savedInstanceState) { protected void initWidget(Bundle savedInstanceState) {
super.initWidget(savedInstanceState); super.initWidget(savedInstanceState);
if (isLogin) { /*if (isLogin) {
binding.tvUser.setText(UserService.readUsername()); binding.tvUser.setText(UserService.readUsername());
} }*/
binding.tvThemeModeSelect.setText(themeModeArr[themeMode]); binding.tvThemeModeSelect.setText(themeModeArr[themeMode]);
} }
@Override @Override
protected void initClick() { protected void initClick() {
super.initClick(); super.initClick();
binding.mineRlUser.setOnClickListener(v -> { /*binding.mineRlUser.setOnClickListener(v -> {
if (isLogin) { if (isLogin) {
DialogCreator.createCommonDialog(getActivity(), "退出登录", "确定要退出登录吗?" DialogCreator.createCommonDialog(getActivity(), "退出登录", "确定要退出登录吗?"
, true, (dialog, which) -> { , true, (dialog, which) -> {
@ -139,8 +147,36 @@ public class MineFragment extends BaseFragment {
Intent intent = new Intent(getActivity(), LoginActivity.class); Intent intent = new Intent(getActivity(), LoginActivity.class);
getActivity().startActivityForResult(intent, APPCONST.REQUEST_LOGIN); 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<ArrayList<String>>) emitter -> {
ToastUtils.showInfo("正在连接WebDav服务器...");
emitter.onSuccess(WebDavHelp.INSTANCE.getWebDavFileNames());
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new MySingleObserver<ArrayList<String>>() {
@Override
public void onSuccess(ArrayList<String> strings) {
if (!WebDavHelp.INSTANCE.showRestoreDialog(getContext(), strings, BackupRestoreUi.INSTANCE)) {
ToastUtils.showWarring("WebDav服务端没有备份或WebDav配置错误");
}
}
});
});
binding.mineRlBookSource.setOnClickListener(v -> { binding.mineRlBookSource.setOnClickListener(v -> {
startActivity(new Intent(getContext(), BookSourceActivity.class)); startActivity(new Intent(getContext(), BookSourceActivity.class));
}); });
@ -163,7 +199,7 @@ public class MineFragment extends BaseFragment {
.create(); .create();
bookDialog.show(); bookDialog.show();
}); });
binding.mineRlSyn.setOnClickListener(v -> { /*binding.mineRlSyn.setOnClickListener(v -> {
if (!UserService.isLogin()) { if (!UserService.isLogin()) {
ToastUtils.showWarring("请先登录!"); ToastUtils.showWarring("请先登录!");
Intent loginIntent = new Intent(getActivity(), LoginActivity.class); Intent loginIntent = new Intent(getActivity(), LoginActivity.class);
@ -202,7 +238,7 @@ public class MineFragment extends BaseFragment {
.setNegativeButton(null, null) .setNegativeButton(null, null)
.setPositiveButton(null, null) .setPositiveButton(null, null)
.show(); .show();
}); });*/
binding.mineRlSetting.setOnClickListener(v -> { binding.mineRlSetting.setOnClickListener(v -> {
Intent settingIntent = new Intent(getActivity(), MoreSettingActivity.class); Intent settingIntent = new Intent(getActivity(), MoreSettingActivity.class);
startActivity(settingIntent); startActivity(settingIntent);
@ -423,13 +459,13 @@ public class MineFragment extends BaseFragment {
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
switch (requestCode) { switch (requestCode) {
case APPCONST.REQUEST_LOGIN: /*case APPCONST.REQUEST_LOGIN:
assert data != null; assert data != null;
isLogin = data.getBooleanExtra("isLogin", false); isLogin = data.getBooleanExtra("isLogin", false);
if (isLogin) { if (isLogin) {
binding.tvUser.setText(UserService.readUsername()); binding.tvUser.setText(UserService.readUsername());
} }
break; break;*/
} }
} }
} }

@ -114,7 +114,7 @@ public class WebDavFragment extends BaseFragment {
@Override @Override
public void onSuccess(ArrayList<String> strings) { public void onSuccess(ArrayList<String> strings) {
if (!WebDavHelp.INSTANCE.showRestoreDialog(getContext(), strings, BackupRestoreUi.INSTANCE)) { if (!WebDavHelp.INSTANCE.showRestoreDialog(getContext(), strings, BackupRestoreUi.INSTANCE)) {
ToastUtils.showWarring("没有备份"); ToastUtils.showWarring("WebDav服务端没有备份或WebDav配置错误");
} }
} }
}); });

@ -185,9 +185,9 @@ public class BookcasePresenter implements BasePresenter {
getData(); getData();
if (mSetting.isAutoSyn() && UserService.isLogin()) { /*if (mSetting.isAutoSyn() && UserService.isLogin()) {
synBookcaseToWeb(true); synBookcaseToWeb(true);
} }*/
//是否启用下拉刷新(默认启用) //是否启用下拉刷新(默认启用)
if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

@ -1534,12 +1534,14 @@ public abstract class PageLoader {
@Override @Override
public void onSuccess(TxtChapter txtChapter) { public void onSuccess(TxtChapter txtChapter) {
if (txtChapter.getPosition() == mCurChapterPos - 1)
mPreChapter = txtChapter; mPreChapter = txtChapter;
} }
@Override @Override
public void onError(Throwable e) { public void onError(Throwable e) {
//无视错误 //无视错误
mPreChapter = null;
} }
}); });
} }
@ -1569,12 +1571,14 @@ public abstract class PageLoader {
@Override @Override
public void onSuccess(TxtChapter txtChapter) { public void onSuccess(TxtChapter txtChapter) {
if (txtChapter.getPosition() == mCurChapterPos + 1)
mNextChapter = txtChapter; mNextChapter = txtChapter;
} }
@Override @Override
public void onError(Throwable e) { public void onError(Throwable e) {
//无视错误 //无视错误
mNextChapter = null;
} }
}); });
} }

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="1024"
android:viewportHeight="1024">
<path
android:fillColor="#FF000000"
android:pathData="M282.02,821c-119.98,0 -217.59,-97.7 -217.59,-217.69 0,-111.69 84.62,-203.9 193.11,-216.19C292.81,278.13 394.61,203 510.4,203c146.46,0 265.64,119.18 265.64,265.74 0,11.99 -1.1,23.98 -2.7,35.77 8.89,-1.5 17.68,-2.5 26.87,-2.5 87.91,0 159.44,71.43 159.44,159.54 0,87.81 -71.43,159.54 -159.44,159.54l-518.19,-0.1zM119.48,603.31c0,89.61 72.93,162.54 162.54,162.54h518.09c57.44,0 104.3,-46.75 104.3,-104.3 0,-57.64 -46.75,-104.3 -104.3,-104.3 -15.09,0 -29.47,3.1 -42.96,9.29 -10.69,27.07 -25.77,52.35 -44.86,74.93l-41.86,-35.86c32.67,-38.06 50.55,-86.62 50.55,-136.77 0,-116.19 -94.51,-210.59 -210.59,-210.59 -86.22,0 -162.64,52.45 -194.71,130.47 22.78,3.8 45.96,11.59 70.23,23.48l95.91,48.45 -25.08,49.15 -95.11,-48.15c-28.47,-13.99 -54.65,-20.78 -79.62,-20.78 -89.61,0.1 -162.54,72.93 -162.54,162.44z"/>
</vector>

@ -1,20 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/colorBackground" android:background="@color/colorBackground"
android:scrollbars="vertical"> android:scrollbars="vertical">
<LinearLayout <LinearLayout
android:id="@+id/ll_mine"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/ll_mine"
android:orientation="vertical"> android:orientation="vertical">
<RelativeLayout <!--<RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="25dp"
android:paddingLeft="5dp" android:paddingLeft="5dp"
@ -57,8 +56,7 @@
android:textSize="@dimen/text_medium_size" android:textSize="@dimen/text_medium_size"
android:text="登录/注册"/> android:text="登录/注册"/>
</RelativeLayout> </RelativeLayout>-->
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="25dp"
@ -70,99 +68,148 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:textColor="@color/textPrimary" android:text="云服务"
android:text="书架"/> android:textColor="@color/textPrimary" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_book_source" android:id="@+id/mine_rl_webdav"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_book_source" android:id="@+id/iv_webdav"
android:layout_width="21dp"
android:layout_height="21dp"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary" android:src="@drawable/ic_yun"
android:src="@drawable/ic_source" app:tint="@color/textPrimary" />
/>
<TextView <TextView
android:id="@+id/tv_book_source" android:id="@+id/tv_webdav"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="20dp" android:layout_marginStart="18dp"
android:layout_toEndOf="@id/iv_book_source" android:layout_toEndOf="@id/iv_webdav"
android:text="@string/webdav_setting"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/book_source_man"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_backup" android:id="@+id/mine_rl_syn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_backup" android:id="@+id/iv_syn"
android:layout_alignParentStart="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary" android:src="@drawable/ic_online_syn"
android:src="@drawable/ic_backup" app:tint="@color/textPrimary" />
/>
<TextView <TextView
android:id="@+id/tv_backup" android:id="@+id/tv_syn"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_toEndOf="@id/iv_backup" android:layout_toEndOf="@id/iv_syn"
android:text="@string/menu_bookcase_syn"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/menu_bookcase_backup"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_syn" android:layout_width="match_parent"
android:layout_height="25dp"
android:paddingLeft="5dp"
android:paddingRight="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerInParent="true"
android:text="书架"
android:textColor="@color/textPrimary" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/mine_rl_book_source"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_syn" android:id="@+id/iv_book_source"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_source"
app:tint="@color/textPrimary" />
<TextView
android:id="@+id/tv_book_source"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary" android:layout_marginStart="20dp"
android:src="@drawable/ic_online_syn" android:layout_toEndOf="@id/iv_book_source"
/> android:text="@string/book_source_man"
android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" />
</RelativeLayout>
<RelativeLayout
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">
<ImageView
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" />
<TextView <TextView
android:id="@+id/tv_syn" android:id="@+id/tv_backup"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_toEndOf="@id/iv_syn" android:layout_toEndOf="@id/iv_backup"
android:text="@string/menu_bookcase_backup"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/menu_bookcase_syn"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="25dp"
@ -174,27 +221,28 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:textColor="@color/textPrimary" android:text="设置"
android:text="设置"/> android:textColor="@color/textPrimary" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_setting" android:id="@+id/mine_rl_setting"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_setting" android:id="@+id/iv_setting"
android:layout_alignParentStart="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary"
android:src="@drawable/ic_settings" android:src="@drawable/ic_settings"
/> app:tint="@color/textPrimary" />
<TextView <TextView
android:id="@+id/tv_setting" android:id="@+id/tv_setting"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -202,28 +250,29 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_toEndOf="@id/iv_setting" android:layout_toEndOf="@id/iv_setting"
android:text="@string/menu_settings"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/menu_settings"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_theme_mode" android:id="@+id/mine_rl_theme_mode"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_theme_mode" android:id="@+id/iv_theme_mode"
android:layout_alignParentStart="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary"
android:src="@drawable/ic_theme" android:src="@drawable/ic_theme"
/> app:tint="@color/textPrimary" />
<TextView <TextView
android:id="@+id/tv_theme_mode" android:id="@+id/tv_theme_mode"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -231,20 +280,22 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_toEndOf="@id/iv_theme_mode" android:layout_toEndOf="@id/iv_theme_mode"
android:text="@string/theme_mode"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/theme_mode"/>
<TextView <TextView
android:id="@+id/tv_theme_mode_select" android:id="@+id/tv_theme_mode_select"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:textColor="@color/textSecondary" android:layout_centerVertical="true"
android:background="@drawable/theme_mode_bak" android:background="@drawable/theme_mode_bak"
android:textSize="@dimen/text_normal_size" android:text="夜间模式"
android:text="夜间模式"/> android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="25dp" android:layout_height="25dp"
@ -256,28 +307,29 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:textColor="@color/textPrimary" android:text="其他"
android:text="其他"/> android:textColor="@color/textPrimary" />
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_feedback" android:id="@+id/mine_rl_feedback"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:layout_marginStart="3dp"
android:id="@+id/iv_feedback" android:id="@+id/iv_feedback"
android:layout_alignParentStart="true"
android:layout_width="18dp" android:layout_width="18dp"
android:layout_height="18dp" android:layout_height="18dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary" android:layout_marginStart="3dp"
android:src="@drawable/ic_feedback" android:src="@drawable/ic_feedback"
/> app:tint="@color/textPrimary" />
<TextView <TextView
android:id="@+id/tv_feedback" android:id="@+id/tv_feedback"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -285,28 +337,29 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="18dp" android:layout_marginStart="18dp"
android:layout_toEndOf="@id/iv_feedback" android:layout_toEndOf="@id/iv_feedback"
android:text="@string/mine_feedback"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/mine_feedback"/>
</RelativeLayout> </RelativeLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/mine_rl_about" android:id="@+id/mine_rl_about"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="60dp"
android:background="@drawable/selector_common_bg"
android:paddingLeft="20dp" android:paddingLeft="20dp"
android:paddingRight="20dp" android:paddingRight="20dp">
android:background="@drawable/selector_common_bg">
<ImageView <ImageView
android:id="@+id/iv_about" android:id="@+id/iv_about"
android:layout_alignParentStart="true"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
app:tint="@color/textPrimary"
android:src="@drawable/ic_about" android:src="@drawable/ic_about"
/> app:tint="@color/textPrimary" />
<TextView <TextView
android:id="@+id/tv_about" android:id="@+id/tv_about"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -314,9 +367,9 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginStart="15dp" android:layout_marginStart="15dp"
android:layout_toEndOf="@id/iv_about" android:layout_toEndOf="@id/iv_about"
android:text="@string/menu_bookcase_about"
android:textColor="@color/textSecondary" android:textColor="@color/textSecondary"
android:textSize="@dimen/text_normal_size" android:textSize="@dimen/text_normal_size" />
android:text="@string/menu_bookcase_about"/>
</RelativeLayout> </RelativeLayout>

@ -180,6 +180,7 @@
<string name="webdav_password">WebDav 密码</string> <string name="webdav_password">WebDav 密码</string>
<string name="webdav_restore_tip">从WebDav恢复</string> <string name="webdav_restore_tip">从WebDav恢复</string>
<string name="webdav_setting">WebDav设置</string> <string name="webdav_setting">WebDav设置</string>
<string name="webdav">WebDav</string>
<string name="webdav_setting_tip">WebDav备份与恢复</string> <string name="webdav_setting_tip">WebDav备份与恢复</string>
<string name="menu_add_bookmark">添加书签</string> <string name="menu_add_bookmark">添加书签</string>
<string name="menu_copy_content">拷贝内容</string> <string name="menu_copy_content">拷贝内容</string>

@ -1,2 +1,2 @@
#Tue Mar 02 08:12:15 CST 2021 #Sat Mar 13 21:51:35 CST 2021
VERSION_CODE=192 VERSION_CODE=193

Binary file not shown.

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 666 KiB

Loading…
Cancel
Save