diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml
index eb4cef2..46bf8ba 100644
--- a/.idea/assetWizardSettings.xml
+++ b/.idea/assetWizardSettings.xml
@@ -14,8 +14,8 @@
diff --git a/README.md b/README.md
index 7c54fe8..7658ba6 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,15 @@
## 一、概要
-风月读书,一款开源、免费的小说阅读软件。
+风月读书,是一款提供网络文学搜索和阅读的工具,为广大网络文学爱好者提供一种方便、快捷舒适的阅读体验。
+
+1.【免费阅读】百万小说,免费阅读。都市爽文、言情穿越、玄幻修仙、科幻悬疑...你想看的这里都有。
+
+2.【自定义书源】,自己动手,丰衣足食。支持多种书源类型,兼容第三方书源,再也不用担心书源不够了。
+
+3.【朗读听书】这里每一本书都能听,解放双眼,随时随地听小说。
+
+4.【私密书架】独立分组,特定入口,双重认证,全力保护您的阅读隐私。
* 官网:[https://reader.fycz.tk](https://reader.fycz.tk)
* 反馈交流群:
@@ -11,6 +19,15 @@
* [更新日志](./app/src/main/assets/updatelog.fy)
* [免责声明](./app/src/main/assets/disclaimer.fy)
+
+
本应用尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息。但本应用将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,本应用不会将这些信息对外披露或向第三方提供。本应用会不时更新本隐私权政策。 您在同意本应用服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于本应用服务使用协议不可分割的一部分。
+
1. 适用范围
+
(a) 在您注册本应用帐号时,您根据本应用要求提供的个人注册信息;
+
(b) 在您使用本应用网络服务,或访问本应用平台网页时,本应用自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据;
+
(c) 本应用通过合法途径从商业伙伴处取得的用户个人数据。
+
您了解并同意,以下信息不适用本隐私权政策:
+
(a) 您在使用本应用平台提供的搜索服务时输入的关键字信息;
+
(b) 本应用收集到的您在本应用发布的有关信息数据,包括但不限于参与活动、成交信息及评价详情;
+
(c) 违反法律规定或违反本应用规则行为及本应用已对您采取的措施。
+
2. 信息使用
+
(a)本应用不会向任何无关第三方提供、出售、出租、分享或交易您的个人信息,除非事先得到您的许可,或该第三方和本应用单独或共同为您提供服务,且在该服务结束后,其将被禁止访问包括其以前能够访问的所有这些资料。
+
(b) 本应用亦不允许任何第三方以任何手段收集、编辑、出售或者无偿传播您的个人信息。任何本应用平台用户如从事上述活动,一经发现,本应用有权立即终止与该用户的服务协议。
+
(c) 为服务用户的目的,本应用可能通过使用您的个人信息,向您提供您感兴趣的信息,包括但不限于向您发出产品和服务信息,或者与本应用合作伙伴共享信息以便他们向您发送有关其产品和服务的信息(后者需要您的事先同意)。
+
3. 信息披露
+
在如下情况下,本应用将依据您的个人意愿或法律的规定全部或部分的披露您的个人信息:
+
(a) 经您事先同意,向第三方披露;
+
(b)为提供您所要求的产品和服务,而必须和第三方分享您的个人信息;
+
(c) 根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;
+
(d) 如您出现违反中国有关法律、法规或者本应用服务协议或相关规则的情况,需要向第三方披露;
+
(e) 如您是适格的知识产权投诉人并已提起投诉,应被投诉人要求,向被投诉人披露,以便双方处理可能的权利纠纷;
+
(f) 在本应用平台上创建的某一交易中,如交易任何一方履行或部分履行了交易义务并提出信息披露请求的,本应用有权决定向该用户提供其交易对方的联络方式等必要信息,以促成交易的完成或纠纷的解决。
+
(g) 其它本应用根据法律、法规或者网站政策认为合适的披露。
+
4. Cookie的使用
+
(a) 在您未拒绝接受cookies的情况下,本应用会在您的计算机上设定或取用cookies ,以便您能登录或使用依赖于cookies的本应用平台服务或功能。本应用使用cookies可为您提供更加周到的个性化服务,包括推广服务。
+
(b) 您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式拒绝接受cookies。但如果您选择拒绝接受cookies,则您可能无法登录或使用依赖于cookies的本应用网络服务或功能。
+
(c) 通过本应用所设cookies所取得的有关信息,将适用本政策。
+
5. 信息安全
+
(a) 本应用帐号均有安全保护功能,请妥善保管您的用户名及密码信息。本应用将通过对用户密码进行加密等安全措施确保您的信息不丢失,不被滥用和变造。尽管有前述安全措施,但同时也请您注意在信息网络上不存在“完善的安全措施”。
+
(b) 在使用本应用网络服务进行网上交易时,您不可避免的要向交易对方或潜在的交易对
+
6.本隐私政策的更改
+
(a)如果决定更改隐私政策,我们会在本政策中以及我们认为适当的位置发布这些更改,以便您了解我们如何收集、使用您的个人信息,哪些人可以访问这些信息,以及在什么情况下我们会透露这些信息。
+
(b)风月读书保留随时修改本政策的权利,因此请经常查看。如对本政策作出重大更改,风月读书会通过网站通知的形式告知。
+
为防止向第三方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,尤其是本应用用户名及密码发生泄露,请您立即联络本应用客服,以便本应用采取相应措施。
+
+
\ No newline at end of file
diff --git a/app/src/main/assets/updatelog.fy b/app/src/main/assets/updatelog.fy
index f6cf891..3c1f928 100644
--- a/app/src/main/assets/updatelog.fy
+++ b/app/src/main/assets/updatelog.fy
@@ -1,3 +1,9 @@
+2021.06.05
+风月读书v2.0.9
+更新内容:
+1、新增隐私政策
+2、修复在[所有书籍]分组阅读时没有阅读记录的bug
+
2021.06.04
风月读书v2.0.8
更新内容:
diff --git a/app/src/main/java/xyz/fycz/myreader/common/URLCONST.java b/app/src/main/java/xyz/fycz/myreader/common/URLCONST.java
index 2a307c1..732bd49 100644
--- a/app/src/main/java/xyz/fycz/myreader/common/URLCONST.java
+++ b/app/src/main/java/xyz/fycz/myreader/common/URLCONST.java
@@ -2,6 +2,7 @@ package xyz.fycz.myreader.common;
public class URLCONST {
+ public static final String OFFICIAL_WEB = "https://reader.fycz.tk/";
public static String APP_DIR_UR = "https://www.lanzous.com/b00ngso7e";
diff --git a/app/src/main/java/xyz/fycz/myreader/ui/activity/AboutActivity.java b/app/src/main/java/xyz/fycz/myreader/ui/activity/AboutActivity.java
index 917abef..0b191e5 100644
--- a/app/src/main/java/xyz/fycz/myreader/ui/activity/AboutActivity.java
+++ b/app/src/main/java/xyz/fycz/myreader/ui/activity/AboutActivity.java
@@ -24,11 +24,13 @@ import xyz.fycz.myreader.common.URLCONST;
import xyz.fycz.myreader.databinding.ActivityAboutBinding;
import xyz.fycz.myreader.ui.dialog.DialogCreator;
import xyz.fycz.myreader.ui.dialog.LoadingDialog;
+import xyz.fycz.myreader.ui.dialog.MyAlertDialog;
import xyz.fycz.myreader.util.ShareUtils;
import xyz.fycz.myreader.util.SharedPreUtils;
import xyz.fycz.myreader.util.ToastUtils;
import xyz.fycz.myreader.util.ZipUtils;
import xyz.fycz.myreader.util.utils.FileUtils;
+import xyz.fycz.myreader.util.utils.ImageLoader;
import xyz.fycz.myreader.util.utils.OkHttpUtils;
import xyz.fycz.myreader.util.utils.RxUtils;
@@ -56,40 +58,62 @@ public class AboutActivity extends BaseActivity {
@Override
protected void initWidget() {
super.initWidget();
- binding.il.tvVersionName.setText("风月读书v" + App.getStrVersionName());
+ binding.il.tvVersionName.setText(String.format("风月读书v%s", App.getStrVersionName()));
+ if (!App.isDestroy(this)) {
+ ImageLoader.INSTANCE.load(this, "http://yunjuw.cn/template/mytheme/statics/img/logo.png")
+ .into(binding.il.ivDyys);
+ }
}
@Override
protected void initClick() {
super.initClick();
ClipboardManager mClipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
- binding.il.vmAuthor.setOnClickListener(v -> {
- //数据
- ClipData mClipData = ClipData.newPlainText("Label", "fy@fycz.xyz");
- //把数据设置到剪切板上
- assert mClipboardManager != null;
- mClipboardManager.setPrimaryClip(mClipData);
- ToastUtils.showSuccess("邮箱复制成功!");
- });
- binding.il.vwShare.setOnClickListener(v -> ShareUtils.share(this, getString(R.string.share_text) +
+ binding.il.rlUpdate.setOnClickListener(v -> App.checkVersionByServer(this, true));
+ binding.il.rlUpdateLog.setOnClickListener(v -> DialogCreator.createAssetTipDialog(this, "更新日志", "updatelog.fy"));
+
+ binding.il.rlShare.setOnClickListener(v -> ShareUtils.share(this, getString(R.string.share_text) +
SharedPreUtils.getInstance().getString(getString(R.string.downloadLink), URLCONST.LAN_ZOUS_URL)));
- binding.il.vwUpdate.setOnClickListener(v -> App.checkVersionByServer(this, true));
- binding.il.vwUpdateLog.setOnClickListener(v -> DialogCreator.createAssetTipDialog(this, "更新日志", "updatelog.fy"));
- binding.il.vwShareLog.setOnClickListener(v -> DialogCreator.createCommonDialog(this, "分享崩溃日志",
- "你是希望将日志上传到服务器,还是直接分享给他人?", true,
- "上传服务器", "直接分享", (dialog, which) -> uploadCrashLog(), (dialog, which) -> shareCrashLog()));
- binding.il.vwQq.setOnClickListener(v -> {
+ binding.il.rlQq.setOnClickListener(v -> {
if (!App.joinQQGroup(this, "8PIOnHFuH6A38hgxvD_Rp2Bu-Ke1ToBn")) {
//数据
ClipData mClipData = ClipData.newPlainText("Label", "1085028304");
//把数据设置到剪切板上
- assert mClipboardManager != null;
mClipboardManager.setPrimaryClip(mClipData);
ToastUtils.showError("未安装手Q或安装的版本不支持!\n已复制QQ群号,您可自行前往QQ添加!");
}
});
- binding.il.vwGit.setOnClickListener(v -> openIntent(Intent.ACTION_VIEW, getString(R.string.this_github_url)));
- binding.il.vwDisclaimer.setOnClickListener(v -> DialogCreator.createAssetTipDialog(this, "免责声明", "disclaimer.fy"));
+
+ binding.il.rlOfficialWeb.setOnClickListener(v -> {
+ MyAlertDialog.showFullWebViewDia(this, URLCONST.OFFICIAL_WEB,
+ true, null);
+ });
+ binding.il.rlGit.setOnClickListener(v -> {
+ MyAlertDialog.showFullWebViewDia(this, getString(R.string.this_github_url),
+ true, null);
+ });
+
+ binding.il.rlContactAuthor.setOnClickListener(v -> {
+ //数据
+ ClipData mClipData = ClipData.newPlainText("Label", "fengyuecanzhu@gmail.com");
+ //把数据设置到剪切板上
+ mClipboardManager.setPrimaryClip(mClipData);
+ ToastUtils.showSuccess("邮箱\"fengyuecanzhu@gmail.com\"已复制到剪切板");
+ });
+ binding.il.rlShareLog.setOnClickListener(v -> DialogCreator.createCommonDialog(this, "分享崩溃日志",
+ "你是希望将日志上传到服务器,还是直接分享给他人?", true,
+ "上传服务器", "直接分享", (dialog, which) -> uploadCrashLog(), (dialog, which) -> shareCrashLog()));
+
+ binding.il.rlPrivacyPolicy.setOnClickListener(v -> MyAlertDialog
+ .showFullWebViewDia(this, "file:///android_asset/PrivacyPolicy.html",
+ false, null));
+ binding.il.rlDisclaimer.setOnClickListener(v -> DialogCreator.createAssetTipDialog(this, "免责声明", "disclaimer.fy"));
+
+ binding.il.rlDyys.setOnClickListener(v -> {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setData(Uri.parse("http://yunjuw.cn/"));
+ startActivity(intent);
+ });
}
void openIntent(String intentName, String address) {
diff --git a/app/src/main/java/xyz/fycz/myreader/ui/activity/ReadActivity.java b/app/src/main/java/xyz/fycz/myreader/ui/activity/ReadActivity.java
index 68b2630..c78b6c8 100644
--- a/app/src/main/java/xyz/fycz/myreader/ui/activity/ReadActivity.java
+++ b/app/src/main/java/xyz/fycz/myreader/ui/activity/ReadActivity.java
@@ -358,7 +358,7 @@ public class ReadActivity extends BaseActivity implements ColorPickerDialogListe
mSourceDialog.setABooks(aBooks);
}
String privateGroupId = SharedPreUtils.getInstance().getString("privateGroupId");
- isPrivate = privateGroupId.equals(mBook.getGroupId());
+ isPrivate = !TextUtils.isEmpty(mBook.getGroupId()) && privateGroupId.equals(mBook.getGroupId());
}
@Override
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 6e191a1..dd50568 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
@@ -113,11 +113,24 @@ public class SplashActivity extends BaseActivity {
.init();
SystemBarUtils.hideStableStatusBar(this);
//loadImage();
- if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
- mPermissionsChecker = new PermissionsChecker(this);
- requestPermission();
+ boolean agreePrivacyPolicy = SharedPreUtils.getInstance().getBoolean("agreePrivacyPolicy");
+ if (agreePrivacyPolicy) {
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
+ mPermissionsChecker = new PermissionsChecker(this);
+ requestPermission();
+ } else {
+ start();
+ }
} else {
- start();
+ MyAlertDialog.showPrivacyDialog(this, (dialog, which) -> {
+ SharedPreUtils.getInstance().putBoolean("agreePrivacyPolicy", true);
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
+ mPermissionsChecker = new PermissionsChecker(this);
+ requestPermission();
+ } else {
+ start();
+ }
+ }, (dialog, which) -> finish());
}
}
diff --git a/app/src/main/java/xyz/fycz/myreader/ui/dialog/BookGroupDialog.java b/app/src/main/java/xyz/fycz/myreader/ui/dialog/BookGroupDialog.java
index f0c7977..73afbef 100644
--- a/app/src/main/java/xyz/fycz/myreader/ui/dialog/BookGroupDialog.java
+++ b/app/src/main/java/xyz/fycz/myreader/ui/dialog/BookGroupDialog.java
@@ -119,7 +119,7 @@ public class BookGroupDialog {
BookGroup bookGroup = !isRename ? new BookGroup() : mBookGroups.get(groupNum);
String oldName = bookGroup.getName();
int maxLen = 20;
- MyAlertDialog.showFullScreenInputDia(mContext, !isRename ? "新建分组" : "重命名分组", "请输入分组名",
+ MyAlertDialog.showFullInputDia(mContext, !isRename ? "新建分组" : "重命名分组", "请输入分组名",
isRename ? oldName : "", null, true, maxLen, newGroupName -> {
for (CharSequence oldGroupName : mGroupNames) {
if (oldGroupName.equals(newGroupName)) {
diff --git a/app/src/main/java/xyz/fycz/myreader/ui/dialog/DialogCreator.java b/app/src/main/java/xyz/fycz/myreader/ui/dialog/DialogCreator.java
index dcad054..fd7bf31 100644
--- a/app/src/main/java/xyz/fycz/myreader/ui/dialog/DialogCreator.java
+++ b/app/src/main/java/xyz/fycz/myreader/ui/dialog/DialogCreator.java
@@ -18,6 +18,7 @@ import java.io.InputStreamReader;
import xyz.fycz.myreader.application.App;
import xyz.fycz.myreader.util.IOUtils;
import xyz.fycz.myreader.util.help.StringHelper;
+import xyz.fycz.myreader.util.utils.MeUtils;
public class DialogCreator {
@@ -221,23 +222,10 @@ public class DialogCreator {
* @param assetName 需要后缀名
*/
public static void createAssetTipDialog(Context mContext, String title, String assetName) {
- BufferedReader br = null;
- try {
- br = new BufferedReader(new InputStreamReader(mContext.getAssets().open(assetName)));
- StringBuilder assetText = new StringBuilder();
- String line = null;
- while ((line = br.readLine()) != null) {
- assetText.append(line);
- assetText.append("\r\n");
- }
- DialogCreator.createTipDialog(mContext, title, assetText.toString());
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- IOUtils.close(br);
- }
+ DialogCreator.createTipDialog(mContext, title, MeUtils.getAssetStr(mContext.getAssets(), assetName));
}
+
public interface OnClickPositiveListener {
void onClick(Dialog dialog, View view);
}
diff --git a/app/src/main/java/xyz/fycz/myreader/ui/dialog/MyAlertDialog.java b/app/src/main/java/xyz/fycz/myreader/ui/dialog/MyAlertDialog.java
index f25950b..0d39b4d 100644
--- a/app/src/main/java/xyz/fycz/myreader/ui/dialog/MyAlertDialog.java
+++ b/app/src/main/java/xyz/fycz/myreader/ui/dialog/MyAlertDialog.java
@@ -1,25 +1,43 @@
package xyz.fycz.myreader.ui.dialog;
import android.app.Activity;
+import android.app.Dialog;
+import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
import android.text.Editable;
import android.text.InputType;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.TextPaint;
import android.text.TextWatcher;
import android.text.method.LinkMovementMethod;
+import android.text.style.ClickableSpan;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
+import android.webkit.JsResult;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
+import android.widget.ProgressBar;
import android.widget.TextView;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputLayout;
import com.kongzue.dialogx.dialogs.BottomDialog;
import com.kongzue.dialogx.dialogs.FullScreenDialog;
+import com.kongzue.dialogx.interfaces.OnBackPressedListener;
import com.kongzue.dialogx.interfaces.OnBindView;
import xyz.fycz.myreader.R;
@@ -136,9 +154,9 @@ public class MyAlertDialog {
}
- public static void showFullScreenInputDia(Context context, String title, String hint, String initText,
- Integer inputType, boolean cancelable, int maxLen,
- OnInputFinishListener posListener) {
+ public static void showFullInputDia(Context context, String title, String hint, String initText,
+ Integer inputType, boolean cancelable, int maxLen,
+ OnInputFinishListener posListener) {
FullScreenDialog.show(new OnBindView